
Двойная EMA - это количественная торговая стратегия, которая использует двойные EMA-индикаторы для определения направления ценового тренда. Эта стратегия определяет ценовой тренд, рассчитывая два набора различных параметров EMA-индикаторов, объединяющих сигналы Gold Fork и Dead Fork.
Основными показателями стратегии являются две группы EMA, включающие в себя группу EMA1 с более длительным периодом и группу EMA2 с более коротким периодом. Параметр EMA1 - 21, параметр EMA2 - 10. Стратегия рассчитывает эти две группы EMA с 4-часовой линией как базовый период.
Когда более короткий цикл EMA2 проходит более длинный цикл EMA1, создается сигнал покупки. Это означает, что краткосрочная тенденция цен становится сильнее и начинает входить в повышение. Когда более короткий цикл EMA2 проходит более длинный цикл EMA1, создается сигнал продажи. Это означает, что краткосрочная тенденция к росту цен была прервана и начинает входить в понижение.
Чтобы отфильтровать ошибочные сигналы, стратегия устанавливает две группы индикаторов. Соответствующие покупки и продажи могут быть инициированы только в том случае, если две группы индикаторов сигнализируют одновременно. Это позволяет эффективно уменьшить ошибочные сделки, вызванные колебаниями цен.
Эти риски можно контролировать следующими способами:
В этой стратегии есть место для дальнейшей оптимизации:
Повышение портфеля моделей. Можно создать больше комбинаций различных параметров показателей, повышая стабильность стратегии.
Увеличение механизма остановки убытков. Установка разумных остановочных точек позволяет эффективно контролировать убытки.
Оптимизация динамических параметров. Параметры EMA могут быть автоматически оптимизированы в зависимости от различных рыночных условий.
В сочетании с технологиями машинного обучения. Используя такие рамки, как Tensorflow, обучающие модели прогнозируют ценовые тенденции в реальном времени и классифицируют.
Двойная EMA - это простая и практичная стратегия торговли трендами. Она использует показатели двойной EMA для определения краткосрочных тенденций в ценах, чтобы уловить возможности для направленного поведения.
/*backtest
start: 2023-02-22 00:00:00
end: 2024-02-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
/// Component Code Startt
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(01, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(1, "Backtest Stop Month")
testStopDay = input(1, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)
// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=false)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)
testPeriod() => true
// Component Code Stop
strategy(title="Ema cross strat", overlay=true)
margin = input(true, title="Margin?")
Margin = margin ? margin : false
resCustom = input(title="EMA Timeframe", defval="240" )
source = close,
len2 = input(21, minval=1, title="EMA1")
len3 = input(10, minval=1, title="EMA2")
ema2 = request.security(syminfo.tickerid,resCustom,ema(source,len2), lookahead=barmerge.lookahead_off)
ema3 = request.security(syminfo.tickerid,resCustom,ema(source,len3), lookahead=barmerge.lookahead_off)
mylong = crossover(ema3, ema2)
myshort = crossunder(ema3,ema2)
last_long = na
last_short = na
last_long := mylong ? time : nz(last_long[1])
last_short := myshort ? time : nz(last_short[1])
in_long = last_long > last_short ? 2 : 0
in_short = last_short > last_long ? 2 : 0
mylong2 = crossover(ema3, ema2)
myshort2 = crossunder(ema3, ema2)
last_long2 = na
last_short2 = na
last_long2 := mylong2 ? time : nz(last_long2[1])
last_short2 := myshort2 ? time : nz(last_short2[1])
in_long2 = last_long2 > last_short2 ? 0 : 0
in_short2 = last_short2 > last_long2 ? 0 : 0
condlongx = in_long + in_long2
condlong = crossover(condlongx, 1.9)
condlongclose = crossunder(condlongx, 1.9)
condshortx = in_short + in_short2
condshort = crossover(condshortx, 1.9)
condshortclose = crossover(condshortx, 1.9)
if crossover(condlongx, 1.9) and testPeriod() and strategy.position_size <= 0
strategy.entry("Long", strategy.long, comment="Long")
if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size > 0
strategy.close("Long",when = not Margin)
if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0
strategy.entry("Short", strategy.short, comment="Short", when = Margin)