
この記事で紹介する取引戦略は,ZigZag指数に基づくトレンドフォロー取引戦略である.この戦略は,ZigZag指数を使用して価格のトレンドを識別し,トレンドが逆転したときにトレンドを追跡するためにポジションを開きます.Strategy Pineのコードで,ZigZag指数は,価格の新しい高点と新しい低点を確認するために使用されます.価格がZigZag指示線を突破したときに取引信号として使用されます.
この戦略の核心は,価格の極限点を位置づけ,価格の傾向を示すためにZigZag指標を使用することです.ZigZag指標は,高低価格の指数関数移動平均で構成されています.具体的には,以下のステップに分けられています.
クローズ価格の指数移動平均EMAを計算し,快線,中線,慢線の3つの移動平均を含みます.
価格が上昇傾向にあるかどうかを判断する.つまり,現在の中線が前K線の中線より高いかどうかである.
もし現在上昇傾向にあるなら,前波の低点から数える検査周期内の最低値を見つけ,ZigZagの値として調べる.
もし現在下落傾向にあるなら,前波の高点から計る検査周期中の最高値を見つけ,ZigZagの値として調べる.
価格変動の極限点を反映したZigZag指標が形成された.
価格が上昇すると,ZigZag指示線を突破すると,私たちは多めにします. 価格が下がると,ZigZag指示線を突破すると,私たちは空っぽにします.
ZigZagの指数を使用して価格の動向を判断し,価格の極限点を追跡する利点は次のとおりです.
市場騒音を効果的にフィルターし,主要トレンドを捉える.
価格の上昇と低下の突破をベースにした取引シグナルにより,効率的に利益を得ることができます.
ZigZag線は滑らかで,偽信号を減らすことができます.
ZigZagのパラメータを調整することで,戦略を簡単に最適化できます.
この戦略の主なリスクは
長期にわたる運行は,急激な変動によって閉じ込められることがあります.
ZigZag指標はパラメータに敏感である.誤った設定により,取引機会が逃れ,偽信号が生じる可能性がある.適切なテストとパラメータの最適化が必要である.
トレンド追跡戦略は,トレンドの状況に依存する. 震動の整理が起こると,その戦略は効果的ではない.
上記のリスクに対して,単一の損失を制御するストップメカニズムを設定できます. 同時に,全ポジションの操作を追求しないように,ポジションの規模を調整できます. 最後に,異なるタイプの戦略の組み合わせを使用します.
この戦略をさらに改善するには,以下のポイントを考慮する必要があります.
移動のストップまたは価格の引き戻し幅のストップを設定する.
他の指標と組み合わせてフィルタリングする.例えば,強化型エネルギー指標,十分な動力が確保される;または取引量指標,放量特性が確保される.
異なる市場環境 (牛市と熊市など) に応じて異なるパラメータ配置を採用する.
異なるEMA平均線パラメータをテストして最適なパラメータの組み合わせを探します.
この戦略は,ZigZag指標を使用して価格のトレンドを判断し,極限点の近くで追跡ポジションを確立する.その優点は順番であり,効率的に利益を得る.同時に,被套のリスクもあります.我々は,停止,最適化パラメータ,および取引戦略の組み合わせを設定してリスクを制御することができます.この戦略は,中長期トレンドの取引に適しています.制御と組み合わせが適切であれば,安定した利益を得ることができます.
/*backtest
start: 2023-12-31 00:00:00
end: 2024-01-07 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy(title = "Noro's ZigTrend Strategy v1.0", shorttitle = "ZigTrend 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)
//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
length = input(4)
ExtremeDetection = input(4)
src = input(close)
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")
//ZigZag
f_zz(_length, _detection)=>
_hls = ema(ema(ema(src, _length), round(_length*0.66)), round(_length*0.33))
_isRising = _hls >= _hls[1]
_zigzag = _isRising and not _isRising[1] ? lowest(_detection) : not _isRising and _isRising[1] ? highest(_detection) : na
zigzag = f_zz(length, ExtremeDetection)
plot(zigzag, color=black, linewidth=2)
//Signals
up = close > zigzag
dn = close < zigzag
//Trading
lot = 0.0
lot := strategy.position_size != strategy.position_size[1] ? strategy.equity / close * capital / 100 : lot[1]
if up
strategy.entry("Long", strategy.long, needlong == false ? 0 : lot)
if dn
strategy.entry("Short", strategy.short, needshort == false ? 0 : lot)