Расчет свободных средств перед открытием позиции - страница 3

 
Konstantin Efremov #:

Удобно разместить эту функцию в OnInit() (mql5).

Вот аналог для mql4

#ifdef __MQL4__
void  InfoAccountSymbolPrint(string _symbol)
   {     
      Print(">>>InfoAccountSymbolPrint(): SYMBOL_TRADE_TICK_SIZE: ",SymbolInfoDouble(_symbol, SYMBOL_TRADE_TICK_SIZE));          // Минимальное изменение цены
      Print(">>>InfoAccountSymbolPrint(): SYMBOL_TRADE_TICK_VALUE: ",SymbolInfoDouble(_symbol, SYMBOL_TRADE_TICK_VALUE));        // Рассчитанная стоимость тика 
      Print(">>>InfoAccountSymbolPrint(): SYMBOL_TRADE_CONTRACT_SIZE: ",SymbolInfoDouble(_symbol, SYMBOL_TRADE_CONTRACT_SIZE));  // Размер торгового контракта
      Print(">>>InfoAccountSymbolPrint(): ACCOUNT_LEVERAGE: ",AccountInfoInteger(ACCOUNT_LEVERAGE));                             // Плечо
      
//SYMBOL_MARGIN_INITIAL Начальная (инициирующая) маржа обозначает размер необходимых залоговых средств в маржинальной валюте 
//для открытия позиции объемом в один лот. Используется при проверке средств клиента при входе в рынок. 
//Для получения информации о размере взимаемой маржи в зависимости от типа и направления ордера используется функция SymbolInfoMarginRate().
      Print(">>>InfoAccountSymbolPrint(): SYMBOL_MARGIN_INITIAL: ",SymbolInfoDouble(_symbol, SYMBOL_MARGIN_INITIAL));
      
//SYMBOL_MARGIN_MAINTENANCE Поддерживающая маржа по инструменту. В случае если задана – указывает размер маржи в маржинальной валюте инструмента, 
//удерживаемой с одного лота. Используется при проверке средств клиента при изменении состояния счета клиента. 
//Если поддерживающая маржа равна 0, то используется начальная маржа.
//Для получения информации о размере взимаемой маржи в зависимости от типа и направления ордера используется функция SymbolInfoMarginRate().
      Print(">>>InfoAccountSymbolPrint(): SYMBOL_MARGIN_MAINTENANCE: ",SymbolInfoDouble(_symbol, SYMBOL_MARGIN_MAINTENANCE));
               
      Print(">>>InfoAccountSymbolPrint(): account_currency: ",SymbolInfoString(_symbol, SYMBOL_CURRENCY_BASE));                  // Базовая валюта инструмента
      Print(">>>InfoAccountSymbolPrint(): symbol_currency_base: ",SymbolInfoString(_symbol, SYMBOL_CURRENCY_PROFIT));            // Валюта прибыли
      Print(">>>InfoAccountSymbolPrint(): symbol_currency_profit: ",SymbolInfoString(_symbol, SYMBOL_CURRENCY_MARGIN));          // Валюта в которой вычисляется залоговые средства
      Print(">>>InfoAccountSymbolPrint(): symbol_currency_margin: ",SymbolInfoString(_symbol, SYMBOL_DESCRIPTION));              // Строковое описание символа
      Print(">>>InfoAccountSymbolPrint(): symbol_description: ",SymbolInfoString(_symbol, SYMBOL_PATH));                         // Путь в дереве символов
      Print(">>>InfoAccountSymbolPrint(): symbol_path: ",AccountInfoString(ACCOUNT_CURRENCY));                                   // Валюта депозита
      
      //Margin calculation mode. 0 - Forex; 1 - CFD; 2 - Futures; 3 - CFD for indices
      int CalcMode = (int)SymbolInfoInteger(_symbol, SYMBOL_TRADE_CALC_MODE);                                                        // Способ вычисления стоимости контракта
      string CalcModeTXT = "";
      switch (CalcMode)
         {
            case 0:
               CalcModeTXT = "Forex";
               break;
            case 1:
               CalcModeTXT = "CFD";
               break;
            case 2:
               CalcModeTXT = "Futures";
               break;
            case 3:
               CalcModeTXT = "CFD for indices";
               break;
         }
         
//--- выведем в журнал советника способ вычисления стоимости контракта
      Print(">>>InfoAccountSymbolPrint(): SYMBOL_TRADE_CALC_MODE: ", CalcMode, " ", CalcModeTXT);
   }
#endif 
 

Извиняюсь, обнаружил ошибки в функции для mql5, исправляюсь:

#ifdef __MQL5__
//+------------------------------------------------------------------+
//| вывод на печать параметров символа и аккаунта                    |
//+------------------------------------------------------------------+
void  InfoAccountSymbolPrint(string _symbol)
   {     
      Print(">>>InfoAccountSymbolPrint(): SYMBOL_TRADE_TICK_SIZE: ",SymbolInfoDouble(_symbol, SYMBOL_TRADE_TICK_SIZE));          // Минимальное изменение цены
      Print(">>>InfoAccountSymbolPrint(): SYMBOL_TRADE_TICK_VALUE: ",SymbolInfoDouble(_symbol, SYMBOL_TRADE_TICK_VALUE));        // Рассчитанная стоимость тика 
      Print(">>>InfoAccountSymbolPrint(): SYMBOL_TRADE_CONTRACT_SIZE: ",SymbolInfoDouble(_symbol, SYMBOL_TRADE_CONTRACT_SIZE));  // Размер торгового контракта
      Print(">>>InfoAccountSymbolPrint(): ACCOUNT_LEVERAGE: ",AccountInfoInteger(ACCOUNT_LEVERAGE));                             // Плечо
      
//SYMBOL_MARGIN_INITIAL Начальная (инициирующая) маржа обозначает размер необходимых залоговых средств в маржинальной валюте 
//для открытия позиции объемом в один лот. Используется при проверке средств клиента при входе в рынок. 
//Для получения информации о размере взимаемой маржи в зависимости от типа и направления ордера используется функция SymbolInfoMarginRate().
      Print(">>>InfoAccountSymbolPrint(): SYMBOL_MARGIN_INITIAL: ",SymbolInfoDouble(_symbol, SYMBOL_MARGIN_INITIAL));
      
//SYMBOL_MARGIN_MAINTENANCE Поддерживающая маржа по инструменту. В случае если задана – указывает размер маржи в маржинальной валюте инструмента, 
//удерживаемой с одного лота. Используется при проверке средств клиента при изменении состояния счета клиента. 
//Если поддерживающая маржа равна 0, то используется начальная маржа.
//Для получения информации о размере взимаемой маржи в зависимости от типа и направления ордера используется функция SymbolInfoMarginRate().
      Print(">>>InfoAccountSymbolPrint(): SYMBOL_MARGIN_MAINTENANCE: ",SymbolInfoDouble(_symbol, SYMBOL_MARGIN_MAINTENANCE));
      
      double symbolMarginInitialRate      = 0.0;
      double symbolMarginMaintenanceRate  = 0.0;
      SymbolInfoMarginRate(_symbol, ORDER_TYPE_BUY, symbolMarginInitialRate, symbolMarginMaintenanceRate);
      Print(">>>InfoAccountSymbolPrint(): symbolMarginInitialRate: ",symbolMarginInitialRate);                                   // коэффициент взимания начальной маржи
      Print(">>>InfoAccountSymbolPrint(): symbolMarginMaintenanceRate: ",symbolMarginMaintenanceRate);                           // коэффициент взимания поддерживающей маржи
          
      Print(">>>InfoAccountSymbolPrint(): account_currency: ",AccountInfoString(ACCOUNT_CURRENCY));                              // Валюта депозита
      Print(">>>InfoAccountSymbolPrint(): symbol_currency_base: ",SymbolInfoString(_symbol, SYMBOL_CURRENCY_BASE));              // Базовая валюта инструмента
      Print(">>>InfoAccountSymbolPrint(): symbol_currency_profit: ",SymbolInfoString(_symbol, SYMBOL_CURRENCY_PROFIT));          // Валюта прибыли
      Print(">>>InfoAccountSymbolPrint(): symbol_currency_margin: ",SymbolInfoString(_symbol, SYMBOL_CURRENCY_MARGIN));          // Валюта в которой вычисляется залоговые средства
      Print(">>>InfoAccountSymbolPrint(): symbol_description: ",SymbolInfoString(_symbol, SYMBOL_DESCRIPTION));                  // Строковое описание символа
      Print(">>>InfoAccountSymbolPrint(): symbol_path: ",SymbolInfoString(_symbol, SYMBOL_PATH));                                // Путь в дереве символов

      
      int CalcMode = (int)SymbolInfoInteger(_symbol, SYMBOL_TRADE_CALC_MODE);                                                    // Способ вычисления стоимости контракта
      string CalcModeTXT = "";
      switch (CalcMode)
         {
            case SYMBOL_CALC_MODE_FOREX:
               CalcModeTXT = "SYMBOL_CALC_MODE_FOREX";
               break;
            case SYMBOL_CALC_MODE_FOREX_NO_LEVERAGE:
               CalcModeTXT = "SYMBOL_CALC_MODE_FOREX_NO_LEVERAGE";
               break;
            case SYMBOL_CALC_MODE_FUTURES:
               CalcModeTXT = "SYMBOL_CALC_MODE_FUTURES";
               break;
            case SYMBOL_CALC_MODE_CFD:
               CalcModeTXT = "SYMBOL_CALC_MODE_CFD";
               break;
            case SYMBOL_CALC_MODE_CFDINDEX:
               CalcModeTXT = "SYMBOL_CALC_MODE_CFDINDEX";
               break;
            case SYMBOL_CALC_MODE_CFDLEVERAGE:
               CalcModeTXT = "SYMBOL_CALC_MODE_CFDLEVERAGE";
               break;
            case SYMBOL_CALC_MODE_EXCH_STOCKS:
               CalcModeTXT = "SYMBOL_CALC_MODE_EXCH_STOCKS";
               break;
            case SYMBOL_CALC_MODE_EXCH_FUTURES:
               CalcModeTXT = "SYMBOL_CALC_MODE_EXCH_FUTURES";
               break;
            case SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS:
               CalcModeTXT = "SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS";
               break;
            case SYMBOL_CALC_MODE_EXCH_BONDS:
               CalcModeTXT = "SYMBOL_CALC_MODE_EXCH_BONDS";
               break;
            case SYMBOL_CALC_MODE_EXCH_STOCKS_MOEX:
               CalcModeTXT = "SYMBOL_CALC_MODE_EXCH_STOCKS_MOEX";
               break;
            case SYMBOL_CALC_MODE_EXCH_BONDS_MOEX:
               CalcModeTXT = "SYMBOL_CALC_MODE_EXCH_BONDS_MOEX";
               break;
            case SYMBOL_CALC_MODE_SERV_COLLATERAL:
               CalcModeTXT = "SYMBOL_CALC_MODE_SERV_COLLATERAL";
               break;
         }
         
//--- выведем в журнал советника способ вычисления стоимости контракта
      Print(">>>InfoAccountSymbolPrint(): SYMBOL_TRADE_CALC_MODE: ", CalcMode, " ", CalcModeTXT);
   }
#endif 
#ifdef __MQL4__
void  InfoAccountSymbolPrint(string _symbol)
   {     
      Print(">>>InfoAccountSymbolPrint(): SYMBOL_TRADE_TICK_SIZE: ",SymbolInfoDouble(_symbol, SYMBOL_TRADE_TICK_SIZE));          // Минимальное изменение цены
      Print(">>>InfoAccountSymbolPrint(): SYMBOL_TRADE_TICK_VALUE: ",SymbolInfoDouble(_symbol, SYMBOL_TRADE_TICK_VALUE));        // Рассчитанная стоимость тика 
      Print(">>>InfoAccountSymbolPrint(): SYMBOL_TRADE_CONTRACT_SIZE: ",SymbolInfoDouble(_symbol, SYMBOL_TRADE_CONTRACT_SIZE));  // Размер торгового контракта
      Print(">>>InfoAccountSymbolPrint(): ACCOUNT_LEVERAGE: ",AccountInfoInteger(ACCOUNT_LEVERAGE));                             // Плечо
      
//SYMBOL_MARGIN_INITIAL Начальная (инициирующая) маржа обозначает размер необходимых залоговых средств в маржинальной валюте 
//для открытия позиции объемом в один лот. Используется при проверке средств клиента при входе в рынок. 
//Для получения информации о размере взимаемой маржи в зависимости от типа и направления ордера используется функция SymbolInfoMarginRate().
      Print(">>>InfoAccountSymbolPrint(): SYMBOL_MARGIN_INITIAL: ",SymbolInfoDouble(_symbol, SYMBOL_MARGIN_INITIAL));
      
//SYMBOL_MARGIN_MAINTENANCE Поддерживающая маржа по инструменту. В случае если задана – указывает размер маржи в маржинальной валюте инструмента, 
//удерживаемой с одного лота. Используется при проверке средств клиента при изменении состояния счета клиента. 
//Если поддерживающая маржа равна 0, то используется начальная маржа.
//Для получения информации о размере взимаемой маржи в зависимости от типа и направления ордера используется функция SymbolInfoMarginRate().
      Print(">>>InfoAccountSymbolPrint(): SYMBOL_MARGIN_MAINTENANCE: ",SymbolInfoDouble(_symbol, SYMBOL_MARGIN_MAINTENANCE));
               
      Print(">>>InfoAccountSymbolPrint(): account_currency: ",SymbolInfoString(_symbol, SYMBOL_CURRENCY_BASE));                  // Базовая валюта инструмента
      Print(">>>InfoAccountSymbolPrint(): symbol_currency_base: ",SymbolInfoString(_symbol, SYMBOL_CURRENCY_PROFIT));            // Валюта прибыли
      Print(">>>InfoAccountSymbolPrint(): symbol_currency_profit: ",SymbolInfoString(_symbol, SYMBOL_CURRENCY_MARGIN));          // Валюта в которой вычисляется залоговые средства
      Print(">>>InfoAccountSymbolPrint(): symbol_currency_margin: ",SymbolInfoString(_symbol, SYMBOL_DESCRIPTION));              // Строковое описание символа
      Print(">>>InfoAccountSymbolPrint(): symbol_description: ",SymbolInfoString(_symbol, SYMBOL_PATH));                         // Путь в дереве символов
      Print(">>>InfoAccountSymbolPrint(): symbol_path: ",AccountInfoString(ACCOUNT_CURRENCY));                                   // Валюта депозита
      
      //Margin calculation mode. 0 - Forex; 1 - CFD; 2 - Futures; 3 - CFD for indices
      int CalcMode = (int)SymbolInfoInteger(_symbol, SYMBOL_TRADE_CALC_MODE);                                                        // Способ вычисления стоимости контракта
      string CalcModeTXT = "";
      switch (CalcMode)
         {
            case 0:
               CalcModeTXT = "Forex";
               break;
            case 1:
               CalcModeTXT = "CFD";
               break;
            case 2:
               CalcModeTXT = "Futures";
               break;
            case 3:
               CalcModeTXT = "CFD for indices";
               break;
         }
         
//--- выведем в журнал советника способ вычисления стоимости контракта
      Print(">>>InfoAccountSymbolPrint(): SYMBOL_TRADE_CALC_MODE: ", CalcMode, " ", CalcModeTXT);
   }
#endif 
 
Ivan Titov #:

В документации не нашел про то, что в индикаторах функция OrderCalcMargin не работает. Разработчики MetaQuotes, прокомментируйте ситуацию, плз.

Попробуйте отпечатать ошибку. Там, по-моему, выдает:

ERR_FUNCTION_NOT_ALLOWED

4014

Системная функция не разрешена для вызова


Есть костыли вот в этой теме: https://www.mql5.com/ru/forum/261138#comment_48424556

Когда наконец поправят расчет маржи?
Когда наконец поправят расчет маржи?
  • 2018.06.26
  • www.mql5.com
Биржевой трейдинг: Когда наконец поправят расчет маржи?