Esta estratégia utiliza o indicador EMA para identificar tendências de preços e combina desvio padrão para calcular sinais de compra e venda para tendência após a negociação.
A estratégia primeiro calcula a diferença v entre o preço de fechamento e a EMA do comprimento ema_length. Em seguida, calcula o desvio padrão dev de v em períodos de ema_length. Em seguida, determina o coeficiente de direção k, com k=1 para longo e k=-1 para curto. O limite de dev_limit do sinal de compra é calculado por k * dev * limite do fator. Quando v cruza o dev_limit, um sinal de compra é acionado. O sinal de saída é quando v cruza 0.
A estratégia prevê dois modos:
Comprar curto, ir longo quando v cruza abaixo de dev_limit negativo, para seguir uma tendência de queda.
Compre longo, vá longo quando v cruza acima do limite de dev_positivo, para seguir uma tendência de alta.
Em resumo, a estratégia calcula dinamicamente o desvio padrão da diferença entre o preço e a EMA para definir o limiar e seguir as tendências. O fator controla a sensibilidade dos sinais de compra. ema_length determina o período EMA. O modo de compra controla a direção da ordem.
As vantagens desta estratégia incluem:
A EMA identifica bem a direcção da tendência através da suavização dos preços.
O limiar dinâmico baseado no desvio-padrão adapta-se melhor do que os limiares fixos.
Dois modos de compra permitem seguir uma tendência ascendente ou descendente.
O fator fornece flexibilidade no ajuste da sensibilidade de compra. ema_length permite a otimização do período EMA.
A lógica é simples e fácil de entender e modificar.
O dimensionamento da posição pode ser configurado de forma flexível para seguir uma tendência agressiva.
Os riscos da estratégia:
A EMA tem atraso e pode perder pontos de virada da tendência.
A configuração inadequada leva a sensibilidade insuficiente ou hipersensibilidade.
Seguindo uma tendência, corre-se o risco de grandes perdas quando a tendência se inverte.
Os comutadores long/short frequentes aumentam a frequência de negociação.
Os sinais frequentes em mercados variados aumentam os custos.
Para abordar os riscos, considere a adição de stop loss, otimização de parâmetros, adição de filtros para evitar excesso de negociação, etc.
A estratégia pode ser otimizada por:
Testando diferentes períodos de EMA para encontrar o comprimento ideal.
Teste de diferentes valores de fatores para encontrar a melhor sensibilidade.
Otimizar estratégias de dimensionamento de posição, por exemplo, pirâmide.
Adicionar filtros para evitar trocas erradas em mercados agitados.
Incorporar o stop loss para controlar a perda de uma única transação.
Otimizar os parâmetros separadamente para os dois modos de compra.
Pesquisar sinais de inversão de tendência para parar a tendência.
A estratégia identifica tendências com EMA e gera ordens de limiar dinâmicas para seguir tendências. A lógica é simples e clara. O dimensionamento de posição pode ser agressivo para a busca de tendências. Tem riscos que precisam ser abordados através da otimização de parâmetros e stop loss.
/*backtest start: 2023-10-06 00:00:00 end: 2023-11-05 00:00:00 period: 1h basePeriod: 15m 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/ // © Azzrael // Based on EMA and EMA Oscilator https://www.tradingview.com/script/qM9wm0PW-EMA-Oscilator-Azzrael/ // (EMA - close) + Std Dev + Factor = detecting oversell/overbuy // Long only! // Pyramiding - sometimes, depends on ... // There 2 enter strategies in one script // 1 - Classic, buy on entering to OverSell zone (more profitable ~> 70%) // 2 - Crazy, buy on entering to OverBuy zone (catching trend and pyramiding, more net profit) // Exit - crossing zero of (EMA - close) //@version=5 strategy("STR:EMA Oscilator [Azzrael]", overlay=false, margin_long=100, margin_short=100, currency=currency.USD, default_qty_type=strategy.percent_of_equity, default_qty_value=30, pyramiding=3) entry_name="Buy" ema_length = input.int(200, "Period", minval=2, step=10) limit = input.float(1.7, "Factor", minval=1, step=0.1, maxval=10) dno = input.string(defval="Buy on enter to OverSell", title="Model", options=["Buy on enter to OverSell", "Buy on enter to OverBuy"]) == "Buy on enter to OverSell" v = close - ta.ema(close, ema_length) dev = ta.stdev(v, ema_length) k = dno ? -1 : 1 dev_limit = k*dev*limit cond_long = dno ? ta.crossunder(v, dev_limit) : ta.crossover(v, dev_limit) cond_close = ta.cross(v, 0) // dev visualization sig_col = (dno and v <= dev_limit) or (not dno and v >= dev_limit) ? color.green : color.new(color.blue, 80) plot(dev_limit, color=color.green) plot(k*dev, color=color.new(color.blue, 60)) plot(v, color=sig_col ) hline(0) // Make love not war strategy.entry(entry_name, strategy.long, when=cond_long) strategy.close(entry_name, when=cond_close)