यह रणनीति प्रवृत्ति निर्णय और ट्रेडिंग सिग्नल उत्पन्न करने के लिए शून्य पिछड़े ईएमए सूचक का उपयोग करती है। यह ईएमए सूचक गतिशील रूप से पैरामीटर को समायोजित कर सकता है, जिससे पिछड़ेपन की समस्या को प्रभावी ढंग से समाप्त किया जा सकता है। यह एक विशिष्ट प्रवृत्ति ट्रैकिंग ट्रेडिंग रणनीति है।
रणनीतिक सिद्धांत:
स्व-अनुकूलीकरण शून्य-अवरोध ईएमए की गणना करें, जिसमें दो स्व-अनुकूलीकरण एल्गोरिदम शामिल हैं, स्ट्रिंग विधि और आई-क्यू विधि।
ईएमए सामान्य ईएमए है, और ईसी स्व-अनुकूलन शून्य-विलंबता ईएमए है।
ईसी पर ईएमए पहनते समय अधिक करें, ईसी के नीचे ईएमए पहनते समय खाली करें।
त्रुटि वक्र की गणना करें और थ्रेशोल्ड फ़िल्टरिंग सेट करें।
रिटर्न को लॉक करने और जोखिम को नियंत्रित करने के लिए एक निश्चित स्टॉप-लॉस स्टॉप पॉइंट सेट करें।
इस रणनीति के फायदे:
ईएमए के अनुकूलन से सूचकांक में देरी को कम करने में मदद मिलती है।
थ्रेसहोल्ड फ़िल्टरिंग सिग्नल की गुणवत्ता में सुधार करती है और झूठी दरारों को रोकती है।
स्टॉप डैमेज स्टॉप विधि सरल, व्यावहारिक और आसान है।
इस रणनीति के जोखिम:
अनुकूलन ईएमए पैरामीटर अस्थिर है, विफल होने की संभावना है।
फिक्स्ड स्टॉप लॉस स्टॉप बाजार में बदलाव के लिए अनुकूल नहीं है।
व्यक्तिगत नुकसान की सीमा नहीं है, और नुकसान का खतरा अधिक है।
संक्षेप में, यह रणनीति स्व-अनुकूली ईएमए सूचकांकों के साथ प्रवृत्ति का पालन करती है, जो कुछ हद तक मंदी की समस्या को कम कर सकती है, लेकिन पैरामीटर स्थिरता पर ध्यान देने की आवश्यकता है, और जोखिम को नियंत्रित करने के लिए एक अनुकूलित स्टॉप-लॉस-स्टॉप तंत्र के साथ काम करती है।
/*backtest
start: 2023-09-05 00:00:00
end: 2023-09-12 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy(title="Adaptive Zero Lag EMA v2 (w/ Backtest Date Range)", shorttitle="AZLEMA", overlay = true, commission_type=strategy.commission.cash_per_contract, slippage = 5, pyramiding=1, calc_on_every_tick=true)
src = input(title="Source", defval=close)
secType = input(title="Security Type", options=["Forex", "Metal Spot", "Cryptocurrency","Custom"], defval="Forex")
contracts = input(title="Custom # of Contracts", defval=1, step=1)
limit = input(title="Max Lots", defval=100)
Period = input(title="Period", defval = 20)
adaptive = input(title="Adaptive Method", options=["Off", "Cos IFM", "I-Q IFM", "Average"], defval="Cos IFM")
GainLimit = input(title="Gain Limit", defval = 8)
Threshold = input(title="Threshold", defval=0.05, step=0.01)
fixedSL = input(title="SL Points", defval=70)
fixedTP = input(title="TP Points", defval=10)
risk = input(title='Risk', defval=0.01, step=0.01)
// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear = input(defval = 2019, title = "From Year", minval = 2015)
ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear = input(defval = 9999, title = "To Year", minval = 2015)
// === FUNCTION EXAMPLE ===
start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window
window() => true
range = 50 //input(title="Max Period", defval=60, minval=8, maxval=100)
PI = 3.14159265359
lenIQ = 0.0
lenC = 0.0
//##############################################################################
//I-Q IFM
//##############################################################################
if(adaptive=="I-Q IFM" or adaptive=="Average")
imult = 0.635
qmult = 0.338
inphase = 0.0
quadrature = 0.0
re = 0.0
im = 0.0
deltaIQ = 0.0
instIQ = 0.0
V = 0.0
P = src - src[7]
inphase := 1.25*(P[4] - imult*P[2]) + imult*nz(inphase[3])
quadrature := P[2] - qmult*P + qmult*nz(quadrature[2])
re := 0.2*(inphase*inphase[1] + quadrature*quadrature[1]) + 0.8*nz(re[1])
im := 0.2*(inphase*quadrature[1] - inphase[1]*quadrature) + 0.8*nz(im[1])
if (re!= 0.0)
deltaIQ := atan(im/re)
for i=0 to range
V := V + deltaIQ[i]
if (V > 2*PI and instIQ == 0.0)
instIQ := i
if (instIQ == 0.0)
instIQ := nz(instIQ[1])
lenIQ := 0.25*instIQ + 0.75*nz(lenIQ[1])
//##############################################################################
//COSINE IFM
//##############################################################################
if(adaptive == "Cos IFM" or adaptive == "Average")
s2 = 0.0
s3 = 0.0
deltaC = 0.0
instC = 0.0
v1 = 0.0
v2 = 0.0
v4 = 0.0
v1 := src - src[7]
s2 := 0.2*(v1[1] + v1)*(v1[1] + v1) + 0.8*nz(s2[1])
s3 := 0.2*(v1[1] - v1)*(v1[1] - v1) + 0.8*nz(s3[1])
if (s2 != 0)
v2 := sqrt(s3/s2)
if (s3 != 0)
deltaC := 2*atan(v2)
for i = 0 to range
v4 := v4 + deltaC[i]
if (v4 > 2*PI and instC == 0.0)
instC := i - 1
if (instC == 0.0)
instC := instC[1]
lenC := 0.25*instC + 0.75*nz(lenC[1])
if (adaptive == "Cos IFM")
Period := round(lenC)
if (adaptive == "I-Q IFM")
Period := round(lenIQ)
if (adaptive == "Average")
Period := round((lenC + lenIQ)/2)
//##############################################################################
//ZERO LAG EXPONENTIAL MOVING AVERAGE
//##############################################################################
LeastError = 1000000.0
EC = 0.0
Gain = 0.0
EMA = 0.0
Error = 0.0
BestGain = 0.0
alpha =2/(Period + 1)
EMA := alpha*src + (1-alpha)*nz(EMA[1])
for i = -GainLimit to GainLimit
Gain := i/10
EC := alpha*(EMA + Gain*(src - nz(EC[1]))) + (1 - alpha)*nz(EC[1])
Error := src - EC
if(abs(Error)<LeastError)
LeastError := abs(Error)
BestGain := Gain
EC := alpha*(EMA + BestGain*(src - nz(EC[1]))) + (1-alpha)*nz(EC[1])
plot(EC, title="EC", color=orange, linewidth=2)
plot(EMA, title="EMA", color=red, linewidth=2)
//##############################################################################
//Trade Logic & Risk Management
//##############################################################################
buy = crossover(EC,EMA) and 100*LeastError/src > Threshold
sell = crossunder(EC,EMA) and 100*LeastError/src > Threshold
secScaler = secType == "Forex" ? 100000 : secType == "Metal Spot" ? 100 : secType == "Cryptocurrency" ? 10000 : secType == "Custom" ? contracts : 0
strategy.initial_capital = 50000
balance = strategy.initial_capital + strategy.netprofit
if (time>timestamp(2016, 1, 1 , 0, 0) and balance > 0)
//LONG
lots = ((risk * balance)/fixedSL)*secScaler
lots := lots > limit * secScaler ? limit * secScaler : lots
strategy.entry("BUY", strategy.long, oca_name="BUY", when=buy and window())
strategy.exit("B.Exit", "BUY", qty_percent = 100, loss=fixedSL, trail_offset=15, trail_points=fixedTP)
//SHORT
strategy.entry("SELL", strategy.short, oca_name="SELL",when=sell and window())
strategy.exit("S.Exit", "SELL", qty_percent = 100, loss=fixedSL, trail_offset=15, trail_points=fixedTP)