
動量突破戦略は,市場動向を追跡する量化取引戦略である. それは,歴史的価格の動力の指標を計算し,市場価格運動の傾向と強さを判断し,市場の中長線傾向を捕捉する. 動力が負の修正から多ければ,正の修正から空ければ,トレンド追跡戦略に属している. この戦略は,明らかに傾向のある市場に適用され,余分な利益を得ることができます.
この戦略は主に動力の指標に基づいている.動力の指標は,現在の周期の閉盘価格をN周期前の閉盘価格から減算するものである.最新のK線の閉盘価格がN周期前のより高いときは,動力が正であり,上昇勢いを表す.最新のK線の閉盘価格がN周期前のより低いときは,動力が負であり,下降勢いを表す.
策略は,まず,18周期の長さの動力を計算し,すなわち,現在の閉店価格を18周期前の閉店価格を減算してmom0を得る.それから,mom0の1周期の動力を計算してmom1を得る.
mom0>0とmom1>0で多行シグナルが生成されるときは,価格上昇勢力が強いことを示し,mom0とmom1で空行シグナルが生成されるときは,価格下落勢力が強いことを示します.
策略は,最新の多値と空値のシグナル時間を記録し,多値のシグナル時間が多値のシグナル時間より大きい場合は多値ポジションを保持し,多値のシグナル時間が多値のシグナル時間より大きい場合は多値ポジションを保持する.
この戦略の利点は以下の通りです.
戦略は明確でシンプルで,簡単に理解できる実装で,量子取引の初心者にも適しています.
動力指標は市場動向と強さを捉え,中長線トレンドを追跡する高い勝利率を持っています.
ダブルモーションフィルタを使用すると,偽突破による部分的な損失をフィルタリングできます.
取引シグナルが生じた後,トレンドポジションを確立するために加仓し,トレンド行情の余分な利益を得ることができます.
タイムリーな止損退出は,単一損失を制御し,反転により過大な損失を避ける.
この戦略にはいくつかのリスクがあります.
多頭行情における短期調整は,ストップ・レジデーションの退出を引き起こし,全周期行情を捕捉することができない.適切なストップ・レジデーションの範囲を緩めることができる.
震動的な状況で頻繁に開設・平仓が存在し,取引費や滑点損失が増加する恐れがある。フィルタリング条件を適切に緩和して取引頻度を減らすことができる。
トレンド反転後も元の方向のポジションを保持し,損失を拡大する.トレンド指数と組み合わせてトレンド反転を判断することができる.
パラメータを正しく設定しない場合,取引シグナルがミスしたり,誤ったシグナルが生み出したりすることがあります.異なる市場に対応してパラメータを調整する必要があります.
この戦略は以下の点で最適化できます.
動力のパラメータを最適化し,異なる周期と市場調整に合わせて動力の長さを計算し,信号品質を改善する.
MACD,KDなどの他の指標のフィルターを追加し,トレンドの逆転が損失を招くのを避ける.
取引トレンドで適切な緩解のストップを最適化し,非トレンド市場では適切なストップを厳格にする.
ポジション管理戦略を増加させ,非トレンド行情ではポジションを減少させ,トレンド行情ではポジションを拡大してより多くの収益を得ます.
各種ごとにパラメータを最適化してパラメータの適応性を向上させる.
戦略の動的最適化パラメータを機械学習アルゴリズムで追加する.
動量突破戦略overallは,シンプルで直感的なトレンド追跡戦略である.それは,市場の中間の長線トレンドを効果的に捕捉し,トレンドの状況でより良い収益を得ることができる.同時に,リスク管理に注意を払い,ストップ・ロスの戦略を最適化し,他の指標でトレンドを判断するのに補助する必要があります.継続的な最適化により,この戦略を安定した収益の定量取引システムにすることができます.
/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Momentum BF 🚀", overlay=true, 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)
/////////////// Time Frame ///////////////
_0 = 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
///////////// Momentum /////////////
_1 = input(false, "═══════ Momentum ══════")
length = input(18)
price = close
momentum(seria, length) =>
mom = seria - seria[length]
mom
mom0 = momentum(price, length)
mom1 = momentum(mom0, 1)
/////////////// Strategy ///////////////
long = mom0 > 0 and mom1 > 0
short = mom0 < 0 and mom1 < 0
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])
/////////////// Stop Losses Long ///////////////
_5 = input(false, "═══════ Stop Loss L ══════")
SL_typel = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inpl = input(8.0, title='Fixed Stop Loss %') / 100
atrLkbl = input(20, minval=1, title='ATR Stop Period')
atrMultl = input(1.5, step=0.25, title='ATR Stop Multiplier')
atr1l = atr(atrLkbl)
longStop1l = 0.0
longStop1l := short_signal ? na : long_signal ? close - (atr1l * atrMultl) : longStop1l[1]
slLongl = in_long_signal ? strategy.position_avg_price * (1 - sl_inpl) : na
long_sll = in_long_signal ? slLongl : na
/////////////// Stop Losses Short ///////////////
_6 = input(false, "═══════ Stop Loss S ══════")
SL_types = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inps = input(7.0, title='Fixed Stop Loss %') / 100
atrLkbs = input(20, minval=1, title='ATR Stop Period')
atrMults = input(1.5, step=0.25, title='ATR Stop Multiplier')
atr1s = atr(atrLkbs)
shortStop1s = 0.0
shortStop1s := long_signal ? na : short_signal ? close + (atr1s * atrMults) : shortStop1s[1]
slShorts = strategy.position_avg_price * (1 + sl_inps)
short_sls = in_short_signal ? slShorts : na
_7 = 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_typel == "Fixed" ? long_sll : longStop1l, when=since_longEntry > 0)
if useShorts
strategy.exit("S SL", "S", stop = SL_types == "Fixed" ? short_sls : shortStop1s, when=since_shortEntry > 0)
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=40)
p0 = plot(close)
p1 = plot(strategy.position_size <= 0 ? na : SL_typel == "Fixed" ? long_sll : longStop1l, title="Long Stop Loss", color=color.yellow, style=plot.style_linebr, linewidth=2)
p2 = plot(strategy.position_size >= 0 ? na : SL_types == "Fixed" ? short_sls : shortStop1s, title="Short Stop Loss", color=color.orange, style=plot.style_linebr, linewidth=2)
p3 = plot(strategy.position_size <= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Long Entry", color=color.green, linewidth=2)
p4 = plot(strategy.position_size >= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Short Entry", color=color.red, linewidth=2)
fill(p0, p3, color = color.lime, transp=60)
fill(p0, p4, color = color.red, transp=60)