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