トリプル・スーパートレンド イチモク・クラウド 定量取引戦略

作者: リン・ハーンチャオチャン開催日:2023年12月27日 (日) 15:22:40
タグ:

img

概要

この戦略は,トライプルスーパートレンド指標,イチモク・クラウド指標,平均真の範囲 (ATR) 指標,指数移動平均 (EMA) を組み合わせた定量的な取引戦略である. 市場トレンドを決定するためにトライプルスーパートレンド,サポートとレジスタンスのためのイチモク・クラウド,ストップ・ロスのためのATR,トレンド確認のためのEMAを使用して,比較的完全な取引システムを形成する.

戦略原則

この戦略のコア論理は三重スーパートレンド指標に基づいています.スーパートレンド指標は,特定の期間中の平均的な真の範囲と価格を比較することによってトレンド方向を決定します.価格が上部帯を超えると,それは上昇信号であり,価格が下部帯を下回ると,それは下落信号です.この戦略は異なるパラメータを持つ3つのスーパートレンド指標を採用します.すべての3つが同時に購入または販売信号を与えるときに取引信号が生成されます.

さらに,イチモク雲の厚さは,いくつかの誤った信号をフィルターするために現在のトレンドの強さを決定するのに役立ちます.ATRインジケーターはストップロスを設定するために使用されます.EMAインジケーターは中期および長期的なトレンドを確認します.

特に,価格は3つのスーパートレンド指標の上位帯を超えるとロング,そして3つの下位帯を下回るとショートする.また,不確実な信号をフィルターするためにイチモク雲の上または下にあるように要求する.ストップロスは,ダイナミックトレーリングストップのATR値をマイナスしたエントリー価格に設定される.

利点

  1. 異なる設定の三重スーパートレンドインジケーターは,市場の騒音を効果的にフィルタリングし,トレンド方向をより正確に決定することができます.

  2. イチモク雲は,誤ったブレイクを避けるためにトレンド強さを決定します. ATRストップ損失設定は,最大限に大きな損失を避けるために合理的です.

  3. EMAは,中期および長期的トレンド方向の確認,スーパートレンドからのシグナルの検証,信頼性のさらなる向上を支援します.

  4. 複数の指標を組み合わせることで,市場動向を決定する際に互いに検証できるため,信号はより信頼性があります.

リスク

  1. イチモク雲が加えられたとしても,雲の厚さが突入した場合,無効地帯に入るリスクは依然としてあります.ATRは損失を一定程度制限します.

  2. 波動性が高い場合,ATRによって設定されたストップロスは直接起動し,損失率を増加させることができます.パラメータを調整したり,ストップロスの範囲を増加させることができます.

  3. スーパートレンドパラメータが不適切に設定された場合,不有効な信号が頻繁に発生することがあります.最適な組み合わせを見つけるには多くのバックテストが必要です.

強化

  1. 波動性指数やボリンジャー帯などの指標が追加され 信号をフィルタリングし 信頼性を高めることができます

  2. ATRの計算を改良し,大きな変動時のストップ損失範囲を動的に調整し,損失率を下げる.

  3. マニュアルパラメータ設定の代わりに取引シグナルを判断するために,歴史的なデータに訓練された機械学習モデルを追加します.シグナル精度は改善できます.

結論

この戦略は,トリプルスーパートレンド,イチモククラウド,ATRおよびEMAを含む4つの部分を組み合わせています. 市場のトレンドを決定する際にシグナルが指標全体で検証されます. イチモククラウドとATRはストップ損失制御リスクです. EMAは中期および長期的トレンドを確認します. この戦略からのシグナルは中期から長期の保有に比較的信頼性があります. ストップ損失はさらに最適化され,より良い戦略パフォーマンスを獲得するためにより多くの補助指標を追加することができます.


/*backtest
start: 2022-12-20 00:00:00
end: 2023-12-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="HyperTrend", shorttitle="HyperTrend", overlay=true )

// 
float percent_of_portfo = input.int(2, title = "percent of portfo per order", minval = 0, maxval = 100) / 100

// ichimoku Cloud
conversionPeriods = input.int(9, minval=1, title="Conversion Line Length", group = "ichimoku")
basePeriods = input.int(26, minval=1, title="Base Line Length", group = "ichimoku")
laggingSpan2Periods = input.int(52, minval=1, title="Leading Span B Length", group = "ichimoku")
displacement = input.int(26, minval=1, title="Lagging Span", group = "ichimoku")
donchian(len) => math.avg(ta.lowest(len), ta.highest(len))
conversionLine = donchian(conversionPeriods)
baseLine = donchian(basePeriods)
leadLine1 = math.avg(conversionLine, baseLine)
leadLine2 = donchian(laggingSpan2Periods)
p1 = plot(leadLine1, offset = displacement - 1, color=#A5D6A7,
	 title="Leading Span A", display = display.none)
p2 = plot(leadLine2, offset = displacement - 1, color=#ef9a9a,
	 title="Leading Span B", display = display.none)
plot(leadLine1 > leadLine2 ? leadLine1 : leadLine2, offset = displacement - 1, title = "Kumo Cloud Upper Line", display = display.none) 
plot(leadLine1 < leadLine2 ? leadLine1 : leadLine2, offset = displacement - 1, title = "Kumo Cloud Lower Line", display = display.none) 
fill(p1, p2, color = leadLine1 > leadLine2 ? color.rgb(67, 160, 72, 59) : color.rgb(244, 67, 54, 70))


// three supertrend

//1
atrPeriod1 = input(10, "ATR Length1", group="SuperTrend")
factor1 = input.float(1.0, "Factor1", step = 0.01, group="SuperTrend")

[supertrend1, direction1] = ta.supertrend(factor1, atrPeriod1)
supertrend1 := barstate.isfirst ? na : supertrend1

bodyMiddle1 = plot(barstate.isfirst ? na : (open + close) / 2, display = display.none)
upTrend1 =    plot(direction1 < 0 ? supertrend1 : na, "Up Trend",   color = color.green, style = plot.style_linebr)
downTrend1 =  plot(direction1 < 0 ? na : supertrend1, "Down Trend", color = color.red,   style = plot.style_linebr)


//2
atrPeriod2 = input(11, "ATR Length2", group="SuperTrend")
factor2 = input.float(2.0, "Factor2", step = 0.01, group="SuperTrend")

[supertrend2, direction2] = ta.supertrend(factor2, atrPeriod2)
supertrend2 := barstate.isfirst ? na : supertrend2

bodyMiddle2 = plot(barstate.isfirst ? na : (open + close) / 2, display = display.none)
upTrend2 =    plot(direction2 < 0 ? supertrend2 : na, "Up Trend",   color = color.green, style = plot.style_linebr)
downTrend2 =  plot(direction2 < 0 ? na : supertrend2, "Down Trend", color = color.red,   style = plot.style_linebr)


//3
atrPeriod3 = input(12, "ATR Length2", group="SuperTrend")
factor3 = input.float(3.0, "Factor2", step = 0.01, group="SuperTrend")

[supertrend3, direction3] = ta.supertrend(factor3, atrPeriod3)
supertrend3 := barstate.isfirst ? na : supertrend3

bodyMiddle3 = plot(barstate.isfirst ? na : (open + close) / 2, display = display.none)
upTrend3 =    plot(direction3 < 0 ? supertrend3 : na, "Up Trend",   color = color.green, style = plot.style_linebr)
downTrend3 =  plot(direction3 < 0 ? na : supertrend3, "Down Trend", color = color.red,   style = plot.style_linebr)


// ATR
lengthATR = input.int(title="Length (ATR)", defval=14, minval=1, group="ATR")
smoothingATR = input.string(title="Smoothing (ATR)", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"], group="ATR")
ma_function(sourceATR, lengthATR) =>
	switch smoothingATR
		"RMA" => ta.rma(sourceATR, lengthATR)
		"SMA" => ta.sma(sourceATR, lengthATR)
		"EMA" => ta.ema(sourceATR, lengthATR)
		=> ta.wma(sourceATR, lengthATR)
ATR = ma_function(ta.tr(true), lengthATR)
plot(ATR, title = "ATR", color=color.new(#B71C1C, 0), display = display.none)

// EMA
lenEMA = input.int(200, minval=1, title="Length of EMA", group="EMA")
srcEMA = input(close, title="Source of EMA", group="EMA")
offset = input.int(title="Offset (EMA)", defval=0, minval=-500, maxval=500, group="EMA")
outEMA = ta.ema(srcEMA, lenEMA)
plot(outEMA, title="EMA", color=color.blue, offset=offset, display = display.none)

ma(sourceEMA, lengthEMA, type) =>
    switch type
        "SMA" => ta.sma(sourceEMA, lengthEMA)
        "EMA" => ta.ema(sourceEMA, lengthEMA)
        "SMMA (RMA)" => ta.rma(sourceEMA, lengthEMA)
        "WMA" => ta.wma(sourceEMA, lengthEMA)
        "VWMA" => ta.vwma(sourceEMA, lengthEMA)

typeMA = input.string(title = "Method (EMA)", defval = "SMA", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="EMA")
smoothingLengthEMA = input.int(title = "Smoothing Length (EMA)", defval = 5, minval = 1, maxval = 100, group="EMA")

smoothingLine = ma(outEMA, smoothingLengthEMA, typeMA)
plot(smoothingLine, title="Smoothing Line", color=#f37f20, offset=offset, display=display.none)


//logic



if (open + ATR > supertrend1) and (open + ATR > supertrend2) and (open + ATR > supertrend3) 
	strategy.entry("L", strategy.long)
else if (open < supertrend1 + ATR) and (open < supertrend2 + ATR) and (open < supertrend3 + ATR) 
	strategy.entry("S", strategy.short)
else
	strategy.close_all("C")

もっと