다중 시간 프레임 후속 중지 손실 전략

저자:차오장, 날짜: 2024-01-08 11:24:24
태그:

img

전반적인 설명

이 전략은 내 이전 간단한 트레일링 스톱 로스 전략의 멀티 타임프레임 버전입니다. 이전 전략은 포지션을 입력하기 위해 기본적인 트레일링 스톱 로스를만 사용했습니다. 그것은 꽤 잘 작동했습니다. 그래서 나는 그것을 개선하려고 노력했습니다. 내가 같은 ATR 트레일링 스톱 로스를 다른 타임프레임에 사용하여 하나의 신호로 결합하면 어떻게 될지 생각했습니다.

이 전략에서는 ATR 스톱만 사용하며 현재 시간 프레임 이외에 다른 3 개의 더 높은 시간 프레임을 선택할 수 있습니다. 이 모든 시간 프레임의 후속 스톱 손실은 차트에 그려집니다. 4 개의 시간 프레임 모두 긴 신호에 동의하는 경우 긴 포지션을 입력합니다. 적어도 2 개의 시간 프레임이 긴 신호에 동의하지 않는 경우 긴 포지션을 닫습니다. 짧은 포지션의 논리는 동일합니다.

전략 논리

이 전략의 핵심은 트레일링 스톱 손실과 트렌드 다음에 있다. 트레일링 스톱 손실은 ATR 값에 따라 스톱 손실 수준을 설정하는 데 사용됩니다. 이는 스톱 손실이 타격되는 것을 효과적으로 피할 수 있습니다. 트렌드 다음은 다른 시간 프레임에 걸쳐 트렌드 방향을 관찰하는 것을 기반으로 엔트리를 결정합니다.

특히, 전략은 먼저 다른 시간 프레임에서 ATR 값을 계산하고 스톱 로스 거리를 설정합니다. 그 다음 가격이 스톱 로스 수준을 넘을 때 긴 / 짧은 신호를 생성합니다. 여러 시간 프레임에서 신호가 일치하면 위치가 취해질 것입니다. 그 후 트렌드 방향별로 스톱 로스 수준을 추적합니다. 특정 시간 프레임의 신호가 반전되면 포지션을 닫습니다.

다른 기간에 걸쳐 트렌드 판단을 결합함으로써 가짜 브레이크오웃을 효과적으로 필터링 할 수 있습니다. 동시에, 수익에 대한 추적 스톱 잠금 및 위험을 제어합니다.

장점

  1. 여러 시간 프레임을 사용 하 여 소음을 필터링 하 고 트렌드 방향 을 식별 합니다
  2. ATR 후속 정류는 정류 거리를 동적으로 조정하여 정지될 확률을 낮춰줍니다
  3. 트렌드를 따라와 중지 손실 관리를 결합, 당신은 트렌드를 따라 시간에 중지 할 수 있습니다
  4. 몇 가지 매개 변수, 이해하기 쉽고 최적화

위험 분석

  1. ATR 정류 너무 가까이 또는 너무 멀리 설정되지 않은 경우 매개 변수, 타격 당하거나 중지 거리가 너무 큰 경향이 있습니다
  2. 여러 시간 프레임 조합이 제대로 설정되지 않으면 효과적으로 작동하지 않거나 잘못 판단 할 수 있습니다
  3. 정지 손실 및 시간 프레임 매개 변수를 올바르게 구성해야 합니다, 그렇지 않으면 최상의 결과를 얻을 수 없습니다

해결책:

  1. 다양한 매개 변수 집합과 제품을 테스트하여 최적의
  2. 신뢰성있는 트렌드 판단을 보장하기 위해 비율과 시간 프레임의 수를 최적화하십시오.
  3. ATR 멀티플리커를 타격되지 않는 것과 적절한 거리의 균형을 맞추기 위해 조정합니다.

최적화 방향

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

  1. 트렌드 판단을 위한 최선의 조합을 찾기 위해 시간 프레임의 수를 추가/감소합니다.
  2. 최적의 정지 거리를 결정하기 위해 다른 ATR 곱셈을 테스트합니다.
  3. 트렌드가 지속됨에 따라 더 많은 포지션을 구축하기 위해 재입구 메커니즘을 추가합니다.
  4. 입력 신호에 다른 필터를 삽입하십시오. 예를 들어 볼륨 표시기 등
  5. 각기 다른 제품에 대한 매개 변수 조정

결론

이 전략은 트렌드 추적 및 리스크 통제를 멀티 타임프레임 ATR 트레일링 스톱을 통해 결합합니다. 단일 스톱에 비해 트렌드 방향을 더 명확하게 식별합니다. 단일 타임프레임에 비해 많은 잡음을 필터링합니다. 정지 매개 변수 및 타임프레임에 대한 적절한 구성은 최상의 결과를 달성하는 열쇠입니다. 특정 드라우다운을 견딜 수 있고 안정적인 수익을 제공하는 투자자에게 적합합니다. 또한 향상과 확장 가능성이 있습니다. 매우 유망한 전략 아이디어입니다.


/*backtest
start: 2023-01-01 00:00:00
end: 2024-01-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="MTF Trailing SL Strategy [QuantNomad]", shorttitle = "MTF TrailingSL [QN]", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

////////////
// Inputs //

atr_length = input(14,    title = "ATR Length")
atr_mult   = input(2,     title = "ATR Mult",    type = input.float)

tf2 = input('120', title = "TF2", type = input.string)
tf3 = input('180', title = "TF3", type = input.string)
tf4 = input('240', title = "TF4", type = input.string)

// BACKTESTING RANGE
// From Date Inputs
fromDay   = input(defval = 1,    title = "From Day",   minval = 1, maxval = 31)
fromMonth = input(defval = 1,    title = "From Month", minval = 1, maxval = 12)
fromYear  = input(defval = 2016, title = "From Year",  minval = 1970)
 
// To Date Inputs
toDay   = input(defval = 1,    title = "To Day",   minval = 1, maxval = 31)
toMonth = input(defval = 1,    title = "To Month", minval = 1, maxval = 12)
toYear  = input(defval = 2100, title = "To Year",  minval = 1970)
 
// Calculate start/end date and time condition
startDate  = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear,   toMonth,   toDay,   00, 00)

time_cond = time >= startDate and time <= finishDate

//////////////////
// CALCULATIONS //


tsl() => 
    // SL values
    sl_val = atr_mult * atr(atr_length)
     
    // Init Variables
    pos         = 0
    trailing_sl = 0.0
    
    // Signals
    long_signal  = nz(pos[1]) !=  1 and high > nz(trailing_sl[1])
    short_signal = nz(pos[1]) != -1 and low  < nz(trailing_sl[1]) 
    
    // Calculate SL
    trailing_sl := short_signal     ? high + sl_val : 
                   long_signal      ? low  - sl_val : 
                   nz(pos[1]) ==  1 ? max(low  - sl_val, nz(trailing_sl[1])) :  
                   nz(pos[1]) == -1 ? min(high + sl_val, nz(trailing_sl[1])) : 
                   nz(trailing_sl[1])
                   
    // Position var               
    pos := long_signal  ? 1 : short_signal ? -1 : nz(pos[1]) 
    trailing_sl
    
    
trailing_sl1 = tsl()
trailing_sl2 = security(syminfo.tickerid, tf2, tsl())
trailing_sl3 = security(syminfo.tickerid, tf3, tsl())
trailing_sl4 = security(syminfo.tickerid, tf4, tsl())

pos1 = 0
pos1 := low <= trailing_sl1 ? -1 : high >= trailing_sl1 ? 1 : nz(pos1[1])

pos2 = 0
pos2 := low <= trailing_sl2 ? -1 : high >= trailing_sl2 ? 1 : nz(pos2[1])

pos3 = 0
pos3 := low <= trailing_sl3 ? -1 : high >= trailing_sl3 ? 1 : nz(pos3[1])

pos4 = 0
pos4 := low <= trailing_sl4 ? -1 : high >= trailing_sl4 ? 1 : nz(pos4[1])

total_pos = pos1 + pos2 + pos3 + pos4

//////////////
// PLOTINGS //

plot(trailing_sl1, linewidth = 2 , color = pos1 == 1 ? color.green : color.red, title = "TSL TF1")
plot(trailing_sl2, linewidth = 2 , color = pos2 == 1 ? color.green : color.red, title = "TSL TF2", transp = 25)
plot(trailing_sl3, linewidth = 2 , color = pos3 == 1 ? color.green : color.red, title = "TSL TF3", transp = 50)
plot(trailing_sl4, linewidth = 2 , color = pos4 == 1 ? color.green : color.red, title = "TSL TF4", transp = 75)

//////////////
// STRATEGY //

//strategy.entry("long",  true,  stop = trailing_sl1)
//strategy.entry("short", false, stop = trailing_sl1)

strategy.entry("long",    true, when = total_pos ==  4)
strategy.entry("short",  false, when = total_pos == -4)

strategy.close("long",  when = total_pos <= 0)
strategy.close("short", when = total_pos >= 0)


더 많은