Ошибки, баги, вопросы - страница 810

 

У меня предложение к разработчикам -- сделайте значения по умолчанию у всех встроенных типов. С++ в этом смысле не эталон для подражания.

Ну ведь реально кучу времени и нервов сэкономите себе и отвечающим, на отсутствии вопросов как сверху.

 
Fia:


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

Чего за глюки или я чего-то недопонимаю???
чему равен a ?
 
sergeev:
чему равен a ?

По умолчанию (в примере выше)  а=2.652664430987377e-314 , но при этом цикл while отрабатывает свое в итоге a+b=30.

Можно конечно сразу присвоить double a=1;

Но положение дел у меня не меняется при этом.

На выходе всегда a+b=30 

А return возвращает 0  , по отладчику это все видно.

 
Fia:

Чего за глюки или я чего-то недопонимаю???

Инициализация переменных :

Любая переменная при определении может быть инициализирована. Если не произведена явная инициализация переменной, то значение, хранящееся в данной переменной, может быть каким угодно. Неявная инициализация не производится.

 

Fia:

На выходе всегда a+b=30 

А return возвращает 0  , по отладчику это все видно.

верится с трудом.
 
sergeev:
верится с трудом.

Чего мешает взять и проверить?

Специально привел для этого код простенький.

У меня в двух билдах 687 (на разных брокерах)  такое пробывал компилить на обоих результат одинаков (но иногда поподало что правильно 30 выдавал), не могу понять то ли я тупой то ли лыжи не едут!?

Проверьте я уже не знаю чего и думать.

 

Пока не получается воспроизвести. А потому начнем с начала.

Какая битность, ОС? 

 
alexvd:

Пока не получается воспроизвести.

Какая битность, ОС?

Win7 64 bit

Даже не знаю, сейчас только что выгрузил загрузил MT5  прокомпилировал, все тоже самое.

Могу видюшку чтоль снять (а то подумают прикалываюсь).

P.S. Сейчас её трыкал, опять один раз сработала 30 выдала, компильнул и еще несколько раз по нулям уже выдает (мистика)

 

Добрый день.

Пытаюсь разобратся с MQL5.  Разобрал exp_tema.mq5 и переделал код. Сейчас должен печатать в журнале MA каждой свечи (последние 20 ). Но не понимаю, почему журнале отсутствует некоторые записи. Заметил,  если в журнале отсутствует ma[3] тогда и не будет ma[13]. Почему это происходит? Где там ошибка?

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

Даже не знаю, сейчас только что выгрузил загрузил MT5  прокомпилировал, все тоже самое.

Могу видюшку чтоль снять (а то подумают прикалываюсь).

видюшку не надо.

сделайте в коде подробное Print, чтоб мы в журнале посмотрели чему равны промежуточные переменные.

Причина обращения: