이 전략은 트렌드 방향을 결정하기 위해 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()