Errores, fallos, preguntas - página 810

 

Tengo una sugerencia para los desarrolladores - hacer valores por defecto para todos los tipos incorporados. C++ no es un modelo en este sentido.

Realmente te ahorrarás mucho tiempo y nervios para ti y para los que respondan a las preguntas como las anteriores.

 
Fia:


   while((a/b)<1 && !IsStopped())//---------

¿Cuáles son los fallos o estoy entendiendo algo mal?
¿qué es un?
 
sergeev:
¿a qué equivale una?

Por defecto (en el ejemplo anterior) a=2,652664430987377e-314 , pero en este caso el bucle while llega a a+b=30.

Por supuesto, puedes asignar inmediatamente el doble a=1;

Pero la situación no cambia.

La salida es siempre a+b=30

Y el retorno devuelve 0 , el depurador lo muestra todo.

 
Fia:

¿Qué son estos fallos o me estoy perdiendo algo?

Inicialización de variables:

Cualquier variable puede ser inicializada cuando se define. Si la variable no se inicializa explícitamente, el valor almacenado en la variable puede ser el que se desee. No se realiza la inicialización implícita.

 

Fia:

La salida es siempre a+b=30

Y el retorno devuelve 0 , el depurador lo muestra todo.

Me resulta difícil de creer.
 
sergeev:
Apenas puedo creerlo.

¿Qué le impide comprobarlo?

Especialmente para este propósito he dado un código simple.

¡Tengo dos builds del 687 (en diferentes brokers), he intentado compilar ambos con el mismo resultado (pero a veces me sale el 30 correctamente), no puedo entender si soy tonto o el esquí no se mueve!

Comprueba que no sé qué pensar.

 

Hasta ahora, no ha sido posible reproducirlo. Así que empecemos por el principio.

¿Qué tasa de bits, OS?

 
alexvd:

Todavía no ha habido suerte con la reproducción.

¿Qué tasa de bits, OS?

Win7 64 bits

Ni siquiera sé, acaba de descargar ahora cargado MT5 compilado, lo mismo.

Puedo hacerle una foto (puede pensar que le estoy tomando el pelo).

P.D. Ahora acabo de tocarlo, una vez más funcionó 30, lo compilé y ahora funciona nulo unas cuantas veces más (magia)

 

Buenas tardes.

Estoy tratando de usar MQL5.He desmontado exp_tema.mq5 y he modificado el código. Ahora debería imprimir en log MA de cada vela (últimas 20). Pero no entiendo por qué faltan algunas entradas en el registro. Me he dado cuenta de que si falta ma[3] en el registro, entonces no hay ma[13]. ¿Por qué ocurre esto? ¿Dónde está el error?

input string            Symb0 = "EURUSD";
input  bool            Trade0 = true;
int MA_Shift0=1;
input int MA_Per0 = 100;
//+-----------------------------------+
input string            Symb1 = "USDCHF";
input  bool            Trade1 = true;
int MA_Shift1=1;
input int MA_Per1 = 100;

bool MA (int Number,
         string  Symbol_,           // имя символа
         bool    Trade,
         int     MA_Per,         // период для расчета средней линии
         int     MA_Shift          // смещение индикатора по горизонтали              
        )

  {
//---- проверка запрета на торговлю
   if(!Trade)return(true);

//---- объявление переменной для хранения итогового размера массивов переменных
   static int Size_=0;

//---- объявление массива для хранения хэндлов индикаторов как статической переменной
   static int Handle[];
  static int Recount[],MinBars[];
  double ma[20];
  
  
     if(Number+1>Size_) // вход в блок инициализации только на первом старте
     {
      Size_=Number+1; // для этого номера вход в блок закрыт
        //---- изменение размеров массивов переменных
      ArrayResize(Handle,Size_);
      ArrayResize(Recount,Size_);
      ArrayResize(MinBars,Size_);

      //---- определение минимально количества баров, достаточного для расчета 
      MinBars[Number]=3*MA_Per;
      
            //---- предварительное обнуление ячеек массивов

      
       //---- используем массив как таймсерию
      ArraySetAsSeries(ma,true);

      //---- получение хендла индикатора
      
      Handle[Number]=iMA(Symbol_,0,MA_Per,MA_Shift,MODE_SMA,PRICE_CLOSE);  
      
      Print("+++++++++Handle[Number]= ",Handle[Number]);
     }


 //---- проверка количества баров на достаточность для расчета 
   if(Bars(Symbol_,0)<MinBars[Number])return(true);
   //---- Получение торговых сигналов 
   if(IsNewBar(Number,Symbol_,0) || Recount[Number]) // вход в блок на смене бара или при неудачном копировании данных
     {
      
      //---- используя хэндлы индикатора, копируем значения индикаторного буфера
      //---- в специально подготовленный для этого статический массив
      if(CopyBuffer(Handle[Number],0,0,20,ma)<0)
        {
         Recount[Number]=true; // так как данные не получены, то следует вернуться 
                               // в этот блок получения торговых сигналов на следующем тике!
         return(false);        // выходим из функции TradeSignalCounter() без получения торговых сигналов
        }
      //---- все операции копирования из индикаторного буфера завершены успешно
      Recount[Number]=false; // можно не возвращаться в этот блок до очередной смены бара
      
      
 
 Print("+++++++++ma[0]= ",ma[0]);     
 Print("+++++++++ma[1]= ",ma[1]);
 Print("+++++++++ma[2]= ",ma[2]);
 Print("+++++++++ma[3]= ",ma[3]);
 Print("+++++++++ma[4]= ",ma[4]);
 Print("+++++++++ma[5]= ",ma[5]);
 Print("+++++++++ma[6]= ",ma[6]);
 Print("+++++++++ma[7]= ",ma[7]);
 Print("+++++++++ma[8]= ",ma[8]);
 Print("+++++++++ma[9]= ",ma[9]);
 Print("+++++++++ma[10]= ",ma[10]);     
 Print("+++++++++ma[11]= ",ma[11]);
 Print("+++++++++ma[12]= ",ma[12]);
 Print("+++++++++ma[13]= ",ma[13]);
 Print("+++++++++ma[14]= ",ma[14]);
 Print("+++++++++ma[15]= ",ma[15]);
 Print("+++++++++ma[16]= ",ma[16]);
 Print("+++++++++ma[17]= ",ma[17]);
 Print("+++++++++ma[18]= ",ma[18]);
 Print("+++++++++ma[19]= ",ma[19]);
      
     }
  
  return(true);
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
MA(0,Symb0,Trade0,MA_Per0,MA_Shift0);
MA(1,Symb1,Trade1,MA_Per1,MA_Shift1);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| IsNewBar() function                                              |
//+------------------------------------------------------------------+
bool IsNewBar(int Number,string symbol,ENUM_TIMEFRAMES timeframe)
  {
//----
   static datetime Told[];
   datetime Tnew[1];
//---- объвление переменной для хранения размеров массивов переменных
   static int Size_=0;

//---- изменение размеров массивов переменных
   if(Number+1>Size_)
     {
      uint size=Number+1;
      //----
      if(ArrayResize(Told,size)==-1)
        {
         string word="";
         StringConcatenate(word,"IsNewBar( ",Number,
                           " ): Ошибка!!! Не удалось изменить размеры массивов переменных!!!");
         Print(word);
         //----          
         int error=GetLastError();
         ResetLastError();
         if(error>4000)
           {
            StringConcatenate(word,"IsNewBar( ",Number," ): Код ошибки ",error);
            Print(word);
           }
         //----                                                                                                                                                                                                  
         Size_=-2;
         return(false);
        }
     }

   CopyTime(symbol,timeframe,0,1,Tnew);
   if(Tnew[0]!=Told[Number])
     {
      Told[Number]=Tnew[0];
      return(true);
     }
//----
   return(false);
  }
 
Fia:

Win7 64 bits

No sé, acaba de descargar MT5 ahora, corrió una copia, lo mismo.

Puedo sacar un video o algo así (creo que me estoy metiendo contigo).

No es necesario hacer una captura de pantalla.

Haz una impresión detallada en el código para que podamos ver en el registro a qué son iguales las variables intermedias.

Razón de la queja: