
이 전략은 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()