この戦略は,取引量に基づく2つの移動平均を計算し,その差値の方向に基づいて現在のトレンドの方向を判断し,その後,長ポジションまたは短ポジションの操作を行う. 戦略はシンプルで使いやすく,市場トレンドを効果的に追跡することができる.
速線と遅線を計算する. 速線は,ユーザ定義の速線周期に基づく量化移動平均であり,遅線は,慢線周期に基づく量化移動平均である.
二線差値の計算. 快線を減算して差値の曲線が得られる.
トレンドの方向を判断する。 快線が慢線を横切るときは,看板信号として多行; 快線の下が慢線を横切るときは,下行信号として空行する。
取引シグナルを発する.看板時に多シグナルを発する.看板時に空きシグナルを発する.
設定ストップ. ユーザ定義の固定ストップパーセントまたはATRベースの動的ストップを使用してストップ位置を設定します.
退場条件。 ポジションを保持する際に,ストップ損失を触発した場合または逆転信号が発生した場合,平仓を退場する。
量子指標を用いてトレンドを識別し,偽の突破によって誤解されやすい.
市場騒音をフィルタリングし,頻繁に取引を回避する.
ストップ・ロスの設定は,損失のリスクを効果的に制御する.
戦略の論理はシンプルで明快で,実行が分かりやすい.
異なる品種と時間周期のニーズに応えるカスタマイズ可能なパラメータ.
パラメータの設定を間違えた場合,取引頻度が高くなり,トレンドを逃す可能性があります.
固定ストップは機械的で,市場の変化に適応できないかもしれない.
量と価格の関係の変化は,量化指標の効果に影響を与える可能性があります.
リスク1は,最適化パラメータによって最適な組み合わせを見つけることができる.
リスク2は,動的ATRストップを固定ストップの代替として使用できます.
リスク3は,取引量の変化が戦略に与える影響についてです.
テストは,異なる快線と遅線パラメータの組み合わせ.
OBV,William Indicatorなどの他の指標を試してください.
波動率に基づく止損を増加させる.
他の指標と組み合わせた効果を評価する
異なる取引品種の効果を評価する.
この戦略は,量化平均線の快慢線組合せでトレンドを追跡し,取引ロジックはシンプルで明快で,パラメータを最適化調整することができる. 止損設定は,リスクを制御するのに役立ちます. 後に,他の指標組合せの使用の効果を評価し続けることができます.
/*backtest
start: 2023-08-18 00:00:00
end: 2023-09-17 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("EVWMA 6HR", overlay=false, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)
// Credit to QuantNomad for the main idea behind this code
/////////////// Time Frame ///////////////
_1 = input(false, "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)
testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
testPeriod() => true
///////////// EVWMA /////////////
_2 = input(false, "════════ EVMA ═══════")
fast_sum_length = input(5, title = "Fast Sum Length", type = input.integer)
slow_sum_length = input(11, title = "Slow Sum Length", type = input.integer)
fast_vol_period = sum(volume, fast_sum_length)
slow_vol_period = sum(volume, slow_sum_length)
fast_evwma = 0.0
fast_evwma := ((fast_vol_period - volume) * nz(fast_evwma[1], close) + volume * close) / (fast_vol_period)
slow_evwma = 0.0
slow_evwma := ((slow_vol_period - volume) * nz(slow_evwma[1], close) + volume * close) / (slow_vol_period)
diff = fast_evwma - slow_evwma
/////////////// Strategy ///////////////
long = fast_evwma > slow_evwma
short = fast_evwma < slow_evwma
last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)
last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])
last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])
in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal
last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1])
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1])
/////////////// Dynamic ATR Stop Losses ///////////////
_4 = input(false, "════════ Stop Loss ═══════")
SL_type = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inp = input(9.0, title='Fixed Stop Loss %') / 100
atrLkb = input(20, minval=1, title='ATR Stop Period')
atrMult = input(1.5, step=0.25, title='ATR Stop Multiplier')
atr1 = atr(atrLkb)
longStop1 = 0.0
longStop1 := short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop1[1]
shortStop1 = 0.0
shortStop1 := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop1[1]
slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na
_5 = input(false, "══════ Longs or Shorts ═════")
useLongs = input(true, title="Use Longs")
useShorts = input(true, title="Use Shorts")
/////////////// Execution ///////////////
if testPeriod()
if useLongs
strategy.entry("L", strategy.long, when=long)
strategy.exit("L SL", "L", stop = SL_type == "Fixed" ? long_sl : longStop1, when=since_longEntry > -1)
if useShorts
strategy.exit("S SL", "S", stop = SL_type == "Fixed" ? short_sl : shortStop1, when=since_shortEntry > -1)
strategy.entry("S", strategy.short, when=short)
if not useShorts
strategy.close("L", when=short)
if not useLongs
strategy.close("S", when=long)
/////////////// Plotting ///////////////
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)
p1 = plot(diff, title = "Delta", color = long ? color.lime : short ? color.red : na, transp=0)
p2 = plot(0, color = color.white)
fill(p1, p2, color = long ? color.lime : short ? color.red : na, transp=60)