この戦略は,トレンド方向を決定するためにZigZag指標を使用し,確認された後トレンドをフォローします.これはトレンドフォロー戦略に属します.
この戦略は主にZigZag指標を使用して価格傾向方向を決定する.ZigZagは市場のノイズをフィルタリングし,主要な価格変動方向性を特定することができます.価格は新しい高値または低値に達すると取引信号を生成します.
具体的には,戦略はまずZigZag値を計算する.価格が高い値に達すると,ZigZag値は高い価格になります.価格が低い値に達すると,ZigZag値は低い価格になります.したがって,ZigZagは主要な価格変動方向を明確に反映することができます.
戦略は,ジグザグ値に基づいてトレンド方向を決定する.ジグザグが上昇すると上昇傾向を示します.ジグザグが落ちると下落傾向を示します.ジグザグがトレンド方向に回転すると戦略はポジションを開きます.
特に,戦略は,ZigZagが新しい高値に転移すると長回し,ZigZagが新しい低値に転移すると短回する.出口条件は,ZigZagが再び回転したときである.これはトレンド識別のためのZigZagに基づいた自動取引を達成する.
リスクは以下によって軽減できます.
戦略は以下の側面で最適化できます.
単一の損失リスクを制御するためにストップロスを追加します.例えば,遅延ストップまたはストップ制限オーダーです.
トレンド逆転の検出メカニズム,例えばMACD,移動平均値を追加します.逆転が検出されるとポジションを閉じます.
再入力のモジュールを追加します 傾向が続くとピラミッドの位置です
傾向検出を助けるため LSTMのような機械学習モデルを追加します
引き下げや相関理論に基づく資本管理を最適化する.
バックテストと専門知識の参照によって,ZigZag期間のようなパラメータを全面的に最適化します.
戦略は,ジグザグによってトレンド方向を特定し,トレンドを取引する.論理はシンプルで実行が簡単です.しかし,単一指標依存やトレンド逆転などのリスクは存在します.ストップ損失,補助指標,再エントリー,機械学習モデルなどを通じて最適化してより堅牢で合理的にすることができます.適切なパラメータとリスク制御により,中長期のトレンドを効果的に追跡することができます.
/*backtest start: 2022-10-23 00:00:00 end: 2023-04-14 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=2 strategy(title = "Noro's ZZ Strategy v1.0", shorttitle = "ZZ str 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(false, defval = false, title = "Short") capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %") tf = input('W', title='Timeframe for ZigZag') showzz = input(false, defval = false, title = "Show ZigZag") showbg = input(false, defval = false, title = "Show Background") 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 zigzag() => _isUp = close >= open _isDown = close <= open _direction = _isUp[1] and _isDown ? -1 : _isDown[1] and _isUp ? 1 : nz(_direction[1]) _zigzag = _isUp[1] and _isDown and _direction[1] != -1 ? highest(2) : _isDown[1] and _isUp and _direction[1] != 1 ? lowest(2) : na useAltTF = true zz = useAltTF ? (change(time(tf)) != 0 ? request.security(syminfo.tickerid, tf, zigzag()) : na) : zigzag() zzcolor = showzz ? black : na plot(zz, title = 'ZigZag', color = zzcolor, linewidth = 2) //Levels dot = zz > 0 ? zz : dot[1] uplevel = dot > dot[1] ? dot : uplevel[1] dnlevel = dot < dot[1] ? dot : dnlevel[1] colorup = close[1] < uplevel[1] and uplevel == uplevel[1] ? lime : na colordn = close[1] > dnlevel[1] and dnlevel == dnlevel[1] ? red : na plot(uplevel, color = colorup, linewidth = 3) plot(dnlevel, color = colordn, linewidth = 3) //Background size = strategy.position_size bgcol = showbg == false ? na : size != size[1] ? blue : na bgcolor(bgcol, transp = 50) //Trading lot = strategy.position_size != strategy.position_size[1] ? strategy.equity / close * capital / 100 : lot[1] if uplevel > 0 and dnlevel > 0 strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, stop = uplevel + syminfo.mintick) strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, stop = dnlevel - syminfo.mintick) if time > timestamp(toyear, tomonth, today, 23, 59) strategy.close_all()