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

 

МТ4, билд 971. Следующий код печатает нули, где я неправ?

// узнает код последней ошибки и возвращает строку с описанием
string GetMyLastError()
{
   int err = GetLastError();
   string serr = ErrorDescription(err);
   ResetLastError();
   return(serr);
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
    ResetLastError();

    string s = DoubleToString(SymbolInfoDouble(Symbol(), SYMBOL_MARGIN_INITIAL), 2) + "  " + DoubleToString(SymbolInfoDouble(Symbol(), SYMBOL_MARGIN_MAINTENANCE), 2) + "  ";
    s += DoubleToString(MarketInfo(Symbol(), MODE_MARGININIT), 2);
    Print(s, "  ", GetMyLastError()); 
}
Вывод: 2016.06.20 16:35:48.473 ShowImportantParams EURUSD.e,M1: 0.00 0.00 0.00 no error
 
Alexey Volchanskiy:

МТ4, билд 971. Следующий код печатает нули, где я неправ?

Вывод: 2016.06.20 16:35:48.473 ShowImportantParams EURUSD.e,M1: 0.00 0.00 0.00 no error
t Если мне память не изменяет это свойство работает только для биржевых инструментов. для форексных она возвращает нули.
 
Alexey Volchanskiy:

МТ4, билд 971. Следующий код печатает нули, где я неправ?

Вывод: 2016.06.20 16:35:48.473 ShowImportantParams EURUSD.e,M1: 0.00 0.00 0.00 no error

Попробовал еще добавить вариантов, стало выводить. В чем дело-то? Счет Robo demo ECN Pro.

    string s = DoubleToString(SymbolInfoDouble(Symbol(), SYMBOL_MARGIN_INITIAL), 2) + "  " + DoubleToString(SymbolInfoDouble(Symbol(), SYMBOL_MARGIN_MAINTENANCE), 2) + "  ";
    s += DoubleToString(MarketInfo(Symbol(), MODE_MARGININIT), 2) + "  ";
    s += DoubleToString(MarketInfo(Symbol(), MODE_MARGINMAINTENANCE), 2) + "  ";
    s += DoubleToString(MarketInfo(Symbol(), MODE_MARGINREQUIRED), 2) + "  ";
    s += DoubleToString(MarketInfo(Symbol(), MODE_MARGINHEDGED), 2) + "  ";
    Print(s, "  ", GetMyLastError());


2016.06.20 16:44:09.463 ShowImportantParams EURUSD.e,M1: 0.00  0.00  0.00  0.00  378.10  25000.00    no error

 
Alexey Volchanskiy:

Попробовал еще добавить вариантов, стало выводить. В чем дело-то? Счет Robo demo ECN Pro.

2016.06.20 16:44:09.463 ShowImportantParams EURUSD.e,M1: 0.00  0.00  0.00  0.00  378.10  25000.00    no error

Запустил на реальном Robo Standart Pro, также выводит только два последних параметра.
 

Для форексных инструментов нужно использовать MarketInfo(Symbol(), MODE_MARGINREQUIRED)

Еще можно "через гланды" — "AccountFreeMargin - AccountFreeMarginCheck"

 
Andrey Khatimlianskii:

Для форексных инструментов нужно использовать MarketInfo(Symbol(), MODE_MARGINREQUIRED)

Еще можно "через гланды" — "AccountFreeMargin - AccountFreeMarginCheck"

Да, я это уже выяснил экспериментально. А почему MarketInfo(Symbol(), MODE_MARGINHEDGEDвыдает дикое значение 25000? 

 
Alexey Volchanskiy:

Да, я это уже выяснил экспериментально. А почему MarketInfo(Symbol(), MODE_MARGINHEDGEDвыдает дикое значение 25000? 

Размер контракта или маржи для одного лота перекрытых позиций (разнонаправленные позиции по одному символу). Существует два способа расчета маржи для перекрытых позиций. Способ расчета определяется брокером.

 

Базовый расчет:

Если для инструмента задана первоначальная маржа (SYMBOL_MARGIN_INITIAL), то хеджированная маржа указывается как абсолютное значение (в деньгах).

Если первоначальная маржа не задана (равна 0), то в SYMBOL_MARGIN_HEDGED указывается размер контракта, который будет использован при расчете маржи по формуле, соответствующей типу торгового инструмента (SYMBOL_TRADE_CALC_MODE).

 

Расчет по наибольшей позиции:

Значение SYMBOL_MARGIN_HEDGED не учитывается.

Вычисляется объем всех коротких и всех длинных позиций по инструменту.

Для каждой стороны рассчитывается средневзвешенная цена открытия, а также средневзвешенная цена конвертации в валюту депозита.

Далее по формулам, соответствующим типу инструмента (SYMBOL_TRADE_CALC_MODE), рассчитывается маржа для короткой и для длинной стороны.

В качестве итогового значения используется наибольшее.

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