Esta estratégia é baseada nos sinais de compra e venda do BTC, em combinação com o julgamento de indicadores técnicos adicionais, com base nas médias móveis de 50 dias e 200 dias do BTC. A estratégia é aplicada principalmente ao par BTC/USDT, que apresenta características de tendência visíveis.
Quando a média móvel de 50 dias acima da média móvel de 200 dias é rompida e uma forquilha de ouro é formada, o BTC entra em um mercado multi-cabeça, gerando um sinal de compra. Quando a média móvel de 50 dias é rompida para baixo da média móvel de 200 dias e uma forquilha de morte parada é formada, o BTC entra em um mercado vazio, gerando um sinal de venda.
A estratégia, além dos critérios básicos de arbitragem de forquilhas e sinais de forquilhas, adiciona alguns indicadores técnicos adicionais para auxiliar o julgamento, que incluem:
EMA: calcula um EMA de comprimento + offset, que pode ser comprado quando o seu aumento indica que está atualmente em um mercado de ativos.
Comparar a relação entre a média móvel e a EMA: se o valor da EMA for superior à média móvel de 50 dias, um julgamento de compra é gerado.
Verifique se o preço caiu mais de 1% em relação ao ponto mais baixo da linha K anterior e, se satisfeito, faça um sinal de venda.
A combinação dos indicadores acima pode filtrar alguns sinais errôneos e tornar as decisões estratégicas de negociação mais confiáveis.
A estratégia tem as seguintes vantagens:
Usando a média móvel como principal sinal de negociação, pode filtrar o ruído do mercado e identificar a direção da tendência.
A combinação de vários indicadores de tecnologia auxiliar, como o EMA, pode aumentar a confiabilidade do sinal e filtrar os falsos sinais.
A aplicação de estratégias de parada de perdas adequadas permite controlar eficazmente as perdas individuais.
Uma lógica de negociação simples, fácil de entender e apropriada para iniciantes em negociação quantitativa.
Há mais parâmetros configuráveis, que podem ser ajustados de acordo com suas preferências.
A estratégia também apresenta alguns riscos que devem ser lembrados:
A própria média móvel é muito atrasada e pode perder a oportunidade de uma rápida reversão.
Os indicadores auxiliares aumentam o número de regras e também a probabilidade de produzir sinais errados.
A configuração inadequada de stop loss pode causar uma expansão de perdas.
Configurações de parâmetros (como o comprimento de uma média móvel) podem afetar a eficácia da estratégia.
Resolução:
Reduzir adequadamente os ciclos de média móvel e aumentar o alcance de otimização dos parâmetros.
Aumentar a quantidade de dados e verificar a qualidade do sinal.
A largura de suspensão de perdas deve ser adequadamente amenizada, e um limite de lucro deve ser estabelecido.
Aumentar a otimização de parâmetros para encontrar a melhor combinação de parâmetros.
A estratégia pode ser melhorada em várias direções:
Adição de algoritmos de aprendizagem de máquina para otimização automática de parâmetros.
Adicionando mais indicadores auxiliares, construindo várias sub-estratégias e tomando decisões por meio de mecanismos de votação.
Tente a estratégia de breakout para identificar breakouts.
Aproveite a aprendizagem profunda para prever tendências de preços.
Otimizar o mecanismo de stop loss e implementar o stop loss de rastreamento dinâmico.
A otimização acima pode aumentar a precisão das decisões e aumentar a lucratividade e a estabilidade das estratégias.
Esta estratégia baseia-se principalmente na crossing da média móvel do BTC para tomar decisões de negociação, auxiliada por indicadores técnicos como EMA para filtrar os sinais. A estratégia possui uma forte capacidade de acompanhamento de tendências, é altamente configurável e é adequada como estratégia de entrada para negociação quantitativa.
/*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)