Скачать MetaTrader 5

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

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

МТ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
6557
Sergey Gritsay 2016.06.20 15:45  
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
17132
Alexey Volchanskiy 2016.06.20 15:47  
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
17132
Alexey Volchanskiy 2016.06.20 15:53  
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
56426
Andrey Khatimlianskii 2016.06.21 14:33  

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

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

Alexey Volchanskiy
17132
Alexey Volchanskiy 2016.06.21 16:22  
Andrey Khatimlianskii:

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

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

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

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

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

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