Chiến lược dựa trên xu hướng kênh Keltner

Tác giả:ChaoZhang, Ngày: 2023-11-03 16:59:39
Tags:

img

Tổng quan

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:

  1. EMA vượt qua SMA, xác nhận xu hướng tăng
  2. Nến mở trên dải trên và đóng bên trong kênh
  3. Chỉ số DM trên chỉ số chuẩn

Chiến lược có hai mức lợi nhuận và một mức dừng lỗ.

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

Xác định xu hướng

Đường chéo SMA và EMA được sử dụng để xác định hướng xu hướng.

Keltner Channel

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

Phân tích lợi thế

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.

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

  2. Keltner Channel cho thấy mức hỗ trợ và kháng cự rõ ràng.

  3. Chỉ số DM đo động lượng dài / ngắn để đảm bảo hướng.

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

  5. Lấy lợi nhuận và điểm dừng lỗ cho phép nắm bắt lợi nhuận.

Phân tích rủi ro

Ngoài ra còn có một số rủi ro cần xem xét:

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

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

  3. DM có thể tạo ra tín hiệu sai, kiểm tra hành động giá.

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

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

Hướng dẫn tối ưu hóa

Một số cách để tối ưu hóa thêm chiến lược:

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

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

  3. Kiểm tra các thông số DM khác nhau và tìm ra sự kết hợp tối ưu.

  4. Thêm thêm các bộ lọc nhập như âm lượng.

  5. Hãy thử dừng lỗ để có được nhiều lợi nhuận hơn.

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

Kết luận

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

Thêm nữa