이 전략은 지그자그 지표를 사용하여 지원 및 저항 라인을 그리며 가격이 지원 또는 저항 라인을 통과 할 때 긴 또는 짧은 포지션을 취합니다.
이 전략은 먼저 지그자그 지표를 사용하여 특정 매개 변수 하에서 지그자그 라인을 그립니다. 지그자그 지표가 바닥을 찍을 때 녹색 지지 라인이 그려집니다. 지그자그가 정상에 도달 할 때 빨간 저항 라인이 그려집니다. 가격이 녹색 라인을 넘어서면 긴 포지션이 취됩니다. 가격이 빨간 라인을 넘어서면 짧은 포지션이 취됩니다.
구체적으로, 핵심 논리는 다음과 같습니다.
EMA를 사용하여 3배 지수적인 이동 평균으로 닫기 가격을 평평화하여 평평화된 곡선 _hls를 얻습니다.
평형 곡선이 상승하고 있는지 판단합니다. 상승하고 이전 바가 상승하지 않았다면 바닥으로 간주됩니다. 이 바의 가장 낮은 가격을 취하십시오. 떨어지고 이전 바가 상승하고 있다면 정상으로 간주됩니다. 이 바의 가장 높은 가격을 취하십시오. 그렇지 않으면 NaN
이 과정을 반복해서 지그자그 직선을 얻습니다.
지그자그로 올라갈 때, 현재 최고점을 기록합니다. 떨어질 때, 현재 바닥점을 기록합니다.
지점이 상승할 때 녹색 지지선을 위로 그리고 지점이 떨어질 때 빨간 저항선을 아래로 그려보세요.
가격이 초록선을 넘을 때 긴 포지션을 취합니다. 가격이 빨간 선을 넘을 때 짧은 포지션을 취합니다.
이 전략의 장점은 다음과 같습니다.
지그자그 지표를 사용하여 주요 지원/저항 수준을 식별합니다. 이러한 수준은 종종 중요합니다.
지그자그는 시장 소음을 필터링하여 더 명확한 거래 신호를 생성합니다.
브레이크아웃을 통해 포지션을 입력하면 트렌드 반전을 적시에 파악할 수 있습니다.
지지/저항선을 그리는 간단하고 효과적인 방법
명확한 논리와 큰 매개 변수 최적화 공간
제품 선택과 시간 제한에 대한 유연성
이 전략의 위험:
부적절한 지그자그 매개 변수는 거래 기회를 놓칠 수 있습니다.
가격은 브레이크 이후 지지/저항을 다시 테스트할 수 있습니다. 위험을 제어하기 위해 스톱 로스를 사용하세요.
유출 신호는 오해가 될 수 있습니다. 추세와 패턴으로 검증되어야 합니다.
장기간 옆으로 이동하면 과도한 비효율적인 거래가 발생할 수 있습니다.
거래 비용 을 고려 하고 지나치게 자주 거래 하는 것 을 피 하십시오.
해결책:
가장 좋은 조합을 찾기 위해 지그자그 매개 변수를 최적화하세요.
손실을 제한하기 위해 브레이크 이후의 적절한 스톱 손실을 설정합니다.
정확성을 높이기 위해 트렌드 지표 같은 필터를 추가합니다.
이 기간 동안 옆을 확인하고 거래를 피하십시오.
비효율적인 거래를 줄이기 위해 폭을 느리게
이 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.
지그자그 매개 변수를 최적화해서
브레이크오웃 후 지원/저항을 다시 테스트할 가능성을 고려합니다. 재테스트 시나리오에 출구 로직을 추가합니다.
MA와 같은 필터를 추가해서 낮은 확률의 신호를 차단합니다.
부진 신호를 확인하기 위해 부피 표시기를 포함합니다.
잘못된 신호와 수익을 필터링하기 위해 라헨브루크의 이중 방법론 (장기 및 단기) 을 구현합니다.
매개 변수를 동적으로 최적화하기 위해 기계 학습을 사용하세요.
위험을 제한하기 위해 스톱 로스 전략을 도입하십시오.
요약하자면, 이것은 간단하고 실용적인 오스실레이션 브레이크아웃 전략이다. 지그자그와 트레이드 브레이크아웃을 사용하여 지원 / 저항을 끌어냅니다. 전략은 적응적이지만 약간의 위험이 있습니다. 매개 변수, 신호 필터 및 위험 통제에 대한 최적화는 개선 할 수 있습니다. 이러한 브레이크아웃 전략은 시장 리듬을 파악 할 수있는 활성 트레이더에 적합합니다.
/*backtest start: 2022-10-13 00:00:00 end: 2023-10-19 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=3 // strategy(title = "Noro's ZZ-2 Strategy", shorttitle = "Noro's ZZ-2 Strategy", 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(true, defval = true, title = "Short") capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %") length = input(4, title = "ZigZag length") Extreme = input(4, title = "ZigZag extreme") src = input(close, title = "Source") showzz = input(false, defval = false, title = "Show ZigZag") 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 f_zz(_length, _detection)=> _hls = ema(ema(ema(src, _length), round(_length*0.66)), round(_length*0.33)) _isRising = _hls >= _hls[1] _zigzag = _isRising and not _isRising[1] ? lowest(_detection) : not _isRising and _isRising[1] ? highest(_detection) : na zigzag = f_zz(length, Extreme) zzcol = showzz ? black : na plot(zigzag, color = zzcol, linewidth = 2) //Levels dot = 0.0 dot := zigzag > 0 ? zigzag : dot[1] uplevel = 0.0 uplevel := dot > dot[1] ? zigzag : uplevel[1] dnlevel = 0.0 dnlevel := dot < dot[1] ? zigzag : dnlevel[1] upcol = na upcol := dot > dot[1] ? na : lime plot(uplevel, color = upcol, linewidth = 2) dncol = na dncol := dot < dot[1] ? na : red plot(dnlevel, color = dncol, linewidth = 2) //Trading lot = 0.0 lot := strategy.position_size != strategy.position_size[1] ? strategy.equity / close * capital / 100 : lot[1] if dot > 0 strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, stop = uplevel) strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, stop = dnlevel)