Как узнать величину маржи до открытия позиции?

 

Неожиданно для себя столкнулся с проблемой: невозможно определить размер требуемой маржи до открытия позиции. Я привык, что в МТ4 SymboInfoDouble() заведомо не работает, и пользовался старенькой, но надежной, MarketInfo(). Но вот незадача - оказалось, что и в МТ5 SymbolInfoDouble() возвращает 0. Тут уже MarketInfo() нет. Кто знает, как быть?

#define PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
   PRINT(SymbolInfoDouble(Symbol(), SYMBOL_MARGIN_LONG));
   PRINT(SymbolInfoDouble(Symbol(), SYMBOL_MARGIN_SHORT));
   PRINT(SymbolInfoDouble(Symbol(), SYMBOL_MARGIN_INITIAL));
   PRINT(SymbolInfoDouble(Symbol(), SYMBOL_MARGIN_MAINTENANCE));
   PRINT(SymbolInfoDouble(Symbol(), SYMBOL_MARGIN_STOP));
   PRINT(SymbolInfoDouble(Symbol(), SYMBOL_MARGIN_STOPLIMIT));
}

Результат:

2021.02.26 17:58:58.912 Test (USDCHF,H1)        SymbolInfoDouble(Symbol(),SYMBOL_MARGIN_LONG) = 0.0
2021.02.26 17:58:58.941 Test (USDCHF,H1)        SymbolInfoDouble(Symbol(),SYMBOL_MARGIN_SHORT) = 0.0
2021.02.26 17:58:58.941 Test (USDCHF,H1)        SymbolInfoDouble(Symbol(),SYMBOL_MARGIN_INITIAL) = 0.0
2021.02.26 17:58:58.941 Test (USDCHF,H1)        SymbolInfoDouble(Symbol(),SYMBOL_MARGIN_MAINTENANCE) = 0.0
2021.02.26 17:58:58.941 Test (USDCHF,H1)        SymbolInfoDouble(Symbol(),SYMBOL_MARGIN_STOP) = 0.0
2021.02.26 17:58:58.941 Test (USDCHF,H1)        SymbolInfoDouble(Symbol(),SYMBOL_MARGIN_STOPLIMIT) = 0.0

Сервер MetaQuotes-Demo.

 
Ihor Herasko:

Попробуйте это

Free=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
 

Вроде OrderCalcMargin()

 
VVT:

Попробуйте это

Это размер свободной маржи. Требуется узнать, сколько маржи будет использовано на открытие позиции до  ее непосредственного открытия.

 
Vasiliy Pushkaryov:

Вроде OrderCalcMargin()

Оно. Спасибо:

   double fMargin = 0.0;
   OrderCalcMargin(ORDER_TYPE_BUY, Symbol(), 0.1, SymbolInfoDouble(Symbol(), SYMBOL_ASK), fMargin);
   PRINT(fMargin);

Результат:

2021.02.26 19:12:52.582 Test (GBPUSD,H1)        fMargin = 139.33
 
Ihor Herasko:

Это размер свободной маржи. Требуется узнать, сколько маржи будет использовано на открытие позиции до  ее непосредственного открытия.

Ну так сопоставлять же надо, да ладно, разобрались уже)

 
VVT:

Ну так сопоставлять же надо, да ладно, разобрались уже)

Уточните, пожалуйста, что сопоставлять?

 
Ihor Herasko:

Уточните, пожалуйста, что сопоставлять?

Сопоставлять свободную маржу счёта с маржой ордера, это смотря для каких целей...

 

предупреждение выдавало - не знаю так правильно (int) поставил перед - предупреждение пропало 

//+------------------------------------------------------------------+
//|                                            AccountInfoDouble.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double fMargin = 0.0;
   (int)OrderCalcMargin(ORDER_TYPE_BUY, Symbol(), 0.1, SymbolInfoDouble(Symbol(), SYMBOL_BID), fMargin);
//--- выведем всю информацию, доступную из функции AccountInfoDouble()
   printf("fMargin =  %G",fMargin);
   printf("ACCOUNT_BALANCE =  %G",AccountInfoDouble(ACCOUNT_BALANCE));
   printf("ACCOUNT_CREDIT =  %G",AccountInfoDouble(ACCOUNT_CREDIT));
   printf("ACCOUNT_PROFIT =  %G",AccountInfoDouble(ACCOUNT_PROFIT));
   printf("ACCOUNT_EQUITY =  %G",AccountInfoDouble(ACCOUNT_EQUITY));
   printf("ACCOUNT_MARGIN =  %G",AccountInfoDouble(ACCOUNT_MARGIN));
   printf("ACCOUNT_MARGIN_FREE =  %G",AccountInfoDouble(ACCOUNT_MARGIN_FREE));
   printf("ACCOUNT_MARGIN_LEVEL =  %G",AccountInfoDouble(ACCOUNT_MARGIN_LEVEL));
   printf("ACCOUNT_MARGIN_SO_CALL = %G",AccountInfoDouble(ACCOUNT_MARGIN_SO_CALL));
   printf("ACCOUNT_MARGIN_SO_SO = %G",AccountInfoDouble(ACCOUNT_MARGIN_SO_SO));
  }
//+------------------------------------------------------------------+

 Сникнг.PNG

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

проверил - почти точно показало - 1 копейка разница

8976 4

8976.PNG

 
SanAlex:

предупреждение выдавало - не знаю так правильно (int) поставил перед - предупреждение пропало 

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

проверил - почти точно показало - 1 копейка разница


счас копейка, потом уже 10...
 
Renat Akhtyamov:
счас копейка, потом уже 10...

не, потом второй раз накинул скрипт - в точь точь показало.

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