지지 저항과 평균 거래량 돌파를 기반으로 한 트레일링 스톱 로스 전략


생성 날짜: 2024-01-11 17:58:26 마지막으로 수정됨: 2024-01-11 17:58:26
복사: 0 클릭수: 548
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

지지 저항과 평균 거래량 돌파를 기반으로 한 트레일링 스톱 로스 전략

개요

이 전략의 주요 아이디어는 지지부진의 저항과 거래량을 결합한 돌파구를 통해 진입 시기를 결정하고, ATR 지표를 사용하여 수익을 달성한 후 스톱 로스 추적 가격을 동적으로 조정하여 더 많은 잠재적인 수익을 얻습니다.

전략 원칙

이 전략은 다음과 같은 몇 가지 논리로 구성됩니다.

  1. ta.pivothigh 및 ta.pivotlow 함수를 사용하여 L_Bars 루트 K 선의 최대값과 R_Bars 루트 K 선의 최소값을 저항선과 지지선으로 계산한다.

  2. 종결 가격에서 저항선을 통과하고 거래량이 VolumeRange의 절벽을 돌파했을 때, 더 많이하십시오. 종결 가격 아래에서 지원선을 통과하고 거래량이 VolumeRange의 절벽을 돌파했을 때, 공백하십시오.

  3. 더한 후, close-ATR_LO를 긴 스톱으로;空한 후, close+ATR_SH를 짧은 스톱으로, 동적 조정 추적 스톱을 구현한다.

  4. 거래 시간 ((0915-1445), 매일 첫 거래 신호를 하고, 이익 또는 손실이 위험 한 금액에 도달 한 후 새로운 주문을 하지 않는다.

전략적 이점

  1. 지원 저항 이론을 사용하여, 교통량 지표를 결합하여, 진출 시간을 더 정확하게 합니다.

  2. ATR 지표를 사용하여 스톱로스를 추적하여 시장의 변동 정도에 따라 스톱로스 위치를 유연하게 조정할 수 있으며, 수익을 얻은 후 수익 회귀를 줄일 수 있습니다.

  3. 일일 거래 횟수와 거래 위험을 적절히 조절하면 트렌드를 파악하고 과도한 손실을 피하는 데 도움이 됩니다.

전략적 위험

  1. 지원 저항이 실패하여 효과적인 입구 신호를 제공하지 못할 수 있다.

  2. ATR 지표가 너무 커 설정되어 너무 멀리 떨어져서 손실 위험이 증가할 수 있습니다.

  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)