모멘텀 기반 브레이크아웃 트레이딩 전략


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

모멘텀 기반 브레이크아웃 트레이딩 전략

개요

이 전략은 동력 지표에 기반한 돌파 거래 전략이다. 그것은 평균선, ATR, RSI 등 여러 지표를 사용하여 시장의 경향과 변동률을 판단하고, 엄격한 중지 중지 설정과 함께 거래를 한다. 전략은 주로 가격이 상승 또는 하향 평균선을 돌파하고 ATR 범위를 더하여 거래 신호를 생성하는지 판단한다.

전략 원칙

이 전략은 다음과 같은 몇 가지 요인에 기반합니다.

  1. 가격 트렌드 방향을 판단하기 위해 EMA 평균선을 사용한다. 평균선을 상단으로 을 표시하고, 하단으로 하향을 표시한다.

  2. ATR 지표는 시장의 변동률을 판단한다. ATR은 한 계수를 중지 범위로 곱한다. 이것은 단편 손실을 효과적으로 제어할 수 있다.

  3. RSI 지표는 과매매를 판단한다. ATR 정지 가격과 평평선 판단의 브레이크 트레이드는 RSI가 과매매를 하지 않는 경우에 반드시 촉발되어야 한다. 이것은 가짜 브레이크를 피할 수 있다.

  4. 초기 최고점이나 낮은 점을 시출장 기준으로 사용한다. 시 가격을 추적하면 더 많은 수익을 얻을 수 있다.

  5. 엄격한 중지 중지 규칙. ATR 중지 손실은 변동률 지표와 결합하여 위험을 제어 할 수 있으며, 중지 설정은 수익을 잠금 할 수 있습니다.

진입 신호는 가격의 평균선 + ATR 중지 범위의 돌파이다. 만약 호박 신호라면 가격이 그 고점을 넘어야 한다. 만약 하락 신호라면 가격이 그 낮은 점을 넘어야 한다.

우위 분석

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 다중 지표 판단은 가짜 돌파를 방지하고 신호 정확도를 향상시킵니다.

  2. ATR 스탠드 레인지 설정은 손실을 합리적인 수준으로 제어합니다.

  3. 동적 추적 차단은 수익을 극대화합니다.

  4. 엄격한 스톱-스트로스 규칙은 위험을 통제하는 데 도움이 됩니다.

  5. 지표와 매개 변수를 최적화 할 수있는 넓은 공간, 다른 시장에 따라 조정할 수 있습니다.

위험 분석

이 전략에는 다음과 같은 위험도 있습니다.

  1. 수익성은 시장의 변동률과 관련이 있다. 시장의 추세가 불확실하거나 주기가 길어지면 수익의 여지가 제한된다.

  2. 스톱 손실 가격의 흔들림 후 다시 돌파가 발생할 수 있습니다. 이 경우 적시에 상장을 세우지 못하는 추세를 추적 할 수 없습니다. 스톱 손실 가격을 적절히 완화 할 수 있습니다.

  3. chasing。

최적화 방향

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

  1. 다양한 품종과 주기에 따라 평균선 변수, ATR 변수 등을 조정한다.

  2. MACD, KDJ 등과 같은 더 많은 지표 판단을 도입할 수 있습니다.

  3. ATR 값에 따라 실시간으로 스톱 로드 인자를 조정할 수 있다. 스톱 로드를 시장의 변동에 더 잘 적응하도록 한다.

  4. 여러 시간주기의 조합을 구축한다. 서로 다른 주기 지표를 결합하면 신호 품질을 향상시킬 수 있다.

  5. 기계 학습 기술을 사용하여 지표와 매개 변수를 테스트하고 최적화하여 전략 매개 변수를 최적화하십시오.

요약하다

이 전략은 전체적으로 지표를 사용하여 판단하고, 엄격하게 손실을 막는 브레이크 트레이딩 전략이다. 그것은 평균선, ATR 및 RSI와 같은 지표의 장점을 효과적으로 활용하여 시장 추세 방향을 효과적으로 판단할 수 있다. 엄격한 손실을 막는 설정과 결합하여 추세 수익을 파악하는 동시에 위험을 제어 할 수 있다. 매개 변수 및 규칙으로 최적화하면 이 전략은 장기적으로 사용할 가치가있는 정량화 트레이딩 전략이 될 수 있다.

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

//@version=4
strategy(title="UT Bot Strategy", overlay = true)
//CREDITS to HPotter for the orginal code. The guy trying to sell this as his own is a scammer lol. 
// Inputs
emaLengh = input(2, title = "emaLengh")
a = input(3.0,     title = "Key Vaule. 'This changes the sensitivity'")
c = input(10,    title = "ATR Period")
h = input(false, title = "Signals from Heikin Ashi Candles")
emaLengh2 = input(9, title = "emaLengh show")




rate = input(0.00025,    title = "波动率min")
rateMax = input(0.00045,    title = "波动率max")
adx_length =   input(20,    title = "adx_length")
adx_min =   input(14,    title = "adx_min")

sma_length =   input(11,    title = "sma_length")
rsi_len = input(9, title = "rsi_len")

src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, close, lookahead = false) : close

// boll 通道----------------------------------------------------
length = input(20, minval=1)
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
bbr = (src - lower)/(upper - lower)
// plot(upper, color = color.rgb(46, 59, 240), title="upper")
// plot(lower, color = color.rgb(46, 59, 240), title="lower")


// plot(bbr, "Bollinger Bands %B", color=#26A69A)
// band1 = hline(1, "Overbought", color=#787B86, linestyle=hline.style_dashed)
// hline(0.5, "Middle Band", color=color.new(#787B86, 50))
// band0 = hline(0, "Oversold", color=#787B86, linestyle=hline.style_dashed)
// fill(band1, band0, color=color.rgb(38, 166, 154, 90), title="Background")
// boll 通道----------------------------------------------------

// 线性回归 --------------------------------------------------------------
zlsma_length = input(title="zlsma-Length", type=input.integer, defval=50)
zlsma_offset = input(title="zlsma-Offset", type=input.integer, defval=0)
lsma = linreg(src, zlsma_length, zlsma_offset)
lsma2 = linreg(lsma, zlsma_length, zlsma_offset)
eq= lsma-lsma2
zlsma = lsma+eq
// plot(zlsma , color = color.rgb(243, 243, 14), title="zlsma",linewidth=3)
// 线性回归 --------------------------------------------------------------



// --------------------------------
rsi = rsi(src, 6)

// xHH = sma(high, sma_length)
// xLL = sma(low, sma_length)
// movevalue = (xHH - xLL) / 2
// xHHM = xHH + movevalue
// xLLM = xLL - movevalue

// plot(xHHM, color = color.rgb(208, 120, 219), title="xHHM")
// plot(xLLM, color = color.rgb(208, 120, 219), title="xLLM")


xATR  = atr(c)
nLoss = a * xATR



xATRTrailingStop = 0.0
xATRTrailingStop := iff(src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), src - nLoss),
   iff(src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), src + nLoss), 
   iff(src > nz(xATRTrailingStop[1], 0), src - nLoss, src + nLoss)))


 
pos = 0   
pos :=	iff(src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0), 1,
   iff(src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0))) 
   
xcolor = pos == -1 ? color.red: pos == 1 ? color.green : color.blue 

ema   = ema(src,emaLengh)
// sma   = sma(src,emaLengh)
emaFast   = ema(src,100)
emaSlow   = ema(src,576)
emaShow   = ema(src, emaLengh2)
// sma       =  sma(src, 8)

// [superTrend, dir] = supertrend(3, 200) 
// 判断连续涨

[diplus, diminus, adx] = dmi(adx_length, adx_length)


above = crossover(ema, xATRTrailingStop)
below = crossover(xATRTrailingStop, ema)
// above = ema == xATRTrailingStop
// below = xATRTrailingStop== ema

// smaabove = crossover(src, sma)
// smabelow = crossover(sma, src)
// smaabove = src > sma
// smabelow = sma > src
close_rate (n)=>
    abs(close[n]-open[n])/min(close[n],open[n])

rate_val = close_rate(0)
rate_val1 = close_rate(1)

buy  = src > xATRTrailingStop and above  and src > zlsma  and adx >adx_min
// and  src>emaShow
// and rate_val < rate_val1*2 and rate_val >=rate_val1
// and rate_val1<rateMax
// and close[1]>open[1] 
sell = src < xATRTrailingStop and below  and src < zlsma and adx >adx_min
// and  src<emaShow
// and rate_val < rate_val1*2  and rate_val >=rate_val1
//  and rate_val1<rateMax
// and open[1]>close[1]  and rate_val1 > rate  

// buy  = src > xATRTrailingStop 
// sell = src < xATRTrailingStop 
// plot(rate_val1 , color = color.red, title="rate_val1")



barbuy  = src > xATRTrailingStop 
barsell = src < xATRTrailingStop

atrRsi = rsi(xATRTrailingStop,rsi_len)

// plot(emaFast , color = color.rgb(243, 206, 127), title="emaFast")
// plot(ema , color = color.rgb(47, 227, 27), title="ut-ema")



// plot(emaShow , color = color.rgb(47, 227, 27), title="ema9")

plot(xATRTrailingStop, color = color.rgb(233, 233, 232), title="xATRTrailingStop")

plotshape(buy,  title = "Buy",  text = 'Buy',  style = shape.labelup,   location = location.belowbar, color= color.green, textcolor = color.white, size = size.tiny)
plotshape(sell, title = "Sell", text = 'Sell', style = shape.labeldown, location = location.abovebar, color= color.red,   textcolor = color.white, size = size.tiny)


// plotshape(buy,  title = "Sell",  text = 'Sell',  style = shape.labelup,   location = location.belowbar, color= color.green, textcolor = color.white, transp = 0, size = size.tiny)
// plotshape(sell, title = "buy", text = 'buy', style = shape.labeldown, location = location.abovebar, color= color.red,   textcolor = color.white, transp = 0, size = size.tiny)

// barcolor(barbuy  ? color.green : na)
// barcolor(barsell ? color.red   : na)

// strategy.entry("short",   false, when = buy)
// strategy.entry("long ", true, when = sell)


strategy.entry("long",   true, when = buy and strategy.position_size == 0)
strategy.entry("short", false, when = sell and strategy.position_size == 0)


//动态止盈start------------------------------------------------------------------------------------------
profit = input( 0.015,     title = "最小收益率")
close_profit_rate = input( 10,     title = "平仓收益回撤比")
loss = input(0.004,    title = "回撤率")

// 收益回撤比例
profit_price_scale =profit/close_profit_rate

var float profit_price = 0


// 计算小收益价格

get_profit_price(long) =>
    float res = 0
    if long == true
        res := strategy.position_avg_price * (1+profit)
    if long == false
        res := strategy.position_avg_price * (1-profit)
    res

// 止盈平仓条件
close_profit_position(long)=>
    bool result=false
    if long == true and profit_price>0 and profit_price*(1-profit_price_scale) >=close and  get_profit_price(true) <= close 
        result:=true
    if long == false and profit_price>0 and profit_price*(1+profit_price_scale) <=close and  get_profit_price(false) >= close 
        result:=true
    result

// 更新动态止盈价格
update_profit_price(price)=>
    float res = price
   // 无仓位时 动态止盈价格为0
    if strategy.position_size == 0 
        res := 0
   // long - 价格大于最小收益时保存
    if strategy.position_size > 0 and get_profit_price(true) <= close and (res==0 or res < close)
        res := close
   // short - 价格小于最小收益时保存
    if strategy.position_size < 0 and get_profit_price(true) >= close and (res==0 or res > close)
        res := close
    res
   
///////



profit_price := update_profit_price(profit_price)
long_close_profit_position = close_profit_position(true)
short_close_profit_position = close_profit_position(false)

// plot(profit_price, color = color.green, title="profit_price")
//动态止盈end------------------------------------------------------------------------------------------




strategy.close("long",comment="long-止盈",when = strategy.position_size > 0 and long_close_profit_position)

strategy.close("long",comment="long-止损",when = strategy.position_size >0 and strategy.position_avg_price * (1-loss) >= close)

strategy.close("short",comment="short-止盈",when = strategy.position_size <0 and short_close_profit_position)

strategy.close("short",comment="short-止损",when = strategy.position_size <0 and strategy.position_avg_price * (1+loss) <= close)