Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Alexey Volchanskiy
24629
Alexey Volchanskiy  

МТ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
Sergey Gritsay
6743
Sergey Gritsay  
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
24629
Alexey Volchanskiy  
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
24629
Alexey Volchanskiy  
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, также выводит только два последних параметра.
Andrey Khatimlianskii
59252
Andrey Khatimlianskii  

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

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

Alexey Volchanskiy
24629
Alexey Volchanskiy  
Andrey Khatimlianskii:

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

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

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

Andrey Khatimlianskii
59252
Andrey Khatimlianskii  
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), рассчитывается маржа для короткой и для длинной стороны.

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий