Экспорт "Обзор рынка" - "Символы", или списка всех доступных символов, а также "Спецификации" каждого символа в Excel - страница 3

 
Alexey Kolybelnikov:

Даже если сделать как в одном из примеров здесь https://www.mql5.com/en/forum/333100

Все равно получаем не то что показывает в Спецификации брокер.

Вы предположили, что перечисления начинается с 0. Но оно не обязано. Более того, оно не должно быть последовательным (1, 2, 3, 4), а может иметь пропуски.

Вот так должно быть правильно:

//--- определение способа вычисления величины залоговых средств
   int calc_mode=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_CALC_MODE);
   string str_calc_mode;
   switch(calc_mode)
     {
      case SYMBOL_CALC_MODE_FOREX:str_calc_mode="SYMBOL_CALC_MODE_FOREX (Forex)";break;
      case SYMBOL_CALC_MODE_FUTURES:str_calc_mode="SYMBOL_CALC_MODE_FUTURES (фьючерсы)";break;
      case SYMBOL_CALC_MODE_CFD:str_calc_mode="SYMBOL_CALC_MODE_CFD (CFD)";break;
      case SYMBOL_CALC_MODE_CFDINDEX:str_calc_mode="SYMBOL_CALC_MODE_CFDINDEX (CFD на индексы)";break;
      case SYMBOL_CALC_MODE_CFDLEVERAGE:str_calc_mode="SYMBOL_CALC_MODE_CFDLEVERAGE (CFD при торговле с плечом)";break;
      case SYMBOL_CALC_MODE_EXCH_STOCKS:str_calc_mode="SYMBOL_CALC_MODE_EXCH_STOCKS (торговля ценными бумагами на бирже)";break;
      case SYMBOL_CALC_MODE_EXCH_FUTURES:str_calc_mode="SYMBOL_CALC_MODE_EXCH_FUTURES (торговля фьючерсными контрактами на бирже)";break;
      case SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS:str_calc_mode="SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS (торговля фьючерсными контрактами на FORTS)";break;
     }
//--- вывод значения string
   temp_string=StringFormat("   SYMBOL_TRADE_CALC_MODE = %s\n",
                            str_calc_mode);
Документация по MQL5: Преобразование данных / StringFormat
Документация по MQL5: Преобразование данных / StringFormat
  • www.mql5.com
"SYMBOL_SWAP_MODE_INTEREST_CURRENT (в годовых процентах от цены инструмента на момент расчета свопа)" "SYMBOL_SWAP_MODE_REOPEN_CURRENT (переоткрытием позиции по цене закрытия +/- указанное количество пунктов)" "SYMBOL_SWAP_MODE_REOPEN_BID (переоткрытием позиции по текущей цене Bid +/- указанное количество пунктов)"
 
Andrey Khatimlianskii:

Вы предположили, что перечисления начинается с 0. Но оно не обязано. Более того, оно не должно быть последовательным (1, 2, 3, 4), а может иметь пропуски.

Вот так должно быть правильно:

Спасибо. Странно, что они дают этот хороший пример в stringformat, при этом нет никакой ссылки на него с SymbolInfoInteger или ENUM_SYMBOL_INFO_INTEGER

Попробую Ваш пример из Справочника.

Я до Вашего поста плюнул на то что брокер сделал по своему и сделал только перечисление того что брокер указал в терминале.

Решение, которое Вы указали хорошо тем, что как раз проверяет мод расчета маржи, так? То есть оно как универсальное в этом случае для любого брокера?

Например, если брокер показывает в Спецификации для символа CFD (мод №4 в стандартной таблице), а SYMBOL_TRADE_CALC_MODE возвращает цифру мода 6, отличную от стандартной таблицы модов, то Ваше решение позволяет избежать разбежности?

Documentation on MQL5: Market Info / SymbolInfoInteger
Documentation on MQL5: Market Info / SymbolInfoInteger
  • www.mql5.com
2. Returns true or false depending on whether a function is successfully performed. In case of success, the value of the property is placed into a recipient variable, passed by reference by the last parameter. It is recommended to use SymbolInfoTick() if the function is used for getting information about the last tick. It may well be that not a...
 
Alexey Kolybelnikov:

Спасибо. Странно, что они дают этот хороший пример в stringformat, при этом нет никакой ссылки на него с SymbolInfoInteger или ENUM_SYMBOL_INFO_INTEGER

Попробую Ваш пример из Справочника.

Я до Вашего поста плюнул на то что брокер сделал по своему и сделал только перечисление того что брокер указал в терминале.

Решение, которое Вы указали хорошо тем, что как раз проверяет мод расчета маржи, так? То есть оно как универсальное в этом случае для любого брокера?

Например, если брокер показывает в Спецификации для символа CFD (мод №4 в стандартной таблице), а SYMBOL_TRADE_CALC_MODE возвращает цифру мода 6, отличную от стандартной таблицы модов, то Ваше решение позволяет избежать разбежности?

Еще раз прочтите про перечисления. SYMBOL_TRADE_CALC_MODE используется один на всех.

Документация по MQL5: Основы языка / Типы данных / Целые типы / Перечисления
Документация по MQL5: Основы языка / Типы данных / Целые типы / Перечисления
  • www.mql5.com
После объявления перечисления появляется новый целочисленный 4-байтовый тип данных. Объявление нового типа данных позволяет компилятору строго контролировать типы передаваемых параметров, так как  перечисление вводит новые именованные константы. В приведенном примере именованная константа January имеет значение 0, February имеет значение 1...
 
Andrey Khatimlianskii:

Еще раз прочтите про перечисления. SYMBOL_TRADE_CALC_MODE используется один на всех.

Спасибо Вам огромное за тот пример - он работает идеально!

Про перечисления перечитывал не раз - в теории оно понятно, а вот дойдет только с практикой :)

Например, мой вариант

string SymbolCalcMode(int Mode)
       {
       switch(Mode)
        {
        case 0: return("Forex");
        case 2: return("CFD");
        case 5: return("Forex(no leverage)");
        default: return("Unknown Margin Calc.");
        }
        return("tried");
       }

вообще не годится, так как не универсальный для любого брокера. 

А Ваш вариант получается проверяет каждое перечисление и присваивает его переменной str_calc_mode, так?

Например в этом случае

case SYMBOL_CALC_MODE_FOREX:str_calc_mode="SYMBOL_CALC_MODE_FOREX (Forex)";break;

именно благодаря двоеточию между SYMBOL_CALC_MODE_FOREX и str_calc_mode происходит проверка на это конкретное перечисление, да?

 
Экспорт символов и их настроек из обзора рынка сделаем в csv формате с описанием заголовков
 
Alexey Kolybelnikov:

Спасибо Вам огромное за тот пример - он работает идеально!

Про перечисления перечитывал не раз - в теории оно понятно, а вот дойдет только с практикой :)

Например, мой вариант

вообще не годится, так как не универсальный для любого брокера. 

А Ваш вариант получается проверяет каждое перечисление и присваивает его переменной str_calc_mode, так?

Например в этом случае

именно благодаря двоеточию между SYMBOL_CALC_MODE_FOREX и str_calc_mode происходит проверка на это конкретное перечисление, да?

SYMBOL_CALC_MODE_FOREX может иметь любое значение (0, 1, 25, 1984). Мы об этом не знаем.

Поэтому нужно сравнивать SymbolInfoInteger(_Symbol,SYMBOL_TRADE_CALC_MODE) именно с SYMBOL_CALC_MODE_FOREX, а не с любым числом. Этим и занимается switch-case.

 
Renat Fatkhullin:
Экспорт символов и их настроек из обзора рынка сделаем в csv формате с описанием заголовков
Да, спасибо, этим и занимаюсь. Пока получается. Хотя так как увеличилось количество столбцов, теперь понимаю почему массивы лучше, чем запись построчно в CSV
 
Andrey Khatimlianskii:

SYMBOL_CALC_MODE_FOREX может иметь любое значение (0, 1, 25, 1984). Мы об этом не знаем.

Поэтому нужно сравнивать SymbolInfoInteger(_Symbol,SYMBOL_TRADE_CALC_MODE) именно с SYMBOL_CALC_MODE_FOREX, а не с любым числом. Этим и занимается switch-case.

спасибо Вам огромное. Своим последним вопросом я не мог разобраться на каком этапе SymbolInfoInteger выдает enum как string (текст)? Так как SymbolInfoInteger имеет тип int, то ведь и возвращает цифру (на которую я ошибочно ориентировался), но кроме этого как я понял возвращает enum. Но для того чтоб получить enum как текст я должен сначала узнать тот ли это тип enum, так? Для этого  case проверяет каждое значение с enum от SymbolInfoIntege, так? Вопрос: как case может сравнивать если SymbolInfoInteger возвращает int а не string (текст)?

 
Alexey Kolybelnikov:

спасибо Вам огромное. Своим последним вопросом я не мог разобраться на каком этапе SymbolInfoInteger выдает enum как string (текст)? Так как SymbolInfoInteger имеет тип int, то ведь и возвращает цифру (на которую я ошибочно ориентировался), но кроме этого как я понял возвращает enum. Но для того чтоб получить enum как текст я должен сначала узнать тот ли это тип enum, так? Для этого  case проверяет каждое значение с enum от SymbolInfoIntege, так? Вопрос: как case может сравнивать если SymbolInfoInteger возвращает int а не string (текст)?

Попробуйте еще вот так разобраться. Может, нагляднее будет:

   ENUM_SYMBOL_CALC_MODE calc_mode = (ENUM_SYMBOL_CALC_MODE)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_CALC_MODE);
   string str_calc_mode;
   switch ( calc_mode )
   {
        case SYMBOL_CALC_MODE_FOREX: str_calc_mode = "forex"; break;
        ....
   }
 
StringSubstr(EnumToString(ENUM_SYMBOL_CALC_MODE(SymbolInfoInteger(_Symbol,SYMBOL_TRADE_CALC_MODE))),17);

ленивый вариант, но 17-ли - нужно проверить, может обсчитался :)

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