Стратегия разворота аномальных колебаний цен


Дата создания: 2023-10-11 16:03:36 Последнее изменение: 2023-10-11 16:03:36
Копировать: 1 Количество просмотров: 689
1
Подписаться
1617
Подписчики

Обзор

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

Принципы

В этой стратегии используются два основных показателя:

  1. VixFix индикатор: рассчитывает стандартную разницу цены в течение определенного периода, чтобы определить, есть ли необычные колебания цены. Конкретный метод расчета:
wvf = ((highest(close, pd)-low)/(highest(close, pd)))*100 
sDev = mult * stdev(wvf, bbl)
midLine = sma(wvf, bbl)  
lowerBand = midLine - sDev
upperBand = midLine + sDev

Из них wvf - это частота колебаний цены, sDev - это стандартная разница, midLine - это средняя линия, lowerBand и upperBand - это нижние и верхние границы соответственно. Когда цена превышает верхние границы, считается, что возникло необычное колебание.

  1. 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)) 

Когда RSI ниже определенного значения, это означает, что цена находится в состоянии перепродажи, и может произойти отскок. Когда RSI выше определенного значения, это означает, что цена находится в состоянии перекупа, и может произойти откат.

Вход и выход

Логика входа и выхода из стратегии выглядит следующим образом:

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

Открытие позиции: когда цена превышает верхнюю линию или волатильность превышает пороговое значение, а RSI превышает определенное значение.

Условия выхода: открытие позиции в направлении, противоположном направлению к линии K.

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

  • Используйте статистические характеристики необычных колебаний цен, чтобы определить, когда они могут измениться, и охватить их.
  • В сочетании с RSI, можно повысить точность входа в рынок.
  • Применение минимального разрыва стандарта прорыва в качестве входного сигнала может уменьшить вероятность промаха.
  • Использование реверсивности в качестве метода остановки убытков позволяет быстро прекратить убытки и снизить потери.

Риск

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

Оптимизация

  • Оптимизация циклических параметров стандартного отклонения, чтобы лучше улавливать аномальные колебания цен.
  • Оптимизируйте параметры RSI, чтобы найти лучшие критерии для определения перекупа и перепродажи.
  • Попробуйте сочетать другие показатели, такие как KDJ, MACD и т.д., чтобы определить время обратного хода.
  • Оптимизация метода остановки, установка величины реверсии цены в качестве критерия остановки.

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

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

Исходный код стратегии
/*backtest
start: 2022-10-04 00:00:00
end: 2023-10-10 00:00:00
period: 2d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

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

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
leverage = input(1, defval = 1, minval = 1, maxval = 100, title = "leverage")
limit = input(40, defval = 40, minval = 2, maxval = 50, title = "RSI Limit")

pd = input(22, title="LookBack Period Standard Deviation High")
bbl = input(20, title="Bolinger Band Length")
mult = input(2.0, minval = 1, maxval = 5, title = "Bollinger Band Standard Devaition Up")
lb = input(50, title="Look Back Period Percentile High")
ph = input(.85, title="Highest Percentile - 0.90=90%, 0.95=95%, 0.99=99%")
pl = input(1.01, title="Lowest Percentile - 1.10=90%, 1.05=95%, 1.01=99%")
hp = input(false, title="Show High Range - Based on Percentile and LookBack Period?")
sd = input(false, title="Show Standard Deviation Line?")

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")

//Vix Fix
wvf = ((highest(close, pd)-low)/(highest(close, pd)))*100
sDev = mult * stdev(wvf, bbl)
midLine = sma(wvf, bbl)
lowerBand = midLine - sDev
upperBand = midLine + sDev
rangeHigh = (highest(wvf, lb)) * ph
rangeLow = (lowest(wvf, lb)) * pl

col = wvf >= upperBand or wvf >= rangeHigh ? lime : gray

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

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

//Signals
up = (wvf >= upperBand or wvf >= rangeHigh) and fastrsi < limit and close < open
dn = (wvf >= upperBand or wvf >= rangeHigh) and fastrsi > (100 - limit) and close > open
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body > abody / 3

//Trading
lot = strategy.position_size == 0 ? strategy.equity / close * leverage : lot[1]

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

if dn
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Top", 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()