Есть ли словари/ассоциативные массивы в mql5?

 

Доброе утро

Нашел такой код в библиотеке:

string fTimeFrameName(int arg)
  {
   int v;
   if(arg==0)
     {
      v=_Period;
     }
   else
     {
      v=arg;
     }
   switch(v)
     {
      case PERIOD_M1:    return("M1");
      case PERIOD_M2:    return("M2");
      case PERIOD_M3:    return("M3");
      case PERIOD_M4:    return("M4");
      case PERIOD_M5:    return("M5");
      case PERIOD_M6:    return("M6");
      case PERIOD_M10:   return("M10");
      case PERIOD_M12:   return("M12");
      case PERIOD_M15:   return("M15");
      case PERIOD_M20:   return("M20");
      case PERIOD_M30:   return("M30");
      case PERIOD_H1:    return("H1");
      case PERIOD_H2:    return("H2");
      case PERIOD_H3:    return("H3");
      case PERIOD_H4:    return("H4");
      case PERIOD_H6:    return("H6");
      case PERIOD_H8:    return("H8");
      case PERIOD_H12:   return("H12");
      case PERIOD_D1:    return("D1");
      case PERIOD_W1:    return("W1");
      case PERIOD_MN1:   return("MN1");
      default:    return("?");
     }
  }

 

 На мой взгляд такой код эффективнее можно бы было реализовать при помощи ассоциативных массивов или словарей.

Но, ни того, ни другого в документации не нашел. 

 
dicos:

Доброе утро

Нашел такой код в библиотеке:

 

 На мой взгляд такой код эффективнее можно бы было реализовать при помощи ассоциативных массивов или словарей.

Но, ни того, ни другого в документации не нашел. 

Потому что их нет. Делать надо.))
 
dicos:

Доброе утро

Нашел такой код в библиотеке:

 

 На мой взгляд такой код эффективнее можно бы было реализовать при помощи ассоциативных массивов или словарей.

Но, ни того, ни другого в документации не нашел. 

Двойка тому кто писал. Конкретно для этого участка словарь не нужен. Вот более лаконичный вариант:

string TimeFrameToString(ENUM_TIMEFRAMES timeframe)
  {
   if(timeframe == PERIOD_CURRENT)
      timeframe = _Period;
   string strTimeframe = EnumToString(timeframe);
   return StringSubstr(strTimeframe, 7);
  }
А вообще словарь и хеш-таблица - одни из фундаментальных и важнейших алгоритмов в программировании. Странно что их нет на уровне стандартной библиотеки.
 
C-4:

Двойка тому кто писал. Конкретно для этого участка словарь не нужен. Вот более лаконичный вариант:

А вообще словарь и хеш-таблица - одни из фундаментальных и важнейших алгоритмов в программировании. Странно что их нет на уровне стандартной библиотеки.

А что тогда вернёт эта функция в случае "нестандартного" периода?

void OnStart()
{
  ENUM_TIMEFRAMES period=PERIOD_M30;
  period++;
  Print(TimeFrameToString(period));
}

string TimeFrameToString(ENUM_TIMEFRAMES timeframe)
  {
   if(timeframe == PERIOD_CURRENT)
      timeframe = _Period;
   string strTimeframe = EnumToString(timeframe);
   return StringSubstr(strTimeframe, 7);
  }
 

А в языке mql5 вообще много чего "интересного" в стиле доработай напильником:

datetime FirstDateRAM(ENUM_TIMEFRAMES period=PERIOD_M1)
{
  datetime time=0;
  while(!IsStopped())
  {
    if(SeriesInfoInteger(Symbol(),period,SERIES_FIRSTDATE,time)) {break;} else {Sleep(1);}
  }
  return(time);
}
 
Fleder:

А что тогда вернёт эта функция в случае "нестандартного" периода?

Защита перечислений - не задача этой функции, а задача языка в целом. Возвращаемое значение "?" столь же проблемно как и "MEMFRAMES::31"
 
C-4:
Проблема защиты перечислений - не проблема этой функции, а проблема языка в целом. Возвращаемое значение "?" столь же проблемно как и "MEMFRAMES::31"
А как же "внегласная концепция" разработчиков АТС - программировать в стиле параноика-писсимиста?!
 
Fleder:
  А как же "внегласная концепция" разработчиков АТС - программировать в стиле параноика-писсимиста?! 

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

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

 
Fleder:
А как же "внегласная концепция" разработчиков АТС - программировать в стиле параноика-писсимиста?!
Если язык не строго типизирован то Вы хоть миллион проверок делайте но безопасность кода не повысите. Пример выше показателен. Первая версия функции "в случае чего" возвращает строку "?". Проблема в том что "?" не чуть не лучше "MEMFRAMES::31", т.к. и в том и в другом случае результат неопределен. Если эта строка будет в дальнейшем участвовать в важных преобразованиях то стабильное выполнение программы будет под вопросом, в лучшем варианте программа завершит работу аварийным сбоем, в худшем случае начнет время от времени проявляться странный глюк связанный с отображением тайфрейма.
 
C-4:
Если язык не строго типизирован то Вы хоть миллион проверок делайте но безопасность кода не повысите. Пример выше показателен. Первая версия функции "в случае чего" возвращает строку "?". Проблема в том что "?" не чуть не лучше "MEMFRAMES::31", т.к. и в том и в другом случае результат неопределен. Если эта строка будет в дальнейшем участвовать в важных преобразованиях то стабильное выполнение программы будет под вопросом, в лучшем варианте программа завершит работу аварийным сбоем, в худшем случае начнет время от времени проявляться странный глюк связанный с отображением тайфрейма.

Однако первый вариант любую "неопределённость" идентифицирует как "?" - и дальше программа  можно сделать вывод об ошибке и принять "меры".

Второй же вариант будет возвращать для каждой  "неопределённости"  разное значение. Ошибку выловить будет трудно...

 
Fleder:

Однако первый вариант любую "неопределённость" идентифицирует как "?" - и дальше программа  можно сделать вывод об ошибке и принять "меры".

Второй же вариант будет возвращать для каждой  "неопределённости"  разное значение. Ошибку выловить будет трудно...

Специально для Вас (как реализовать универсальную проверку перечислений подумайте сами):
string TimeFrameToString(ENUM_TIMEFRAMES timeframe)
  {
   if(!CheckValidEnum(timeframe))
      return "?";
   if(timeframe == PERIOD_CURRENT)
      timeframe = _Period;
   string strTimeframe = EnumToString(timeframe);
   return StringSubstr(strTimeframe, 7);
  }
Но повторяю, проблему это не решает.
Причина обращения: