Эта стратегия представляет собой многочасовую торговую стратегию с индикатором объема цены. Она всесторонне использует индекс относительной силы (RSI), средний истинный диапазон (ATR), простой скользящий средний (SMA) и пользовательские условия объема цены для выявления потенциальных длинных сигналов. Когда выполняются определенные перепроданные, перекресток объема цены, прорыв цены и другие условия входа, эта стратегия устанавливает длинные позиции. Она также устанавливает уровни остановки потери и получения прибыли для контроля соотношения риск-вознаграждение на одну сделку.
Ключевыми моментами этой стратегии являются:
В частности, эта стратегия устанавливает параметры длины и перепродажи для индикатора RSI и рассчитывает значения RSI на основе этих параметров.
Кроме того, стратегия определяет 3 порога объема и устанавливает несколько наборов объемных ценовых условий, основанных на данных из разных временных рамок. Например, значение объема 90-го периода больше, чем в 1,5 раза, чем в 49-й период. Когда все эти объемные ценовые условия выполняются одновременно, индикатор объемной цены генерирует длинный сигнал.
С точки зрения цены, стратегия рассчитывает 13-периодную SMA и подсчитывает количество барров с тех пор, как цена превышает SMA. Когда цена превышает SMA и количество барров после прорыва меньше 5, это считается сигналом прорыва цены.
Для параметров периода ATR эта стратегия определяет небольшой период 5 и большой период 14 для ATR. Когда небольшой период ATR ниже, чем большой период ATR, это сигнализирует о том, что волатильность рынка ускоряется вниз и способствует длинному сигналу.
Наконец, стратегия учитывает все вышеперечисленные критерии входа, включая показатели перепродажи, цены объема, ценового прорыва и ATR. Когда все эти условия выполняются одновременно, окончательный длинный сигнал активируется и устанавливается длинная позиция.
Эта стратегия имеет следующие преимущества:
Оценивая несколько наборов данных о объемах цен в разные временные рамки вместо одного временного периода, стратегия может более точно оценить концентрацию объемов торговли.
Трехмерный механизм подтверждения перепродажи + цены объема + ценового прорыва обеспечивает надежные сигналы входа. Условие перепродажи обеспечивает базовое время для входов, в то время как дополнительные подтверждения от показателей объема цены и цены дополнительно обеспечивают надежность длинных сигналов.
Механизм остановки потери и получения прибыли строго контролирует риск по сделке. Параметры остановки потери и получения прибыли могут быть скорректированы на основе личного аппетита к риску для максимизации прибыли при разумном контроле риска по сделке.
Интеграция нескольких индикаторов повышает надежность.Даже если некоторые индикаторы не работают или неисправно функционируют, стратегия все равно может опираться на другие индикаторы для оценки и обеспечивать определенный уровень устойчивости.
Эта стратегия также сопряжена с некоторыми рисками:
Риск конфигурации параметров. Настройки параметров индикаторов напрямую влияют на суждение, а неправильные параметры могут привести к искажению торговых сигналов. Разумные значения параметров необходимо тщательно проверять.
Ограниченный потенциал прибыли: как стратегия, интегрирующая несколько индикаторов для коллективного суждения, ее сигналы, как правило, более консервативны с относительно меньшим количеством сделок на единицу времени, поэтому потенциал прибыли имеет некоторые ограничения.
Риск дивергенции показателей: когда некоторые показатели дают длинные сигналы, а другие дают короткие сигналы, стратегия не может определить оптимальное решение.
Эта стратегия может быть дополнительно оптимизирована в следующих аспектах:
Включить модели машинного обучения для облегчения суждения.Модели могут быть обучены на объемных ценовых и волатильности характеристик динамически настраивать вручную определенных параметров.
Улучшить сложность стратегий получения прибыли, таких как последующая остановка получения прибыли, частичная получение прибыли и т. д., чтобы еще больше увеличить прибыль на одну сделку, предотвращая потерю прибыли.
В дополнение к данным о цене и объеме графиков, данные о книге заказов также раскрывают глубинную информацию о распределении ликвидности для предоставления дополнительных справочных сигналов.
Эта стратегия в основном использует такие индикаторы, как 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