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