Стратегия дивергентного матричного тренда является количественной торговой стратегией, которая сочетает в себе анализ тренда, дивергенции и скользящей средней. Эта стратегия использует двойные индикаторы RSI для оценки направления тренда рынка и матричные скользящие средние для генерации сигналов входа.
Стратегия последовательности тенденций матрицы дивергенции состоит из следующих основных частей:
Двойной ИСО для оценки тренда
Используйте быстрый и медленный RSI для определения направления тренда на рынке.
Матричная скользящая средняя для торговых сигналов
Установите группу скользящих средних матриц на основе входной цены. Когда цена касается скользящей средней линии, соответствующим образом корректируйте позицию. Это позволяет получить больше прибыли от трендов.
Двухнаправленная торговля
По умолчанию торговать можно двусторонне.
Конкретная логика торговли:
Используйте быстрый RSI для выявления временных уровней перекупа/перепродажи на рынке.
Используйте медленный индекс рентабельности для определения средне- и долгосрочного направления тренда рынка.
Когда быстрый RSI показывает крайности, а медленный RSI сигнализирует об изменении тренда, занять позиции на основе длинного/короткого тренда медленного RSI.
После ввода позиций настроите группу матричных скользящих средних. Эти матричные линии основаны на цене входа, с размером интервала, определенным в параметре
Когда цена касается линии матрицы, корректируйте размер позиции соответственно.
Когда цена будет сильно изменяться, позиции будут возвращены на исходный уровень.
Выше описана основная логика торговли этой стратегии.
Стратегия последовательности тенденций матрицы дивергенции имеет следующие преимущества:
Быстрый RSI избегает ложных прорывов, а медленный RSI гарантирует правильный тренд.
Направление размеров позиций на основе ценовой дивергенции позволяет получить устойчивую прибыль.
Поддерживает двунаправленную торговлю. По умолчанию это двунаправленная торговля, но также может идти долго только. Это адаптируется к большей среде рынка.
Механизм сброса позиций контролирует риски. Сброс позиций, когда цена видит большие корректировки, позволяет своевременно остановить убытки.
Гибкие настройки параметров. Пользователи могут выбирать оптимальные комбинации параметров на основе исторических данных, торговых инструментов и т.д.
Четкое разделение обязанностей делает код простым для понимания, оптимизации и расширения.
В целом, наибольшим преимуществом этой стратегии является улучшение качества сигнала с помощью нескольких механизмов при одновременном достижении более высокой доходности при контролируемых рисках.
Стратегия "Следующая тенденция матрицы дивергенции" также сопряжена с определенными рисками, главным образом в следующих областях:
Риск отказа двойных сигналов RSI. Когда рынок ограничен диапазоном, RSI часто дает ложные сигналы. Необходимо ручное вмешательство для корректировки параметров или приостановки торговли.
Если параметры матрицы не установлены должным образом, корректировка положения может быть слишком агрессивной, что увеличивает потери.
Риск чрезмерного использования кредитных инструментов. Чрезмерные корректировки размеров позиций также увеличивают убытки. Максимальный параметр размеров позиций должен быть определен осторожно.
Риск переворота тренда. Если не удастся немедленно закрыть позиции при перевороте тренда, могут возникнуть большие убытки. Это требует мониторинга долгосрочных показателей тренда.
Ограниченный риск оптимизации пространства. Эта стратегия уже достаточно зрелая. Продолжающийся потенциал оптимизации ограничен. Если рыночные режимы резко изменятся, могут потребоваться крупные обновления.
Оценка и оптимизация стратегии являются ключевыми для смягчения этих рисков - корректировка параметров, мониторинг долгосрочных показателей и т.д. могут в некоторой степени снизить риски.
Есть возможности для дальнейшего совершенствования тенденции матрицы дивергенции.
Оптимизируйте двойные параметры RSI. Проверьте больше комбинаций параметров и выберите периоды RSI с наибольшей точностью.
Разрешить пользователям настраивать настройки матрицы на основе различных инструментов, чтобы лучше соответствовать их характеристикам.
Добавьте механизмы стоп-лосса. Например, установите линии выхода, чтобы остановить позиции, если цена нарушит эти линии.
Добавьте более научные правила размещения позиций. Управляйте корректировками размеров позиций более постепенно, чтобы предотвратить чрезмерное использование.
Включите другие индикаторы. Введите дополнительные индикаторы, такие как MACD, KD и т. Д., Чтобы улучшить точность сигнала.
Оптимизировать структуру кода. Дальнейшее улучшение расширяемости, устойчивости и эффективности выполнения кода.
Дивергентная матрица - это сложная количественная стратегия торговли, сочетающая в себе несколько механизмов - с использованием двойного RSI для направления тренда и матричных линий для получения прибыли от трендов. По сравнению с одноиндикаторными стратегиями, она обеспечивает более стабильные и эффективные торговые сигналы. Благодаря настройке параметров и расширениям оптимизации эта стратегия может адаптироваться к большему количеству рыночных условий и режимов, что делает ее очень универсальной. В целом эта стратегия достигает хорошего баланса между риском и доходностью и заслуживает активного применения и постоянного улучшения инвесторами.
/*backtest start: 2023-01-01 00:00:00 end: 2023-10-14 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("The Matrix 7.0 Strategy", overlay=false) //Matrix Settings entry_size = input(title="Entry Size", defval = 1) max_size = input(title="Max Size", defval = 10000) matrix = input(title="Matrix Interval %", defval = 2) matrix_price_overwrite = input(title="Matrix Overwrite $", defval = 0.0) adjustment = input(title="Adjustment Size", defval = 1000) trade_short = input(title="Trade Short", type=bool, defval = true) //RSI Settings periods = input(title="RSI Periods", defval = 14) overbought_short = input(title="RSI Overbought", defval = 65) oversold_short = input(title="RSI Oversold", defval = 30) //RSI Trend Settings resolution_long = input(title="Resolution Trend", defval = "D") periods_long = input(title="RSI Trend Periods", defval = 14) overbought_long = input(title="RSI Trend Overbought", defval = 64) oversold_long = input(title="RSI Trend Oversold", defval = 30) //Round Off to 2 decimals round2(x) => a = x * 10 * 10 a := floor(a + 0.5) a := a / 10 / 10 a //RSI Function RSI = rsi(close, periods) //RSI Market Function rsi_oversold = RSI < oversold_short rsi_overbought = RSI > overbought_short market_rsi = 0.0 market_rsi := if (rsi_oversold) RSI - oversold_short else if (rsi_overbought) RSI - overbought_short else 0 //RSI Trend Function rsi_long = request.security(syminfo.tickerid,resolution_long,rsi(close,periods_long)) trend_rsi_long = rsi_long < oversold_long trend_rsi_short = rsi_long > overbought_long trend_rsi = 0 trend_rsi := if (trend_rsi_short) -1 else if (trend_rsi_long) 1 else trend_rsi[1] // // Shorter time resolution to make "close" crosses give faster positives. // short_resolution = security(tickerid, "1", close) // quick = round2(short_resolution) //ROUND OFF TO 2 DECIMAL PLACES. //Declare Other Variables entry_price = 0.0 entry_price := nz(entry_price[1]) position_size = 0.0 position_size := nz(position_size[1]) last_traded_price = 0.0 last_traded_price := nz(last_traded_price[1]) matrix_price = 0.0 if matrix_price_overwrite > 0.0 matrix_price := matrix_price_overwrite else matrix_price := round2((matrix/100) * entry_price) level = 0 level := nz(level[1]) level_price = entry_price if not na(level_price[1]) level_price := level_price[1] // Calculate Level if close > level_price level_change = floor((high - level_price)/matrix_price) level := level + level_change else if close < level_price level_change = ceil((low - level_price)/matrix_price) level := level + level_change // Calculate Level Price level_price := (level * matrix_price) + entry_price // Calculate Matrix Position matrix_position = 0.0 if position_size > 0 matrix_position := ((-1 * level) * adjustment) + entry_size else if position_size < 0 matrix_position := ((-1 * level) * adjustment) - entry_size //Trend Entry or Reversal Conditions trend_reversal_up = trend_rsi == 1 and (trend_rsi[1] == -1 or trend_rsi == 0) and position_size <= 0 trend_reversal_down = trend_rsi == -1 and (trend_rsi[1] == 1 or trend_rsi == 0) and position_size >= 0 and trade_short == true flatten_position = trend_rsi == -1 and (trend_rsi[1] == 1 or trend_rsi == 0) and position_size >= 0 and trade_short == false //Reset Conditions reset_long = (position_size > 0) and (close - entry_price > matrix_price) and (market_rsi < 0) and (position_size != entry_size) reset_short = (position_size < 0) and (entry_price - close > matrix_price) and (market_rsi > 0) and (position_size != (-1 * entry_size)) //Adjustment Conditions increase_long = (position_size > 0) and (matrix_position > position_size) and (market_rsi < 0) and (matrix_position <= max_size) decrease_long = (position_size > 0) and (matrix_position < position_size) and (market_rsi > 0) increase_short = (position_size < 0) and (matrix_position < position_size) and (market_rsi > 0) and (matrix_position >= (-1 * max_size)) decrease_short = (position_size < 0) and (matrix_position > position_size) and (market_rsi < 0) //Transactions //Trend Reversals if trend_reversal_up strategy.entry("OL", strategy.long, qty=entry_size) position_size := entry_size matrix_position := entry_size level := 0 else if trend_reversal_down strategy.entry("OS", strategy.short, qty=entry_size) position_size := -1 * entry_size matrix_position := -1 * entry_size level := 0 //Reset Positions else if reset_long order = entry_size - position_size[1] strategy.order("RL", strategy.long, qty=order) position_size := entry_size matrix_position := entry_size level := 0 else if reset_short order = position_size[1] - (-1* entry_size) strategy.order("RS", strategy.short, qty=order) position_size := -1 * entry_size matrix_position := -1 * entry_size level := 0 //Position Adjustments else if increase_long order = matrix_position - position_size[1] strategy.order("IL", strategy.long, qty=order) position_size := position_size[1] + order else if decrease_long order = position_size[1] - matrix_position strategy.order("DL", strategy.short, qty=order) position_size := position_size[1] - order else if increase_short order = position_size[1] - matrix_position strategy.order("IS", strategy.short, qty=order) position_size := position_size[1] - order else if decrease_short order = matrix_position - position_size[1] strategy.order("DS", strategy.long, qty=order) position_size := position_size[1] + order else if flatten_position strategy.close_all() position_size := 0.0 matrix_position := 0.0 level := 0 //Grouped Actions if trend_reversal_up or trend_reversal_down or reset_short or reset_long entry_price := round2(close) last_traded_price := round2(close) if increase_long or decrease_long or increase_short or decrease_short last_traded_price := round2(close) // //RSI Trend & Adjustment Moments. (strategy) p1 = plot(market_rsi, color = trend_rsi > 0 ? green : red, linewidth = 4, title='Market', transp =0) p2 = plot(trend_rsi, color = trend_rsi > 0 ? green : red, linewidth = 4, title='Trend', transp = 0) fill(p1,p2, color=trend_rsi > 0 ? green : red, transp=0) p3 = plot((rsi_long - 50) *2, color = white, title="Trend Index") fill(p2,p3, color=white) hline((overbought_long -50) * 2) hline((oversold_long -50) * 2) //Position Plots (strategy) plot(matrix_position / 100, title='Matrix', color=white, linewidth = 4) plot(position_size / 100, title='Position', color=blue, linewidth = 4) plot(strategy.position_size / 100, title='Strategy', color=orange, linewidth = 4) // //Price Plots (study) // plot(level_price, title="Matrix Level Price", linewidth=4) // plot(last_traded_price, title="Last Traded Price", linewidth=2, color=orange) // plot(entry_price + (4 * matrix_price), title='Adjustment 4', color=white, linewidth = 1) // plot(entry_price + (3 * matrix_price), title='Adjustment 3', color=white, linewidth = 1) // plot(entry_price + (2 * matrix_price), title='Adjustment 2', color=white, linewidth = 1) // plot(entry_price + matrix_price, title='Adjustment 1', color=white, linewidth = 1) // plot(entry_price, title='Entry Price', color=white, linewidth = 3) // plot(entry_price - matrix_price, title='Adjustment -1', color=white, linewidth = 1) // plot(entry_price - (2 * matrix_price), title='Adjustment -2', color=white, linewidth = 1) // plot(entry_price - (3 * matrix_price), title='Adjustment -3', color=white, linewidth = 1) // plot(entry_price - (4 * matrix_price), title='Adjustment -4', color=white, linewidth = 1) // //Alerts (study only) // alertcondition(trend_reversal_up, title='Trend Reversal Up', message='Market Oversold, Lets Buy') // alertcondition(trend_reversal_down, title='Trend Reversal Down', message='Market Overbought, Lets Sell') // alertcondition(reset_long, title='Reset Long', message='Higher Bottom, Lets Buy') // alertcondition(reset_short, title='Reset Short', message='Lower Top, Lets Sell') // alertcondition(increase_long, title='Increase Long', message='Price Dropped, Lets Buy') // alertcondition(decrease_long, title='Decrease Long', message='Price Spiked, Lets Sell') // alertcondition(increase_short, title='Increase Short', message='Price Spiked, Lets Sell') // alertcondition(decrease_short, title='Decrease Short', message='Price Dropped, Lets Buy') // //Grouped Conditions // condition_buy = trend_reversal_up or increase_long or decrease_short or reset_long // condition_sell = trend_reversal_down or decrease_long or increase_short or reset_short // adjustment_matrix = trend_reversal_up or increase_long or decrease_short or trend_reversal_down or decrease_long or increase_short or reset_long or reset_short // //Grouped Alerts // alertcondition(condition_buy, title='Condition Buy', message='You Need to Buy') // alertcondition(condition_sell, title='Condition Sell', message='You Need to Sell!') // alertcondition(adjustment_matrix, title='Adjustment Matrix', message='You Need to Adjust')