Новая версия платформы MetaTrader 5 build 2940: Перенос витрин MQL5-сервисов в рабочую область и обновление дизайна - страница 19

 

В какой момент индексы перечисления ENUM_APPLIED_PRICE в MQL5 были смещены на единицу? Ранее PRICE_CLOSE равнялся нулю. Сейчас единице. В стандартной библиотеке таким образом появился нерабочий метод:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Общайтесь с разработчиками через Сервисдеск!

Mikhail Dovbakh, 2021.06.14 03:33

В стандартной библиотеке обнаружил архаичный и приводящий к неверному результату метод преобразования ENUM to String.

//| Converting value of ENUM_APPLIED_PRICE into string               |
//+------------------------------------------------------------------+
string CIndicator::PriceDescription(const int val) const
  {
   string str;
//--- array for conversion of ENUM_APPLIED_PRICE to string
   static string _a_str[]={"Close","Open","High","Low","Median","Typical","Weighted"};
//--- check
   if(val<0)
      return("Unknown");
//---
   if(val<7)
      str=_a_str[val];
   else
     {
      if(val<10)
         str="PriceUnknown="+IntegerToString(val);
      else
         str="AppliedHandle="+IntegerToString(val);
     }
//---
   return(str);
  }

Запуск такого скрипта приводит к разным результатам в MQL5 и в MQL4:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   for(int i=0;i<11;i++)
     {
      Print("ENUM_APPLIED_PRICE(",i,")=",EnumToString((ENUM_APPLIED_PRICE)i));
     }
  }
//+------------------------------------------------------------------+

В MQL4 (как и некогда ранее в MQL5) результат такой:

ENUM_APPLIED_PRICE(0)=PRICE_CLOSE
ENUM_APPLIED_PRICE(1)=PRICE_OPEN
ENUM_APPLIED_PRICE(2)=PRICE_HIGH
ENUM_APPLIED_PRICE(3)=PRICE_LOW
ENUM_APPLIED_PRICE(4)=PRICE_MEDIAN
ENUM_APPLIED_PRICE(5)=PRICE_TYPICAL
ENUM_APPLIED_PRICE(6)=PRICE_WEIGHTED
ENUM_APPLIED_PRICE(7)=ENUM_APPLIED_PRICE::7
ENUM_APPLIED_PRICE(8)=ENUM_APPLIED_PRICE::8
ENUM_APPLIED_PRICE(9)=ENUM_APPLIED_PRICE::9
ENUM_APPLIED_PRICE(10)=ENUM_APPLIED_PRICE::10

В MQL5 теперь стало так:

ENUM_APPLIED_PRICE(0)=ENUM_APPLIED_PRICE::0
ENUM_APPLIED_PRICE(1)=PRICE_CLOSE
ENUM_APPLIED_PRICE(2)=PRICE_OPEN
ENUM_APPLIED_PRICE(3)=PRICE_HIGH
ENUM_APPLIED_PRICE(4)=PRICE_LOW
ENUM_APPLIED_PRICE(5)=PRICE_MEDIAN
ENUM_APPLIED_PRICE(6)=PRICE_TYPICAL
ENUM_APPLIED_PRICE(7)=PRICE_WEIGHTED
ENUM_APPLIED_PRICE(8)=ENUM_APPLIED_PRICE::8
ENUM_APPLIED_PRICE(9)=ENUM_APPLIED_PRICE::9
ENUM_APPLIED_PRICE(10)=ENUM_APPLIED_PRICE::10

Это теперь так и будет? Или это ошибка?

 
Artyom Trishkin:

В какой момент индексы перечисления ENUM_APPLIED_PRICE в MQL5 были смещены на единицу? Ранее PRICE_CLOSE равнялся нулю. Сейчас единице.

Хорошо бы проверить все перечисления. Много кода держится на преобразовании Enum->Integer.
 
Artyom Trishkin:

В какой момент индексы перечисления ENUM_APPLIED_PRICE в MQL5 были смещены на единицу? Ранее PRICE_CLOSE равнялся нулю. Сейчас единице.

Странно, что это раньше не сделали

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Пожелания для МТ5

A100, 2012.11.25 11:21

Хотелось бы, чтобы предопределенные enum вида ENUM_XXX фактически эквивалентные RadioButton нумеровались с 1, в то время как сейчас нумеруются по умолчанию, т.е. с 0

А то не понятно было, 0 - это нет значения (как при обнулении) или есть
 
A100:

Странно, что это раньше не сделали

А то не понятно, 0 - это нет значения (как при обнулении) или есть

Забыв при этом обновить СБ ?

В принципе логично, но таки см. п1.

 
fxsaber:
Хорошо бы проверить все перечисления. Много кода держится на преобразовании Enum->Integer.

Да. Вот только времени на всё это где бы взять...

 
Artyom Trishkin:

Да. Вот только времени на всё это где бы взять...

А ты все не проверяй. Проверь только ENUM_TIMEFRAMES и забудь про преобразование Enum->Integer.

 
Artyom Trishkin :

В какой момент индексы перечисления ENUM_APPLIED_PRICE в MQL5 были смещены на единицу? Ранее PRICE_CLOSE равнялся нулю. Сейчас единице. В стандартной библиотеке таким образом появился нерабочий метод:

Запуск такого скрипта приводит к разным результатам в MQL5 и в MQL4:

В MQL4 (как и некогда ранее в MQL5) результат такой:

В MQL5 теперь стало так:

Это теперь так и будет? Или это ошибка?

Так было всегда. Нет причин, по которым значение должно быть таким же.
 
Alexey Viktorov:

А ты все не проверяй. Проверь только ENUM_TIMEFRAMES и забудь про преобразование Enum->Integer.

На то они и перечисления, чтобы можно было быстро найти нужные данные по индексу константы перечисления. А если индексы будут ворошить туда-сюда, то это уже будут не коды, а дышло.

 
Artyom Trishkin:

В какой момент индексы перечисления ENUM_APPLIED_PRICE в MQL5 были смещены на единицу? Ранее PRICE_CLOSE равнялся нулю. Сейчас единице. В стандартной библиотеке таким образом появился нерабочий метод:


Это теперь так и будет? Или это ошибка?

Нужно использовать именно имена перечислений, а не их значения. В справке не даются значения элементов перечисления https://www.mql5.com/ru/docs/constants/indicatorconstants/prices

Идентификатор

Описание

PRICE_CLOSE

Цена закрытия

PRICE_OPEN

Цена открытия

PRICE_HIGH

Максимальная за период цена

PRICE_LOW

Минимальная за период цена

PRICE_MEDIAN

Медианная цена, (high+low)/2

PRICE_TYPICAL

Типичная цена, (high+low+close)/3

PRICE_WEIGHTED

Средневзвешенная цена, (high+low+close+close)/4

Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Ценовые константы
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Ценовые константы
  • www.mql5.com
Ценовые константы - Константы индикаторов - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Rashid Umarov:

Нужно использовать именно имена перечислений, а не их значения. В справке не даются значения элементов перечисления https://www.mql5.com/ru/docs/constants/indicatorconstants/prices

Идентификатор

Описание

PRICE_CLOSE

Цена закрытия

PRICE_OPEN

Цена открытия

PRICE_HIGH

Максимальная за период цена

PRICE_LOW

Минимальная за период цена

PRICE_MEDIAN

Медианная цена, (high+low)/2

PRICE_TYPICAL

Типичная цена, (high+low+close)/3

PRICE_WEIGHTED

Средневзвешенная цена, (high+low+close+close)/4

Да всё бы ничего, но тогда и в СБ нужно поправить, на что и было указано выше.

Код из "\MQL5\Include\Indicators\Indicator.mqh":

//+------------------------------------------------------------------+
//| Converting value of ENUM_APPLIED_PRICE into string               |
//+------------------------------------------------------------------+
string CIndicator::PriceDescription(const int val) const
  {
   string str;
//--- array for conversion of ENUM_APPLIED_PRICE to string
   static string _a_str[]={"Close","Open","High","Low","Median","Typical","Weighted"};
//--- check
   if(val<0)
      return("Unknown");
//---
   if(val<7)
      str=_a_str[val];
   else
     {
      if(val<10)
         str="PriceUnknown="+IntegerToString(val);
      else
         str="AppliedHandle="+IntegerToString(val);
     }
//---
   return(str);
  }
//+------------------------------------------------------------------+