
A estratégia de negociação de grelha dinâmica define a grelha de negociação de forma dinâmica, calculando a média móvel e suas ondas. Quando o preço quebra a grelha, o sinal de negociação é emitido de acordo com a linha de grelha definida em intervalos fixos, obtendo lucro.
A estratégia primeiro calcula a média móvel de um período definido de n, e a média móvel de um período definido de n. A média móvel de um período definido de n é a média móvel de um período definido de n.(1 + o parâmetro de entrada std), a linha inferior é a média móvel(1 - o parâmetro de entrada std) 。 Assim, pode ser construído um intervalo de transação de ajuste dinâmico 。
Em seguida, dentro da faixa de intervalos, definimos uma linha de grade com m barras de intervalo. Quando o preço sobe e quebra uma linha de grade, emite um sinal múltipla nessa linha de grade; Quando o preço desce e quebra uma linha de grade, emite um sinal de equilíbrio na linha de grade superior correspondente a essa linha de grade.
Especificamente, nós usamos um array de bool tipo order_array para registrar o estado de transação de cada linha de grade. Quando uma linha de grade é acionada como condicional, o estado correspondente da ordem_array é definido como verdadeiro, indicando que a linha de grade já está posicionada. Quando o preço cai e quebra a linha de grade, o estado correspondente da linha de grade superior da ordem_array é definido como falso, emitindo um sinal de equilíbrio.
A estratégia tem as seguintes vantagens:
O uso de médias móveis para construir intervalos de negociação de ajuste dinâmico permite ajustar o alcance dos intervalos de acordo com a volatilidade do mercado, tornando a estratégia mais adaptada ao mercado.
O design da grelha permite que os prejuízos de suspensão sejam automáticos, evitando a expansão dos prejuízos causados por situações extremas.
O número de grades e a distribuição de fundos são distribuídos em intervalos e quantidades iguais, o que permite controlar o tamanho da posição individual e reduzir o risco da posição individual.
A configuração de sinais de posicionamento mais pacífico é razoável, pode ser negociada em curso, com parada e perda em tempo hábil.
A estratégia também apresenta alguns riscos:
Quando o mercado apresenta uma fraqueza prolongada e não consegue romper a linha da grelha, a estratégia entra em negociações de choque sem direção, e a troca excessiva de espaço pode causar a perda de fundos da conta.
O número de parâmetros std e de grades escolhidos pode não ser totalmente razoável e precisa ser determinado com base na análise de diferentes variedades de transação. Se os parâmetros forem configurados incorretamente, isso resultará em um intervalo de negociação e uma grade muito grande ou muito pequena, afetando a eficácia da estratégia.
A estratégia não leva em conta alguns cenários extremos, como salto de preço, aumento ou queda explosiva de linhas curtas. Essas situações podem levar a estratégia a romper várias grades, resultando em perdas além do controle do risco.
A estratégia também pode ser melhorada nos seguintes aspectos:
Algoritmos de aprendizagem de máquina podem ser introduzidos para treinar modelos que prevejam os altos e baixos das médias móveis, tornando os intervalos de negociação mais inteligentes e dinâmicos.
Os parâmetros de otimização podem ser baseados em características de diferentes indicadores de negociação, como número de grades, proporção de distribuição de capital, tamanho de posição, etc. Os parâmetros de adaptação podem ser usados.
Pode ser configurado um plano condicional, um plano de parada de reserva em uma linha de grade de certa distância, que pode desempenhar a função de parada antecipada, controlar os prejuízos em situações extremas.
O desenvolvimento de mecanismos de tratamento de excepções para situações extremas, como aumentar a posição de abertura inicial, saltar a parada direta da grelha intermediária, etc., pode responder a situações excepcionais, como o salto do preço.
A estratégia de negociação de grelha dinâmica é racional em termos de design e pode ser usada para construir um sistema automático de stop-loss para os tipos de negociação em que as flutuações de preços são mais frequentes. No entanto, a estratégia também possui um certo risco de mercado que requer otimizar os parâmetros e as anomalias para tornar a estratégia mais robusta.
/*backtest
start: 2023-10-31 00:00:00
end: 2023-11-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy('Grid Trading Strategy', overlay=true)
// Input
ma_length = input.int(300, 'Moving Average Length',group = 'Moving Average Conditions', step = 10)
std = input.float(0.03, title='Upper and Lower Grid Deviation', group='Grid Conditions', step = 0.01)
grid = input.int(15, maxval=15, title='Grid Line Quantity', group='Grid Conditions')
// Moving Average
ma = ta.sma(close, ma_length)
upper_bound = ma * (1 + std)
lower_bound = ma * (1 - std)
grid_width = (upper_bound - lower_bound) / (grid - 1)
grid_array = array.new_float(0)
for i = 0 to grid - 1 by 1
array.push(grid_array, lower_bound + grid_width * i)
var order_array = array.new_bool(grid, false)
strategy.initial_capital = 10000
// Entry Conditions
for i = 0 to grid - 1 by 1
if close < array.get(grid_array, i) and not array.get(order_array, i)
buy_id = i
array.set(order_array, buy_id, true)
strategy.entry(id=str.tostring(buy_id), direction=strategy.long, comment='#Long ' + str.tostring(buy_id))
if close > array.get(grid_array, i) and i!=0
if array.get(order_array, i-1)
sell_id = i - 1
array.set(order_array, sell_id, false)
strategy.close(id=str.tostring(sell_id), comment='#Close ' + str.tostring(sell_id))
plot(grid > 0 ? array.get(grid_array,0) : na, color = color.yellow, transp = 10)
plot(grid > 1 ? array.get(grid_array,1) : na, color = color.yellow, transp = 10)
plot(grid > 2 ? array.get(grid_array,2) : na, color = color.yellow, transp = 10)
plot(grid > 3 ? array.get(grid_array,3) : na, color = color.yellow, transp = 10)
plot(grid > 4 ? array.get(grid_array,4) : na, color = color.yellow, transp = 10)
plot(grid > 5 ? array.get(grid_array,5) : na, color = color.yellow, transp = 10)
plot(grid > 6 ? array.get(grid_array,6) : na, color = color.yellow, transp = 10)
plot(grid > 7 ? array.get(grid_array,7) : na, color = color.yellow, transp = 10)
plot(grid > 8 ? array.get(grid_array,8) : na, color = color.yellow, transp = 10)
plot(grid > 9 ? array.get(grid_array,9) : na, color = color.yellow, transp = 10)
plot(grid > 10 ? array.get(grid_array,10) : na, color = color.yellow, transp = 10)
plot(grid > 11 ? array.get(grid_array,11) : na, color = color.yellow, transp = 10)
plot(grid > 12 ? array.get(grid_array,12) : na, color = color.yellow, transp = 10)
plot(grid > 13 ? array.get(grid_array,13) : na, color = color.yellow, transp = 10)
plot(grid > 14 ? array.get(grid_array,14) : na, color = color.yellow, transp = 10)