Estratégia de equilíbrio cruzado


Data de criação: 2023-10-10 10:44:25 última modificação: 2023-10-10 10:44:25
cópia: 0 Cliques: 751
1
focar em
1617
Seguidores

Visão geral

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.

Princípio da estratégia

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.

Análise de vantagens

A estratégia tem as seguintes vantagens:

  1. 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.

  2. 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.

  3. 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.

  4. A estratégia traça diretamente no gráfico as linhas-médias-chave, os pontos de entrada e os pontos de parada.

  5. A estrutura da estratégia está completa, e só é necessário modificar os sinais de negociação-chave, adicionar indicadores, e assim por diante.

Análise de Riscos

A estratégia também apresenta alguns riscos:

  1. 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.

  2. O que é que se passa com os bancos? O que se passa com os bancos?

  3. 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.

  4. 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:

  1. Pode-se definir padrões de perda mais flexíveis, ou pode-se adicionar um limite de perda adicional.

  2. 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.

  3. Deverá ser estabelecido um espaço de paragem mais amplo, tendo em conta os custos reais da transação.

  4. 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.

Direção de otimização

A estratégia pode ser melhorada em vários aspectos:

  1. 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.

  2. Filtração de outros indicadores para evitar erros de negociação em situações de turbulência. Indicadores como MACD, KD e outros.

  3. 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.

  4. Aumentar o tamanho das posições, aproveitar a alavancagem para aumentar a margem de lucro, mas controlar o risco.

  5. 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.

  6. 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.

Resumir

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.

Código-fonte da estratégia
/*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")