Tripla EMA com estratégia de stop loss

Autora:ChaoZhang, Data: 2023-10-17 15:05:41
Tags:

img

Resumo

Esta estratégia implementa um típico sistema de negociação de média móvel exponencial tripla (EMA). Ele gera sinais de negociação comparando a EMA rápida de 5 dias, a EMA média de 20 dias e a EMA lenta de 50 dias.

Princípios

Quando a EMA de 5 dias cruza acima da EMA de 20 dias, e todas as três EMAs estão alinhadas para alta (5-day EMA > EMA de 20 dias > EMA de 50 dias), e o fechamento da barra atual está acima das barras anteriores fechadas por certos ticks, vá longo.

Após a entrada, quando o preço passa por certos tiques, um stop loss será iniciado para continuar ajustando o stop loss com base na flutuação do preço, a fim de obter lucros maiores.

Vantagens

  1. O uso de EMAs triplos para gerar sinais pode efetivamente filtrar o ruído do mercado e identificar tendências.

  2. A comparação dos fechamentos de barras actuais com os fechamentos de barras anteriores filtra ainda mais os sinais falsos e reduz as transacções desnecessárias.

  3. O trailing stop loss ajusta dinamicamente o stop loss com base na ação do preço para maximizar o bloqueio do lucro.

  4. A configuração flexível de parâmetros desta estratégia permite a otimização em diferentes produtos e prazos, de barras diárias a minutos.

Riscos

  1. Os crossovers frequentes da EMA podem gerar operações excessivas em mercados variados, aumentando os custos das comissões e do deslizamento.

  2. O trailing stop loss pode sair prematuramente da tendência durante grandes flutuações.

  3. O atraso da EMA pode causar a ausência de importantes pontos de virada e perdas.

  4. Parâmetros como períodos de EMA, tiques de parada de trailers exigem otimização para diferentes produtos e prazos.

Orientações para a melhoria

  1. Incorporar outros indicadores como MACD, KD para filtrar sinais de negociação.

  2. Teste e otimize parâmetros para produtos específicos e prazos para encontrar as melhores combinações.

  3. Ajustar os parâmetros de forma dinâmica através da supervisão humana ou da aprendizagem automática.

  4. Considere desativar o trailing stop e manter a posição completa para condições específicas de mercado.

  5. Substitua o simples stop loss de trailing por mecanismos mais avançados de captação automática de lucros.

Conclusão

Esta estratégia integra três técnicas comuns de análise técnica - EMA crossover, price breakout e trailing stop loss em um sistema de negociação de tendência bastante abrangente e robusto. Através da otimização de parâmetros, ele pode ser adaptado a diferentes produtos e prazos e tem um bom desempenho em mercados de forte tendência. Mas também tem algumas fraquezas típicas das estratégias de análise técnica que precisam de otimização adicional para lidar com mais situações de mercado.


/*backtest
start: 2023-10-01 00:00:00
end: 2023-10-02 12:00:00
period: 1m
basePeriod: 1m
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/
// © Matt Dearden - IndoPilot
// @version=4

/////////////////////////////////////////////////////// Initial Parameters /////////////////////////////////////////////////////// 
SystemName = "Triple EMA Strategy"
ShortSystemName = "TEMA"
InitPosition = 0
InitCapital = 50000
InitCommission = 0.004 //approx value to compensate for Oanda spreads
InitPyramidMax = 0
CalcOnorderFills = true

strategy(title=SystemName, shorttitle=ShortSystemName, overlay=true, pyramiding=InitPyramidMax, 
 default_qty_type=strategy.cash, default_qty_value=InitPosition, commission_type=strategy.commission.percent, 
 commission_value=InitCommission, initial_capital=InitCapital, max_lines_count=500, 
 max_labels_count=500, process_orders_on_close=false, calc_on_every_tick=false) 

///////////////////////////////////////////////////////////// Inputs /////////////////////////////////////////////////////////////

DateFilter = input(false, "═════ Data Filtering ═════") 
InitYear = input(title="Year", type=input.integer, defval=2021, minval=2000, maxval=2021)
InitMonth = input(title="Month (0=ALL)", type=input.integer, defval=0, minval=0, maxval=12)
InitStopLoss = input(title="Stop Loss (ticks)", type=input.integer, defval=100, minval=0, maxval=1000) 
TrailingStopLoss = input(title="Trailing S/L (ticks)", type=input.integer, defval=130, minval=0, maxval=1000) 
InitBuffer = input(title="Buffer (ticks)", type=input.integer, defval=15, minval=0, maxval=1000) 
InitEMA1 = input(title="EMA 1", type=input.integer, defval=5, minval=0, maxval=1000) 
InitEMA2 = input(title="EMA 2", type=input.integer, defval=20, minval=0, maxval=1000) 
InitEMA3 = input(title="EMA 3", type=input.integer, defval=50, minval=0, maxval=1000) 

//////////////////////////////////////////////////////////// Variables ///////////////////////////////////////////////////////////

var StopLoss = float(0.0)
var StartPrice = float(0.0)
//setup multipliers and catch JPY difference
Multiplier = syminfo.currency == "JPY" ? 10 : 1000
//get the daily exchange rate from yesterday
//X_rate = security(AccountCurrency+syminfo.currency, "D", close[1]) 
OrderQty = 1  
Buffer = InitBuffer / (Multiplier * 100)

/////////////////////////////////////////////////////// Triple EMA Strategy //////////////////////////////////////////////////////

EMA1 = ema(close, InitEMA1)
EMA2= ema(close, InitEMA2)
EMA3 = ema(close, InitEMA3)

//entry conditions
longCondition = crossover(EMA1, EMA2) and close > EMA3 and EMA1 > EMA3 and EMA2 > EMA3 and close > (close[1] + Buffer) 
shortCondition = crossunder(EMA1, EMA2) and close < EMA3 and EMA1 < EMA3 and EMA2 < EMA3 and close < (close[1] - Buffer) 

/////////////////////////////////////////////////////// Trailing Stoploss ////////////////////////////////////////////////////////

if (strategy.position_size > 0 and (close > (StartPrice + (TrailingStopLoss / (100 * Multiplier)))))  
    StopLoss := max(StopLoss, close - (TrailingStopLoss / (100 * Multiplier))) 
    strategy.exit("Long Stoploss", "Long") 
    
if (strategy.position_size < 0 and (close < (StartPrice - (InitStopLoss / (100 * Multiplier))))) 
    StopLoss := min(StopLoss, close + (TrailingStopLoss / (100 * Multiplier)))
    strategy.exit("Short Stoploss", "Short") 
    
///////////////////////////////////////////////////////// Setup entries /////////////////////////////////////////////////////////

if (longCondition)
    StartPrice := close
    StopLoss := StartPrice - (InitStopLoss / (100 * Multiplier)) 
    strategy.entry("Long", strategy.long, qty=OrderQty)
    strategy.exit("Long Stoploss", "Long")

if (shortCondition)
    StartPrice := close
    StopLoss := StartPrice + (InitStopLoss / (100 * Multiplier)) 
    strategy.entry("Short", strategy.short, qty=OrderQty)
    strategy.exit("Short Stoploss", "Short")
    
///////////////////////////////////////////////////////// Draw the EMAs /////////////////////////////////////////////////////////
plot(EMA1, "EMA1", color=#00FF00)
plot(EMA2, "EMA2", color=#FF0000)
plot(EMA3, "EMA3", color=#4040FF)


Mais.