2倍移動平均のクロスオーバー戦略

作者: リン・ハーンチャオチャン, 日時: 2023-12-11 15:21:58
タグ:

img

概要

ダブル移動平均クロスオーバー戦略は,異なる期間の2つの移動平均値のクロスオーバーをトレードシグナルとして利用するトレンドフォローする戦略である.高速MAが遅いMAの上または下をクロスしたとき,ロングまたはショートポジションに入る.クロスオーバー後にトレンド方向を決定する.中期トレンドを把握し,過剰な変動による不必要な取引頻度を減らすことができる.

戦略の論理

この戦略は,短期間 (例えば15期) の短い期間の速いMAと,より長い期間の遅いMAと (例えば21期) 主要なトレンドの方向性を特定するために,短期間 (15期) の短い期間の速いMAを使用する.取引シグナルは,2つのMAのクロスオーバーから生成される.遅いMAの上の速いMAのクロスオーバーは購入信号を与え,下の速いMAのクロスオーバーは販売信号を与える.

MA 期間の組み合わせを調整することで,戦略はトレンドの時間枠を把握するために調整することができます.より短いMA コンボは短期振動を標的にし,より長いMA コンボはノイズをフィルタリングし,長期的なトレンドのみに焦点を当てます.

この戦略には,利益を取ること,ストップ・ロスを行うこと,ストップ・ロスを追うことを含むリスク管理モジュールも含まれています.これらは個々の取引の最大利益/損失を制限し,全体的なリスクを含みます.

利点

双重MFA戦略には以下の利点はあります

  1. シンプルな論理と理解し/実行しやすい
  2. 市場状況に適応する柔軟性,MA期間調整
  3. 取引信号が少ないため安定性
  4. ストップ損失による効果的なリスク管理
  5. 適正評価,リスクパラメータなどで最適化が容易です

リスク

考慮すべきリスクもいくつかあります.

  1. 範囲限定市場における過剰なクロスオーバーと取引頻度
  2. 遅れているMAsは,価格逆転点を逃し,損失を間に合うようにできない可能性があります.
  3. 不必要な損失を伴う偽のブレイクに対する脆弱性
  4. 一般的な価格追跡の不正確性は,MAsの遅延によるものです.

これらの弱点は,フィルタリング信号,ストップ損失を追うなどの最適化によって軽減できます.

増進 の 機会

戦略は以下のような側面で強化できます.

  1. 音量や波動性のフィルターを追加して,ウィップソウを避ける
  2. より多くのMAタイプと,異なる製品と時間枠に合わせて精細調整期間/公式をテストする
  3. EMAやLWMAのような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)

もっと