Стратегия обратного захвата


Дата создания: 2023-11-24 16:43:25 Последнее изменение: 2023-11-24 16:43:25
Копировать: 0 Количество просмотров: 676
1
Подписаться
1617
Подписчики

Стратегия обратного захвата

Обзор

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

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

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

  1. Для определения направления тенденции большого цикла используйте 50-дневную ЭМА и 21-дневную ЭМА.
  2. В нисходящем тренде, когда цены выросли и прорвались по пути Бринга, а RSI только что отскочил от зоны перепродажи, появилась форма золотого воротника, указывающая на то, что зона перепродажи уже закрепилась, и рассматривается как сигнал к покупке.
  3. Во время восходящего тренда, когда цены падают, чтобы выйти за пределы Брин, и RSI только что вышел из зоны перекупа, появляется форма мертвой форки, которая указывает на то, что зона перекупа начала откликнуться, и рассматривается как сигнал продажи.
  4. Вышеуказанные сигналы покупки и продажи должны быть выполнены одновременно, чтобы избежать ложных сигналов.

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

Эта стратегия имеет следующие преимущества:

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

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

Также существуют следующие риски:

  1. Риск ложного сигнала, пробиваемого по каналу Бринлин, требует фильтрации RSI.
  2. Риск неудачи в обратном направлении требует своевременной ликвидации.
  3. Недостаточно точно определить время поворота, что может привести к раннему вхождению в игру или пропуску оптимального места.

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

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

Эта стратегия может быть оптимизирована в следующих направлениях:

  1. Оптимизация параметров пояса Бурин, корректировка длины циклов и размера стандартного отклонения, поиск оптимальной комбинации параметров.
  2. Оптимизация циклов движущихся средних, определение оптимальной длины цикла для определения трендов.
  3. Настройка параметров RSI для поиска оптимального диапазона сверхпокупаемых и сверхпродаваемых зон.
  4. Добавление других показателей, таких как KDJ, MACD и т. д., обогащает причины входа в систему.
  5. Добавление алгоритмов машинного обучения для автоматического поиска оптимальных параметров с использованием технологии ИИ.

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

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

Исходный код стратегии
/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This is an Open source work. Please do acknowledge in case you want to reuse whole or part of this code.
// Please see the documentation to know the details about this.

//@version=5
strategy('Strategy:Reversal-Catcher', shorttitle="Reversal-Catcher", overlay=true , currency=currency.NONE, initial_capital=100000)

// Inputs
src = input(close, title="Source (close, high, low, open etc.")

BBlength = input.int(defval=20, minval=1,title="Bollinger Period Length, default 20")
BBmult = input.float(defval=1.5, minval=1.0, maxval=4, step=0.1, title="Bollinger Bands Standard Deviation, default is 1.5")

fastMovingAvg = input.int(defval=21, minval=5,title="Fast Exponential Moving Average, default 21", group = "Trends")
slowMovingAvg = input.int(defval=50, minval=8,title="Slow Exponential Moving Average, default 50", group = "Trends")

rsiLenght = input.int(defval=14, title="RSI Lenght, default 14", group = "Momentum")
overbought = input.int(defval=70, title="Overbought limit (RSI), default 70", group = "Momentum")
oversold = input.int(defval=30, title="Oversold limit (RSI), default 30", group = "Momentum")

hide = input.bool(defval=true, title="Hide all plots and legends from the chart (default: true)")


// Trade related
tradeType = input.string(defval='Both', group="Trade settings", title="Trade Type", options=['Both', 'TrendFollowing', 'Reversal'], tooltip="Consider all types of trades? Or only Trend Following or only Reversal? (default: Both).")
endOfDay = input.int(defval=1500, title="Close all trades, default is 3:00 PM, 1500 hours (integer)", group="Trade settings")
mktAlwaysOn = input.bool(defval=false, title="Markets that never closed (Crypto, Forex, Commodity)", tooltip="Some markers never closes. For those cases, make this checked. (Default: off)", group="Trade settings")


// Utils
annotatePlots(txt, val, hide) => 
    if (not hide)
        var l1 = label.new(bar_index, val, txt, style=label.style_label_left, size = size.tiny, textcolor = color.white, tooltip = txt)
        label.set_xy(l1, bar_index, val)

/////////////////////////////// Indicators /////////////////////
vwap = ta.vwap(src)
plot(hide ? na : vwap, color=color.purple, title="VWAP", style = plot.style_line)
annotatePlots('VWAP', vwap, hide)

// Bollinger Band of present time frame
[BBbasis, BBupper, BBlower] = ta.bb(src, BBlength, BBmult)
p1 = plot(hide ? na : BBupper, color=color.blue,title="Bollinger Bands Upper Line")
p2 = plot(hide ? na : BBlower, color=color.blue,title="Bollinger Bands Lower Line")
p3 = plot(hide ? na : BBbasis, color=color.maroon,title="Bollinger Bands Width", style=plot.style_circles, linewidth = 1)
annotatePlots('BB-Upper', BBupper, hide)
annotatePlots('BB-Lower', BBlower, hide)
annotatePlots('BB-Base(20-SMA)', BBbasis, hide)

// RSI
rsi = ta.rsi(src, rsiLenght)

// Trend following
ema50 = ta.ema(src, slowMovingAvg)
ema21 = ta.ema(src, fastMovingAvg)
annotatePlots('21-EMA', ema21, hide)
annotatePlots('50-EMA', ema50, hide)


// Trend conditions
upTrend = ema21 > ema50 
downTrend = ema21 < ema50


// Condition to check Special Entry: HH_LL
// Long side:
hhLLong = barstate.isconfirmed and (low > low[1]) and (high > high[1]) and (close > high[1])
hhLLShort = barstate.isconfirmed and (low < low[1]) and (high < high[1]) and (close < low[1])

longCond =  barstate.isconfirmed and (high[1] < BBlower[1]) and (close > BBlower) and (close < BBupper) and hhLLong and ta.crossover(rsi, oversold) and downTrend
shortCond = barstate.isconfirmed and (low[1] > BBupper[1]) and (close < BBupper) and (close > BBlower) and hhLLShort and ta.crossunder(rsi, overbought) and upTrend

// Trade execute
h = hour(time('1'), syminfo.timezone)
m = minute(time('1'), syminfo.timezone)
hourVal = h * 100 + m
totalTrades = strategy.opentrades + strategy.closedtrades
if (mktAlwaysOn or (hourVal < endOfDay))
    // Entry
    var float sl = na
    var float target = na
    if (longCond)
        strategy.entry("enter long", strategy.long, 1, limit=na, stop=na, comment="Long[E]")
        sl := low[1]
        target := high >= BBbasis ? BBupper : BBbasis
        alert('Buy:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)
    if (shortCond)
        strategy.entry("enter short", strategy.short, 1, limit=na, stop=na, comment="Short[E]")
        sl := high[1]
        target := low <= BBbasis ? BBlower : BBbasis
        alert('Sell:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)

    // Exit: target or SL
    if ((close >= target) or (close <= sl))
        strategy.close("enter long", comment=close < sl ? "Long[SL]" : "Long[T]")
    if ((close <= target) or (close >= sl))
        strategy.close("enter short", comment=close > sl ? "Short[SL]" : "Short[T]")
else if (not mktAlwaysOn)
    // Close all open position at the end if Day
    strategy.close_all(comment = "EoD[Exit]", alert_message = "EoD Exit", immediately = true)