Стратегия отслеживания пропущенных сигналов на основе обратного RSI


Дата создания: 2023-09-28 10:54:24 Последнее изменение: 2023-09-28 10:54:24
Копировать: 1 Количество просмотров: 696
1
Подписаться
1621
Подписчики

Обзор

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

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

Сигнал установлен.

RSI используется для определения перекупа и перепродажи. Когда RSI пересекает установленную линию перекупа, это сигнал перекупа, а когда она пересекает линию перепродажи, это сигнал перепродажи.

overbought = rsi > uplimit 
oversold = rsi < dnlimit

Если предыдущий K-линейный RSI находится в состоянии перекупа, то текущий K-линейный RSI выходит из состояния перекупа, создавая следящий сигналup1; если предыдущий K-линейный RSI находится в состоянии перепродажи, то текущий K-линейный RSI выходит из состояния перепродажи, создавая отслеживающий сигнал пробегаdn1

up1 = bar == -1 and strategy.position_size == 0 and overbought[1] and overbought == false
dn1 = bar == 1 and strategy.position_size == 0 and oversold[1] and oversold == false 

Выход из приговора

Сигнал выхода возникает, когда направление удержания позиции совпадает с направлением K-линии, и когда организация пробивает половину своей 10-циклической средней.

exit = (((strategy.position_size > 0 and bar == 1) or 
         (strategy.position_size < 0 and bar == -1)) and 
        body > abody / 2)

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

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

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

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

Риски и решения

  1. Риск ложных сигналов в RSI

    • Решение: проверьте в сочетании с другими показателями, чтобы избежать ошибок.
  2. При отслеживании сигналов, цены, возможно, уже изменились, и существует риск потерь.

    • Решение: снизить входную позицию или оптимизировать время входа.
  3. Некоторые отскоки не приносят прибыли и рискуют вызвать отставку.

    • Решение: оптимизация логики выхода из сделки и повышение шансов на прибыль.

Оптимизация

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

  2. Настройка управления позицией, например, снижение позиции при отслеживании сигнала.

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

  4. Оптимизация способов выхода, повышение вероятности получения прибыли, такие как введение мобильных стопов и т.д.

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

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

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

Исходный код стратегии
/*backtest
start: 2023-09-20 00:00:00
end: 2023-09-27 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Anti RSI Strategy v1.0", shorttitle = "Anti RSI str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
rsiperiod1 = input(14, defval = 14, minval = 2, maxval = 50, title = "RSI Period")
rsilimit1 = input(25, defval = 25, minval = 1, maxval = 100, title = "RSI limit")
showarr = input(false, defval = false, title = "Show Arrows")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//RSI
uprsi1 = rma(max(change(close), 0), rsiperiod1)
dnrsi1 = rma(-min(change(close), 0), rsiperiod1)
rsi = dnrsi1 == 0 ? 100 : uprsi1 == 0 ? 0 : 100 - (100 / (1 + uprsi1 / dnrsi1))
uplimit = 100 - rsilimit1
dnlimit = rsilimit1

//Body
body = abs(close - open)
abody = sma(body, 10)

//Signals
bar = close > open ? 1 : close < open ? -1 : 0
overbought = rsi > uplimit
oversold = rsi < dnlimit

up1 = bar == -1 and strategy.position_size == 0 and overbought[1] and overbought == false
dn1 = bar == 1 and strategy.position_size == 0 and oversold[1] and oversold == false
up2 = bar == -1 and strategy.position_size > 0 and overbought == false
dn2 = bar == 1 and strategy.position_size < 0 and oversold == false

norma = overbought == false and oversold == false
exit = (((strategy.position_size > 0 and bar == 1) or (strategy.position_size < 0 and bar == -1)) and body > abody / 2)

//Arrows
col = exit ? black : up1 or dn1 or up2 or dn2 ? blue : na
needup = up1 or up2
needdn = dn1 or dn2
needexitup = exit and strategy.position_size < 0
needexitdn = exit and strategy.position_size > 0
plotarrow(showarr and needup ? 1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needdn ? -1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needexitup ? 1 : na, colorup = black, colordown = black, transp = 0)
plotarrow(showarr and needexitdn ? -1 : na, colorup = black, colordown = black, transp = 0)

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1 or up2
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn1 or dn2
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()