Индекс стохастического импульса и квантовая стратегия торговли на основе RSI

Автор:Чао Чжан, Дата: 2023-12-12 15:20:29
Тэги:

img

Обзор

Эта стратегия в основном основана на двух показателях - Stochastic Momentum Index (SMI) и Relative Strength Index (RSI). Она также включает цветовой фильтр и фильтр тела свечи в качестве вспомогательных условий суждения. Торговые сигналы генерируются на основе сигналов покупки и продажи от SMI и RSI в сочетании с условиями фильтра. Эта стратегия может эффективно обнаруживать краткосрочные торговые возможности на рынке.

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

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

  1. Если SMI перепродан (ниже нижнего предела), он считается сигналом покупки.
  2. Если RSI ниже порогового значения, он считается сигналом покупки.
  3. При перепродаже SMI и снижении показателя RSI ниже соответствующего порога запускается сигнал покупки.
  4. Логика сигнала продажи схожа.

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

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

Преимущества

  1. Используйте SMI для перекупленного / перепроданного и RSI для относительной силы, двойное подтверждение может уменьшить ложные сигналы
  2. Двойной сигнал может значительно уменьшить неэффективные сделки
  3. Цветовые и телесные фильтры могут эффективно отфильтровать ложные прорывы
  4. Логика стратегии проста и чиста.
  5. Большинство параметров можно настроить

Риски и оптимизация

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

Резюме

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


/*backtest
start: 2023-12-04 00:00:00
end: 2023-12-06 19:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.3", shorttitle = "Stochastic str 1.3", overlay = false, 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, %")
usesmi = input(true, defval = true, title = "Use SMI Strategy")
usersi = input(true, defval = true, title = "Use RSI Strategy")
usecol = input(true, defval = true, title = "Use Color-Filter")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(2, defval = 2, minval = 2, maxval = 50, title = "SMI Percent K Length")
b = input(2, defval = 2, minval = 2, maxval = 50, title = "SMI Percent D Length")
limitsmi = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
periodrsi = input(2, defval = 2, minval = 2, maxval = 50, title = "RSI Period")
limitrsi = input(10, defval = 10, minval = 1, maxval = 50, title = "RSI Limit")
double = input(false, defval = false, title = "SMI+RSI Mode")
showbg = input(false, defval = false, title = "Show background")
fromyear = input(2018, defval = 2018, 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")

//Fast RSI
fastup = rma(max(change(close), 0), periodrsi)
fastdown = rma(-min(change(close), 0), periodrsi)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Stochastic Momentum Index
ll = lowest (low, a)
hh = highest (high, a)
diff = hh - ll
rdiff = close - (hh+ll)/2
//avgrel = ema(ema(rdiff,b),b)
//avgdiff = ema(ema(diff,b),b)
avgrel = sma(sma(rdiff,b),b)
avgdiff = sma(sma(diff,b),b)
SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0
SMIsignal = ema(SMI,b)

//Lines
plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index")
plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line")
plot(limitsmi, color = black, title = "Over Bought")
plot(-1 * limitsmi, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

//Color-Filter
gb = close > open or usecol == false
rb = close < open or usecol == false

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 3 or usebod == false

//Signals
up1 = SMI < -1 * limitsmi and rb and body and usesmi
dn1 = SMI > limitsmi and gb and body and usesmi
up2 = fastrsi < limitrsi and rb and body and usersi
dn2 = fastrsi > 100 - limitrsi and gb and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Background
redb = (SMI > limitsmi and usesmi) or (fastrsi > 100 - limitrsi and usersi)
limeb = (SMI < -1 * limitsmi and usesmi) or (fastrsi < limitrsi and usersi)
col = showbg == false ? na : redb ? red : limeb ? lime : na
bgcolor(col, transp = 50)

//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]

signalup = ((up1 or up2) and double == false) or (up1 and up2 and double)
if signalup
    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)))

signaldn = ((dn1 or dn2) and double == false) or (dn1 and dn2 and double)
if signaldn
    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()

Больше