Chiến lược giao dịch định lượng của Octa-EMA và Ichimoku Cloud

Tác giả:ChaoZhang, Ngày: 2023-12-11 14:52:05
Tags:

img

Tổng quan

Chiến lược này sử dụng 8 đường trung bình động theo cấp số nhân (EMA) của các giai đoạn khác nhau và đám mây Ichimoku là các tín hiệu giao dịch chính, có thể chạy hiệu quả trong khung thời gian hàng giờ, 4 giờ hoặc hàng ngày.

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

Các nguyên tắc cốt lõi của chiến lược này dựa trên hai phần sau:

  1. 8 Mức trung bình động theo cấp số (Octa-EMA)

    Chiến lược này sử dụng 8 EMA với các khoảng thời gian khác nhau, cụ thể là 5 ngày, 11 ngày, 15 ngày, 18 ngày, 21 ngày, 24 ngày, 28 ngày và 34 ngày.

  2. Đám mây Ichimoku

    Các đám mây Ichimoku chứa đường chuyển đổi, đường cơ sở, trạm trễ và trạm dẫn A / B. Các đám mây chủ yếu đánh giá hướng xu hướng và cung cấp hỗ trợ / kháng cự. Khi giá trên đám mây, nó cho thấy xu hướng tăng, và khi dưới đám mây, nó cho thấy xu hướng giảm.

Các tín hiệu giao dịch cho chiến lược này đến từ sự kết hợp của hai thành phần trên. Một tín hiệu mua được tạo ra khi tất cả 8 EMA đều ở trong một sắp xếp xu hướng tăng (EMA ngắn hơn trên EMA dài hơn) và giá nằm trên đám mây Ichimoku. Một tín hiệu bán được tạo ra khi sắp xếp EMA lật sang xu hướng giảm (EMA ngắn hơn vượt dưới EMA dài hơn).

Phân tích lợi thế

Những lợi thế chính của chiến lược này là:

  1. Giảm tín hiệu sai thông qua lọc chỉ báo kép
  2. Mây Ichimoku đánh giá hướng xu hướng, tránh giao dịch ngược xu hướng
  3. 8 EMA crossover kết hợp để xác định xu hướng với độ chính xác cao hơn
  4. Có thể chạy trên nhiều khung thời gian
  5. Không gian điều chỉnh tham số lớn, có thể tùy chỉnh cho các sản phẩm khác nhau

Phân tích rủi ro

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

  1. Có thể tạo ra nhiều tín hiệu bán sai hơn trong các thị trường giới hạn phạm vi
  2. Điều kiện mua chặt chẽ có thể bỏ lỡ một số cơ hội mua
  3. Có thể thất bại khi xu hướng ngắn hạn và trung hạn xung đột
  4. Điều chỉnh tham số EMA kém có thể gây ra sự chậm trễ tín hiệu

Để giải quyết những rủi ro này, các tham số có thể được điều chỉnh hoặc điều kiện nhập khẩu được tối ưu hóa để giảm rủi ro.

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

Chiến lược này có thể được tối ưu hóa trong một số khía cạnh:

  1. Điều chỉnh các thông số EMA để tìm các khoảng thời gian tối ưu
  2. Thêm các chỉ số xác định xu hướng để đảm bảo đánh giá xu hướng chính xác
  3. Tích hợp các chỉ số bổ sung như MACD, KDJ để cải thiện thời gian nhập cảnh
  4. Thêm stop loss/take profit vào kiểm soát theo rủi ro giao dịch
  5. Các thông số thử nghiệm trên các sản phẩm khác nhau để tìm ra phù hợp nhất
  6. Sử dụng máy học để tự động tối ưu hóa các thông số

Kết luận

Nhìn chung, chiến lược đám mây Octa-EMA và Ichimoku là một hệ thống theo dõi xu hướng tương đối ổn định và đáng tin cậy. Nó sử dụng EMA chéo để xác định xu hướng và Ichimoku để lọc tín hiệu, cung cấp tín hiệu sai thấp khi tối ưu hóa. Chiến lược này có thể được áp dụng rộng rãi trên chỉ số, ngoại hối, kim loại v.v. trong nhiều khung thời gian. Bằng cách kết hợp dừng lỗ / lấy lợi nhuận và xác nhận các chỉ số, tỷ lệ thắng và lợi nhuận có thể được cải thiện hơn nữa.


/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//Fukuiz

strategy(title='Fukuiz Octa-EMA + Ichimoku', shorttitle='Fuku octa strategy', overlay=true, process_orders_on_close=true, 
     default_qty_type= strategy.cash , default_qty_value=1000, currency=currency.USD, initial_capital=10000 ,commission_type = strategy.commission.percent,commission_value=0.25)


//OCTA EMA ##################################################


// Functions
f_emaRibbon(_src, _e1, _e2, _e3, _e4, _e5, _e6, _e7, _e8) =>
    _ema1 = ta.ema(_src, _e1)
    _ema2 = ta.ema(_src, _e2)
    _ema3 = ta.ema(_src, _e3)
    _ema4 = ta.ema(_src, _e4)
    _ema5 = ta.ema(_src, _e5)
    _ema6 = ta.ema(_src, _e6)
    _ema7 = ta.ema(_src, _e7)
    _ema8 = ta.ema(_src, _e8)
    [_ema1, _ema2, _ema3, _ema4, _ema5, _ema6, _ema7, _ema8]

showRibbon = input(true, 'Show Ribbon (EMA)')
ema1Len = input(5, title='EMA 1 Length')
ema2Len = input(11, title='EMA 2 Length')
ema3Len = input(15, title='EMA 3 Length')
ema4Len = input(18, title='EMA 4 Length')
ema5Len = input(21, title='EMA 5 Length')
ema6Len = input(24, title='EMA 6 Length')
ema7Len = input(28, title='EMA 7 Length')
ema8Len = input(34, title='EMA 8 Length')

[ema1, ema2, ema3, ema4, ema5, ema6, ema7, ema8] = f_emaRibbon(close, ema1Len, ema2Len, ema3Len, ema4Len, ema5Len, ema6Len, ema7Len, ema8Len)

//Plot

ribbonDir = ema8 < ema2
p1 = plot(ema1, color=showRibbon ? ribbonDir ? #1573d4 : color.new(#5d606b, 15) : na, linewidth=2, title='EMA 1')
p2 = plot(ema2, color=showRibbon ? ribbonDir ? #3096ff : color.new(#5d606b, 15) : na, linewidth=2, title='EMA 2')
plot(ema3, color=showRibbon ? ribbonDir ? #57abff : color.new(#5d606b, 15) : na, linewidth=2, title='EMA 3')
plot(ema4, color=showRibbon ? ribbonDir ? #85c2ff : color.new(#5d606b, 15) : na, linewidth=2, title='EMA 4')
plot(ema5, color=showRibbon ? ribbonDir ? #9bcdff : color.new(#5d606b, 30) : na, linewidth=2, title='EMA 5')
plot(ema6, color=showRibbon ? ribbonDir ? #b3d9ff : color.new(#5d606b, 30) : na, linewidth=2, title='EMA 6')
plot(ema7, color=showRibbon ? ribbonDir ? #c9e5ff : color.new(#5d606b, 30) : na, linewidth=2, title='EMA 7')
p8 = plot(ema8, color=showRibbon ? ribbonDir ? #dfecfb : color.new(#5d606b, 30) : na, linewidth=2, title='EMA 8')
fill(p1, p2, color.new(#1573d4, 85))
fill(p2, p8, color.new(#1573d4, 85))

//ichimoku##################################################

//color
colorblue = #3300CC
colorred = #993300
colorwhite = #FFFFFF
colorgreen = #CCCC33
colorpink = #CC6699
colorpurple = #6633FF

//switch
switch1 = input(false, title='Chikou')
switch2 = input(false, title='Tenkan')
switch3 = input(false, title='Kijun')

middleDonchian(Length) =>
    lower = ta.lowest(Length)
    upper = ta.highest(Length)
    math.avg(upper, lower)

//Functions
conversionPeriods = input.int(9, minval=1)
basePeriods = input.int(26, minval=1)
laggingSpan2Periods = input.int(52, minval=1)
displacement = input.int(26, minval=1)
Tenkan = middleDonchian(conversionPeriods)
Kijun = middleDonchian(basePeriods)
xChikou = close
SenkouA = middleDonchian(laggingSpan2Periods)
SenkouB = (Tenkan[basePeriods] + Kijun[basePeriods]) / 2

//Plot
A = plot(SenkouA[displacement], color=color.new(colorpurple, 0), title='SenkouA')
B = plot(SenkouB, color=color.new(colorgreen, 0), title='SenkouB')
plot(switch1 ? xChikou : na, color=color.new(colorpink, 0), title='Chikou', offset=-displacement)
plot(switch2 ? Tenkan : na, color=color.new(colorred, 0), title='Tenkan')
plot(switch3 ? Kijun : na, color=color.new(colorblue, 0), title='Kijun')
fill(A, B, color=color.new(colorgreen, 90), title='Ichimoku Cloud')

//Buy and Sell signals
fukuiz = math.avg(ema2, ema8)
white = ema2 > ema8
gray = ema2 < ema8
buycond = white and white[1] == 0
sellcond = gray and gray[1] == 0
bullish = ta.barssince(buycond) < ta.barssince(sellcond)
bearish = ta.barssince(sellcond) < ta.barssince(buycond)
buy = bearish[1] and buycond and fukuiz > SenkouA[displacement] and fukuiz > SenkouB
sell = bullish[1] and sellcond and fukuiz > SenkouA[displacement] and fukuiz > SenkouB
sell2=ema2 < ema8
buy2 = white and fukuiz > SenkouA[displacement] and fukuiz > SenkouB

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//Back test

startYear = input.int(defval=2017, title='Start Year', minval=2000, maxval=3000)
startMonth = input.int(defval=1, title='Start Month', minval=1, maxval=12)
startDay = input.int(defval=1, title='Start Day', minval=1, maxval=31)
endYear = input.int(defval=2023, title='End Year', minval=2000 ,maxval=3000)
endMonth = input.int(defval=12, title='End Month', minval=1, maxval=12)
endDay = input.int(defval=31, title='End Day', minval=1, maxval=31)

start = timestamp(startYear, startMonth, startDay, 00, 00)
end = timestamp(endYear, endMonth, endDay, 23, 59)
period() => time >= start and time <= end ? true : false

if buy2 
    strategy.entry(id='long', direction=strategy.long, when=period(), comment='BUY')

if sell2
    strategy.close(id='long', when=period(), comment='SELL')





Thêm nữa