Estrategia comercial adaptativa para redes inteligentes


Fecha de creación: 2024-01-16 14:51:48 Última modificación: 2024-01-16 14:51:48
Copiar: 1 Número de Visitas: 985
1
Seguir
1617
Seguidores

Estrategia comercial adaptativa para redes inteligentes

Descripción general

La estrategia es una estrategia de negociación de red inteligente adaptativa basada en la plataforma TradingView, escrita con Pine Script v4. Se cubre en la tabla de precios y crea una red en el rango indicado para generar señales de compra y venta.

Principio de estrategia

Funciones clave

  1. La pirámide y la gestión de fondos:

    • En el caso de las pirámides, se permiten hasta 14 repeticiones.
    • El tamaño de las posiciones se gestiona mediante una estrategia basada en el dinero en efectivo.
    • Para fines de simulación, el capital inicial se fijó en US\(100, y el capital inicial se fijó en US\)100.
    • Se cobra una comisión del 0.1% por cada transacción.
  2. Rango de la red:

    • El usuario puede elegir entre usar un rango calculado automáticamente o configurar manualmente el límite superior o inferior de la grilla.
    • Los rangos automáticos pueden extraerse de los máximos y mínimos más recientes o de las medias móviles simples (SMA), que se pueden calcular a partir de las medias de los precios más recientes.
    • El usuario puede definir el período de revisión para el cálculo del rango y ajustar la desviación para ampliar o reducir el rango.
  3. Línea de red:

    • La estrategia permite un número de líneas de la grilla que se puede personalizar dentro de un rango, recomendando un rango de entre 3 y 15, que se puede ajustar a las líneas de la grilla.
    • Las líneas de la cuadrícula están uniformemente espaciadas entre el límite superior y el inferior.

Lógica de estrategia

  • La entrada de las posiciones:

    • Cuando el precio cae por debajo de la línea de la grilla y no hay una orden sin liquidar relacionada con la línea de la grilla, el guión hace una compra, y la línea de la grilla se mantiene.
    • La cantidad de cada compra se calcula en función del capital inicial dividido por el número de líneas de la red y se ajusta en función del precio actual.
  • El resultado fue un aumento de las ventas.

    • La señal de venta se activa cuando el precio sube más allá de la línea de la red más alta y existe una orden de posición pendiente relacionada con la siguiente línea de la red más baja.
  • La red de adaptación:

    • Si se utiliza el rango automático, la red se adapta a las condiciones cambiantes del mercado recalculando el límite superior y el inferior y ajustándose en consecuencia.

Análisis de las ventajas

La estrategia integra las ventajas de la sistematización y la ejecución eficiente de las operaciones de la red. Permite la adición y el uso de la gestión de fondos, que puede controlar el riesgo de manera efectiva. La red se adapta automáticamente al mercado, para diferentes situaciones. Los parámetros se pueden ajustar para adaptarse a diferentes estilos de negociación.

Análisis de riesgos

La ruptura del precio de la parte inferior de la red puede causar grandes pérdidas. Se deben ajustar los parámetros adecuadamente, o combinar los parámetros de pérdidas para controlar el riesgo. Además, el comercio demasiado frecuente aumenta las tarifas comerciales.

Dirección de optimización

Se puede considerar la combinación de señales de filtro de indicadores de tendencia o la optimización de parámetros de la red, o se puede prevenir el riesgo de situaciones extremas mediante el stop loss.

Resumir

Esta estrategia genera puntos de compra y venta de forma sistemática y gestiona las posiciones, adaptándose a las diferentes preferencias mediante el ajuste de parámetros. Combina orgánicamente la regularidad de la negociación de la red con la flexibilidad de la negociación de tendencias, lo que reduce la dificultad de la operación y tiene cierta tolerancia a los errores.

Código Fuente de la Estrategia
/*backtest
start: 2024-01-08 00:00:00
end: 2024-01-15 00:00:00
period: 5m
basePeriod: 1m
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)