シグザグ ベース トレンド フォロー 戦略

作者: リン・ハーンチャオチャン開催日:2023年10月30日 14:51:08
タグ:

img

概要

この戦略は,トレンド方向を決定するためにZigZag指標を使用し,確認された後トレンドをフォローします.これはトレンドフォロー戦略に属します.

戦略の論理

この戦略は主にZigZag指標を使用して価格傾向方向を決定する.ZigZagは市場のノイズをフィルタリングし,主要な価格変動方向性を特定することができます.価格は新しい高値または低値に達すると取引信号を生成します.

具体的には,戦略はまずZigZag値を計算する.価格が高い値に達すると,ZigZag値は高い価格になります.価格が低い値に達すると,ZigZag値は低い価格になります.したがって,ZigZagは主要な価格変動方向を明確に反映することができます.

戦略は,ジグザグ値に基づいてトレンド方向を決定する.ジグザグが上昇すると上昇傾向を示します.ジグザグが落ちると下落傾向を示します.ジグザグがトレンド方向に回転すると戦略はポジションを開きます.

特に,戦略は,ZigZagが新しい高値に転移すると長回し,ZigZagが新しい低値に転移すると短回する.出口条件は,ZigZagが再び回転したときである.これはトレンド識別のためのZigZagに基づいた自動取引を達成する.

利点分析

  • ZigZagは市場の騒音を効果的にフィルターし 主要なトレンド方向を正確に決定することができます
  • ジグザグのターンタイムは精密で 最適なエントリー機会を可能にします
  • 他の複雑な指標やモデルなしで 純粋な傾向戦略を実行します
  • 論理は単純で明快で 分かりやすく 変更も容易です
  • 取引頻度はパラメータ調整によって自由に制御できます

リスク分析

  • ZigZagは中期トレンド逆転に敏感ではない 急速な逆転を逃す可能性があります
  • トレンドフォロー戦略は トレンド逆転による損失を処理できない.
  • 単一の取引の損失を制限しないため,単一の損失のリスクが大きい.
  • 戦略は1つの指標だけに 基づいており 過剰な調整のリスクがあります

リスクは以下によって軽減できます.

  • 他の指標を組み合わせて傾向の逆転リスクを検出する.
  • 保持期間を短縮し,タイムリーストップ・ロスをします
  • リスク管理を加え 単一の損失の大きさを制限する
  • 機械学習モデルを追加して 安定性を向上させる

オプティマイゼーションの方向性

戦略は以下の側面で最適化できます.

  1. 単一の損失リスクを制御するためにストップロスを追加します.例えば,遅延ストップまたはストップ制限オーダーです.

  2. トレンド逆転の検出メカニズム,例えばMACD,移動平均値を追加します.逆転が検出されるとポジションを閉じます.

  3. 再入力のモジュールを追加します 傾向が続くとピラミッドの位置です

  4. 傾向検出を助けるため LSTMのような機械学習モデルを追加します

  5. 引き下げや相関理論に基づく資本管理を最適化する.

  6. バックテストと専門知識の参照によって,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()

もっと