この戦略は,トレンド決定と取引信号のためにアダプティブゼロレイグEMA指標を使用する.アダプティブレイグEMAは,レイグをなくすためにパラメータを動的に調整する.トレンドフォローを目指す.
戦略論理:
コシノスとI-Qの適応アルゴリズムで適応ゼロ遅延EMAを計算する.
EMAは通常の EMA ECは適応的なゼロレイグ EMA
ECが EMAを横切る時,ロングで,EMAを下回る時,ショートで
誤差曲線を計算して 誤差信号をフィルターする 限界値を設定します
ストップ・ロスの固定ポイントと リスクコントロールの利得を
利点:
アダプティブEMAは指標の遅延を大幅に減少させる.
信号の質を向上させ 誤ったブレイクを防ぐ
シンプルな停止や目標が 簡単に実行できます
リスク:
アダプティブ EMA パラメータが不安定になる可能性があります.
固定ストップ/ターゲットは 変化する市場状況に適応できない.
損失の大きさに制限はありません 損失の大きな取引のリスクがあります
概要すると,この戦略は,傾向を追求するために適応型EMAを使用し,遅延を一定程度削減します.しかし,リスクを制御するためにパラメータの安定性と最適化されたストップが必要です.
/*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)