지그자그 기반 트렌드 다음 전략

저자:차오장, 날짜: 2023-10-30 14:51:08
태그:

img

전반적인 설명

이 전략은 트렌드 방향을 결정하기 위해 ZigZag 지표를 사용하며 확인이 된 트렌드를 따르고 트렌드 다음 전략에 속합니다.

전략 논리

이 전략은 주로 ZigZag 지표를 사용하여 가격 트렌드 방향을 결정합니다. ZigZag은 시장 소음을 필터하고 주요 가격 변동 방향을 식별 할 수 있습니다. 가격이 새로운 최고 또는 최저에 도달 할 때 거래 신호를 생성합니다.

특히, 전략은 먼저 ZigZag 값을 계산한다. 가격이 더 높은 최고치를 달성할 때, ZigZag 값은 높은 가격으로 변한다. 가격이 더 낮은 최저치를 달성할 때, ZigZag 값은 낮은 가격으로 변한다. 따라서, ZigZag는 주요 가격 변동 방향을 명확히 반영할 수 있다.

이 전략은 지그자그 값에 따라 트렌드 방향을 결정한다. 지그자그가 상승하면 상승 추세를 나타낸다. 지그자그가 하락하면 하락 추세를 나타낸다. 지그자그가 트렌드 방향을 따르기 위해 돌아서면 전략이 포지션을 개척한다.

특히, 전략은 ZigZag이 새로운 최고로 전환되면 길게, ZigZag이 새로운 최저로 전환하면 짧게 간다. 출구 조건은 ZigZag이 다시 돌아 올 때이다. 이것은 트렌드 식별을 위해 ZigZag에 기반한 자동 거래를 달성합니다.

이점 분석

  • 지그자그 (ZigZag) 는 시장 소음을 효과적으로 필터하고 주요 트렌드 방향을 정확하게 결정할 수 있습니다.
  • 지그자그 턴 타이밍이 정확해서 최적의 진입 기회를 제공합니다.
  • 다른 복잡한 지표나 모델 없이 순수한 트렌드 전략을 실행합니다.
  • 논리는 간단하고 명확하고 이해하기 쉽고 수정하기 쉽습니다.
  • 거래 주파수는 매개 변수 조정을 통해 자유롭게 제어 할 수 있습니다.

위험 분석

  • 지그자그는 중장기 트렌드 반전에 민감하지 않아 더 빠른 반전을 놓칠 수 있습니다.
  • 트렌드를 따르는 전략은 트렌드 역전으로 인한 손실을 감당할 수 없습니다.
  • 단일 거래의 손실 규모를 제한하지 않으며, 큰 단일 손실 위험을 초래합니다.
  • 이 전략은 하나의 지표에만 의존합니다.

위험은 다음과 같이 감소 할 수 있습니다.

  • 다른 지표를 결합하여 트렌드 역전 위험을 감지합니다.
  • 보유 기간을 단축하고, 적시에 손해를 멈추게 합니다.
  • 단일 손실 규모를 제한하기 위해 위험 관리 추가.
  • 기계 학습 모델을 추가하여 안정성을 향상시킵니다.

최적화 방향

이 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.

  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()

더 많은