Chiến lược trung bình chuyển động chậm

Tác giả:ChaoZhang, Ngày: 2023-12-07 15:21:45
Tags:

img

Tổng quan

Chiến lược này sử dụng kênh Donchian 24 giai đoạn kết hợp với đường trung bình động 200 giai đoạn như các tín hiệu giao dịch chính.

Chiến lược logic

Lý thuyết chiến lược chủ yếu dựa trên các điểm sau:

  1. Một kênh Donchian được xây dựng bằng cách sử dụng mức cao nhất và thấp nhất trong 24 giai đoạn qua.

  2. Trung bình động 200 thời gian hoạt động như một bộ lọc cho thiên vị dài / ngắn. Nếu giá vượt qua kênh Donchian và ở phía bên kia của trung bình động, một sự đảo ngược có thể xảy ra.

  3. Các tín hiệu vào là:

  • Đường ngắn: Sự đóng cửa của thanh trước là trên dải trên của kênh Donchian và dưới đường MA 200 thời gian.
  • Long: Sự đóng cửa của thanh trước là dưới dải dưới của kênh Donchian và trên MA 200 thời gian.
  1. Stop loss cho các vị trí ngắn được thiết lập ở mức cao nhất trong 3 thanh trước đó. Lợi nhuận lấy được thiết lập ở mức giá nhập trừ 3 lần sự khác biệt giữa giá stop loss và giá nhập.

  2. Ưu điểm của chiến lược này là bằng cách kết hợp kênh Donchian và bộ lọc trung bình động, nó tránh các tín hiệu sai dựa trên một chỉ số duy nhất, cải thiện đáng kể tỷ lệ thắng.

Phân tích lợi thế

Chiến lược có những lợi thế sau:

  1. Tỷ lệ thắng cao: Bằng cách kết hợp kênh Donchian và bộ lọc trung bình động, các lỗ không cần thiết do tín hiệu sai từ một chỉ số duy nhất được tránh.

  2. Rủi ro có thể kiểm soát được: Sử dụng mức cao nhất gần đây / thấp nhất gần đây như mức dừng lỗ để quản lý hiệu quả downside trên các giao dịch thua lỗ. Tỷ lệ 3: 1 lợi nhuận/mất là hấp dẫn.

  3. Đơn giản và dễ thực hiện: Logic sử dụng các chỉ số đơn giản, trực quan dễ hiểu và thực hiện.

  4. Sự vững chắc trên các thị trường và khung thời gian: Với tương đối ít thông số, chiến lược ổn định trên các sản phẩm và khung thời gian khác nhau.

Phân tích rủi ro

Những rủi ro chính đối với chiến lược này là:

  1. Chuyển động thị trường cực đoan: Xu hướng một chiều rất mạnh có thể kích hoạt dừng lỗ gây ra tổn thất khuếch đại. Điều này có thể được giảm thiểu bằng cách mở rộng dừng hoặc giảm kích thước vị trí.

  2. Rủi ro tín hiệu thoát sớm: Ra khỏi các tín hiệu đối nghịch mới có thể gây ra giao dịch quá mức trong các thị trường hỗn loạn do nhập và thoát lặp đi lặp lại.

  3. Rủi ro tối ưu hóa tham số: Chế độ điều chỉnh tham số kém của khoảng thời gian xem lại kênh Donchian hoặc trung bình động có thể dẫn đến tín hiệu chậm hoặc thường xuyên. Điều này có thể được giảm thiểu thông qua tối ưu hóa nghiêm ngặt và thử nghiệm kết hợp.

Cơ hội gia tăng

Chiến lược có thể được cải thiện theo những cách sau:

  1. Tối ưu hóa kênh Donchian và thời gian xem lại trung bình di chuyển để tìm sự kết hợp tốt nhất của các thông số.

  2. Kiểm tra các stop loss khác nhau để lấy tỷ lệ lợi nhuận để cân bằng tỷ lệ thắng so với phần thưởng / rủi ro.

  3. Tích hợp các bộ lọc bổ sung trên các tín hiệu đầu vào bằng cách sử dụng các chỉ số như MACD, RSI v.v. để cải thiện độ bền.

  4. Tối ưu hóa logic ra khỏi để tránh ra khỏi không cần thiết trong thị trường hỗn loạn.

  5. Phát triển các kết hợp mới sử dụng khuôn khổ chiến lược này, ví dụ như với các kênh khác, chỉ số băng tần v.v.

Kết luận

Chiến lược trung bình di chuyển chậm có logic rõ ràng, dễ hiểu bằng cách sử dụng sự kết hợp của kênh Donchian và trung bình di chuyển để tạo tín hiệu. Cách tiếp cận lai này cải thiện đáng kể sự ổn định và tỷ lệ thắng. Tỷ lệ lợi nhuận/mất 3: 1 cũng cung cấp tiềm năng phần thưởng tốt. Trong khi rủi ro tồn tại về chuyển động cực đoan và lỗi tín hiệu, nhiều cơ hội tối ưu hóa có thể cải thiện hiệu suất và mở rộng chiến lược cốt lõi.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Mysteriown

//@version=4

strategy("Lagged Donchian Channel + EMA", overlay = true)

//tradePeriod = time(timeframe.period,"0000-0000:1234567")?true:false


// ------------------------------------------ //
// ----------------- Inputs ----------------- //
// ------------------------------------------ //

period = input(24, title="Channel's periods")
Pema = input(200, title="EMA's periods ?")
ratio = input(3, title="Ratio TP", type=input.float)
loss = input(20, title="Risk Loss ($)")
lev = input(5, title="Leverage *...")
chan = input(title="Plot channel ?", type=input.bool, defval=false)
Bpos = input(title="Plot Bull positions ?", type=input.bool, defval=false)
bpos = input(title="Plot Bear positions ?", type=input.bool, defval=false)
labels = input(title="Plot labels of bets ?", type=input.bool, defval=true)
supp = input(title="Delete last labels ?", type=input.bool, defval=true)


// ------------------------------------------ //
// ---------- Canal, EMA and arrow ---------- //
// ------------------------------------------ //

pema = ema(close,Pema)
plot(pema, title="EMA", color=color.blue)

canalhaut = highest(period)[1]
canalbas = lowest(period)[1]

bear = close[1] > canalhaut[1] and close < open and high > pema
bull = close[1] < canalbas[1] and open < close and low < pema

canalhautplot = plot(chan? canalhaut:na, color=color.yellow)
canalbasplot = plot(chan? canalbas:na, color=color.yellow)

plotshape(bear, title='Bear', style=shape.triangledown, location=location.abovebar, color=color.red, offset=0)
plotshape(bull, title='Bull', style=shape.triangleup, location=location.belowbar, color=color.green, offset=0)


// ------------------------------------------ //
// ------------- Position Short ------------- //
// ------------------------------------------ //

SlShort = highest(3)
BidShort = close[1]

TpShort = BidShort-((SlShort-BidShort)*ratio)
deltaShort = (SlShort-BidShort)/BidShort
betShort = round(loss/(lev*deltaShort)*100)/100
cryptShort = round(betShort*lev/BidShort*1000)/1000

// if bear[1] and labels //and low < low[1]
//     Lbear = label.new(bar_index, na, text="SHORT\n\nSL: " + tostring(SlShort) + "\n\nBid: " + tostring(BidShort) + "\n\nTP: " + tostring(TpShort) + "\n\nMise: " + tostring(betShort) + "\n\nCryptos: " + tostring(cryptShort), color=color.red, textcolor=color.white, style=label.style_labeldown, yloc=yloc.abovebar)
//     label.delete(supp ? Lbear[1] : na)

var bentry=0.0
var bsl=0.0
var btp=0.0

if bear[1] and low < low[1]
    bentry:=BidShort
    bsl:=SlShort
    btp:=TpShort
    
pbentry = plot(bpos? bentry:na, color=color.orange)
plot(bpos? (bentry+btp)/2:na, color=color.gray)
pbsl = plot(bpos? bsl:na, color=color.red)
pbtp = plot(bpos? btp:na, color=color.green)

fill(pbentry,pbsl, color.red, transp=70)
fill(pbentry,pbtp, color.green, transp=70)


// ------------------------------------------ //
// ------------- Position Long -------------- //
// ------------------------------------------ //

SlLong = lowest(3)
BidLong = close[1]

TpLong = BidLong + ((BidLong - SlLong) * ratio)
deltaBull = (BidLong - SlLong)/BidLong
betLong = round(loss/(lev*deltaBull)*100)/100
cryptLong = round(betLong*lev/BidLong*1000)/1000

// if bull[1] and labels //and high > high[1]
//     Lbull = label.new(bar_index, na, text="LONG\n\nSL: " + tostring(SlLong) + "\n\nBid: " + tostring(BidLong) + "\n\nTP: " + tostring(TpLong) + "\n\nMise: " + tostring(betLong) + "\n\nCryptos: " + tostring(cryptLong), color=color.green, textcolor=color.white, style=label.style_labelup, yloc=yloc.belowbar)
//     label.delete(supp ? Lbull[1] : na)

var Bentry=0.0
var Bsl=0.0
var Btp=0.0

if bull[1] and high > high[1]
    Bentry:=BidLong
    Bsl:=SlLong
    Btp:=TpLong
    
pBentry = plot(Bpos?Bentry:na, color=color.orange)
plot(Bpos?(Bentry+Btp)/2:na, color=color.gray)
pBsl = plot(Bpos?Bsl:na, color=color.red)
pBtp = plot(Bpos?Btp:na, color=color.green)

fill(pBentry,pBsl, color.red, transp=70)
fill(pBentry,pBtp, color.green, transp=70)


// ------------------------------------------ //
// --------------- Strategie ---------------- //
// ------------------------------------------ //

Bear = bear[1] and low < low[1]
Bull = bull[1] and high > high[1]

if (Bear and strategy.opentrades==0)
    strategy.order("short", false, 1, limit=BidShort)
    strategy.exit("exit", "short", limit = TpShort, stop = SlShort)

strategy.cancel("short", when = high > SlShort or low < (BidShort+TpShort)/2)
strategy.close("short", when=bull)

if (Bull and strategy.opentrades==0)
    strategy.order("long", true, 1, limit=BidLong)
    strategy.exit("exit", "long", limit = TpLong, stop = SlLong)
    
strategy.cancel("long", when = low < SlLong or high > (BidLong+TpLong)/2)
strategy.close("long", when=bear)


Thêm nữa