Erreurs, bugs, questions - page 810

 

J'ai une suggestion à faire aux développeurs : créez des valeurs par défaut pour tous les types intégrés. Le C++ n'est pas un modèle dans ce sens.

Vous économiserez vraiment beaucoup de temps et de nerfs pour vous-même et pour ceux qui répondent aux questions comme ci-dessus.

 
Fia:


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

Quels sont les problèmes ou est-ce que je comprends mal quelque chose ?
qu'est-ce qu'un?
 
sergeev:
qu'est-ce qui est égal à un?

Par défaut (dans l'exemple ci-dessus), a=2,652664430987377e-314 , mais dans ce cas, la boucle while donne a+b=30.

Bien entendu, vous pouvez immédiatement attribuer le double a=1 ;

Mais la situation ne change pas.

La sortie est toujours a+b=30

Et return retourne 0, le débogueur montre tout.

 
Fia:

Quels sont ces problèmes ou est-ce que je rate quelque chose ?

Initialisation des variables:

Toute variable peut être initialisée lors de sa définition. Si la variable n'est pas explicitement initialisée, la valeur stockée dans la variable peut être ce que vous voulez. L'initialisation implicite n'est pas effectuée.

 

Fia:

La sortie est toujours a+b=30

Et return retourne 0, le débogueur montre tout.

Je trouve ça difficile à croire.
 
sergeev:
J'ai du mal à le croire.

Qu'est-ce qui vous empêche d'y jeter un coup d'œil ?

Spécialement pour cela, j'ai donné un code simple.

J'ai deux builds de 687 (sur des brokers différents), j'ai essayé de compiler les deux avec le même résultat (mais parfois j'obtiens 30 correctement), je n'arrive pas à comprendre si je suis bête ou si le ski ne bouge pas !

Je ne sais pas quoi penser.

 

Jusqu'à présent, il n'a pas été possible de le reproduire. Commençons donc par le début.

Quel débit binaire, OS ?

 
alexvd:

Pas encore de chance avec la reproduction.

Quel débit binaire, OS ?

Win7 64 bit

Je ne sais même pas, je viens juste de décharger et de charger MT5 compilé, même chose.

Je peux en prendre une photo (vous pourriez penser que je me moque de vous).

P.S. Maintenant j'ai juste tapé dessus, une fois de plus ça a marché 30, je l'ai compilé et maintenant ça marche null quelques fois de plus (magique).

 

Bon après-midi.

J'essaie d'utiliser MQL5.J'ai désassemblé exp_tema.mq5 et modifié le code. Maintenant je dois imprimer en log MA de chaque bougie (20 dernières). Mais je ne comprends pas pourquoi certaines entrées manquent dans le journal. J'ai remarqué que si ma[3] est manquant dans le journal, alors il n'y a pas de ma[13]. Pourquoi cela se produit-il ? Où se trouve l'erreur ?

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 bit

Je ne sais pas, je viens de décharger MT5, j'ai fait un commentaire, même chose.

Je peux enlever une vidéo ou autre (je pense que je me moque de vous).

Vous n'avez pas besoin d'une capture d'écran.

Faites une Impression détaillée dans le code pour que nous puissions voir dans le journal à quoi sont égales les variables intermédiaires.