Corrigir Robô que opera com médias móveis - fechar Ordens nos cruzamentos

Para adicionar comentários, por favor Faça o login ou registrar
Firemont
10
Firemont  

Salve salve!


Estou usando esse robô para realizar alguns testes pra confirmar algumas estratégias a partir do cruzamento das MM.

Ele possui uma função que deveria fechar as ordens abertas quando a Média rápida cruzasse a Média Lenta e nesse mesmo ponto abrir outra ordem. Entretanto, ao copiar e compilar esse robô, as posições abertas não estão sendo fechadas  com o novo cruzamento e assim acabo ficando com duas posições abertas, pois quando há cruzamento da média rápida uma nova ordem é aberta, mas a antiga só sai no StopLoss. Podem me ajudar a corrigir isso?


Também gostaria de colocar uma função que me permita escolher os horarios para operar, para aproveitar os periodos de maior volatilidade.

//+------------------------------------------------------------------+
//|                                                        MM EA.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

#define IdentificadorEA  101

//--- Input parameters - parâmetros do Expert Advisor que podem ser alterados quando se executa o dito.
extern double Lotes      = 0.01;
extern int    MMlenta    = 50;
extern int    MMrapida   = 5;
extern int    StopLoss   = 100;
extern int    TakeProfit = 100;
extern bool   MMfechar   = false;   // Fechar no cruzamento das MMs (true / false)

//---
datetime LastTradeBarTime;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   //--- Necessário para controlar se estamos numa nova barra
   LastTradeBarTime = Time[1];
  
   //---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   //--- Se existem trades abertos, tem de os fechar
   if(OrdersTotal() > 0) {FecharTodosTrades();}
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //--- Variáveis temporárias, renovadas a cada chamada do EA
   double vMMrapida0;                 // MM rápida da última barra
   double vMMrapida1;                 // MM rápida da penúltima barra
   double vMMlenta0;                  // MM lenta da última barra
   double vMMlenta1;                  // MM lenta da penúltima barra
   int resposta;                      // Variável que obterá a resposta do terminal quando envia uma ordem
  
   //--- Verifica se estamos no início de uma barra e apenas processa as instruções se isso for verdade
   if(LastTradeBarTime == Time[0])
     {return;} // Não é o primeiro tick de uma nova barra, por isso sai
   else
     {
      LastTradeBarTime = Time[0]; // continua

      //--- Valores das médias móveis na barra que acabou de terminar, e na imediatamente anterior
      vMMrapida0 = iMA(Symbol(),0,MMrapida,0,MODE_SMA,PRICE_CLOSE,1); // Obtém o valor da MM rápida da barra que terminou
      vMMrapida1 = iMA(Symbol(),0,MMrapida,0,MODE_SMA,PRICE_CLOSE,2); // Obtém o valor para a MM rápida da barra anterior
      vMMlenta0  = iMA(Symbol(),0,MMlenta, 0,MODE_SMA,PRICE_CLOSE,1); // Obtém o valor da MM lenta da barra que terminou
      vMMlenta1  = iMA(Symbol(),0,MMlenta, 0,MODE_SMA,PRICE_CLOSE,2); // Obtém o valor para a MM lenta da barra anterior

      //--- Verifica se existiu um cruzamento da MM rápida acima da MM lenta
      if(vMMrapida1 < vMMlenta1 && vMMrapida0 > vMMlenta0)
        {
         //--- Verifica se existem posições abertas e se devem ser fechadas
         if(OrdersTotal() > 0 && MMfechar) {FecharTodosTrades();}

         //--- Abre um trade longo
         resposta = OrderSend(Symbol(), OP_BUY, Lotes, Ask, 1, Ask - StopLoss * Point, Ask + TakeProfit * Point, "mm exemplo buy", IdentificadorEA, 0, clrBlue);
        }

      //--- Verifica se existiu um cruzamento da MM rápida abaixo da MM lenta
      if(vMMrapida1 > vMMlenta1 && vMMrapida0 < vMMlenta0)
        {
         //--- Verifica se existem posições abertas e se devem ser fechadas
         if(OrdersTotal() > 0 && MMfechar) {FecharTodosTrades();}

         //--- Abre um trade curto
         resposta = OrderSend(Symbol(), OP_SELL, Lotes, Bid, 1, Bid + StopLoss * Point, Bid - TakeProfit * Point, "mm exemplo sell", IdentificadorEA, 0, clrRed);
        }
     }
  }
//+------------------------------------------------------------------+
//| Função que fecha todos os trades existentes                      |
//+------------------------------------------------------------------+
void FecharTodosTrades()
  {
   bool rec;

   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) {break;}

      //--- A função vai fechar todas as ordens que sejam deste EA e sobre o símbolo corrente
      if(OrderMagicNumber() == IdentificadorEA && OrderSymbol() == Symbol())
        {
         if(OrderType() == OP_BUY)
           {rec = OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrWhite);}
         else if(OrderType() == OP_SELL)
           {rec = OrderClose(OrderTicket(), OrderLots(), Ask, 3, clrWhite);}
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert End                                                       |
//+------------------------------------------------------------------+

Descubra novos recursos para o MetaTrader 5 com a comunidade e os serviços MQL5
Descubra novos recursos para o MetaTrader 5 com a comunidade e os serviços MQL5
  • www.mql5.com
Tire dúvidas sobre análise técnica, fale com outros traders sobre sistemas de negociação e melhore suas habilidades de programação de estratégias em linguagem MQL5. Participe do fórum, compartilhe ideias com traders de todo o mundo e ajude com feedback os novatos — nossa comunidade está crescendo junto com você. Ajuda com código Boa tarde...
Arquivos anexados:
MrClock
2447
MrClock  

Provavelmente você está usando um robô para netting em uma conta hedge.

Tente mudar sua conta de hedge para netting em sua corretora se for possível.

Se não for, você precisa usar no seu código a função de fechar posição e não fechar ordem, não consigo te ajudar 100% pq só uso mql5.

Para adicionar comentários, por favor Faça o login ou registrar