Стратегия Dual EMA Crossover Oscillation Tracking - это стратегия, которая идентифицирует тенденции с использованием индикатора EMA и отслеживает колебания при волатильных рыночных условиях.
Эта стратегия использует 20-периодный EMA в качестве индикатора для оценки тенденций.Когда цена пересекает EMA, это сигнализирует о восходящей тенденции, а когда цена пересекает ниже, это сигнализирует о нисходящей тенденции.
Когда цена пересекает пределы EMA, длинную позицию вводят с использованием самой высокой цены за последние 20 периодов в качестве прибыли и самого низкого минимума с момента перекрестка в качестве стоп-лосса.
В то же время стратегия также проверяет, является ли ADX выше 30. Сделки совершаются только тогда, когда тенденция достаточно сильна, т.е. когда ADX выше 30.
Во время открытых сделок, последующая остановка продолжает корректироваться в зависимости от рыночных условий, чтобы получить больше прибыли.
Эта стратегия сочетает в себе преимущества как отслеживания тренда, так и торговли колебаниями. Она может производить более высокую доходность во время трендовых рынков и более последовательную доходность во время колебаний.
Использование EMA также сохраняет параметры простыми, снижая риски чрезмерной оптимизации и обеспечивая стабильность.
Основной риск этой стратегии заключается в возможности более частых остановок во время интенсифицированных колебаний.
Кроме того, правильное размещение стоп-лосса также является ключевым. Чрезмерно широкие остановки могут увеличить сумму потерь на одной сделке. Чрезмерно узкие остановки могут быть слишком чувствительными и увеличивать вероятность остановки. Необходимо найти баланс между целями прибыли и рисками остановки.
Возможные оптимизации для этой стратегии включают:
Проверяю больше периодов EMA, чтобы найти оптимальную комбинацию.
оптимизация параметров ADX, включая период ADX и пороговые значения.
Улучшение алгоритмов получения прибыли и остановки потерь, например, путем внедрения динамических остановок.
Объединение дополнительных индикаторов, таких как KDJ и MACD, для создания многоиндикаторной системы подтверждения.
Вкратце, стратегия Dual EMA Crossover Oscillation Tracking является очень практичной стратегией. Она сочетает в себе сильные стороны как стратегий трендовой торговли, так и стратегий колебаний. Она может использоваться как для долгосрочного отслеживания, так и для краткосрочной торговли. Дальнейшее улучшение производительности может быть достигнуто путем оптимизации параметров и добавления подтверждающих индикаторов.
/*backtest start: 2023-12-26 00:00:00 end: 2024-01-02 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("Linda Raschke's Holy Grail", shorttitle="RHG", default_qty_type = strategy.percent_of_equity, default_qty_value = 100, overlay = true) adxlen = input(14, title="ADX period") adxMin = input(30) dilen = adxlen f_highest(_src, _length)=> _adjusted_length = _length < 1 ? 1 : _length _value = _src for _i = 0 to (_adjusted_length-1) _value := _src[_i] >= _value ? _src[_i] : _value _return = _value f_lowest(_src, _length)=> _adjusted_length = _length < 1 ? 1 : _length _value = _src for _i = 0 to (_adjusted_length-1) _value := _src[_i] <= _value ? _src[_i] : _value _return = _value dirmov(len) => up = change(high) down = -change(low) plusDM = na(up) ? na : (up > down and up > 0 ? up : 0) minusDM = na(down) ? na : (down > up and down > 0 ? down : 0) truerange = rma(tr, len) plus = fixnan(100 * rma(plusDM, len) / truerange) minus = fixnan(100 * rma(minusDM, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) emaLength = input(20) curEma = ema(close, emaLength) highPeriod = input(20) d = na takeProfitLong = highest(high, highPeriod) stopLossLong = f_lowest(low, barssince(low >= curEma)) if strategy.position_size == 0 if adx(dilen, adxlen) <= adxMin or high < curEma strategy.cancel("Long") if adx(dilen, adxlen) > adxMin and low < curEma and high > curEma and curEma > curEma[highPeriod / 2] and curEma > curEma[highPeriod] and takeProfitLong > high strategy.order("Long", strategy.long, stop = high) strategy.exit("Exit", "Long", limit = takeProfitLong, stop = stopLossLong) d := high takeProfitShort = lowest(low, highPeriod) stopLossShort = f_highest(high, barssince(high <= curEma)) if strategy.position_size == 0 if adx(dilen, adxlen) <= adxMin or low > curEma strategy.cancel("Short") if adx(dilen, adxlen) > adxMin and high > curEma and low < curEma and curEma < curEma[highPeriod / 2] and curEma < curEma[highPeriod] and takeProfitShort < low strategy.order("Short", strategy.short, stop = low) strategy.exit("Exit", "Short", limit = takeProfitShort, stop = stopLossShort) d := low strategy.close("Exit") plot(d == high ? stopLossLong : d == low ? stopLossShort : na, style = circles, linewidth = 4, color = red) plot(d == high ? takeProfitLong : d == low ? takeProfitShort : na, style = circles, linewidth = 4, color = green) plot(d, style = circles, linewidth = 4, color = yellow) plot(curEma, color = black, linewidth = 2) // === Backtesting Dates === testPeriodSwitch = input(false, "Custom Backtesting Dates") testStartYear = input(2018, "Backtest Start Year") testStartMonth = input(3, "Backtest Start Month") testStartDay = input(6, "Backtest Start Day") testStartHour = input(08, "Backtest Start Hour") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0) testStopYear = input(2018, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(14, "Backtest Stop Day") testStopHour = input(14, "Backtest Stop Hour") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0) testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false isPeriod = testPeriodSwitch == true ? testPeriod() : true // === /END if not isPeriod strategy.cancel_all() strategy.close_all()