
Стратегия представляет собой комплексную аналитическую систему, объединяющую несколько индикаторов, основанную на VAWSI (индекс весовой силы объема и ATR), индикаторе непрерывности тренда и модифицированной версии ATR для определения рыночных тенденций и возможных поворотных точек. Стратегия также вводит динамический длительности расчета, чтобы адаптироваться к различным рыночным условиям. Она управляет риском, устанавливая динамические остановки и выигрыши, и торгует при обнаружении потенциальных поворотных сигналов.
В основе этой стратегии лежит измерение силы, продолжительности и волатильности рыночных тенденций с помощью нескольких пользовательских показателей, чтобы найти оптимальное время для торговли. Она особенно подходит для рынков с заметными тенденциями, но также включает в себя адаптивные механизмы для обработки различных состояний рынка.
VAWSI: это оригинальный индикатор, похожий на RSI, но использующий VAWMA вместо RMA. Он измеряет силу возникающих тенденций.
Индикатор непрерывности тренда: еще один оригинальный индикатор, используемый для измерения продолжительности тренда. Он рассчитывает максимальное отклонение исходных данных от наивысшей/наименьшей точки в пределах указанной длины, а затем накапливает это отклонение и создает индекс силы.
Модифицированная версия ATR: взятая высоко-низкая и источник-максимальная величины предыдущего источника, а затем взятая абсолютная величина их изменения и унифицирована с исходными данными.
Динамический расчет длины: использует метод динамического расчета длины BlackCat1402 и корректирует параметры длины индикатора в зависимости от рыночных условий.
Комплексный анализ: объединяет показатели VAWSI, продолжительности тренда и ATR, чтобы создать комплексный показатель. Низкий конечный показатель означает приближающуюся реверсию, а высокий показатель означает нестабильность или колебание рынка.
Динамический стоп/прибыль: динамический уровень стоп и прибыли, рассчитанный на основе комплексных показателей и направления текущей тенденции.
Торговый сигнал: когда цена полностью пересекает вычисленную линию отклонения, система подтверждает пересечение и генерирует торговый сигнал.
Многомерный анализ: путем объединения нескольких показателей, стратегия может анализировать рынок с разных точек зрения, повышая точность суждения.
Адаптация: динамическая длина позволяет стратегии адаптироваться к различным рыночным условиям, повышая гибкость стратегии.
Управление рисками: Динамические настройки для остановки убытков и получения преимуществ помогают лучше контролировать риски и адаптироваться к изменениям на рынке.
Оригинальные индикаторы: VAWSI и индикаторы непрерывности тенденций обеспечивают уникальную рыночную информацию, которая может поймать сигналы, которые традиционные индикаторы игнорируют.
Предотвращение перекрашивания: использование barstate.isconfirmed гарантирует, что сигнал не будет перекрашен, что повышает точность отслеживания.
Настраиваемость: несколько параметров могут быть изменены, чтобы стратегия могла адаптироваться к различным видам торговли и временным рамкам.
Переоптимизация: большое количество параметров может привести к переоптимизации и плохому результату в реальном обращении.
Рыночная адаптивность: Хотя в некоторых рынках они хорошо работают, они могут не работать во всех рыночных условиях, особенно на рынках с меньшей волатильностью.
Сложность: сложность стратегии может затруднить ее понимание и поддержание, увеличивая риск ошибок в работе.
Компьютерная интенсивность: несколько пользовательских показателей и динамические вычисления могут привести к более высокой вычислительной нагрузке, влияющей на скорость выполнения.
Зависимость от исторических данных: стратегия использует большое количество исторических данных для вычислений, что в некоторых случаях может привести к задержке.
Параметрическая оптимизация: использование алгоритмов машинного обучения для оптимизации различных весовых и длинных параметров для улучшения эффективности стратегии в различных рыночных условиях.
Идентификация состояния рынка: добавление модуля идентификации состояния рынка для автоматической корректировки параметров стратегии в различных рыночных условиях.
Фильтрация сигналов: введение дополнительных механизмов фильтрации, таких как значение отметки силы тренда, для уменьшения ложных сигналов.
Анализ количества сделок: углубление анализа количества сделок, возможное введение идентификации формы сделок для повышения надежности сигнала.
Анализ нескольких временных рамок: объединение сигналов из нескольких временных рамок для повышения устойчивости торговых решений.
Оптимизация управления рисками: реализация более сложных стратегий управления рисками, таких как динамическое размещение позиций и многоуровневое остановка.
Вычислительная эффективность: оптимизация кода для повышения вычислительной эффективности, особенно при обработке большого количества исторических данных.
VAWSI и стратегия непрерывного поворота тренда - это сложная и всеобъемлющая торговая система, которая сочетает в себе несколько инновационных показателей и динамическую корректировку параметров. Ее преимущества заключаются в многомерном анализе рынка и самостоятельной адаптации, что позволяет ей искать потенциальные возможности поворота в разных рыночных условиях. Однако сложность стратегии также создает проблемы с переоптификацией и адаптацией.
Эта стратегия имеет потенциал стать мощным торговым инструментом с дальнейшей оптимизацией, особенно в части корректировки параметров, идентификации состояния рынка и управления рисками. Однако, пользователям следует отметить, что ни одна стратегия не является идеальной, и необходимы постоянный мониторинг и корректировка. В практическом применении рекомендуется провести полное тестирование на симуляторных счетах и в сочетании с другими аналитическими инструментами и знаниями рынка для принятия торговых решений.
/*backtest
start: 2024-05-21 00:00:00
end: 2024-06-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("VAWSI and Trend Persistance Reversal", overlay=true, max_bars_back = 4999, process_orders_on_close = true)
//INPUTS
sltp = input.float(title = "Minimum SL/TP", defval = 5.0)
rsi_weight = input.float(title = "Wawsi weight", defval = 100.0)
half_weight= input.float(title = "Trend Persistence Weight", defval = 79.0)
atr_weight = input.float(title = "ATR Weight", defval = 20.0)
com_mult = input.float(title = "Combination Mult", defval = 1, step = .001)
smoothing = input.int(title = "Trend Persistence smooth length", defval = 3)
CycPart = input.float(1.1, step = .001, title = "Length Cycle Decimal")
src = close
hclose = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, src)
//BlackCat1402's Dynamic Length Calculation
EhlersHoDyDC(Price, CycPart) =>
// Vars:
Smooth = 0.00
Detrender = 0.00
I1 = 0.00
Q1 = 0.00
jI = 0.00
jQ = 0.00
I2 = 0.00
Q2 = 0.00
Re = 0.00
Im = 0.00
Period = 0.00
SmoothPeriod = 0.00
pi = 2 * math.asin(1)
DomCycle = 0.0
//Hilbert Transform
Smooth := bar_index > 5 ? (4 * Price + 3 * nz(Price[1]) + 2 * nz(Price[2]) + nz(Price[3])) / 10 : Smooth
Detrender := bar_index > 5 ? (.0962 * Smooth + .5769 * nz(Smooth[2]) - .5769 * nz(Smooth[4]) - .0962 * nz(Smooth[6])) * (.075 * nz(Period[1]) + .54) : Detrender
//Compute InPhase and Quadrature components
Q1 := bar_index > 5 ? (.0962 * Detrender + .5769 * nz(Detrender[2]) - .5769 * nz(Detrender[4]) - .0962 * nz(Detrender[6])) * (.075 * nz(Period[1]) + .54) : Q1
I1 := bar_index > 5 ? nz(Detrender[3]) : I1
//Advance the phase of I1 and Q1 by 90 degrees
jI := (.0962 * I1 + .5769 * nz(I1[2]) - .5769 * nz(I1[4]) - .0962 * nz(I1[6])) * (.075 * nz(Period[1]) + .54)
jQ := (.0962 * Q1 + .5769 * nz(Q1[2]) - .5769 * nz(Q1[4]) - .0962 * nz(Q1[6])) * (.075 * nz(Period[1]) + .54)
//Phasor addition for 3 bar averaging
I2 := I1 - jQ
Q2 := Q1 + jI
//Smooth the I and Q components before applying the discriminator
I2 := .2 * I2 + .8 * nz(I2[1])
Q2 := .2 * Q2 + .8 * nz(Q2[1])
//Homodyne Discriminator
Re := I2 * nz(I2[1]) + Q2 * nz(Q2[1])
Im := I2 * nz(Q2[1]) - Q2 * nz(I2[1])
Re := .2 * Re + .8 * nz(Re[1])
Im := .2 * Im + .8 * nz(Im[1])
Period := Im != 0 and Re != 0 ? 2 * pi / math.atan(Im / Re) : Period
Period := Period > 1.5 * nz(Period[1]) ? 1.5 * nz(Period[1]) : Period
Period := Period < .67 * nz(Period[1]) ? .67 * nz(Period[1]) : Period
//Limit Period to be within the bounds of 6 bar and 50 bar cycles
Period := Period < 6 ? 6 : Period
Period := Period > 50 ? 50 : Period
Period := .2 * Period + .8 * nz(Period[1])
SmoothPeriod := .33 * Period + .67 * nz(SmoothPeriod[1])
//it can add filter to Period here
DomCycle := math.ceil(CycPart * SmoothPeriod) > 34 ? 34 : math.ceil(CycPart * SmoothPeriod) < 1 ? 1 : math.ceil(CycPart * SmoothPeriod)
DomCycle
wma(src, length) =>
wma = 0.0
sum = 0.0
norm = length * (length + 1) / 2
for i = 0 to length - 1
sum := sum + src[i] * (length - i)
wma := sum / norm
length = math.round(math.ceil(EhlersHoDyDC(hclose,CycPart)))
// Traditional Function initialization
highest_custom(src, length) =>
x = src
for i = 0 to math.min(length, 4999)
if src[i] > x
x := src[i]
x
lowest_custom(src, length) =>
x = src
for i = 0 to math.min(length, 4999)
if src[i] < x
x := src[i]
x
rma(src, len) =>
sum = 0.0
for i = 0 to len - 1
math.min(1, len)
sum += src[i]
rma = sum / len
rma := nz(rma[1]) * (len - 1) / len + src / len
sma(src, length) =>
math.sum(src, length) / length
hln(src, length) =>
TR = math.max(math.abs(src - src[1]), high - low)
TR := src / math.abs(ta.change(rma(TR, length)))
TR := (1 / TR) * 100
vawma(src, length) =>
atr = ta.atr(1)
aavg = sma(atr, length)
vavg = sma(volume, length)
weighted_sum = 0.0
sum_weights = 0.0
weighted = 0.0
for i = 0 to length
weight = ((volume[i] / vavg + (atr[i]) / aavg) / 2)
weighted_sum += src[i] * weight
sum_weights += weight
a = (weighted_sum / sum_weights)
vawsi(src, len) =>
rmaUp = vawma(math.max(ta.change(src), 0), len)
rmaDown = vawma(-math.min(ta.change(src), 0), len)
rsi = 100 - (100 / (1 + rmaUp / rmaDown))
trendPersistence(src, length, smoothing) =>
trendu = math.abs(src - highest_custom(src, length))
trendd = math.abs(src - lowest_custom(src, length))
trendu := wma(trendu, smoothing)
trendd := wma(trendd, smoothing)
trendu := ta.change(ta.cum(trendu))
trendd := ta.change(ta.cum(trendd))
trend = wma(math.max(trendu, trendd), smoothing)
rmaUp = rma(math.max(ta.change(trend), 0), length)
rmaDown = rma(-math.min(ta.change(trend), 0), length)
rsi = 100 - (100 / (1 + rmaUp / rmaDown))
//Strategy Calculations
sl = ((100 - sltp) / 100) * close
tp = ((100 + sltp) / 100) * close
var bool crossup = na
var bool crossdown = na
var float dir = na
var float BearGuy = 0
BullGuy = ta.barssince(crossup or crossdown)
if na(BullGuy)
BearGuy += 1
else
BearGuy := math.min(BullGuy, 4999)
rsiw = rsi_weight / 100
cew = half_weight / 100
atrw = atr_weight / 100
atr = hln(hclose, length) * atrw
ce = 1 / trendPersistence(hclose, length, smoothing)
com = 1 / math.max(math.abs(vawsi(hclose, length) - 50) * 2, 20)
comfin = (((com * rsiw) + (ce * cew) - atr)) * com_mult
lower = highest_custom(math.min((math.max(highest_custom(src, BearGuy) * (1 - comfin), sl)), src[1]), BearGuy)
upper = lowest_custom(math.max((math.min(lowest_custom(src, BearGuy) * (1 + comfin), tp)), src[1]), BearGuy)
var float thresh = na
if na(thresh)
thresh := lower
if na(dir)
dir := 1
if crossdown
dir := -1
if crossup
dir := 1
if dir == 1
thresh := lower
if dir == -1
thresh := upper
crossup := ta.crossover(hclose, thresh) and barstate.isconfirmed
crossdown := ta.crossunder(hclose, thresh) and barstate.isconfirmed
//STRATEGY
if crossup
strategy.entry("long", strategy.long)
if crossdown
strategy.entry("Short", strategy.short)
//PLOTTING
col = hclose > thresh ? color.lime : color.red
plot(thresh, linewidth = 2, color = color.new(col[1], 0))