Octa-EMA und Ichimoku Cloud Quantitative Trading Strategie

Schriftsteller:ChaoZhang, Datum: 2023-12-11 14:52:05
Tags:

img

Übersicht

Diese Strategie verwendet 8 exponentielle gleitende Durchschnitte (EMAs) aus verschiedenen Perioden und die Ichimoku-Cloud als Haupthandelssignale, die in stündlichen, 4-stündigen oder täglichen Zeitrahmen effektiv ausgeführt werden können.

Strategieprinzipien

Die Grundprinzipien dieser Strategie beruhen auf folgenden zwei Teilen:

  1. 8 Exponentielle gleitende Durchschnitte (Octa-EMA)

    Diese Strategie verwendet 8 EMAs mit unterschiedlichen Perioden, insbesondere 5-Tage-, 11-Tage-, 15-Tage-, 18-Tage-, 21-Tage-, 24-Tage-, 28-Tage- und 34-Tage-EMAs. Diese 8 EMAs werden als Octa-EMA bezeichnet.

  2. Ichimoku Wolke

    Die Ichimoku-Wolke enthält die Konversionslinie, Basislinie, Verzögerungsspanne und führende Spannen A / B. Die Wolke beurteilt hauptsächlich die Trendrichtung und bietet Unterstützung / Widerstand. Wenn der Preis über der Wolke liegt, zeigt er einen Aufwärtstrend an, und wenn er unter der Wolke liegt, zeigt er einen Abwärtstrend an.

Die Handelssignale für diese Strategie stammen aus der Kombination der beiden oben genannten Komponenten. Ein Kaufsignal wird erzeugt, wenn alle 8 EMAs in einer Aufwärtstrend-Arrangement (kurzer EMA über längerem EMA) sind und der Preis über der Ichimoku-Wolke liegt. Ein Verkaufssignal wird erzeugt, wenn die EMA-Arrangement in einen Abwärtstrend umkehrt (kurzer EMA unterhalb der längeren EMA kreuzt).

Analyse der Vorteile

Die wichtigsten Vorteile dieser Strategie sind:

  1. Falschsignale durch doppelte Indikatorfilterung reduziert
  2. Ichimoku-Wolke beurteilt die Trendrichtung und vermeidet den Gegentrendhandel
  3. 8 EMA-Crossovers kombinieren sich, um Trends mit höherer Genauigkeit zu bestimmen
  4. Kann in mehreren Zeitrahmen ausgeführt werden
  5. Großer Parameter-Tuning-Raum, kann für verschiedene Produkte anpassen

Risikoanalyse

Diese Strategie birgt auch einige Risiken:

  1. Kann mehr falsche Verkaufssignale während von Bereichsmärkten erzeugen
  2. Strenge Kaufbedingungen können einige Kaufmöglichkeiten verpassen
  3. Kann scheitern, wenn kurzfristige und mittelfristige Trends aufeinander treffen
  4. Schlechte EMA-Parameter-Tuning kann Signalverzögerung verursachen

Um diesen Risiken entgegenzuwirken, können die Parameter angepasst oder die Einstiegsbedingungen optimiert werden, um das Risiko zu verringern.

Optimierungsrichtlinien

Diese Strategie kann in mehreren Aspekten optimiert werden:

  1. Anpassung der EMA-Parameter zur Ermittlung optimaler Perioden
  2. Hinzufügen von Trendindikatoren zur Gewährleistung einer genauen Trendbeurteilung
  3. Einbeziehung zusätzlicher Indikatoren wie MACD, KDJ zur Verbesserung der Eintrittszeit
  4. Zu den Kontrollen pro Handelsrisiko wird Stop-Loss/Take-Profit hinzugefügt
  5. Versuchsparameter für verschiedene Produkte, um die beste Anpassung zu finden
  6. Maschinelles Lernen zur automatischen Optimierung von Parametern

Schlussfolgerung

Insgesamt ist die Octa-EMA- und Ichimoku-Cloud-Strategie ein relativ stabiles und zuverlässiges Trendfolgensystem. Sie verwendet EMA-Kreuzungen, um Trends zu bestimmen, und Ichimoku, um Signale zu filtern, und bietet bei Optimierung geringe falsche Signale. Diese Strategie kann auf Indizes, Forex, Metalle usw. in mehreren Zeitrahmen weit verbreitet angewendet werden. Durch die Einbeziehung von Stop-Loss / Take-Profit und Bestätigungsindikatoren können Gewinnrate und Rentabilität weiter verbessert werden.


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





Mehr