Strategi Perdagangan Kuantitatif Carta Awan Octa-EMA dan Ichimoku


Tarikh penciptaan: 2023-12-11 14:52:05 Akhirnya diubah suai: 2023-12-11 14:52:05
Salin: 1 Bilangan klik: 737
1
fokus pada
1621
Pengikut

Strategi Perdagangan Kuantitatif Carta Awan Octa-EMA dan Ichimoku

Gambaran keseluruhan

Strategi ini menggunakan purata bergerak indeks dari 8 kitaran yang berbeza dengan grafik awan Ichimoku sebagai isyarat perdagangan utama, dan boleh beroperasi dengan berkesan dalam 1 jam, 4 jam, atau bingkai masa garis matahari.

Prinsip Strategi

Strategi ini berdasarkan kepada dua prinsip utama:

  1. 8 indeks purata bergerak ((Octa-EMA)

Strategi ini menggunakan 8 EMA yang berbeza, iaitu garis 5, 11, 15, 18, 21, 24, 28, dan 34. EMA 8 ini dikenali sebagai Octa-EMA . EMA yang lebih pendek menunjukkan trend multi-kepala apabila berada di atas EMA yang lebih panjang, sebaliknya menunjukkan trend kosong.

  1. Indeks Awan Ichimoku

Carta awan Ichimoku mengandungi garis peralihan, garis asas, garis kelewatan dan garis utama A / B. Carta awan terutamanya menentukan arah trend dan memberikan rintangan sokongan. Apabila harga berada di atas carta awan adalah trend multihead, di bawah carta awan adalah trend kepala kosong.

Isyarat perdagangan strategi ini berasal dari dua komponen utama di atas. Isyarat beli dihasilkan apabila semua 8 EMA berada dalam susunan berbilang kepala (EMA pendek di atas EMA panjang) dan harga lebih tinggi daripada grafik awan Ichimoku. Isyarat jual dihasilkan apabila susunan EMA beralih ke kepala kosong (EMA pendek di bawah EMA panjang).

Analisis kelebihan strategi

Strategi ini mempunyai kelebihan utama:

  1. Menggunakan penapisan ganda untuk mengurangkan isyarat palsu
  2. Ichimoku Cloud Graph Memahami Arah Trend dan Mengelakkan Perdagangan Berlawanan
  3. Artikel 8 EMA Meningkatkan ketepatan penilaian trend dalam portfolio silang
  4. Berfungsi dalam pelbagai tempoh masa
  5. Ruang untuk mengoptimumkan parameter yang besar, boleh disesuaikan untuk pelbagai jenis

Analisis risiko strategi

Strategi ini juga mempunyai risiko:

  1. Isyarat udara yang lebih tinggi mungkin dihasilkan dalam keadaan gegaran
  2. Syarat pembelian lebih ketat, mungkin terlepas beberapa titik pembelian
  3. Mungkin tidak berkesan apabila jangka pendek tidak selaras dengan trend jangka panjang
  4. Tetapan parameter EMA yang tidak betul boleh menyebabkan kelewatan isyarat

Untuk risiko di atas, risiko boleh dikurangkan dengan menyesuaikan parameter EMA atau mengoptimumkan syarat kemasukan, atau ia boleh digabungkan dengan petunjuk lain sebagai bantuan.

Arah pengoptimuman strategi

Strategi ini boleh dioptimumkan dalam beberapa aspek:

  1. Sesuaikan parameter EMA untuk mengoptimumkan kitaran yang sesuai
  2. Menambah pengukuran pengukuran rata-rata untuk memastikan keakuratannya
  3. Gabungan MACD, KDJ dan lain-lain untuk optimumkan masa kemasukan
  4. Meningkatkan strategi penangguhan kerugian dan mengawal kerugian tunggal
  5. Menguji kesan parameter yang berbeza untuk mencari kombinasi parameter yang terbaik
  6. Menggunakan algoritma pembelajaran mesin untuk mencari parameter keunggulan secara automatik

ringkaskan

Octa-EMA adalah strategi pelacakan trend yang lebih stabil dan boleh dipercayai daripada strategi perdagangan kuantitatif awan Ichimoku secara keseluruhan. Ia menggunakan gabungan EMA untuk menilai trend dan isyarat penapis Ichimoku, dengan parameter yang dioptimumkan untuk mendapatkan kadar kesalahan yang lebih rendah.

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