Chiến lược kênh biến động đột phá kép

Tác giả:ChaoZhang, Ngày: 2024-01-31 10:24:00
Tags:

img

Tổng quan

Chiến lược kênh biến động đột phá kép tính toán các dải giữa, trên và dưới của kênh và sử dụng các chỉ số xu hướng và khối lượng để xác định hướng và động lực của thị trường. Nó đặt tín hiệu đột phá ở cả hai bên của kênh để đạt được mục tiêu mua thấp và bán cao.

Chiến lược logic

Chỉ số cốt lõi của chiến lược này là kênh biến động dựa trên thống kê của các đường nến. Dải giữa áp dụng thuật toán trung bình động và các dải trên và dưới áp dụng phương pháp phạm vi trung bình thực sự để nắm bắt năng động ranh giới của biến động giá. Đồng thời, chiến lược kết hợp các tiêu chí DMI và khối lượng để tránh đột phá sai.

Cụ thể, khi giá vượt qua đường ray dưới vào kênh, đường +DI của DMI vượt quá đường -DI và điểm chuẩn ADX được đặt, và khối lượng giao dịch tăng lên, một tín hiệu mua được tạo ra. Ngược lại, khi giá vượt qua kênh xuống từ đường ray trên, các quy tắc phán đoán ngược lại với điều trên, tạo ra một tín hiệu bán.

Phân tích lợi thế

Lợi thế lớn nhất của chiến lược này là nắm bắt được hướng đột phá chính của giá. Phán quyết đột phá kép có thể tránh hiệu quả các thị trường bên cạnh và sốc và giảm số lượng dừng lỗ. So với các chiến lược trung bình động đơn giản, phán quyết đột phá kênh biến động thích nghi hơn với biến động giá.

Ngoài ra, việc đưa ra các chỉ số phụ trợ DMI và khối lượng cũng đóng một vai trò lọc tốt, tránh các tín hiệu sai.

Phân tích rủi ro

Rủi ro lớn nhất của chiến lược phá vỡ kép là nó không thể đánh giá sự đảo ngược thị trường. Nếu một sự đảo ngược hình chữ V xảy ra trên thị trường, điểm dừng lỗ có thể dễ dàng được kích hoạt. Ngoài ra, cài đặt tham số không đúng cũng có thể ảnh hưởng tiêu cực đến hệ thống giao dịch.

Để giải quyết rủi ro, chúng ta có thể tối ưu hóa thêm các thiết lập tham số và thu hẹp các lỗ dừng để giảm rủi ro.

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

Chiến lược cũng có tiềm năng tối ưu hóa lớn, có thể được cải thiện trong các khía cạnh sau:

  1. Tối ưu hóa tham số, chẳng hạn như điều chỉnh chi tiết chiều dài DI và ADX của DMI, cài đặt thời gian và nhân của các kênh biến động, v.v.

  2. Tăng các điều kiện lọc, chẳng hạn như kết hợp MACD và các chỉ số khác để tránh đột phá sai

  3. Thực hiện theo dõi tự động lợi nhuận và dừng lỗ để kiểm soát rủi ro hơn nữa

  4. Tối ưu hóa cài đặt tham số và các quy tắc lọc cho các sản phẩm khác nhau

Tóm lại

Nhìn chung, chiến lược kênh biến động đột phá kép là một hệ thống đột phá hiệu quả. Nó có thể xác định hiệu quả hướng và động lực xu hướng chính, và có tiềm năng lớn trong tối ưu hóa và kiểm soát rủi ro. Nếu được cải thiện và tối ưu hóa một cách có hệ thống, chiến lược có thể kiếm được lợi nhuận ổn định trong dài hạn.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Original Idea by: Wunderbit Trading

//@version=5
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.int(46, 'Period', step=1)

leadLine1 = ta.ema(close, ribbon_period)
leadLine2 = ta.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.int(81, step=1, minval=1)
mult = input.float(2.5, step=0.1)

// Calculate Keltner Channel
ma = ta.sma(source, length)
range_1 = useTrueRange ? ta.tr : high - low
rangema = ta.sma(range_1, length)
upper = ma + rangema * mult
lower = ma - rangema * mult

plot(ma, title='Middle', color=color.new(color.orange, 0))
p1 = plot(upper, title='Upper', color=color.new(color.orange, 0))
p2 = plot(lower, title='Lower', color=color.new(color.orange, 0))
fill(p1, p2, transp=90)


// 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 = ta.change(high)
    down = -ta.change(low)
    truerange = ta.rma(ta.tr, len)
    plus = fixnan(100 * ta.rma(up > down and up > 0 ? up : 0, len) / truerange)
    minus = fixnan(100 * ta.rma(down > up and down > 0 ? down : 0, len) / truerange)
    [plus, minus]

adx(dilen, adxlen) =>
    [plus, minus] = dirmov(dilen)
    sum = plus + minus
    adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
    [adx, plus, minus]

[sig, up, down] = adx(dilen, adxlen)

benchmark = input.int(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.float(4.5, title='Long Take Profit 1 %', step=0.1) / 100
long_tp1_qty = input.int(15, title='Long Take Profit 1 Qty', step=1)

long_tp2_inp = input.float(20, title='Long Take Profit 2%', step=0.1) / 100
long_tp2_qty = input.int(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.float(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 = ta.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', direction=strategy.long, 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.new(color.green, 0), linewidth=1, title='1st Long Take Profit')
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.new(color.green, 0), linewidth=1, title='2nd Long Take Profit')
plot(strategy.position_size > 0 ? long_stop_level : na, style=plot.style_linebr, color=color.new(color.red, 0), linewidth=1, title='Long Stop Loss')



Thêm nữa