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

 
Nikolai Semko #:

Понятно. 
Ох, уж этот коридор затмений...

у меня на демо идет время, с того времени как нет связи и уже 40 часов.

 
Nikolai Semko #:

Не пропускает новые версии продуктов, хотя до этого было все без ошибок.


Похоже что проблемы не у меня.
build 3110

Вчера у нас были проблемы с подключением в серверу MetaQuotes-Demo, который используется в том числе для валидации продуктов Маркета.

Мы исправили данную ошибку вчера и заново провели проверку всех продуктов, которые не смогли пройти валидацию по техническим причинам.

Приносим извинения за доставленные неудобства.

Если мы случайно пропустили ваш продукт и не запустили заново его проверку, просим вас сделать это самостоятельно. Сейчас проверка должна работать штатным образом.

 

Вот образец кода:

//+------------------------------------------------------------------+
#property strict
//+------------------------------------------------------------------+
void OnStart()
  {
  uint iCurrent =722;
  int  iinterval=1000;         
  int  iNext=(int)(iCurrent-iinterval/2); // 722-500=222
  Print ("Current :",iCurrent);
  Print ("iNext   :",iNext);
  long  temp=(long)(iNext-iCurrent); //предупреждений нет ожидаем Лонг -500
  Print ( " temp (long):",temp);//int - uint ->uint Result: uint -- oшибка!

  Print ( " delta(&int)"+string((int)(iNext-iCurrent)));    // неожиданный успех  
  Print ( " delta(&long)"+string((long)(iNext-iCurrent)));  // опять штанга
  //-----------------------------------
 }

Результат:

2021.11.23 13:07:35.931 testUint (Volatility 75 Index,M15)      Current :722
2021.11.23 13:07:35.932 testUint (Volatility 75 Index,M15)      iNext   :222
2021.11.23 13:07:35.932 testUint (Volatility 75 Index,M15)       temp (long):4294966796
2021.11.23 13:07:35.932 testUint (Volatility 75 Index,M15)       delta(&int)-500
2021.11.23 13:07:35.932 testUint (Volatility 75 Index,M15)       delta(&long)4294966796

Кто-то может пояснить - почему 

long  temp=(long)(iNext-iCurrent);

дает 

4294966796

а не -500.

Что-то совсем голова не варит... (

 
Mikhail Dovbakh #:

Вот образец кода:

Результат:

Кто-то может пояснить - почему 

дает 

а не -500.

Что-то совсем голова не варит... (

long temp=(long)iNext-iCurrent;

https://www.mql5.com/ru/docs/basis/types/casting

У вас получилось сначала приведение iNext к беззнаковому целому. Потом беззнаковый целый результат приведён к лонгу.

В моём примере iNext сразу приводится к типу long, поэтому iCurrent тоже приводится к типу long, только неявно. Результат сразу типа long

Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Приведение типов - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Slava #:

Вопрос был, почему такой порядок типов дает не правильный результат. Могу предположить только, что зависит от порядка иерархии типов в выражении. Если типы расположены в порядке иерархии в выражении по ходу исполнения, то ответ правильный, а если нет, то не явное приведение типа с нарушением иерархии может изменить значение переменной. 

long temp=(long)((int)iNext-(uint)iCurrent); 

Зы В общем не явное приведение типов и при этом нарушение иерархии.

 
MetaQuotes #:

Вчера у нас были проблемы с подключением в серверу MetaQuotes-Demo, который используется в том числе для валидации продуктов Маркета.

Мы исправили данную ошибку вчера и заново првоели проверку всех продуктов, которые не смогли пройти валидацию по технитческим причинам.

Приносим извинения за доставленные неудобства.

Если мы случайно пропустили ваш продукт и не запустили заново его проверку, просим вас сделать это самостоятельно. Сейчас проверка должны работать штатным образом.

Спасибо!
Теперь всё работает.
 
Slava #:

https://www.mql5.com/ru/docs/basis/types/casting

У вас получилось сначала приведение iNext к беззнаковому целому. Потом беззнаковый целый результат приведён к лонгу.

В моём примере iNext сразу приводится к типу long, поэтому iCurrent тоже приводится к типу long, только неявно. Результат сразу типа long

тогда пояните почему 

 Print ( " delta(&int)"+string((int)(iNext-iCurrent)));    // неожиданный успех 

и

int itemp=(int)(iNext-iCurrent); 


дает правильный результат?

Следуя  Вашему описанию   сначала приведение iNext к беззнаковому целому. Потом беззнаковый целый результат приводится к целому с приобретением знака.

Правильно?

 

Трендовая линия не примагничивается к Low красной свечи (EURUSD, M5; Точная шкала времени; Примагничивание: 15)


 
Mikhail Dovbakh #:

тогда пояните почему 

и

int itemp=(int)(iNext-iCurrent); 


дает правильный результат?


Запросто

беззнаковое целое длиной 32 бита 4294966796 при приведении к знаковому целому той же размерности даёт -500

 
Valeriy Yastremskiy #:

Вопрос был, почему такой порядок типов дает не правильный результат. Могу предположить только, что зависит от порядка иерархии типов в выражении. Если типы расположены в порядке иерархии в выражении по ходу исполнения, то ответ правильный, а если нет, то не явное приведение типа с нарушением иерархии может изменить значение переменной. 

Зы В общем не явное приведение типов и при этом нарушение иерархии.

Я уже привёл ссылку https://www.mql5.com/ru/docs/basis/types/casting

Там всё очень подробно написано. Прочитайте от начала и до конца, ничего не пропуская

Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Приведение типов - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Причина обращения: