Спецификация символа VS MQL5

 

Спецификация символа и доступ к свойствам символа через MQL5 дают разные результаты: точнее через спецификацию символа маржа видна, а через MQL5 - возвращает ноль.


Код советника (уже поставил на каждом тике обновлять данные по символу - Refresh) - всё равно возвращаются нули

//+------------------------------------------------------------------+
//|                                                       Margin.mq5 |
//|                              Copyright © 2018, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2018, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//---
#include <Trade\SymbolInfo.mqh>  
CSymbolInfo    m_symbol;                     // symbol info object
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!m_symbol.Name(Symbol()))
      return(false);
   if(!m_symbol.Refresh())
      return(false);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(!m_symbol.Refresh())
      return;
//---
   string text="Margins and flags:"+"\n";
   text=text+"\"MarginInitial\": "+DoubleToString(m_symbol.MarginInitial(),8)+"\n";
   text=text+"\"MarginMaintenance\": "+DoubleToString(m_symbol.MarginMaintenance(),8)+"\n";
   text=text+"\"MarginLong\": "+DoubleToString(m_symbol.MarginLong(),8)+"\n";
   text=text+"\"MarginShort\": "+DoubleToString(m_symbol.MarginShort(),8)+"\n";
   text=text+"\"MarginLimit\": "+DoubleToString(m_symbol.MarginLimit(),8)+"\n";
   text=text+"\"MarginStop\": "+DoubleToString(m_symbol.MarginStop(),8)+"\n";
   text=text+"\"MarginStopLimit\": "+DoubleToString(m_symbol.MarginStopLimit(),8)+"\n";

   Comment(text);
  }
//+------------------------------------------------------------------+
Файлы:
Margin.mq5  5 kb
 

Эту информация должна быть получена специальным запросом SymbolInfoMarginRate

SymbolInfoDouble возвращает нули

 
Slava:

Эту информация должна быть получена специальным запросом SymbolInfoMarginRate

SymbolInfoDouble возвращает нули

Спасибо, проверю. Если это так, торговый класс CSymbolInfo будет подправлен? И тогда выходит, что и справку по SymbolInfoDouble тоже нужно править?
 
Проверил. Да, через SymbolInfoMarginRate работает.
 
Vladimir Karputov:
  И тогда выходит, что и справку по SymbolInfoDouble тоже нужно править?

Изначально запрос SymbolInfoDouble() для получения маржи был достаточно простой, и этого хватало. Но по мере добавления новых рынков/инструментов возникла необходимость добавить отдельную специализированную функцию SymbolInfoMarginRate.  В справку для SYMBOL_MARGIN_INITIAL и SYMBOL_MARGIN_MAINTENANCE добавим ссылку на SymbolInfoMarginRate

 
Vladimir Karputov:
Спасибо, проверю. Если это так, торговый класс CSymbolInfo будет подправлен? И тогда выходит, что и справку по SymbolInfoDouble тоже нужно править?

Нужно смотреть код и понимать как править. Функция не может расширить сознание и понять, какой тип маржи у неё спрашивают

 
Rashid Umarov:

Нужно смотреть код и понимать как править. Функция не может расширить сознание и понять, какой тип маржи у неё спрашивают

Согласен насчёт расширения сознания :).

CSymbolInfo методы

MarginLimit

Получает коэффициент взимания маржи по Limit ордерам

MarginStop

Получает коэффициент взимания маржи по Stop ордерам

MarginStopLimit

Получает коэффициент взимания маржи по Stop Limit ордерам


нужно заменить на MarginBuyLimit, MarginSellLimit, MarginBuyStop, MarginSellStop, MarginBuyStopLimit и MarginSellStopLimit - а они уже в свою очередь вместо SymbolInfoDouble будут обращаться к SymbolInfoMarginRate с соответствующим типом ордера.

А 

MarginLong

Получает коэффициент взимания маржи по длинным позициям

MarginShort

Получает коэффициент взимания маржи по коротким позициям


оставить, но также переписать на SymbolInfoMarginRate.

 
Vladimir Karputov:
Проверил. Да, через SymbolInfoMarginRate работает.


подскажите пожалуйста как записать SymbolInfoMarginRate чтоб получить margin rate по символу? это ведь bool, а нужно получить double. я не пойму как ей воспользоваться, чтоб получить именно margin rat, а не  false/true

Я не программист, но методом "тыка" все получилось. Сделал так:

double marginInit, marginMain;
double marginRate=SymbolInfoMarginRate(symbol,ORDER_TYPE_BUY,marginInit,marginMain);

я просто "допонял", что переменные коэфициентов выводятся после этой функции :)

Документация по MQL5: Получение рыночной информации / SymbolInfoMarginRate
Документация по MQL5: Получение рыночной информации / SymbolInfoMarginRate
  • www.mql5.com
[in] Переменная типа double для получения коэффициента взимания начальной маржи. Начальная маржа – это размер гарантийной суммы под совершение сделки объемом в 1 лот соответствующего направления. Умножая коэффициент на начальную маржу, мы можем получить размер средств, который будет зарезервирован на счете при размещении ордера указанного типа...
 
Alexey Kolybelnikov:


подскажите пожалуйста как записать SymbolInfoMarginRate чтоб получить margin rate по символу? это ведь bool, а нужно получить double. я не пойму как ей воспользоваться, чтоб получить именно margin rat, а не  false/true

Справку плохо смотрели. 3й и 4й параметры возвращают значения.

 
Edgar Akhmadeev:

Справку плохо смотрели. 3й и 4й параметры возвращают значения.

они то возвращают, но примера не было. мне как не программисту не сразу было понятно, что задавая переменные, можно потом вывести их значения. Спасибо, все получилось ;)
 
Alexey Kolybelnikov:


подскажите пожалуйста как записать SymbolInfoMarginRate чтоб получить margin rate по символу? это ведь bool, а нужно получить double. я не пойму как ей воспользоваться, чтоб получить именно margin rat, а не  false/true

Я не программист, но методом "тыка" все получилось. Сделал так:

double marginInit, marginMain;
double marginRate=SymbolInfoMarginRate(symbol,ORDER_TYPE_BUY,marginInit,marginMain);

я просто "допонял", что переменные коэфициентов выводятся после этой функции :)

Неправильно Вы написали свой код. Нельзя результат bool присваивать переменной типа double.

Смотрим справку SymbolInfoMarginRate - 

bool  SymbolInfoMarginRate(
   string             name,                     // символ
   ENUM_ORDER_TYPE    order_type,               // тип ордера
   double&            initial_margin_rate,      // коэффициент взимания начальной маржи
   double&            maintenance_margin_rate   // коэффициент взимания поддерживающей маржи
   );

Возвращаемое значение

Возвращает true в случае удачного выполнения запроса свойств, иначе false.


Следовательно Ваш код должен быть таким:

double marginInit, marginMain;
if(!SymbolInfoMarginRate(symbol,ORDER_TYPE_BUY,marginInit,marginMain))
   {
    //ERROR
   }
Документация по MQL5: Получение рыночной информации / SymbolInfoMarginRate
Документация по MQL5: Получение рыночной информации / SymbolInfoMarginRate
  • www.mql5.com
[in] Переменная типа double для получения коэффициента взимания начальной маржи. Начальная маржа – это размер гарантийной суммы под совершение сделки объемом в 1 лот соответствующего направления. Умножая коэффициент на начальную маржу, мы можем получить размер средств, который будет зарезервирован на счете при размещении ордера указанного типа...