この記事では",ジグザグトレンドフォロー戦略"と呼ばれる取引戦略を紹介する.この戦略は,ジグザグ指標を使用して価格トレンドを特定し,トレンドが逆転してトレンドをフォローするときにポジションを開く.戦略パインのスクリプトでは,ジグザグ指標は,価格の新高位と低位を確認するために使用されます.価格がジグザグ指標線を突破すると,それは取引信号として機能します. 買い信号は,閉値がジグザグ指標線上にあるとき,ロングに行く; 売り信号は,閉値がジグザグ指標線下にあるとき,ショートに行く. これにより,中長期の価格トレンドを効果的に追跡することができます.
この戦略の核心は,ジグザグ指標を使用して価格の極端な点を特定し,価格動向を表示することです.ジグザグ指標は,高値と低値の指数移動平均 (EMA) を構成しています.具体的には,以下のステップで構成されています:
3つの移動平均線:高速線,中間線,スローラインを含む閉店価格の指数的な移動平均EMAを計算します.
価格が上昇傾向にあるかどうかを判断します.つまり,現在の中間線が前回のK線の中間線よりも高いかどうかです.
現在上昇傾向にある場合,検出されたサイクル内の前回の低点波の開始からカウントされた最低価格をZigZagの値として求めます.
現在下落傾向にある場合,検出されたサイクル内の上位値の波の開始からカウントされた最高価格をZigZagの値として求めます.
このように,価格変動の極端な点を反映するZigZag指標が形成されます.
この基準に基づいて,我々はZigZag線を基準として価格動向を判断します.つまり,価格が上昇してZigZag指標線を突破すると,我々はロングに行く.価格が落ちてZigZag指標線を突破すると,我々はショートに行く.
ポジションの設定として価格動向と価格極端を追跡するためのZigZag指標の使用の利点は以下の通りである.
市場騒音を効果的にフィルタリングし 主要な傾向を把握できます
新しい高値と低値のブレイクで確立された取引信号は効率的に利益を得ることができます.
シグザグ線は比較的滑らかで 偽信号を減らすことができます
ZigZagのパラメータを調整することで 戦略を最適化します
この戦略の主なリスクは,
長期間の走行は,市場の激しい変動により閉じ込められる可能性があります.この時点で,タイムリーストップ・ロスは必要です.
ZigZagインジケーターはパラメータに敏感である.不正な設定は取引機会を逃したり,誤った信号を生む可能性があります.パラメータは適切にテストおよび最適化する必要があります.
トレンドトラッキング戦略は,トレンド市場により依存している.横向の範囲が制限されている場合,この戦略の有効性は低い.
上記のリスクに対応して,単一の損失を制御するためのストップ損失メカニズムを設定し,同時に,完全なポジションを探す代わりにポジションサイズを調整し,最後に,さまざまなタイプの戦略ポートフォリオをマッチすることができます.
この戦略をさらに最適化するには次の側面があります
ストップ・ロスのメカニズムを追加します.例えば,価格リトラセーション幅のために移動ストップ・ロスを設定します.
ポジションフィルターのための他の指標と組み合わせます.例えば,十分なモメントを確保するためにモメント指標を強化します.または,高い取引量を確保するために取引量指標.
異なる市場環境 (牛市場や熊市場など) に応じて異なるパラメータ構成を採用する.
最適なパラメータの組み合わせを見つけるために,異なるEMA線パラメータをテストします.
この戦略は,価格動向を決定するためにジグザグ指標を使用し,極端な点に近い追跡ポジションを確立します.その利点は,利益をするために効率的にトレンドを追跡することです.また,罠にかかったリスクもあります.リスクを制御するためにストップロスを設定し,パラメータとトレード戦略ポートフォリオを最適化することができます.この戦略は,中長期トレンド取引に適しています.適切に制御され,組み合わせれば,安定した収益を得ることができます.
/*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)