자유 대역 진동 추적 전략


생성 날짜: 2024-02-04 10:28:24 마지막으로 수정됨: 2024-02-04 10:28:24
복사: 0 클릭수: 614
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

자유 대역 진동 추적 전략

개요

이 전략의 주요 아이디어는 ATR 지표에 기반한 긴 선과 짧은 선의 중지 지점을 계산하고, 가격이 이러한 중단선을 돌파 할 때 거래 신호를 생성하는 것입니다. 그것은 동시에 트렌드 추적과 충격 캡처 기능을 가지고 있습니다.

전략 원칙

이 전략은 ATR 지표의 N 주기 ATR을 계수로 곱하여 길고 길고 양쪽의 스톱 라인을 계산한다. 구체적인 계산 공식은 다음과 같다:

长线止损 = 最高价 - ATR * 系数
短线止损 = 最低价 + ATR * 系数

가격이 상승하면 긴 줄의 스톱 라인을 돌파하고, 가격이 하락하면 짧은 줄의 스톱 라인을 돌파하면 공백을 한다. 공백을 하면 가격의 변동을 실시간으로 추적하여 스톱 라인을 움직인다.

이 방법은 ATR 파동대를 스톱위치로 설정하여 스톱 손실 위험을 보장하는 전제 하에서 가격 동향을 충분히 포착할 수 있다. 가격이 더 큰 돌파구가 발생했을 때 신호를 생성하여 가짜 돌파구를 효과적으로 제거할 수 있다.

우위 분석

이 전략의 가장 큰 장점은 자동으로 스톱로스를 조정하여 가격 추세를 포착하면서 위험을 제어할 수 있다는 것입니다. 구체적인 장점은 다음과 같습니다:

  1. ATR 지표에 기반한 플로잉 스톱은 시장의 변동성에 따라 스톱의 폭을 조정할 수 있으며, 단일 손실을 효과적으로 제어한다.

  2. 파격적인 방식으로 신호를 생성하여, 일부 소음을 제거하고, 윗부분과 밑부분을 피한다.

  3. 가격 변동을 추적하는 실시간 정지 라인을 조정하여 너무 느슨한 정지를 방지하고 더 많은 수익을 고정하십시오.

위험 분석

이 전략에는 몇 가지 위험이 있으며, 주로 스톱 로즈 설정과 신호 생성 방식에 초점을 맞추고 있다. 구체적인 위험점은 다음과 같다:

  1. ATR 주기 및 인수가 잘못되면 막부 손실이 너무 넓거나 너무 좁아질 수 있다.

  2. 트렌드 초기의 기회를 놓칠 수 있습니다.

  3. 트렌드 말기 스톱 손실 추적은 미흡할 수 있으며, 완벽한 종료가 불가능할 수 있다.

대책은 주로 변수를 조정하여 스톱로드를 합리화하거나 다른 지표로 트렌드와 신호를 판단하는 데 도움을줍니다.

최적화 방향

이 전략은 다음의 몇 가지 측면에서 계속 개선될 수 있습니다.

  1. 제2단계 상쇄를 설정하여 위험을 더욱 통제합니다.

  2. 다른 지표와 함께 트렌드를 판단하여 신호 품질을 향상시킵니다.

  3. 이동식 중지 전략을 추가하여 추세가 계속되는 경우 수익을 높여줍니다.

  4. ATR 주기 및 계수 파라미터를 최적화하여 실제 가격 변동에 더 가깝게 중지하십시오.

요약하다

이 전략은 전체적으로 매우 실용적이며, 자동으로 스톱 로드를 조정하여 위험을 효과적으로 제어할 수 있으며, 트렌드 추적을 통해 좋은 수익을 얻을 수 있습니다. 우리는 원래의 기초를 바탕으로 다른 분석 방법과 결합하여 전략을 더 안정적이고 지능적으로 최적화하고 개선 할 수 있습니다.

전략 소스 코드
/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © melihtuna
//@version=4
strategy("Chandelier Exit - Strategy",shorttitle="CE-STG" , overlay=true, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD, commission_value=0.03, commission_type=strategy.commission.percent)

length = input(title="ATR Period", type=input.integer, defval=22)
mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
showLabels = input(title="Show Buy/Sell Labels ?", type=input.bool, defval=false)
useClose = input(title="Use Close Price for Extremums ?", type=input.bool, defval=true)
highlightState = input(title="Highlight State ?", type=input.bool, defval=true)

atr = mult * atr(length)

longStop = (useClose ? highest(close, length) : highest(length)) - atr
longStopPrev = nz(longStop[1], longStop) 
longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop

shortStop = (useClose ? lowest(close, length) : lowest(length)) + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop

var int dir = 1
dir := close > shortStopPrev ? 1 : close < longStopPrev ? -1 : dir

var color longColor = color.green
var color shortColor = color.red

longStopPlot = plot(dir == 1 ? longStop : na, title="Long Stop", style=plot.style_linebr, linewidth=2, color=longColor)
buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal ? longStop : na, title="Long Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=longColor, transp=0)
plotshape(buySignal and showLabels ? longStop : na, title="Buy Label", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=longColor, textcolor=color.white, transp=0)

shortStopPlot = plot(dir == 1 ? na : shortStop, title="Short Stop", style=plot.style_linebr, linewidth=2, color=shortColor)
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal ? shortStop : na, title="Short Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=shortColor, transp=0)
plotshape(sellSignal and showLabels ? shortStop : na, title="Sell Label", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=shortColor, textcolor=color.white, transp=0)

midPricePlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0, display=display.none, editable=false)

longFillColor = highlightState ? (dir == 1 ? longColor : na) : na
shortFillColor = highlightState ? (dir == -1 ? shortColor : na) : na
fill(midPricePlot, longStopPlot, title="Long State Filling", color=longFillColor)
fill(midPricePlot, shortStopPlot, title="Short State Filling", color=shortFillColor)


long_short = input(true, "Long-Short",type=input.bool, group="Strategy Settings")

start     = input(timestamp("2019-01-01"), "Date", type=input.time, group="Strategy Settings")
finish    = input(timestamp("2025-01-01"), "Date", type=input.time, group="Strategy Settings")   
window()  => true

slRatio=input(5, "Manuel Stop Loss Ratio", type=input.float, minval=0, group="Strategy Settings")
tpRatio=input(20, "Take Profit Ratio", type=input.float, minval=0, group="Strategy Settings")
tsStartRatio=input(10, "Trailing Stop Start Ratio", type=input.float, minval=0, group="Strategy Settings")
tsRatio=input(5, "Trailing Stop Ratio", type=input.float, minval=1, group="Strategy Settings")

lastBuyPrice = strategy.position_avg_price

diffHiPriceRatio = (high-lastBuyPrice)/lastBuyPrice*100
diffLoPriceRatio = (close-lastBuyPrice)/lastBuyPrice*100
posHiRatio=0.0
posHiRatio:= strategy.position_size > 0 ? diffHiPriceRatio > posHiRatio[1] ? diffHiPriceRatio : posHiRatio[1] : 0

s_diffHiPriceRatio = (low-lastBuyPrice)/lastBuyPrice*100
s_diffLoPriceRatio = (close-lastBuyPrice)/lastBuyPrice*100
s_posHiRatio=0.0
s_posHiRatio:= strategy.position_size < 0 ? s_diffLoPriceRatio < s_posHiRatio[1] ? s_diffLoPriceRatio : s_posHiRatio[1] : 0

strategy.entry("LONG", strategy.long, when = window() and buySignal)
strategy.close("LONG", when = window() and sellSignal)
strategy.close("LONG", when = diffLoPriceRatio<(slRatio*(-1)), comment="STOP-LONG")
strategy.close("LONG", when = diffHiPriceRatio>tpRatio, comment="TAKE-PROFIT-LONG")
strategy.close("LONG", when = ((posHiRatio[1]>tsStartRatio) and (posHiRatio[1]-diffHiPriceRatio)>tsRatio), comment="TRAILING-STOP-LONG")

if long_short
    strategy.entry("SHORT", strategy.short, when = window() and sellSignal)
    strategy.close("SHORT", when = window() and buySignal)
    strategy.close("SHORT", when = s_diffLoPriceRatio>(slRatio), comment="STOP-SHORT")
    strategy.close("SHORT", when = s_diffHiPriceRatio<(tpRatio*(-1)), comment="TAKE-PROFIT-SHORT")
    strategy.close("SHORT", when = ((s_posHiRatio[1]*(-1)>tsStartRatio) and ((s_posHiRatio[1]-s_diffLoPriceRatio))*(-1)>tsRatio), comment="TRAILING-STOP-SHORT")