二重移動平均ブレイクアウト戦略


作成日: 2023-12-11 15:21:58 最終変更日: 2023-12-11 15:21:58
コピー: 0 クリック数: 637
1
フォロー
1621
フォロワー

二重移動平均ブレイクアウト戦略

概要

双均線突破策は,2つの異なる周期の移動平均の交差を買い売り信号として利用したトレンド追跡策である.この策は,急速平均と遅い平均の交差点を取引入場点として使用し,交差後にトレンドの方向性を判断し,それに応じて多頭または空頭ポジションを確立する.それは,中間レベルのトレンドを捕捉することも,不必要な振動によって引き起こされる取引頻度の過度の問題を軽減することもできる.

戦略原則

この戦略は,2つの移動平均線を使用します. 急速MAと遅いMA. 急速MAの周期は,通常,短期的な価格変動を捉えるために短い周期 (例えば15期) に設定されます. 遅いMAの周期は,通常,長期的な周期 (例えば21期) に設定され,主要なトレンドの方向を判断します. 戦略の取引シグナルは,二つのMAの交差から来ます.

異なるMA周期组合を設定することで,戦略がトレンドを捕捉する時間長さを調整できます.短いMA组合は,短期の小周期の価格変動の機会を捕捉できます.長いMA组合は,より長い線レベルのトレンドのみを捕捉して,振動をフィルターできます.

この戦略にはリスク管理モジュールも含まれています: ストップ・ストップ・ロッド, モバイル・ストップ・ロッド. これは,単一の取引の最大損失を制限し,全体的な利益を保護するのに役立ちます.

戦略的優位性

双方向戦略の利点は以下の通りです.

  1. 概念がシンプルで,理解し,実行しやすい.
  2. 異なる時間帯のトレンドを捉えるために,異なる市場環境に適応するMAサイクルを調整できます.
  3. 取引の頻度が高く,安定した取引を避けること.
  4. ストップ・ストップと組み合わせると リスクを効果的にコントロールできます
  5. 効率を高めるため,MAサイクル,リスク管理パラメータなどを調整できます.

リスク分析

双方向戦略にはいくつかのリスクがあり,主に以下のような側面に重点を置いています.

  1. 波動的な収束期には,MA交差信号が頻繁になり,取引頻度の問題が発生する.
  2. 価格の逆転点を逃し,その間に損失を止めることができない.
  3. 偽の突破口を効率的にフィルターできず,不必要な損失を招く可能性がある.
  4. MA自身は価格に反応するのが遅いため,価格の動きを完全に追跡することができません.

これらのリスクは,MAパラメータの調整,フィルター条件の追加,ストップダストロジックの最適化などによって改善および最適化できます.

最適化の方向

双方向戦略は以下の点で最適化できます.

  1. 取引量や波動指標などのフィルターを加え,震動や偽突破で頻繁に倉庫を建てるのを避ける.
  2. MAの周期と組み合わせは,異なる周期と品種の特性に合わせて多種多様な調整が可能である.
  3. EMA,LWMAなど,さまざまな種類のMAをテストし,価格反応に最も敏感なMA形式を選択できます.
  4. 機械学習のアルゴリズムが追加され,MAパラメータやストップダメージ幅などの超パラメータを自動的に検索できます.
  5. 跳躍停止,追跡停止,平均停止など,さまざまな停止方法をテストできます.

これらの最適化や改善によって 戦略の勝利率,収益率,リスク・リターン率を大幅に向上させることができます.

要約する

双均線突破戦略は,全体的に見ると,実装しやすく最適化できるトレンド追跡戦略である. 操作が簡単で,柔軟に調整可能であり,リスクが制御可能であるなどの利点があるため,量化取引の入門戦略として非常に適しています. 継続的なテストと最適化により,この戦略は継続的に改善され,質的戦略になる可能性を秘めています.

ストラテジーソースコード
/*backtest
start: 2022-12-10 00:00:00
end: 2023-06-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title = "Silent Trader Strategy", shorttitle = "Silent Trader", overlay = true, pyramiding = 0, default_qty_type = strategy.cash, default_qty_value = 1000, commission_value = 0.0675, initial_capital = 1000, currency = currency.USD, calc_on_order_fills = true, calc_on_every_tick = true)

maFastSource   = input(defval = ohlc4, title = "Fast MA Source")
maFastLength   = input(defval = 15, title = "Fast MA Period", minval = 1)
maSlowSource   = input(defval = ohlc4, title = "Slow MA Source")
maSlowLength   = input(defval = 21, title = "Slow MA Period", minval = 1)

tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
inpTakeProfit   = input(defval = 100, title = "Take Profit percentage(0.1%)", minval = 0)
inpStopLoss     = input(defval = 100, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 0, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)

useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
startYear       = input(defval = 2018, title = "Start From Year",  minval = 0, step = 1)
startMonth      = input(defval = 05, title = "Start From Month",  minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day",  minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour",  minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute",  minval = 0,step = 1)

startTimeOk() =>
    inputTime = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    timeOk = time > inputTime ? true : false
    r = (useTimeLimit and timeOk) or not useTimeLimit

maFast = ema(maFastSource, maFastLength)
maSlow = sma(maSlowSource, maSlowLength)

fast = plot(maFast, title = "Fast MA", color = #26A69A, linewidth = 1, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = #EF5350, linewidth = 1, style = line, transp = 50)

aboveBelow = maFast >= maSlow ? true : false
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

if( startTimeOk() )
    enterLong = not tradeDirection[1] and tradeDirection
    exitLong = tradeDirection[1] and not tradeDirection
    strategy.entry( id = "Long", long = true, when = enterLong )
    //strategy.close( id = "Long", when = exitLong )
    
    enterShort = tradeDirection[1] and not tradeDirection
    exitShort = not tradeDirection[1] and tradeDirection
    strategy.entry( id = "Short", long = false, when = enterShort )
    //strategy.close( id = "Short", when = exitShort )
    
    strategy.exit("Exit Long", from_entry = "Long",  profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)
    strategy.exit("Exit Short", from_entry = "Short", profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)