Окта-ЕМА и стратегия количественной торговли в облаке Ichimoku

Автор:Чао Чжан, Дата: 2023-12-11 14:52:05
Тэги:

img

Обзор

Эта стратегия использует 8 экспоненциальных скользящих средних (EMA) различных периодов и облако Ичимоку в качестве основных торговых сигналов, которые могут эффективно работать в часовые, 4-часовые или ежедневные временные рамки.

Принципы стратегии

Основные принципы этой стратегии основаны на следующих двух частях:

  1. 8 Экспоненциальные скользящие средние (Octa-EMA)

    Эта стратегия использует 8 EMA с различными периодами, в частности 5-дневные, 11-дневные, 15-дневные, 18-дневные, 21-дневные, 24-дневные, 28-дневные и 34-дневные. Эти 8 EMA называются Octa-EMA.

  2. Облако Ичимоку

    Облако Ичимоку содержит линию преобразования, базовую линию, отставание и ведущие протяженности A / B. Облако в основном оценивает направление тренда и обеспечивает поддержку / сопротивление. Когда цена выше облака, она указывает на восходящий тренд, а когда ниже облака, она указывает на нисходящий тренд.

Торговые сигналы для этой стратегии исходят из сочетания двух вышеперечисленных компонентов. Сигнал покупки генерируется, когда все 8 EMA находятся в подъемном тренде (короткая EMA выше длинной EMA) и цена находится выше облака Ичимоку. Сигнал продажи генерируется, когда EMA переворачивается в нисходящий тренд (короткая EMA пересекается ниже длинной EMA).

Анализ преимуществ

Основными преимуществами этой стратегии являются:

  1. Уменьшает количество ложных сигналов с помощью двойной индикаторной фильтрации
  2. Облако Ичимоку определяет направление тренда, избегая торговли против тренда.
  3. 8 кроссоверов EMA объединяются для определения тенденций с большей точностью
  4. Может работать в нескольких временных рамках
  5. Большое пространство настройки параметров, можно настроить для разных продуктов

Анализ рисков

Эта стратегия также сопряжена с некоторыми рисками:

  1. Может генерировать больше ложных сигналов продажи на рынках с диапазоном
  2. Строгие условия покупки могут лишить некоторых покупательских возможностей
  3. Может потерпеть неудачу, когда краткосрочные и среднесрочные тенденции противоречат друг другу
  4. Плохая настройка параметров EMA может вызвать задержку сигнала

Для устранения этих рисков параметры могут быть скорректированы или условия входа оптимизированы для снижения риска.

Руководство по оптимизации

Эта стратегия может быть оптимизирована в нескольких аспектах:

  1. Корректировать параметры EMA для поиска оптимальных периодов
  2. Добавление индикаторов, определяющих тенденции, для обеспечения точной оценки тенденций
  3. Включить дополнительные индикаторы, такие как MACD, KDJ, чтобы улучшить сроки входа
  4. Добавление стоп-лосса/прибыли к контрольному показателю по риску сделки
  5. Параметры испытаний на различных продуктах для определения наилучшего соответствия
  6. Использование машинного обучения для автоматической оптимизации параметров

Заключение

В целом, стратегия Octa-EMA и Ichimoku Cloud является относительно стабильной и надежной системой, следующей за трендом. Она использует кроссоверы EMA для определения трендов и Ichimoku для фильтрации сигналов, обеспечивая низкие ложные сигналы при оптимизации. Эта стратегия может широко применяться к индексам, форекс, металлам и т. Д. В нескольких временных рамках.


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





Больше