Chiến lược này dựa trên ba chỉ số chính: chỉ số xu hướng, kênh Keltner và chỉ số DM.
Chỉ số xu hướng bao gồm SMA và EMA. Keltner Channel được sử dụng để xác định giá mở và đóng của nến. Chỉ số DM là để đánh giá hướng dài và ngắn.
Tín hiệu nhập cảnh được kích hoạt khi:
Chiến lược có hai mức lợi nhuận và một mức dừng lỗ.
Đường chéo SMA và EMA được sử dụng để xác định hướng xu hướng.
Kênh có ba đường: trung bình, trên và dưới. Đường giữa là SMA của giá đóng với chiều dài 81. Các dải trên và dưới được đặt ở nhiều lần phạm vi thực bên trên và bên dưới đường giữa. Ở đây chúng tôi sử dụng 2,5 lần phạm vi thực.
Keltner Channel cho thấy mức hỗ trợ và kháng cự.
Chỉ số DM chứa ADX, +DI và -DI. +DI đo sức mạnh xu hướng tăng trong khi -DI đo sức mạnh xu hướng giảm. ADX cho thấy sức mạnh xu hướng.
Ở đây ADX (10), DI (19) được sử dụng. Khi +DI vượt trên chỉ số chuẩn (bên định 27), nó báo hiệu xu hướng tăng mạnh và tốt cho bước vào dài.
Chiến lược này kết hợp các chỉ số xu hướng, kênh và động lực để xác định hiệu quả các hành động giá và hướng dài / ngắn.
Việc xác định xu hướng tương đối chính xác để tránh giao dịch ngược xu hướng.
Keltner Channel cho thấy mức hỗ trợ và kháng cự rõ ràng.
Chỉ số DM đo động lượng dài / ngắn để đảm bảo hướng.
Các quy tắc nhập cảnh nghiêm ngặt giúp lọc các vụ trốn thoát giả.
Lấy lợi nhuận và điểm dừng lỗ cho phép nắm bắt lợi nhuận.
Ngoài ra còn có một số rủi ro cần xem xét:
Xu hướng có thể đảo ngược khi EMA vượt qua dưới SMA, vì vậy hãy rời khỏi kịp thời.
Kênh có thể thất bại trong xu hướng mạnh, không hỗ trợ / kháng cự nghiêm ngặt.
DM có thể tạo ra tín hiệu sai, kiểm tra hành động giá.
Việc phá vỡ sai có thể kích hoạt bước vào nhưng nhanh chóng quay lại, sử dụng stop loss hợp lý.
Lợi nhuận và dừng lỗ cần tối ưu hóa liên tục để thích nghi với điều kiện thị trường thay đổi.
Một số cách để tối ưu hóa thêm chiến lược:
Điều chỉnh các thông số và thử nghiệm các phương pháp xác định xu hướng khác nhau.
Tối ưu hóa các thông số kênh để phù hợp hơn với phạm vi thực sự.
Kiểm tra các thông số DM khác nhau và tìm ra sự kết hợp tối ưu.
Thêm thêm các bộ lọc nhập như âm lượng.
Hãy thử dừng lỗ để có được nhiều lợi nhuận hơn.
Kiểm tra riêng cho các sản phẩm khác nhau để tìm ra các tập hợp thông số tốt nhất.
Chiến lược này tích hợp nhiều chỉ số để xác định xu hướng, hỗ trợ / kháng cự và đà phát triển, cho phép nắm bắt xu hướng và kiểm soát rủi ro một cách hiệu quả. Nhưng rủi ro cần được chú ý và các thông số cần tối ưu hóa khi thị trường thay đổi. Nhìn chung, đây là một chiến lược có tính thực tế mạnh mẽ.
/*backtest start: 2022-10-27 00:00:00 end: 2023-11-02 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Original Idea by: Wunderbit Trading //@version=4 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(46, "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(81, step=1, minval=1) mult = input(2.5, step=0.1) // Calculate Keltner Channel ma = sma(source, length) range = useTrueRange ? tr : high - low rangema = sma(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 // 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 = change(high) down = -change(low) truerange = rma(tr, len) plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, len) / truerange) minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) [adx, plus, minus] [sig, up, down] = adx(dilen, adxlen) benchmark=input(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(4.5, title='Long Take Profit 1 %', step=0.1)/100 long_tp1_qty = input(15, title="Long Take Profit 1 Qty", step=1) long_tp2_inp = input(20, title='Long Take Profit 2%', step=0.1)/100 long_tp2_qty = input(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(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=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", long=true, 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.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")