В процессе загрузки ресурсов... загрузка...

Усовершенствованная стратегия хранения количественных тенденций с фильтром динамического диапазона

Автор:Чао Чжан, Дата: 2024-12-17 14:31:11
Тэги:ЕМАМ.А.RFVOLSMAHA

img

Обзор

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

Принципы стратегии

Основная логика стратегии основана на следующих ключевых расчетах:

  1. Анализ ликвидности: оценивает ликвидность рынка путем расчета соотношения объема к движению цен и устанавливает динамические границы ликвидности.
  2. Подтверждение тренда: использует 50-периодные и 100-периодные экспоненциальные скользящие средние значения (EMA) для подтверждения направления тренда.
  3. Фильтрация диапазона: использует 50-периодный период выборки и 3-кратный множитель диапазона для построения динамических диапазонов торговли.
  4. Появление сигнала: генерирует торговые сигналы, когда цена проходит через диапазон фильтра и индикаторы EMA показывают последовательные тенденции.

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

  1. Сильная адаптивность: стратегия может динамически регулировать параметры на основе рыночных условий, адаптируясь к различным рыночным условиям.
  2. Надежные сигналы: эффективно уменьшает количество ложных сигналов путем объединения нескольких технических показателей и фильтров.
  3. Комплексное управление рисками: интегрирует автоматический расчет позиций стоп-лосса для эффективного контроля риска.
  4. Полная функциональность обратного тестирования: включает в себя подробные настройки обратного тестирования для оптимизации стратегии.

Стратегические риски

  1. Чувствительность параметров: несколько параметров требуют тонкой настройки и подвержены чрезмерной оптимизации.
  2. Влияние скольжения: может иметь значительный риск скольжения на сильно волатильных рынках.
  3. Приспособляемость рынка: может часто вызывать ложные сигналы на различных рынках.
  4. Управление капиталом: метод распределения основного капитала может не соответствовать всем рыночным условиям.

Направления оптимизации стратегии

  1. Адаптация параметров: внедрение адаптивных механизмов настройки параметров для автоматической настройки параметров на основе рыночных условий.
  2. Признание состояния рынка: Добавление модулей идентификации состояния рынка для применения различных торговых стратегий в различных рыночных условиях.
  3. Оптимизация управления капиталом: внедрение динамического размещения позиций на основе волатильности рынка.
  4. Улучшение фильтра сигнала: добавление дополнительных технических показателей для фильтрации ложных сигналов.

Резюме

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


/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-15 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Killer Coin V2 + Range Filter Strategy", shorttitle="KC-RF Strategy", overlay=true
         )

// === INPUT BACKTEST RANGE ===
useDate = input(true, title='---------------- Use Date ----------------', group="Backtest Settings")
FromMonth = input.int(7, title="From Month", minval=1, maxval=12, group="Backtest Settings")
FromDay = input.int(25, title="From Day", minval=1, maxval=31, group="Backtest Settings")
FromYear = input.int(2019, title="From Year", minval=2017, group="Backtest Settings")
ToMonth = input.int(1, title="To Month", minval=1, maxval=12, group="Backtest Settings")
ToDay = input.int(1, title="To Day", minval=1, maxval=31, group="Backtest Settings")
ToYear = input.int(9999, title="To Year", minval=2017, group="Backtest Settings")
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window() => time >= start and time <= finish

// === KILLER COIN V2 INPUTS ===
outlierThreshold = input.int(10, "Outlier Threshold Length", group="Killer Coin Settings")
fastMovingAverageLength = input.int(50, "Fast MA length", group="Killer Coin Settings")
slowMovingAverageLength = input.int(100, "Slow MA length", group="Killer Coin Settings")

// === RANGE FILTER INPUTS ===
sources = input(close, "Source", group="Range Filter Settings")
isHA = input(false, "Use HA Candles", group="Range Filter Settings")
per = input.int(50, "Sampling Period", minval=1, group="Range Filter Settings")
mult = input.float(3.0, "Range Multiplier", minval=0.1, group="Range Filter Settings")

// === KILLER COIN V2 CALCULATIONS ===
priceMovementLiquidity = volume / math.abs(close - open)
liquidityBoundary = ta.ema(priceMovementLiquidity, outlierThreshold) + ta.stdev(priceMovementLiquidity, outlierThreshold)
var liquidityValues = array.new_float(5)

if ta.crossover(priceMovementLiquidity, liquidityBoundary)
    array.insert(liquidityValues, 0, close)

fastEMA = ta.ema(array.get(liquidityValues, 0), fastMovingAverageLength)
slowEMA = ta.ema(array.get(liquidityValues, 0), slowMovingAverageLength)

// === RANGE FILTER CALCULATIONS ===
src = isHA ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, sources) : sources

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = (t*2) - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.ema(avrng, wper)*m
    smoothrng

smrng = smoothrng(src, per, mult)

// Range Filter
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r))
    rngfilt

filt = rngfilt(src, smrng)

// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

// Target Bands
hband = filt + smrng
lband = filt - smrng

// === PLOTTING ===
// Killer Coin V2 Plots
bullColor = color.new(#00ffbb, 50)
bearColor = color.new(#800080, 50)
fastPlot = plot(fastEMA, "Fast EMA", color = fastEMA > slowEMA ? bullColor : bearColor)
slowPlot = plot(slowEMA, "Slow EMA", color = fastEMA > slowEMA ? bullColor : bearColor)
fill(fastPlot, slowPlot, color = fastEMA > slowEMA ? bullColor : bearColor)

// Range Filter Plots
filtcolor = upward > 0 ? color.new(color.lime, 0) : downward > 0 ? color.new(color.red, 0) : color.new(color.orange, 0)
filtplot = plot(filt, "Range Filter", color=filtcolor, linewidth=3)
hbandplot = plot(hband, "High Target", color=color.new(color.aqua, 90))
lbandplot = plot(lband, "Low Target", color=color.new(color.fuchsia, 90))
fill(hbandplot, filtplot, color=color.new(color.aqua, 90))
fill(lbandplot, filtplot, color=color.new(color.fuchsia, 90))

// === STRATEGY CONDITIONS ===
// Range Filter Conditions
longCond = ((src > filt) and (src > src[1]) and (upward > 0)) or ((src > filt) and (src < src[1]) and (upward > 0))
shortCond = ((src < filt) and (src < src[1]) and (downward > 0)) or ((src < filt) and (src > src[1]) and (downward > 0))

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

// Combined Conditions
finalLongSignal = longCondition and fastEMA > slowEMA and window()
finalShortSignal = shortCondition and fastEMA < slowEMA and window()

// === PLOTTING SIGNALS ===
plotshape(finalLongSignal, "Buy Signal", text="BUY", textcolor=color.white, 
         style=shape.labelup, size=size.normal, location=location.belowbar, 
         color=color.new(color.green, 0))
         
plotshape(finalShortSignal, "Sell Signal", text="SELL", textcolor=color.white, 
         style=shape.labeldown, size=size.normal, location=location.abovebar, 
         color=color.new(color.red, 0))

// === STRATEGY ENTRIES ===
if finalLongSignal
    strategy.entry("Long", strategy.long, stop=hband)
    
if finalShortSignal
    strategy.entry("Short", strategy.short, stop=lband)

// === ALERTS ===
alertcondition(finalLongSignal, "Strong Buy Signal", "🚨 Buy - Both Indicators Aligned!")
alertcondition(finalShortSignal, "Strong Sell Signal", "🚨 Sell - Both Indicators Aligned!")

Связанные

Больше