
A estratégia combina o uso do sinal de forca de ouro do MACD, a relação entre o preço de fechamento da linha K e a linha média, e os traços de oscilação de preços para determinar o momento de entrada e saída, além de definir mecanismos de reentrada e correção de entrada, com o objetivo de obter mais oportunidades de negociação e controlar o risco para obter ganhos estáveis.
A estratégia baseia-se principalmente nos seguintes princípios:
A análise do MACD de linhas rápidas e lentas para determinar os mercados de ativos e passivos, bem como os pontos de entrada específicos.
Use a relação entre o preço de fechamento da linha K e a linha média para determinar se a tendência de alta vaga terminou e onde começou.
Estabelecer mecanismos de reentrada para aumentar as oportunidades de lucro após a conclusão da atual rodada do MACD, se a tendência continuar.
Estabelecer um mecanismo de entrada de correção, se o preço tiver uma correção parcial, mas não tiver sido revertido, adicione uma posição, que é um ajuste dentro da tendência.
Combinando os pontos acima, ajuste sua posição dinamicamente para obter o máximo de lucro possível durante a tendência e saia rapidamente quando a tendência terminar.
Concretamente, a estratégia julga primeiro se a linha rápida e a linha lenta do MACD ocorrem em um forco dourado ou em um forco morto, se o forco dourado for mais, se o forco morto for vazio; e então julga se a linha K fechará e tocará a linha média, e se tocará, será julgado como o fim da tendência e será eliminado.
Além disso, a estratégia também estabelece um mecanismo de reentrada, ou seja, após o fim da tendência da direção original, se o MACD continuar a mostrar o mesmo sinal de direção, a estratégia abrirá novamente a posição de acompanhamento da tendência. Ao mesmo tempo, também estabelece um mecanismo de entrada de correção, se o preço tiver um pequeno ajuste, mas ainda não tiver uma reversão completa, a estratégia aumentará a posição apropriadamente, o que é um comportamento normal de reajuste na tendência.
Através dessas configurações, a estratégia pode ajustar dinamicamente a posição na tendência, entrar e sair mais vezes, obtendo maiores ganhos com o risco controlado.
Esta estratégia utiliza vários indicadores, com as seguintes vantagens principais:
O MACD pode identificar tendências e pontos de reversão, determinando pontos de entrada específicos.
A correlação entre o preço de fechamento e a linha média permite determinar com precisão o final da tendência.
O mecanismo de reentrada aumentou o número de aberturas e a eficiência na utilização dos fundos.
A correção do mecanismo de admissão permite que os investidores recuperem o capital em tempo hábil para capturar as tendências.
A frequência de operações estratégicas é alta, mas os riscos são controláveis e os fatores de lucro mais elevados são facilmente obtidos.
Os parâmetros são ajustáveis e podem ser otimizados para diferentes variedades e situações.
A estratégia é clara e fácil de entender, o código é escrito de forma concisa, e o disco rígido é fácil de operar.
Os dados de detecção são abundantes, de alta confiabilidade, e os resultados são fáceis de verificar no disco rígido.
A estratégia também apresenta os seguintes principais riscos:
A probabilidade de que o MACD emita um sinal falso, que precisa ser verificado em combinação com outros indicadores.
A configuração de stop loss de grande escala é pequena demais e pode ser afetada por uma onda de choque de grande escala.
A reentrada e a entrada de correção aumentam a frequência das operações, e é necessário controlar a utilização dos fundos.
A correção de entrada em uma tendência de retorno pode levar a maiores perdas.
A variedade de transação e a configuração dos parâmetros necessitam de otimização e não se aplicam a todas as variedades.
É necessário um feedback e uma otimização contínuos, ajustando os parâmetros de acordo com o mercado.
O impacto do custo de um ponto de deslizamento no disco rígido deve ser considerado.
As medidas de gerenciamento de risco correspondentes incluem: definir um stop loss para garantir que os perdas individuais sejam limitadas; avaliar a utilização dos fundos e manter uma reserva de dinheiro razoável; fazer um retorno com base no conjunto de parâmetros apropriados para a seleção da variedade; manter o foco nas mudanças nas características do mercado para otimizar os parâmetros; considerar o impacto do custo de deslizamento no retorno e na simulação.
A estratégia pode ser melhorada em alguns aspectos:
Combinação de outros indicadores para verificação de sinal, aumentando a precisão do sinal. Como o indicador KDJ.
Configure um padrão de parada de dano dinâmico adaptativo.
Optimizar a lógica de admissão condicional de reentrada e de correção de entrada.
Parâmetros de sub-variedades são otimizados, definindo o melhor conjunto de parâmetros.
Otimizar a taxa de utilização dos fundos, estabelecer restrições de fundos para a reentrada e para a correção da entrada.
Indicadores de capacidade combinada para evitar perdas de retomada de posição em uma situação de recuperação.
Adicionar mecanismos de saída, como a configuração de stop loss móvel, etc.
Considere o encapsulamento da estratégia como um robô de negociação para automatizar a negociação.
Aumentar considerações de disco rígido, como o custo do ponto de deslizamento.
Através dessas otimizações, é possível melhorar ainda mais a estabilidade, a adaptabilidade, o grau de automação e a eficácia da estratégia no mercado.
Esta estratégia integra o uso de sinais de negociação do indicador MACD, análise de preços de fechamento de linha K e mecanismo de entrada múltipla, enquanto controla o risco ao capturar a tendência, é uma estratégia de estratégia de negociação quantitativa de alta eficiência. A estratégia possui vantagens como alta frequência de operação, boa utilização de capital e baixa dificuldade de realização, mas também requer atenção ao controle de risco e otimização da estratégia, com um forte valor prático e espaço para expansão.
/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 00:00:00
period: 2h
basePeriod: 15m
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/
// © Puckapao
//@version=4
// strategy(title="MACD", shorttitle="MACD", overlay=true, initial_capital=10000.00, currency="USD", default_qty_type=strategy.cash, default_qty_value=10000.00)
// Getting inputs
reenter_delay = input(title="Re-enter Delay", type=input.integer, defval=2)
sculp_delay = input(title="Sculp Delay", type=input.integer, defval=4)
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true)
ema_period = input(title="EMA Period", type=input.integer, defval=21)
// Get date
startDate = input(title="Start Date", type=input.integer,
defval=19, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer,
defval=09, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer,
defval=2017, minval=1800, maxval=2100)
endDate = input(title="End Date", type=input.integer,
defval=31, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer,
defval=3, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer,
defval=2021, minval=1800, maxval=2100)
// STEP 2:
// Look if the close time of the current bar
// falls inside the date range
inDateRange = true
reenter_cnt = 0
reenter_cnt := nz(reenter_cnt[1])
sculp_cnt = 0
sculp_cnt := nz(sculp_cnt[1])
close_cnt = 0
close_cnt := nz(close_cnt[1])
on_long = false
on_long := nz(on_long[1])
on_short = false
on_short := nz(on_short[1])
sculp = false
reenter = false
slowdown = false
ema = ema(close, ema_period)
// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00
// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
// plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
// plot(macd, title="MACD", color=col_macd, transp=0)
// plot(signal, title="Signal", color=col_signal, transp=0)
cross_up = crossover(macd, signal)
cross_down = crossunder(macd, signal)
if (inDateRange)
over_macd = macd > 0 and signal > 0 ? true : false
under_macd = macd < 0 and signal < 0 ? true : false
over_water = close > ema ? true : false
under_water = close < ema ? true : false
slowdown := hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] > hist ? false : true)
reenter := hist >= 0 ? (hist[1] < hist ? true : false) : (hist[1] > hist ? true : false)
sculp := (hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] < hist ? true : false))
if(reenter == true)
if(reenter_cnt < reenter_delay)
reenter_cnt := reenter_cnt + 1
else
if(reenter_cnt > 0)
reenter_cnt := reenter_cnt - 1
if(sculp == true)
if(sculp_cnt < sculp_delay)
sculp_cnt := sculp_cnt + 1
else
if(sculp_cnt > 0)
sculp_cnt := sculp_cnt - 1
if(slowdown == false)
if(close_cnt < 2)
close_cnt := close_cnt + 1
else
close_cnt := 0
// plotchar(fork_cnt, "fork count", "")
// plotchar(spoon_cnt, "spoon count", "")
// Entry
if (cross_up == true)
strategy.entry("long", strategy.long, comment = "long", alert_message = "long")
on_long := true
on_short := false
if (cross_down == true)
strategy.entry("short", strategy.short, comment = "short", alert_message = "short")
on_short := true
on_long := false
// Sculp bottom / top
if (sculp == true and sculp_cnt >= sculp_delay)
if (hist >= 0)
strategy.entry("sculp-short", strategy.short, comment = "sculp-short", alert_message = "sculp-short")
else
strategy.entry("sculp-long", strategy.long, comment = "sculp-long", alert_message = "sculp-long")
sculp_cnt := 0
sculp := false
// Re-Entry
if (reenter == true and reenter_cnt >= reenter_delay)
if (hist >= 0)
strategy.entry("re-long", strategy.long, comment = "re-long", alert_message = "re-long")
else
strategy.entry("re-short", strategy.short, comment = "re-short", alert_message = "re-short")
reenter_cnt := 0
reenter := false
// Close
strategy.close("long", when = slowdown, comment = "close long", alert_message = "close long")
strategy.close("short", when = slowdown, comment = "close short", alert_message = "close short")
strategy.close("re-long", when = slowdown, comment = "close re-long", alert_message = "close re-long")
strategy.close("re-short", when = slowdown, comment = "close re-short", alert_message = "close re-short")
strategy.close("sculp-long", when = slowdown, comment = "close sculp-long", alert_message = "close sculp-long")
strategy.close("sculp-short", when = slowdown, comment = "close sculp-short", alert_message = "close sculp-short")
if (slowdown)
if (hist >= 0)
on_long := false
else
on_short := false
plotchar(slowdown, "close", "")
plotchar(reenter, "reenter", "")
plotchar(reenter_cnt, "reenter count", "")
plotchar(sculp, "sculp", "")
plotchar(sculp_cnt, "sculp count", "")