
Стратегия динамического колебания - это количественная стратегия торговли, которая сочетает в себе случайные динамические показатели и относительно сильные показатели. Эта стратегия использует случайные динамические показатели для определения перепродажи рынка, в сочетании с быстрыми RSI-фильтрационными сигналами, а затем с помощью физических фильтров для более надежного выбора торговых сигналов.
Индекс случайной динамики (SMI) - это технический показатель, часто используемый в количественной торговле, который сочетает в себе преимущества динамического и шоколадного показателей.
В частности, SMI рассчитывается по формуле:
SMI = (Close - (HH + LL)/2)/(0.5*(HH - LL)) * 100
где HH - самая высокая цена за последние N дней, а LL - самая низкая цена за последние N дней.
Таким образом, SMI сочетает в себе тенденционное суждение о динамике и реверсивное суждение о колебаниях. Когда SMI выше 80, это перекуп, а когда он ниже 20, это перепродажа.
Относительно сильный индекс (RSI) является одним из наиболее часто используемых индикаторов сверхпокупа и сверхпродажи. В этой стратегии используется быстрый RSI с циклом 7, чтобы оценить состояние сверхпокупа и сверхпродажи в краткосрочной перспективе.
Когда быстрый RSI ниже 20 - это перепродажа, а выше 80 - это перепродажа. Стратегия посылает торговый сигнал в зоне перепродажи.
Эта стратегия также включает в себя фильтр объектов, который отфильтровывает части сигналов, рассчитывая размер объектов K-линии. Сигналы торгов выдаются только тогда, когда объекты K-линии превышают определенный порог.
Это поможет отфильтровать ложные сигналы и повысить их надежность.
Стратегия объединяет три части: индикатор случайной динамики, индикатор быстрого RSI и физический фильтр. Объединение нескольких индикаторов позволяет повысить точность сигнала и укрепить стратегию.
Индекс случайной динамики и быстрый индикатор RSI позволяют точно определить состояние перекупа и перепродажи на рынке. Стратегия заключения позиций в зоне перекупа и перепродажи, следуя принципу покупки низких и продажи высоких позиций.
Стратегия позволяет проводить многоголовые и двухголовые сделки, чтобы максимально использовать возможности рынка.
Добавление физических фильтров, которые отфильтровывают большую часть шума, чтобы избежать попадания в шок.
Стратегия двунаправленной торговли, частое переключение с нескольких свободных голов является потенциальным риском. Надлежащая оптимизация логики открытия позиций может снизить этот риск.
Когда индикатор дает сигнал, может быть собрано большое количество торговцев в течение короткого времени, что приводит к риску обратного курса. Этот риск можно снизить путем оптимизации параметров индикатора.
В крайних случаях все модели могут потерпеть неудачу. Такие риски необходимо контролировать с помощью разумной установки стоп-лосс.
Поиск оптимальных параметров для повышения доходности стратегии может быть осуществлен путем тестирования различных комбинаций параметров, таких как циклы SMI, циклы RSI, пороги физических фильтров.
Построение динамических механизмов остановки убытков на основе ATR или волатильности позволяет лучше контролировать риски отдельных акций и в целом.
Внедрение алгоритмов машинного обучения для прогнозирования будущего движения показателей с помощью моделей. Это позволяет заранее определить переломные моменты показателей и повысить прогрессивность стратегии.
В целом, эта стратегия включает в себя индикаторы случайной динамики, быстрые индикаторы RSI и физические фильтры, что позволяет получить более полную систему суждения о перекупке и перепродаже. Сочетание нескольких индикаторов повышает точность сигналов, а двусторонняя торговля и механизм управления рисками делают стратегию более сбалансированной.
/*backtest
start: 2023-12-22 00:00:00
end: 2024-01-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//Noro
//2018
//@version=2
strategy(title = "Noro's Stochastic Strategy v1.1", shorttitle = "Stochastic str 1.1", 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")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(5, "SMI Percent K Length")
b = input(3, "SMI Percent D Length")
limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
fromyear = input(2017, defval = 2017, 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), 7)
fastdown = rma(-min(change(close), 0), 7)
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)
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(limit, color = black, title = "Over Bought")
plot(-1 * limit, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")
//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 3 or usebod == false
//Signals
up1 = SMIsignal < -1 * limit and close < open and body and usesmi
dn1 = SMIsignal > limit and close > open and body and usesmi
up2 = fastrsi < 20 and close < open and body and usersi
dn2 = fastrsi > 80 and close > open and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body
//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()