
この戦略は,ZigZag指標を使用してトレンドの方向を判断し,トレンドが確認された後にトレンド追跡を行う.
この戦略は,主にZigZag指標によって価格のトレンド方向を判断する.ZigZag指標は,市場のノイズをフィルターして,価格の変動の主要な方向を判断する.価格が新しい高または新しい低を作るとき,ZigZagは取引信号を発する.
具体的には,戦略は最初にZigZag値を計算し,価格がより高い高点を創ったとき,その高点の価格をZigZagし,価格がより低い低点を創ったとき,その低点の価格をZigZagする.このようにして,ZigZagは価格の主要な波動方向を明確に反映することができる.
策略はZigZagの値に基づいてトレンドの方向を判断する.ZigZagが上昇すると,上昇傾向にあることを示し,ZigZagが下落すると,下落傾向にあることを示している.策略はZigZagが逆転した時にポジションを開き,トレンドの方向を追跡する.
具体的には,戦略はZigZagの転転が新しい高を形成する時に多項を開く,ZigZagの転転が新しい低を形成する時に空券を開く.平仓条件はZigZagが再び転転して反転する.このようにして,ZigZagの判断傾向に基づく自動取引戦略を実現する.
リスクは以下の方法で軽減できます
この戦略は以下の点で最適化できます.
単一損失のリスクを制御するために,ストップ戦略を追加する.移動ストップまたはストップを掛ける設定が可能である.
トレンド反転判断メカニズムの追加. MACD,移動平均などの指標を追加し,トレンド反転が判断されたときにポジションを閉鎖することができます.
また,トレンドが継続する場合は,適正にポジションを上げ,より多くの利益を得ることができます.
機械学習モデルを追加する.LSTMなどの深層学習モデルを訓練し,ZigZagがトレンドの方向性を判断する.
資金管理の最適化メカニズム 撤回または関連性理論に基づいてポジションの最適化サイズ
全面的な最適化パラメータを設定する。歴史の追溯と専門的な書籍の最適化パラメータ (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()