Динамическая стратегия поглощения

Автор:Чао Чжан, Дата: 2024-02-29 11:24:18
Тэги:

img

Обзор

Динамическая стратегия поглощения тренда - это торговая стратегия, которая занимает длинные или короткие позиции на основе поглощающих моделей в направлении тренда. Эта стратегия использует средний истинный диапазон (ATR) для измерения волатильности рынка, индикатор Supertrend для определения направления тренда рынка и вступает в сделки, когда поглощающие модели согласуются с направлением тренда.

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

  1. Расчет ATR для измерения волатильности рынка.
  2. Вычислить индикатор Supertrend для определения тенденции рынка.
  3. Определить условия восходящего и нисходящего тренда.
  4. Определить бычье поглощение (в восходящем тренде) и медвежье поглощение (в нисходящем тренде).
  5. Уровень стоп-лосса (SL) и уровень прибыли (TP) рассчитывается на основе паттернов поглощения.
  6. Вступайте в сделки, когда охватывающие модели совпадают с направлением тренда.
  7. Выходные сделки, когда цена достигает уровня SL или TP.
  8. Нарисуйте на графике схемы поглощения.

Анализ преимуществ

Преимущества этой стратегии включают:

  1. Улучшенное качество сигнала путем сочетания моделей поглощения с тенденцией.
  2. Способность определять обратные тенденции для точных записей.
  3. Проясните длинные/короткие сигналы для лучшего синхронизации.
  4. Стратегия "остановка поглощения" следует тенденции, управляя рисками.
  5. Модульная рамка кода для легкой оптимизации.

Анализ рисков

Также следует учитывать некоторые риски:

  1. Узоры поглощения могут оказаться ложными.
  2. Трудно определить оптимальные параметры, такие как размер узора, длительность и т.д.
  3. Несовершенное определение тренда может привести к ложным сигналам.
  4. Уровни стоп-лосса и прибыли зависят от усмотрения и могут быть субъективными.
  5. Производительность зависит от настройки параметров на основе исторических данных.

Риски могут быть смягчены:

  1. Добавляю фильтры для удаления ложных сигналов.
  2. Использование адаптивного ATR для надежных вычислений параметров.
  3. Улучшение определения трендов с помощью машинного обучения.
  4. Найти оптимальные параметры с помощью генетических алгоритмов.
  5. Обратное тестирование в течение более длительных периодов для обеспечения надежности.

Руководство по оптимизации

Есть возможности для дальнейшей оптимизации:

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

Заключение

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


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Malikdrajat


//@version=4
strategy("Engulfing with Trend", overlay=true)

Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=true)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)

atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2

up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn

trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend

upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
alertcondition(buySignal, title="SuperTrend Buy", message="SuperTrend Buy!")
alertcondition(sellSignal, title="SuperTrend Sell", message="SuperTrend Sell!")
changeCond = trend != trend[1]
alertcondition(changeCond, title="SuperTrend Direction Change", message="SuperTrend has changed direction!")

// Define Downtrend and Uptrend conditions
downtrend = trend == -1
uptrend = trend == 1


// Engulfing 
boringThreshold = input(25, title="Boring Candle Threshold (%)", minval=1, maxval=100, step=1)
engulfingThreshold = input(50, title="Engulfing Candle Threshold (%)", minval=1, maxval=100, step=1)
stopLevel = input(200, title="Stop Level (Pips)", minval=1)


// Boring Candle (Inside Bar) and Engulfing Candlestick Conditions
isBoringCandle = abs(open[1] - close[1]) * 100 / abs(high[1] - low[1]) <= boringThreshold
isEngulfingCandle = abs(open - close) * 100 / abs(high - low) <= engulfingThreshold

// Bullish and Bearish Engulfing Conditions
bullEngulfing = uptrend and close[1] < open[1] and close > open[1] and not isBoringCandle and not isEngulfingCandle
bearEngulfing = downtrend and close[1] > open[1] and close < open[1] and not isBoringCandle and not isEngulfingCandle

// Stop Loss, Take Profit, and Entry Price Calculation
bullStop = close + (stopLevel * syminfo.mintick)
bearStop = close - (stopLevel * syminfo.mintick)
bullSL = low 
bearSL = high
bullTP = bullStop + (bullStop - low)
bearTP = bearStop - (high - bearStop)

// Entry Conditions
enterLong = bullEngulfing and uptrend
enterShort = bearEngulfing and downtrend

// Exit Conditions
exitLong = crossover(close, bullTP) or crossover(close, bullSL)
exitShort = crossover(close, bearTP) or crossover(close, bearSL)

// Check if exit conditions are met by the next candle
exitLongNextCandle = exitLong and (crossover(close[1], bullTP[1]) or crossover(close[1], bullSL[1]))
exitShortNextCandle = exitShort and (crossover(close[1], bearTP[1]) or crossover(close[1], bearSL[1]))

// Strategy Execution
strategy.entry("Buy", strategy.long, when=enterLong )
strategy.entry("Sell", strategy.short, when=enterShort )

// Exit Conditions for Long (Buy) Positions
if (bullEngulfing and not na(bullTP) and not na(bullSL))
    strategy.exit("Exit Long", from_entry="Buy", stop=bullSL, limit=bullTP)

// Exit Conditions for Short (Sell) Positions
if (bearEngulfing and not na(bearTP) and not na(bearSL))
    strategy.exit("Exit Short", from_entry="Sell", stop=bearSL, limit=bearTP)

// Plot Shapes and Labels
plotshape(bullEngulfing, style=shape.triangleup, location=location.abovebar, color=color.green)
plotshape(bearEngulfing, style=shape.triangledown, location=location.abovebar, color=color.red)

// Determine OP, SL, and TP
plot(bullEngulfing ? bullStop : na, title="Bullish Engulfing stop", color=color.red, linewidth=3, style=plot.style_linebr)
plot(bearEngulfing ? bearStop : na, title="Bearish Engulfing stop", color=color.red, linewidth=3, style=plot.style_linebr)
plot(bullEngulfing ? bullSL : na, title="Bullish Engulfing SL", color=color.red, linewidth=3, style=plot.style_linebr)
plot(bearEngulfing ? bearSL : na, title="Bearish Engulfing SL", color=color.red, linewidth=3, style=plot.style_linebr)
plot(bullEngulfing ? bullTP : na, title="Bullish Engulfing TP", color=color.green, linewidth=3, style=plot.style_linebr)
plot(bearEngulfing ? bearTP : na, title="Bearish Engulfing TP", color=color.green, linewidth=3, style=plot.style_linebr)



Больше