モメンタムブレイクアウトとトレンドフォローの組み合わせ戦略


作成日: 2023-12-13 16:41:25 最終変更日: 2023-12-13 16:41:25
コピー: 0 クリック数: 622
1
フォロー
1621
フォロワー

モメンタムブレイクアウトとトレンドフォローの組み合わせ戦略

概要

この戦略は,動量指標,トレンドフォロー指標,均線指標を組み合わせた組み合わせの戦略で,トレンドフォローと突破買い/売りを実現する. 主に,ストキャスティック指標とスーパートレンド指標の組み合わせで買い/売りのタイミングを判断し,市場の主なトレンドを判断するために,EMA均線を補助する.

戦略原則

この戦略は以下の指標で構成されています.

  1. EMA平均線: EMA 25, 50, 100, 200 の4つの平均線を使って主要なトレンドを判断する. EMA25 上を EMA50 と EMA100 上を EMA200 を越すと上昇傾向であり,そうでなければ下降傾向である.

  2. スーパートレンドのトレンド追跡指標:パラメータは,ファクター3とATR10で,現在の価格が上昇傾向にあるか下落傾向にあるかを判断する.スーパートレンドが緑色であるときは上昇傾向,赤色は下落傾向である.

  3. ストキャスティック動量指標:%K 8と%D 3で,ストキャスティックが金叉か死叉の現象を生むかどうかを判断する. %K線が下から%D線を穿越すると金叉信号で,逆に死叉信号である.

買い方策は,EMAが上昇傾向を示し,スーパートレンドが上昇傾向を示し,ストキャスティック金叉の時間である. 販売戦略は,EMAが下降傾向を示し,スーパートレンドが下降傾向を示し,ストキャスティックデッドフォークの時間である.

この戦略は,トレンド,動力,および突破の3つの指標を統合し,市場動向と買取のポイントを比較的に信頼できる方法で判断します.

優位分析

この戦略の利点は以下の通りです.

  1. 複数の指標を組み合わせて判断力を高めると,偽の突破を効果的にフィルターできます.

  2. ターニングポイントを早期に判断できる.

  3. 異なる市場環境に適用できるカスタマイズ可能なパラメータ

  4. 比較的効率的な止損と停止設定を実現した.

  5. 高周期の太陽線のような反測が可能で,効果が優れている.

リスク分析

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

  1. パラメータの設定が不適切である場合,取引の頻度や信号の不安定が原因となる.パラメータの調整が必要である.

  2. 選択時に誤判が起こりうる場合もあります.さらに多くの波指標を追加することを検討できます.

  3. ストップ・ロスはストキャスティック指標の極限値に設定されていて,過度に近づく可能性があり,適切な緩和を考慮することができます.

  4. 回測データは不十分で,パラメータ適合に影響を与える可能性がある.回測周期を拡大すべきである.

最適化の方向

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

  1. より多くのパラメータをテストして,最適のパラメータを見つける.例えば,SupertrendのFactorパラメータを調整する.

  2. エネルギー指標,波動率指標など,より多くの波指標を追加し,誤判の可能性を減らす.

  3. 極限点で一定パーセントのストップラインを設定するなど,さまざまなストップ方法をテストすることができる.

  4. 動的ストップを考慮して,より多くの利益をロックするなど,ストップの最適化方法.

  5. 戦略の適用範囲を拡大する.例えば,より多くの取引品種に適応しようとするか,より高い周期で使用しようとする.

要約する

この戦略の全体的な考え方は明確で,指標の選択は合理的で,トレンド追跡と突破取引を実現し,反測効果は良好である.しかし,最適化の余地はまだ存在し,パラメータ調整,より多くの波指標を追加し,ストップ・ストップ方式を改善することによって多方的な最適化を行うことが可能である.

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

//@version=4
strategy(title="Supertrend + Stoch Strategy", overlay=true)

// ---inputs---
pl = input(1.5, title="P/L", minval=0.1)
lossPercentage = input(1, title="Loss Percentage", minval=1, maxval=100)
atrPeriod = input(10, "ATR Length")
factor = input(3, "Supertrend Factor")
periodK = input(8, title="%K Length", minval=1)
smoothK = input(3, title="%K Smoothing", minval=1)
periodD = input(3, title="%D Smoothing", minval=1)
ema1l = input(25, title="EMA 1 Length", minval=1)
ema2l = input(50, title="EMA 2 Length", minval=1)
ema3l = input(100, title="EMA 3 Length", minval=1)
ema4l = input(200, title="EMA 4 Length", minval=1)

// ---lines---
ema1 = ema(close, ema1l)
ema2 = ema(close, ema2l)
ema3 = ema(close, ema3l)
ema4 = ema(close, ema4l)
trendUpper = ema1 > ema2 and ema3 > ema4
trendLower = ema1 < ema2 and ema3 < ema4

[supertrend, direction] = supertrend(factor, atrPeriod)
supertrendUpper = direction < 0
supertrendLower = direction > 0

k = sma(stoch(close, high, low, periodK), smoothK)
d = sma(k, periodD)
stochCrossOver = crossover(k, d)
stochCrossUnder = crossunder(k, d)

// ---plot---
plot(ema1, color=color.green)
plot(ema2, color=color.orange)
plot(ema3, color=color.blue)
plot(ema4, color=color.purple)

bodyMiddle = plot((open + close) / 2, display=display.none)
upTrend = plot(direction < 0 ? supertrend : na, "Up Trend", color = color.green, style=plot.style_linebr)
downTrend = plot(direction < 0 ? na : supertrend, "Down Trend", color = color.red, style=plot.style_linebr)
fill(bodyMiddle, upTrend, color.new(color.green, 95), fillgaps=false)
fill(bodyMiddle, downTrend, color.new(color.red, 95), fillgaps=false)

// ---stop place compute---
edge = 0.  // periodly high/low
edge := stochCrossOver ? high : stochCrossUnder ? low : k > d ? max(edge[1], high) : k < d ? min(edge[1], low) : edge[1]

// plot(edge)

// ---trade condition---
// longCond = trendUpper and supertrendUpper and stochCrossOver
// shortCond = trendLower and supertrendLower and stochCrossUnder
longCond = trendUpper and supertrendUpper and stochCrossOver and strategy.position_size == 0
shortCond = trendLower and supertrendLower and stochCrossUnder and strategy.position_size == 0

// ---stop & take---
stop = 0.
stop := nz(stop[1], stop)
take = 0.
take := nz(take[1], take)

if longCond
    stop := edge[1]
    take := close + (close - stop) * pl
if shortCond
    stop := edge[1]
    take := close - (stop - close) * pl

// ---trade---
qty = strategy.equity / abs(stop - close) / 100 * lossPercentage

strategy.entry("Buy", strategy.long, when=longCond, qty=qty)
strategy.exit("Close Buy","Buy", limit=take, stop=stop)

strategy.entry("Sell", strategy.short, when=shortCond, qty=qty)
strategy.exit("Close Sell","Sell", limit=take, stop=stop)

stopLine = plot(strategy.position_size != 0 ? stop : na, color=color.red, style=plot.style_linebr)
takeLine = plot(strategy.position_size != 0 ? take : na, color=color.green, style=plot.style_linebr)
entryLine = plot(strategy.position_size != 0 ? strategy.position_avg_price : na, color=color.blue, style=plot.style_linebr)
fill(entryLine, stopLine, color.new(color.red, 90), fillgaps=false)
fill(entryLine, takeLine, color.new(color.green, 90), fillgaps=false)