
La estrategia de seguimiento de tendencias de la matriz de separación es una estrategia de negociación cuantitativa que combina tendencias, separación y equilibrio. La estrategia utiliza el indicador RSI doble para determinar la dirección de la tendencia del mercado y, en combinación con el equilibrio de la matriz, establece una señal de entrada. La matriz de equilibrio ajusta el tamaño de la posición según el grado de separación del precio.
La estrategia de seguimiento de tendencias de la matriz de separación se compone principalmente de las siguientes partes:
Utilice el RSI rápido y el RSI lento para determinar la dirección de la tendencia del mercado. Cuando el RSI rápido se sobrecompra o se sobreventa, combine el RSI lento para determinar la dirección de la tendencia.
Establezca un conjunto de medias de la matriz de acuerdo con el precio de entrada y ajuste su posición cuando el precio toque una media. De esta manera, puede obtener más ganancias en la tendencia.
La opción por defecto es el comercio bidireccional. Se puede optar por hacer más y no hacer menos.
La lógica de la transacción es la siguiente:
Utiliza el RSI rápido para evaluar el exceso de compra y venta temporal en el mercado.
El uso del RSI lento para determinar la dirección de la tendencia a medio y largo plazo.
Cuando el RSI rápido se sobrecompra y se sobreventa, y el RSI lento muestra un cambio de tendencia, haga una posición en la dirección correspondiente según el criterio de la amplitud del RSI lento.
Una vez construido el almacén, se establece un conjunto de medias matriciales que rodean la configuración del precio de entrada. El tamaño del intervalo se establece por el parámetro de porcentaje de penetración entre las áreas de la matriz de penetración.
Cuando el precio toque la línea media de la matriz, ajuste la cantidad de la posición. Si se rompe la línea media hacia arriba, se aumentan las ofertas; Si se rompe hacia abajo, se reducen las ofertas en blanco.
Cuando el precio se ajusta más, la posición se restablece a su nivel inicial.
Esta es la lógica de negociación principal de la estrategia. A través de la media de la matriz, se puede bloquear más ganancias en la tendencia.
Las estrategias de seguimiento de tendencias de la matriz de separación tienen las siguientes ventajas:
El RSI doble es más fiable. El RSI rápido evita falsas rupturas, y el RSI lento asegura que la tendencia general es correcta.
La matriz de la línea media sigue la tendencia de obtener ganancias. Ajustar la posición según el grado de desviación del precio, puede ser rentable.
Soporta el comercio bidireccional. El comercio bidireccional por defecto, también puede hacer más. Se puede adaptar a más entornos de mercado.
El mecanismo de reposicionamiento controla el riesgo. El reposicionamiento de posiciones puede detenerse a tiempo cuando el precio se ajusta claramente.
La configuración de parámetros es flexible. El usuario puede elegir la combinación de parámetros óptima en función de los datos históricos, la variedad de transacciones, etc.
La estructura del código es clara. Las responsabilidades de cada parte están claramente divididas, y son fáciles de entender, optimizar y ampliar.
En general, la mayor ventaja de esta estrategia es que utiliza múltiples mecanismos para mejorar la calidad de la señal y buscar mayores ganancias al mismo tiempo que controla el riesgo. Esta es una estrategia de negociación en la que el riesgo y la ganancia se equilibran.
Las estrategias de seguimiento de tendencias de la matriz de desviación también presentan algunos riesgos, que se centran en:
El doble RSI determina el riesgo de fracaso. El RSI a menudo emite señales falsas cuando el mercado está en un ajuste de choque. En este caso, se requiere una tendencia de prueba, un ajuste adecuado de los parámetros o una suspensión de la negociación.
El método de matriz lineal no es adecuado para el riesgo. Si los parámetros de la matriz no están configurados correctamente, el ajuste de posición puede ser demasiado radical, lo que aumenta las pérdidas. Los parámetros deben probarse con cuidado.
El exceso de posición aumenta el riesgo. Ajustar la amplitud de la posición demasiado grande también puede causar la expansión de las pérdidas. El parámetro de la posición máxima debe establecerse con cautela.
Riesgo de reversión de la tendencia. Cuando se produce una reversión de la tendencia, si no se cierra la posición a tiempo, se enfrentan a grandes pérdidas. Esto requiere prestar atención a los indicadores de tendencia de un período más largo.
El espacio para optimizar el código es limitado. El riesgo es que la estrategia está más madura y el espacio para continuar optimizando es limitado. Si el entorno del mercado cambia mucho, la lógica de negociación en general necesita ser reevaluada.
La evaluación y optimización de las estrategias es la clave para reducir estos riesgos. Se puede evitar el riesgo hasta cierto punto mediante la adaptación de la combinación de parámetros y la supervisión de indicadores de ciclo más largo.
La estrategia de seguimiento de tendencias de la matriz de desviación tiene espacio para una mayor optimización:
Optimización de los parámetros del doble RSI. Se pueden probar más combinaciones de parámetros y elegir el valor de ciclo RSI más preciso.
Configuración de la mediana de la matriz personalizada. Permite a los usuarios configurar la mediana de la matriz de acuerdo con los parámetros de las diferentes variedades, para que se ajuste mejor a las características de la variedad.
Aumentar el mecanismo de stop loss. Por ejemplo, establecer una línea media de salida, donde el precio se detiene cuando cae por debajo de esa línea media.
Aumentar las reglas de proporción de posiciones. Adaptar la escala y velocidad de las posiciones de manera más científica y razonable para evitar que las posiciones se agranden excesivamente.
En combinación con otros indicadores. Se pueden introducir otros indicadores como MACD, KD para un juicio auxiliar, para mejorar la precisión de la señal.
Optimizar la estructura del código. Continuar mejorando la extensibilidad, la capacidad de mantenimiento y la eficiencia de ejecución del código.
La estrategia de seguimiento de la tendencia de la matriz de separación es una estrategia de comercio cuantitativa integrada de múltiples mecanismos. Utiliza principalmente el pensamiento de los dos RSI para determinar la dirección de la tendencia y el seguimiento de la tendencia de la matriz para obtener ganancias. En comparación con la estrategia de un solo indicador, la estrategia puede proporcionar una señal de comercio más estable y eficiente.
/*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')