この戦略は,2つのボリューム重度の移動平均を,高速線と遅い線として計算する.この2つの線の差に基づいてトレンド方向を決定し,それに応じてロングまたはショートポジションを取ります.この戦略は,市場のトレンドを追跡するのにシンプルで有効です.
ユーザーによって定義された高速および遅い周期に基づいて,ボリューム重量移動平均を用いて高速および遅い線を計算する.
速い線と遅い線の違いを計算する.
トレンド方向を決定します.スローライン上の高速線のクロスオーバーは上昇傾向を示し,下のクロスオーバーは低下傾向を示します.
長/短信号を発信します.高速線がスローラインを越えると長行します.高速線がスローラインを越えると短行します.
ユーザーによって定義された固定パーセントまたは動的ATRに基づいてストップ損失を設定します.
出口規則 ストップ・ロストがヒットしたり 逆信号が表示された場合 ポジションを閉じる
傾向を特定し,誤ったブレイクを避けるために定量指標を使用します.
市場騒音をフィルタリングし,過剰取引を回避します.
ストップ・ロスはダウンサイドリスクを効果的に制御します
シンプルで理解しやすい論理です
異なる製品と時間枠に合わせて設定できるパラメータ
パラメータの設定が正しくない場合,過剰取引または見逃したトレンドを引き起こす可能性があります.
固定ストップ損失は,変化する市場状況にあまりにも固い可能性があります.
量と価格の関係の変化が有効性に影響を与える可能性があります.
リスク1はパラメータの最適化によって軽減できる.
リスク2は動的ATRストップ損失で対処できる.
リスク3は 音量変化を監視する必要がある
異なる高速線と遅い線パラメータの組み合わせをテストします
OBV,William's %R などなど,他の量価格指標を試してください.
波動性に基づくストップを追加します.
他の指標との組み合わせを評価する.
異なる取引手段の有効性をテストする.
この戦略は,単純な論理でトレンドを追跡するために,迅速かつゆっくりと定量化された移動平均値を使用する.パラメータは最適化され,リスク制御を停止する.指標を組み合わせるさらなる評価は有効性を向上させる可能性があります.
/*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)