Estratégia de negociação em rede de posições dinâmicas de Martingale longo baseada em grelha

Autora:ChaoZhang, Data: 2024-03-22
Tags:

img

Estratégia geral

Esta estratégia é uma estratégia de negociação de posições dinâmicas Martingale baseada em grelha. A ideia principal é ajustar dinamicamente o tamanho da posição com base no número de posições existentes quando o preço atinge as linhas da grade, enquanto define um número máximo total de posições abertas.

Princípios de estratégia

  1. Dividir o preço em grades uniformemente espaçadas com base no parâmetro Tamanho da Grade.
  2. Coloque ordens de limite longo em cada linha da rede.
  3. Quando o preço atual atinge uma linha de rede:
    • Se o número actual de posições abertas for 0, abrir uma posição com o tamanho start_lot.
    • Se o número atual de posições abertas for superior a 0 e o preço da rede atual for inferior ao preço de entrada anterior, abrir uma nova posição longa ao preço da rede atual com um tamanho multifator vezes o tamanho da posição anterior.
  4. O número máximo de posições abertas é controlado pelo parâmetro Max Open Orders.
  5. Após a abertura de uma posição, definir um nível de take profit em TakeProfit pontos acima do preço médio de entrada.
  6. Quando o preço atual atingir o nível de lucro, feche todas as posições longas e redefina os parâmetros.

Desta forma, o tamanho da posição aumenta gradualmente durante tendências de queda e os lucros são obtidos quando o preço se recupera e atinge o nível de lucro.

Vantagens da estratégia

  1. Dimensão dinâmica das posições: ajusta dinamicamente o tamanho das posições para cada entrada com base no número atual de posições abertas.
  2. Parâmetros flexíveis: o Tamanho da grade, start_lot, multifator e outros parâmetros permitem um controlo flexível do tamanho da grade, do tamanho da posição inicial, do fator de escala da posição, etc.
  3. Risco controlável: o parâmetro Max Open Orders controla o número máximo de posições abertas para evitar a sobreexposição.

Riscos estratégicos

  1. Sem stop loss: a estratégia não tem stop losses.
  2. Sensibilidade aos parâmetros: o desempenho da estratégia é bastante sensível a parâmetros como o "multifator".
  3. Alta volatilidade: A estratégia pode abrir e fechar frequentemente posições em condições de mercado altamente voláteis, potencialmente incorrendo em custos extras de deslizamento e comissões.

Medidas de controlo dos riscos:

  1. Defina cuidadosamente parâmetros como multifator com base na tolerância ao risco.
  2. Testar cuidadosamente e trocar papel para selecionar parâmetros apropriados.
  3. Avaliação do desempenho da estratégia em condições de mercado altamente voláteis.Se necessário, o risco pode ser mitigado ajustando parâmetros ou restringindo cenários de utilização.

Orientações de otimização

  1. Adicionar detecção de tendência: Determine a tendência com base na ação do preço ao abrir posições.
  2. Dinâmica de lucro: ajuste dinâmico do nível de lucro com base na ação dos preços, volatilidade e outros indicadores.
  3. Otimizar a gestão de posições: ao adicionar posições, além de considerar o fator de dimensionamento, também incorporar o saldo da conta, a exposição atual, etc. para controlar com mais precisão o dimensionamento das posições.
  4. Combinar com outros sinais: integrar a negociação em rede com outra detecção de tendências, detecção de oscilações e outros sinais de indicadores para julgar integralmente o mercado e orientar a negociação.

Essas otimizações podem melhorar a adaptabilidade da estratégia para melhor captar os movimentos do mercado, aumentar o potencial de lucro e a robustez. Ao mesmo tempo, uma gestão mais precisa da posição e do risco pode reduzir os drawdowns e melhorar a relação risco/recompensação.

Resumo

Esta estratégia de negociação de posições dinâmicas de Martingale baseada em grelha tenta reduzir o preço médio de detenção durante tendências de queda, adicionando gradualmente posições e obtendo lucros quando os preços aumentam. A estratégia oferece forte flexibilidade através de configurações de parâmetros. No entanto, ela também carrega riscos potenciais significativos que exigem avaliação e controle cuidadosos. Se a detecção de tendências, o lucro dinâmico, a otimização de posição e outros recursos podem ser adicionados, o desempenho da estratégia pode ser ainda melhorado. A estratégia realiza funções para abrir e adicionar posições automaticamente quando os preços atingem as linhas de grelha e fechar automaticamente todas as posições quando os preços atingem o nível de lucro. A lógica geral é relativamente clara, mas há espaço para otimização. A estratégia é adequada para uso cauteloso após uma avaliação completa das condições e parâmetros do mercado.


/*backtest
start: 2023-03-16 00:00:00
end: 2024-03-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © lagerta13
//@version=4
strategy("Grid A.", shorttitle="Grid(A)", overlay=true, format=format.price, precision=4, pyramiding = 100)

input_tf=input("15", "Started TimeFrame", 
 options = ["1", "5", "15", "30", "1H", "4H", "1D", "1W", "1M"],
 group="TimeFrame") 

// avg_tf=input("5", "Average TimeFrame", 
//  options = ["1", "5", "15", "30", "1H", "4H", "1D", "1W", "1M"],
//  group="TimeFrame")

slip_Hilo = input(3.0, "Slippage by open order", group="Strategy Settings")
start_lot = input(0.01, "Start lot", group="Strategy Settings")
start_avg = input(2, "Started average since Order #", group="Strategy Settings")
MaxTrades_Hilo = input(10, "Max Open Orders", group="Strategy Settings")
dropdown_selection = input("Only Long", "Direction", options=["Only Long", "Only Short", "Long & Short"],
 group="Strategy Settings")
type_selection = input("By Close", "Type input", options=["By Close", "By grid line"],
 group="Strategy Settings")

multifactor = input(1.5, "Multifactor", group="Strategy Settings")
precision_lot = input(2, "Number of precision", group="Strategy Settings")
take_profit = input(1, "TakeProfit", group="Strategy Settings")

// PipStep_S1 = input(30)
// PipStepX_S1 = input(1.2)
// dinamicStep = input(false, "Dinamic Step for AVG")

get_size_lot_order(number, multi, prec, avg_from, lot_from) =>
	res = lot_from
	for i = 1 to number
		if i >= avg_from
			res := round(res * multi, precision = prec)
	res

var float[] entry_levels = array.new_float(MaxTrades_Hilo + 1)

for i = 0 to MaxTrades_Hilo
    array.push(entry_levels, 0)

gridSize = input(0.5, title="Grid Size")
gridLevels = int(close / gridSize) * gridSize

var int num_open_orders = 0
var float sum_price_orders = 0
var float entry_lot = 0

buy_condition = num_open_orders < MaxTrades_Hilo and gridLevels[0]<gridLevels[1] and dropdown_selection != "Only Short"

if (buy_condition)

    if num_open_orders == 0
        lot = get_size_lot_order(num_open_orders, multifactor, precision_lot, start_avg, start_lot)
        sum_price_orders := sum_price_orders + gridLevels[1] * lot 

        strategy.entry("buy" + tostring(num_open_orders), true, qty=lot, limit=gridLevels[1]+slip_Hilo) 
        // strategy.order("buy" + tostring(num_open_orders), true, qty=lot, limit=gridLevels[1]) 

        array.set(entry_levels, num_open_orders, gridLevels[1])

        entry_lot := entry_lot + lot
        num_open_orders := num_open_orders + 1

    else
        if gridLevels[1] < (array.get(entry_levels, num_open_orders - 1))
            lot = get_size_lot_order(num_open_orders, multifactor, precision_lot, start_avg, start_lot)
            sum_price_orders := sum_price_orders + gridLevels[1] * lot 
            entry_lot := entry_lot + lot

            strategy.entry("buy" + tostring(num_open_orders), true, qty=lot, limit=gridLevels[1]+slip_Hilo) 

            // +" S:" + tostring(sum_price_orders / (entry_lot)) + " Prev:" + tostring(array.get(entry_levels, num_open_orders - 1))
            // strategy.order("buy" + tostring(num_open_orders), true, qty=lot, limit=gridLevels[1]) 
            array.set(entry_levels, num_open_orders, gridLevels[1])

            num_open_orders := num_open_orders + 1


take = sum_price_orders > 0 and take_profit + (sum_price_orders / entry_lot) < high ? high : na
plotshape(take, location = location.belowbar, color = color.white)


strategy.exit("tp", comment = "TP " + tostring(num_open_orders), qty = entry_lot, limit = take_profit + (sum_price_orders / entry_lot))


if sum_price_orders > 0 and take_profit + (sum_price_orders / entry_lot) <= high
    num_open_orders := 0
    sum_price_orders := 0
    entry_lot := 0
    for i = 0 to MaxTrades_Hilo
        array.set(entry_levels, i, 0)

plot(gridLevels, color=color.blue, style=plot.style_circles, linewidth=2)

 

Mais.