Erro no calculo

 
void OnTick()
{
                  datetime dia = iTime(_Symbol, PERIOD_D1, 0);
                  datetime mes = iTime(_Symbol, PERIOD_MN1, 0);
                  
                  ganho_dia_robo10 = Results(dia, MN_robo10);
                  ganho_mes_robo10 = Results(mes, MN_robo10);
                  
                  double total_dia =   ganho_dia_robo10;
                  double total_mes =   ganho_mes_robo10;
               
                  if(IsNewBar())
                     candle_traded = false;
                     
                  if(!SymbolInfoTick(Symbol(),ultimoTick)){
                     Alert("Erro ao obter informações de Preços: ", GetLastError());
                     return;
                  }
                  
                  if(!simbolo.RefreshRates())
                     return;

                  bool posAberta = false;
                  for(int i = PositionsTotal()-1; i>=0; i--){
                     string symbol = PositionGetSymbol(i);
                     ulong magic = PositionGetInteger(POSITION_MAGIC);
                     if(symbol == _Symbol && magic == MN_robo10){
                        posAberta = true;
                        break;
                     }
                  }

                  bool ordPendente = false;
                  for(int i = OrdersTotal()-1; i>=0; i--){
                     ulong ticket = OrderGetTicket(i);
                     string symbol = OrderGetString(ORDER_SYMBOL);
                     ulong magic = OrderGetInteger(ORDER_MAGIC);
                     if(symbol == _Symbol && magic == MN_robo10){
                        ordPendente = true;
                        break;
                     }
                  }
                  if(posAberta == false && ordPendente == true) DeleteOrdens();

                  if(SemPosicao() && SemOrdem()){
                     int resultado_cruzamento = Condicao_Operacao();
                     if(resultado_cruzamento != 0){
                        if(HorarioEntrada_10()){

                           if(resultado_cruzamento == 1 && !candle_traded && DiasHab_R10()){
                              contratos = liberado_operar();
                              Compra_10();
                              candle_traded = true;
                           }
                           if(resultado_cruzamento == -1 && !candle_traded && DiasHab_R10()){
                              contratos = liberado_operar();
                              Venda_10();
                              candle_traded = true;

                           }
                        }
                     }
                  }

   if(HorarioFechamento()){
      if(!SemPosicao() || !SemOrdem()){
         Fechar();
         //encerrou_dia = 0;
         num_ctt_r10 = 0;
      }
   }
}

int liberado_operar(){
   MqlRates rates[];
   ArraySetAsSeries(rates, true);
   CopyRates(_Symbol, _Period, 0, 5, rates);
   
   int h = ((g1() && Hab_Gap == true) + (g2() && Hab_MaxMin == true) + (g3() && Hab_Corpo == true) + (g4() && Hab_pc_Corpo == true));
   
   return h;
}

int g1(){ // GAP
   double aberturaD0 = iOpen(_Symbol, PERIOD_D1, 0);
   double fechamentoD1 = iClose(_Symbol, PERIOD_D1, 1);
   if(aberturaD0 > fechamentoD1) gap = aberturaD0 - fechamentoD1; // gap acima
   if(aberturaD0 < fechamentoD1) gap = fechamentoD1 - aberturaD0; // gap abaixo
   
   if((gap >= 0 && gap <= 75) || 
      (gap >= 195 && gap <= 385) || 
      (gap >= 480 && gap <= 600)) return 1;
   
   return 0;
}

int g2(){ // MAX - MIN
   if(TimeCurrent() < StringToTime("10:00")) primeira_hora = 0; 
   if(TimeCurrent() > StringToTime("10:00") && TimeCurrent() < StringToTime("11:00")) primeira_hora = 1;
   if(TimeCurrent() > StringToTime("11:00") && TimeCurrent() < StringToTime("12:00")) primeira_hora = 2;
   if(TimeCurrent() > StringToTime("12:00") && TimeCurrent() < StringToTime("13:00")) primeira_hora = 3;
   if(TimeCurrent() > StringToTime("13:00") && TimeCurrent() < StringToTime("14:00")) primeira_hora = 4;
   if(TimeCurrent() > StringToTime("14:00") && TimeCurrent() < StringToTime("15:00")) primeira_hora = 5;
   if(TimeCurrent() > StringToTime("15:00") && TimeCurrent() < StringToTime("16:00")) primeira_hora = 6;
   if(TimeCurrent() > StringToTime("16:00") && TimeCurrent() < StringToTime("17:00")) primeira_hora = 7;
   if(TimeCurrent() > StringToTime("17:00") && TimeCurrent() < StringToTime("18:00")) primeira_hora = 8;
   
   double maxima60 = iHigh(_Symbol, PERIOD_H1, primeira_hora);
   double minima60 = iLow(_Symbol,PERIOD_H1, primeira_hora);
   double max_min = maxima60 - minima60;
   
   if((max_min >= 215 && max_min <= 330) || 
      (max_min >= 470 && max_min <= 1605)) return 1;
   
   return 0;
}

int g3(){ // CORPO
   if(TimeCurrent() < StringToTime("10:00")) primeira_hora = 0; 
   if(TimeCurrent() > StringToTime("10:00") && TimeCurrent() < StringToTime("11:00")) primeira_hora = 1;
   if(TimeCurrent() > StringToTime("11:00") && TimeCurrent() < StringToTime("12:00")) primeira_hora = 2;
   if(TimeCurrent() > StringToTime("12:00") && TimeCurrent() < StringToTime("13:00")) primeira_hora = 3;
   if(TimeCurrent() > StringToTime("13:00") && TimeCurrent() < StringToTime("14:00")) primeira_hora = 4;
   if(TimeCurrent() > StringToTime("14:00") && TimeCurrent() < StringToTime("15:00")) primeira_hora = 5;
   if(TimeCurrent() > StringToTime("15:00") && TimeCurrent() < StringToTime("16:00")) primeira_hora = 6;
   if(TimeCurrent() > StringToTime("16:00") && TimeCurrent() < StringToTime("17:00")) primeira_hora = 7;
   if(TimeCurrent() > StringToTime("17:00") && TimeCurrent() < StringToTime("18:00")) primeira_hora = 8;
   
   double abertura60 = iOpen(_Symbol,PERIOD_H1, primeira_hora);
   double fechamento60 = iClose(_Symbol,PERIOD_H1, primeira_hora);
   if(abertura60 < fechamento60) corpo60 = fechamento60 - abertura60; // candle 60 positivo
   if(abertura60 > fechamento60) corpo60 = abertura60 - fechamento60; // candle 60 negativo
   
   if((corpo60 >= 0 && corpo60 <= 70) ||
      (corpo60 >= 160 && corpo60 <= 225) ||
      (corpo60 >= 390 && corpo60 <= 1165)) return 1;
   
   return 0;
}

int g4(){ // %CORPO
   if(TimeCurrent() < StringToTime("10:00")) primeira_hora = 0; 
   if(TimeCurrent() > StringToTime("10:00") && TimeCurrent() < StringToTime("11:00")) primeira_hora = 1;
   if(TimeCurrent() > StringToTime("11:00") && TimeCurrent() < StringToTime("12:00")) primeira_hora = 2;
   if(TimeCurrent() > StringToTime("12:00") && TimeCurrent() < StringToTime("13:00")) primeira_hora = 3;
   if(TimeCurrent() > StringToTime("13:00") && TimeCurrent() < StringToTime("14:00")) primeira_hora = 4;
   if(TimeCurrent() > StringToTime("14:00") && TimeCurrent() < StringToTime("15:00")) primeira_hora = 5;
   if(TimeCurrent() > StringToTime("15:00") && TimeCurrent() < StringToTime("16:00")) primeira_hora = 6;
   if(TimeCurrent() > StringToTime("16:00") && TimeCurrent() < StringToTime("17:00")) primeira_hora = 7;
   if(TimeCurrent() > StringToTime("17:00") && TimeCurrent() < StringToTime("18:00")) primeira_hora = 8;
   
   double abertura60 = iOpen(_Symbol,PERIOD_H1, primeira_hora);
   double fechamento60 = iClose(_Symbol,PERIOD_H1, primeira_hora);
   double maxima60 = iHigh(_Symbol, PERIOD_H1, primeira_hora);
   double minima60 = iLow(_Symbol,PERIOD_H1, primeira_hora);
   double max_min = maxima60 - minima60;
   if(abertura60 < fechamento60) corpo60 = fechamento60 - abertura60; // candle 60 positivo
   if(abertura60 > fechamento60) corpo60 = abertura60 - fechamento60; // candle 60 negativo
   double percent_corpo60 = NormalizeDouble(corpo60/max_min, 2);
   
   if((percent_corpo60 >= 0.00 && percent_corpo60 <= 0.41) ||
      (percent_corpo60 >= 0.64 && percent_corpo60 <= 0.75)) return 1;
      
   return 0;
}

bool HorarioEntrada_10(){
   TimeToStruct(TimeCurrent(), horario_atual);
   if(horario_atual.hour == horario_inicio_10.hour && horario_atual.min == horario_inicio_10.min)
      return true;
   return false;
}

bool HorarioFechamento(){
   TimeToStruct(TimeCurrent(), horario_atual);
   if(horario_atual.hour >= horario_fechamento.hour){
      if(horario_atual.hour == horario_fechamento.hour)
         if(horario_atual.min >= horario_fechamento.min)
            return true;
         else
            return false;
      return true;
     }
   return false;
}

void Compra_10(){
   trade.SetExpertMagicNumber(MN_robo10);
   double preco_entrada = simbolo.Ask();  
   Print("liberado_op compra ="+IntegerToString(liberado_operar()));
   
   trade.Buy(  contratos,                     // volume
               _Symbol,                         // simbolo
               preco_entrada,                   // preco entrada
               preco_entrada - SL_10,           // SL
               0,                               // TP
               "Robo10-win");                   // comentário
               
   trade.SellLimit(  contratos,               // volume
                     preco_entrada + TP_10,     // TP (Ordem limit)
                     _Symbol,                   // símbolo
                     0,                         // tp (Não aplicável) 
                     0,                         // sl (Não aplicável)
                     ORDER_TIME_DAY,            // tipo expiração
                     0,                         // expiração
                     "Robo10-win-limit");       // comentário
}

void Venda_10(){
   trade.SetExpertMagicNumber(MN_robo10);
   double preco_entrada = simbolo.Bid();
   
   Print("liberado_op venda ="+IntegerToString(liberado_operar()));
   
   trade.Sell( contratos,                     // volume
               _Symbol,                         // simbolo
               preco_entrada,                   // preco entrada
               preco_entrada + SL_10,           // SL 
               0,                               // TP
               "Robo10-win");                   // comentario
               
   trade.BuyLimit( contratos,                 // volume
                  preco_entrada - TP_10,        // TP (Ordem limit)
                  _Symbol,                      // símbolo
                  0,                            // tp (Não aplicável)
                  0,                            // sl (Não aplicável)
                  ORDER_TIME_DAY,               // tipo da expiração
                  0,                            // expiração
                  "Robo10-win-limit");          // comentário

}

int Condicao_Operacao(){
   MqlRates rates[];
   ArraySetAsSeries(rates, true);
   CopyRates(_Symbol, _Period, 0, 60, rates);

   if(HabM10 && liberado_operar() >= num_condicoes){
   // Compra Robo 10
      if(rates[1].open - rates[1].close > 0 &&
         rates[1].close >= rates[n_10].close)
         return 1;
   // Venda Robo 10
      if(rates[1].close - rates[1].open > 0 &&
         rates[1].close <= rates[n_10].close)
         return -1;
   }
   
   return 0;
}

Estou com esse robô testando e finalizando. Como pode ser observado o numero de contratos que será aberto na operação depende do numero de condições que foram cumpridas no momento da entrada. Porém quando eu rodo no simulador, o numero de condições esta dando 4 e o numero de contratos que esta sendo aberto é 2. Para mim não faz sentido, o calculo é direto. Alguem poderia me dar uma luz?

 
Marcel Cardoso:

Estou com esse robô testando e finalizando. Como pode ser observado o numero de contratos que será aberto na operação depende do numero de condições que foram cumpridas no momento da entrada. Porém quando eu rodo no simulador, o numero de condições esta dando 4 e o numero de contratos que esta sendo aberto é 2. Para mim não faz sentido, o calculo é direto. Alguem poderia me dar uma luz?

Acredito que se tocar a condição do IF para dentro das funções g* e so chamar elas sem condicional vai resolver. A condição deve estar forçando tudo pra booleano, minha teoria.
 

Tive preguiça de ler o código todo, mas o que notei é que você está apostando em que todas as funções "í" funcionam de primeira, o que não é verdade... Cheque a documentação de novo...


;)

 
Ricardo Rodrigues Lucca #:
Acredito que se tocar a condição do IF para dentro das funções g* e so chamar elas sem condicional vai resolver. A condição deve estar forçando tudo pra booleano, minha teoria.

não entendi. qual funcao if vc diz?

 
Marcel CardosoEstou com esse robô testando e finalizando. Como pode ser observado o numero de contratos que será aberto na operação depende do numero de condições que foram cumpridas no momento da entrada. Porém quando eu rodo no simulador, o numero de condições esta dando 4 e o numero de contratos que esta sendo aberto é 2. Para mim não faz sentido, o calculo é direto. Alguem poderia me dar uma luz?

Certeza que Hab_Gap, Hab_MaxMin, Hab_Corpo e Hab_pc_Corpo estão TODAS habilitadas (true)?

 
Marcel Cardoso #:

não entendi. qual funcao if vc diz?

o da contagem de checagem, tenho minha duvida se não esta sendo convertendo tudo pra booleano e depois virando int e isso dando o resultado inconsistente, dai recomendaria algo como abaixo.

int liberado_operar(){
   
   int h = 0;
   if (Hab_Gap)
     h += g1();
   if (Hab_MaxMin)
     h += g2();
   if (Hab_Corpo)
     h += g3();
   if (Hab_pc_Corpo)
     h += g4();       

   return h;
}
Ou modificar cada função pra ter esses if* internamente e devolver zero quando desabilitado dai basta somar aqui.