Octa-EMA dan Ichimoku Cloud Strategi Dagangan Kuantitatif

Penulis:ChaoZhang, Tarikh: 2023-12-11 14:52:05
Tag:

img

Ringkasan

Strategi ini menggunakan 8 purata bergerak eksponensial (EMA) dari tempoh yang berbeza dan awan Ichimoku sebagai isyarat perdagangan utama, yang boleh berjalan dengan berkesan dalam jangka masa sejam, 4 jam atau harian.

Prinsip Strategi

Prinsip-prinsip utama strategi ini adalah berdasarkan dua bahagian berikut:

  1. 8 Purata Bergerak Eksponensial (Octa-EMA)

    Strategi ini menggunakan 8 EMA dengan tempoh yang berbeza, khususnya 5 hari, 11 hari, 15 hari, 18 hari, 21 hari, 24 hari, 28 hari dan 34 hari.

  2. Awan Ichimoku

    Awan Ichimoku mengandungi garisan penukaran, garis asas, jangka masa kelewatan dan jangkaan utama A / B. Awan ini terutamanya menilai arah trend dan menyediakan sokongan / rintangan. Apabila harga di atas awan, ia menunjukkan aliran naik, dan apabila di bawah awan, ia menunjukkan aliran turun.

Isyarat dagangan untuk strategi ini berasal dari gabungan dua komponen di atas. Isyarat beli dihasilkan apabila semua 8 EMA berada dalam susunan uptrend (EMA pendek di atas EMA panjang) dan harga berada di atas awan Ichimoku. Isyarat jual dihasilkan apabila susunan EMA bertukar ke downtrend (EMA pendek melintasi di bawah EMA panjang).

Analisis Kelebihan

Kelebihan utama strategi ini ialah:

  1. Mengurangkan isyarat palsu melalui penapisan penunjuk berganda
  2. Awan Ichimoku menilai arah trend, mengelakkan perdagangan kontra-trend
  3. 8 EMA crossovers menggabungkan untuk menentukan trend dengan ketepatan yang lebih tinggi
  4. Boleh berjalan pada pelbagai jangka masa
  5. Ruang penyesuaian parameter yang besar, boleh disesuaikan untuk produk yang berbeza

Analisis Risiko

Strategi ini juga mempunyai beberapa risiko:

  1. Boleh menghasilkan lebih banyak isyarat jual palsu semasa pasaran terhad julat
  2. Syarat pembelian yang ketat mungkin kehilangan beberapa peluang pembelian
  3. Mungkin gagal apabila trend jangka pendek dan jangka menengah bertentangan
  4. Penyesuaian parameter EMA yang buruk boleh menyebabkan kelewatan isyarat

Untuk menangani risiko ini, parameter boleh diselaraskan atau syarat kemasukan dapat dioptimumkan untuk mengurangkan risiko.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam beberapa aspek:

  1. Sesuaikan parameter EMA untuk mencari tempoh optimum
  2. Menambah penunjuk penentu trend untuk memastikan penilaian trend yang tepat
  3. Menggabungkan penunjuk tambahan seperti MACD, KDJ untuk meningkatkan masa kemasukan
  4. Tambah stop loss/take profit kepada kawalan bagi setiap risiko perdagangan
  5. Parameter ujian di pelbagai produk untuk mencari kesesuaian terbaik
  6. Gunakan pembelajaran mesin untuk mengoptimumkan parameter secara automatik

Kesimpulan

Secara keseluruhan, strategi awan Octa-EMA dan Ichimoku adalah sistem trend yang agak stabil dan boleh dipercayai. Ia menggunakan persilangan EMA untuk menentukan trend dan Ichimoku untuk menapis isyarat, memberikan isyarat palsu yang rendah apabila dioptimumkan. Strategi ini boleh digunakan secara meluas pada indeks, forex, logam dan lain-lain pada pelbagai jangka masa. Dengan menggabungkan stop loss / mengambil keuntungan dan mengesahkan penunjuk, kadar kemenangan dan keuntungan dapat ditingkatkan lagi.


/*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')





Lebih lanjut