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.
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
Indicador EMA: Calcule um indicador EMA com comprimento + desvio, quando ele sobe indica que o mercado atual está em alta, podemos comprar.
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.
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.
Esta estratégia tem as seguintes vantagens:
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.
A combinação com vários indicadores técnicos auxiliares pode melhorar a fiabilidade do sinal e filtrar os falsos sinais.
A adoção de estratégias de stop-loss adequadas pode controlar eficazmente perdas individuais.
A lógica de negociação relativamente simples é fácil de entender e implementar, adequada para iniciantes na negociação quantitativa.
Há muitos parâmetros configuráveis que podem ser ajustados de acordo com as suas próprias preferências.
Esta estratégia tem também alguns riscos a considerar:
A própria média móvel tem um forte atraso, possivelmente perdendo oportunidades para uma rápida inversão de preços.
A adição de indicadores auxiliares aumenta o número de regras e também aumenta a probabilidade de gerar sinais errados.
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.
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:
Reduzir adequadamente o ciclo da média móvel e aumentar o intervalo de otimização dos parâmetros.
Aumentar a quantidade de dados do backtest para verificar a qualidade do sinal.
Relaxar adequadamente o intervalo de stop loss enquanto se definem as paradas de take profit.
Aumentar a otimização de parâmetros para encontrar as melhores combinações de parâmetros.
Esta estratégia pode também ser otimizada nas seguintes direcções:
Aumentar os algoritmos de aprendizagem de máquina para obter otimização automática de parâmetros.
Adicionar mais indicadores auxiliares para construir múltiplas sub-estratégias e tomar decisões através de um mecanismo de votação.
Tente estratégias de fuga para identificar avanços de preço.
Use aprendizagem profunda para prever tendências de preços.
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.
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)