Осиллятор MACD со стратегией перекрестного использования EMA

Автор:Чао Чжан, Дата: 2023-09-23 15:24:12
Тэги:

Обзор

Это простая, но эффективная торговая стратегия, сочетающая в себе осциллятор MACD и кроссовер EMA. В настоящее время настроена на 4 часа свечей, но адаптируется к другим временным рамкам.

Логика стратегии

Ключевыми компонентами являются:

  1. MACD: Осуждение изменений динамики цен.

  2. EMA: определение направления ценового тренда.

  3. Временное условие: определение периода действия стратегии.

  4. Длинный/короткий вариант: выбор длинного или короткого направления.

Правила торговли:

  1. Длинный/короткий выход: при закрытии выше EMA, гистограмма MACD положительная, а текущая свеча выше предыдущей свечи.

  2. Короткий/длинный выход: при закрытии ниже EMA, гистограмма MACD отрицательна, а текущая свеча ниже предыдущей свечи.

Стратегия сочетает в себе тенденции и динамику в простой и эффективной системе.

Преимущества

По сравнению с едиными показателями основными преимуществами являются:

  1. MACD определяет краткосрочную динамику, EMA определяет направление тренда.

  2. Простые и понятные правила, которые легко понять и применить.

  3. Гибкая настройка параметров для различных продуктов и временных рамок.

  4. Опция только для длинной/короткой торговли или двусторонней торговли.

  5. Может определить период действия стратегии, чтобы избежать ненужных сделок.

  6. Устойчивое превосходство на протяжении многих лет.

  7. Контролируемый риск по сделке.

  8. Возможность дальнейшей оптимизации с помощью машинного обучения.

Риски

Несмотря на все преимущества, есть риски:

  1. Широкая настройка параметров может привести к перенастройке.

  2. Никаких остановок, риски неограниченных потерь.

  3. Без фильтра на объем, риск ложных прорывов.

  4. Задержка в поймании трендовых поворотов, не может избежать всех потерь.

  5. Ухудшение производительности из-за изменения рыночных режимов.

  6. Основываясь только на исторических данных, надежность модели является ключевой.

  7. Высокая частота торговли увеличивает затраты на транзакции.

  8. Необходимо следить за соотношением прибыли/риска и кривой собственности.

Усовершенствования

Стратегия может быть усилена путем:

  1. Добавляю фильтр объема, чтобы избежать ложных прорывов.

  2. Использование остановок для контроля потерь на одну сделку.

  3. Оценка эффективности параметров в течение периода времени.

  4. Включение машинного обучения для динамической оптимизации.

  5. Испытания надежности на разных рынках.

  6. Настройка размеров позиций для снижения частоты.

  7. Оптимизация стратегий управления рисками.

  8. Испытание инструментов для увеличения частоты.

  9. Постоянное обратное тестирование для предотвращения перенастройки.

Заключение

В целом, стратегия формирует простую, но мощную систему из комбинации MACD и EMA. Но постоянная оптимизация и тестирование надежности имеют решающее значение для любой стратегии, чтобы адаптироваться к изменяющимся рыночным условиям.


// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © SoftKill21

//@version=4
strategy("My Script", overlay=true)

//heiking ashi calculation
UseHAcandles    = input(false, title="Use Heikin Ashi Candles in Algo Calculations")
//
// === /INPUTS ===

// === BASE FUNCTIONS ===

haClose = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, close) : close
haOpen  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, open) : open
haHigh  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, high) : high
haLow   = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, low) : low

//timecondition
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2020, title = "From Year", minval = 1970)
 //monday and session 
 
// To Date Inputs
toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2021, title = "To Year", minval = 1970)

startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true

//ema data  -- moving average
len = input(9, minval=1, title="Length")
src = input(hl2, title="Source")
out = ema(src, len)
//plot(out, title="EMA", color=color.blue)

//histogram
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=false)

// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal


//main variables to apply conditions are going to be out(moving avg) and hist(macd)

long = haClose > out and haClose > haClose[1] and out > out[1] and hist> 0 and hist[1] < 0 and time_cond
short = haClose < out and haClose < haClose[1] and out < out[1] and hist < 0 and hist[1] > 0 and time_cond

//limit to 1 entry
var longOpeneda = false
var shortOpeneda = false
var int timeOfBuya = na



longCondition= long and not longOpeneda 

if longCondition
    longOpeneda := true
    timeOfBuya := time


longExitSignala = short
exitLongCondition = longOpeneda[1] and longExitSignala

if exitLongCondition
    longOpeneda := false
    timeOfBuya := na


plotshape(longCondition, style=shape.labelup, location=location.belowbar, color=color.green, size=size.tiny, title="BUY", text="BUY", textcolor=color.white)
plotshape(exitLongCondition, style=shape.labeldown, location=location.abovebar, color=color.red, size=size.tiny, title="SELL", text="SELL", textcolor=color.white)

//automatization

longEntry= input(true)
shortEntry=input(false)

if(longEntry)
    strategy.entry("long",strategy.long,when=longCondition)
    strategy.close("long",when=exitLongCondition)

if(shortEntry)
    strategy.entry("short",strategy.short,when=exitLongCondition)
    strategy.close("short",when=longCondition)



Больше