A estratégia de cruzamento de equilíbrio é uma estratégia de negociação comum baseada em equilíbrio móvel. A estratégia usa um cruzamento de equilíbrio móvel rápido e equilíbrio móvel lento como sinais de compra e venda. Quando o equilíbrio rápido atravessa o equilíbrio lento de baixo, é considerado um sinal de compra; quando o equilíbrio rápido atravessa o equilíbrio lento de cima para baixo, é considerado um sinal de venda.
A lógica central da estratégia baseia-se na teoria da linha média. A linha média móvel é capaz de suavizar efetivamente as flutuações de preços, refletindo a tendência dos preços. A linha média rápida é mais sensível às mudanças de preço e consegue capturar os pontos de inflexão da tendência.
Especificamente, a estratégia define primeiro a linha média de 50 dias e a linha média de 200 dias. Em seguida, define uma entrada de entrada múltipla para uma média lenta acima da média rápida e uma entrada de cabeça vazia para uma média lenta abaixo da média rápida. Para evitar a sobreposição de transações, a estratégia usa os ícones isEntry e isExit para controlar. Quando as condições de entrada são satisfeitas, a isEntry é definida como verdadeira e a isExit é definida como verdadeira.
Além disso, a estratégia também configura um ponto de parada de parada. O usuário pode definir a distância de parada de parada inserindo o percentual. O preço de parada e parada é calculado de acordo com a variação percentual do preço de entrada.
A estratégia tem as seguintes vantagens:
A operação é simples e fácil de implementar. A operação é executada apenas com um cruzamento linear, o que é ideal para iniciantes sem experiência de negociação.
A retracção é controlada e possui um mecanismo de gerenciamento de risco. A linha média móvel pode filtrar efetivamente os movimentos de preços de curto prazo e evitar a arbitragem.
Parâmetros personalizáveis e adaptáveis. O usuário pode configurar os parâmetros de linha média e o padrão de stop-loss para otimizar a estratégia.
A estratégia traça diretamente no gráfico as linhas-médias-chave, os pontos de entrada e os pontos de parada.
A estrutura da estratégia está completa, e só é necessário modificar os sinais de negociação-chave, adicionar indicadores, e assim por diante.
A estratégia também apresenta alguns riscos:
Os surtos de mercado causam grandes prejuízos e não podem ser evitados. A linha média rápida é mais sensível às mudanças de preços e não pode responder de forma eficaz aos surtos.
O que é que se passa com os bancos? O que se passa com os bancos?
Os custos de transação não são considerados. As comissões e perdas de deslizamento nas transações reais afetam gravemente os lucros.
Risco de adequação dos dados de retrospectiva. As situações reais são complexas e variáveis, e os resultados de retrospectiva não representam o desempenho real.
Resolução:
Pode-se definir padrões de perda mais flexíveis, ou pode-se adicionar um limite de perda adicional.
Pode-se ampliar a distância da linha média, reduzir a frequência de negociação, ou substituir o sinal de filtragem por outros indicadores.
Deverá ser estabelecido um espaço de paragem mais amplo, tendo em conta os custos reais da transação.
As mudanças no ambiente de mercado devem ser levadas em consideração, os parâmetros devem ser otimizados e a adequação deve ser reduzida.
A estratégia pode ser melhorada em vários aspectos:
Teste diferentes combinações de parâmetros para encontrar o melhor. Pode testar o número de dias de média lenta, combinações de parâmetros, etc.
Filtração de outros indicadores para evitar erros de negociação em situações de turbulência. Indicadores como MACD, KD e outros.
Optimizar a estratégia de stop loss para obter uma gestão de risco mais eficiente. Por exemplo, rastrear o stop loss, pendurar o stop loss, etc.
Aumentar o tamanho das posições, aproveitar a alavancagem para aumentar a margem de lucro, mas controlar o risco.
Considerando os custos de negociação em disco rígido, os parâmetros de retrocesso são ajustados e otimizados para que os parâmetros de estratégia sejam mais adequados para a batalha real.
A combinação de métodos estatísticos para avaliar a estabilidade dos parâmetros reduz o risco de correspondência de dados e aumenta a estabilidade.
Resumindo, a estratégia de equilíbrio entre linhas é clara, simples e apropriada para a quantificação das estratégias de entrada. No entanto, a estratégia também possui alguns riscos e deficiências, que requerem uma otimização minuciosa dos parâmetros e filtros, e atenção ao controle do risco de negociação em disco rígido para obter ganhos estáveis.
/*backtest
start: 2023-10-02 00:00:00
end: 2023-10-09 00:00:00
period: 3m
basePeriod: 1m
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/
// © gjfsdrtytru
//@version=4
strategy("Backtest Engine", "Backtest", overlay=true, commission_type=strategy.commission.percent, commission_value=0.07, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)
// Start code here...
fastMA = sma(close,50)
slowMA = sma(close,200)
plot(fastMA, "Fast MA", color.blue)
plot(slowMA, "Slow MA", color.red)
// Long Enrty/Exit
longCondition = crossover(fastMA,slowMA)
closeLong = crossover(slowMA,fastMA)
// Short Enrty/Exit
shortCondition = crossover(slowMA,fastMA)
closeShort = crossover(fastMA,slowMA)
// Bot web-link alert - {{strategy.order.comment}}
botLONG = "ENTRY LONG ALERT"
botCLOSELONG = "CLOSE LONG ALERT"
botSHORT = "ENTRY SHORT ALERT"
botCLOSESHORT = "CLOSE SHORT ALERT"
//////////////////////////////////////////////////////////////////
//////////////////////// BACKTEST ENGINE \\\\\\\\\\\\\\\\\\\\\\\\\
/////////////////// [NO USER INPUT REQUIRED] /////////////////////
//////////////////////////////////////////////////////////////////
// Time period
testStartYear = input(2020, "Backtest Start Year")
testStartMonth = input(5, "Backtest Start Month")
testStartDay = input(11, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
periodLength = input(3650, "Backtest Period (days)", minval=0,tooltip="Days until strategy ends") * 86400000 // convert days into UNIX time
testPeriodStop = testPeriodStart + periodLength
testPeriod() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
// Convert Take profit and Stop loss to percentage
longTP = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
longSL = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
shortTP = input(title="Short Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
shortSL = input(title="Short Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
// 0% TP/SL = OFF (a value of 0 turns off TP/SL feature)
longProfitPerc = longTP == 0 ? 1000 : longTP
longStopPerc = longSL == 0 ? 1 : longSL
shortProfitPerc = shortTP == 0 ? 1 : shortTP
shortStopPerc = shortSL == 0 ? 1000 : shortSL
// Determine TP/SL price based on percentage given
longProfitPrice = strategy.position_avg_price * (1 + longProfitPerc)
longStopPrice = strategy.position_avg_price * (1 - longStopPerc)
shortProfitPrice = strategy.position_avg_price * (1 - shortProfitPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortStopPerc)
// Anti-overlap
isEntry_Long = false
isEntry_Long := nz(isEntry_Long[1], false)
isExit_Long = false
isExit_Long := nz(isExit_Long[1], false)
isEntry_Short = false
isEntry_Short := nz(isEntry_Short[1], false)
isExit_Short = false
isExit_Short := nz(isExit_Short[1], false)
entryLong = not isEntry_Long and longCondition
exitLong = not isExit_Long and closeLong
entryShort = not isEntry_Short and shortCondition
exitShort = not isExit_Short and closeShort
if (entryLong)
isEntry_Long := true
isExit_Long := false
if (exitLong)
isEntry_Long := false
isExit_Long := true
if (entryShort)
isEntry_Short := true
isExit_Short := false
if (exitShort)
isEntry_Short := false
isExit_Short := true
// Order Execution
if testPeriod()
if entryLong
strategy.entry(id="Long", long=true, when = entryLong, comment=botLONG) // {{strategy.order.comment}}
if entryShort
strategy.entry(id="Short", long=false, when = entryShort, comment=botSHORT) // {{strategy.order.comment}}
// TP/SL Execution
if (strategy.position_size > 0)
strategy.exit(id="Long SL/TP", from_entry="Long", limit=longProfitPrice, stop=longStopPrice)
strategy.close(id="Long", when=exitLong, comment=botCLOSELONG) // {{strategy.order.comment}}
if (strategy.position_size < 0)
strategy.exit(id="Short TP/SL", from_entry="Short", limit=shortProfitPrice, stop=shortStopPrice)
strategy.close(id="Short", when=exitShort, comment=botCLOSESHORT) // {{strategy.order.comment}}
// Draw Entry, TP and SL Levels for Long Positions
plot(strategy.position_size > 0 ? longTP == 0 ? na : longProfitPrice : na, style=plot.style_linebr, color=color.green, title="Long TP")
plot(strategy.position_size > 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.blue, title="Long Entry")
plot(strategy.position_size > 0 ? longSL == 0 ? na : longStopPrice : na, style=plot.style_linebr, color=color.red, title="Long SL")
// Draw Entry, TP and SL Levels for Short Positions
plot(strategy.position_size < 0 ? shortTP == 0 ? na : shortProfitPrice : na, style=plot.style_linebr, color=color.green, title="Short TP")
plot(strategy.position_size < 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.blue, title="Short Entry")
plot(strategy.position_size < 0 ? shortSL == 0 ? na : shortStopPrice : na, style=plot.style_linebr, color=color.red, title="Short SL")