Торговая система с двойной скользящей средней в сочетании со стратегией оптимизации динамических стоп-лоссов ATR

EMA ATR SL TP MA
Дата создания: 2025-01-10 15:19:40 Последнее изменение: 2025-01-10 15:19:40
Копировать: 1 Количество просмотров: 454
1
Подписаться
1617
Подписчики

Торговая система с двойной скользящей средней в сочетании со стратегией оптимизации динамических стоп-лоссов ATR

Обзор

Данная стратегия представляет собой торговую систему, следующую за трендом, основанную на системе двойной скользящей средней и динамическом стоп-лоссе ATR. Он использует 38-периодную и 62-периодную экспоненциальные скользящие средние (EMA) для определения рыночных тенденций, определяет сигналы входа посредством пересечения цен с быстрой EMA и объединяет их с индикатором ATR для динамического управления стоп-лоссами. Стратегия предусматривает как агрессивные, так и консервативные режимы торговли, подходящие трейдерам с различными предпочтениями в отношении риска.

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

Основная логика стратегии основана на следующих ключевых элементах:

  1. Определение тренда: Текущий рыночный тренд определяется позиционным соотношением между 38-периодной и 62-периодной EMA. Когда быстрая EMA находится выше медленной EMA, это восходящий тренд, в противном случае — нисходящий тренд.
  2. Сигналы на вход: при восходящем тренде длинный сигнал генерируется, когда цена пробивает быструю EMA снизу; при нисходящем тренде короткий сигнал генерируется, когда цена пробивает быструю EMA сверху.
  3. Управление рисками: Используя динамическую систему стоп-лосс, основанную на ATR, уровень стоп-лосса корректируется соответствующим образом по мере движения цены в благоприятном направлении, защищая существующую прибыль и не покидая рынок преждевременно. Также устанавливаются фиксированные процентные стоп-лоссы и целевые показатели прибыли.

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

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

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

  1. Риск разворота тренда: в точках разворота тренда могут возникать непрерывные остановки. Рекомендуется торговать только при наличии четко выраженного тренда.
  2. Риск проскальзывания: когда рынок резко колеблется, фактическая цена сделки может значительно отклоняться от сигнальной цены. Диапазон стоп-лосса следует смягчить соответствующим образом.
  3. Чувствительность параметров: выбор периода скользящей средней и множителя ATR существенно повлияет на эффективность стратегии. Необходимость оптимизации для различных рыночных условий.

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

  1. Добавить фильтр силы тренда: Индикаторы силы тренда, такие как ADX, можно использовать для входа на рынок только тогда, когда тренд очевиден.
  2. Оптимизированный механизм стоп-лосса: множитель ATR можно динамически корректировать в зависимости от волатильности, что делает стоп-лосс более адаптивным.
  3. Добавьте подтверждение объема: при появлении сигнала входа объедините его с анализом объема, чтобы повысить надежность сигнала.
  4. Классификация рыночной среды: Динамическая корректировка параметров стратегии в соответствии с различными рыночными условиями (тренд/колебания).

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

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

Исходный код стратегии
/*backtest
start: 2024-12-10 00:00:00
end: 2025-01-08 08:00:00
period: 4h
basePeriod: 4h
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/
// © aalapsharma

//@version=5
strategy(title="CM_SlingShotSystem - Strategy", shorttitle="SlingShotSys_Enhanced_v5", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding=1)

// Inputs
sae = input.bool(true, "Show Aggressive Entry Bars? (Highlight only)")
sce = input.bool(true, "Show Conservative Entry Bars? (Highlight only)")
st = input.bool(true, "Show Trend Arrows (Top/Bottom)?")
def = input.bool(false, "(Unused) Only Choose 1 - Either Conservative Entry Arrows or 'B'-'S' Letters")
pa = input.bool(true, "Show Conservative Entry Arrows?")
sl = input.bool(false, "Show 'B'-'S' Letters?")
useStopLoss = input.bool(true, "Use Stop-Loss?")
stopLossPerc = input.float(5.0, "Stop-Loss (%)", step=0.1)
useTakeProfit = input.bool(true, "Use Take-Profit?")
takeProfitPerc = input.float(20.0, "Take-Profit (%)", step=0.1)
useTrailingStop = input.bool(false, "Use ATR Trailing Stop?")
atrLength = input.int(14, "ATR Length", minval=1)
atrMult = input.float(2.0, "ATR Multiple for Trailing Stop", step=0.1)

// Calculations
emaSlow = ta.ema(close, 62)
emaFast = ta.ema(close, 38)
upTrend = emaFast >= emaSlow
downTrend = emaFast < emaSlow
pullbackUpT() => emaFast > emaSlow and close < emaFast
pullbackDnT() => emaFast < emaSlow and close > emaFast
entryUpT() => emaFast > emaSlow and close[1] < emaFast and close > emaFast
entryDnT() => emaFast < emaSlow and close[1] > emaFast and close < emaFast
entryUpTrend = entryUpT() ? 1 : 0
entryDnTrend = entryDnT() ? 1 : 0
atrValue = ta.atr(atrLength)

// Trailing Stop Logic (Improved)
var float trailStopLong = na
var float trailStopShort = na

if (strategy.position_size > 0)
    trailStopLong := math.max(close - (atrValue * atrMult), nz(trailStopLong[1], close))
    trailStopLong := strategy.position_avg_price > trailStopLong ? strategy.position_avg_price : trailStopLong
else
    trailStopLong := na

if (strategy.position_size < 0)
    trailStopShort := math.min(close + (atrValue * atrMult), nz(trailStopShort[1], close))
    trailStopShort := strategy.position_avg_price < trailStopShort ? strategy.position_avg_price : trailStopShort
else
    trailStopShort := na

// Plotting
col = emaFast > emaSlow ? color.lime : emaFast < emaSlow ? color.red : color.yellow
p1 = plot(emaSlow, "Slow MA (62)", linewidth=4, color=col)
p2 = plot(emaFast, "Fast MA (38)", linewidth=2, color=col)
fill(p1, p2, color=color.silver, transp=50)
barcolor((sae and pullbackUpT()) ? color.yellow : (sae and pullbackDnT()) ? color.yellow : na)
barcolor((sce and entryUpT()) ? color.aqua : (sce and entryDnT()) ? color.aqua : na)
plotshape(st and upTrend, title="Trend UP", style=shape.triangleup, location=location.bottom, color=color.lime)
plotshape(st and downTrend, title="Trend DOWN", style=shape.triangledown, location=location.top, color=color.red)
plotarrow((pa and entryUpTrend == 1) ? 1 : na, title="Up Entry Arrow", colorup=color.lime, maxheight=30, minheight=30)
plotarrow((pa and entryDnTrend == 1) ? -1 : na, title="Down Entry Arrow", colordown=color.red, maxheight=30, minheight=30)
plotchar(sl and entryUpTrend ? (low - ta.tr) : na, title="Buy Entry (Letter)", char='B', location=location.absolute, color=color.lime)
plotchar(sl and entryDnTrend ? (high + ta.tr) : na, title="Short Entry (Letter)", char='S', location=location.absolute, color=color.red)
plot(useTrailingStop and strategy.position_size > 0 ? trailStopLong : na, "Trailing Stop Long", color=color.green, style=plot.style_linebr)
plot(useTrailingStop and strategy.position_size < 0 ? trailStopShort : na, "Trailing Stop Short", color=color.red, style=plot.style_linebr)

// Function to calculate stop and limit prices
f_calcStops(_entryPrice, _isLong) =>
    _stopLoss = _isLong ? _entryPrice * (1.0 - stopLossPerc / 100.0) : _entryPrice * (1.0 + stopLossPerc / 100.0)
    _takeProfit = _isLong ? _entryPrice * (1.0 + takeProfitPerc / 100.0) : _entryPrice * (1.0 - takeProfitPerc / 100.0)
    [_stopLoss, _takeProfit]

// Entry and Exit Logic (Simplified using strategy.close)
if (entryUpT() and strategy.position_size == 0)
    strategy.entry("Long", strategy.long)

if (entryDnT() and strategy.position_size == 0)
    strategy.entry("Short", strategy.short)

// Exit conditions based on Stop-loss and Take-profit
[slPrice, tpPrice] = f_calcStops(strategy.position_avg_price, strategy.position_size > 0)

if (strategy.position_size > 0)
    strategy.exit("Exit Long", "Long", stop=slPrice, limit=tpPrice, trail_price = trailStopLong, trail_offset = atrValue * atrMult)

if (strategy.position_size < 0)
    strategy.exit("Exit Short", "Short", stop=slPrice, limit=tpPrice, trail_price = trailStopShort, trail_offset = atrValue * atrMult)

// Close opposite position on new entry signal
if (entryUpT() and strategy.position_size < 0)
    strategy.close("Short", comment="Close Short on Long Signal")

if (entryDnT() and strategy.position_size > 0)
    strategy.close("Long", comment="Close Long on Short Signal")