Chiến lược này xác định các hình thành xu hướng bằng cách tính toán các kênh và chỉ số động lực để đạt được giao dịch theo dõi xu hướng. Cụ thể, nó kết hợp các chỉ số động lực và các chỉ số kênh cân bằng, và tận dụng cả hai để can thiệp vào các xu hướng dài hạn trong khi sử dụng các kênh cân bằng để khóa các khu vực lợi nhuận dài.
Chiến lược chủ yếu sử dụng hai chỉ số sau đây để đánh giá:
Chỉ số Động lực (DMI): Xác định xu hướng dài và ngắn trên thị trường và tạo ra tín hiệu giao dịch khi chỉ số lớn hơn ngưỡng đã thiết lập.
Kênh cân bằng (Keltner Channel): Xác định khu vực xu hướng. Khi giá vượt qua đường ray trên, đó là thời gian mua, và khi giá giảm xuống dưới đường ray giữa, đó là một tín hiệu để đóng vị trí.
Khái niệm giao dịch cụ thể là: Khi chỉ số động lượng +DI lớn hơn ngưỡng đã thiết lập (mất mặc định 32), nó được xác định rằng một xu hướng tăng đã hình thành. Tại thời điểm này, nếu giá vượt qua đường ray trên của kênh cân bằng, một tín hiệu mua được tạo ra; sau đó, kênh cân bằng được sử dụng. Đường ray giữa được sử dụng như một đường dừng lỗ để theo dõi mức dừng lỗ và đạt được bảo vệ lợi nhuận.
Chiến lược này kết hợp các lợi thế của hai chỉ số, sử dụng các chỉ số động lực để xác định hướng xu hướng và sử dụng các kênh cân bằng để xác định thời gian nhập cảnh và các khu vực dừng lỗ.
Chiến lược sử dụng các chỉ số động lực để xác định giai đoạn đầu của xu hướng thị trường, hiệu quả hơn so với các chỉ số chậm như trung bình di chuyển đơn giản.
Sử dụng kênh cân bằng để xác định phạm vi giao dịch cụ thể có thể khóa hiệu quả vùng lợi nhuận.
Các thông số chỉ số và các quy tắc giao dịch nghiêm ngặt và hợp lý, và dữ liệu backtest hoạt động tốt và xác minh hiệu quả chiến đấu thực tế.
Chiến lược tương đối đơn giản và rõ ràng, dễ hiểu và thực hiện, và phù hợp cho những người mới bắt đầu giao dịch định lượng.
Rủi ro của chiến lược có thể kiểm soát được, và nó áp dụng stop loss động với đường trung bình để kiểm soát hiệu quả lỗ đơn.
Chiến lược chỉ phù hợp với thị trường xu hướng và không phù hợp với thị trường củng cố và biến động. Nếu kênh QtCore tăng và lỗ dừng đường sắt giữa quá lỏng lẻo, nó không thể kiểm soát lỗ.
Chỉ số DMI có một sự chậm trễ nhất định và không thể xác định xác nhận xu hướng. Nó có thể gây ra tổn thất bằng cách can thiệp vào xu hướng sớm hơn.
Phương pháp dừng lỗ tỷ lệ phần trăm cố định có rủi ro. Nó không thể can thiệp lại vào xu hướng sau một biến động mạnh, do đó bỏ lỡ xu hướng tiếp theo.
Có đủ dữ liệu backtest, nhưng vẫn cần chạy lâu dài để xác minh sự ổn định của các tham số trong giao dịch thực tế.
Các phương pháp dừng lỗ khác nhau có thể được thử nghiệm, chẳng hạn như dừng lỗ ATR, dừng lỗ di chuyển vv để thay thế tỷ lệ dừng lỗ cố định.
Các chỉ số xác nhận thứ cấp có thể được thêm vào, chẳng hạn như khuếch đại khối lượng, để đảm bảo nhập cảnh sau khi xác nhận xu hướng.
Các kết hợp tham số khác nhau có thể được thử nghiệm để tìm ra kết hợp tham số tối ưu.
Độ bền của các thông số có thể được xác minh thông qua tối ưu hóa từng bước và thử nghiệm tiến bộ.
Chiến lược này đạt được việc nắm bắt hiệu quả các thị trường xu hướng bằng cách sử dụng các đánh giá chỉ số kép. Chiến lược tương đối đơn giản và trực quan với logic rõ ràng và hiệu suất kiểm tra hậu quả tốt. Nó có thể phục vụ như một trong những chiến lược đầu vào cho giao dịch định lượng. Nhưng vẫn cần xác minh đầy đủ dữ liệu giao dịch thực và tối ưu hóa tham số để giảm lỗ giao dịch thực. Đây sẽ là trọng tâm của công việc trong tương lai.
/*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")