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

 

Что-то не пойму "где собака зарыта", код работает, все OK, а вот предупреждения компилятора  possible loss of data due to type conversion    Indi.mqh    125    45  заставляют задуматься.


//+------------------------------------------------------------------+
//|Получение значений позиций в средe BB цены AppPrice,Fast/Slow TEMA|
//+------------------------------------------------------------------+

void CIndi::SetPricePositions(ushort SymbolPosition,ushort Index,uchar AppPrice)
  {
   int handle=GetHandle(SymbolPosition,BANDS);
   double Upper =Upper_Band(handle,Index);
   double Base  =Base_Band(handle,Index);
   double Lower =Lower_Band(handle,Index);
   double FTema =GetValuesFromIndi(GetHandle(SymbolPosition,TEMA_FAST),0,Index);
   double STema =GetValuesFromIndi(GetHandle(SymbolPosition,TEMA_SLOW),0,Index);
   
   Bollinger[SymbolPosition][PRICE_POSITION]=(double)GetPricePos(handle,Index,AppPrice); ???
   Bollinger[SymbolPosition][FAST_POSITION] =(double)Custom.Position(Lower,Upper,FTema); ???
   Bollinger[SymbolPosition][SLOW_POSITION] =(double)Custom.Position(Lower,Upper,STema); ???
   Bollinger[SymbolPosition][UPPER]         =(double)Upper; ???
   Bollinger[SymbolPosition][BASE]          =(double)Base;  ???
   Bollinger[SymbolPosition][LOWER]         =(double)Lower; ???
  }
Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Предупреждения компилятора
Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Предупреждения компилятора
  • www.mql5.com
Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Предупреждения компилятора - Документация по MQL5
 

Разработчикам.

Насколько я понял, вопрос со свопами решили? Или тогда не понятно почему тема исчезла из сервисдеска.....

 

При тестировании советника

void OnTick(){
   Print(iTest());
}
//+------------------------------------------------------------------+
int iTest(){
   double i;
   int j;
   for(int x=3; x>0; x--) { 
      i=i+0.00001;
   }//Next x
   j=int(i/_Point);
   return(j);
}//iTest()

 В журнале отобразится постоянно увеличивающееся число! Так и должно быть?

В MQL4 для такого эффекта нужно было писать

static double i;

 

 
EvgeTrofi:

При тестировании советника

 В журнале отобразится постоянно увеличивающееся число! Так и должно быть?

Да, так и должно быть.

Вы не инициализировали локальную переменную i, которая при последующих вызовах выделялась в том же самом месте стека, как и на предыдущих вызовах.

Документация по MQL5: Основы языка / Переменные / Локальные переменные
Документация по MQL5: Основы языка / Переменные / Локальные переменные
  • www.mql5.com
Основы языка / Переменные / Локальные переменные - Документация по MQL5
 
Renat:

Да, так и должно быть.

Вы не инициализировали локальную переменную i, которая при последующих вызовах выделялась в том же самом месте стека, как и на предыдущих вызовах.

Тогда в каком случае нужно использовать класс памяти static?

Непонятное предложение в справке "Локальные переменные, объявленные как static, имеют областью действия блок, несмотря на то, что они существуют с самого начала выполнения программы" растолкуйте пожалуйста. Такое впечатление, что во фразе закралась синтаксическая или грамматическая очепятка :)

Обратите внимание на пример в справке: https://www.mql5.com/ru/docs/basis/variables/static

Если из кода убрать слово static, то ничего не поменяется: 

int Counter()
  {
   int count;
   count++;
   if(count%100==0) Print("Функция Counter была вызвана уже ",count," раз");
   return count;
  }
void OnStart()
  {
//---
   int c=345;
   for(int i=0;i<1000;i++)
     {
      int c=Counter();
     }
   Print("c = ",c);
  }

 Вопрос: Зачем вообще нужен static, если без него тоже самое?

Документация по MQL5: Основы языка / Переменные / Статические переменные
Документация по MQL5: Основы языка / Переменные / Статические переменные
  • www.mql5.com
Основы языка / Переменные / Статические переменные - Документация по MQL5
 
ALozovoy:
Здравствуйте. В описании [Tester] у Вас не хватает параметра ExpertParameters. Более подробно о нем можно узнать в справке.

Спасибо, заработало.

 


Скажите пожалуйста, с какой вообще целью была добавлена возможность объявлять переменные внутри блоков? Раньше при таком случае:

  
int c;    for(int i=0;i<1000;i++)      {        int  c=Counter(); }

 Раньше бы всплыло окошечко, что прямая объявлена дважды и было понятно, что нужно придумывать другое название для переменной или использовать эту же, но без int. А сейчас можно запутаться. На С++ тоже так?

(Я до изучения MQL программировал на Visual Basic. Там такого безобразия не было)

 
EvgeTrofi:

Тогда в каком случае нужно использовать класс памяти static?


Нет.

Если вы создали переменную int i; , то почему ее не проинициализировали? Фактически Вы сами сказали "мне не важно что в этой переменной" и в результате получили в ней мусор.

Правильно надо делать так: int i=0;

На С++ тоже так?

Да, все верно - можно внутри блока создавать такие переменные.
 

Столкнулся с проблей на Windows 7 64 bit на 306 Билде терминала  (Windows 7 32 bit всё работает нормально). 

Файлы:
mql64.png  52 kb
 
VanHelsing:

Столкнулся с проблей на Windows 7 64 bit на 306 Билде терминала  (Windows 7 32 bit всё работает нормально). 

Выложите, пожалуйста, в сервисдеске кусок кода, на котором проявляется такая ситуация.