Особенности языка mql5, тонкости и приёмы работы - страница 9

 
fxsaber:
Решение пришло сразу.
// Размер свободных средств, необходимых для открытия 1 лота на покупку
double GetMarginRequired( const string Symb )
{
  MqlTick Tick;

  return(SymbolInfoTick(Symb, Tick) ? Tick.ask * SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE) * SymbolInfoDouble(Symb, SYMBOL_TRADE_CONTRACT_SIZE) *
         SymbolInfoDouble(Symb, SYMBOL_POINT) / (SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_SIZE) * AccountInfoInteger(ACCOUNT_LEVERAGE)) : 0);
}
Это расчет для FOREX. Остальное - по аналогии.
Отлично, осталось привести margin в валюте депозита, т.к. залог, к примеру, для AUDCAD при валюте депо USD нужно иметь в USD.
 
Alexey Volchanskiy:
Отлично, осталось привести margin в валюте депозита, т.к. залог, к примеру, для AUDCAD при валюте депо USD нужно иметь в USD.
Это и было сделано.
 
Alexey Volchanskiy:
Отлично, осталось привести margin в валюте депозита, т.к. залог, к примеру, для AUDCAD при валюте депо USD нужно иметь в USD.
вроде как SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE) в функции как раз для этого...приводить пункто-лоты к валюте депо
 
fxsaber:
Это и было сделано.

Всё отлично работает на форекс, вот только остался последний вопрос: "почему в два раза меньше, и как это устранить?" 

 

 
Vitaly Muzichenko:

Всё отлично работает на форекс, вот только остался последний вопрос: "почему в два раза меньше, и как это устранить?" 

Столкнулся с тем, что на SGDJPY маржа в разы отличается на серверах FIBOGroup-MT5 Server и MetaQuotes-Demo. Это говорит о том, что сам MT5 вычисляет маржу с ошибками. Ну а раз так, то эталона для сравнения просто нет. Поэтому однозначно нельзя сказать, это ошибка моей реализации или разработчиков. Думаю, ошибка и там и там. Проблема в отсутствии правильной информации.
 
fxsaber:
Столкнулся с тем, что на SGDJPY маржа в разы отличается на серверах FIBOGroup-MT5 Server и MetaQuotes-Demo. Это говорит о том, что сам MT5 вычисляет маржу с ошибками. Ну а раз так, то эталона для сравнения просто нет. Поэтому однозначно нельзя сказать, это ошибка моей реализации или разработчиков. Думаю, ошибка и там и там. Проблема в отсутствии правильной информации.

У меня два сервера показывают верно, с одним исключением - выделено красным

 

 

Как узнать свойство, выделенное красным?

Спасибо! 

 
Vitaly Muzichenko:

У меня два сервера показывают верно, с одним исключением - выделено красным

Как узнать свойство, выделенное красным?

Спасибо за наводку! В дебрях это - SymbolInfoMarginRate. Поэтому теперь так
// Размер свободных средств, необходимых для открытия 1 лота на покупку
double GetMarginRequired( const string Symb )
{
  MqlTick Tick;
  double MarginInit, MarginMain;

  return((SymbolInfoTick(Symb, Tick) && SymbolInfoMarginRate(Symb, ORDER_TYPE_BUY, MarginInit, MarginMain)) ? MarginInit * Tick.ask *
          SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE) / (SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_SIZE) * AccountInfoInteger(ACCOUNT_LEVERAGE)) : 0);
}

Надо четко понимать, что в MT5 в разные стороны могут быть совсем другие маржинальные требования. Т.е. единый MT4-вариант может не прокатывать. На Forex, конечно, такого не будет. Но помнить нужно. Поэтому в общем случае нужно писать так
// Альтернатива OrderCalcMargin
bool MyOrderCalcMargin( const ENUM_ORDER_TYPE action, const string symbol, const double volume, const double price, double &margin )
{
  double MarginInit, MarginMain;

  const bool Res = SymbolInfoMarginRate(symbol, action, MarginInit, MarginMain);
  
  margin = Res ? MarginInit * price * volume * SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE) /
                 (SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE) * AccountInfoInteger(ACCOUNT_LEVERAGE)) : 0;
  
  return(Res);  
}
 
fxsaber:
Это и было сделано.
Да, все верно, погорячился
 

Прикол MT5 на FIBOGroup-MT5 Server SGDJPY

 

В этой ситуации MyOrderCalcMargin считает правильно, а штатная OrderCalcMargin - нет! 

 
fxsaber:

Прикол MT5 на FIBOGroup-MT5 Server SGDJPY

 

В этой ситуации MyOrderCalcMargin считает правильно, а штатная OrderCalcMargin - нет! 

А хеджированую маржу можно как-то посчитать?
Причина обращения: