
Стратегия отстранения от матрицы является количественной торговой стратегией, которая сочетает в себе тренд, отстранение и равновесие. Эта стратегия использует бинарный RSI, чтобы определить направление тенденции рынка и установить входный сигнал в сочетании с матричной равновесие.
Стратегия отклонения от матрицы состоит из следующих частей:
Используйте быстрый RSI и медленный RSI для определения направления рыночной тенденции. Когда быстрый RSI становится перекупленным или перепроданным, используйте медленный RSI для определения направления тенденции.
Установка набора матричных средних линий в зависимости от цены входа и соответствующая корректировка позиции, когда цена касается определенной средней линии. Таким образом, можно получить больше прибыли в тренде.
По умолчанию двунаправленная торговля.
Конкретная логика сделки заключается в следующем:
Используйте быстрый 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')