트리플 슈퍼 트렌드 EMA ADX 필터 전략


생성 날짜: 2023-09-18 14:02:12 마지막으로 수정됨: 2023-09-18 14:02:12
복사: 1 클릭수: 1696
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이것은 트리플 오버트렌드, EMA 및 ADX 지표의 결합된 정량 거래 전략이다. 그것은 트리플 오버트렌드 시스템을 사용하여 거래 신호를 발송하고, 거래 주파수를 제어하고 거래 신호의 품질을 향상시키기 위해 필터 조건으로 EMA와 ADX를 결합한다.

전략 원칙

  • 3개의 다른 파라미터의 슈퍼 트렌드 시스템을 사용하여, 3개의 슈퍼 트렌드가 동방향일 때 거래 신호를 생성한다.
  • EMA를 트렌드 필터로 사용하며, 오직 종결 가격이 EMA보다 높을 때만 더 많이 하고, 종결 가격이 EMA보다 낮을 때 공백을 한다.
  • ADX를 트렌드 강도 약한 필터로 사용하며, ADX가 설정된 임계값보다 높을 때만 거래한다.
  • 재입사 선택이 가능하며, 수익성 및 손실 위험을 통제할 수 있습니다.

구체적으로 말해서, 긴 입문 조건은 삼중 초상향으로 모두 부진으로 전환되며, 폐쇄 가격은 EMA, ADX보다 높은 설정 값에 더 많은 포지션을 개설합니다. 짧은 입문 조건은 삼중 초상향으로 모두 부진으로 전환되며, 폐쇄 가격은 EMA, ADX보다 낮은 설정 값에 공백 포지션을 개설합니다. 평소 포지션 조건은 어떤 초상향으로 전환할 때 현재의 포지션을 평정합니다.

이 전략은 동시에 세 개의 초 트렌드의 지지 저항선을 그리며 트렌드 방향을 결정하는데 도움을 준다.

우위 분석

  • 트리플 슈퍼 트렌드 시스템은 가짜 돌파구를 필터링하여 진입 정확도를 향상시킵니다.
  • EMA와 ADX 이중 필터링은 whipsaw의 손실을 줄이고 손실을 막는 능력을 향상시킵니다.
  • 재입장 여부를 선택할 수 있고, 개인 위험 선호에 따라 전략을 조정할 수 있는 수익성.
  • 시각적인 초트렌드와 결합하여 저항선을 지원하여 트렌드 방향을 판단하는 데 도움이 됩니다.

위험 분석

  • 초트렌드 등 지표에 지연 문제가 있고, 늦은 입단, 조기 출전이 발생할 수 있다.
  • 너무 엄격한 필터링 조건을 선택하면 기회를 놓치게 됩니다.
  • 싸게 정리된 시장에서는 싸게 형성되어 손실을 초래할 수 있습니다.
  • 재입장이 허용되면 거래 빈도와 슬라이드 포인트 비용이 증가합니다.

이러한 위험은 변수 조합을 조정하고, 필터 조건을 최적화하는 방법으로 감소시킬 수 있다. 동시에, 포지션 규모를 잘 통제하고, 불확실한 시장 상황에 대응하기 위해 엄격하게 중지한다.

최적화 방향

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

  • 다양한 변수 조합을 테스트하여 최적의 초트렌드 및 EMA 변수를 찾아보세요.
  • ADX의 임계값을 최적화하여 가짜 신호를 감소시킨다.
  • 변동률, 거래량 등과 같은 다른 지표 필터를 추가하십시오.
  • 다양한 품종에 대해 각각 최적화 파라미터를 사용하여 적응력을 높인다.
  • 역동적인 손해 방지 장치를 구축하고, 적극적으로 위험을 통제하십시오.
  • 더 나은 출전과 출전 규칙을 찾기 위해 기계 학습과 같은 방법을 시도하십시오.

요약하다

이 전략은 트리플 초트렌드 시스템의 장점을 최대한 활용하고, EMA와 ADX의 이중 필터링을 보조하여 거래 신호의 질을 효과적으로 향상시키고, 위험을 제어할 수 있습니다. 변수 최적화, 필터링 조건의 증가, 동적 중단과 같은 방법을 통해 전략의 강도와 적응력을 더욱 향상시킬 수 있습니다.

전략 소스 코드
/*backtest
start: 2023-08-18 00:00:00
end: 2023-09-17 00:00:00
period: 2h
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/
// ©kunjandetroja


//@version=5
strategy('Triple Supertrend with EMA and ADX', overlay=true)

m1 = input.float(1,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 1')
m2 = input.float(2,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 2')
m3 = input.float(3,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 3')
p1 = input.int(10,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 1')
p2 = input.int(15,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 2')
p3 = input.int(20,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 3')
len_EMA = input.int(200,"EMA Len",minval = 5,maxval= 250,step=1)
len_ADX = input.int(14,"ADX Len",minval = 1,maxval= 25,step=1)
len_Di = input.int(14,"Di Len",minval = 1,maxval= 25,step=1)
adx_above = input.float(25,"adx filter",minval = 1,maxval= 50,step=0.5)
var bool long_position = false
adx_filter = input.bool(false, "Add Adx & EMA filter")
renetry = input.bool(true, "Allow Reentry")

f_getColor_Resistance(_dir, _color) =>
    _dir == 1 and _dir == _dir[1] ? _color : na
f_getColor_Support(_dir, _color) =>
    _dir == -1 and _dir == _dir[1] ? _color : na

[superTrend1, dir1] = ta.supertrend(m1, p1)
[superTrend2, dir2] = ta.supertrend(m2, p2)
[superTrend3, dir3] = ta.supertrend(m3, p3)
EMA = ta.ema(close, len_EMA)
[diplus,diminus,adx] = ta.dmi(len_Di,len_ADX)

// ADX Filter
adxup = adx > adx_above and close > EMA
adxdown = adx > adx_above and close < EMA

sum_dir = dir1 + dir2 + dir3

dir_long = if(adx_filter == false)
    sum_dir == -3
else
    sum_dir == -3 and adxup
dir_short = if(adx_filter == false)
    sum_dir == 3
else
    sum_dir == 3 and adxdown
Exit_long = dir1 == 1 and dir1 != dir1[1]
Exit_short = dir1 == -1 and dir1 != dir1[1]

// BuySignal = dir_long and dir_long != dir_long[1]
// SellSignal = dir_short and dir_short != dir_short[1]
// if BuySignal
//     label.new(bar_index, low, 'Long', style=label.style_label_up)
// if SellSignal
//     label.new(bar_index, high, 'Short', style=label.style_label_down)

longenter = if(renetry == false)
    dir_long and long_position == false
else
    dir_long
shortenter = if(renetry == false)
    dir_short and long_position == true
else
    dir_short
if longenter
    long_position := true
if shortenter
    long_position := false

strategy.entry('BUY', strategy.long, when=longenter)
strategy.entry('SELL', strategy.short, when=shortenter)   
strategy.close('BUY', Exit_long)
strategy.close('SELL', Exit_short)

buy1 = ta.barssince(dir_long)
sell1 = ta.barssince(dir_short)

colR1 = f_getColor_Resistance(dir1, color.red)
colS1 = f_getColor_Support(dir1, color.green)

colR2 = f_getColor_Resistance(dir2, color.orange)
colS2 = f_getColor_Support(dir2, color.yellow)

colR3 = f_getColor_Resistance(dir3, color.blue)
colS3 = f_getColor_Support(dir3, color.maroon)

plot(superTrend1, 'R1', colR1, linewidth=2)
plot(superTrend1, 'S1', colS1, linewidth=2)

plot(superTrend2, 'R1', colR2, linewidth=2)
plot(superTrend2, 'S1', colS2, linewidth=2)

plot(superTrend3, 'R1', colR3, linewidth=2)
plot(superTrend3, 'S1', colS3, linewidth=2)

// // Intraday only
// var int new_day = na
// var int new_month = na
// var int new_year = na
// var int close_trades_after_time_of_day = na

// if dayofmonth != dayofmonth[1]
//     new_day := dayofmonth
// if month != month[1]
//     new_month := month
// if year != year[1]
//     new_year := year
// close_trades_after_time_of_day := timestamp(new_year,new_month,new_day,15,15)

// strategy.close_all(time > close_trades_after_time_of_day)