Стратегия торговли с отложенным RSI


Дата создания: 2023-10-07 15:38:56 Последнее изменение: 2023-10-07 15:38:56
Копировать: 0 Количество просмотров: 701
1
Подписаться
1617
Подписчики

Обзор

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

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

Эта стратегия использует RSI длиной 21 цикла для определения перекупа и перепродажи. Когда RSI пересекает линию перекупа, установленную пользователем (по умолчанию 60), считается перекуп; когда RSI пересекает линию перепродажи, установленную пользователем (по умолчанию 40), считается перепродажа.

После появления сигнала перекупа и перепродажи, стратегия не сразу вступает в игру, а начинает рассчитывать цикл задержки. Когда количество циклов задержки (по умолчанию 15 циклов) будет удовлетворено, затем в соответствии с сигналом перекупа сделайте пустоту, а сигнал перепродажи сделайте больше.

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

Кроме того, в стратегии также реализованы такие опции, как остановка, остановка и обратная торговля. Пользователи могут выбрать, как управлять позициями в виде фиксированного остановки, отслеживания остановки, фиксированной остановки и т. Д. Также можно выбрать логику обратной торговли, то есть делать больше, а не больше, в соответствии с сигналом перекупа.

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

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

  2. Механизм задержки входа позволяет избежать убытков, вызванных ложными прорывами. Многие прорывы не обязательно представляют собой существенный поворот, задержка входа может подтвердить эффективность прорыва.

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

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

  5. Предоставление реверсивной торговой опции, адаптированной к различным характеристикам разновидностей. Пользователи могут выбрать позитивную или реверсивную логику торговли, чтобы схуднуть неопределенность.

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

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

  2. Слишком большая задержка рискует пропустить время входа. Слишком длинная задержка может пропустить лучшую точку.

  3. Обратная торговля увеличивает риск потерь. Обратная торговля, хотя и может покрыть неопределенность, может также увеличить общие потери.

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

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

В связи с вышеуказанными рисками рекомендуется:

  1. В сочетании с другими показателями фильтрации RSI сигналов, повышение надежности. Например, KDJ, MACD и другие показатели.

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

  3. Осторожно используйте функцию обратного трейдинга, предпочтительно в сочетании с трендовым трейдингом и т.д.

  4. При отслеживании стоп-лосов устанавливайте более широкие интервалы, чтобы избежать слишком близкого приближения к текущей цене.

  5. Тестирование различных стоп-множеств для определения оптимальных параметров. Также можно рассматривать динамические стопы.

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

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

  1. В сочетании с различными индикаторами фильтруют входные сигналы. Например, KDJ, MACD и другие индикаторы в сочетании с RSI могут создать более надежный торговый сигнал.

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

  3. Оптимизация стратегии стоп-стоп. Можно изучить динамические стоп-стоп, стоп-стоп доходности, стоп-стоп времени и т. Д., Чтобы стоп-стоп-стоп был более соответствующим рыночным колебаниям.

  4. В сочетании с трендовыми факторами. Можно определить, соответствует ли направление прорыва направлению большого тренда, чтобы избежать обратной торговли. Можно также скорректировать количество задержек циклов в зависимости от силы прорыва.

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

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

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

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

Исходный код стратегии
/*backtest
start: 2023-01-01 00:00:00
end: 2023-10-06 00:00:00
period: 1d
basePeriod: 1h
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/
// © tweakerID and © BacktestRookies

// This strategy uses a 21 period RSI with an overbought (RSI indicator 
// is greater than) level of 60 (user defined) to determines long entries and an oversold 
// (RSI indicator is less than) level of 40 (user defined) for shorts. It introduces a bar delay that starts
// counting when the RSI < Oversold or RSI > Overbought conditions are true, delaying the entry with 
// the amount of bars determined by the user. The trading logic can be reversed, which seems to work better.

//@version=4
strategy("Delayed RSI Strategy", 
     overlay=false, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     initial_capital=10000, 
     commission_value=0.04, 
     calc_on_every_tick=false, 
     slippage=0)
     
direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : 
 (direction < 0 ? strategy.direction.short : strategy.direction.long))

// Bought and Sold Boolean Signal
bought = strategy.position_size > strategy.position_size[1] 
 or strategy.position_size < strategy.position_size[1]

/////////////////////// STRATEGY INPUTS ////////////////////////////////////////
title1=input(true, "-----------------Strategy Inputs-------------------")  

rsiLen=input(21, title="RSI Length")
i_OB = input(60, title="Overbought")
i_OS = input(40, title="Oversold")
i_delay = input(15, title="Entry Delay (# of Bars)")
i_Close= input(false, title="Use Strategy Close")

/////////////////////// BACKTESTER /////////////////////////////////////////////
title2=input(true, "-----------------General Inputs-------------------")  

// Backtester General Inputs
i_SL=input(true, title="Use Stop Loss and Take Profit")
TS=input(false, title="Use Trailing Stop")
i_SLType=input(defval="ATR Stop", title="Type Of Stop", options=["Strategy Stop", "Swing Lo/Hi", "ATR Stop"])
i_SPL=input(defval=10, title="Swing Point Lookback")
i_PercIncrement=input(defval=3, step=.1, title="Swing Point SL Perc Increment")*0.01
i_ATR = input(14, title="ATR Length")
i_ATRMult = input(3, step=.1, title="ATR Multiple")
i_TPRRR = input(2, step=.1, title="Take Profit Risk Reward Ratio")
DPR=input(false, "Allow Direct Position Reverse")
reverse=input(true, "Reverse Trades")

// Swing Points Stop and Take Profit
SwingStopProfit() =>
    LL=(lowest(i_SPL))*(1-i_PercIncrement)
    HH=(highest(i_SPL))*(1+i_PercIncrement)
    LL_price = valuewhen(bought, LL, 0)
    HH_price = valuewhen(bought, HH, 0)
    entry_LL_price = strategy.position_size > 0 ? LL_price : na 
    entry_HH_price = strategy.position_size < 0 ? HH_price : na 
    tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR
    stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR
    [entry_LL_price, entry_HH_price, tp, stp]

// ATR Stop
ATRStop() =>
    ATR=atr(i_ATR)*i_ATRMult
    ATRLong = ohlc4 - ATR
    ATRShort = ohlc4 + ATR
    ATRLongStop = valuewhen(bought, ATRLong, 0)
    ATRShortStop = valuewhen(bought, ATRShort, 0)
    LongSL_ATR_price = strategy.position_size > 0 ? ATRLongStop : na 
    ShortSL_ATR_price = strategy.position_size < 0 ? ATRShortStop : na 
    ATRtp=strategy.position_avg_price + (strategy.position_avg_price - LongSL_ATR_price)*i_TPRRR
    ATRstp=strategy.position_avg_price - (ShortSL_ATR_price - strategy.position_avg_price)*i_TPRRR
    [LongSL_ATR_price, ShortSL_ATR_price, ATRtp, ATRstp]
    
// Strategy Stop
StrategyStop(bought) =>
    float LongStop = na
    float ShortStop = na
    float StratTP = na
    float StratSTP = na
    [LongStop, ShortStop, StratTP, StratSTP]

//TrailingStop
TrailingStop(SL,SSL) =>
    dif=(valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, high,0))
     -strategy.position_avg_price
    trailOffset     = strategy.position_avg_price - SL
    var tstop = float(na)
    if strategy.position_size > 0
        tstop := high- trailOffset - dif
        if tstop<tstop[1]
            tstop:=tstop[1]
    else
        tstop := na
    StrailOffset     = SSL - strategy.position_avg_price
    var Ststop = float(na)
    Sdif=strategy.position_avg_price-(valuewhen(strategy.position_size<0 
     and strategy.position_size[1]>=0, low,0))
    if strategy.position_size < 0
        Ststop := low+ StrailOffset + Sdif
        if Ststop>Ststop[1]
            Ststop:=Ststop[1]
    else
        Ststop := na
    [tstop, Ststop]
  
//Stop Loss & Take Profit Switches  
SLTPLogic(LongStop, ShortStop, StratTP, StratSTP, LongSL_ATR_price, ShortSL_ATR_price, ATRtp, ATRstp,
 entry_LL_price, entry_HH_price, tp, stp) =>
    SL= i_SLType == "Swing Lo/Hi" ? entry_LL_price : i_SLType == "ATR Stop" ? LongSL_ATR_price : LongStop
    SSL= i_SLType == "Swing Lo/Hi" ? entry_HH_price : i_SLType == "ATR Stop" ? ShortSL_ATR_price : ShortStop
    TP= i_SLType == "Swing Lo/Hi" ? tp : i_SLType == "ATR Stop" ? ATRtp : StratTP
    STP= i_SLType == "Swing Lo/Hi" ? stp : i_SLType == "ATR Stop" ? ATRstp : StratSTP
    [SL, SSL, TP, STP]


/////////////////////// STRATEGY LOGIC /////////////////////////////////////////

rsi = rsi(close, rsiLen)
isOB= rsi > i_OB
isOS= rsi < i_OS
BarsSinceOB = barssince(not isOB)
BarsSinceOS = barssince(not isOS)

BUY = BarsSinceOS == i_delay
SELL = BarsSinceOB == i_delay

/////////////////////// FUNCTION CALLS /////////////////////////////////////////

// Stops and Profits
[entry_LL_price, entry_HH_price, tp, stp] = SwingStopProfit()
[LongSL_ATR_price, ShortSL_ATR_price, ATRtp, ATRstp] = ATRStop()
[LongStop, ShortStop, StratTP, StratSTP] = StrategyStop(bought)
[SL, SSL, TP, STP] = SLTPLogic(LongStop, ShortStop, StratTP, StratSTP, 
 LongSL_ATR_price, ShortSL_ATR_price, ATRtp, ATRstp, entry_LL_price, entry_HH_price, tp, stp)
[tstop, Ststop] = TrailingStop(SL,SSL)

// Entries
if reverse
    if not DPR
        strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0)
    else     
        strategy.entry("long", strategy.long, when=SELL)
        strategy.entry("short", strategy.short, when=BUY)
else
    if not DPR 
        strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0)
    else
        strategy.entry("long", strategy.long, when=BUY)
        strategy.entry("short", strategy.short, when=SELL)
// Exits
if i_SL
    strategy.exit("TP & SL", "long", limit=TP, stop=TS? tstop : SL)
    strategy.exit("TP & SL", "short", limit=STP, stop=TS? Ststop : SSL)
    
if i_Close
    strategy.close_all(when=cross(rsi, 50))

/////////////////////// PLOTS //////////////////////////////////////////////////

//Plots
rsiplot = plot(rsi, "RSI", color=#7E57C2)
band1 = hline(i_OB, "Upper Band", color=#787B86)
bandm = hline(50, "Middle Band", color=color.new(#787B86, 50))
band0 = hline(i_OS, "Lower Band", color=#787B86)
fill(band1, band0, color=color.rgb(126, 87, 194, 90), title="Background")
plot(rsi, "RSI", color=#7E57C2)
// OSOBCount = plot(isOB ? BarsSinceOB : isOS ? BarsSinceOS : na, transp=100)
// OSOBColor = color.from_gradient(isOB ? BarsSinceOB : BarsSinceOS, 0, 20, color.black, isOB ? color.red : isOS ? color.green : na)
// OBP = plot(rsi > i_OB ? rsi : na, color=color.white, display=display.none)
// fill(plot(i_OB, display=display.none), OBP, color=OSOBColor, transp=0, fillgaps=false)
// OSP = plot(rsi < i_OS ? rsi : na, color=color.white, display=display.none)
// fill(plot(i_OS, display=display.none), OSP, color=OSOBColor, transp=0, fillgaps=false)

// plotshape(BUY ? 1 : na, style=shape.arrowdown, location=location.bottom, 
//  color=color.green, title="Bullish Setup", size=size.normal)
// plotshape(SELL ? 1 : na, style=shape.arrowup, location=location.top, 
//  color=color.red, title="Bearish Setup", size=size.normal)