
이 전략은 채널과 동력 지표를 계산하여 트렌드 형태를 식별하고 트렌드 추적 거래를 구현합니다. 구체적으로, 동력 지표와 균형 채널 지표를 결합하여 둘의 상호 사용으로 장기 동향에 개입하면서 균형 채널을 사용하여 다중 이익 영역을 잠금합니다.
이 전략은 다음의 두 가지 지표를 통해 판단됩니다.
동력 지표 ((DMI): 시장의 공허 경향을 판단하고, 지표가 값을 설정할 때 거래 신호를 생성하는 것보다 크다.
평형 채널 (Keltner Channel): 트렌드 지역을 판단하고, 가격이 궤도를 돌파할 때 구매 시점으로, 가격이 궤도를 넘어설 때 평점 신호로.
구체적인 거래 논리는 다음과 같습니다: + DI 동력 지표가 설정된 임값 ((설정된 32)) 보다 클 때, 다중 트렌드 형성으로 판단하고, 이 시점에는 가격이 균형 통로의 궤도를 돌파하여 구매 신호를 생성합니다. 그 후 균형 통로의 중간 궤도를 중지 라인으로 사용하여, 중지 손실을 추적하고, 수익 보호를 실현합니다.
이 전략은 두 지표의 장점을 통합하여 동력 지표를 사용하여 트렌드 방향을 판단하고, 균형 통로를 사용하여 진입 시점과 중단 지역을 판단한다. 이중 지표 조합은 전략이 트렌드를 발견하는 데 일찍 효율적으로 진입 할 수있게하며, 채널 지표를 사용하여 이익과 손실을 잠금 할 수 있습니다.
전략은 운동량 지표를 사용하여 시장의 추세를 파악하는 데 더 오래 걸리고, 단순한 이동 평균과 같은 지연 지표보다 더 효과적입니다.
균형 통로를 사용하여 특정 거래 구역을 판단하여 수익 지역을 효과적으로 고정 할 수 있습니다.
지표 매개 변수와 거래 규칙은 엄격하고 합리적이며, 재검토 데이터는 잘 수행되고 실장 검증 효과가 있습니다.
전략은 간단하고 명확하며, 이해하기 쉬운 구현이며, 양자 거래 초보자 학습에 적합하다.
전략적 위험은 제어할 수 있으며, 중궤도 평선 동적 중지 손실을 적용하여 단편 손실을 효과적으로 제어한다.
이 전략은 트렌드 상황에만 적용되며, 변동성 시장의 정리에는 적용되지 않습니다. QtCore 통로가 커지면, 중도 정지 손실이 너무 완만하여 손실을 제어 할 수 없습니다.
DMI 지표는 다소 지연되어 있으며, 트렌드 확인을 확인할 수 없으며, 트렌드에 조기에 개입하면 손실이 발생할 수 있습니다.
고정 비율 상쇄 방식은 큰 흔들림 후 다시 트렌드에 개입할 수 없으며, 후속 상황을 놓칠 위험이 있습니다.
탐지 데이터는 충분하지만, 실디 디스크는 여전히 변수 안정성을 검증하는 데 시간이 오래 걸립니다.
ATR 스톱, 모바일 스톱 등 다양한 스톱 방식을 테스트할 수 있다.
트렌드 확인 후 입시를 보장하는 거래량 증가와 같은 하위 확인 지표가 추가 될 수 있습니다.
다양한 변수 조합을 테스트하여 최적의 변수 조합을 찾을 수 있다.
단계적 최적화 및 유동적 피드백을 통해 변수 안정성을 검증할 수 있다.
이 전략은 이중 지표 판단을 사용하여 트렌드 상황을 효율적으로 포착합니다. 전략은 간단하고 직관적이며, 논리적으로 명확하며, 재검토 성능이 좋으며, 정량 거래의 입문 전략 중 하나로 사용할 수 있습니다. 그러나 여전히 실장 데이터와 최적화 매개 변수를 충분히 검증해야하며, 실장 실행 손실 위험을 줄이는 것이 향후 주요 작업입니다.
/*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")