Chiến lược theo dõi xu hướng kênh Momentum Equilibrium

Tác giả:ChaoZhang, Ngày: 2023-12-12 18:07:31
Tags:

img

Tổng quan

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.

Nguyên tắc chiến lược

Chiến lược chủ yếu sử dụng hai chỉ số sau đây để đánh giá:

  1. 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.

  2. 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ỗ.

Phân tích lợi thế

  1. 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.

  2. 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.

  3. 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ế.

  4. 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.

  5. 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.

Phân tích rủi ro

  1. 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ỗ.

  2. 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.

  3. 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.

  4. 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ế.

Tối ưu hóa

  1. 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.

  2. 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.

  3. 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.

  4. Độ 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ộ.

Tóm lại

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")

Thêm nữa