Стратегия двойной скользящей средней и супертенденции

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

Обзор

Эта стратегия генерирует торговые сигналы, основанные на перекрестке 21-дневных и 55-дневных скользящих средних, и использует индикатор супертенденции для фильтрации ложных сигналов.

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

Код сначала определяет 21-дневную EMA (EMA1) и 55-дневную EMA (EMA2). Сигнал покупки генерируется, когда EMA1 пересекает EMA2. Сигнал продажи генерируется, когда EMA1 пересекает EMA2.

Для фильтрации ложных сигналов добавляется индикатор супертенденции. Супертенденция рассчитывает направление тренда на основе ATR и последних высоких-низких цен. В коде выше линии супертенденции - восходящий тренд, а ниже - нисходящий тренд.

Таким образом, сигнал покупки генерируется только тогда, когда EMA1 пересекается над EMA2 во время восходящего тренда. Сигнал продажи генерируется только тогда, когда EMA1 пересекается ниже EMA2 во время нисходящего тренда. Супертенд фильтрует ложные сигналы во время переходов тренда.

Кроме того, для определения долгосрочной тенденции добавляются 200-дневные и 233-дневные скользящие средние.

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

  1. Двойные скользящие средние в сочетании с супертенденцией могут эффективно идентифицировать тенденции и фильтровать ложные сигналы.

  2. Настраиваемые скользящие средние параметры позволяют адаптировать стратегию к различным рыночным условиям.

  3. Долгосрочные скользящие средние предотвращают риски от противоречивых тенденций.

  4. Ясные правила для алгоритмической торговли.

  5. Визуальные сигналы покупки/продажи делают торговые решения ясными.

Риски

  1. Движущиеся средние могут генерировать ложные сигналы вокруг поворотных точек.

  2. Неправильное настройка параметров может привести к пропущенным тенденциям или чрезмерным ложным сигналам.

  3. Высокая частота торговли приводит к более высоким затратам на транзакции.

  4. Параметры супертенденции должны быть оптимизированы, чтобы сбалансировать эффективность фильтрации и отставание.

  5. Долгосрочные средние показатели могут отставать в генерировании сигналов.

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

  1. Испытайте различные комбинации скользящих средних для поиска оптимальных параметров.

  2. Оптимизировать параметры супертенденции для сбалансирования фильтрации и отставания.

  3. Добавьте другие показатели, такие как громкость, чтобы подтвердить сигналы.

  4. Включите аналитику настроений и новостей, чтобы определить потенциальные поворотные моменты.

  5. Используйте машинное обучение для динамической оптимизации параметров.

Заключение

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


/*backtest
start: 2022-09-21 00:00:00
end: 2023-09-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

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

//@version=4
strategy("EMA & Supertrend", overlay = true)

//length = input(9, minval=1)
//ema1 = ema(close, length)
//ema2 = ema(ema1, length)
//ema3 = ema(ema2, length)

//shortest = ema(close, 20)
//short = ema(close, 50)
//longer = ema(close, 100)
//longest = ema(close, 200)


//for Ema1
len1 = input(21, minval=1)
//src1 = input(close)
ema1 = ema(close,len1)
plot(ema1, color=color.red, linewidth=1)

//for Ema2
len2 = input(55, minval=1)
//src2 = input(close)
ema2 = ema(close,len2)
plot(ema2, color=color.green, linewidth=1)

//for Ema3
len3 = input(200, minval=1)
//src3 = input(close)
ema3 = ema(close,len3)
plot(ema3, color=color.blue, linewidth=1)

//for Ema4
len4 = input(233, minval=1)
//src4 = input(close)
ema4 = ema(close,len4)
plot(ema4, color=color.black, linewidth=1)


Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=true)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
alertcondition(buySignal, title="SuperTrend Buy", message="SuperTrend Buy!")
alertcondition(sellSignal, title="SuperTrend Sell", message="SuperTrend Sell!")
changeCond = trend != trend[1]
alertcondition(changeCond, title="SuperTrend Direction Change", message="SuperTrend has changed direction!")


//Trading logic

Enterlong = crossover(ema1,ema2) or (close>ema1 and close>ema2 and ema1>ema2) and close>ema4// positive ema crossover
Exitlong = crossunder(close,ema2) // candle closes below supertrend

Entershort = crossunder(ema1,ema2) or (close<ema1 and close<ema2 and ema2<ema1) and close<ema4// negative ema crossover
Exitshort = crossover(close,ema2) // candle closes above supertrend

//Execution Logic - Placing Order

start = timestamp(2008,1,1,0,0)

if time>= start
    strategy.entry("long", strategy.long, when=Enterlong)
    strategy.close("long",when=Exitlong)
//strategy.entry("short",strategy.short,100,when=Entershort)
//strategy.close("short",when=Exitshort)

Больше