Стратегия торговли, основанная на зонах спроса и предложения с EMA и Trailing Stop

Автор:Чао Чжан, Дата: 2024-01-18 16:41:16
Тэги:

img

Обзор

Стратегия использует зоны спроса и предложения, экспоненциальную скользящую среднюю (EMA) и средний истинный диапазон (ATR) для торговых сигналов. Пользователи могут регулировать настройки EMA и видимость сигнала. Стратегия отмечает зоны более высокого (HH), более низкого (LL), более низкого (LH) и более низкого (HL). Сигналы отображаются после третьей свечи, подходящей для обратного тестирования.

Логика стратегии

Расчеты показателей

Экспоненциальная скользящая средняя (EMA):

  • EMA рассчитывается на основе цен закрытия за определенный период (по умолчанию: 200).
  • Формула: EMA = (Price_t x α) + (EMA_t-1 x (1 - α)), где α = 2/(длина + 1)

Средний истинный диапазон (ATR):

  • ATR измеряет волатильность рынка на основе реального диапазона цен.
  • Истинный диапазон - самый большой из:
    • Высокий ток минус низкий ток
    • Абсолютное значение текущего максимума минус предыдущее закрытие
    • Абсолютное значение текущего минимума минус предыдущее закрытие
  • ATR обычно использует 14 периодов.

Используется для определения EMA для тренда и ATR для volatility-based trailing stop.

Определение зоны спроса и предложения

Он идентифицирует HH (высший высокий), LL (низкий низкий), HL (высший низкий) и LH (низкий высокий) шаблоны:

  1. Высшее Высокое (HH): текущий пик > предыдущий пик, импульс вверх.

  2. Нижняя Нижняя (LL)Текущий минимум < предыдущий минимум, понижающий импульс.

  3. Высокий низкий (HL): текущий минимум > предыдущий минимум, продолжение вверх.

  4. Нижний высокий (LH): текущий пик < предыдущий пик, продолжение снижения.

Используется в сочетании с тенденциями для выявления перемен или продолжения.

Вход и выход

Сигнал входа: Купить/продать на третьей свече, закрывающейся выше/ниже предыдущего максимума/низкого.

ВыходСледующая стоп-лосс на основе ATR.

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

  1. Сочетает в себе тенденции, переломы, волатильность для сильных сигналов.
  2. Зоны спроса/предложения определяют ключевые S/R.
  3. Динамическая остановка ATR регулируется волатильностью.
  4. Настраиваемые параметры.
  5. Простые правила входа.

Риски и улучшения

  1. Ложные сигналы: оптимизировать длину EMA.
  2. Высокий мультипликатор ATR рискует преследовать тенденции.
  3. Подумайте о дополнительных фильтрах в записях.
  4. Проверьте ориентированный на тренд подход.

Заключение

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


/*backtest
start: 2023-12-18 00:00:00
end: 2024-01-17 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Supply and Demand Zones with EMA and Trailing Stop", shorttitle="SD Zones", overlay=true)

showBuySignals = input(true, title="Show Buy Signals", group="Signals")
showSellSignals = input(true, title="Show Sell Signals", group="Signals")
showHLZone = input(true, title="Show HL Zone", group="Zones")
showLHZone = input(true, title="Show LH Zone", group="Zones")
showHHZone = input(true, title="Show HH Zone", group="Zones")
showLLZone = input(true, title="Show LL Zone", group="Zones")

emaLength = input(200, title="EMA Length", group="EMA Settings")
atrLength = input(14, title="ATR Length", group="Trailing Stop")
atrMultiplier = input(2, title="ATR Multiplier", group="Trailing Stop")

// Function to identify supply and demand zones
getZones(src, len, mult) =>
    base = request.security(syminfo.tickerid, "D", close)
    upper = request.security(syminfo.tickerid, "D", high)
    lower = request.security(syminfo.tickerid, "D", low)
    multiplier = request.security(syminfo.tickerid, "D", mult)
    zonetype = base + multiplier * len
    zone = src >= zonetype
    [zone, upper, lower]

// Identify supply and demand zones
[supplyZone, _, _] = getZones(close, high[1] - low[1], 1)
[demandZone, _, _] = getZones(close, high[1] - low[1], -1)

// Plot supply and demand zones
bgcolor(supplyZone ? color.new(color.red, 80) : na)
bgcolor(demandZone ? color.new(color.green, 80) : na)

// EMA with Linear Weighted method
ema = ta.ema(close, emaLength)

// Color code EMA based on its relation to candles
emaColor = close > ema ? color.new(color.green, 0) : close < ema ? color.new(color.red, 0) : color.new(color.yellow, 0)

// Plot EMA
plot(ema, color=emaColor, title="EMA")

// Entry Signal Conditions after the third candle
longCondition = ta.crossover(close, high[1]) and bar_index >= 2
shortCondition = ta.crossunder(close, low[1]) and bar_index >= 2

// Trailing Stop using ATR
atrValue = ta.atr(atrLength)
trailStop = close - atrMultiplier * atrValue

// Strategy Entry and Exit
if (longCondition)
    strategy.entry("Buy", strategy.long)
    strategy.exit("TrailStop", from_entry="Buy", loss=trailStop)

if (shortCondition)
    strategy.entry("Sell", strategy.short)
    strategy.exit("TrailStop", from_entry="Sell", loss=trailStop)

// Plot Entry Signals
plotshape(series=showBuySignals ? longCondition : na, title="Buy Signal", color=color.new(color.green, 0), style=shape.triangleup, location=location.belowbar)
plotshape(series=showSellSignals ? shortCondition : na, title="Sell Signal", color=color.new(color.red, 0), style=shape.triangledown, location=location.abovebar)

// Plot Trailing Stop
plot(trailStop, color=color.new(color.red, 0), title="Trailing Stop")

// Plot HH, LL, LH, and HL zones
plotshape(series=showHHZone and ta.highest(high, 2)[1] and ta.highest(high, 2)[2] ? 1 : na, title="HH Zone", color=color.new(color.blue, 80), style=shape.triangleup, location=location.abovebar)
plotshape(series=showLLZone and ta.lowest(low, 2)[1] and ta.lowest(low, 2)[2] ? 1 : na, title="LL Zone", color=color.new(color.blue, 80), style=shape.triangledown, location=location.belowbar)
plotshape(series=showLHZone and ta.highest(high, 2)[1] and ta.lowest(low, 2)[2] ? 1 : na, title="LH Zone", color=color.new(color.orange, 80), style=shape.triangleup, location=location.abovebar)
plotshape(series=showHLZone and ta.lowest(low, 2)[1] and ta.highest(high, 2)[2] ? 1 : na, title="HL Zone", color=color.new(color.orange, 80), style=shape.triangledown, location=location.belowbar)


Больше