부피 돌파와 트래일링 스톱 손실과 함께 지원 및 저항 전략

저자:차오장, 날짜: 2024-01-11 17:58:26
태그:

img

전반적인 설명

이 전략의 주요 아이디어는 입시 신호를 결정하기 위해 지원/저항 수준과 부피 브레이크를 결합하고 ATR 지표를 사용하여 수익을 취하기 위해 동적으로 스톱 로스를 조정하여 더 많은 잠재적 인 이익을 얻습니다.

전략 논리

이 전략은 다음과 같은 주요 논리들로 구성됩니다.

  1. ta.pivothigh와 ta.pivotlow를 사용하여 이전 L_Bars 촛불의 가장 높은 가격과 이전 R_Bars 촛불의 가장 낮은 가격을 저항 및 지원 수준으로 계산합니다.

  2. 클로즈 가격이 레지스탕스 레벨을 넘고 볼륨이 볼륨레인지 문턱을 넘을 때, 롱가. 클로즈 가격이 서포트 레벨을 넘고 볼륨이 볼륨레인지 문턱을 넘을 때, 쇼트가 됩니다.

  3. 긴 엔트리 후, close-ATR_LO로 스톱 손실을 설정합니다. 짧은 엔트리 후, close+ATR_SH로 스톱 손실을 설정합니다. 이것은 동적 인 트레일링 스톱 손실 조정을 실현합니다.

  4. 매일 거래 시간 (0915-1445) 내에 첫 번째 신호만 받아요. 위험 입력으로 정의된 일일 리스크 한계에 도달한 후 새로운 오더는 없습니다.

이점 분석

  1. 입력 정확성을 향상시키기 위해 부피 표시기와 결합한 지원/저항 이론을 사용하십시오.

  2. ATR에 기반한 후속 스톱 손실은 시장 변동성에 따라 스톱 레벨을 유연하게 조정하여 수익 재발견 가능성을 줄일 수 있습니다.

  3. 일일 거래 시간 및 거래 리스크에 대한 적절한 통제는 트렌드를 파악하고 과도한 스톱 로스를 피하는 데 도움이됩니다.

위험 분석

  1. 지원/저항 레벨이 실패하고 효과적인 입문 신호를 제공하지 못할 수 있습니다.

  2. ATR 곱셈을 너무 높게 설정하면 손실 위험을 증가시키는 너무 먼 Stop Loss로 이어질 수 있습니다.

  3. 부피가 너무 낮아지면 기회를 놓칠 수도 있고 너무 높으면 잘못된 신호를 일으킬 수도 있습니다.

해결책:

  • 다른 제품 특성에 따라 지원/항압 매개 변수를 조정합니다.

  • ATR 곱셈과 부피 한계 매개 변수를 최적화합니다.

  • 입력 신호를 확인하기 위해 다른 표시기를 추가합니다.

최적화 방향

  1. 진입 신호를 결정하는 데 도움이 되는 이동 평균과 같은 다른 지표를 추가합니다.

  2. ATR 곱셈과 부피 한계와 같은 매개 변수를 최적화합니다.

  3. 기계 학습 알고리즘을 사용하여 동적 매개 변수 최적화를 실현합니다.

  4. 다른 제품으로 전략을 확장해서 매개 변수 패턴을 찾습니다.

요약

이 전략은 다양한 분석 도구를 통합하여 지원 / 저항, 볼륨 및 스톱 로스 방법을 적용하여 좋은 백테스트 결과를 달성했습니다. 그러나 라이브 거래에서 더 많은 불확실성이 존재할 수 있으며 실제 세계 성능을 향상시키기 위해 매개 변수 최적화 및 추가 입력 확인 지표와 같은 추가 개선이 필요합니다. 전반적으로 전략은 명확한 논리와 이해하기 쉬운 것으로 양적 거래 전략에 좋은 참조 사례를 제공합니다.


/*backtest
start: 2024-01-03 00:00:00
end: 2024-01-10 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//   ____________                _________                      _____________
//  |____________|             ||________|                      ||__________|
//       ||            ____    ||        ||                     ||                    ______ ________    _____ ________
//       ||    |   || ||       ||________|| |   || ||    ||     ||     |   ||   /\\   |   // |______| || ||    |______|
//       ||    |===|| |===     ||__________ |   || ||    ||     ||     |===||  /__\\  |===      ||    ||   \\     ||
//       ||    |   || ||___    ||        || |___|| ||___ ||___  ||     |   || /    \\ |   \\    ||    || ___||    ||
//       ||                    ||________||                     ||__________
//       ||                    ||________|                      ||__________|
  
//@version=5
strategy("SUPPORT RESISTANCE STRATEGY [5MIN TF]",overlay=true )
L_Bars = input.int(defval = 10, minval = 1 , maxval = 50, step =1)
R_Bars = input.int(defval = 15, minval = 1 , maxval = 50, step =1)
volumeRange = input.int(20, title='Volume Break [threshold]', minval = 1)

// ═══════════════════════════ //
// ——————————> INPUT <——————— //
// ═══════════════════════════ //

EMA1 = input.int(title='PRICE CROSS EMA', defval = 150, minval = 10 ,maxval = 400)
factor1 = input.float(title='_ATR LONG',defval = 3.2 , minval = 1 , maxval = 5 , step = 0.1, tooltip = "ATR TRAIL LONG")
factor2 = input.float(title='_ATR SHORT',defval = 3.2 , minval = 1 , maxval = 5 , step = 0.1, tooltip = "ATR TRAIL SHORT")
risk = input.float(title='RISK',defval = 200 , minval = 1 , maxval = 5000 , step = 50, tooltip = "RISK PER TRADE")


var initialCapital = strategy.equity
t = time(timeframe.period, '0915-1445:1234567')
time_cond = not na(t)

// ══════════════════════════════════ //
// ———————————> EMA DATA <——————————— //
// ══════════════════════════════════ //
ema1 = ta.ema(close, EMA1)

plot(ema1, color=color.new(color.yellow, 0), style=plot.style_linebr, title='ema1')

// ══════════════════════════════════ //
// ————————> TRAIL DATA <———————————— //
// ══════════════════════════════════ //
// *******Calculate LONG TRAIL data*****
ATR_LO = ta.atr(14)*factor1

// *******Calculate SHORT TRAIL data*****
ATR_SH = ta.atr(14)*factor2

long_trail = close - ATR_LO
short_trail = close + ATR_SH

// Plot atr data
//plot(longStop, color=color.new(color.green, 0), style=plot.style_linebr, title='Long Trailing Stop')
//plot(shortStop , color=color.new(color.red, 0), style=plot.style_linebr, title='Short Trailing Stop')

// ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ //
// ————————————————————————————————————————————————————————> RESISTANCE/SUPPORT LEVELS DATA <————————————————————————————————————————————————————————————————————————————————————————————— //
// ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ //

Resistance_pi = fixnan(ta.pivothigh(L_Bars, R_Bars)[1])
Support_pi = fixnan(ta.pivotlow(L_Bars, R_Bars)[1])
r1 = plot(Resistance_pi, color=ta.change(Resistance_pi) ? na : color.red,  offset=-(R_Bars + 1),linewidth=2, title='RESISTANCE')
s1 = plot(Support_pi, color=ta.change(Support_pi) ? na : color.green, offset=-(R_Bars + 1),linewidth=2, title='SUPPORT')

//Volume 
vol_1 = ta.ema(volume, 5)
vol_2 = ta.ema(volume, 10)
osc_vol = 100 * (vol_1 - vol_2) / vol_2

// ══════════════════════════════════//
// ————————> LONG POSITIONS <————————//
// ══════════════════════════════════//
//******barinstate.isconfirmed used to avoid repaint in real time*******

if ( ta.crossover(close, Resistance_pi) and osc_vol > volumeRange and not(open - low > close - open) and strategy.opentrades==0 and barstate.isconfirmed and time_cond and close >= ema1 )
    strategy.entry(id= "Long" ,direction = strategy.long, comment = "BUY")
    
plot(long_trail , color=color.new(color.blue, 0), style=plot.style_linebr, title='long Stop')

if strategy.position_size > 0 
    strategy.exit("long tsl", "Long" , stop = long_trail ,comment='SELL')
 
// ═════════════════════════════════════//
// ————————> SHORT POSITIONS <————————— //
// ═════════════════════════════════════//
if ( ta.crossunder(close, Support_pi) and osc_vol > volumeRange and not(open - close < high - open)  and strategy.opentrades==0 and barstate.isconfirmed and time_cond and close <= ema1 )
    strategy.entry(id = "Short" ,direction = strategy.short,  comment = "SELL") 

if strategy.position_size < 0
    strategy.exit("short tsl", "Short" ,  stop = short_trail ,comment='BUY')

// ════════════════════════════════════════════════//
// ————————> CLOSE ALL POSITIONS BY 3PM <————————— //
// ════════════════════════════════════════════════//
strategy.close_all(when = hour == 14 and minute == 55)

// ════════════════════════════════════════//
// ————————> MAX INTRADAY LOSS  <————————— //
// ════════════════════════════════════════//
// strategy.risk.max_intraday_loss(type = strategy.cash, value = risk)



더 많은