Как правильно посчитать размер залоговых средств за 1 лот по кроссу?

 

Например AUDCAD ? Или NZDJPY ?

Теоретически должно решаться через SymbolInfoDouble(Symbol(), SYMBOL_MARGIN_INITIAL) или SymbolInfoDouble(Symbol(), SYMBOL_MARGIN_MAINTENANCE),

а практически на MetaQuotes-демо аккаунте они обе равны 0.

А считать надо. Причём правильно. И желательно в общем виде для любого символа.

Чего то у меня моск заплетается, сходу построить формулу не могу. :)

Help!

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 

Нашел ошибку.  Тупо-автоматически счёл, что при использовании CSymbolInfo перед получением любых данных по символу достаточно вызвать рефреш.

В результате получил ошибку 4002

ERR_WRONG_INTERNAL_PARAMETER

4002

Ошибочный параметр при внутреннем вызове функции клиентского терминала

Проверил параметры - вроде все на местах. Полез в дебри, нашёл указанный в первом посте вариант (ксати, действительно дырявый!) после чего задал вопрос на форуме.

Сегодня вечерком глянул - ответов нету, решил всё же параметры функции OrderCalcMagin распечатать.

Обнаружил, что CSymbolInfo.Ask() выдаёт ноль, ну и потом быстро раскрутил в чём прикол...

double CMarketDriver::TranslateLots(double in)  // Переводит inLot заданный в процентах от депозита в outLot заданный в рыночных терминах.
  {
   double LotMargin=0;
   SymInfo.RefreshRates();   // Ошибка была здесь, вставил Refresh() вместо RefreshRates()
   if(in>0.000001)
     {
      if(!OrderCalcMargin(ORDER_TYPE_BUY, SymInfo.Name(), 1, SymInfo.Ask(), LotMargin )) Print("OrderCalcMargin Error!  GetLastError = ",GetLastError());
     }
   else if(in<-0.000001)
     {
      if(!OrderCalcMargin(ORDER_TYPE_SELL, SymInfo.Name(), 1, SymInfo.Bid(), LotMargin)) Print("OrderCalcMargin Error!  GetLastError = ",GetLastError());
     }
   else return 0;
   Print(LotMargin,"    // переменная для получения значения маржи / на лот");
   double out=(in*AccInfo.Equity()/100)/LotMargin;
   Print(out,"  //out");
   return out;
  }

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