移動平均ゴールデンクロスとデッドクロスに基づく取引戦略


作成日: 2023-12-07 14:56:50 最終変更日: 2023-12-07 14:56:50
コピー: 0 クリック数: 844
1
フォロー
1621
フォロワー

移動平均ゴールデンクロスとデッドクロスに基づく取引戦略

概要

この戦略は,BTCの50日移動平均と200日移動平均の金叉死叉信号に基づいて,追加の技術指標判断と組み合わせて,買入と売却のシグナルを発信する. この戦略は,BTC/USDTのような明らかにトレンドの特徴を持つ通貨ペアに主に適用されます.

戦略原則

50日移動平均線上から200日移動平均線を突破して金フォークが形成されたとき,BTCは多頭市場に入り,買入シグナルを生成する.50日移動平均線下から200日移動平均線を突破して死フォークが形成されたとき,BTCは空頭市場に入り,売り込みシグナルを生成する.

この戦略は,基本的な移動平均の金フォークと死フォークの信号判断に加えて,いくつかの追加の技術指標を判断に補助するために追加しました.これらの指標は以下のとおりです.

  1. EMA指数:長さ+オフセットの EMA指数を計算し,その上昇が現在多頭市場にあることを示し,購入することができる.

  2. 移動平均とEMAの数値関係を比較する:50日移動平均よりEMA値が高くなった場合,買取判断が生じます.

  3. チェック価格は前K線の低点より1%以上下落し,満たされた場合,売り込みシグナルが生じます.

上記のいくつかの指標を組み合わせて使用することで,誤った信号をフィルターして,戦略的な取引決定をより確実なものにすることができます.

優位分析

この戦略には以下の利点があります.

  1. 移動平均を主要取引信号として使用し,市場騒音をフィルターし,トレンドの方向を識別する.

  2. EMAなどの様々な補助技術指標と組み合わせて,信号の信頼性を高め,偽信号をフィルターする.

  3. 適切なストップ・ロスの戦略によって,単一損失を効果的にコントロールできます.

  4. 取引の論理が単純で,実装が分かりやすく,量子取引の初心者にも適しています.

  5. 設定できるパラメータが多く,自分の好みに応じて調整できます.

リスク分析

この戦略にはいくつかのリスクがあります.

  1. 移動平均は後退性があるため,価格の急速な反転の機会を逃す可能性があります.

  2. 補助指標は規則の数を増やし,誤った信号の発生確率も高めます.

  3. ストップ・ロスの設定を間違えた場合,損失が拡大する可能性があります.

  4. パラメータの設定 (移動平均の長さなど) が不適切であることも,戦略の効果に影響する.

対応方法:

  1. 移動平均周期を適切に短縮し,パラメータ最適化の範囲を拡大する.

  2. 信号の質をチェックする.

  3. 利回り制限を設定しながら,適切な緩解のストップ・ローズ幅を設定します.

  4. パラメータの最適化を加え,最適なパラメータの組み合わせを探します.

最適化の方向

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

  1. 機械学習アルゴリズムを追加し,パラメータの自動最適化を実現する.

  2. 支援指標を追加し,複数のサブ戦略を構築し,投票の仕組みで決定を下す.

  3. 価格の突破を特定するために,ブレークアウト戦略を試す.

  4. ディープ・ラーニングを活用して価格の動向を予測する.

  5. ストップダスの最適化,動的なストップダスの追跡

戦略の収益性や安定性を高め,意思決定の正確性を高めます.

要約する

この戦略は,主にBTCの移動平均の交差をベースに取引決定を行い,EMAなどの技術指標を補助してフィルター信号を行う.この戦略は,強いトレンド追跡能力があり,配置性が高く,量化取引の入門戦略として適しています.しかし,ある程度の遅れのリスクもあるので,注意が必要である.次の最適化の方向は,機械学習,統合戦略,止損戦略などの複数のレベルで行えます.

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

//@version=5
strategy('JayJay BTC Signal', overlay=true, initial_capital=100, currency='USD', default_qty_value=100, default_qty_type=strategy.percent_of_equity, commission_value=0, calc_on_every_tick=true)

securityNoRepaint(sym, tf, src) => request.security(sym, tf, src[barstate.isrealtime ? 1 : 0])[barstate.isrealtime ? 0 : 1]

//200 50 Moving Average
ma50Len = input.int(50, minval=1, title='MA50-Length')
ma50Src = input(close, title='MA50-Source')
ma50Show = input(true, title='Show SMA50 on chart')
ma50Close = ta.sma(ma50Src, ma50Len)
ma50CloseTimeframe = input.timeframe("240", "Ma50 Timeframe", group = "EMA Options")
ma50Open = ta.sma(open, ma50Len)
ma200Len = input.int(200, minval=1, title='MA200-Length')
ma200Src = input(close, title='MA200-Source')
ma200Show = input(true, title='Show SMA200 on chart')
ma200CloseTimeframe = input.timeframe("D", "Ma200 Timeframe", group = "EMA Options")
ma200Close = ta.sma(ma200Src, ma200Len)
ma200Open = ta.sma(open, ma200Len)
//plot(ma200Close, color=color.new(#0b6ce5, 0), title='MA200')
//plot(ma50Close, color=color.new(#00d8ff, 0), title='MA50')

sma50 = securityNoRepaint(syminfo.tickerid, ma50CloseTimeframe, ma50Close)
plot(sma50 and ma50Show ? sma50 : na, color=color.new(#00d8ff, 0), title='SMA50')
sma200 = securityNoRepaint(syminfo.tickerid, ma200CloseTimeframe, ma200Close)
plot(sma200 and ma200Show ? sma200 : na, color=color.new(#00d8ff, 0), title='SMA200')

// Short/Long EMA
// Define the offset value
EMAOffsetValue = input.int(2, title='EMA Offset', minval=0)
emaplot = input(true, title='Show EMA on chart')
len = input.int(20, minval=1, title='ema Length') + EMAOffsetValue
emaCloseTimeframe = input.timeframe("240", "EMA 1 Timeframe", group = "EMA Options")
emaOpen = ta.ema(open, len)
emaClose = ta.ema(close, len)

ema = securityNoRepaint(syminfo.tickerid, emaCloseTimeframe, emaClose)

up = emaClose > ema[1]
down = emaClose < ema[1]
mycolor = up ? color.green : down ? color.red : color.blue

plot(ema and emaplot ? ema : na, title='Signal EMA', color=mycolor, linewidth=3)
//plot(emaClose and emaplot ? emaClose : na, title='Signal 20 EMA', color=color.yellow, linewidth=3)

ma50GreaterThanMa200 = sma50 > sma200

last3BarUp = ema > ema[1]

startLong = up and ema > sma50 and ma50GreaterThanMa200 and (100 - (sma50 / ema * 100) > 1.0)

startFrom = input(timestamp("20 Jan 2000 00:00"), "StartFrom")

yearFilter = true

alertLongPositionMessage = "{\"direction:\": \"long\", \"action\": \"{{strategy.order.action}}\", \"price\": \"{{strategy.order.price}}\", \"qty\": \"{{strategy.position_size}}\", \"symbol\": \"{{ticker}}\", \"date\": \"{{time}}\"}"

if true and startLong and yearFilter
    strategy.entry('Long', strategy.long, comment = "Long", alert_message = alertLongPositionMessage)

longStopLossLevel = open * 0.05
strategy.exit('StopLoss', from_entry='Long',comment = "StopLoss!", loss=longStopLossLevel, profit=close * 0.3, alert_message = alertLongPositionMessage)
longPercentageChange = low / close[1] * 100 - 100
is1PercentLower = longPercentageChange < -0.1
closeLongPositionWhen = (down and is1PercentLower) or (emaClose < sma50)
if closeLongPositionWhen
    strategy.close('Long', comment = "Fuck It!", alert_message =  alertLongPositionMessage)

bgcolor(startLong ? color.green : na, transp=90)