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