В процессе загрузки ресурсов... загрузка...

Кроссовер EMA с Bollinger Bands Стратегия двойного входа: количественная система торговли, сочетающая в себе тренд и волатильность.

Автор:Чао Чжан, Дата: 2024-07-29 17:14:32
Тэги:ЕМАББATR

img

Обзор

EMA Crossover with Bollinger Bands Double Entry Strategy - это количественная торговая система, которая сочетает в себе методологию следования трендам и методологию выхода из волатильности. Эта стратегия в основном использует кроссоверы экспоненциальной скользящей средней (EMA) для определения рыночных тенденций, используя при этом Bollinger Bands (BB) для выявления потенциальных возможностей выхода. Этот подход направлен на захват сильных рыночных тенденций, обеспечивая при этом дополнительные точки входа через выходы из Bollinger Band, тем самым увеличивая торговые возможности и оптимизируя управление капиталом.

Принципы стратегии

  1. EMA Crossover: стратегия использует 12-периодные и 26-периодные EMA для определения направления тренда. Сигнал покупки генерируется, когда быстрая EMA (12-периодная) пересекает более медленную EMA (26-периодную), и наоборот для сигналов продажи.

  2. Болинджерские полосы: стратегия использует 55-периодную полосу Болинджера со стандартным отклонением 0,9. Когда цена превышает верхнюю полосу, уже находясь в восходящем тренде, она предоставляет дополнительную возможность входа.

  3. Логика входа:

    • Первичный вход: перекресток EMA или прорыв цены выше верхней полосы Боллинджера.
    • Дополнительная запись: если уже находитесь на длинной позиции, увеличьте размер позиции по прорывам полосы Боллинджера.
  4. Логика выхода:

    • Выход, когда быстрая EMA пересекает низкую.
    • Факультативный выход, когда цена закрывается ниже средней линии полосы Боллинджера.
  5. Настройка остановки потерь:

    • Динамическая остановка потерь с использованием 14-периодного среднего истинного диапазона (ATR).
    • Необязательное использование минимального минимума за последние 5 дней в качестве стоп-лосса.
  6. Управление рисками:

    • Риск дефолта в размере 3% от собственного капитала счета на одну сделку (с корректировкой).
    • Использование ATR для динамической корректировки стоп-лосса, адаптации к волатильности рынка.
    • Факультативная пауза в торговле, когда цена ниже средней линии полосы Боллинджера.

Преимущества стратегии

  1. Многомерный анализ: сочетает в себе стратегии следования тренду (EMA) и волатильности (Bollinger Bands), повышая надежность торговых сигналов.

  2. Гибкий механизм входа: в дополнение к основным сигналам перекрестного действия EMA, он использует прорывы полосы Боллинджера для дополнительных возможностей входа, увеличивая адаптивность стратегии.

  3. Динамическое управление рисками: использует ATR для установки стоп-лосса и корректировки размеров позиций, что позволяет стратегии лучше адаптироваться к волатильности в различных рыночных условиях.

  4. Знание рыночных условий: использует среднюю линию полосы Боллинджера для оценки рыночных условий, с возможностью приостановить торговлю при неблагоприятных условиях, снижая риск.

  5. Оптимизированное управление капиталом: достижение более совершенного контроля капитала посредством управления рисками на основе процентов и динамического размещения позиций на основе ATR.

  6. Высокая настраиваемость: множество регулируемых параметров, таких как периоды EMA, настройки диапазона Боллинджера и мультипликатор ATR, позволяют стратегии адаптироваться к различным торговым инструментам и рыночным условиям.

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

  1. Риск переворота тренда: хорошо работает на рынках с сильным трендом, но может часто генерировать ложные сигналы прорыва на рынках с ограниченным диапазоном.

  2. Риск переоценки: переоценка полосы Боллинджера может привести к чрезмерным торговым сигналам, увеличивающим затраты на транзакции.

  3. Риск сдвига: на сильно волатильных рынках цены на вход и выход могут значительно отклоняться от ожиданий.

  4. Чувствительность параметров: эффективность стратегии может быть чувствительна к изменениям в периоды EMA, настройкам полосы Боллинджера и т. д., что требует тщательной оптимизации и обратного тестирования.

  5. Зависимость от рыночной среды: эффективность стратегии может быть несовместимой в различных рыночных циклах и условиях волатильности.

  6. Риск управления капиталом: несмотря на использование управления рисками на основе процентов, счет все еще может столкнуться со значительными снижениями при последовательных потерях.

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

  1. Анализ многочасовых рамок: внедрить более долгосрочное подтверждение тенденции, например еженедельные или ежемесячные EMA, чтобы уменьшить ложные сигналы.

  2. Фильтрация волатильности: корректировка параметров полосы Боллинджера или пауза торговли в условиях низкой волатильности, чтобы избежать переоценки на боковых рынках.

  3. Включить индикаторы импульса: добавить RSI или MACD для подтверждения силы тренда и потенциальных сигналов обворота.

  4. Оптимизировать механизм выхода: рассмотреть возможность использования остановок или динамических целей прибыли на основе ATR для лучшего закрепления прибыли.

  5. Классификация состояния рынка: Разработка системы классификации рыночной среды с использованием различных параметров в различных состояниях рынка.

  6. Оптимизация машинного обучения: использовать алгоритмы машинного обучения для динамической корректировки параметров стратегии для адаптации к различным рыночным условиям.

  7. Анализ корреляции: при торговле несколькими активами следует учитывать корреляции между инструментами для оптимизации характеристик риска и доходности портфеля в целом.

  8. Включить фундаментальные факторы: для акций или сырьевых товаров следует рассмотреть возможность добавления соответствующих фундаментальных показателей для улучшения качества сигналов входа.

Заключение

Стратегия двойного вхождения EMA Crossover with Bollinger Bands - это количественная торговая система, которая сочетает в себе концепцию следующего тренда и концепцию перерыва волатильности. Она улавливает основные тенденции через перекрестки EMA и предоставляет дополнительные возможности входа с использованием перерывов Bollinger Band, используя при этом динамические методы управления рисками для оптимизации использования капитала.

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

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


/*backtest
start: 2023-07-23 00:00:00
end: 2024-07-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("EMA Crossover with BB Double Entry", overlay=true, initial_capital=1000, default_qty_type=strategy.cash, default_qty_value=100)

// Input parameters
fastLength = input.int(12, "Fast EMA Length")
slowLength = input.int(26, "Slow EMA Length")
atrPeriod = input.int(14, "ATR Period")
atrMultiplier = input.float(1.0, "ATR Multiplier")
useATRStopLoss = input.bool(true, "Use ATR Stop Loss")
stopLossDays = input.int(5, "Number of days for stop loss", minval=1, maxval=50)
riskPerTrade = input.float(3.0, "Risk per trade (%)", minval=0.1, maxval=5, step=0.1)
bbRiskPerTrade = input.float(1.5, "Risk for BB breakout trade (%)", minval=0.1, maxval=5, step=0.1)

// Bollinger Bands parameters
bbLength = input.int(55, "BB Length")
bbMult = input.float(0.9, "BB Standard Deviation")
useBBPauseResume = input.bool(false, "Use BB for Pause/Resume trading")

// Backtesting dates
startDate = input(timestamp("2020-01-01"), "Start Date")
endDate = input(timestamp("9999-12-31"), "End Date")

// Calculate EMAs
fastEMA = ta.ema(close, fastLength)
slowEMA = ta.ema(close, slowLength)

// Calculate ATR
atr = ta.atr(atrPeriod)

// Calculate Bollinger Bands
bbBasis = ta.sma(close, bbLength)
bbDev = bbMult * ta.stdev(close, bbLength)
bbUpper = bbBasis + bbDev
bbLower = bbBasis - bbDev

// Define trading conditions
longCondition = ta.crossover(fastEMA, slowEMA)
shortCondition = ta.crossunder(fastEMA, slowEMA)
bullish = fastEMA > slowEMA
bearish = fastEMA < slowEMA

// Bollinger Bands breakout
bbBreakout = close > bbUpper and close[1] <= bbUpper[1]

// Calculate lowest low for stop loss
lowestLow = ta.lowest(low, stopLossDays)

// Variables to store entry price and stop loss
var float entryPrice = na
var float stopLoss = na
var bool inPosition = false
var bool pauseTrading = false

// Entry logic
entryConditions = (longCondition or (bbBreakout and bullish)) and
                  (not useBBPauseResume or close > bbBasis) and
                  not pauseTrading

if entryConditions and not inPosition
    entryPrice := close
    atrStopLoss = close - (atr * atrMultiplier)
    lowStopLoss = lowestLow
    stopLoss := useATRStopLoss ? atrStopLoss : lowStopLoss
    
    riskAmount = strategy.equity * (riskPerTrade / 100)
    positionSize = riskAmount / (close - stopLoss)
    
    strategy.entry("Long", strategy.long, qty=positionSize)
    inPosition := true
    pauseTrading := false
    
    alert("BUY," + syminfo.ticker + ",EntryPrice=" + str.tostring(close) + ",StopLoss=" + str.tostring(stopLoss) + ",PositionSize=" + str.tostring(positionSize), alert.freq_once_per_bar_close)

// Additional entry on BB breakout
if inPosition and bbBreakout and bullish and (not useBBPauseResume or close > bbBasis)
    bbRiskAmount = strategy.equity * (bbRiskPerTrade / 100)
    bbPositionSize = bbRiskAmount / (close - stopLoss)
    
    strategy.entry("Long_BB", strategy.long, qty=bbPositionSize)
    
    alert("ADD," + syminfo.ticker + ",EntryPrice=" + str.tostring(close) + ",StopLoss=" + str.tostring(stopLoss) + ",PositionSize=" + str.tostring(bbPositionSize), alert.freq_once_per_bar_close)

// Exit logic
if shortCondition or (useBBPauseResume and inPosition and close < bbBasis)
    if shortCondition
        strategy.close_all(comment="EMA Crossdown")
        inPosition := false
        pauseTrading := false
        alert("SELL," + syminfo.ticker + ",Reason=EMA_Crossdown", alert.freq_once_per_bar_close)
    else if useBBPauseResume
        strategy.close_all(comment="Close under BB basic")
        pauseTrading := true
        alert("SELL," + syminfo.ticker + ",Reason=Below_BB_Basic", alert.freq_once_per_bar_close)
    
    entryPrice := na
    stopLoss := na

// Resume trading if price closes above BB basic
if useBBPauseResume and pauseTrading and close > bbBasis
    pauseTrading := false
    alert("RESUME," + syminfo.ticker, alert.freq_once_per_bar_close)

// Stop loss
if strategy.position_size > 0
    strategy.exit("Stop Loss", "Long", stop=stopLoss)
    strategy.exit("Stop Loss", "Long_BB", stop=stopLoss)
    if close <= stopLoss
        alert("SELL," + syminfo.ticker + ",Reason=Stop_Loss", alert.freq_once_per_bar_close)

// Plotting
plot(fastEMA, color=color.new(color.blue, 0), title="Fast EMA")
plot(slowEMA, color=color.new(color.red, 0), title="Slow EMA")
plot(bbUpper, color=color.new(color.green, 50), title="BB Upper")
plot(bbLower, color=color.new(color.green, 50), title="BB Lower")
plot(bbBasis, color=color.new(color.yellow, 50), title="BB Basic")
plot(strategy.position_size > 0 ? stopLoss : na, color=color.red, style=plot.style_cross, linewidth=2, title="Stop Loss")

// Alert conditions
alertcondition(entryConditions, title="Buy Alert", message="Buy {{ticker}}")
alertcondition(bbBreakout and inPosition and bullish and (not useBBPauseResume or close > bbBasis), title="Add Position Alert", message="Add Position {{ticker}}")
alertcondition(shortCondition, title="Sell Alert (EMA)", message="Sell {{ticker}} (EMA crossdown)")
alertcondition(useBBPauseResume and inPosition and close < bbBasis, title="Pause Alert", message="Pause trading {{ticker}} (Close under BB basic)")
alertcondition(useBBPauseResume and pauseTrading and close > bbBasis, title="Resume Alert", message="Resume trading {{ticker}} (Close above BB basic)")

Связанные

Больше