Эта стратегия использует индикатор EMA для выявления ценовых тенденций и объединяет стандартное отклонение для расчета сигналов покупки и продажи для тренда после торговли.
Стратегия сначала рассчитывает разницу v между ценой закрытия и EMA длины ema_length. Затем рассчитывает стандартное отклонение dev v за периоды длины ema_length. Далее определяется коэффициент направления k, с k=1 для длины и k=-1 для короткого. Порог сигнала покупки dev_limit рассчитывается по пределу коэффициента k * dev *. Когда v пересекает деви_лимит, запускается сигнал покупки. Сигнал выхода - когда v пересекает 0.
Стратегия предусматривает два способа:
Купить короткий, пойти длинный, когда v пересекает ниже отрицательного dev_limit, чтобы следовать нисходящему тренду.
Купить длинный, идти длинный, когда v пересекает положительный dev_limit, чтобы следовать восходящему тренду.
В целом, стратегия динамически рассчитывает стандартное отклонение разницы между ценой и EMA для установки порога и следует за тенденциями. Фактор контролирует чувствительность сигналов покупки. Ema_length определяет период EMA. Режим покупки контролирует направление ордера.
Преимущества этой стратегии включают:
EMA хорошо определяет направление тренда путем сглаживания цен.
Динамический порог, основанный на стандартном отклонении, адаптируется лучше, чем фиксированные пороги.
Два способа покупки позволяют следовать восходящему или нисходящему тренду.
Фактор обеспечивает гибкость в настройке чувствительности покупок. ema_length позволяет оптимизировать период EMA.
Логика проста и легко понять и изменить.
Размер позиции может быть гибко настроен для следующего агрессивного тренда.
Риски стратегии:
EMA имеет отставание и может пропустить поворотные моменты тренда.
Неправильные настройки приводят к недостаточной или перечувствительности.
Следующий тренд рискует большими потерями при обратном тренде.
Частые длинные/короткие переключения увеличивают частоту торговли.
Частые сигналы на различных рынках увеличивают затраты.
Для устранения рисков, подумайте о добавлении стоп-лосса, оптимизации параметров, добавлении фильтров для предотвращения переоценки и т.д.
Стратегия может быть оптимизирована путем:
Испытание различных периодов EMA, чтобы найти оптимальную длину.
Испытание различных значений факторов для поиска наилучшей чувствительности.
Оптимизация стратегий размещения позиций, например, пирамиды.
Добавление фильтров, чтобы избежать ошибочных сделок на нестабильных рынках.
Включение стоп-лосса для контроля одиночных потерь.
Оптимизация параметров отдельно для двух режимов покупки.
Исследую сигналы отмены тренда, чтобы остановить следующий тренд.
Стратегия идентифицирует тенденции с EMA и генерирует динамические пороговые ордера для следования тенденциям. Логика проста и ясна. Размер позиции может быть агрессивным для погони за трендом.
/*backtest start: 2023-10-06 00:00:00 end: 2023-11-05 00:00:00 period: 1h basePeriod: 15m 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/ // © Azzrael // Based on EMA and EMA Oscilator https://www.tradingview.com/script/qM9wm0PW-EMA-Oscilator-Azzrael/ // (EMA - close) + Std Dev + Factor = detecting oversell/overbuy // Long only! // Pyramiding - sometimes, depends on ... // There 2 enter strategies in one script // 1 - Classic, buy on entering to OverSell zone (more profitable ~> 70%) // 2 - Crazy, buy on entering to OverBuy zone (catching trend and pyramiding, more net profit) // Exit - crossing zero of (EMA - close) //@version=5 strategy("STR:EMA Oscilator [Azzrael]", overlay=false, margin_long=100, margin_short=100, currency=currency.USD, default_qty_type=strategy.percent_of_equity, default_qty_value=30, pyramiding=3) entry_name="Buy" ema_length = input.int(200, "Period", minval=2, step=10) limit = input.float(1.7, "Factor", minval=1, step=0.1, maxval=10) dno = input.string(defval="Buy on enter to OverSell", title="Model", options=["Buy on enter to OverSell", "Buy on enter to OverBuy"]) == "Buy on enter to OverSell" v = close - ta.ema(close, ema_length) dev = ta.stdev(v, ema_length) k = dno ? -1 : 1 dev_limit = k*dev*limit cond_long = dno ? ta.crossunder(v, dev_limit) : ta.crossover(v, dev_limit) cond_close = ta.cross(v, 0) // dev visualization sig_col = (dno and v <= dev_limit) or (not dno and v >= dev_limit) ? color.green : color.new(color.blue, 80) plot(dev_limit, color=color.green) plot(k*dev, color=color.new(color.blue, 60)) plot(v, color=sig_col ) hline(0) // Make love not war strategy.entry(entry_name, strategy.long, when=cond_long) strategy.close(entry_name, when=cond_close)