Biểu đồ Octa-EMA và Ichimoku Cloud Chiến lược giao dịch định lượng


Ngày tạo: 2023-12-11 14:52:05 sửa đổi lần cuối: 2023-12-11 14:52:05
sao chép: 1 Số nhấp chuột: 737
1
tập trung vào
1621
Người theo dõi

Biểu đồ Octa-EMA và Ichimoku Cloud Chiến lược giao dịch định lượng

Tổng quan

Chiến lược này sử dụng đường trung bình di chuyển chỉ số 8 chu kỳ khác nhau với biểu đồ đám mây Ichimoku làm tín hiệu giao dịch chính và có thể hoạt động hiệu quả trong khung thời gian 1 giờ, 4 giờ hoặc 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:

  1. 8 chỉ số động trung bình (Octa-EMA)

Chiến lược này sử dụng 8 EMA có chu kỳ khác nhau, 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. 8 EMA này được gọi là Octa-EMA. Khi EMA có chu kỳ ngắn hơn biểu thị xu hướng đa đầu trên EMA có chu kỳ dài hơn, thì ngược lại biểu thị xu hướng không đầu.

  1. Chỉ số Ichimoku

Đồ họa đám mây Ichimoku bao gồm các đường chuyển đổi, đường chuẩn, đường chậm và đường dẫn A / B. Đồ họa đám mây chủ yếu xác định hướng xu hướng và cung cấp sức đề kháng hỗ trợ. Khi giá ở phía trên của biểu đồ đám mây là xu hướng đa đầu, ở phía dưới của biểu đồ đám mây là xu hướng không đầu.

Các tín hiệu giao dịch của chiến lược này được tạo ra từ hai thành phần lớn trên. Một tín hiệu mua được tạo ra khi tất cả 8 EMA nằm ở nhiều đầu (tức là EMA ngắn nằm trên EMA dài) và giá cao hơn biểu đồ đám mây của Ichimoku. Một tín hiệu bán được tạo ra khi EMA xếp hàng chuyển sang đầu không (tức là EMA ngắn đi qua EMA dài).

Phân tích lợi thế chiến lược

Chiến lược này có những lợi thế chính như sau:

  1. Sử dụng bộ lọc hai chỉ số để giảm tín hiệu giả
  2. Ichimoku Cloud Graph có thể xác định xu hướng và tránh giao dịch ngược
  3. Điều 8 EMA đánh giá xu hướng chéo, tăng độ chính xác
  4. Có thể chạy trong nhiều chu kỳ thời gian
  5. Các tham số có thể được tối ưu hóa rộng rãi và có thể được tùy chỉnh cho các giống khác nhau

Phân tích rủi ro chiến lược

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 không đầu trong tình huống chấn động
  2. Có thể bạn sẽ bỏ lỡ một số điểm mua.
  3. Có thể không có hiệu lực khi ngắn hạn không phù hợp với xu hướng trung hạn dài hạn
  4. Cài đặt tham số EMA không chính xác có thể gây ra sự chậm trễ tín hiệu

Đối với các rủi ro trên, bạn có thể làm giảm rủi ro bằng cách điều chỉnh các tham số EMA hoặc tối ưu hóa các điều kiện nhập học, hoặc kết hợp với các chỉ số khác như hỗ trợ.

Hướng tối ưu hóa chiến lược

Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:

  1. Điều chỉnh tham số EMA, tối ưu hóa chu kỳ tương ứng
  2. Tăng các chỉ số đánh giá trung bình, đảm bảo tính chính xác của xu hướng
  3. Kết hợp các chỉ số khác như MACD, KDJ, để tối ưu hóa thời gian nhập cảnh
  4. Tăng chiến lược dừng lỗ, kiểm soát lỗ hổng đơn lẻ
  5. Kiểm tra hiệu quả của các tham số khác nhau để tìm kiếm sự kết hợp tốt nhất
  6. Sử dụng thuật toán học máy để tự động tìm các tham số ưu tiên

Tóm tắt

Octa-EMA là một chiến lược theo dõi xu hướng ổn định và đáng tin cậy hơn so với chiến lược giao dịch định lượng đám mây Ichimoku. Nó sử dụng cả hai xu hướng phán đoán EMA và tín hiệu lọc Ichimoku, có thể đạt được tỷ lệ sai lầm thấp hơn sau khi tối ưu hóa các tham số. Chiến lược này có thể được áp dụng rộng rãi cho các loại như chứng khoán, ngoại hối, kim loại quý, và có thể hoạt động trong nhiều chu kỳ.

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