Habilitar/Desabilitar funcionalidade de EA através de um bool como input

 
Olá pessoal!

Gostaria de saber se é possível habilitar/desabilitar uma funcionalidade de um EA através de um bool (true/false), por exemplo, como input. Por exemplo, eu fiz um EA que entra comprado quando o preço toca a EMA9 e a EMA9 está acima da EMA20 no timeframe de 5 minutos , e também pode entrar comprado se o IFR9 está sobrevendido abaixo de 20. Gostaria de desabilitar a parte do IFR9 sem ter que entrar no editor e comentar as linhas que fazem parte do código referente a essa funcionalidade. Seria possível?
 
Marcel CardosoOlá pessoal! Gostaria de saber se é possível habilitar/desabilitar uma funcionalidade de um EA através de um bool (true/false), por exemplo, como input. Por exemplo, eu fiz um EA que entra comprado quando o preço toca a EMA9 e a EMA9 está acima da EMA20 no timeframe de 5 minutos , e também pode entrar comprado se o IFR9 está sobrevendido abaixo de 20. Gostaria de desabilitar a parte do IFR9 sem ter que entrar no editor e comentar as linhas que fazem parte do código referente a essa funcionalidade. Seria possível?

Olá, Marcel, poste esse trecho do seu código (utilizando o botão Código, como mostrado abaixo) onde você verifica a condição do IFR9 para abrir posição, que a gente mostra como alterar...

 

 
Marcel Cardoso:
Olá pessoal!

Gostaria de saber se é possível habilitar/desabilitar uma funcionalidade de um EA através de um bool (true/false), por exemplo, como input. Por exemplo, eu fiz um EA que entra comprado quando o preço toca a EMA9 e a EMA9 está acima da EMA20 no timeframe de 5 minutos , e também pode entrar comprado se o IFR9 está sobrevendido abaixo de 20. Gostaria de desabilitar a parte do IFR9 sem ter que entrar no editor e comentar as linhas que fazem parte do código referente a essa funcionalidade. Seria possível?

Sim, é possivel. Voce vai fazer algo assim (fora das funções bem em cima):

input bool InpOperacaoTipo1=true; // Toque em EMA9 permitido?
input bool InpOperacaoTipo2=true; // IFR9 sobrevendido permitido?

Com isso, no seu codigo tu pode usar essas variaveis InpOperacaoTipo1 e InpOperacaoTipo2 em trechos de codigo especificos para permitir ou não as operações por essas ou outras analises.

 
Vinicius de Oliveira #:

Olá, Marcel, poste esse trecho do seu código (utilizando o botão Código, como mostrado abaixo) onde você verifica a condição do IFR9 para abrir posição, que a gente mostra como alterar...

 

Eu utilizei esse exemplo de EMA9 e IFR9 para simplificar minha pergunta um pouco, mas vou postar meu código na sequência para ver se é possível me ajudar. As condições de verificações são outras.
 
int Condicao_operacao()
  {
   double MediaX_dol[];
   ArraySetAsSeries(MediaX_dol, true);
   CopyBuffer(handlemediax_dol, 0, 0, 25, MediaX_dol);
   
   double MediaX_engolfo[];
   ArraySetAsSeries(MediaX_engolfo, true);
   CopyBuffer(handlemediax_engolfo, 0, 0, 101, MediaX_engolfo);
   
   double MediaX_estocastico[];
   ArraySetAsSeries(MediaX_estocastico, true);
   CopyBuffer(handlemediax_estocastico, 0, 0, 101, MediaX_estocastico);
   
   double Stoch_Array[];
   ArraySetAsSeries(Stoch_Array, true);
   CopyBuffer(handlestoch, 0, 0, 101, Stoch_Array);
   
   MqlRates rates[];
   ArraySetAsSeries(rates, true);
   CopyRates(_Symbol, _Period, 0, 7, rates);
   
// ---------------------------------------------------------------------   

// Compra Dolar
   if((rates[1].high > MediaX_dol[1]) && // maxima > média
      (rates[1].low < MediaX_dol[1]) && // minima < media
      (rates[1].close >= rates[1].open) && // fechamento >= abertura
      (rates[1].close > MediaX_dol[1]) && // fechamento > media
      ((rates[1].open - rates[1].low) > (rates[1].high - rates[1].open)) && // (abertura - minima) > (maxima - abertura)
      ((rates[1].high - rates[1].low) > candle_size_dol) && // (maxima - minima) > tamanho do candle otimizado
      (rates[1].low < rates[2].low) && // minima < minima anterior
      (rates[2].high > rates[1].high) && //maxima anterior > maxima
      NovaBarra() &&
      HorarioEntrada_Dol())
      return 1;

// Venda Dolar
   if((rates[1].high > MediaX_dol[1]) && // maxima > media
      (rates[1].low < MediaX_dol[1]) && // minima < media
      (rates[1].close <= rates[1].open) && // fechamento <= abertura
      (rates[1].close < MediaX_dol[1]) && // fechamento < media
      ((rates[1].high - rates[1].open) > (rates[1].open - rates[1].low)) && // (maxima - abertura) > (abertura - minima)
      ((rates[1].high - rates[1].low) > candle_size_dol) && // (maxima - minima) tamanho do candle otimizado
      (rates[1].high > rates[2].high) && // maxima > maxima anterior
      (rates[2].low < rates[1].low) &&  // minima anterior < minima
      NovaBarra() && 
      HorarioEntrada_Dol())
      return -1;

// ---------------------------------------------------------------------
      
// Compra Estocástico
if ((Stoch_Array[1] < (100 - stoch_alto)) &&
      ((rates[1].high - rates[1].close) <= pavil_gatilho) &&
      (rates[1].high >= rates[2].high) &&
      (MediaX_estocastico[1] - MediaX_estocastico[n_candles_estocastico] > inclinacao_media_esto) &&
      (rates[1].close - rates[1].open <= candle_size_max) &&
      (rates[1].close - rates[1].open >= candle_size_min) &&
      NovaBarra() && 
      HorarioEntrada_Estocastico()
      //&& HorarioBloqueioEstocastico()
      ) 
      return 2;
      
// Venda Estocástico
   if ((Stoch_Array[1] > stoch_alto) &&
      ((rates[1].close - rates[1].low) <= pavil_gatilho) &&
      (rates[1].low <= rates[2].low) &&
      (MediaX_estocastico[n_candles_estocastico] - MediaX_estocastico[1] > inclinacao_media_esto) &&
      (rates[1].open - rates[1].close <= candle_size_max) &&
      (rates[1].open - rates[1].close >= candle_size_min) &&
      NovaBarra() &&
      HorarioEntrada_Estocastico()
      //&& HorarioBloqueioEstocastico()
      )
      return -2;

// ---------------------------------------------------------------------
      
// Compra Engolfo
   if ((MediaX_engolfo[1] - MediaX_engolfo[n_candles_engolfo] > inclinacao_media_engolfo) &&    // inclinação da média
      (rates[1].close - rates[2].open >= rates[4].open - rates[3].close) &&                     // corpo [1+2] > corpo [3+4]                  
      (rates[1].high - rates[1].close < rates[1].close - rates[2].open) &&                      // pavil candle[1] < candle[1+2]
      (rates[2].low >= rates[3].low) &&                                                         // minina[2] >= minima[3]
      (rates[4].low >= rates[3].low) &&                                                         // minima[4] >= minima[3]
      (rates[3].open - rates[3].close > 0) &&                                                   // candle[3] negativo 
      (rates[4].open - rates[4].close > 0) &&                                                   // candle[4] negativo
      (rates[4].open - rates[3].close >= candle34_min) &&                                       // candle[3+4] máx.
      (rates[4].open - rates[3].close >= candle34_min) &&                                       // candle[3+4] mín.
      NovaBarra() &&
      HorarioEntrada_Engolfo()
      && HorarioBloqueioEngolfo()
      ) 
      return 3;

// Venda Engolfo
   if ((MediaX_engolfo[n_candles_engolfo] - MediaX_engolfo[1] > inclinacao_media_engolfo) &&
      (rates[2].open - rates[1].close >= rates[3].close - rates[4].open) &&
      (rates[1].close - rates[1].low < rates[2].open - rates[1].close) &&
      (rates[2].high <= rates[3].low) &&
      (rates[4].high <= rates[3].high) &&
      (rates[3].open - rates[3].close < 0) &&
      (rates[4].open - rates[4].close < 0) &&
      (rates[3].close - rates[4].open >= candle34_min) &&
      (rates[3].close - rates[4].open >= candle34_max) &&
      NovaBarra() &&
      HorarioEntrada_Engolfo() 
      && HorarioBloqueioEngolfo()
      )
      return -3;

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

   return 0;
  }

Como pode ser observado eu utilizo umas verificação de condição no OnTick() baseado no retorno de um int onde esse retorno vai indicar compra ou venda. Não sei se nesse caso eu consigo implementar algo para desabilitar as funcionalidades conforme eu gostaria.
 
Marcel Cardoso #Eu utilizei esse exemplo de EMA9 e IFR9 para simplificar minha pergunta um pouco, mas vou postar meu código na sequência para ver se é possível me ajudar. As condições de verificações são outras.
Marcel Cardoso #Como pode ser observado eu utilizo umas verificação de condição no OnTick() baseado no retorno de um int onde esse retorno vai indicar compra ou venda. Não sei se nesse caso eu consigo implementar algo para desabilitar as funcionalidades conforme eu gostaria.

Ok, o Ricardo já descreveu aqui exatamente como seria... Agora eu vou apenas aplicar a ideia diretamente com o seu código...

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

//--- ESCOPO GLOBAL
input bool InpCondDolar = true;    // Verificar Condição Dólar
input bool InpCondEstoc = true;    // Verificar Condição Estocástico
input bool InpCondEngol = true;    // Verificar Condição Engolfo

// . . .

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Condicao_operacao()
  {
   double MediaX_dol[];
   ArraySetAsSeries(MediaX_dol, true);
   CopyBuffer(handlemediax_dol, 0, 0, 25, MediaX_dol);

   double MediaX_engolfo[];
   ArraySetAsSeries(MediaX_engolfo, true);
   CopyBuffer(handlemediax_engolfo, 0, 0, 101, MediaX_engolfo);

   double MediaX_estocastico[];
   ArraySetAsSeries(MediaX_estocastico, true);
   CopyBuffer(handlemediax_estocastico, 0, 0, 101, MediaX_estocastico);

   double Stoch_Array[];
   ArraySetAsSeries(Stoch_Array, true);
   CopyBuffer(handlestoch, 0, 0, 101, Stoch_Array);

   MqlRates rates[];
   ArraySetAsSeries(rates, true);
   CopyRates(_Symbol, _Period, 0, 7, rates);

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

   if(InpCondDolar)
     {
      // Compra Dolar
      if((rates[1].high > MediaX_dol[1]) && // maxima > média
         (rates[1].low < MediaX_dol[1]) && // minima < media
         (rates[1].close >= rates[1].open) && // fechamento >= abertura
         (rates[1].close > MediaX_dol[1]) && // fechamento > media
         ((rates[1].open - rates[1].low) > (rates[1].high - rates[1].open)) && // (abertura - minima) > (maxima - abertura)
         ((rates[1].high - rates[1].low) > candle_size_dol) && // (maxima - minima) > tamanho do candle otimizado
         (rates[1].low < rates[2].low) && // minima < minima anterior
         (rates[2].high > rates[1].high) && //maxima anterior > maxima
         NovaBarra() &&
         HorarioEntrada_Dol())
         return 1;

      // Venda Dolar
      if((rates[1].high > MediaX_dol[1]) && // maxima > media
         (rates[1].low < MediaX_dol[1]) && // minima < media
         (rates[1].close <= rates[1].open) && // fechamento <= abertura
         (rates[1].close < MediaX_dol[1]) && // fechamento < media
         ((rates[1].high - rates[1].open) > (rates[1].open - rates[1].low)) && // (maxima - abertura) > (abertura - minima)
         ((rates[1].high - rates[1].low) > candle_size_dol) && // (maxima - minima) tamanho do candle otimizado
         (rates[1].high > rates[2].high) && // maxima > maxima anterior
         (rates[2].low < rates[1].low) &&  // minima anterior < minima
         NovaBarra() &&
         HorarioEntrada_Dol())
         return -1;
     }

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

   if(InpCondEstoc)
     {
      // Compra Estocástico
      if((Stoch_Array[1] < (100 - stoch_alto)) &&
         ((rates[1].high - rates[1].close) <= pavil_gatilho) &&
         (rates[1].high >= rates[2].high) &&
         (MediaX_estocastico[1] - MediaX_estocastico[n_candles_estocastico] > inclinacao_media_esto) &&
         (rates[1].close - rates[1].open <= candle_size_max) &&
         (rates[1].close - rates[1].open >= candle_size_min) &&
         NovaBarra() &&
         HorarioEntrada_Estocastico()
         /*&& HorarioBloqueioEstocastico()*/)
         return 2;

      // Venda Estocástico
      if((Stoch_Array[1] > stoch_alto) &&
         ((rates[1].close - rates[1].low) <= pavil_gatilho) &&
         (rates[1].low <= rates[2].low) &&
         (MediaX_estocastico[n_candles_estocastico] - MediaX_estocastico[1] > inclinacao_media_esto) &&
         (rates[1].open - rates[1].close <= candle_size_max) &&
         (rates[1].open - rates[1].close >= candle_size_min) &&
         NovaBarra() &&
         HorarioEntrada_Estocastico()
         /*&& HorarioBloqueioEstocastico()*/)
         return -2;
     }

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

   if(InpCondEngol)
     {
      // Compra Engolfo
      if((MediaX_engolfo[1] - MediaX_engolfo[n_candles_engolfo] > inclinacao_media_engolfo) &&     // inclinação da média
         (rates[1].close - rates[2].open >= rates[4].open - rates[3].close) &&                     // corpo [1+2] > corpo [3+4]
         (rates[1].high - rates[1].close < rates[1].close - rates[2].open) &&                      // pavil candle[1] < candle[1+2]
         (rates[2].low >= rates[3].low) &&                                                         // minina[2] >= minima[3]
         (rates[4].low >= rates[3].low) &&                                                         // minima[4] >= minima[3]
         (rates[3].open - rates[3].close > 0) &&                                                   // candle[3] negativo
         (rates[4].open - rates[4].close > 0) &&                                                   // candle[4] negativo
         (rates[4].open - rates[3].close >= candle34_min) &&                                       // candle[3+4] máx.
         (rates[4].open - rates[3].close >= candle34_min) &&                                       // candle[3+4] mín.
         NovaBarra() &&
         HorarioEntrada_Engolfo()
         && HorarioBloqueioEngolfo())
         return 3;

      // Venda Engolfo
      if((MediaX_engolfo[n_candles_engolfo] - MediaX_engolfo[1] > inclinacao_media_engolfo) &&
         (rates[2].open - rates[1].close >= rates[3].close - rates[4].open) &&
         (rates[1].close - rates[1].low < rates[2].open - rates[1].close) &&
         (rates[2].high <= rates[3].low) &&
         (rates[4].high <= rates[3].high) &&
         (rates[3].open - rates[3].close < 0) &&
         (rates[4].open - rates[4].close < 0) &&
         (rates[3].close - rates[4].open >= candle34_min) &&
         (rates[3].close - rates[4].open >= candle34_max) &&
         NovaBarra() &&
         HorarioEntrada_Engolfo()
         && HorarioBloqueioEngolfo())
         return -3;
     }

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

   return 0;
  }
//+------------------------------------------------------------------+
 
Vinicius de Oliveira #:

Ok, o Ricardo já descreveu aqui exatamente como seria... Agora eu vou apenas aplicar a ideia diretamente com o seu código...

Não achei que fosse tão simples. Obrigado pela resposta!
Vou implementar.

 
Marcel Cardoso #:

Não achei que fosse tão simples. Obrigado pela resposta!
Vou implementar.

Teria tambem a possibilidade de retirar isso do EA e colocar em outro separando cada coisa, dai caso precise no mesmo ativo basta abrir outra aba de grafico no mesmo ativo e colocar la. As vezes fica mais facil acompanhar assim via o navegador já que tu vendo o que tem rodando na conta aparecia com os nomes especificos e ativos logo abaixo da conta.

Razão: