
Chiến lược kênh dao động K-line phá vỡ hai bên bằng cách tính toán đường trung, đường trên và đường dưới của kênh, kết hợp với chỉ số xu hướng và chỉ số giá trị để đánh giá hướng và cường độ của thị trường, thiết lập tín hiệu phá vỡ đồng thời ở cả hai bên của kênh, để đạt được mục đích chính của mua bán thấp.
Các chỉ số cốt lõi của chiến lược này dựa trên các kênh biến động K-line thống kê. Các đường trung tâm của kênh sử dụng thuật toán đường trung bình, đường trên và dưới sử dụng phương pháp tính toán của sóng trung bình thực tế, có thể động nắm bắt các biên giới biến động giá. Đồng thời, chiến lược thêm DMI và quy tắc phán đoán khối lượng giao dịch, tránh phá vỡ giả tạo gây thiệt hại.
Cụ thể, khi giá phá vỡ kênh từ đường ray dưới, đường +DI của DMI vượt quá đường -DI và đường chuẩn ADX được thiết lập, và khi khối lượng giao dịch tăng lên sẽ tạo ra tín hiệu mua. Ngược lại, khi giá phá vỡ kênh từ đường ray trên xuống, quy tắc phán đoán ngược lại với trên, tạo ra tín hiệu bán.
Lợi thế lớn nhất của chiến lược này là nắm bắt hướng đột phá chính của giá, sử dụng phán quyết đột phá song phương có thể tránh hiệu quả các tình huống cân bằng và dao động, giảm số lần dừng lỗ. So với chiến lược trung bình di chuyển đơn giản, phán quyết đột phá kênh K có khả năng thích ứng với biến động giá tốt hơn.
Ngoài ra, việc đưa ra các chỉ số hỗ trợ DMI và khối lượng giao dịch cũng có tác dụng lọc tốt, tránh các tín hiệu sai. Vì vậy, từ góc độ tỷ lệ thắng và tỷ lệ thua lỗ, chiến lược này có một số ưu điểm.
Rủi ro lớn nhất của chiến lược phá vỡ song phương là không thể đánh giá được sự đảo ngược của thị trường. Nếu thị trường có sự đảo ngược kiểu V, điểm dừng có thể dễ dàng bị kích hoạt. Ngoài ra, việc đặt tham số không đúng cũng có thể ảnh hưởng tiêu cực đến hệ thống giao dịch.
Đối với rủi ro, chúng ta có thể giảm rủi ro bằng cách tối ưu hóa các tham số chỉ số hơn nữa, giảm mức độ dừng lỗ. Tất nhiên, hệ thống giao dịch không bao giờ có thể hoàn toàn tránh được tổn thất, điều quan trọng là kiểm soát rủi ro.
Chiến lược này cũng có tiềm năng tối ưu hóa mạnh mẽ, và có thể được cải thiện trong các khía cạnh sau:
Điều chỉnh các tham số tối ưu hóa, chẳng hạn như độ dài DI và ADX của DMI, thời gian và cài đặt nhân của kênh K
Thêm điều kiện lọc, như kết hợp các chỉ số khác như MACD để tránh đột phá giả
Thực hiện theo dõi tự động dừng lỗ để kiểm soát rủi ro hơn nữa
Cài đặt tham số và quy tắc lọc được tối ưu hóa cho các giống khác nhau
Chiến lược phá vỡ K-line của hai bên nói chung là một hệ thống phá vỡ hiệu quả. Nó có thể xác định hiệu quả hướng và cường độ của xu hướng chính, cũng có tiềm năng lớn trong việc tối ưu hóa và kiểm soát rủi ro. Nếu cải tiến và tối ưu hóa một cách có hệ thống, chiến lược này có thể ổn định lợi nhuận trong thời gian dài.
/*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')