Причем на МТ4 все с маржой замечательно работает, вот мой индикатор в кодобазе https://www.mql5.com/ru/code/15808
Собственно, я его и переписываю на пятерку, все сделал, а с маржой затык.
- голосов: 11
- 2016.06.24
- Alexey Volchanskiy
- www.mql5.com
Перед использованием класса, нужно этому классу сообщить название символа:
m_symbolInfo.Refresh();
m_symbolInfo.RefreshRates();
И ещё:
MarginInitial | Получает значение начальной маржи |
MarginMaintenance | Получает значение поддерживающей маржи |
используются для фьючерсов, то есть для биржевых инструментов.
И ещё:
MarginInitial | Получает значение начальной маржи |
MarginMaintenance | Получает значение поддерживающей маржи |
используются для фьючерсов, то есть для биржевых инструментов.
Разумеется, я задал символ. остальные параметры работают, по всем видам марки для форума нули
Вот выделенное совсем не понял.
Ниже код, который работает:
//| 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);
}
//+------------------------------------------------------------------+
Вот выделенное совсем не понял.
Ниже код, который работает:
//| 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.
{
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);
}
И результат для символа
В общем вопрос - могу ли я в МТ5 для форекса узнать маржу для символа? Для МТ4 я это делал элементарно
А тут все варианты выдают только нули...
Запрашивать MarginInitial и MarginMaintenance нужно на биржевых инструментах.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Пишу индикатор, выяснил, что не работают функции в 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.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
*****************