
この戦略は,均衡尺度雲図指標から提供される複数のシグナルを利用し,中長期のトレンドを捉え,振動をフィルタリングし,強いトレンドの方向を追跡することを目的とした純粋なトレンド追跡戦略を設計した.
この戦略は,均衡尺雲図指標の変換線,基準線,および遅延線などの主要な信号を使用する.長期の傾向判断の観点から,前置雲と後置雲の上下変化の関係に重点を置く傾向を判断する.具体的な入場と出場のタイミングの選択の上で,変換線と基準線の交差,および価格と雲図の関係の変化が主要な根拠である.
全体として,この戦略の核心的な論理は,中長期のトレンドの方向を確認する -> 強いトレンドが再起動するチャンスを待つ -> トレンドの入場を追跡する -> ストップ・アウトを追跡する.
具体的には,中長期のトレンドを判断する際には,前置雲と後置雲の変化関係によって決定する (前置雲が上にあり,緑である場合,上昇傾向を表し,逆に下落傾向を表す).中長期のトレンドが確認された後に,変換線と基準線の交差,価格の突破雲図の信号によってトレンド判断を再起動し,入場信号を発信する.入場後,基準線をストップラインとして使用して,損失退出を追跡する.
短期的な変動を過濾し,強気なトレンドの機会を掴み,証券市場から長期的に安定した余剰利益を得ることができる.
(a) 均衡尺度雲図を用いて中長期の傾向の方向を判断し,主要な方向を定位するのに役立つ
(二) 転換線と基準線の交差と価格と雲図の関係の変化による入場タイミングの判断により,強気なトレンドを捕捉し,揺れを効果的にフィルターできます.
(三) ストップ・ローズ・アウト・メカニズムを追跡し,大トレンドの利益を得ることと,個々の損失を効果的に制御すること
(四) 多種均衡尺度雲図信号を統合し,系統的なトレンド追跡戦略を形成し,安定した良好なパフォーマンスを発揮する.
(a) 中長期にわたる誤判の系統的リスク.中長期にわたる誤判の傾向がある場合,後続操作は誤方向のリスクに直面する.
(二) 入場時刻の選択が不適切である場合,危険が伴う.
(三) ストップが近すぎると発生するリスクを追跡する.ストップが近すぎると,極端な状況でストップが突破され,損失が生じることがあります.
(四) 取引頻度が過度に高くなると取引費用が負担される.パラメータの設定が不適切で取引頻度が過度に高くなると取引費用も増加する.
(a) 異なる均衡尺周期パラメータの組み合わせをテストし,最適のパラメータを見つける
(ii) 入学条件の最適化,より厳格なフィルターの設計,有効な入学を確保
(三) リスクと利益の最適なバランスをとるためのストップ・ロスの調整
(四) 価格と重要な均衡尺度指標との距離を組み合わせた収益価格目標を追加し,動的な収益メカニズムを形成する.
この均衡尺雲図のトレンド追跡戦略は,複数の信号を統合してトレンドの方向,入場タイミング,止損退出を判断する. 実践は,この戦略が中長期のトレンドを効果的に捉え,揺れをフィルターし,安定して余分な利益を得ることを示しています. 将来,継続的な最適化テストによって,戦略のパフォーマンスをさらに改善し,より良い利益を得ることを期待しています.
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("Ichimoku trendfollowing", overlay=true, initial_capital=1000, commission_type=strategy.commission.cash_per_order, commission_value=0.04, slippage=2)
//***************************
// INPUT BACKTEST RANGE *
//***************************
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear = input(defval = 2010, title = "From Year", minval = 2000)
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 = 2000)
start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window
window() => true
//***************
//* ICHIMOKU *
//***************
//inizializzazione parametri,,
tenkanPeriods = input(9, minval=1, title="Tenkan-Sen")
kinjunPeriods = input(26, minval=1, title="Kinjun-Sen")
senkouSpanBPeriods = input(52, minval=1, title="Senkou Span B")
displacement = input(26, minval=1, title="-ChinkouSpan/+SenkouSpan A")
//definizione Tenkan-Sen (9 Period), Kinjun-Sen (26 Period), Chinkou Span (Lagging Line)
averageHighLow(period) => avg(lowest(period), highest(period))
tenkan= averageHighLow(tenkanPeriods)
kinjun = averageHighLow(kinjunPeriods)
senkouSpanA = avg(tenkan, kinjun)
senkouSpanB = averageHighLow(senkouSpanBPeriods)
//definisco il colore della kumo in base al trend.
senkouSpan1Above = senkouSpanA >= senkouSpanB ? 1 : na
senkouSpan2Below = senkouSpanA <= senkouSpanB ? 1 : na
span1plotU = senkouSpan1Above ? senkouSpanA : na
span2plotU = senkouSpan1Above ? senkouSpanB : na
span1plotD = senkouSpan2Below ? senkouSpanA : na
span2plotD = senkouSpan2Below ? senkouSpanB : na
col = senkouSpanA >= senkouSpanB ? lime : red
//plots Ichimoku
plot(tenkan, title = 'Tenkan-Sen', linewidth=1, color=blue)
plot(kinjun, title = 'Kinjun-Sen', linewidth=1, color=red)
plot(close, title = 'Chinkou Span', linewidth=1, offset = -displacement, color=aqua)
plot( senkouSpanA, title = 'Senkou Span A', style=line, linewidth=1, offset = displacement, color=lime)
plot(senkouSpanB, title = 'Senkou Span B', style=line, linewidth=1, offset = displacement, color=red)
//Cloud Lines Plot
p1 = plot(span1plotU ? span1plotU : na, title = 'Senkou Span A Above Senkou Span B', style=linebr, linewidth=1, offset = displacement, color=col)
p2 = plot(span2plotU ? span2plotU : na, title = 'Senkou Span B (52 Period) Below Span A Cloud', style=linebr, linewidth=1, offset = displacement, color=col)
p3 = plot(span1plotD ? span1plotD : na, title = 'Senkou Span A (26 Period) Below Span B Cloud', style=linebr, linewidth=1, offset = displacement, color=col)
p4 = plot(span2plotD ? span2plotD : na, title = 'Senkou Span B (52 Period) Above Span A Cloud', style=linebr, linewidth=1, offset = displacement, color=col)
//Fills that color cloud based on Trend.
fill(p1, p2, color=lime, transp=70, title='Kumo (Cloud)')
fill(p3, p4, color=red, transp=70, title='Kumo (Cloud)')
//***********************************************
//* condizioni ingresso ed uscita mercato *
//***********************************************
isKumoRialzista = senkouSpanA >= senkouSpanB ? true : false
isSopraKumo = (close > max(senkouSpanA[displacement], senkouSpanB[displacement]))
isSottoKumo = (close < min(senkouSpanA[displacement], senkouSpanB[displacement]))
isChinkouSpanSopra = high[displacement]<close
isChinkouSpanSotto = low[displacement]>close
filtroLong=isSopraKumo and isChinkouSpanSopra
filtroShort=isSottoKumo and isChinkouSpanSotto
//rimbalzato su kijun quando i prezzi stavano ritracciando e il trend era già in atto(tenkan >kijun x entrare long
isPullBackLijunEntryLong = kinjun<tenkan and low<kinjun and (close>kinjun)
isPullBackLijunEntryShort =kinjun>tenkan and high>kinjun and (close<kinjun)
//Breackout Kumo
isBreackoutKumoEntryLong = crossover(close, max(senkouSpanA[displacement], senkouSpanB[displacement])) and (close>tenkan) and (close>kinjun)
isBreackoutKumoEntryShort = crossunder(close, min(senkouSpanA[displacement], senkouSpanB[displacement])) and (close<tenkan) and (close<kinjun)
ConditionEntryLong = (isPullBackLijunEntryLong or isBreackoutKumoEntryLong ) and filtroLong
ConditionEntryShort = (isPullBackLijunEntryShort or isBreackoutKumoEntryLong ) and filtroShort
isExitLong = close<kinjun
isExitShort = close>kinjun
//ingressi ed uscite Mercato
strategy.entry ("Long",long=true, when = window() and ConditionEntryLong)
strategy.entry ("Short",long=false, when = window() and ConditionEntryShort)
strategy.close(id="Long", when=isExitLong)
strategy.close(id="Short", when=isExitShort)
strategy.close_all(when=not window())