
Se trata de una estrategia de trading cuantificada avanzada de seguimiento de tendencias de la grilla dinámica. La idea principal de la estrategia es dividir varias líneas de la grilla dentro de un rango de precios preestablecido y establecer automáticamente una compra o venta de posición baja cuando el precio toca la grilla, para obtener ganancias en situaciones de crisis. La estrategia también tiene la función de ajustar dinámicamente la posición de la grilla y puede optimizar la disposición de la grilla de manera adaptativa en función de la última movida de precios.
Los principios centrales de la estrategia son los siguientes:
En primer lugar, se determina el límite superior y inferior de la grilla y el número de líneas de la grilla según la configuración del usuario. Los límites pueden ser valores fijos o pueden calcularse automáticamente en función de los máximos y mínimos recientes o de las medias móviles.
Dentro de los límites establecidos, divida el intervalo de precios en varias cuadrículas. Cada línea de la cuadrícula corresponde a un precio de compra o venta.
Cuando cada precio toca la línea de la red, la estrategia comprueba si ya tiene una posición correspondiente a esa línea de la red. Si no hay una posición de compra, se compra y si hay una posición de venta.
La estrategia de vender a precios relativamente altos y comprar a precios bajos permite obtener ganancias continuas en momentos de fluctuaciones.
Al mismo tiempo, si el usuario ha activado la función de ajuste automático de la frontera, la posición de la línea de la red se ajustará de forma automática en función de los puntos altos y bajos de los precios recientes o de la media móvil establecida para optimizar la disposición de la red.
A través de los principios mencionados, la estrategia permite realizar compras altas y bajas automáticas en situaciones de fluctuaciones de precios y ajustar las posiciones de ventaja según la tendencia, lo que mejora los beneficios generales.
La estrategia de la red dinámica tiene las siguientes ventajas:
Adaptabilidad: puede adaptarse a diferentes mercados y variedades mediante la configuración de parámetros, y tiene una buena adaptabilidad a situaciones sísmicas.
Alta automatización. Dado que la estrategia se basa en una lógica matemática estricta, el punto de salida y salida de la posición está claro, por lo que se puede lograr una negociación completamente automatizada y se reduce la interferencia de las emociones subjetivas.
Control de riesgos: mediante la configuración de parámetros como el número de grillas, los límites de la grilla, etc., se puede controlar eficazmente la abertura de riesgo de cada transacción, lo que mantiene el riesgo general dentro de un rango aceptable.
Adaptabilidad a las tendencias. La estrategia incluye la función de ajustar dinámicamente los límites de la red, lo que permite que la red se optimice siguiendo las tendencias de los precios, lo que mejora la rentabilidad en situaciones de tendencias.
Estabilidad de las tasas de ganancia. Dado que el comercio de la red es, por naturaleza, una tendencia a subir y bajar con frecuencia en las fluctuaciones de los precios, la estrategia puede seguir siendo rentable siempre que los precios sigan en movimiento, por lo que tiene una alta tasa de ganancia en el largo plazo.
A pesar de las evidentes ventajas de esta estrategia, también hay ciertos riesgos:
Riesgo de tendencia. Si los precios se encuentran en una fuerte tendencia unilateral que rompe los límites de la red, el espacio de ganancias de la estrategia se verá limitado y podría enfrentarse a una mayor reversión.
La estrategia tiene muchos parámetros, incluidos el número de grillas, los límites iniciales, los parámetros de los límites dinámicos, etc. La combinación de diferentes parámetros tiene un gran impacto en el rendimiento de la estrategia, y la dificultad de optimización real es considerable.
La estrategia de la red es esencialmente una estrategia de alta frecuencia, con una gran frecuencia en las posiciones cerradas, lo que significa un mayor costo de transacción y un potencial riesgo de deslizamiento.
La estrategia es muy dependiente de la movilidad de los movimientos y es probable que se enfrente a una gran reversión una vez que el precio entra en una rápida tendencia unilateral.
En respuesta a estos riesgos, se puede comenzar a mejorar en los siguientes aspectos: la adición de indicadores de determinación de tendencias como condiciones de filtración para el inicio de la estrategia, la optimización del espacio y los métodos de búsqueda de parámetros, la introducción de la gestión de fondos y la lógica de control de posiciones, el aumento de la tendencia a romper la lógica de la posición de equilibrio, etc. A través de estas optimizaciones, se puede mejorar aún más la estabilidad y la rentabilidad de la estrategia.
Basado en el análisis anterior, las principales direcciones de optimización de la estrategia son:
Introducción de condiciones de filtro de tendencia. La inclusión de indicadores de juicio de tendencia, como promedios móviles, ADX, etc. antes del inicio de la estrategia, solo se inicia la estrategia en caso de movimiento de la oscilación, y se mantiene la observación en caso de movimiento de la tendencia, de modo que se pueda evitar eficazmente el riesgo de retorno en caso de movimiento de la tendencia.
Optimizar la búsqueda de parámetros. Utiliza algoritmos inteligentes para optimizar los parámetros de la red, como algoritmos genéticos, algoritmos de grupos de partículas, etc., para buscar automáticamente la combinación de parámetros óptimos y mejorar la eficiencia y la calidad de la optimización.
Mejora de la lógica de control de riesgo. Incluye más lógica de control de riesgo en la estrategia, como ajustar el ancho de la red en función de la volatilidad de los precios, establecer el límite máximo de retirada para activar la posición de paridad, etc., para controlar mejor el riesgo.
Introducir un stop loss. Establecer que la tendencia rompa la línea de stop loss, como un determinado porcentaje de la frontera de la grilla, y una vez que el precio rompa la línea de stop loss, se cerrará la posición para evitar una gran reversión en la tendencia.
Optimización de la ejecución de las transacciones. Optimización de la ejecución de las transacciones, como la adopción de una lista de condiciones y algoritmos de órdenes más avanzados, para reducir la frecuencia y el costo de las transacciones y mejorar la eficiencia de la ejecución.
Con estas optimizaciones, se puede mejorar la adaptabilidad, la robustez y la rentabilidad de la estrategia para acercarla a las necesidades reales.
En general, la estrategia de seguimiento de tendencias de la red dinámica es una estrategia de comercio de media y alta frecuencia basada en el principio de comercio de la red, al mismo tiempo que integra el mecanismo de ajuste dinámico y adaptación a la tendencia. Sus ventajas son su gran adaptabilidad, alto grado de automatización, control de riesgos, buena adaptabilidad a la tendencia, estabilidad de la tasa de ganancia, etc., pero también existe un fuerte riesgo de riesgo de tendencia, dificultad para optimizar los parámetros, comercio frecuente y dependencia de las condiciones.
La idea de la cuadrícula es en sí misma un método de cuantificación relativamente maduro y práctico, y las ventajas del comercio de cuadrícula clásico se han extendido y desarrollado a través de la optimización dinámica de la estrategia y la adición de mecanismos de adaptación a las tendencias. Ofrece a los inversores una nueva idea y posibilidad de comercio cuantitativo en situaciones de crisis.
/*backtest
start: 2024-03-01 00:00:00
end: 2024-03-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("(IK) Grid Script", overlay=true, pyramiding=14, close_entries_rule="ANY", default_qty_type=strategy.cash, initial_capital=100.0, currency="USD", commission_type=strategy.commission.percent, commission_value=0.1)
i_autoBounds = input(group="Grid Bounds", title="Use Auto Bounds?", defval=true, type=input.bool) // calculate upper and lower bound of the grid automatically? This will theorhetically be less profitable, but will certainly require less attention
i_boundSrc = input(group="Grid Bounds", title="(Auto) Bound Source", defval="Hi & Low", options=["Hi & Low", "Average"]) // should bounds of the auto grid be calculated from recent High & Low, or from a Simple Moving Average
i_boundLookback = input(group="Grid Bounds", title="(Auto) Bound Lookback", defval=250, type=input.integer, maxval=500, minval=0) // when calculating auto grid bounds, how far back should we look for a High & Low, or what should the length be of our sma
i_boundDev = input(group="Grid Bounds", title="(Auto) Bound Deviation", defval=0.10, type=input.float, maxval=1, minval=-1) // if sourcing auto bounds from High & Low, this percentage will (positive) widen or (negative) narrow the bound limits. If sourcing from Average, this is the deviation (up and down) from the sma, and CANNOT be negative.
i_upperBound = input(group="Grid Bounds", title="(Manual) Upper Boundry", defval=0.285, type=input.float) // for manual grid bounds only. The upperbound price of your grid
i_lowerBound = input(group="Grid Bounds", title="(Manual) Lower Boundry", defval=0.225, type=input.float) // for manual grid bounds only. The lowerbound price of your grid.
i_gridQty = input(group="Grid Lines", title="Grid Line Quantity", defval=8, maxval=15, minval=3, type=input.integer) // how many grid lines are in your grid
f_getGridBounds(_bs, _bl, _bd, _up) =>
if _bs == "Hi & Low"
_up ? highest(close, _bl) * (1 + _bd) : lowest(close, _bl) * (1 - _bd)
else
avg = sma(close, _bl)
_up ? avg * (1 + _bd) : avg * (1 - _bd)
f_buildGrid(_lb, _gw, _gq) =>
gridArr = array.new_float(0)
for i=0 to _gq-1
array.push(gridArr, _lb+(_gw*i))
gridArr
f_getNearGridLines(_gridArr, _price) =>
arr = array.new_int(3)
for i = 0 to array.size(_gridArr)-1
if array.get(_gridArr, i) > _price
array.set(arr, 0, i == array.size(_gridArr)-1 ? i : i+1)
array.set(arr, 1, i == 0 ? i : i-1)
break
arr
var upperBound = i_autoBounds ? f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, true) : i_upperBound // upperbound of our grid
var lowerBound = i_autoBounds ? f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, false) : i_lowerBound // lowerbound of our grid
var gridWidth = (upperBound - lowerBound)/(i_gridQty-1) // space between lines in our grid
var gridLineArr = f_buildGrid(lowerBound, gridWidth, i_gridQty) // an array of prices that correspond to our grid lines
var orderArr = array.new_bool(i_gridQty, false) // a boolean array that indicates if there is an open order corresponding to each grid line
var closeLineArr = f_getNearGridLines(gridLineArr, close) // for plotting purposes - an array of 2 indices that correspond to grid lines near price
var nearTopGridLine = array.get(closeLineArr, 0) // for plotting purposes - the index (in our grid line array) of the closest grid line above current price
var nearBotGridLine = array.get(closeLineArr, 1) // for plotting purposes - the index (in our grid line array) of the closest grid line below current price
strategy.initial_capital = 50000
for i = 0 to (array.size(gridLineArr) - 1)
if close < array.get(gridLineArr, i) and not array.get(orderArr, i) and i < (array.size(gridLineArr) - 1)
buyId = i
array.set(orderArr, buyId, true)
strategy.entry(id=tostring(buyId), long=true, qty=(strategy.initial_capital/(i_gridQty-1))/close, comment="#"+tostring(buyId))
if close > array.get(gridLineArr, i) and i != 0
if array.get(orderArr, i-1)
sellId = i-1
array.set(orderArr, sellId, false)
strategy.close(id=tostring(sellId), comment="#"+tostring(sellId))
if i_autoBounds
upperBound := f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, true)
lowerBound := f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, false)
gridWidth := (upperBound - lowerBound)/(i_gridQty-1)
gridLineArr := f_buildGrid(lowerBound, gridWidth, i_gridQty)
closeLineArr := f_getNearGridLines(gridLineArr, close)
nearTopGridLine := array.get(closeLineArr, 0)
nearBotGridLine := array.get(closeLineArr, 1)