Esta estratégia é modificada a partir do Amazing scalper da SoftKill21
A estratégia usa três EMAs com períodos diferentes: EMA rápida de 25 períodos, EMA padrão de 50 períodos e EMA lenta de 100 períodos. Quando a EMA rápida cruza a EMA padrão e a EMA lenta, gera um sinal de compra. Quando a EMA rápida cruza abaixo da EMA padrão e da EMA lenta, gera um sinal de venda. Para reduzir o atraso, as EMAs são calculadas usando a técnica de suavização exponencial dupla. A estratégia também verifica se os horários de mercado aberto das sessões de Londres ou Nova York correspondem às condições de entrada. Além disso, o tamanho da posição de cada ordem é determinado dinamicamente usando uma porcentagem fixa do capital da conta para controlar o risco.
Especificamente, a estratégia primeiro calcula as três linhas EMA, em seguida, verifica se a EMA rápida forma cruz de ouro ou cruz de morte com a EMA padrão e a EMA lenta. Se a condição também coincide com os horários de mercado aberto de Londres ou Nova York, são gerados sinais de compra ou venda. Ao determinar o tamanho da posição, a estratégia calcula uma porcentagem fixa do patrimônio da conta como exposição ao risco, em seguida, a converte em tamanho do contrato e lotes redondos para ajustar a posição dinamicamente para cada ordem.
A estratégia apresenta as seguintes vantagens:
A EMA tripla pode efetivamente suavizar os dados de preços e identificar a direção da tendência. A EMA rápida é sensível às mudanças de preços, a EMA padrão segue consistentemente e a EMA lenta filtra o ruído. Usados juntos, eles podem filtrar falhas e determinar a direção da tendência.
O uso de suavização exponencial dupla reduz o atraso e torna os sinais mais sensíveis.
A inclusão de grandes sessões de negociação evita sinais enganosos durante as horas de baixa.
A abordagem de gestão do risco ajusta o tamanho da posição com base no capital da conta, evitando perdas excessivas em operações individuais.
A lógica é simples e clara, fácil de compreender e implementar, adequada para iniciantes.
A estratégia pode ser otimizada e ajustada para diferentes pares de moedas e prazos, com ampla aplicabilidade.
A estratégia apresenta também alguns riscos potenciais:
Os EMAs não podem filtrar efetivamente as falhas de curto prazo causadas por eventos repentinos, o que pode gerar sinais errados. Outros indicadores podem ser adicionados para filtrar e analisar.
O dimensionamento das posições por percentagem fixa não pode adaptar-se dinamicamente à volatilidade do mercado, o que leva a posições excessivamente ou insuficientemente grandes.
Apenas duas sessões principais são consideradas, que podem perder oportunidades de negociação em outras sessões.
A falta de um mecanismo de stop loss resulta na incapacidade de controlar efetivamente a perda unilateral.
Os crossovers da EMA têm algum atraso e podem perder o melhor momento de entrada.
O desempenho pode ser afectado pelos custos de transacção, devendo os níveis de stop loss e take profit ser ajustados em conformidade.
A estratégia pode ser otimizada nos seguintes aspectos:
Testar diferentes parâmetros de período EMA para encontrar combinações ideais.
Adicione outros indicadores de filtragem como RSI, Bandas de Bollinger para melhorar a qualidade do sinal.
Introduzir um dimensionamento dinâmico das posições com base na volatilidade e na rentabilidade do mercado.
Adicione movimentos ou tempo de parada para limitar as perdas.
Teste diferentes sessões de negociação para encontrar os momentos ideais.
Otimizar os níveis de take profit e stop loss para equilibrar o tamanho do lucro e a taxa de ganho.
Tente modificar o cálculo da EMA como uma EMA ponderada linear para reduzir o atraso.
Empregar aprendizagem de máquina para encontrar parâmetros ideais.
Modelo de custos de transacção e sistema de ajustamento para obter o lucro líquido máximo.
Através das otimizações acima, a rentabilidade do sistema pode ser melhorada, os drawdowns controlados, a aplicabilidade expandida, para obter uma estratégia de negociação mais poderosa e robusta.
A lógica geral desta estratégia é clara, usando EMAs triplos para identificar tendências, combinando com as principais sessões para execução e adotando o dimensionamento de posições com base na porcentagem de conta. Ele pertence a um sistema típico de tendência seguinte. Há grande espaço para otimização por meio de ajuste de parâmetros, melhorias de mecanismos, introdução de tecnologia, etc., para expandir ainda mais sua aplicabilidade em mais mercados e melhorar a robustez. Como um aprendizado para iniciantes, ele fornece um bom ponto de partida. Com prática e aprimoramentos, ele pode se transformar em uma estratégia quantitativa madura e confiável.
/*backtest start: 2023-09-19 00:00:00 end: 2023-09-26 00:00:00 period: 15m basePeriod: 5m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // original author SoftKill21 //@version=4 //@capam strategy(title="Triple EMA Scalper low lag strat", shorttitle="3EMA scalper", overlay=true) strategy.initial_capital = 50000 len1 = input(25, minval=1, title="Length") len2 = input(50, minval=1, title="Length") len3 = input(100, minval=1, title="Length") src = input(close, title="Source") tmp1 = ema(src, len1) tmp2 = ema(src, len2) tmp3 = ema(src, len3) fastemaOut = 2*tmp1 - ema(tmp1, len1) standardemaOut = 2*tmp2 - ema(tmp2, len2) slowemaOut = 2*tmp3 - ema(tmp3, len3) //fastemaOut = sma(src, len1) //standardemaOut = sma(src, len2) //slowemaOut = sma(src, len3) plot(fastemaOut, color=color.black, title="First EMA") plot(standardemaOut, color=color.yellow, title="Second EMA") plot(slowemaOut, color=color.blue, title="Third EMA") timeinrange(res, sess) => time(res, sess) != 0 londopen = timeinrange(timeframe.period, "0300-1100") nyopen = timeinrange(timeframe.period, "0800-1600") longCondition = crossover(fastemaOut,standardemaOut) and crossover(fastemaOut,slowemaOut) and londopen //or nyopen) shortCondition = crossunder(fastemaOut,standardemaOut) and crossunder(fastemaOut,slowemaOut) and londopen// or nyopen) longCondition2 = crossover(fastemaOut,standardemaOut) and crossover(fastemaOut,slowemaOut) and nyopen shortCondition2 = crossunder(fastemaOut,standardemaOut) and crossunder(fastemaOut,slowemaOut) and nyopen tp = input(50,title="TP") sl = input(100, title="SL") tradeLondon = input(title="Trade london session?", type=input.bool, defval=true) tradeNewyork = input(title="Trade new york session?", type=input.bool, defval=true) //MONEY MANAGEMENT-------------------------------------------------------------- balance = strategy.netprofit + strategy.initial_capital //current balance floating = strategy.openprofit //floating profit/loss risk = input(1,type=input.float,title="Risk % of equity ")/100 //risk % per trade temp01 = balance * risk //Risk in USD temp02 = temp01/sl //Risk in lots temp03 = temp02*100000 //Convert to contracts size = temp03 - temp03%1000 //Normalize to 1000s (Trade size) if(size < 1000) size := 1000 if(tradeLondon==true) strategy.entry("long",1,when=longCondition) strategy.exit("tp/sl","long",profit=tp,loss=sl) strategy.entry("short",0,when=shortCondition) strategy.exit("tp/sl","short",profit=tp,loss=sl) if(tradeNewyork==true) strategy.entry("long",1,when=longCondition2) strategy.exit("tp/sl","long",profit=tp,loss=sl) strategy.entry("short",0,when=shortCondition2) strategy.exit("tp/sl","short",profit=tp,loss=sl) // strategy.risk.max_intraday_filled_orders(2)