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


Ngày tạo: 2023-11-03 16:59:39 sửa đổi lần cuối: 2023-11-03 16:59:39
sao chép: 0 Số nhấp chuột: 791
1
tập trung vào
1617
Người theo dõi

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

Tổng quan

Chiến lược này dựa trên ba chỉ số chính: chỉ số xu hướng, Keltner Channel và DM.

Chỉ số xu hướng bao gồm SMA và EMA. Khi EMA đi qua SMA, xác nhận xu hướng vào. Keltner channel được sử dụng để xác định giá mở và đóng của Candle.

Bạn có thể làm nhiều hơn nếu bạn đáp ứng các điều kiện nhập học sau:

  1. EMA vượt SMA, xác nhận xu hướng tăng
  2. Candle mở giá trên đường dẫn lên, giá đóng cửa bên trong kênh
  3. Chỉ số DM lớn hơn đường chuẩn được thiết lập

Chiến lược đặt hai điểm dừng và một điểm dừng. Bạn có thể xem xét sử dụng tracking stop để có được nhiều lợi nhuận hơn.

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

Xác định xu hướng

Định hướng xu hướng được đánh giá thông qua EMA và SMA. Các tham số EMA là 46, tham số SMA là 46. Khi EMA đi qua SMA, nó cho biết bước vào xu hướng tăng.

Keltner Passage

Hành lang Keltner bao gồm ba đường: đường trung tâm, đường trên và đường dưới. Đường trung tâm là SMA của giá đóng cửa, có chiều dài 81.

Các kênh Keltner chủ yếu được sử dụng để xác định liệu giá có nằm trong kênh hay không, và nếu nó đi qua kênh.

Chỉ số DM

Chỉ số DM bao gồm ba đường: ADX, + DI và - DI. + DI đo sức mạnh tăng, - DI đo sức mạnh giảm. ADX đại diện cho chỉ số xu hướng trung bình, phản ánh sức mạnh của xu hướng.

Ở đây, tham số ADX được thiết lập là 10, tham số DI là 19. Khi sử dụng đường chuẩn được thiết lập trên đường + DI (đặc định là 27), biểu thị rằng đà tăng mạnh, phù hợp để làm nhiều hơn.

Phân tích lợi thế

Chiến lược này kết hợp xu hướng, kênh và chỉ số mạnh và yếu, có thể xác định hiệu quả xu hướng giá và hướng đa không gian. Nó có những lợi thế sau:

  1. Trải nghiệm xu hướng tương đối chính xác, tránh các hoạt động ngược.

  2. Các đường Keltner được nhìn thấy rõ ràng, tạo thành các vị trí hỗ trợ và áp lực.

  3. Chỉ số DM có thể đo lực bay, đảm bảo hướng bay chính xác.

  4. Các điều kiện chiến lược nghiêm ngặt, có thể lọc hiệu quả các đột phá giả mạo.

  5. Thiết lập điểm dừng lỗ để nắm bắt cơ hội kiếm tiền.

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro:

  1. Xu hướng có thể đảo ngược, EMA có thể phá vỡ SMA, nên lưu ý rút lui kịp thời.

  2. Trong trường hợp mạnh, các kênh có thể bị hỏng và không thể được coi là một mức áp lực hỗ trợ nghiêm ngặt.

  3. Chỉ số DM có thể phát ra tín hiệu sai, nên kết hợp với giá cả.

  4. Bước đột phá giả có thể gây ra sự ra sân, nhưng sẽ sớm trở lại, nên thiết lập dừng thiệt hại hợp lý.

  5. Điểm dừng lỗ cần được tối ưu hóa liên tục để thích ứng với sự thay đổi của thị trường.

Hướng tối ưu hóa

Có thể tối ưu hóa hơn nữa bằng cách:

  1. Điều chỉnh tham số, kiểm tra hiệu quả của các phương pháp đánh giá xu hướng khác nhau.

  2. Tối ưu hóa các tham số kênh để nó gần với phạm vi dao động thực sự.

  3. Kiểm tra các kết hợp các tham số DM khác nhau và chọn tham số tốt nhất.

  4. Thiết lập các điều kiện nhập cảnh khác nhau, chẳng hạn như lọc khối lượng giao dịch.

  5. Tối ưu hóa chiến lược dừng lỗ, ví dụ như thử theo dõi dừng lỗ để có được nhiều lợi nhuận hơn.

  6. Kiểm tra riêng biệt đối với các giống khác nhau, chọn kết hợp tham số tốt nhất.

Tóm tắt

Chiến lược này sử dụng nhiều chỉ số tổng hợp để xác định hướng xu hướng, hỗ trợ mức áp lực và lực đa không gian, có thể nắm bắt xu hướng và kiểm soát rủi ro một cách hiệu quả. Tuy nhiên, vẫn cần chú ý đến rủi ro và tối ưu hóa các tham số để thích ứng với sự thay đổi của thị trường. Nhìn chung, chiến lược này có tính thực tiễn mạnh mẽ.

Mã nguồn chiến lược
/*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")