Эта стратегия называется
Вычислите индикатор DEMA. DEMA - это двойная экспоненциальная скользящая средняя с использованием двойных EMA, которые могут фильтровать краткосрочный рыночный шум и улучшать точность сигнала.
Вычислить индикатор EMA. EMA - это экспоненциальная скользящая средняя, которая быстрее реагирует на изменения цен.
Вычислить индекс волатильности ATR. ATR измеряет волатильность рынка и уровни риска. Повышение ATR представляет собой увеличение волатильности и более высокую вероятность краткосрочных спадов.
Когда DEMA переходит ниже EMA, а ATR поднимается выше порога, это сигнализирует о начале краткосрочного нисходящего тренда и увеличении рыночного риска.
Когда DEMA снова пересекает EMA, это сигнализирует о ценовой поддержке и подъеме.
Сочетание двойной EMA и EMA может эффективно улучшить точность сигнала.
Фильтр волатильности ATR устраняет низкорисковые сделки.
Краткий период хранения подходит для краткосрочного отслеживания импульса и избегает длительного хеджирования.
Простая и понятная логика, легко понятная и реализуемая.
Неправильные параметры ATR могут упустить торговые возможности.
Необходимо одновременно отслеживать длинные и короткие сигналы, что увеличивает сложность работы.
Влияние краткосрочной волатильности рынка.
Решение: оптимизация параметров с помощью обратного тестирования. Упрощение логики, чтобы сосредоточиться на одной стороне. Расслабление уровней остановки потерь соответствующим образом.
Оптимизируйте параметры для DEMA и EMA, чтобы найти лучшие комбинации.
Оптимизировать период обратного обзора ATR для определения оптимального эталона волатильности.
Добавьте другие индикаторы, такие как полосы BOLL, чтобы улучшить точность сигнала.
Введите правила стоп-лосса и получения прибыли, чтобы получить более стабильную прибыль.
Эта стратегия создает простую, но эффективную краткосрочную торговую систему с использованием DEMA, EMA кроссоверов и индекса волатильности ATR. Чистая логика и простота работы делают ее подходящей для высокочастотного импульсного трейдинга. Дальнейшая оптимизация параметров и логики может потенциально привести к более устойчивой производительности.
/*backtest start: 2023-12-08 00:00:00 end: 2024-01-07 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/ // © Qorbanjf //@version=4 // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Qorbanjf //@version=4 strategy("Qorban: DEMA/EMA & VOL Short ONLY", shorttitle="DEMA/EMA & VOL SHORT", overlay=true) // DEMA length = input(10, minval=1, title="DEMA LENGTH") src = input(close, title="Source") e1 = ema(src, length) e2 = ema(e1, length) dema1 = 2 * e1 - e2 plot(dema1, "DEMA", color=color.yellow) //EMA len = input(25, minval=1, title="EMA Length") srb = input(close, title="Source") offset = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500) ema1 = ema(srb, len) plot(ema1, title="EMA", color=color.blue, offset=offset) // get ATR VALUE atr = atr(14) //ATRP (Average True Price in precentage) // Inputs atrTimeFrame = input("D", title="ATR Timeframe", type=input.resolution) atrLookback = input(defval=14,title="ATR Lookback Period",type=input.integer) useMA = input(title = "Show Moving Average?", type = input.bool, defval = true) maType = input(defval="EMA", options=["EMA", "SMA"], title = "Moving Average Type") maLength = input(defval = 20, title = "Moving Average Period", minval = 1) slType = input(title="Stop Loss ATR / %", type=input.float, defval=5.0, step=0.1) slMulti = input(title="SL Multiplier", type=input.float, defval=1.0, step=0.1) minimumProfitPercent = input(title="Minimum profit %", type=input.float, defval=20.00) // ATR Logic // atrValue = atr(atrLookback) // atrp = (atrValue/close)*100 // plot(atrp, color=color.white, linewidth=2, transp = 30) atrValue = security(syminfo.tickerid, atrTimeFrame, atr(atrLookback)) atrp = (atrValue/close)*100 // Moving Average Logic ma(maType, src, length) => maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc) maFilter = security(syminfo.tickerid, atrTimeFrame, ma(maType, atrp, maLength)) // Determine percentage of open profit var entry = 0.0 distanceProfit = low - entry distanceProfitPercent = distanceProfit / entry //Determin if we have a long entry signal OR a sell position signal profitSignal = minimumProfitPercent == 0.0 or distanceProfitPercent >= minimumProfitPercent shortSignal = crossunder(dema1, ema1) and atrp > maFilter and strategy.position_size == 0 and not na(atr) exitSignal = profitSignal and strategy.position_size !=0 and crossover(dema1, ema1) // === INPUT BACKTEST RANGE === //FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) //FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) //FromYear = input(defval = 2017, title = "From Year", minval = 2000) //ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) //ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) //ToYear = input(defval = 9999, title = "To Year", minval = 2017) //Invert trade direction & flipping //tradInvert = input(defval = false, title = "invert trade direction") //MOM_MR = input(defval=1, title = "MOM = 1 / MR = -1", minval=-1, maxval=1) //plots=input(false, title="Show plots?") // Get stop loss (in pips AND percentage distance) shortStop = highest(high, 4) - (atr * slMulti) shortStopPercent = close - (close * slMulti) // Save long stop & target prices (used for drawing data to the chart & deetermining profit) var shortStopSaved = 0.0 var shortTargetSaved = 0.0 enterShort = false if shortSignal shortStopSaved := slType ? shortStop : shortStopPercent enterShort:= true entry := close // long conditions //enterLong = crossover(dema1, ema1) and atrp < maFilter //exitSignal => crossunder(dema1, ema1) //Enter trades when conditions are met strategy.entry("short", strategy.short, when=enterShort, comment="SHORT") //place exit orders (only executed after trades are active) strategy.exit(id="Short exit", from_entry="short", limit=exitSignal ? close : na, stop=shortStopSaved, when=strategy.position_size > 0, comment="end short") //short strategy //goShort() => crossunder(dema1, ema1) and atrp > maFilter //KillShort() => crossover(dema1, ema1) //strategy.entry("SHORT", strategy.short, when = goShort()) //strategy.close("COVER", when = KillShort())