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

Автор:Чао Чжан, Дата: 2023-11-24 14:35:13
Тэги:

img

Обзор

Эта стратегия представляет собой многочасовую торговую стратегию с индикатором объема цены. Она всесторонне использует индекс относительной силы (RSI), средний истинный диапазон (ATR), простой скользящий средний (SMA) и пользовательские условия объема цены для выявления потенциальных длинных сигналов. Когда выполняются определенные перепроданные, перекресток объема цены, прорыв цены и другие условия входа, эта стратегия устанавливает длинные позиции. Она также устанавливает уровни остановки потери и получения прибыли для контроля соотношения риск-вознаграждение на одну сделку.

Логика стратегии

Ключевыми моментами этой стратегии являются:

  1. Когда индекс RSI находится ниже уровня перепроданности и остается перепроданным в течение последних 10 бар, он считается сигналом перепроданности.
  2. Определяются несколько наборов условий цены объема, и все эти условия должны быть выполнены одновременно, чтобы запустить длинный сигнал индикатора цены объема.
  3. Когда цена закрытия превышает 13-периодную SMA, это считается сигналом прорыва цены.
  4. Малый период ATR, который ниже, чем большой период ATR, также способствует длинному сигналу
  5. Стратегия объединяет все вышеперечисленные сигналы для принятия окончательного решения о длинном входе

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

Кроме того, стратегия определяет 3 порога объема и устанавливает несколько наборов объемных ценовых условий, основанных на данных из разных временных рамок. Например, значение объема 90-го периода больше, чем в 1,5 раза, чем в 49-й период. Когда все эти объемные ценовые условия выполняются одновременно, индикатор объемной цены генерирует длинный сигнал.

С точки зрения цены, стратегия рассчитывает 13-периодную SMA и подсчитывает количество барров с тех пор, как цена превышает SMA. Когда цена превышает SMA и количество барров после прорыва меньше 5, это считается сигналом прорыва цены.

Для параметров периода ATR эта стратегия определяет небольшой период 5 и большой период 14 для ATR. Когда небольшой период ATR ниже, чем большой период ATR, это сигнализирует о том, что волатильность рынка ускоряется вниз и способствует длинному сигналу.

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

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

Эта стратегия имеет следующие преимущества:

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

  2. Трехмерный механизм подтверждения перепродажи + цены объема + ценового прорыва обеспечивает надежные сигналы входа. Условие перепродажи обеспечивает базовое время для входов, в то время как дополнительные подтверждения от показателей объема цены и цены дополнительно обеспечивают надежность длинных сигналов.

  3. Механизм остановки потери и получения прибыли строго контролирует риск по сделке. Параметры остановки потери и получения прибыли могут быть скорректированы на основе личного аппетита к риску для максимизации прибыли при разумном контроле риска по сделке.

  4. Интеграция нескольких индикаторов повышает надежность.Даже если некоторые индикаторы не работают или неисправно функционируют, стратегия все равно может опираться на другие индикаторы для оценки и обеспечивать определенный уровень устойчивости.

Риски и контрмеры

Эта стратегия также сопряжена с некоторыми рисками:

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

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

  3. Риск дивергенции показателей: когда некоторые показатели дают длинные сигналы, а другие дают короткие сигналы, стратегия не может определить оптимальное решение.

Руководство по оптимизации

Эта стратегия может быть дополнительно оптимизирована в следующих аспектах:

  1. Включить модели машинного обучения для облегчения суждения.Модели могут быть обучены на объемных ценовых и волатильности характеристик динамически настраивать вручную определенных параметров.

  2. Улучшить сложность стратегий получения прибыли, таких как последующая остановка получения прибыли, частичная получение прибыли и т. д., чтобы еще больше увеличить прибыль на одну сделку, предотвращая потерю прибыли.

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

  4. Эта стратегия в основном использует такие индикаторы, как RSI, ATR и SMA. Другие индикаторы, такие как полосы Боллинджера и KDJ, также могут быть объединены для диверсификации и оптимизации источников торговых сигналов.

Заключение

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


/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// © Kimply_Tr
//@version=5

// Strategy settings and parameters
strategy(title='Volume ValueWhen Velocity', overlay=true)

// Define the stop-loss and take-profit percentages for the long strategy
long_stoploss_value = input.float(defval=3, title='Stop-Loss (SL) %', minval=0, group='▶ Stop Loss/Take Profit => Long-Strategy', inline='2')
long_stoploss_percentage = close * (long_stoploss_value / 100) / syminfo.mintick  // Calculate long stop-loss percentage
long_takeprofit_value = input.float(defval=2, title='Take-Profit (TP) %', minval=0, group='▶ Stop Loss/Take Profit => Long-Strategy', inline='2')
long_takeprofit_percentage = close * (long_takeprofit_value / 100) / syminfo.mintick  // Calculate long take-profit percentage

// Define parameters related to ValueWhen occurrences
occurrence_ValueWhen_1 = input.int(title='occurrence_ValueWhen_1', defval=1, maxval=100, step=1, group="▶ ValueWhen",tooltip ="Its value must be smaller than (occurrence_ValueWhen_2)")  
occurrence_ValueWhen_2 = input.int(title='occurrence_ValueWhen_2', defval=5, maxval=100, step=1, group="▶ ValueWhen" ,tooltip="Its value must be greater than (occurrence_ValueWhen_1)")
distance_value=input.int(title='distance_value_occurrence', defval=170, maxval=5000, step=1, group="▶ ValueWhen" ,tooltip="It indicates the minimum distance between the occurrences of 1 and 2, i.e. the difference between the occurrences of 1 and 2 is greater than (distance_value_occurrence)")

// Define RSI-related parameters
rsi_over_sold = input.int(defval=60, minval=1, title='Oversold Level', group='▶ RSI',inline ='2')  // Input for oversold level in RSI
rsi_length = input.int(defval=40, minval=1, title='RSI Length', group='▶ RSI',inline ='2')  // Input for RSI length
rsi = ta.rsi(close, rsi_length)  // Calculate RSI

// Define volume thresholds
volume_threshold1 = input.float(title='volume_threshold_1', defval=0.5, maxval=10, step=0.1, group="▶ Volume")  
volume_threshold2 = input.float(title='volume_threshold_2', defval=0.4, maxval=10, step=0.1, group="▶ Volume")  
volume_threshold3 = input.float(title='volume_threshold_3', defval=0.62, maxval=10, step=0.1, group="▶ Volume")  

// ATR (Average True Range)
// Define ATR parameters
atr_small = input.int(title='ATR_Small', defval=5, maxval=500, step=1, group="▶ Atr",inline ='2') 
atr_big = input.int(title='ATR_Big ', defval=14, maxval=500, step=1, group="▶ Atr",inline ='2') 

atr_value3 = ta.atr(15)  // Calculate ATR value 3
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Date Range
// Define the date range for back-testing
start_date = input.int(title='Start Day', defval=1, minval=1, maxval=31, group='▶ Time-Period for Back-Testing', inline='1')  // Input for start day
end_date = input.int(title='until Day', defval=1, minval=1, maxval=31, group='▶ Time-Period for Back-Testing', inline='1')  // Input for end day
start_month = input.int(title='Start Month', defval=7, minval=1, maxval=12, group='▶ Time-Period for Back-Testing', inline='2')  // Input for start month
end_month = input.int(title='until Month', defval=1, minval=1, maxval=12, group='▶ Time-Period for Back-Testing', inline='2')  // Input for end month
start_year = input.int(title='Start Year', defval=2022, minval=1800, maxval=3000, group='▶ Time-Period for Back-Testing', inline='3')  // Input for start year
end_year = input.int(title='until Year', defval=2077, minval=1800, maxval=3000, group='▶ Time-Period for Back-Testing', inline='3')  // Input for end year
in_date_range = time >= timestamp(syminfo.timezone, start_year, start_month, start_date, 0, 0) and time < timestamp(syminfo.timezone, end_year, end_month, end_date, 0, 0)  // Check if the current time is within the specified date range
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
was_over_sold = ta.barssince(rsi <= rsi_over_sold) <= 10  // Check if RSI was oversold in the last 10 bars
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
getVolume(symbol, bar) =>
    request.security(syminfo.tickerid, "D", volume)[bar]  // Function to get volume data for a specific symbol and bar

getVolume2(symbol, bar) =>
    request.security(syminfo.tickerid, "39", volume)[bar]  // Function to get volume data for a specific symbol and bar 2
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

firstCandleColor1 = request.security(syminfo.tickerid, "D", close[2] > open[1] ? 1 : 0)
firstCandleColor2 = request.security(syminfo.tickerid, "1", close[2] > open[0] ? 1 : 0)
firstCandleColor3 = request.security(syminfo.tickerid, "W", close[1] > open[1] ? 1 : 0)

firstCandleColor= ((firstCandleColor1+firstCandleColor2)) > firstCandleColor3 ? 1 : 0

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
sma = ta.sma(close, 13)  // Calculate the simple moving average (SMA) of the close price over 13 periods
numCandles = ta.barssince(close > sma)  // Count the number of candles since the close price crossed above the SMA
atr1=request.security(syminfo.tickerid, "30", ta.atr(atr_small)<ta.atr(atr_big))  // Get the ATR value for the specific security and timeframe (30 minutes) and check if ATR_small is less than ATR_big

prevClose = ta.valuewhen(close > sma, close, occurrence_ValueWhen_1)  // Get the close price when it first crosses above the SMA based on occurrence_ValueWhen_1
prevCloseBarsAgo = ta.valuewhen(close > sma, close, occurrence_ValueWhen_2)  // Get the close price when it first crosses above the SMA based on occurrence_ValueWhen_2
prevCloseChange =  (prevCloseBarsAgo - prevClose )  // Calculate the change in the close price between the occurrences of crossing above the SMA

atrval=(atr_value3>140) or (atr_value3 < 123)  // Check if atr_value3 is either greater than 140 or less than 123

Condition =  getVolume(syminfo.tickerid, 90) > volume_threshold1 * getVolume(syminfo.tickerid, 49)   and getVolume(syminfo.tickerid, 110) > volume_threshold3 * getVolume(syminfo.tickerid, 49)  and getVolume2(syminfo.tickerid, 30) > volume_threshold2 * getVolume2(syminfo.tickerid, 55) and getVolume2(syminfo.tickerid, 7) > volume_threshold2 * getVolume2(syminfo.tickerid, 3)  // Check multiple volume conditions

buy_signal=Condition  and atrval and firstCandleColor==0 and  was_over_sold and  prevCloseChange> distance_value and atr1 and  numCandles<5  // Determine if the buy signal is generated based on various conditions

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Long Strategy
// Enter long position if the buy signal conditions are met and within the specified date range
if buy_signal and in_date_range
    strategy.entry('Long', strategy.long, alert_message='Open Long Position')  // Enter long position
    strategy.exit('Long SL/TP', from_entry='Long', loss=long_stoploss_percentage, profit=long_takeprofit_percentage, alert_message='Your SL/TP-Limit for the Long-Strategy has been activated.')  // Exit long position with stop-loss and take-profit




Больше