Эта стратегия реализует типичную тройную экспоненциальную скользящую среднюю (EMA) торговую систему. Она генерирует торговые сигналы путем сравнения быстрой 5-дневной EMA, средней 20-дневной EMA и медленной 50-дневной EMA. Она также использует текущую цену закрытия барьера по сравнению с предыдущими барьерами, чтобы отфильтровать поддельные сигналы. Кроме того, для блокировки прибыли используется стоп-лосс.
Когда 5-дневная EMA пересекает 20-дневную EMA, и все три EMA выравниваются в сторону роста (5-дневная EMA > 20-дневная EMA > 50-дневная EMA), а текущий запуск барьера находится выше предыдущих барьерных значений, закрытых рядом с определенными тиками, перейти в длинный курс. Когда 5-дневная EMA пересекает ниже 20-дневной EMA, и все три EMA выравниваются медвежьим образом (5-дневная EMA < 20-дневная EMA < 50-дневная EMA), и текущий запуск барьера находится ниже предыдущих барьерных значений, закрытых рядом с определенными тиками, перейти в короткий курс.
После входа, когда цена достигает определенных значений, будет инициирована последняя остановка потери, чтобы продолжать корректировать остановку потери на основе колебаний цен, чтобы зафиксировать большую прибыль.
Использование тройной EMA для генерации сигналов может эффективно фильтровать шум рынка и идентифицировать тенденции.
Сопоставление текущего закрытия с предыдущими закрытиями фильтрует ложные сигналы и сокращает ненужные сделки.
Следующая стоп-лосс динамически регулирует стоп-лосс на основе движения цены для максимизации блокировки прибыли.
Гибкие настройки параметров этой стратегии позволяют оптимизировать различные продукты и временные рамки от ежедневных до минутных баров.
Частые перекрестки EMA могут привести к чрезмерной торговле на различных рынках, увеличению затрат на комиссионные и сдвиг.
Следующая стоп-лосс может преждевременно выйти из тренда во время огромных ударов.
Отставание по EMA может привести к отсутствию важных поворотных моментов и потерям.
Такие параметры, как периоды EMA, остановки, требуют оптимизации для различных продуктов и временных рамок.
Включите другие индикаторы, такие как MACD, KD, чтобы отфильтровать торговые сигналы.
Испытать и оптимизировать параметры для конкретных продуктов и временных рамок, чтобы найти лучшие комбинации.
Динамически регулируйте параметры с помощью человеческого контроля или машинного обучения.
Подумайте об отключении отслеживания остановки и сохранении полной позиции для конкретных рыночных условий.
Заменить простые стоп-лосс на более продвинутые механизмы автоматического получения прибыли.
Эта стратегия объединяет три распространенных метода технического анализа - EMA кроссовер, ценовой прорыв и отслеживание стоп-лосса в довольно всеобъемлющую и надежную торговую систему, следующую за трендом. Благодаря оптимизации параметров она может быть адаптирована к различным продуктам и временным рамкам и хорошо работает на сильно развивающихся рынках.
/*backtest start: 2023-10-01 00:00:00 end: 2023-10-02 12:00:00 period: 1m basePeriod: 1m 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/ // © Matt Dearden - IndoPilot // @version=4 /////////////////////////////////////////////////////// Initial Parameters /////////////////////////////////////////////////////// SystemName = "Triple EMA Strategy" ShortSystemName = "TEMA" InitPosition = 0 InitCapital = 50000 InitCommission = 0.004 //approx value to compensate for Oanda spreads InitPyramidMax = 0 CalcOnorderFills = true strategy(title=SystemName, shorttitle=ShortSystemName, overlay=true, pyramiding=InitPyramidMax, default_qty_type=strategy.cash, default_qty_value=InitPosition, commission_type=strategy.commission.percent, commission_value=InitCommission, initial_capital=InitCapital, max_lines_count=500, max_labels_count=500, process_orders_on_close=false, calc_on_every_tick=false) ///////////////////////////////////////////////////////////// Inputs ///////////////////////////////////////////////////////////// DateFilter = input(false, "═════ Data Filtering ═════") InitYear = input(title="Year", type=input.integer, defval=2021, minval=2000, maxval=2021) InitMonth = input(title="Month (0=ALL)", type=input.integer, defval=0, minval=0, maxval=12) InitStopLoss = input(title="Stop Loss (ticks)", type=input.integer, defval=100, minval=0, maxval=1000) TrailingStopLoss = input(title="Trailing S/L (ticks)", type=input.integer, defval=130, minval=0, maxval=1000) InitBuffer = input(title="Buffer (ticks)", type=input.integer, defval=15, minval=0, maxval=1000) InitEMA1 = input(title="EMA 1", type=input.integer, defval=5, minval=0, maxval=1000) InitEMA2 = input(title="EMA 2", type=input.integer, defval=20, minval=0, maxval=1000) InitEMA3 = input(title="EMA 3", type=input.integer, defval=50, minval=0, maxval=1000) //////////////////////////////////////////////////////////// Variables /////////////////////////////////////////////////////////// var StopLoss = float(0.0) var StartPrice = float(0.0) //setup multipliers and catch JPY difference Multiplier = syminfo.currency == "JPY" ? 10 : 1000 //get the daily exchange rate from yesterday //X_rate = security(AccountCurrency+syminfo.currency, "D", close[1]) OrderQty = 1 Buffer = InitBuffer / (Multiplier * 100) /////////////////////////////////////////////////////// Triple EMA Strategy ////////////////////////////////////////////////////// EMA1 = ema(close, InitEMA1) EMA2= ema(close, InitEMA2) EMA3 = ema(close, InitEMA3) //entry conditions longCondition = crossover(EMA1, EMA2) and close > EMA3 and EMA1 > EMA3 and EMA2 > EMA3 and close > (close[1] + Buffer) shortCondition = crossunder(EMA1, EMA2) and close < EMA3 and EMA1 < EMA3 and EMA2 < EMA3 and close < (close[1] - Buffer) /////////////////////////////////////////////////////// Trailing Stoploss //////////////////////////////////////////////////////// if (strategy.position_size > 0 and (close > (StartPrice + (TrailingStopLoss / (100 * Multiplier))))) StopLoss := max(StopLoss, close - (TrailingStopLoss / (100 * Multiplier))) strategy.exit("Long Stoploss", "Long") if (strategy.position_size < 0 and (close < (StartPrice - (InitStopLoss / (100 * Multiplier))))) StopLoss := min(StopLoss, close + (TrailingStopLoss / (100 * Multiplier))) strategy.exit("Short Stoploss", "Short") ///////////////////////////////////////////////////////// Setup entries ///////////////////////////////////////////////////////// if (longCondition) StartPrice := close StopLoss := StartPrice - (InitStopLoss / (100 * Multiplier)) strategy.entry("Long", strategy.long, qty=OrderQty) strategy.exit("Long Stoploss", "Long") if (shortCondition) StartPrice := close StopLoss := StartPrice + (InitStopLoss / (100 * Multiplier)) strategy.entry("Short", strategy.short, qty=OrderQty) strategy.exit("Short Stoploss", "Short") ///////////////////////////////////////////////////////// Draw the EMAs ///////////////////////////////////////////////////////// plot(EMA1, "EMA1", color=#00FF00) plot(EMA2, "EMA2", color=#FF0000) plot(EMA3, "EMA3", color=#4040FF)