デュアル移動平均とスーパートレンド戦略


作成日: 2023-09-28 15:12:50 最終変更日: 2023-09-28 15:12:50
コピー: 0 クリック数: 923
1
フォロー
1617
フォロワー

概要

この戦略は,21日と55日の移動平均線の交差をベースに,買入と売却のシグナルを生成し,同時に超トレンド指標を組み合わせて偽のシグナルをフィルターするトレンド追跡戦略である.

戦略原則

コードは,まず第21日線 ((EMA1) と第55日線 ((EMA2) の移動平均線を定義する.EMA1の上をEMA2を通るときに買い信号を生じ;EMA1下をEMA2を通るときに売り信号を生じする.

偽信号をフィルターするために,コードに超トレンド指標が加えられている.超トレンド指標は,平均真波幅ATRに基づいて,価格の最近の高点と低点を組み合わせて,トレンドの方向を判断する.コードでは,価格が上線の上部で上昇傾向で,下線の下部で下降傾向に設定されている.

このように,トレンドが上昇しているときにEMA1をEMA2で穿越するだけで買入シグナルが生成され,トレンドが低下しているときにEMA1をEMA2で穿越するだけで売り出せシグナルが生成されます.超トレンド指標のフィルタリングにより,トレンド転換時に発生する偽信号を回避できます.

さらに,コードに200日線と233日線が追加され,長期トレンドを判断し,長期トレンドの方向が一致するときにのみ取引シグナルを生成する.

戦略的優位性

  1. 双移動平均線と超トレンド指標を組み合わせて,トレンドの方向を効果的に識別し,偽信号をフィルターします.

  2. 移動平均のパラメータを調整することで,戦略の敏感性を調整し,異なる市場環境に適応させることができる.

  3. 長期平均の判断を加えると,長期的傾向の不一致がもたらすリスクを回避できます.

  4. ルールが明確でわかりやすく,パラメータの調整が簡単で,量化取引に適しています.

  5. 商品の購入と売却のシグナルが視覚化され,操作が明確になっています.

戦略リスク

  1. 双移動均線策は,トレンドの転換点で誤信号を発生させる傾向がある.潜在的な転換点を認識するために注意が必要です.

  2. 移動平均線パラメータの設定が不適切である場合,トレンドを逃したり,誤った信号を過剰に発生させたりする.異なる市場に対応してパラメータを調整する必要がある.

  3. 取引の頻度が高く,取引コストの管理に注意が必要です.

  4. 超トレンド指標のパラメータは最適化が必要で,そうでなければ正しい信号をフィルターしたり,誤った信号を保存したりする可能性があります.

  5. 長期平均線判断は,遅滞信号を生じさせる可能性があり,トレンド転換のタイミングを合理的に把握する必要がある.

戦略の最適化

  1. 異なる移動均等線の組み合わせをテストし,最適なパラメータを探します.

  2. 超トレンド指標のパラメータを最適化して,フィルタリング効果と遅延をバランスする.

  3. 取引量指数などの他の補助指標を追加し,信号をさらに検証します.

  4. 感情の指標やニュースの面などと組み合わせて 潜在的転換点を判断する.

  5. 機械学習による動的最適化パラメータ.

要約する

この戦略は,双移動平均線と超トレンド指標の優位性を統合し,トレンドを掘り出し,エラー信号をフィルターすることができます.パラメータの最適化と補助指標の検証により,戦略の効果を継続的に改善することができます.一定のリスクがあるものの,リスク管理手段によって制御できます.この戦略は,量化方式でプログラム取引を行うのに適しています.

ストラテジーソースコード
/*backtest
start: 2022-09-21 00:00:00
end: 2023-09-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"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/
// © bhavikmota

//@version=4
strategy("EMA & Supertrend", overlay = true)

//length = input(9, minval=1)
//ema1 = ema(close, length)
//ema2 = ema(ema1, length)
//ema3 = ema(ema2, length)

//shortest = ema(close, 20)
//short = ema(close, 50)
//longer = ema(close, 100)
//longest = ema(close, 200)


//for Ema1
len1 = input(21, minval=1)
//src1 = input(close)
ema1 = ema(close,len1)
plot(ema1, color=color.red, linewidth=1)

//for Ema2
len2 = input(55, minval=1)
//src2 = input(close)
ema2 = ema(close,len2)
plot(ema2, color=color.green, linewidth=1)

//for Ema3
len3 = input(200, minval=1)
//src3 = input(close)
ema3 = ema(close,len3)
plot(ema3, color=color.blue, linewidth=1)

//for Ema4
len4 = input(233, minval=1)
//src4 = input(close)
ema4 = ema(close,len4)
plot(ema4, color=color.black, linewidth=1)


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=true)
highlighting = input(title="Highlighter 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)
alertcondition(buySignal, title="SuperTrend Buy", message="SuperTrend Buy!")
alertcondition(sellSignal, title="SuperTrend Sell", message="SuperTrend Sell!")
changeCond = trend != trend[1]
alertcondition(changeCond, title="SuperTrend Direction Change", message="SuperTrend has changed direction!")


//Trading logic

Enterlong = crossover(ema1,ema2) or (close>ema1 and close>ema2 and ema1>ema2) and close>ema4// positive ema crossover
Exitlong = crossunder(close,ema2) // candle closes below supertrend

Entershort = crossunder(ema1,ema2) or (close<ema1 and close<ema2 and ema2<ema1) and close<ema4// negative ema crossover
Exitshort = crossover(close,ema2) // candle closes above supertrend

//Execution Logic - Placing Order

start = timestamp(2008,1,1,0,0)

if time>= start
    strategy.entry("long", strategy.long, when=Enterlong)
    strategy.close("long",when=Exitlong)
//strategy.entry("short",strategy.short,100,when=Entershort)
//strategy.close("short",when=Exitshort)