Baseado em estratégia de negociação de grade dinâmica


Data de criação: 2024-01-23 10:53:05 última modificação: 2024-01-23 10:53:05
cópia: 0 Cliques: 832
1
focar em
1617
Seguidores

Baseado em estratégia de negociação de grade dinâmica

Visão geral

Esta estratégia permite a negociação de grades através da instalação de vários pedidos de compra e venda em paralelo dentro de uma faixa de preços, ajustando os intervalos e linhas da grades de acordo com a flutuação do mercado, para obter lucro.

Princípio da estratégia

  1. O limite superior e inferior da grelha pode ser configurado manualmente ou pode ser calculado automaticamente com base nos altos e baixos dos preços nos últimos tempos.
  2. Calcule a largura do espaço entre as grades de acordo com o número de grades definidas.
  3. Gera um número correspondente de matrizes de preços.
  4. Quando o preço está abaixo de uma linha da grelha, é aberto um cartão abaixo da linha; quando o preço está acima de uma linha da grelha, é aberto um cartão em branco acima da linha.
  5. Ajustar dinamicamente os limites superiores e inferiores da grade, a largura dos intervalos e os preços das linhas da grade para adaptá-los às mudanças do mercado.

Análise de vantagens

  1. O mercado de ações é um mercado de ações que permite a obtenção de lucros estáveis em mercados horizontais e flutuantes, sem ser afetado por uma tendência unilateral.
  2. Suporte para configuração manual, computação automática de intervalos de grelha e adaptabilidade.
  3. Pode-se otimizar o rendimento ajustando o número de grades, a largura da grelha e a quantidade de encomendas.
  4. Controle de posicionamento interno para controlar o risco.
  5. Suporte para ajuste dinâmico do alcance da grelha, permitindo uma maior adaptabilidade da estratégia

Análise de Riscos

  1. Quando há uma tendência significativa, pode haver um grande prejuízo.
  2. O número de grades e a configuração inadequada das posições podem aumentar o risco.
  3. O cálculo automático da distância entre as grades pode falhar em situações extremas.

Soluções de risco:

  1. Optimizar os parâmetros da grelha e controlar rigorosamente a posição total.
  2. “A estratégia de fechar antes de uma grande crise”.
  3. A estratégia de desligar, se necessário, é avaliada com base nos indicadores de tendência.

Direção de otimização

  1. O número ideal de grades foi escolhido em função das características do mercado e do tamanho do capital.
  2. Teste os parâmetros de cálculo automático da grade de otimização para diferentes períodos de tempo.
  3. Otimizar o cálculo da quantidade de encomendas para obter um rendimento mais estável.
  4. Em combinação com outros indicadores, para avaliar a situação, configure a estratégia de encerramento.

Resumir

Esta estratégia de negociação de grelha dinâmica adapta os parâmetros de intervalos de grelha de forma dinâmica às mudanças do mercado, para obter lucro em discos laterais e discursos. Ao mesmo tempo, a configuração de um controle de posição apropriado pode controlar o risco. A estabilidade da estratégia pode ser aumentada ainda mais pela otimização dos parâmetros da grelha e pela combinação de indicadores de julgamento de tendências.

Código-fonte da estratégia
/*backtest
start: 2023-12-23 00:00:00
end: 2024-01-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("sarasa srinivasa kumar", 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="(Auto) 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="(Auto) 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)