
쌍방 돌파 K선 파동 채널 전략은 통로의 중간, 상단, 하단 궤도를 계산하여 트렌드 지표와 수량 지표와 결합하여 시장의 방향과 강도를 판단하고, 통로의 양쪽에 동시에 돌파 신호를 설정하여 낮은 가격과 높은 가격의 판매를 달성하는 주요 목적을 달성합니다.
이 전략의 핵심 지표는 통계학에 기반한 K선 변동 채널이다. 채널 중간 궤도는 평균선 알고리즘을 사용하고, 상하 궤도는 평균 실제 파장의 계산 방법을 사용하고, 가격 변동의 경계를 동적으로 포착할 수 있다. 동시에, 전략은 DMI와 거래량 판단 규칙을 추가하여 가짜 돌파구가 손실을 초래하지 않도록 한다.
구체적으로, 가격이 하향에서 채널을 돌파할 때, DMI의 +DI 라인은 -DI 라인과 설정된 ADX 기준선을 초과하고 거래량이 커지면 구매 신호를 발생시킨다. 반대로, 가격이 상향에서 하향으로 채널을 돌파할 때, 판단 규칙은 위의 것과 반대로 판매 신호를 발생시킨다.
이 전략의 가장 큰 장점은 가격의 주요 돌파 방향을 포착하는 데 있습니다. 쌍방향 돌파 판단을 사용하면 교정 및 흔들리는 상황을 효과적으로 피할 수 있으며, 손실을 줄일 수 있습니다. 간단한 이동 평균 전략에 비해 K 채널 돌파 판단은 가격 변동에 더 잘 적응합니다.
또한, 보조 지표인 DMI와 거래량을 도입하는 것도 좋은 필터링 역할을 하며, 가짜 신호를 방지한다. 따라서 승률과 수익률의 관점에서 볼 때, 이 전략은 어느 정도 장점이 있다.
쌍방향 돌파구 전략의 가장 큰 위험은 시장의 반전을 판단할 수 없다는 것입니다. 시장의 V형 반전이 발생하면, 중지 손실이 쉽게 유발 될 수 있습니다. 또한, 매개 변수 설정이 잘못되면 거래 시스템에 부정적인 영향을 미칠 수 있습니다.
위험을 감수하기 위해서는 지표 변수를 더 최적화하여 스톱로스를 줄일 수 있습니다. 물론 거래 시스템은 손실을 완전히 피할 수 없습니다. 위험을 통제하는 것이 중요합니다.
이 전략은 또한 다음과 같은 부분에서 개선될 수 있는 강력한 최적화 잠재력을 가지고 있습니다.
DMI의 DI 및 ADX 길이, K 라인 채널의 주기 및 배수 설정과 같은 최적화 파라미터를 미세 조정
MACD와 같은 다른 지표와 결합하여 필터링 조건을 추가하여 가짜 돌파구를 피하십시오.
스톱 스톱 손실 자동 추적을 구현하여 위험을 더욱 제어합니다.
다양한 품종에 대한 파라미터 설정 및 필터링 규칙을 최적화합니다.
양방향 K선 파동 통로 전략은 전반적으로 효과적인 돌파구 시스템이다. 주요 트렌드 방향과 강도를 효과적으로 판단할 수 있으며, 최적화 및 위험 제어 측면에서 큰 잠재력을 가지고 있다. 체계적으로 개선하고 최적화하면 이 전략은 장기적으로 수익을 안정화 할 수 있다.
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//Original Idea by: Wunderbit Trading
//@version=5
strategy('Keltner Channel ETH/USDT 1H', overlay=true, initial_capital=1000, pyramiding=0, currency='USD', default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.07)
/// TREND
ribbon_period = input.int(46, 'Period', step=1)
leadLine1 = ta.ema(close, ribbon_period)
leadLine2 = ta.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.int(81, step=1, minval=1)
mult = input.float(2.5, step=0.1)
// Calculate Keltner Channel
ma = ta.sma(source, length)
range_1 = useTrueRange ? ta.tr : high - low
rangema = ta.sma(range_1, length)
upper = ma + rangema * mult
lower = ma - rangema * mult
plot(ma, title='Middle', color=color.new(color.orange, 0))
p1 = plot(upper, title='Upper', color=color.new(color.orange, 0))
p2 = plot(lower, title='Lower', color=color.new(color.orange, 0))
fill(p1, p2, transp=90)
// DMI INDICATOR //
adxlen = 10 // input(10, title="ADX Smoothing")
dilen = input(19, title='DI Length')
keyLevel = 23 // input(23, title="key level for ADX")
dirmov(len) =>
up = ta.change(high)
down = -ta.change(low)
truerange = ta.rma(ta.tr, len)
plus = fixnan(100 * ta.rma(up > down and up > 0 ? up : 0, len) / truerange)
minus = fixnan(100 * ta.rma(down > up and down > 0 ? down : 0, len) / truerange)
[plus, minus]
adx(dilen, adxlen) =>
[plus, minus] = dirmov(dilen)
sum = plus + minus
adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
[adx, plus, minus]
[sig, up, down] = adx(dilen, adxlen)
benchmark = input.int(title='DMI Benchmark', defval=27, minval=1, step=1)
// plot(sig, color=color.red, title="ADX")
// plot(up, style=plot.style_histogram, color=color.green, title="+DI")
// plot(down, style=plot.style_histogram, color=color.red, title="-DI")
// plot(keyLevel, 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(9999, 'Backtest Stop Year')
testStopMonth = input(12, 'Backtest Stop Month')
testStopDay = input(31, 'Backtest Stop Day')
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)
testPeriod() => true
///// Component Code Stop //////////////////////////////////////////
//////////////// STRATEGY EXECUTION //////////////////////////
//LONG SET UP
// Take Profit / Stop Loss
long_tp1_inp = input.float(4.5, title='Long Take Profit 1 %', step=0.1) / 100
long_tp1_qty = input.int(15, title='Long Take Profit 1 Qty', step=1)
long_tp2_inp = input.float(20, title='Long Take Profit 2%', step=0.1) / 100
long_tp2_qty = input.int(100, 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.float(4, title='Long Stop Loss %', step=0.1) / 100
long_stop_level = strategy.position_avg_price * (1 - long_sl_inp)
// STRATEGY CONDITION
// LONG
entry_long = open > lower and open < upper and close > upper and up > down and up > benchmark // and volume[0] > volume[1]
entry_price_long = ta.valuewhen(entry_long, close, 0)
SL_long = entry_price_long * (1 - long_sl_inp)
exit_long = close < lower or low < SL_long
// STRATEGY EXECUTION
if testPeriod()
// LONG
if UT
strategy.entry(id='Long', direction=strategy.long, when=entry_long, comment='INSERT ENTER 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.new(color.green, 0), linewidth=1, title='1st Long Take Profit')
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.new(color.green, 0), linewidth=1, title='2nd Long Take Profit')
plot(strategy.position_size > 0 ? long_stop_level : na, style=plot.style_linebr, color=color.new(color.red, 0), linewidth=1, title='Long Stop Loss')