Стратегия торговли дифференцией объема дельта цикла осциллятора

Автор:Чао Чжан, Дата: 2023-10-30 11:45:42
Тэги:

img

Обзор

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

Логика торговли

  1. Вычислить скорость изменения изменения объема (скорость изменения показателя разности объема), чтобы получить результат показателя, основанный на импульсе объема.

  2. Вычислить диапазоны Боллинджера n, чтобы получить bbr, представляющее стандартное отклонение импульса объема.

  3. Вычислить полосы Боллинджера ценового закрытия, чтобы получить bbr1, представляющий стандартное отклонение цены.

  4. Вычислите разницу между ними, которая является стандартным отклонением импульса объема минус стандартное отклонение цены, как окончательный показатель.

  5. Когда hist переходит выше 0, это короткий сигнал входа, а когда переходит ниже 0, это длинный сигнал входа.

При расчете скорости изменения объема изменения, влияние изменения объема на цену усиливается. Когда объем изменяется, а цена еще не изменилась, hist пересекает выше или ниже 0, генерируя торговые сигналы. Он может предсказать переломные моменты ценовых тенденций заранее.

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

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

  2. Расчет скорости изменения изменения объема увеличивает ведущее влияние изменения объема на цену, что приводит к лучшим результатам торговли.

  3. Сочетание индикаторов динамики объема с диапазонами Боллинджера делает торговые сигналы более надежными.

  4. Использование тройного экспоненциального сглаживания на данных Hist делает сигналы более точными и плавными.

  5. Установление линий с перекупленными/перепроданными и длинных/коротких ордеров стоп-лосс/прибыли помогает эффективно контролировать риски.

  6. Многие настраиваемые параметры, такие как длина полос Боллинджера, мультипликатор стандартного отклонения и факторы сглаживания Hist, позволяют оптимизировать стратегию.

Риски

  1. Данные о объеме могут не отражать рыночную торговлю и могут быть манипулированы.

  2. Дивергенция между объемом и ценой может не сохраняться, и цена может прорваться без изменения.

  3. Неправильное настройка параметров может привести к переоценке или неточным сигналам.

  4. Остерегайтесь ложных сигналов от аномальных данных объема.

  5. Следует избегать сигналов об обратном движении, когда тенденция сильна.

Риски могут быть смягчены путем оптимизации параметров, добавления других фильтров и установки стоп-лосса/прибыли.

Возможности для расширения

  1. Оптимизировать параметры полос Боллинджера для более стабильных сигналов.

  2. Добавьте фильтр тренда, чтобы избежать торговли против тренда.

  3. Для подтверждения сигнала включить другие индикаторы, такие как MACD.

  4. Используйте ИИ для автоматической оптимизации параметров адаптивно.

  5. Добавьте динамический стоп-лосс/прибыль для оптимизации управления рисками.

  6. Применение машинного обучения для определения успешности дивергенции объема и цены для повышения качества сигнала.

Заключение

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


/*backtest
start: 2022-10-23 00:00:00
end: 2023-10-29 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © tathal and special thanks to oakwhiz for his porting of my custom volume indicator

//@version=5
strategy('Volume Difference Delta Cycle Oscillator', 'VDDC Osc', default_qty_type=strategy.percent_of_equity, default_qty_value=100, max_bars_back=5000)

startDate = input.int(title='Start Date', defval=1, minval=1, maxval=31)
startMonth = input.int(title='Start Month', defval=1, minval=1, maxval=12)
startYear = input.int(title='Start Year', defval=2010, minval=1800, maxval=2100)

endDate = input.int(title='End Date', defval=31, minval=1, maxval=31)
endMonth = input.int(title='End Month', defval=12, minval=1, maxval=12)
endYear = input.int(title='End Year', defval=2021, minval=1800, maxval=2100)

// Normalize Function
normalize(_src, _min, _max) =>
    // Normalizes series with unknown min/max using historical min/max.
    // _src      : series to rescale.
    // _min, _min: min/max values of rescaled series.
    var _historicMin = 10e10
    var _historicMax = -10e10
    _historicMin := math.min(nz(_src, _historicMin), _historicMin)
    _historicMax := math.max(nz(_src, _historicMax), _historicMax)
    _min + (_max - _min) * (_src - _historicMin) / math.max(_historicMax - _historicMin, 10e-10)


// STEP 2:
// Look if the close time of the current bar
// falls inside the date range
inDateRange = true

// Stop loss & Take Profit Section     
l_sl_inp = input(2.0, title='Long Stop Loss %') / 100
l_tp_inp = input(4.0, title='Long Take Profit %') / 100

l_stop_level = strategy.position_avg_price * (1 - l_sl_inp)
l_take_level = strategy.position_avg_price * (1 + l_tp_inp)

s_sl_inp = input(2.0, title='Short Stop Loss %') / 100
s_tp_inp = input(4.0, title='Short Take Profit %') / 100

s_stop_level = strategy.position_avg_price * (1 + s_sl_inp)
s_take_level = strategy.position_avg_price * (1 - s_tp_inp)

src = close

//  Volume Differnce Indicator Delta

float change_src = ta.change(src)
float i_obv = ta.cum(change_src > 0 ? volume : change_src < 0 ? -volume : 0 * volume)
float i_pvt = ta.pvt

float result = ta.change(i_obv - i_pvt)

float nresult = ta.ema(normalize(result, -1, 1), 20)


// Volume Differnce Indicator Delta %B
length = input.int(20, minval=1, title='Volume Bands Length')
mult = input.float(2.0, minval=0.001, maxval=50, title='Volume Bands StdDev')
basis = ta.ema(nresult, length)
dev = mult * ta.stdev(nresult, length)
upper = basis + dev
lower = basis - dev
bbr = (nresult - lower) / (upper - lower)

// Normal %B, Based on close

l1 = input.int(20, minval=1, title='Bollinger Bands Length')
src2 = close
mult1 = input.float(2.0, minval=0.001, maxval=50, title='Bollinger Bands StdDev')
basis1 = ta.sma(src2, l1)
dev1 = mult1 * ta.stdev(src2, l1)
upper1 = basis1 + dev1
lower1 = basis1 - dev1
bbr1 = (src - lower1) / (upper1 - lower1)

/// Final Output Line

hist = ta.ema(ta.ema(ta.ema(bbr1 - bbr, input(2, title='Hist Smoothing Factor #1')), input(2, title='Hist Smoothing Factor #2')), input(2, title='Hist Smoothing Factor #3'))

/// Overbought / Oversold Line Creation
oversold = input(-.1)
overbought = input(.4)
hline(oversold, linewidth=2, color=color.new(#81c784, 62))
hline(overbought, linewidth=2, color=color.new(#c2185b, 38))

/// Long & Short Conditions

short = hist > overbought
long = hist < oversold

/// Colors & Plotting
histColor = hist >= 0 ? hist[1] < hist ? #26A69A : #B2DFDB : hist[1] < hist ? #FFCDD2 : #EF5350
plot(hist, title='Histogram', style=plot.style_columns, color=color.new(histColor, 0))

CrossBgColor = long ? color.new(#81c784, 62) : short ? color.new(#c2185b, 38) : na
bgcolor(color.new(CrossBgColor, 90))

/// Strategy Methodology

if inDateRange
    strategy.entry('long', strategy.long, when=long, stop=l_stop_level, limit=l_take_level)

if inDateRange and strategy.position_size > 0
    strategy.close_all(when=short)

if inDateRange
    strategy.entry('short', strategy.short, when=short, stop=s_stop_level, limit=s_take_level)

if inDateRange and strategy.position_size < 0
    strategy.close_all(when=long)



Больше