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


作成日: 2023-10-30 14:51:08 最終変更日: 2023-10-30 14:51:08
コピー: 0 クリック数: 843
1
フォロー
1617
フォロワー

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

概要

この戦略は,ZigZag指標を使用してトレンドの方向を判断し,トレンドが確認された後にトレンド追跡を行う.

戦略原則

この戦略は,主にZigZag指標によって価格のトレンド方向を判断する.ZigZag指標は,市場のノイズをフィルターして,価格の変動の主要な方向を判断する.価格が新しい高または新しい低を作るとき,ZigZagは取引信号を発する.

具体的には,戦略は最初にZigZag値を計算し,価格がより高い高点を創ったとき,その高点の価格をZigZagし,価格がより低い低点を創ったとき,その低点の価格をZigZagする.このようにして,ZigZagは価格の主要な波動方向を明確に反映することができる.

策略はZigZagの値に基づいてトレンドの方向を判断する.ZigZagが上昇すると,上昇傾向にあることを示し,ZigZagが下落すると,下落傾向にあることを示している.策略はZigZagが逆転した時にポジションを開き,トレンドの方向を追跡する.

具体的には,戦略はZigZagの転転が新しい高を形成する時に多項を開く,ZigZagの転転が新しい低を形成する時に空券を開く.平仓条件はZigZagが再び転転して反転する.このようにして,ZigZagの判断傾向に基づく自動取引戦略を実現する.

戦略的優位分析

  • ZigZagの指数でトレンドを判断し,市場の騒音を効果的にフィルターし,主要トレンドの方向を正確に判断します.
  • ZigZagのターニングタイムポイントは正確で,有利なエントリータイムを容易に形成する.
  • 他の複雑な指標やモデルのサポートを必要としない完全なトレンド追跡戦略を実現します.
  • 戦略の論理はシンプルで明快で,理解し,修正しやすい.
  • 自由制御戦略の取引頻度はパラメータで調整できます.

リスク分析

  • ZigZagは中短線牛熊変換に無感であり,より速い反転を逃す可能性がある.
  • トレンドを追跡する戦略は,トレンドの逆転による損失に対処できない.
  • 単一の損失の規模を制限することはできません.単一の損失のリスクは大きいです.
  • 戦略は1つの指標に基づいているため,過適合のリスクがある可能性があります.

リスクは以下の方法で軽減できます

  • 他の指標と組み合わせてトレンド逆転のリスクを判断する.
  • 持仓期間を適切に短縮し,損失を時間内に止めてください.
  • 資金管理モジュールを追加し,単一の損失の大きさを制限する.
  • 機械学習モデルを追加し,戦略の強さを高めます.

最適化の方向

この戦略は以下の点で最適化できます.

  1. 単一損失のリスクを制御するために,ストップ戦略を追加する.移動ストップまたはストップを掛ける設定が可能である.

  2. トレンド反転判断メカニズムの追加. MACD,移動平均などの指標を追加し,トレンド反転が判断されたときにポジションを閉鎖することができます.

  3. また,トレンドが継続する場合は,適正にポジションを上げ,より多くの利益を得ることができます.

  4. 機械学習モデルを追加する.LSTMなどの深層学習モデルを訓練し,ZigZagがトレンドの方向性を判断する.

  5. 資金管理の最適化メカニズム 撤回または関連性理論に基づいてポジションの最適化サイズ

  6. 全面的な最適化パラメータを設定する。歴史の追溯と専門的な書籍の最適化パラメータ (ZigZagの周期長など) を参照する。

要約する

この戦略は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()