Почему не работают функции определения маржи?

 

Пишу индикатор, выяснил, что не работают функции в CAccountInfo по определению маржи.

// пишу в OBJ_LABEL, получаю нули

CSymbolInfo m_symbolInfo; 

ObjectSetString(0,"SIP_"+lNames[0],OBJPROP_TEXT,lNames[0]+DoubleToString(m_symbolInfo.MarginInitial(),2));
ObjectSetString(0,"SIP_"+lNames[0],OBJPROP_TEXT,lNames[0]+DoubleToString(m_symbolInfo.MarginMaintenance(),2));

Полез в код класса, сделан он топорно, надо вызвать его метод Refresh(), после чего заполняется туева хуча полей, в т.ч. и по марже. Вытянул эти методы отдельно, то же самое - одни нули. 

   m_symbolInfo.Refresh();
   m_symbolInfo.RefreshRates();

   string m_name = _Symbol;
   double m_margin_initial=0, m_margin_maintenance=0, m_margin_long=0, m_margin_short=0, m_margin_limit=0, m_margin_stop=0, m_margin_stoplimit=0;
   if(!SymbolInfoDouble(m_name,SYMBOL_MARGIN_INITIAL,m_margin_initial))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_MARGIN_MAINTENANCE,m_margin_maintenance))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_MARGIN_LONG,m_margin_long))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_MARGIN_SHORT,m_margin_short))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_MARGIN_LIMIT,m_margin_limit))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_MARGIN_STOP,m_margin_stop))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_MARGIN_STOPLIMIT,m_margin_stoplimit))
      return(false);


Под отладчиком все нули, в чем дело-то? С другими полями класс выдает правильные значения. Счет МТ5 Roboforex Standart Pro Demo

***************** 


 

 

Причем на МТ4 все с маржой замечательно работает, вот мой индикатор в кодобазе https://www.mql5.com/ru/code/15808

Собственно, я его и переписываю на пятерку, все сделал, а с маржой затык. 

ShowImportantParams
ShowImportantParams
  • голосов: 11
  • 2016.06.24
  • Alexey Volchanskiy
  • www.mql5.com
Показывает важные параметры, которые могут меняться на новостях или в пятницу перед закрытием.
 

Перед использованием класса, нужно этому классу сообщить название символа:

   m_symbolInfo.Name(Symbol());

   m_symbolInfo.Refresh();
   m_symbolInfo.RefreshRates();
 

И ещё:

MarginInitial

Получает значение начальной маржи

MarginMaintenance

Получает значение поддерживающей маржи


используются для фьючерсов, то есть для биржевых инструментов.

 
Vladimir Karputov:

И ещё:

MarginInitial

Получает значение начальной маржи

MarginMaintenance

Получает значение поддерживающей маржи


используются для фьючерсов, то есть для биржевых инструментов.

 
Alexey Volchanskiy:
Разумеется, я задал символ. остальные параметры работают,  по всем видам марки для форума нули

 
Alexey Volchanskiy:
Разумеется, я задал символ. остальные параметры работают,  по всем видам марки для форума нули

Вот выделенное совсем не понял.

Ниже код, который работает:

//+------------------------------------------------------------------+
//|                                             TestCSymbolsInfo.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\SymbolInfo.mqh>  
CSymbolInfo    m_symbol;                     // symbol info object
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(!RefreshRates())
     {
      Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()),
            ", Ask=",DoubleToString(m_symbol.Ask(),Digits()));
      return(INIT_FAILED);
     }
//---
   m_symbol.Name(Symbol());                  // sets symbol name
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   string text="";
  
   if(!RefreshRates())
     {
      Comment(text);
      return;
     }

   text="MarginInitial: "+DoubleToString(m_symbol.MarginInitial(),2);
   text+="\nMarginMaintenance: "+DoubleToString(m_symbol.MarginMaintenance(),2);

   Comment(text);
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+

BR-12.16
 

Файлы:
 
Vladimir Karputov:

Вот выделенное совсем не понял.

Ниже код, который работает:

//+------------------------------------------------------------------+
//|                                             TestCSymbolsInfo.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\SymbolInfo.mqh>  
CSymbolInfo    m_symbol;                     // symbol info object
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(!RefreshRates())
     {
      Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()),
            ", Ask=",DoubleToString(m_symbol.Ask(),Digits()));
      return(INIT_FAILED);
     }
//---
   m_symbol.Name(Symbol());                  // sets symbol name
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   string text="";
  
   if(!RefreshRates())
     {
      Comment(text);
      return;
     }

   text="MarginInitial: "+DoubleToString(m_symbol.MarginInitial(),2);
   text+="\nMarginMaintenance: "+DoubleToString(m_symbol.MarginMaintenance(),2);

   Comment(text);
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+

Насчет выделенного - не было света, писал с сотового, очепятка была ) Код немного поправил в OnInit.

int OnInit()
  {
   m_symbol.Name(Symbol());                  // sets symbol name
   m_symbol.Refresh();
   m_symbol.RefreshRates();    
   if(!RefreshRates())
     {
      Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()),
            ", Ask=",DoubleToString(m_symbol.Ask(),Digits()));
      return(INIT_FAILED);
     }
   return(INIT_SUCCEEDED);
  }

И результат для символа 



 

 
Запрашивать MarginInitial и MarginMaintenance нужно на биржевых инструментах.
 

В общем вопрос - могу ли я в МТ5 для форекса узнать маржу для символа? Для МТ4 я это делал элементарно

string margin = DoubleToString(MarketInfo(Symbol(),MODE_MARGINREQUIRED),2));

А тут все варианты выдают только нули...
 

 
Vladimir Karputov:
Запрашивать MarginInitial и MarginMaintenance нужно на биржевых инструментах.
Мне нужна маржа для форексных валютных пар, как это сделать?