источник - предыдущий источник, затем принимает абсолютное значение его изменения и нормализует его с источником.
Динамический расчет длины: использует метод расчета длины BlackCat1402
Составный анализ: объединяет показания VAWSI, стойкости тренда и ATR для создания составного индикатора.
Динамический стоп-лосс/взять-прибыль: рассчитывает динамические уровни стоп-лосса и взять-прибыль на основе составного показателя и текущего направления тренда.
Торговые сигналы: подтверждает перекрестки и генерирует торговые сигналы, когда цена полностью пересекает вычисленную пороговую линию.
Многомерный анализ: путем объединения нескольких индикаторов стратегия может анализировать рынок с разных углов, улучшая точность принятия решений.
Приспособляемость: динамический расчет длины позволяет стратегии адаптироваться к различным рыночным условиям, повышая ее гибкость.
Управление рисками: Динамические параметры стоп-лосса и прибыли помогают лучше контролировать риск и адаптироваться к изменениям рынка.
Оригинальные индикаторы: индикаторы VAWSI и Trend Persistence предоставляют уникальные рыночные данные, которые могут зафиксировать сигналы, которые упускаются из виду традиционными индикаторами.
Противопокраска: использование 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))