SymbolInfoDouble проблемы получения данных с Московской биржи через брокера FINAM.

 
Уже год бьюсь за то что бы по облигациям и другим инструментам стандартные процедуры по символу выдавали нужные параметры. Самое примитивное это минимумы и максимумы торгов(планки). Дюрацию для облигаций и НКД. ФИНАМ Сообщает что это проблема МТ5 и специалисты не хотят поддерживать этот терминал для фонды. Хотя я торговал на БКС пока МТ5 не отключили. Там все работало и вместо 0 выдавались нужные значения. 

Я конечно обошел этот косяк с использованием API Мосбиржи через WebRequest но очень хотелось бы, что бы стандартные процедуры возвращали нужные значения вместо нуля. 
Это Баг MT5?  Или это Баг Финама? 

Пример получения значения. Не парюсь. Использую линейное программирование.
//+------------------------------------------------------------------+
//|                                                          GSP.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property script_show_inputs
//--- input parameters
input string   symbolname;
// Все поля по этому запросу
// https://iss.moex.com/iss/engines/stock/markets/shares/securities/columns
// 
struct MoeExchSymbolInfo
  {
   string            SECID; //Идентификатор финансового инструмента
   //<column name="BOARDID" type="string" bytes="12" max_size="0"/> //Идентификатор режима торгов
   //<column name="SHORTNAME" type="string" bytes="75" max_size="0"/> //Краткое наименование ценной бумаги
   //<column name="SECNAME" type="string" bytes="225" max_size="0"/>
   double            PREVSETTLEPRICE; //Цена последней сделки нормального периода предыдущего торгового дня
   LOTSIZE;
   int               DECIMALS;
   double            MINSTEP;
   datetime          LASTTRADEDATE;
   datetime          LASTDELDATE;
   //<column name="SECTYPE" type="string" bytes="6" max_size="0"/>
   //<column name="LATNAME" type="string" bytes="90" max_size="0"/>
   //<column name="ASSETCODE" type="string" bytes="75" max_size="0"/>
   uint              PREVOPENPOSITION;
   int               LOTVOLUME;
   double            INITIALMARGIN;
   double            HIGHLIMIT;
   double            LOWLIMIT;
   double            STEPPRICE;
   double            LASTSETTLEPRICE;
   double            PREVPRICE;
   datetime          IMTIME;
   double            BUYSELLFEE;
   double            SCALPERFEE;
   double            NEGOTIATEDFEE;
   double            EXERCISEFEE;
   double            SPREAD; // Спред
   double            OPEN;
   double            HIGH;
   double            LOW;
   double            LAST;
   int               QUANTITY;
   double            LASTCHANGE;
   double            SETTLEPRICE;
   double            SETTLETOPREVSETTLE;
   double            OPENPOSITION;
   int               NUMTRADES;
   uint              VOLTODAY;
   uint              VALTODAY;
   uint              VALTODAY_USD;
   datetime          UPDATETIME;
   double            LASTCHANGEPRCNT;
   datetime          TIME;
   double            SETTLETOPREVSETTLEPRC;
   uint              SEQNUM;
   datetime          SYSTIME;
   datetime          TRADEDATE;
   double            LASTTOPREVPRICE;
   uint              OICHANGE;
   double            OPENPERIODPRICE;
   double            SWAPRATE;
  };
MoeExchSymbolInfo a_moex_symbol;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   fill_moex_symbol_info(a_moex_symbol, "SVM4");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool fill_moex_symbol_info(MoeExchSymbolInfo &moex_symbol, const string symbol)
  {
   string cookie=NULL,headers;
   char   post[],result[];
// при изменении обратить внимание                VV              VV
   string url="https://iss.moex.com/iss/engines/futures/markets/forts/securities/"+symbol+".xml";
   ResetLastError();
//--- Downloading a XML page from MOEX
   int res=WebRequest("GET",url,cookie,NULL,500,post,0,result,headers);
   if(res==-1)
     {
      Print("Error in WebRequest. Error code  =",GetLastError());
      //--- Perhaps the URL is not listed, display a message about the necessity to add the address
      MessageBox("Add the address '"+url+"' to the list of allowed URLs on tab 'Expert Advisors'","Error",MB_ICONINFORMATION);
      return(false);
     }
   else
     {
      if(res==200)
        {
         string s=CharArrayToString(result,0,ArraySize(result),CP_UTF8);
         moex_symbol.HIGHLIMIT = GetDoubleFromString(GetParam(s,"HIGHLIMIT"));
         moex_symbol.LOWLIMIT = GetDoubleFromString(GetParam(s,"LOWLIMIT"));
         moex_symbol.BUYSELLFEE = GetDoubleFromString(GetParam(s,"BUYSELLFEE"));
         moex_symbol.SCALPERFEE = GetDoubleFromString(GetParam(s,"SCALPERFEE"));
        }
     }
   return(true);
  }
//+------------------------------------------------------------------+
//|    Выделение параметра из строки                                 |
//+------------------------------------------------------------------+
string GetParam(const string str, const string par)
  {
   int start = StringFind(str,par+"=",0);
   if(start >= 0)
     {
      int end = StringFind(str,"\" ",start);
      if(end > start)
        {
         return(StringSubstr(str,start,end-start+1));
        }
     }
   return("");
  }

//+------------------------------------------------------------------+
double GetDoubleFromString(const string str)
  {
   int startPos = StringFind(str, "\"") + 1;  // Находим позицию открывающей кавычки
   int endPos = StringFind(str, "\"", startPos);  // Находим позицию закрывающей кавычки

   if(startPos >= 0 && endPos >= 0)  // Проверяем, что оба символа найдены
     {
      string numberStr = StringSubstr(str, startPos, endPos - startPos);  // Выделяем подстроку между кавычками
      double number = StringToDouble(numberStr);  // Преобразуем строку в число
      //      Print("Выделенное число: ", number);
      return(number);
     }
   else
     {
      Print("Кавычки не найдены");
      return(-1);
     }
  }
//+------------------------------------------------------------------+
 
Я вот тут показывал, чего у них нет, и эту картинку им отправлял. Вроде, говорят, что сделают. Но не могут уточнить сроки, дни это или месяцы. Думаю, это вопрос настроек сервера. Но, возможно, им это сложно из-за слабой поддержки разработчика (такие слухи есть).
 
JRandomTrader #:
Я вот тут показывал, чего у них нет, и эту картинку им отправлял. Вроде, говорят, что сделают. Но не могут уточнить сроки, дни это или месяцы. Думаю, это вопрос настроек сервера. Но, возможно, им это сложно из-за слабой поддержки разработчика (такие слухи есть).

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

 
Aleksandr Dziuba:
Уже год бьюсь за то что бы по облигациям и другим инструментам стандартные процедуры по символу выдавали нужные параметры. Самое примитивное это минимумы и максимумы торгов(планки). Дюрацию для облигаций и НКД. ФИНАМ Сообщает что это проблема МТ5 и специалисты не хотят поддерживать этот терминал для фонды. Хотя я торговал на БКС пока МТ5 не отключили. Там все работало и вместо 0 выдавались нужные значения. 

Я конечно обошел этот косяк с использованием API Мосбиржи через WebRequest но очень хотелось бы, что бы стандартные процедуры возвращали нужные значения вместо нуля. 
Это Баг MT5?  Или это Баг Финама? 

Пример получения значения. Не парюсь. Использую линейное программирование.
Интересно, какое ограничение по запросам. А то мне некоторые данные надо отслеживать на каждом тике. Очень быстро можно будет в бан наверное улететь.
 
Scarick #:
Интересно, какое ограничение по запросам. А то мне некоторые данные надо отслеживать на каждом тике. Очень быстро можно будет в бан наверное улететь.

Ну по торговым знаю что не более 500 в секунду. По запросам к бирже не знаю.  Интересно, какой параметр нужно получать  на каждом тике?

 
Aleksandr Dziuba #:

Поэтому пришлось сделать полную замену через прямой доступ к бирже. 

К сожалению, это неполная замена, некоторые поля пустые.

UPDATETIME="09:24:38" LASTCHANGEPRCNT="0" BIDDEPTH="" BIDDEPTHT="" NUMBIDS="" OFFERDEPTH="" OFFERDEPTHT="" NUMOFFERS="" 

Вероятно, придётся добывать из Квика.

 
JRandomTrader #:

К сожалению, это неполная замена, некоторые поля пустые.

Вероятно, придётся добывать из Квика.

А платформы, тип, площадку  поменяли? Есть запросы которые работают только по подписке. Но об этом написано в самом API. 
ISS Queries (moex.com)
Можно не писать код, а сначала посмотреть что нужно. 
Мне нужны были именно те параметры о которых я писал. Возможно Ваши лежат в другом запросе. Но смысл не меняется. Это первоисточник.  

 
Aleksandr Dziuba #:

А платформы, тип, площадку  поменяли? Есть запросы которые работают только по подписке. Но об этом написано в самом API. 
ISS Queries (moex.com)
Можно не писать код, а сначала посмотреть что нужно. 
Мне нужны были именно те параметры о которых я писал. Возможно Ваши лежат в другом запросе. Но смысл не меняется. Это первоисточник.  

Вот я показал те поля и по тому инструменту, которые мне нужны.

https://iss.moex.com/iss/engines/futures/markets/forts/securities/SiZ3.xml

И там пусто. Вероятно, по подписке.

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

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