組み合わせ戦略の後の勢力の突破と傾向

作者: リン・ハーンチャオチャン, 日付: 2023-12-13 16:41:25
タグ:

img

概要

この戦略は,モメントインジケーター,トレンドフォローインジケーター,移動平均インジケーターを統合した組み合わせ戦略で,トレンドフォローインジケーターとブレイクアウトエントリー/エグジクットを実現する.主にストーカスティックインジケーターとスーパートレンドインジケーターの組み合わせを使用してエントリー/エグジクットのタイミングを決定し,EMA線を使用して主要市場トレンドを判断する.

戦略原則

戦略は以下の指標からなる.

  1. EMA線: EMA 25, 50, 100 と 200 を使ってメイントレンドを決定する.EMA25 が EMA50 を越え,EMA100 が EMA200 を越えるときは上昇傾向であり,そうでなければ下落傾向である.

  2. スーパートレンドトレンドフォローインジケーター: パラメーターは,現在の価格が上昇傾向か下落傾向にあるかどうかを判断するためのファクター3とATR 10です. スーパートレンドが緑色であれば,それは上昇傾向です. 赤色であれば,それは下落傾向です.

  3. ストキャスティックモメント指標: %K 8 と %D 3 は,ストキャスティックがゴールデンクロスまたはデッドクロスを生成するかどうかを決定します. %K 線が下から %D 線を横切ると,それはゴールデンクロス信号であり,デッドクロスでは逆です.

EMAは上昇傾向を示し,スーパートレンドは上昇傾向を示し,ストカスティック・ゴールデン・クロス
販売戦略は EMAがダウントレンド + スーパートレンドがダウントレンド + ストカスティック・デッドクロス

この戦略は,市場動向と取引ポイントを信頼的に決定するために,トレンド,モメンタム,ブレイクアウト指標を統合しています.

利点分析

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

  1. 複数の指標を組み合わせることで 安定性が向上し 偽のブレイクを効果的にフィルタリングできます

  2. 動力指標を追加することで 転換点を早期に特定できます

  3. パーソナライズ可能なパラメータは,異なる市場環境に適しています.

  4. 比較的効率的なストップ・ロストと 利益の設定を実現します

  5. 日常のように長い時間枠でバックテストするとうまく機能します

リスク分析

リスクもあります:

  1. パラメータの設定が正しくない場合,取引が頻繁すぎたり,信号が不安定になる可能性があります. パラメータを最適化する必要があります.

  2. タイミングの誤りがあるかもしれません.より多くのフィルター指標が追加されるかもしれません.

  3. ストカスティック・エクストリームに設定されたストップ・ロスは 近づいて過ぎるかもしれない.より広いストップはテストに値する.

  4. バックテストデータ不足がパラメータフィッティングに偏差を引き起こす可能性があります. バックテスト期間を拡大します.

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

戦略は以下の方法で最適化できます.

  1. 最適値を見つけるためにより多くのパラメータセットをテストします.例えば,スーパートレンドファクタを調整します.

  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)

もっと