Стратегия EMA по отслеживанию тенденции, подавляющей колебания

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

img

Обзор

Эта стратегия сочетает в себе преимущества трех индикаторов: EMA, Trend Tracking Strategy (TTS) и Schaff Trend Cycle (STC), чтобы сформировать сильную краткосрочную стратегию отслеживания тренда. В частности, стратегия будет оценивать, являются ли сигналы покупки и продажи трех индикаторов последовательными. Если они последовательны, будут генерироваться торговые сигналы; в противном случае не будет совершаться никаких сделок. Это фильтрует некоторые ложные сигналы и делает стратегию более надежной.

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

Стратегия состоит из трех основных частей: индикатор EMA, стратегия отслеживания тенденций TTS и индикатор STC.

Если цена находится ниже этой линии, индикатор EMA дает сигнал продажи: -1; если цена находится выше линии, индикатор EMA дает сигнал покупки: 1.

Во-вторых, вычисляются соответствующие параметры стратегии отслеживания тренда TTS. В соответствии с ценовыми прорывами верхних и нижних рельсов определяется направление тренда рынка. Если цена проходит через верхнюю рельс, генерируется сигнал покупки 1; если цена проходит через нижнюю рельс, генерируется сигнал продажи -1.

Наконец, рассчитывается индикатор цикла тренда Шаффа (STC), который отражает тенденцию изменения консолидации цен. Если индикатор STC повышается, он генерирует сигнал покупки 1; если индикатор STC падает, он генерирует сигнал продажи -1.

После получения сигналов суждения из трех индикаторов, стратегия определит, являются ли они последовательными. Только когда все три индикаторных сигнала суждения являются последовательными, будут генерироваться фактические торговые сигналы. Это может эффективно отфильтровать некоторые ложные сигналы и сделать стратегию более надежной.

После определения генерации торговых сигналов будут открыты длинные или короткие позиции и установлены точки остановки прибыли/стандарты остановки убытков.

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

  1. Стратегия объединяет три различных типа индикаторов для эффективного определения направления тенденции рынка.

  2. Использование последовательности сигналов оценки от трех индикаторов для фильтрации ложных сигналов может уменьшить ненужные сделки и сделать стратегию более надежной.

  3. Установление разумных точек остановки прибыли/остановки убытка может зафиксировать прибыль и предотвратить увеличение потерь.

  4. Оптимизированные параметры подходят для большинства акций и форекс-продуктов.

  5. Простая и понятная логика торговли.

Риски

  1. Несоответствие между показателями может привести к потере торговых возможностей.

  2. Показатель STC чувствителен к параметрам. Разные продукты требуют настройки параметров.

  3. При понижающемся тренде стоп-лосс может быть проникнут, вызывая огромные потери.

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

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

  1. Проверьте больше комбинаций индикаторов, чтобы найти более строгие правила суждения, например, добавив индикатор RSI.

  2. Оптимизировать параметры STC для лучшей адаптации между различными продуктами. Добавить модуль адаптивной оптимизации параметров.

  3. Увеличить адаптивный модуль стоп-потери для оптимизации точек стоп-потери динамически.

  4. Улучшить модуль закрытия позиции, чтобы определить боковые диапазоны и избежать ловушек.

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

Заключение

Стратегия сочетает в себе индикаторы EMA, TTS и STC для определения направления рынка, с последовательными суждениями от всех трех срабатывающих сделок, эффективно отфильтровывая ложные сигналы.


/*backtest
start: 2022-12-05 00:00:00
end: 2023-04-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_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/
// © ajahanbin1374

//@version=5
strategy(title = "EMA + TTS + STC", shorttitle = "EMA + TTS + STC", overlay = true, calc_on_order_fills=false, calc_on_every_tick = false, initial_capital = 100, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.01)

////////////////////////////////////////////////////////////
// Strategy entry
////////////////////////////////////////////////////////////
profit = input.float(defval = 0.1, minval = 0.0, title="Profit %", step=0.01, group = "Strategy") * 0.01

////////////////////////////////////////////////////////////
// Emponential Moving Average
////////////////////////////////////////////////////////////
ema = ta.ema(close, 200)
posEma = close < ema ? -1 : 1

////////////////////////////////////////////////////////////
// Trend Trader Strategy
////////////////////////////////////////////////////////////
Length = input.int(21, minval=1, group="Trend Trader Strategy")
Multiplier = input.float(3, minval=0.000001, group="Trend Trader Strategy")
avgTR = ta.wma(ta.atr(1), Length)
highestC = ta.highest(Length)
lowestC = ta.lowest(Length)
hiLimit = highestC[1] - avgTR[1] * Multiplier
loLimit = lowestC[1] + avgTR[1] * Multiplier
ret = 0.0
posTts = 0.0
ret:= close > hiLimit and close > loLimit ? hiLimit :
         close < loLimit and close < hiLimit ? loLimit : nz(ret[1], close)
posTts:=  close > ret ? 1 :close < ret ? -1 : nz(posTts[1], 0)


////////////////////////////////////////////////////////////
// Schaff Trend Cycle (STC)
////////////////////////////////////////////////////////////
EEEEEE = input.int(12, 'Length', group ="Schaff Trend Cycle")
BBBB = input.int(26, 'FastLength', group ="Schaff Trend Cycle")
BBBBB = input.int(50, 'SlowLength', group ="Schaff Trend Cycle")

AAAA(BBB, BBBB, BBBBB) =>
    fastMA = ta.ema(BBB, BBBB)
    slowMA = ta.ema(BBB, BBBBB)
    AAAA = fastMA - slowMA
    AAAA

AAAAA(EEEEEE, BBBB, BBBBB) =>
    AAA = input.float(0.5, group ="Schaff Trend Cycle")
    var CCCCC = 0.0
    var DDD = 0.0
    var DDDDDD = 0.0
    var EEEEE = 0.0
    BBBBBB = AAAA(close, BBBB, BBBBB)
    CCC = ta.lowest(BBBBBB, EEEEEE)
    CCCC = ta.highest(BBBBBB, EEEEEE) - CCC
    CCCCC := CCCC > 0 ? (BBBBBB - CCC) / CCCC * 100 : nz(CCCCC[1])
    DDD := na(DDD[1]) ? CCCCC : DDD[1] + AAA * (CCCCC - DDD[1])
    DDDD = ta.lowest(DDD, EEEEEE)
    DDDDD = ta.highest(DDD, EEEEEE) - DDDD
    DDDDDD := DDDDD > 0 ? (DDD - DDDD) / DDDDD * 100 : nz(DDDDDD[1])
    EEEEE := na(EEEEE[1]) ? DDDDDD : EEEEE[1] + AAA * (DDDDDD - EEEEE[1])
    EEEEE

mAAAAA = AAAAA(EEEEEE, BBBB, BBBBB)
mColor = mAAAAA > mAAAAA[1] ? color.new(color.green, 20) : color.new(color.red, 20)
posStc = mAAAAA > mAAAAA[1] ? 1 : -1

////////////////////////////////////////////////////////////
// Strategy entry
////////////////////////////////////////////////////////////
pos = posEma == 1 and posTts == 1 and posStc == 1 ? 1 : posEma == -1 and posTts == -1 and posStc == -1 ? -1 : 0

currentPostition = strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0
noOpenPosition = strategy.position_size == 0

signal = pos != pos[1] and pos == 1 and noOpenPosition ? 1 : pos != pos[1] and pos == -1 and noOpenPosition ? -1 : 0

stopPriceForLong = math.min(close * (1 - profit), low[1] * 0.9998, low[2] * 0.9998)
limitPriceForLong = close + (close - stopPriceForLong)
stopPriceForShort = math.max(close * (1 + profit), high[1] * 1.0002, high[2] * 1.0002)
limitPriceForShort = close - (stopPriceForShort - close)

if signal == 1
    strategy.entry(id="L", direction=strategy.long)
    strategy.exit(id='EL', from_entry='L', limit=limitPriceForLong, stop=stopPriceForLong)
if signal == -1
    strategy.entry(id="S", direction=strategy.short)
    strategy.exit(id='ES', from_entry='S', limit=limitPriceForShort, stop=stopPriceForShort)

////////////////////////////////////////////////////////////
// Plots - Debuger
////////////////////////////////////////////////////////////
plotchar(signal, title='singal', char = '')
plotchar(posEma, title='posEma', char = '')
plotchar(posTts, title='posTts', char = '')
plotchar(pos, title='pos', char = '')
plotchar(currentPostition, title = 'currentPostition', char='')
plotchar(stopPriceForLong, title = "stopPriceForLong", char ='')
plotchar(limitPriceForLong, title = 'limitPriceForLong', char='')
plotchar(stopPriceForShort, title = "stopPriceForShort", char ='')
plotchar(limitPriceForShort, title = 'limitPriceForShort', char='')

////////////////////////////////////////////////////////////
// Plots
////////////////////////////////////////////////////////////
plot(ret, color=color.new(color.black, 0), title='Trend Trader Strategy')
plotchar(mAAAAA, color=mColor, title='STC', location = location.bottom, char='-', size=size.normal)
plot(series = ema, title = "ema")


Больше