Código com defeito

 
//+------------------------------------------------------------------+
//|                                    Vega Punk   médias moveis.mq5 |
//|                                      Copyright 2020, Michel Ross |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, Michel Ross"
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>
          CTrade trade;

#include <Trade\SymbolInfo.mqh>
          CSymbolInfo simbolo;
//+------------------------------------------------------------------+
//|                    Parametros de Enrtada                         |
//+------------------------------------------------------------------+

input string Titulo_1 ="";                                      //--- Parametros de Contratos
input double LotedeEntrada = 0.01;                             //--- Valor do Lote de Entrada
input double TakeProfit = 100.0;                              //--- Stop Gain da Operação
input double StopLoss = 40.0;                                //--- Stop Loss da Operação

//--------------------------------

input string Titulo_2 ="";                                  //--- Parametros de Porcentagem 
input int PorcentagemDeGain = 0;                           //--- Porcentagem diária Gain 
input int PorcentagemDeLoss = 0;                          //--- Porcentagem diária Loss

//--------------------------------

double Lote_inicial = LotedeEntrada;
input int Lote_multiplicador = 2;                  //--- Martingale
input int Lote_maximo = 10;
double GL_lote_atual;


//+------------------------------------------------------------------+
//|                       Monitoramento                              |
//+------------------------------------------------------------------+

int   gl_ordens = 0;                                   //--- Essa Váriável vai ser usada para definir compra, venda ou nãop fazer nada
ulong magicNum = 1212;                                //--- Magic number é tipo um código pra esse rôbo em especifico, para n ter problema em usar mais de um ao mesmo tempo
bool  gl_openPosition = false;                       //--- Tenho posição aberta ou não ?
long  gl_positonType = -1;                          //--- Estou compradou ou vendido ?


//+------------------------------------------------------------------+
//|                       Dando valor e Estilo das Médias            |
//+------------------------------------------------------------------+

input string Titulo_3 ="";                                //--- Parametros da Média móvel Rápida
input int                ma_Fast = 8;                    //--- Período da média móvel Rápida 
input  ENUM_MA_METHOD ma_Fast_method = MODE_SMA;        //--- Metodo da média móvel Rápida
//-------------------------------

input string Titulo_4 ="";                               //--- Parametros da Média móvel Lenta
input int                ma_Slow = 20;                  //--- Período da média móvel Lenta
input  ENUM_MA_METHOD ma_Slow_method = MODE_SMA;       //--- Metodo da média móvel Lenta

//+------------------------------------------------------------------+
//|                            Data e Hora                           |
//+------------------------------------------------------------------+

input int hAbertura = 20;                                  //--- Horário de abertura
input int mAbertura = 0;                                  //--- Minuto de abertura
     
input int hFechamento = 17;                             //--- Horário de fechamento
input int mFechamento = 30;                            //---- Minuto de fechamento

//+------------------------------------------------------------------+
//|                          Handles                                 |
//+------------------------------------------------------------------+

int      iMA_fast_handle = INVALID_HANDLE;
int      iMA_slow_handle = INVALID_HANDLE;

//+------------------------------------------------------------------+
//|                          Buffers                                 |
//+------------------------------------------------------------------+

double   iMA_fast_buffer[];
double   iMA_slow_buffer[];

//+------------------------------------------------------------------+
//|                    Gestão de elementos Gráficos                  |
//+------------------------------------------------------------------+

bool     GLinitHandle1 = false;
bool     GLinitHandle2 = false;

bool     GLgrafico_1 = false;
bool     GLgrafico_2 = false; 

//+------------------------------------------------------------------+
//|               Vereficando quantidades de Ordens Abertas          |
//+------------------------------------------------------------------+

bool    Abertas = false;

//+------------------------------------------------------------------+
//|                                                                  |
//|                 Expert initialization function                   |
//|                                                                  |  
//+------------------------------------------------------------------+
int OnInit()
     {
   
//+------------------------------------------------------------------+
//|           Análise de Váriaveis de parametros de Entrada          |    
//+------------------------------------------------------------------+
   
   if(LotedeEntrada >= 3.0)                                                             //--- Não vai permitir o robô operar com o lote muito grande
     {
     Print("Vai quebrar a conta, melhor parar por hoje.");
     return(INIT_FAILED);
     }
     
   if(TakeProfit <= 0)                                                                  //--- Não vai permitir o robô operar sem um Take Profit
     {
     Print("Esqueceu de por o Take meu querido.");
     return(INIT_FAILED);
     }
   
   if(StopLoss <= 0)                                                                    //--- Não vai permitir o robô operar sem um Stop Loss
     {
     Print("Cara vc não colocou o STOPLOSS, vai dar ruim, arruma lá.");
     return(INIT_FAILED);
     }

//+------------------------------------------------------------------+
//|               Análise de Variáveis das Médias Moveis             |
//+------------------------------------------------------------------+
  if(ma_Fast <= 0)
     {
     Print("O periodo da Média Movel Rápida não pode ser menor ou igual a Zero.");
     return(INIT_FAILED);
     }
  
  if(ma_Slow <= 0)
     {
     Print("O periodo da Média Movel Lenta não pode ser menor ou igual a Zero.");
     return(INIT_FAILED);
     }
   
   if(ma_Slow < ma_Fast)
     {
     Print("O periodo da Média Movel Lenta nunca pode ser menor que a Média Movel Rápida.");
     return(INIT_FAILED); 
     }
   
//+------------------------------------------------------------------+
//|                             Handles                              |
//+------------------------------------------------------------------+
     
   iMA_fast_handle = iMA(_Symbol,_Period,ma_Fast,0,ma_Fast_method,PRICE_CLOSE);
   
   if(iMA_fast_handle == INVALID_HANDLE)
     {
     Print("Deu ruim da hora de criar a média rápida =( .",GetLastError());
     return(INIT_FAILED);
     }
   else
     {
     GLinitHandle1 = true;
     }
   
//------   
   
   iMA_slow_handle = iMA(_Symbol,_Period,ma_Slow,0,ma_Slow_method,PRICE_CLOSE);
   
   if(iMA_slow_handle == INVALID_HANDLE)
     {
     Print("Deu ruim na hora de criar a média lenta =( .",GetLastError());
     return(INIT_FAILED);
     }
   else
     {
     GLinitHandle2 = true;
     }
   
//+------------------------------------------------------------------+
//|                         ArraySetAsSeries                         |               
//+------------------------------------------------------------------+

   if(!ArraySetAsSeries(iMA_fast_buffer,true))
     {
     Print("Erro na  criação do ArraySetAsSeries para iMA_fast_buffer.: ",GetLastError());                  //--- Aqui básicamente estamos invertendo a ordem  
     return(INIT_FAILED);                                                                                  //--- cronológica que o metatrader utiliza, 
     }                                                                                                    //--- no caso do passado pro presente tanto na fast
                                                                                                         //--- quanto na slow.
   if(!ArraySetAsSeries(iMA_slow_buffer,true))
     {
     Print("Erro na  criação do ArraySetAsSeries para iMA_slow_buffer.: ",GetLastError());
     return(INIT_FAILED);
     }    
   
//+------------------------------------------------------------------+
//|                 Colocando os indicadores no gráfico              |
//+------------------------------------------------------------------+
    
   if(!ChartIndicatorAdd(ChartID(),0,iMA_fast_handle))
     {
     Print("Erro na plotagem do indicador iMA_fast_handle no gráfico.");
     return(INIT_FAILED);
     }
   else
     {
     GLgrafico_1 = true;
     }
   
   if(!ChartIndicatorAdd(ChartID(),0,iMA_slow_handle))
     {
     Print("Erro na plotagem do indicador iMA_slow_handle no gráfico.");
     return(INIT_FAILED);
     }
   else
     {
     GLgrafico_2 = true;
     } 
   
    Print("O Rôbo foi inicializado boa sorte");
    
    GL_lote_atual = Lote_inicial; 
   
    return(INIT_SUCCEEDED);
    }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   
   ResetLastError();
   Comment("");
   
//+------------------------------------------------------------------+
//|                      Liberação dos Indicadores                   |
//+------------------------------------------------------------------+
   
   if(GLinitHandle1==true && !IndicatorRelease(iMA_fast_handle))
     Print("Erro na liberação do iMA_fast_handle. ",GetLastError()); 
 
   if(GLinitHandle2==true && !IndicatorRelease(iMA_slow_handle))
     Print("Erro na liberação do iMA_slow_handle. ",GetLastError()); 
    
//+------------------------------------------------------------------+
//|                      Array Free                                  |
//+------------------------------------------------------------------+
  
   ArrayFree(iMA_fast_buffer);                  //--- Libera um buffer de qualquer array dinâmico e define o tamanho da dimensão zero para 0.
   ArrayFree(iMA_slow_buffer);
     
//+------------------------------------------------------------------+
//|               Retirando os Indicadores do Gráfico                |
//+------------------------------------------------------------------+
  
    string iMA_fast_chart =ChartIndicatorName(0,0,0);
    if(GLgrafico_1 && !ChartIndicatorDelete(0,0,iMA_fast_chart))
     Print("Erro na hora de remover aiMA_fast_chart. ",GetLastError());
     
     string iMA_slow_chart =ChartIndicatorName(0,0,0);
     if(GLgrafico_2 && !ChartIndicatorDelete(0,0,iMA_slow_chart))
     Print("Erro na hora de remover aiMA_slow_chart. ",GetLastError());
  
  
     Print("Deinicialização executada.");
   
    }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
    {
    
    ResetLastError();
      
//+------------------------------------------------------------------+
//|                      Inicializando Copy Buffer                   |
//+------------------------------------------------------------------+
   

    if(CopyBuffer(iMA_fast_handle,0,0,3,iMA_fast_buffer)!=3)
     {
     Print("Erro ao atualizar o indicador da Média Móvel Rápida.; ",GetLastError());         //--- Aqui eu to pegando o valor da Média Rápida e
     return;                                                                                //--- Jogando pra dentro do buffer, pegando os 3 ultimos candles
     }
     
     if(CopyBuffer(iMA_slow_handle,0,0,3,iMA_slow_buffer)!=3)                             //--- Aqui eu to pegando o valor da Média Lenta e
     {                                                                                   //--- Jogando pra dentro do buffer, pegando os 3 ultimos candles
     Print("Erro ao atualizar o indicador da Média Móvel Lenta.; ",GetLastError());         
     return; 
     } 
          
//+------------------------------------------------------------------+
//|        Definindo Horários e dias da semana pra operar            |
//+------------------------------------------------------------------+
                            
    MqlDateTime DT;                //--- Aqui eu crio a estrutura
    TimeCurrent(DT);              //--- Aqui onde eu a populo
    
//+------------------------------------------------------------------+
//|                        Atualiza Posição                          |
//+------------------------------------------------------------------+

   gl_openPosition  = PositionSelect(_Symbol);
   
   if (gl_openPosition==true)
   {
    gl_positonType = PositionGetInteger(POSITION_TYPE);
    GL_lote_atual = PositionGetDouble(POSITION_VOLUME);
   }
   else
   {
    gl_positonType = WRONG_VALUE;
   }
   
   
         
//+------------------------------------------------------------------+
//|                             Compra                               |
//+------------------------------------------------------------------+

   if(iMA_fast_buffer[0] > iMA_slow_buffer[0] && 
      iMA_fast_buffer[1] < iMA_slow_buffer[1])
     {
      gl_ordens=1;
     }  
     
//+------------------------------------------------------------------+
//|                             Hold de Compra                       |
//+------------------------------------------------------------------+

   if(gl_openPosition==true && 
      gl_positonType==POSITION_TYPE_BUY &&
      gl_ordens==1)
   {
    gl_ordens=0;     //--- Restrição de Compra.

   }
   
   
//+------------------------------------------------------------------+
//|                             Venda                                |
//+------------------------------------------------------------------+

    if(iMA_fast_buffer[0] < iMA_slow_buffer[0] && 
       iMA_fast_buffer[1] > iMA_slow_buffer[1])
     {
      gl_ordens=-1;                                 
     }
//+------------------------------------------------------------------+
//|                             Hold de Venda                        |
//+------------------------------------------------------------------+

   if(gl_openPosition==true &&
      gl_positonType==POSITION_TYPE_SELL &&
      gl_ordens==-1)
   {
    gl_ordens=0;     //--- Restrição de Venda.
   }
   
   
//+------------------------------------------------------------------+
//|                   Atualiza variaveis e horário                   |
//+------------------------------------------------------------------+
    if(gl_ordens!= 0)
    {
    
    MqlTick price_info;
    ZeroMemory(price_info);
    
    if(!SymbolInfoTick(_Symbol,price_info))                                  //--- Atualizando o simbolo da janela especifica (Symbol)
    {
     Print("Falha na atualização de preço: ",GetLastError());
     return;
    } 
    
//+------------------------------------------------------------------+
//|                             Compra                               |
//+------------------------------------------------------------------+
    
    if(gl_ordens==1)
    {
     double SL= (StopLoss * _Point);
     double TP = (TakeProfit * _Point);
     trade.Buy(GL_lote_atual, _Symbol, price_info.ask, price_info.ask-SL, price_info.ask+TP, "[COMPRA]");
     Print("Executada Ordem de Compra. ",GetLastError());
    }
    
    
//+------------------------------------------------------------------+
//|                            Venda                                 |
//+------------------------------------------------------------------+
        
    if(gl_ordens==-1)
    {
     double SL = (StopLoss * _Point);
     double TP = (TakeProfit * _Point);
     trade.Sell(GL_lote_atual, _Symbol, price_info.bid, price_info.bid+SL, price_info.bid-TP, "[VENDA]");
     return;
     Print("Executada Ordem de Venda. ",GetLastError());
    }
    
    }
    
    }

   Então pessoal... na hora da compra e da venda, pelo menos na minha cabeça não sei, era pra comprar ou vender encerrar a operação, esperar surgir a próxima hora de entrar, porem ele buga ele abre varias operações ao mesmo tempo, se eu tiro a compra ou a venda ele faz tudo certinho, porem com os dois juntos ele buga, não sei se me consegui fazer entender, mas caso alguém tenha entendido meu problema, me da uma ajuda ae, dês de já muito obrigado.

 
111018654:

   Então pessoal... na hora da compra e da venda, pelo menos na minha cabeça não sei, era pra comprar ou vender encerrar a operação, esperar surgir a próxima hora de entrar, porem ele buga ele abre varias operações ao mesmo tempo, se eu tiro a compra ou a venda ele faz tudo certinho, porem com os dois juntos ele buga, não sei se me consegui fazer entender, mas caso alguém tenha entendido meu problema, me da uma ajuda ae, dês de já muito obrigado.

Esse código é seu? Fou você que o programou?
 
Flavio Jarabeck:
Esse código é seu? Fou você que o programou?

Sim ! 

 
111018654:

Sim ! 

Rodei um teste do seu código por aqui no BRA50 em modelagem OHLC e aparentemente sem anormalidades. Já no teste com Ticks Reais, percebi que em alguns momentos ele realiza diversas operações dentro da mesma barra. Se o problema é esse, minha sugestão é que você faça um controle para abrir novas operações somente após uma nova barra. Inclusive existe um artigo (e uma classe já pronta) que pode te ajudar a escrever esse controle:

https://www.mql5.com/pt/articles/159

Handler de evento "nova barra"
Handler de evento "nova barra"
  • www.mql5.com
Os autores dos indicadores e especialistas sempre estiveram interessados em escrever o código compacto em termos de tempo de execução. Você pode resolver este problema a partir de diferentes ângulos. A partir deste amplo tópico neste artigo, cobriremos o problema, que aparentemente foi solucionado: verifique por uma nova barra. Este é um meio...
 
Kl_ Urt:

Rodei um teste do seu código por aqui no BRA50 em modelagem OHLC e aparentemente sem anormalidades. Já no teste com Ticks Reais, percebi que em alguns momentos ele realiza diversas operações dentro da mesma barra. Se o problema é esse, minha sugestão é que você faça um controle para abrir novas operações somente após uma nova barra. Inclusive existe um artigo (e uma classe já pronta) que pode te ajudar a escrever esse controle:

https://www.mql5.com/pt/articles/159

Obrigado meu querido, vou dar uma olhada e tentar arrumar, abração.

 
111018654:

   ....

#include <Trade\Trade.mqh>
CTrade trade;

#include <Trade\SymbolInfo.mqh>
CSymbolInfo simbolo;

datetime          m_last_time;
bool   m_comprado, m_vendido;
//+------------------------------------------------------------------+
//|                    Parametros de Enrtada                         |
//+------------------------------------------------------------------+

input string Titulo_1 ="";                                      //--- Parametros de Contratos
input double LotedeEntrada = 0.01;                             //--- Valor do Lote de Entrada
input double TakeProfit = 100.0;                              //--- Stop Gain da Operação
input double StopLoss = 40.0;                                //--- Stop Loss da Operação

//--------------------------------

input string Titulo_2 ="";                                  //--- Parametros de Porcentagem
input int PorcentagemDeGain = 0;                           //--- Porcentagem diária Gain
input int PorcentagemDeLoss = 0;                          //--- Porcentagem diária Loss

//--------------------------------

double Lote_inicial = LotedeEntrada;
input int Lote_multiplicador = 2;                  //--- Martingale
input int Lote_maximo = 10;
double GL_lote_atual;


//+------------------------------------------------------------------+
//|                       Monitoramento                              |
//+------------------------------------------------------------------+

int   gl_ordens = 0;                                   //--- Essa Váriável vai ser usada para definir compra, venda ou nãop fazer nada
ulong magicNum = 1212;                                //--- Magic number é tipo um código pra esse rôbo em especifico, para n ter problema em usar mais de um ao mesmo tempo
bool  gl_openPosition = false;                       //--- Tenho posição aberta ou não ?
long  gl_positonType = -1;                          //--- Estou compradou ou vendido ?


//+------------------------------------------------------------------+
//|                       Dando valor e Estilo das Médias            |
//+------------------------------------------------------------------+

input string Titulo_3 ="";                                //--- Parametros da Média móvel Rápida
input int                ma_Fast = 8;                    //--- Período da média móvel Rápida
input  ENUM_MA_METHOD ma_Fast_method = MODE_SMA;        //--- Metodo da média móvel Rápida
//-------------------------------

input string Titulo_4 ="";                               //--- Parametros da Média móvel Lenta
input int                ma_Slow = 20;                  //--- Período da média móvel Lenta
input  ENUM_MA_METHOD ma_Slow_method = MODE_SMA;       //--- Metodo da média móvel Lenta

//+------------------------------------------------------------------+
//|                            Data e Hora                           |
//+------------------------------------------------------------------+

input int hAbertura = 20;                                  //--- Horário de abertura
input int mAbertura = 0;                                  //--- Minuto de abertura

input int hFechamento = 17;                             //--- Horário de fechamento
input int mFechamento = 30;                            //---- Minuto de fechamento

//+------------------------------------------------------------------+
//|                          Handles                                 |
//+------------------------------------------------------------------+

int      iMA_fast_handle = INVALID_HANDLE;
int      iMA_slow_handle = INVALID_HANDLE;

//+------------------------------------------------------------------+
//|                          Buffers                                 |
//+------------------------------------------------------------------+

double   iMA_fast_buffer[];
double   iMA_slow_buffer[];

//+------------------------------------------------------------------+
//|                    Gestão de elementos Gráficos                  |
//+------------------------------------------------------------------+

bool     GLinitHandle1 = false;
bool     GLinitHandle2 = false;

bool     GLgrafico_1 = false;
bool     GLgrafico_2 = false;

//+------------------------------------------------------------------+
//|               Vereficando quantidades de Ordens Abertas          |
//+------------------------------------------------------------------+

bool    Abertas = false;

//+------------------------------------------------------------------+
//|                                                                  |
//|                 Expert initialization function                   |
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {

//+------------------------------------------------------------------+
//|           Análise de Váriaveis de parametros de Entrada          |
//+------------------------------------------------------------------+

   if(LotedeEntrada >= 3.0)                                                             //--- Não vai permitir o robô operar com o lote muito grande
     {
      Print("Vai quebrar a conta, melhor parar por hoje.");
      return(INIT_FAILED);
     }

   if(TakeProfit <= 0)                                                                  //--- Não vai permitir o robô operar sem um Take Profit
     {
      Print("Esqueceu de por o Take meu querido.");
      return(INIT_FAILED);
     }

   if(StopLoss <= 0)                                                                    //--- Não vai permitir o robô operar sem um Stop Loss
     {
      Print("Cara vc não colocou o STOPLOSS, vai dar ruim, arruma lá.");
      return(INIT_FAILED);
     }

//+------------------------------------------------------------------+
//|               Análise de Variáveis das Médias Moveis             |
//+------------------------------------------------------------------+
   if(ma_Fast <= 0)
     {
      Print("O periodo da Média Movel Rápida não pode ser menor ou igual a Zero.");
      return(INIT_FAILED);
     }

   if(ma_Slow <= 0)
     {
      Print("O periodo da Média Movel Lenta não pode ser menor ou igual a Zero.");
      return(INIT_FAILED);
     }

   if(ma_Slow < ma_Fast)
     {
      Print("O periodo da Média Movel Lenta nunca pode ser menor que a Média Movel Rápida.");
      return(INIT_FAILED);
     }

//+------------------------------------------------------------------+
//|                             Handles                              |
//+------------------------------------------------------------------+

   iMA_fast_handle = iMA(_Symbol,_Period,ma_Fast,0,ma_Fast_method,PRICE_CLOSE);

   if(iMA_fast_handle == INVALID_HANDLE)
     {
      Print("Deu ruim da hora de criar a média rápida =( .",GetLastError());
      return(INIT_FAILED);
     }
   else
     {
      GLinitHandle1 = true;
     }

//------

   iMA_slow_handle = iMA(_Symbol,_Period,ma_Slow,0,ma_Slow_method,PRICE_CLOSE);

   if(iMA_slow_handle == INVALID_HANDLE)
     {
      Print("Deu ruim na hora de criar a média lenta =( .",GetLastError());
      return(INIT_FAILED);
     }
   else
     {
      GLinitHandle2 = true;
     }

//+------------------------------------------------------------------+
//|                         ArraySetAsSeries                         |
//+------------------------------------------------------------------+

   if(!ArraySetAsSeries(iMA_fast_buffer,true))
     {
      Print("Erro na  criação do ArraySetAsSeries para iMA_fast_buffer.: ",GetLastError());                  //--- Aqui básicamente estamos invertendo a ordem
      return(INIT_FAILED);                                                                                  //--- cronológica que o metatrader utiliza,
     }                                                                                                    //--- no caso do passado pro presente tanto na fast
//--- quanto na slow.
   if(!ArraySetAsSeries(iMA_slow_buffer,true))
     {
      Print("Erro na  criação do ArraySetAsSeries para iMA_slow_buffer.: ",GetLastError());
      return(INIT_FAILED);
     }

//+------------------------------------------------------------------+
//|                 Colocando os indicadores no gráfico              |
//+------------------------------------------------------------------+

   if(!ChartIndicatorAdd(ChartID(),0,iMA_fast_handle))
     {
      Print("Erro na plotagem do indicador iMA_fast_handle no gráfico.");
      return(INIT_FAILED);
     }
   else
     {
      GLgrafico_1 = true;
     }

   if(!ChartIndicatorAdd(ChartID(),0,iMA_slow_handle))
     {
      Print("Erro na plotagem do indicador iMA_slow_handle no gráfico.");
      return(INIT_FAILED);
     }
   else
     {
      GLgrafico_2 = true;
     }

   Print("O Rôbo foi inicializado boa sorte");

   GL_lote_atual = Lote_inicial;

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

   ResetLastError();
   Comment("");

//+------------------------------------------------------------------+
//|                      Liberação dos Indicadores                   |
//+------------------------------------------------------------------+

   if(GLinitHandle1==true && !IndicatorRelease(iMA_fast_handle))
      Print("Erro na liberação do iMA_fast_handle. ",GetLastError());

   if(GLinitHandle2==true && !IndicatorRelease(iMA_slow_handle))
      Print("Erro na liberação do iMA_slow_handle. ",GetLastError());

//+------------------------------------------------------------------+
//|                      Array Free                                  |
//+------------------------------------------------------------------+

   ArrayFree(iMA_fast_buffer);                  //--- Libera um buffer de qualquer array dinâmico e define o tamanho da dimensão zero para 0.
   ArrayFree(iMA_slow_buffer);

//+------------------------------------------------------------------+
//|               Retirando os Indicadores do Gráfico                |
//+------------------------------------------------------------------+

   string iMA_fast_chart =ChartIndicatorName(0,0,0);
   if(GLgrafico_1 && !ChartIndicatorDelete(0,0,iMA_fast_chart))
      Print("Erro na hora de remover aiMA_fast_chart. ",GetLastError());

   string iMA_slow_chart =ChartIndicatorName(0,0,0);
   if(GLgrafico_2 && !ChartIndicatorDelete(0,0,iMA_slow_chart))
      Print("Erro na hora de remover aiMA_slow_chart. ",GetLastError());


   Print("Deinicialização executada.");

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  
   // --se tiver função de trailling fica fora do evento de nova barra

   if(IsNewBar())
     {

      ResetLastError();
      CheckPosition();

      //+------------------------------------------------------------------+
      //|                      Inicializando Copy Buffer                   |
      //+------------------------------------------------------------------+


      if(CopyBuffer(iMA_fast_handle,0,0,3,iMA_fast_buffer)!=3)
        {
         Print("Erro ao atualizar o indicador da Média Móvel Rápida.; ",GetLastError());         //--- Aqui eu to pegando o valor da Média Rápida e
         return;                                                                                //--- Jogando pra dentro do buffer, pegando os 3 ultimos candles
        }

      if(CopyBuffer(iMA_slow_handle,0,0,3,iMA_slow_buffer)!=3)                             //--- Aqui eu to pegando o valor da Média Lenta e
        {
         //--- Jogando pra dentro do buffer, pegando os 3 ultimos candles
         Print("Erro ao atualizar o indicador da Média Móvel Lenta.; ",GetLastError());
         return;
        }

      //+------------------------------------------------------------------+
      //|        Definindo Horários e dias da semana pra operar            |
      //+------------------------------------------------------------------+

      MqlDateTime DT;                //--- Aqui eu crio a estrutura
      TimeCurrent(DT);              //--- Aqui onde eu a populo

      //+------------------------------------------------------------------+
      //|                        Atualiza Posição                          |
      //+------------------------------------------------------------------+

      gl_openPosition  = PositionSelect(_Symbol);

      if(gl_openPosition==true)
        {
         gl_positonType = PositionGetInteger(POSITION_TYPE);
         GL_lote_atual = PositionGetDouble(POSITION_VOLUME);
        }
      else
        {
         gl_positonType = WRONG_VALUE;
        }



      //+------------------------------------------------------------------+
      //|                             Compra                               |
      //+------------------------------------------------------------------+

      if(iMA_fast_buffer[0] > iMA_slow_buffer[0] &&
         iMA_fast_buffer[1] < iMA_slow_buffer[1])
        {
         gl_ordens=1;
        }

      //+------------------------------------------------------------------+
      //|                             Hold de Compra                       |
      //+------------------------------------------------------------------+

      //if(gl_openPosition==true &&
      //   gl_positonType==POSITION_TYPE_BUY &&
      //   gl_ordens==1)
      //  {
      //   gl_ordens=0;     //--- Restrição de Compra.

      //  }


      //+------------------------------------------------------------------+
      //|                             Venda                                |
      //+------------------------------------------------------------------+

      if(iMA_fast_buffer[0] < iMA_slow_buffer[0] &&
         iMA_fast_buffer[1] > iMA_slow_buffer[1])
        {
         gl_ordens=-1;
        }
      //+------------------------------------------------------------------+
      //|                             Hold de Venda                        |
      //+------------------------------------------------------------------+

      //if(gl_openPosition==true &&
      //   gl_positonType==POSITION_TYPE_SELL &&
      //   gl_ordens==-1)
      //  {
      //   gl_ordens=0;     //--- Restrição de Venda.
      //  }


      //+------------------------------------------------------------------+
      //|                   Atualiza variaveis e horário                   |
      //+------------------------------------------------------------------+
      if(gl_ordens!= 0)
        {

         MqlTick price_info;
         ZeroMemory(price_info);

         if(!SymbolInfoTick(_Symbol,price_info))                                  //--- Atualizando o simbolo da janela especifica (Symbol)
           {
            Print("Falha na atualização de preço: ",GetLastError());
            return;
           }

         //+------------------------------------------------------------------+
         //|                             Compra                               |
         //+------------------------------------------------------------------+

         if(gl_ordens==1 && !m_comprado)
           {
            double SL= (StopLoss * _Point);
            double TP = (TakeProfit * _Point);
            trade.Buy(GL_lote_atual, _Symbol, price_info.ask, price_info.ask-SL, price_info.ask+TP, "[COMPRA]");
            Print("Executada Ordem de Compra. ",GetLastError());
           }


         //+------------------------------------------------------------------+
         //|                            Venda                                 |
         //+------------------------------------------------------------------+

         if(gl_ordens==-1 && !m_vendido)
           {
            double SL = (StopLoss * _Point);
            double TP = (TakeProfit * _Point);
            trade.Sell(GL_lote_atual, _Symbol, price_info.bid, price_info.bid+SL, price_info.bid-TP, "[VENDA]");
            return;
            Print("Executada Ordem de Venda. ",GetLastError());
           }

        }
     }

  }
//+------------------------------------------------------------------+
bool IsNewBar(void)
  {
   datetime time[];
   if(CopyTime(simbolo.Name(), Period(), 0, 1, time) < 1)
      return false;
   if(time[0] == m_last_time)
      return false;
   return m_last_time = time[0];
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CheckPosition(void)
  {
   if(PositionSelect(Symbol()))
     {
      //--- se a posição for comprada
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         m_comprado = true;
         m_vendido  = false;
        }

      //--- se a posição for vendida
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         m_vendido  = true;
         m_comprado = false;
        }
     }
   else
     {
      m_comprado = false;
      m_vendido  = false;
     }
  }
//+------------------------------------------------------------------+
Razão: