
Стратегия торговли с отклонением от динамического ценового диапазона и RSI - это комплексная количественная торговая система, которая объединяет три основных технологии: обнаружение ценового диапазона, отклонение от RSI и анализ тенденций движущихся средних. Стратегия специально разработана для OKX-сигнальных роботов с динамической позиционной корректировкой и некоторыми функциями позиционного равновесия.
Уникальность этой стратегии заключается в том, что ее система управления динамическими позициями может динамически корректировать масштаб сделки в зависимости от разрыва между текущей ценой и средней ценой задержания позиции, что позволяет стратегии увеличивать позиции, когда цены продолжают двигаться в благоприятном направлении, и постепенно снижать позиции, когда цены начинают реверсироваться, что позволяет оптимизировать эффективность капитала и отдачу от риска.
Стратегия основана на трех ключевых компонентах:
Проверка ценового диапазона: Стратегия определения ценового диапазона путем вычисления максимальной и минимальной цены в течение определенного периода (установка параметров boxLength). Эти ценовые уровни нанесены на график как верхние и нижние границы, чтобы обеспечить визуализацию ценового эталона для торговли.
RSI отклоняется от проверкиСтратегия использует относительно сильный и слабый индекс (RSI) для вычисления динамики рынка и обнаружения отклонений между ценами и RSI. Когда цены достигают новых низких значений, а RSI достигает более высоких низких значений, образуется позиционное отклонение; когда цены достигают новых высоких значений, а RSI достигает более низких высоких значений, образуется позиционное отклонение.
Анализ тенденций в движущихся средних: Стратегия рассчитывает движущиеся средние из нескольких типов (MA20, MA50, MA100 и MA200) на пользовательских временных рамках, чтобы определить рыночные тенденции путем анализа расположения этих средних и их цены относительно средних. Стратегия запускает несколько сигналов только во время нисходящих тенденций, чтобы обеспечить согласованность торгов с общей рыночной обстановкой.
Логика сделки выглядит следующим образом:
Механизм многомерного подтвержденияВ сочетании с прорывом в ценовом диапазоне, отклонением от сигнала RSI и фильтрацией трендов на движущихся средних, создается многомерная система подтверждения сделок, что значительно повышает надежность и точность торговых сигналов.
Динамическое управление позициями: стратегия динамически корректирует размер позиции в зависимости от рыночных условий и изменения цен, а не использует фиксированное распределение позиций. Это позволяет стратегии максимизировать потенциал прибыли в благоприятных рыночных условиях, а также контролировать риск в неблагоприятных условиях. формулаmath.max(math.min(math.pow((avgPrice - close)* 1000/5,1.1), 100), minEnterPercent)Обеспечьте гибкость и ограничение в корректировке позиций.
Адаптация к рыночным условиям: С помощью перекрестного и рядового анализа движущихся средних стратегии могут адаптироваться к различным рыночным условиям и совершать сделки только в тех случаях, когда технические формы согласуются с общими тенденциями.
Точные точки входа и выхода: отклонение от сигнала в сочетании с прорывом в ценовом диапазоне обеспечивает точную точку входа и выхода, уменьшая вероятность ложного сигнала. Параметры обратного обзора (leftLookback и rightLookback) повышают точность идентификации крайней точки.
Визуализация отзывовСтратегия: На графике изображены ценовые диапазоны, движущиеся средние и торговые сигналы, обеспечивающие интуитивную визуальную обратную связь, которая помогает трейдерам понять и проверить торговые решения.
Гибкая конфигурация параметровМногочисленные регулируемые параметры позволяют стратегии адаптироваться к различным рынкам и стилям торговли, таким как длина RSI, циклы ценовых промежутков и циклы отклонения от обратного пути.
Риск ложного проникновения: Прорыв в ценовом диапазоне иногда может быть кратковременным, а не началом реальной тенденции. Это может привести к ненужным сделкам и привести к убыткам. Способ снижения риска заключается в добавлении подтверждающих факторов, таких как расширение цикла ретроспекции или увеличение подтверждения объема сделок.
Риски чрезмерной торговлиДинамическая корректировка позиции может привести к чрезмерной торговле и увеличению затрат на торговлю. Рекомендуется установить разумные минимальные корректируемые пороги (minEnterPercent и minExitPercent) для предотвращения небольших колебаний цен, которые могут спровоцировать частую торговлю.
Риск задержки средней линии: Подвижные средние имеют отсталость, особенно в быстро меняющихся рынках. Этот риск может быть уменьшен путем корректировки типа используемой средней линии (например, переход от SMA к EMA) или корректировки средней линии.
Параметр ЧувствительностьСтратегия зависит от нескольких параметров, таких как RSI, средний цикл, и т. Д. Небольшие изменения в этих параметрах могут значительно повлиять на эффективность стратегии. Рекомендуется искать стабильные настройки, отслеживая различные комбинации параметров, и регулярно повторно оптимизировать параметры для адаптации к изменяющимся рыночным условиям.
Зависимость от единого рынка: Стратегия может хорошо работать в определенных рыночных условиях, а плохо работать в других. Рекомендуется тестировать стратегию в разных рыночных условиях и в разных временных рамках, а также рассмотреть возможность добавления фильтров состояния рынка для приостановки торговли в неблагоприятных рыночных условиях.
Подтверждение увеличения громкости: текущая стратегия основана только на цене и RSI для принятия торговых решений. При добавлении анализа объема сделок можно проверить эффективность прорыва в ценовом диапазоне, избегая ложных прорывов с недостаточным объемом сделок. Конкретное осуществление может быть осуществлено путем проверки того, превышает ли объем сделок при прорыве средний объем сделок за предыдущие несколько циклов.
Введение механизма корректировки волатильностиВ периоды высокой волатильности, добавление фильтров сигналов или корректировка формулы размеров позиций, чтобы уменьшить риск ложного сигнала и контролировать максимальный риск выхода. Можно использовать показатель ATR (Average True Range) для количественной оценки волатильности и динамической корректировки торговых параметров.
Фильтр прибыли/убыткаОптимизируйте ожидаемую прибыль в рамках общей стратегии, оценивая потенциальный риск-возврат перед каждой сделкой и выполняя только те сделки, которые достигают минимальной прибыли-убытка, чтобы оптимизировать ожидаемую прибыль. Это можно сделать, установив динамические уровни остановки и остановок на основе ATR.
Введение многовременного анализа: Качество сигнала может быть улучшено путем добавления подтверждения тренда на более высоких временных рамках. Например, совершение сделки только в том случае, если тренд японской линии совпадает с трендом текущего торгового времени.
Улучшение алгоритмов динамического позиционированияВ крайних случаях существующая криптовалютная функция может быть изменена слишком сильно или слишком мало. Можно рассмотреть более сложные алгоритмы, такие как адаптивные формулы, основанные на рыночной волатильности и текущей ситуации с прибылью, или ввести ограничения на рисковый проход, чтобы гарантировать, что отдельные сделки не оказывают чрезмерного влияния на общий портфель.
Добавление автоматической оптимизации параметров: реализация автоматического цикла оптимизации параметров, регулярное корректирование параметров стратегии на основе недавних рыночных данных, чтобы стратегия могла лучше адаптироваться к изменяющимся рыночным условиям. Это может быть достигнуто с помощью алгоритмов обратной связи или машинного обучения.
Стратегия торговли с динамическим ценовым диапазоном и отклонением от RSI - это высококвалифицированная торговая система, объединяющая несколько методов технического анализа, которая в сочетании с ценовым диапазоном, отклонением от RSI и тенденциями движущейся средней обеспечивает мощную основу для принятия торговых решений. Наибольшим преимуществом является система управления динамическими позициями, которая может автоматически регулировать масштаб торгов в соответствии с рыночными условиями, оптимизируя эффективность капитала при сохранении контроля над риском.
Несмотря на то, что существуют некоторые риски, связанные с стратегией, такие как ложные прорывы и чувствительность к параметрам, ее стабильность и адаптивность могут быть дополнительно усилены с помощью предлагаемых направлений оптимизации, таких как увеличение подтверждения ордера, введение корректировки волатильности и анализа многократных временных рамок. Для трейдеров, которые хотят развернуть высокотехнологичную стратегию на автоматизированной торговой платформе (например, OKX-сигнальный робот), это обеспечивает гибкую и мощную базовую структуру, которая может быть настроена и расширена в соответствии с личным торговым стилем и предпочтениями рынка.
/*backtest
start: 2025-05-07 00:00:00
end: 2025-05-14 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
// Strategy: Box Range with RSI Divergence (Dynamic Adjustment - OKX Signal Format)
// © aws2333
//I'm chinese
strategy("Kaito Box with RSI Div(Dynamic Adjustment + MA + Long)", overlay=true,default_qty_type=strategy.percent_of_equity, default_qty_value=10)
rsiOverbought = 80
rsiOversold = 13
boxLength = input.int(3, title="Box Length", minval=1)
rsiLength = input.int(2, title="RSI Length", minval=1)
divergenceLookback = input.int(2, title="Divergence Lookback Period", minval=1)
leftLookback = input.int(2, title="Left Lookback", minval=1)
rightLookback = input.int(2, title="Right Lookback", minval=1)
var float avgPrice = na
//var float position_size = 0
signalToken = input.string("**********", "Signal Token")
enterOrderType = input.string("limit", "Order Type", options=["market", "limit"])
enterOrderPriceOffset = input.float(0.05, "Order Price Offset", minval=0, maxval=100, step=0.01)
enterInvestmentType = input.string("percentage_investment", "Investment Type", options=["margin", "contract", "percentage_balance", "percentage_investment"])
exitOrderType = input.string("limit", "Order Type", options=["market", "limit"])
exitOrderPriceOffset = input.float(0.05, "Order Price Offset", minval=0, maxval=100, step=0.01)
exitInvestmentType = input.string("percentage_position", "Investment Type", options=["percentage_position"])
maxLag = input.float(30, "maxLag")
minEnterPercent = 1.3
minExitPercent = 0.09
highestHigh = ta.highest(high, boxLength)
lowestLow = ta.lowest(low, boxLength)
plot(highestHigh, title="Upper Box", color=color.new(color.green, 0), linewidth=1, style=plot.style_line)
plot(lowestLow, title="Lower Box", color=color.new(color.red, 0), linewidth=1, style=plot.style_line)
rsi = ta.rsi(low, rsiLength)
isLowestLeft = low < ta.lowest(low[1], leftLookback)
isLowestRight = low <= ta.lowest(low, rightLookback)
isLowestClose = isLowestLeft and isLowestRight
isHighestLeft = low > ta.highest(low[1], leftLookback)
isHighestRight = low >= ta.highest(low, rightLookback)
isHighestClose = isHighestLeft and isHighestRight
lowestClose = ta.lowest(low, divergenceLookback)
lowestRsi = ta.lowest(rsi, divergenceLookback)
highestClose = ta.highest(low, divergenceLookback)
highestRsi = ta.highest(rsi, divergenceLookback)
lowestClosePrev = ta.lowest(low[1], leftLookback)
lowestRsiPrev = ta.lowest(rsi[1], leftLookback)
highestClosePrev = ta.highest(low[1], leftLookback)
highestRsiPrev = ta.highest(rsi[1], leftLookback)
bullishDivergence = isLowestClose and (low < lowestClosePrev) and (rsi > lowestRsiPrev) and (rsi < rsiOversold)
bearishDivergence = isHighestClose and (low > highestClosePrev) and (rsi < highestRsiPrev) and (rsi > rsiOverbought)
ma(source, length, type) =>
type == "SMA" ? ta.sma(source, length) :type == "EMA" ? ta.ema(source, length) :type == "SMMA (RMA)" ? ta.rma(source, length) :type == "WMA" ? ta.wma(source, length) :type == "VWMA" ? ta.vwma(source, length) :na
custom_timeframe = input.timeframe("3", "Custom time period (leave blank for current period)")
ma_type = input.string("SMA", "Moving average type", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"])
ma20_period = input.int(20, "MA20 ", minval=1)
ma50_period = input.int(50, "MA50 ", minval=1)
ma100_period = input.int(100, "MA100 ", minval=1)
ma200_period = input.int(200, "MA200 ", minval=1)
source_close = request.security(syminfo.tickerid, custom_timeframe, close)
ma20 = ma(source_close, ma20_period, ma_type)
ma50 = ma(source_close, ma50_period, ma_type)
ma100 = ma(source_close, ma100_period, ma_type)
ma200 = ma(source_close, ma200_period, ma_type)
up_signal_1 = ma20 > ma200
up_signal_2 = ma50 > ma200
up_signal_3 = ma100 > ma200
up_signal_4 = (high > ma20 and high > ma50 and high > ma100 and high > ma200)
up_trend = (up_signal_1 and up_signal_2 and up_signal_3 and (source_close > ma200)) or up_signal_4
down_signal_1 = ma20 < ma200
down_signal_2 = ma50 < ma200
down_signal_3 = ma100 < ma200
down_signal_4 = (low < ma20 and low < ma50 and low < ma100 and low < ma200)
down_trend = (down_signal_1 and down_signal_2 and down_signal_3 and (source_close < ma200)) or down_signal_4
plot(ma20, color=color.yellow, title="MA20")
plot(ma50, color=color.orange, title="MA50")
plot(ma100, color=color.red, title="MA100")
plot(ma200, color=color.maroon, title="MA200")
var float longAddPercent = na
var float shortAddPercent = na
roundToFourDecimals(value) => math.round(value * 10000) / 10000
if not na(avgPrice)
if close < avgPrice
longAddPercent := roundToFourDecimals(math.max(math.min(math.pow((avgPrice - close)* 1000/5,1.1) , 100), minEnterPercent))
if close > avgPrice
longAddPercent := 1
if close == avgPrice
longAddPercent := 1
if not na(avgPrice)
if close < avgPrice
shortAddPercent := 0.01
if close > avgPrice
shortAddPercent := roundToFourDecimals(math.max(math.min(math.pow((close - avgPrice)*1000,1.1), 100), minExitPercent))
if close == avgPrice
longAddPercent := 1
longSignal = (close <= lowestLow) and bullishDivergence
shortSignal = (close >= highestHigh) and bearishDivergence
plotLongSignal = down_trend and longSignal and close < avgPrice
plotShortSignal = up_trend and shortSignal and close > avgPrice
if plotLongSignal
label.new(bar_index, avgPrice, "average price: " + str.tostring(avgPrice, "#.####"), style=label.style_label_up, color=color.green, textcolor=color.white )
if plotShortSignal
label.new(bar_index, avgPrice,"average price: " + str.tostring(avgPrice, "#.####"), style=label.style_label_down, color=color.red, textcolor=color.white)
if plotLongSignal
label.new(
bar_index,
close,
"LONG :" + str.tostring(longAddPercent, "#.####") + "%, Close: " + str.tostring(close, "#.####"),
style=label.style_label_up,
color=color.new(color.green, 80),
textcolor=color.white
)
if plotShortSignal
label.new(
bar_index,
close,
"EXIT LONG :" + str.tostring(shortAddPercent, "#.####") + "%, Close: " + str.tostring(close, "#.####"),
style=label.style_label_down,
color=color.new(color.red, 80),
textcolor=color.white
)
if longSignal
avgPrice := na(avgPrice) ? close : (avgPrice + close) / 2
if down_trend and longSignal
strategy.entry("Long",strategy.long,qty=longAddPercent )
var float close_size = na
if up_trend and shortSignal
if strategy.position_size > 0
close_size := strategy.position_size * (shortAddPercent/100)
strategy.order("Partial Close Long", strategy.short, close_size)