적응형 슈퍼트렌드 채널 거래 전략

저자:차오장, 날짜: 2023-09-20 15:17:51
태그:

전반적인 설명

이 전략은 이중 계층 슈퍼 트렌드 채널을 구축하고 가격이 채널을 통과 할 때 거래 신호를 생성합니다. 또한 적응 효과를 위해 가격 변동성을 사용하여 채널 폭을 조정합니다. 트렌드 다음 전략에 속합니다.

전략 논리

  1. 가격 표준편차와 변동성 ATR을 계산하고, 변동성을 사용하여 채널 너비를 조정합니다.

  2. 내부층이 더 민감하고 외부층이 더 안정적인 이중층 슈퍼트렌드 채널을 구축합니다.

  3. 가격이 내부 또는 외부 채널을 넘을 때 구매/판매 신호를 생성합니다.

  4. 이중 채널 구조는 일부 가짜 유출을 필터링하는 데 도움이 됩니다.

  5. ATR 변동성은 채널 폭을 조정하고 변동성이 증가할 때 더 넓어집니다.

장점

  1. 슈퍼트렌드 채널은 트렌드를 추적하는 데 간단하고 효과적입니다.

  2. 이중 채널은 거짓 신호를 필터링하고 신호 품질을 향상시킵니다.

  3. 변동성 적응은 채널이 다른 시장 환경에 맞게 만듭니다.

  4. 간단한 매개 변수 조정으로 구현하기 쉽습니다.

  5. 시각화 된 채널과 브레이크아웃은 직관적인 거래 신호를 형성합니다.

위험성

  1. 브레이크오웃 신호는 잘못된 신호를 만들어 불필요한 손실을 초래할 수 있습니다.

  2. 트렌드 방향이나 트렌드 반대 거래의 위험을 결정하지 못합니다.

  3. 적응 조절은 너무 민감할 수도 있고, 과도한 조정도 있을 수 있습니다.

  4. 부적절한 매개 변수 최적화로 인해 오버 피팅이 발생합니다.

  5. 트렌드를 따라가는 전략으로서, 범위에 묶인 시장에서 어려움을 겪습니다.

강화

  1. 테스트 매개 변수 적응 효과에 미치는 영향

  2. 주요 추세를 결정하기 위해 MA를 포함합니다.

  3. 가짜 탈출을 피하기 위해 탈출 확인을 최적화하십시오.

  4. 트레이드당 손해 제한에 스톱 로스를 추가합니다.

  5. 거래 주파수에서 채널 조정을 평가합니다.

  6. 매개 변수를 동적으로 최적화하기 위해 기계 학습을 사용하세요.

결론

이 전략은 가격 트렌드를 캡처하기 위해 적응성 있는 이중 슈퍼트렌드 채널을 사용합니다. 트렌드를 추적하는 데는 간단하고 직관적입니다. 그러나 위험에는 잘못된 브레이크오웃과 잘못된 트렌드 방향이 포함됩니다. 추가 매개 변수 조정 및 보충 메커니즘은 전략 성능을 향상시킬 수 있으며 강력한 트렌드 추적 시스템으로 만듭니다.


/*backtest
start: 2023-08-20 00:00:00
end: 2023-09-19 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("SuperTrend Cloud Strategy", shorttitle="SuperTrend Cloud Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital = 1000)

//Inputs
multi = input(title="Multiplier", type=input.float, step=0.1, defval=3, minval=1)
period = input(title="Period", type=input.integer, step=1, defval=10, minval=1)
SelfAdjust = input(title="Self-Adjusting", type=input.bool, defval = false)


////////////////////////////////////////////////////////////////////////////////
// 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 = 2019, 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 = 2020, 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 = true
 
////////////////////////////////////////////////////////////////////////////////

dev = stdev(close, period)
stdDev = (dev / close) * 100 + 1
MultDev = SelfAdjust ? multi * stdDev : multi

up_lev1 = hl2 - MultDev * atr(period)
dn_lev1 = hl2 + MultDev * atr(period)
up_lev2 = hl2 - (MultDev * 2 * atr(period))
dn_lev2 = hl2 + (MultDev * 2 * atr(period))

up_trend1 = 0.0
up_trend1 := close[1] > up_trend1[1] ? max(up_lev1, up_trend1[1]) : up_lev1
up_trend2 = 0.0
up_trend2 := close[1] > up_trend2[1] ? max(up_lev2, up_trend2[1]) : up_lev2

down_trend1 = 0.0
down_trend1 := close[1] < down_trend1[1] ? min(dn_lev1, down_trend1[1]) : dn_lev1
down_trend2 = 0.0
down_trend2 := close[1] < down_trend2[1] ? min(dn_lev2, down_trend2[1]) : dn_lev2

trend1 = 0
trend1 := close > down_trend1[1] ? 1: close < up_trend1[1] ? -1 : nz(trend1[1], 1)
trend2 = 0
trend2 := close > down_trend2[1] ? 1: close < up_trend2[1] ? -1 : nz(trend2[1], 1)

st_line1 = trend1 == 1 ? up_trend1 : down_trend1
st_line2 = trend2 == 1 ? up_trend2 : down_trend2

// Plotting
plot1 = plot(st_line1, color = trend1 == 1 ? color.green : color.red , style = plot.style_line, linewidth = 1, title = "SuperTrend 1")
plot2 = plot(st_line2, color = trend2 == 1 ? color.green : color.red , style = plot.style_line, linewidth = 1, title = "SuperTrend 2")
fill(plot1, plot2, color = color.aqua, title = "Cloud")

buy = crossover(close, st_line1) and close > st_line2 or crossover(close, st_line2) and close > st_line1
sell = crossunder(close, st_line1) and close < st_line2 or crossunder(close, st_line2) and close < st_line1

if(buy and time_cond)
    strategy.entry("long", long = true , comment="long")

if (close < st_line1 and time_cond or close < st_line2 and time_cond)
    strategy.close("long")
    
if (not time_cond)
    strategy.close_all()





 


더 많은