Estratégia de negociação de BTC baseada no crossover da média móvel

Autora:ChaoZhang, Data: 2023-12-07 14:56:50
Tags:

img

Resumo

Esta estratégia baseia-se nos sinais de cruz de ouro e cruz de morte da média móvel de 50 dias e da média móvel de 200 dias do BTC, combinados com indicadores técnicos adicionais para gerar sinais de compra e venda.

Princípio da estratégia

Quando a média móvel de 50 dias cruza acima da média móvel de 200 dias para formar uma cruz de ouro, isso indica que o BTC entrou em um mercado de alta e gera um sinal de compra.

Para além da média móvel básica cruz de ouro e cruz de morte, esta estratégia inclui também alguns indicadores técnicos adicionais para ajudar no julgamento, incluindo:

  1. Indicador EMA: Calcule um indicador EMA com comprimento + desvio, quando ele sobe indica que o mercado atual está em alta, podemos comprar.

  2. Comparar a relação de valor entre a média móvel e a EMA: se o valor da EMA for superior à média móvel de 50 dias, é gerado um sinal de compra.

  3. Verifique se o preço caiu mais de 1% em comparação com o mínimo da linha K anterior, em caso afirmativo, gerar um sinal de venda.

Ao combinar o uso de vários indicadores acima, alguns sinais errados podem ser filtrados e as decisões de negociação da estratégia podem ser mais confiáveis.

Análise das vantagens

Esta estratégia tem as seguintes vantagens:

  1. Usar médias móveis como o principal sinal de negociação pode filtrar o ruído do mercado e identificar a direção da tendência.

  2. A combinação com vários indicadores técnicos auxiliares pode melhorar a fiabilidade do sinal e filtrar os falsos sinais.

  3. A adoção de estratégias de stop-loss adequadas pode controlar eficazmente perdas individuais.

  4. A lógica de negociação relativamente simples é fácil de entender e implementar, adequada para iniciantes na negociação quantitativa.

  5. Há muitos parâmetros configuráveis que podem ser ajustados de acordo com as suas próprias preferências.

Análise de riscos

Esta estratégia tem também alguns riscos a considerar:

  1. A própria média móvel tem um forte atraso, possivelmente perdendo oportunidades para uma rápida inversão de preços.

  2. A adição de indicadores auxiliares aumenta o número de regras e também aumenta a probabilidade de gerar sinais errados.

  3. A definição do valor da posição em risco deve ser definida em conformidade com o artigo 4.o, n.o 1, do Regulamento (UE) n.o 575/2013.

  4. As definições inadequadas de parâmetros (como a duração da média móvel, etc.) também afetarão os resultados da estratégia.

As soluções correspondentes:

  1. Reduzir adequadamente o ciclo da média móvel e aumentar o intervalo de otimização dos parâmetros.

  2. Aumentar a quantidade de dados do backtest para verificar a qualidade do sinal.

  3. Relaxar adequadamente o intervalo de stop loss enquanto se definem as paradas de take profit.

  4. Aumentar a otimização de parâmetros para encontrar as melhores combinações de parâmetros.

Orientações de otimização

Esta estratégia pode também ser otimizada nas seguintes direcções:

  1. Aumentar os algoritmos de aprendizagem de máquina para obter otimização automática de parâmetros.

  2. Adicionar mais indicadores auxiliares para construir múltiplas sub-estratégias e tomar decisões através de um mecanismo de votação.

  3. Tente estratégias de fuga para identificar avanços de preço.

  4. Use aprendizagem profunda para prever tendências de preços.

  5. Otimizar os mecanismos de stop-loss para alcançar o stop-loss de rastreamento dinâmico.

As otimizações acima podem melhorar a precisão das decisões e aumentar a rentabilidade e a estabilidade da estratégia.

Resumo

Esta estratégia faz principalmente decisões de negociação com base no cruzamento da média móvel do BTC, assistida por indicadores técnicos como a EMA para filtrar sinais. A estratégia tem forte capacidade de seguir tendências e alta configurabilidade, tornando-a adequada como uma estratégia de negociação quantitativa para iniciantes.


/*backtest
start: 2023-11-06 00:00:00
end: 2023-12-06 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('JayJay BTC Signal', overlay=true, initial_capital=100, currency='USD', default_qty_value=100, default_qty_type=strategy.percent_of_equity, commission_value=0, calc_on_every_tick=true)

securityNoRepaint(sym, tf, src) => request.security(sym, tf, src[barstate.isrealtime ? 1 : 0])[barstate.isrealtime ? 0 : 1]

//200 50 Moving Average
ma50Len = input.int(50, minval=1, title='MA50-Length')
ma50Src = input(close, title='MA50-Source')
ma50Show = input(true, title='Show SMA50 on chart')
ma50Close = ta.sma(ma50Src, ma50Len)
ma50CloseTimeframe = input.timeframe("240", "Ma50 Timeframe", group = "EMA Options")
ma50Open = ta.sma(open, ma50Len)
ma200Len = input.int(200, minval=1, title='MA200-Length')
ma200Src = input(close, title='MA200-Source')
ma200Show = input(true, title='Show SMA200 on chart')
ma200CloseTimeframe = input.timeframe("D", "Ma200 Timeframe", group = "EMA Options")
ma200Close = ta.sma(ma200Src, ma200Len)
ma200Open = ta.sma(open, ma200Len)
//plot(ma200Close, color=color.new(#0b6ce5, 0), title='MA200')
//plot(ma50Close, color=color.new(#00d8ff, 0), title='MA50')

sma50 = securityNoRepaint(syminfo.tickerid, ma50CloseTimeframe, ma50Close)
plot(sma50 and ma50Show ? sma50 : na, color=color.new(#00d8ff, 0), title='SMA50')
sma200 = securityNoRepaint(syminfo.tickerid, ma200CloseTimeframe, ma200Close)
plot(sma200 and ma200Show ? sma200 : na, color=color.new(#00d8ff, 0), title='SMA200')

// Short/Long EMA
// Define the offset value
EMAOffsetValue = input.int(2, title='EMA Offset', minval=0)
emaplot = input(true, title='Show EMA on chart')
len = input.int(20, minval=1, title='ema Length') + EMAOffsetValue
emaCloseTimeframe = input.timeframe("240", "EMA 1 Timeframe", group = "EMA Options")
emaOpen = ta.ema(open, len)
emaClose = ta.ema(close, len)

ema = securityNoRepaint(syminfo.tickerid, emaCloseTimeframe, emaClose)

up = emaClose > ema[1]
down = emaClose < ema[1]
mycolor = up ? color.green : down ? color.red : color.blue

plot(ema and emaplot ? ema : na, title='Signal EMA', color=mycolor, linewidth=3)
//plot(emaClose and emaplot ? emaClose : na, title='Signal 20 EMA', color=color.yellow, linewidth=3)

ma50GreaterThanMa200 = sma50 > sma200

last3BarUp = ema > ema[1]

startLong = up and ema > sma50 and ma50GreaterThanMa200 and (100 - (sma50 / ema * 100) > 1.0)

startFrom = input(timestamp("20 Jan 2000 00:00"), "StartFrom")

yearFilter = true

alertLongPositionMessage = "{\"direction:\": \"long\", \"action\": \"{{strategy.order.action}}\", \"price\": \"{{strategy.order.price}}\", \"qty\": \"{{strategy.position_size}}\", \"symbol\": \"{{ticker}}\", \"date\": \"{{time}}\"}"

if true and startLong and yearFilter
    strategy.entry('Long', strategy.long, comment = "Long", alert_message = alertLongPositionMessage)

longStopLossLevel = open * 0.05
strategy.exit('StopLoss', from_entry='Long',comment = "StopLoss!", loss=longStopLossLevel, profit=close * 0.3, alert_message = alertLongPositionMessage)
longPercentageChange = low / close[1] * 100 - 100
is1PercentLower = longPercentageChange < -0.1
closeLongPositionWhen = (down and is1PercentLower) or (emaClose < sma50)
if closeLongPositionWhen
    strategy.close('Long', comment = "Fuck It!", alert_message =  alertLongPositionMessage)

bgcolor(startLong ? color.green : na, transp=90)



Mais.