Стратегия обратной торговли по отслеживанию сигналов RSI

Автор:Чао Чжан, Дата: 2023-09-28 10:54:24
Тэги:

Обзор

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

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

Идентификация сигнала

Показатель RSI определяет уровни перекупленности/перепроданности. Перекупленность, когда RSI превышает порог перекупленности, перепроданность, когда переходит порог перепроданности.

overbought = rsi > uplimit
oversold = rsi < dnlimit

Если RSI был перекуплен последний бар и выходы перекуплен этот бар, сигнал покупкиup1Если 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

Логика выхода

Если направление стойки совпадает с направлением положения, а корпус стойки превышает половину среднего показателя за 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. Включите направление и размер строк в логику выхода, чтобы избежать дальнейшего отслеживания после отступления.

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

  1. Риск ложных сигналов от РСИ

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

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

    • Решение: улучшить логику выхода, чтобы увеличить шансы на получение прибыли

Возможности для расширения

  1. Оптимизировать параметры, такие как уровень перекупленности/перепроданности, период просмотра и т.д. на основе различных рынков

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

  3. Улучшить время входа, добавив фильтры за пределами сигналов отслеживания

  4. Увеличить выход для увеличения прибыли, как отслеживание прибыли остановки

  5. Оптимизируйте остановки для уменьшения потерь, например, остановки отслеживания или конусные остановки

Резюме

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


/*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()

Больше