Количественная торговая стратегия открытия и закрытия пересечения скользящих средних в сочетании с динамическим индикатором ADX

MA ADX SMMA EMA DEMA TEMA WMA VWMA HullMA LSMA ALMA SSMA TMA ATR
Дата создания: 2025-02-18 13:35:54 Последнее изменение: 2025-02-18 13:35:54
Копировать: 1 Количество просмотров: 445
1
Подписаться
1617
Подписчики

Количественная торговая стратегия открытия и закрытия пересечения скользящих средних в сочетании с динамическим индикатором ADX

Обзор

Это количественная торговая стратегия, основанная на пересечении движущейся средней линии между ценой открытия и ценой закрытия, и использующая средний индикатор тренда ((ADX) в качестве фильтра. Эта стратегия использует несколько типов движущихся средних линий, включая SMMA, EMA, DEMA и т. Д., чтобы улавливать изменения в тенденции рынка путем идентификации пересечения равновесных линий, а также использовать индикатор ADX для подтверждения силы тенденции, повышая надежность торговли.

Стратегический принцип

Основная логика стратегии состоит в том, чтобы вычислить движущиеся средние цены открытия и закрытия, чтобы создать многосигнал, когда средняя цена закрытия пересекает среднюю цену открытия вверх и ADX больше, чем установленный порог; чтобы создать пустой сигнал, когда средняя цена закрытия пересекает среднюю цену открытия вниз и ADX больше, чем установленный порог. Стратегия поддерживает несколько методов расчета движущихся средних, включая простые движущиеся средние, индексовые движущиеся средние, двойные индексовые движущиеся средние и т. Д., которые позволяют выбрать наиболее подходящие типы средних в зависимости от различных рыночных особенностей.

Стратегические преимущества

  1. Гибкость: поддержка нескольких типов движущихся средних линий, позволяющих выбрать наиболее оптимальный метод расчета средних линий в зависимости от рыночной ситуации
  2. Подтверждение тренда: фильтрация на ADX эффективно снижает ложные сигналы во время рыночных потрясений
  3. Управление рисками: включает в себя функцию остановки и остановки, чтобы эффективно контролировать риск каждой сделки
  4. Высокая настраиваемость: предоставление многочисленных интерфейсов для параметров, включая средний цикл, ADX-температуру, направление торговли и т. д., для оптимизации стратегии
  5. Поддержка нескольких временных циклов: может работать в разных временных циклах и адаптироваться к различным стилям торговли

Стратегический риск

  1. Задержка средней: движущаяся средняя, по сути, является задержкой, которая может вызвать задержку на рынке с быстрым колебанием
  2. Риск ложного прорыва: при рыночных потрясениях может возникнуть среднелинейный ложный прорыв, хотя есть фильтрация ADX, но все же следует быть осторожным
  3. Чувствительность к параметрам: эффективность стратегии чувствительна к параметрам, которые необходимо корректировать в зависимости от рыночной ситуации
  4. Рыночная адаптивность: лучшая производительность на рынках с заметной тенденцией, но может быть частой торговлей на рынках с колебаниями
  5. Комплексность вычислений: многообразие среднелинейных типов вычислений может увеличить нагрузку на систему, необходимо обратить внимание на операционную эффективность

Направление оптимизации стратегии

  1. Введение показателей объема: эффективность тренда может быть подтверждена путем объединения изменений объема
  2. Оптимизация параметров ADX: корректировка порога ADX в соответствии с динамикой различных рыночных циклов
  3. Добавление признаков тренда: можно рассмотреть возможность добавления других признаков тренда для повышения надежности сигнала
  4. Совершенствование механизма остановки убытков: введение отслеживаемого остановки или адаптируемой к колебаниям остановки убытков
  5. Оптимизация времени торговли: учитывая волатильность рынка и факторы ликвидности, выбирайте оптимальное время торговли

Подвести итог

Это система количественного трейдинга, объединяющая классическую равнолинейную стратегию с показателем ADX. Благодаря поддержке нескольких типов равнолинейной линии и подтверждению тенденций ADX, она позволяет лучше понимать тенденции рынка, а также обладает полноценным механизмом контроля риска. Стратегия имеет высокую настраиваемость, ее можно оптимизировать в зависимости от различных рыночных условий.

Исходный код стратегии
/*backtest
start: 2024-02-18 00:00:00
end: 2025-02-16 08:00:00
period: 3d
basePeriod: 3d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © algostudio

//@version=6
strategy("Open Close Cross Strategy R5.1", shorttitle="OCC Strategy R5.1", overlay=true,
     pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=10, calc_on_every_tick=false)

// === INPUTS ===
useRes      = input.bool(true, title="Use Alternate Resolution?")
intRes      = input.int(3, title="Multiplier for Alternate Resolution", minval=1)
stratRes    = timeframe.ismonthly ? str.tostring(timeframe.multiplier * intRes) + "M" :
              timeframe.isweekly ? str.tostring(timeframe.multiplier * intRes) + "W" :
              timeframe.isdaily ? str.tostring(timeframe.multiplier * intRes) + "D" :
              timeframe.isintraday ? str.tostring(timeframe.multiplier * intRes) : "60"

basisType   = input.string("SMMA", title="MA Type:", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "HullMA", "LSMA", "ALMA", "SSMA", "TMA"])
basisLen    = input.int(8, title="MA Period", minval=1)
offsetSigma = input.int(6, title="Offset for LSMA / Sigma for ALMA", minval=0)
offsetALMA  = input.float(0.85, title="Offset for ALMA", minval=0, step=0.01)
scolor      = input.bool(false, title="Show Colored Bars to Indicate Trend?")
delayOffset = input.int(0, title="Delay Open/Close MA (Forces Non-Repainting)", minval=0, step=1)
tradeType   = input.string("BOTH", title="What trades should be taken:", options=["LONG", "SHORT", "BOTH", "NONE"])

// === BASE FUNCTIONS ===
variant(type, src, len, offSig, offALMA) =>
    if type == "EMA"
        ta.ema(src, len)
    else if type == "DEMA"
        ta.ema(ta.ema(src, len), len) * 2 - ta.ema(ta.ema(ta.ema(src, len), len), len)
    else if type == "TEMA"
        3 * (ta.ema(src, len) - ta.ema(ta.ema(src, len), len)) + ta.ema(ta.ema(ta.ema(src, len), len), len)
    else if type == "WMA"
        ta.wma(src, len)
    else if type == "VWMA"
        ta.vwma(src, len)
    else if type == "SMMA"
        ta.sma(src, len)
    else if type == "HullMA"
        ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len), math.round(math.sqrt(len)))
    else if type == "LSMA"
        ta.linreg(src, len, offSig)
    else if type == "ALMA"
        ta.alma(src, len, offALMA, offSig)
    else if type == "TMA"
        ta.sma(ta.sma(src, len), len)
    else
        ta.sma(src, len)

// Security wrapper
reso(exp, use, res) => use ? request.security(syminfo.tickerid, res, exp, lookahead=barmerge.lookahead_on) : exp

// === SERIES SETUP ===
closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA)
openSeries  = variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA)

// Alternate resolution series
closeSeriesAlt = reso(closeSeries, useRes, stratRes)
openSeriesAlt  = reso(openSeries, useRes, stratRes)

// Trend Colors
trendColour = closeSeriesAlt > openSeriesAlt ? color.green : color.red
bcolour     = closeSeries > openSeriesAlt ? color.lime : color.red
barcolor(scolor ? bcolour : na, title="Bar Colours")

closeP = plot(closeSeriesAlt, title="Close Series", color=trendColour, linewidth=2, style=plot.style_line)
openP  = plot(openSeriesAlt, title="Open Series", color=trendColour, linewidth=2, style=plot.style_line)
fill(closeP, openP, color=trendColour)
// === ADX FILTER ===
// ADX Calculation
// Input parameters
adxLength = input.int(14, title="ADX Length", minval=1)
adxfilter = input.int(13, title="ADX filter", minval=1)
// Calculate +DM and -DM (Directional Movement)
plusDM = math.max(high - high[1], 0)
minusDM = math.max(low[1] - low, 0)

// Remove cases where both are positive
plusDM := plusDM > minusDM ? plusDM : 0
minusDM := minusDM > plusDM ? minusDM : 0

// Smooth the directional movement using RMA
smoothedPlusDM = ta.rma(plusDM, adxLength)
smoothedMinusDM = ta.rma(minusDM, adxLength)

// Calculate True Range and smooth it
tr = ta.atr(adxLength)
smoothedTR = ta.rma(tr, adxLength)

// Compute +DI and -DI
plusDI = (smoothedPlusDM / smoothedTR) * 100
minusDI = (smoothedMinusDM / smoothedTR) * 100

// Compute DX (Directional Index)
dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100

// Compute ADX by smoothing DX
adx = ta.rma(dx, adxLength)




// === UPDATED TRADE CONDITIONS ===
xlong     = ta.crossover(closeSeriesAlt, openSeriesAlt) and adx > adxfilter
xshort    = ta.crossunder(closeSeriesAlt, openSeriesAlt) and adx > adxfilter
longCond  = xlong
shortCond = xshort


// === STRATEGY ===
slPoints  = input.float(0, title="Initial Stop Loss Points", minval=0)
tpPoints  = input.float(0, title="Initial Target Profit Points", minval=0)
ebar      = input.int(10000, title="Number of Bars for Back Testing", minval=0)

tdays     = (timenow - time) / 60000.0

tdays     := timeframe.ismonthly ? tdays / 1440.0 / 5.0 / 4.3 / timeframe.multiplier :
             timeframe.isweekly ? tdays / 1440.0 / 5.0 / timeframe.multiplier :
             timeframe.isdaily ? tdays / 1440.0 / timeframe.multiplier :
             tdays / timeframe.multiplier

TP = tpPoints > 0 ? tpPoints : na
SL = slPoints > 0 ? slPoints : na

if (ebar == 0 or tdays <= ebar)
    if longCond and tradeType != "SHORT"
        strategy.entry("long", strategy.long)
    if shortCond and tradeType != "LONG"
        strategy.entry("short", strategy.short)
    if shortCond and tradeType == "LONG"
        strategy.close("long")
    if longCond and tradeType == "SHORT"
        strategy.close("short")
    strategy.exit("XL", from_entry="long", profit=TP, loss=SL)
    strategy.exit("XS", from_entry="short", profit=TP, loss=SL)

// === END ===