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

作者: リン・ハーンチャオチャン,日付: 2023年10月7日 15:18:44
タグ:

概要

これは,二重移動平均クロスオーバーに基づく取引戦略である.市場動向を決定し,取引信号を生成するために,高速移動平均と遅い移動平均の相互作用を使用する.高速MAが遅いMAを超えると,購入信号が生成される.高速MAが遅いMAを下回ると,販売信号が生成される.

原則

この戦略は主に移動平均値のトレンド追跡能力を利用する.移動平均値は,歴史的な閉盤価格に基づいて一定の期間中に計算された平均価格である.それらは日中の小小変動を滑らかにし,より大きなタイムフレームのトレンドを反映することができる.速いMAは短い期間を使用し,価格変化により迅速に対応することができる.ゆっくりしたMAはより長い期間を使用し,長期的なトレンドを表現する.ゆっくりしたMAの上に速いMAの横断は,短期的な勢力が長期的なトレンドを突破し,上昇傾向が始まっていることを示唆する.逆に,ゆっくりしたMA以下のMAが速く横断すると,長期的なトレンドが圧力を被っており,価格は落ちる可能性があります.

この戦略は,異なるサイクルの長さの移動平均値を設定し,そのクロスオーバーを使用して取引信号を生成する.短サイクルMAが長サイクルMAを超えると,短期モメンタムの改善を示し,購入信号を生成する.短サイクルMAが長サイクルMAを下回ると,短期のトレンドの弱まりを示し,販売信号を生成する.戦略コードは,プロット関数でMAをプロットし,MAのクロスオーバーを決定するためにトレンド変数を使用し,クロスオーバーが発生すると購入・販売信号を出力する.

利点

  • 傾向の変化を決定するためにMAクロスを使用することは,シンプルで効果的な技術です
  • 市場騒音を効果的にフィルタリングし,混乱を回避できます
  • 迅速かつ遅い MA 期間を調整することで,異なる市場状況に適応できます.
  • 傾向信号と転換点を視覚的に示します
  • 分かりやすい,柔軟なパラメータ調整

リスク

  • 二重MAクロスオーバーは時間遅れがあり,ターンポイントを逃す可能性があります.
  • 範囲の市場には適さない 誤った信号を増やす可能性があります
  • 誤った MA 期間設定により過敏度や鈍感性が生じます
  • 傾向の状況とタイミングを確認するために他の指標が必要

オプティマイゼーションの方向性

  • 異なるMA期間のパラメータの収益性を評価し,最適なパラメータを選択する
  • チャンネルインジケーター,キャンドルスタイクパターンなど,他のフィルターを追加します.
  • ストップ・ロスを最適化し,利益を得るために波動性指標を組み込む
  • パラメータとルールを自動最適化するために機械学習アルゴリズムを使用する
  • オートオーダー実行のためのアルゴリズム取引モジュールを追加する

概要

ダブルMAクロスオーバー戦略は,移動平均値のトレンドトラッキング能力を活用し,そのクロスに基づいてシグナルを生成する.シンプルで直感的なものの,いくつかの欠点もあります.これらはパラメータチューニング,確認を追加,アルゴリズム最適化などによって克服され,堅牢なシステムになります.全体として,ダブルMA戦略は,非常にクラシックで使いやすいトレンドフォロー戦略です.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-04-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KivancOzbilgic


//@version=4
strategy("pomila", overlay=true)
Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 999)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 999)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)       
window()  => time >= start and time <= finish ? true : false
longCondition = buySignal
if (longCondition)
    strategy.entry("BUY", strategy.long, when = window())
shortCondition = sellSignal
if (shortCondition)
    strategy.entry("SELL", strategy.short, when = window())
buy1= barssince(buySignal)
sell1 = barssince(sellSignal)
color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na
barcolor(barcoloring ? color1 : na)

もっと