Количественная стратегия на основе Stochastic Momentum Index и RSI


Дата создания: 2023-12-12 15:20:29 Последнее изменение: 2023-12-12 15:20:29
Копировать: 0 Количество просмотров: 1174
1
Подписаться
1621
Подписчики

Количественная стратегия на основе Stochastic Momentum Index и RSI

Обзор

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

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

В основе этой стратегии лежат два показателя: SMI и RSI. SMI определяет, является ли акция перекупленной, а RSI определяет, является ли она относительно слабой.

  1. SMI перепродажа ((ниже нижней границы), рассматривается как сигнал к покупке
  2. RSI ниже отметки, это сигнал к покупке
  3. Сигнал “купить” появляется, когда SMI перепродает и RSI одновременно находится ниже соответствующей отметки
  4. Логика определения пустого сигнала аналогична

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

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

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

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

Стратегические риски и оптимизация

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

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

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

Исходный код стратегии
/*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()