동력 균형 채널 트렌드 추적 전략

저자:차오장, 날짜: 2023-12-12 18:07:31
태그:

img

전반적인 설명

이 전략은 트렌드 추적 거래를 달성하기 위해 채널과 동력 지표를 계산하여 트렌드 형성을 식별합니다. 구체적으로, 동력 지표와 균형 채널 지표를 결합하고 균형 채널을 사용하여 긴 수익 영역을 잠금하는 동안 장기 트렌드에 개입하기 위해 이 둘을 활용합니다.

전략 원칙

이 전략은 주로 다음 두 가지 지표를 이용해서 판단합니다.

  1. 모멘텀 지표 (DMI): 시장의 장기 및 단기 트렌드를 판단하고 지표가 설정된 임계보다 높을 때 거래 신호를 생성합니다.

  2. 평형 채널 (켈트너 채널): 트렌드 영역을 결정합니다. 가격이 상부 레일을 뚫고 갈 때, 구매 할 때이며 가격이 중간 레일을 넘어갈 때, 그것은 포지션을 닫는 신호입니다.

특정 거래 논리는: +DI 모멘텀 지표가 설정된 임계치 (32 기본값) 보다 크면 상승 추세가 형성되었다는 것을 결정한다. 이 시점에서 가격이 평형 채널의 상부 레일을 뚫으면 구매 신호가 생성된다. 그 후 평형 채널을 사용합니다. 중간 레일은 스톱 손실을 추적하고 수익 보호를 달성하기 위해 스톱 손실 라인으로 사용됩니다.

이 전략은 두 가지 지표의 장점을 결합하고, 동력 지표를 사용하여 트렌드 방향을 결정하고, 진입 시기를 결정하고 손실을 멈추는 지역을 결정하기 위해 평형 채널을 사용합니다. 이중 지표 조합으로 전략은 트렌드를 발견하는 초기에 효율적으로 진입 할 수 있으며, 채널 지표를 사용하여 수익과 중단을 잠금합니다.

이점 분석

  1. 이 전략은 시장 동향의 초기 단계를 결정하기 위해 동력 지표를 사용하며, 이는 단순한 이동 평균과 같은 후진 지표보다 더 효율적입니다.

  2. 특정 거래 범위를 결정하기 위해 평형 채널을 사용하면 수익 구역을 효과적으로 차단 할 수 있습니다.

  3. 지표 매개 변수와 거래 규칙은 엄격하고 합리적이며 백테스트 데이터는 잘 수행되고 실제 전투 효과를 확인합니다.

  4. 전략은 비교적 간단하고 명확하고, 이해하기 쉽고 실행하기 쉽고, 양적 거래 초보자가 배울 수 있습니다.

  5. 이 전략의 위험은 통제 가능하며, 단일 손실을 효과적으로 제어하기 위해 중간선과 동적 스톱 손실을 채택합니다.

위험 분석

  1. 전략은 트렌딩 시장에만 적합하며 통합 및 변동 시장에는 적합하지 않습니다. QtCore 채널이 증가하고 중간 레일 정지 손실이 너무 느슨하다면 손실을 제어 할 수 없습니다.

  2. DMI 지표는 일정 지연을 가지고 있으며 트렌드 확인을 결정할 수 없습니다. 트렌드에 더 일찍 개입함으로써 손실을 일으킬 수 있습니다.

  3. 일정한 비율의 스톱 손실 방법은 위험이 있습니다. 급격한 변동 후 트렌드에 다시 개입 할 수 없습니다. 따라서 후속 트렌드를 놓칩니다.

  4. 백테스트 데이터가 충분하지만 실제 거래에서 매개 변수 안정성을 확인하기 위해 장기 실행이 여전히 필요합니다.

최적화

  1. ATR 스톱 로스, 이동 스톱 로스 등 다양한 스톱 로스 방법을 테스트 할 수 있습니다.

  2. 트렌드 확인 후 진입을 보장하기 위해 부피 증폭과 같은 2차 확인 지표가 추가 될 수 있습니다.

  3. 최적의 매개 변수 조합을 찾기 위해 다른 매개 변수 조합을 테스트 할 수 있습니다.

  4. 매개 변수의 견고성은 단계적 최적화 및 앞으로의 테스트를 통해 확인할 수 있습니다.

요약

이 전략은 이중 지표 판단을 사용하여 트렌딩 시장을 효율적으로 캡처하는 것을 달성합니다. 전략은 명확한 논리와 좋은 백테스트 성능으로 비교적 간단하고 직관적입니다. 양적 거래의 입구 전략 중 하나로 작용할 수 있습니다. 그러나 실제 거래 데이터의 충분한 검증과 매개 변수 최적화는 여전히 실제 거래 손실을 줄이기 위해 필요합니다. 이것은 미래의 작업의 중심을 가질 것입니다.


/*backtest
start: 2023-11-11 00:00:00
end: 2023-12-11 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Original Idea by: @Wunderbit


//@version=4
strategy("Keltner Channel [LINKUSDT] 1H", overlay=true, initial_capital=3000,pyramiding = 0, currency="USD", default_qty_type=strategy.percent_of_equity, default_qty_value=100,  commission_type=strategy.commission.percent,commission_value=0.1)


/// TREND
trend_cond = input(true, title="Enable Ribbon Filter")
ribbon_period = input(30, "Ribbon Period", step=1)

leadLine1 = ema(close, ribbon_period)
leadLine2 = sma(close, ribbon_period)

// p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
// p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
// fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)

//Upward Trend
UT=leadLine2 < leadLine1
DT=leadLine2 > leadLine1

///////////////////////////////////////INDICATORS

// KELTNER //
source       = close
useTrueRange = input(true)
length       = input(80, "KELTNER Period", step=1, minval=1)
mult         = input(3.0,"KELTNER Multiple", step=0.1)

// Calculate Keltner Channel
ma      = ema(source, length)
range   = useTrueRange ? tr : high - low
rangema = ema(range, length)
upper = ma + rangema * mult
lower = ma - rangema * mult

plot(ma, title="Middle", color=color.orange)
p1=plot(upper, title="Upper", color=color.orange)
p2=plot(lower, title="Lower", color=color.orange)
fill(p1,p2)


// DMI INDICATOR //

lensig = input(14, title="ADX Smoothing", minval=1, maxval=50)
len = input(14, minval=1, title="DI Length")
up = change(high)
down = -change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
trur = rma(tr, len)
plus = fixnan(100 * rma(plusDM, len) / trur)
minus = fixnan(100 * rma(minusDM, len) / trur)
sum = plus + minus
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), lensig)

trig_level=input(title="+DI Trigger Level", defval=32, minval=1,step=1)
//trig_level_adx=input(title="ADX Trigger Level", defval=30, minval=1,step=1)

//plot(adx, color=#FF006E, title="ADX")
//plot(plus, color=#0094FF, title="+DI")
//plot(minus, color=#FF6A00, title="-DI")
// plot(trig_level, color=color.white, title="Key Level")

///////////////////////////////////////////////////////////


////////////////////////////////////////////////////Component Code Start

testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
    
///// Component Code Stop //////////////////////////////////////////

//////////////// STRATEGY EXECUTION //////////////////////////

// STRATEGY CONDITION
// LONG

long = ((open > lower and open < upper) and close > upper) and plus > minus and plus > trig_level and volume[0] > volume[1]
entry_long = trend_cond ? long and UT : long
exit_long = (close < ma) //or low < SL_long

//LONG SET UP
// Take Profit / Stop Loss

entry_price_long=valuewhen(entry_long,close,0)
//SL_long = entry_price_long * (1 - long_sl_inp)

long_tp1_inp = input(8, title='Long Take Profit 1 Target %', step=0.1)/100
long_tp1_qty = input(20, title="Long Take Profit 1 Qty %", step=1)

long_tp2_inp = input(16, title='Long Take Profit 2 Target %', step=0.1)/100
long_tp2_qty = input(30, title="Long Take Profit 2 Qty %", step=1)

long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)

//long_sl_inp = input(4, title='Long Stop Loss %', step=0.1)/100
//long_stop_level = strategy.position_avg_price * (1 - long_sl_inp)


// STRATEGY EXECUTION
if testPeriod()

    // LONG
    
    strategy.entry(id="Long", long=true, when=entry_long, comment = "INSERT ENTRY LONG COMMAND")
    strategy.exit("TP1","Long", qty_percent=long_tp1_qty, limit=long_take_level_1) // PLACE TAKE PROFIT IN WBT BOT SETTINGS 
    strategy.exit("TP2","Long", qty_percent=long_tp2_qty, limit=long_take_level_2) // PLACE TAKE PROFIT IN WBT BOT SETTINGS
    strategy.close(id="Long", when=exit_long, comment= "INSERT EXIT LONG COMMAND")


//PLOT FIXED SLTP LINE
// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
//plot(strategy.position_size > 0 ? long_stop_level : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")

더 많은