Стратегия импульса на основе перекрестного использования DEMA и EMA с фильтром волатильности ATR

Автор:Чао Чжан, Дата: 2024-01-08 14:14:57
Тэги:

img

I. Обзор стратегии

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

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

  1. Вычислите индикатор DEMA. DEMA - это двойная экспоненциальная скользящая средняя с использованием двойных EMA, которые могут фильтровать краткосрочный рыночный шум и улучшать точность сигнала.

  2. Вычислить индикатор EMA. EMA - это экспоненциальная скользящая средняя, которая быстрее реагирует на изменения цен.

  3. Вычислить индекс волатильности ATR. ATR измеряет волатильность рынка и уровни риска. Повышение ATR представляет собой увеличение волатильности и более высокую вероятность краткосрочных спадов.

  4. Когда DEMA переходит ниже EMA, а ATR поднимается выше порога, это сигнализирует о начале краткосрочного нисходящего тренда и увеличении рыночного риска.

  5. Когда DEMA снова пересекает EMA, это сигнализирует о ценовой поддержке и подъеме.

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

  1. Сочетание двойной EMA и EMA может эффективно улучшить точность сигнала.

  2. Фильтр волатильности ATR устраняет низкорисковые сделки.

  3. Краткий период хранения подходит для краткосрочного отслеживания импульса и избегает длительного хеджирования.

  4. Простая и понятная логика, легко понятная и реализуемая.

IV. Риски

  1. Неправильные параметры ATR могут упустить торговые возможности.

  2. Необходимо одновременно отслеживать длинные и короткие сигналы, что увеличивает сложность работы.

  3. Влияние краткосрочной волатильности рынка.

Решение: оптимизация параметров с помощью обратного тестирования. Упрощение логики, чтобы сосредоточиться на одной стороне. Расслабление уровней остановки потерь соответствующим образом.

V. Направления оптимизации

  1. Оптимизируйте параметры для DEMA и EMA, чтобы найти лучшие комбинации.

  2. Оптимизировать период обратного обзора ATR для определения оптимального эталона волатильности.

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

  4. Введите правила стоп-лосса и получения прибыли, чтобы получить более стабильную прибыль.

VI. Заключение

Эта стратегия создает простую, но эффективную краткосрочную торговую систему с использованием 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())


Больше