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

 
EvgeTrofi:

Функция OrderCalcMargin не работает в пользовательских индикаторах. Возвращает false. и ошибку:

ERR_FUNCTION_NOT_ALLOWED

4014

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

 

Интересно, почему у этой функции такая немилость к индикаторам? Затратна по времени?

То же касается и функции OrderCalcProfit()

 
Valmars:

Интересно, почему у этой функции такая немилость к индикаторам? Затратна по времени?

То же касается и функции OrderCalcProfit()

не, эт верность традициям :)

В 4ке сначала было так же.

Торговые функции не работают в индикаторах.

Документация по MQL5: Торговые функции
Документация по MQL5: Торговые функции
  • www.mql5.com
Торговые функции - Документация по MQL5
 
Разрешат ли вызов всех торговых функций, в частности OrderCalcMargin в индикаторах? Или ошибка 4014 - это приговор.



 
avoitenko:
Разрешат ли вызов всех торговых функций, в частности OrderCalcMargin в индикаторах? Или ошибка 4014 - это приговор.


Всех и не надо. OrderSend(...) совершенно ни к чему. А OrderCalcMargin и OrderCalcProfit - функции чисто информационные, торговли не ведут и были бы весьма полезны для некоторых индикаторов, рассчитывающих параметры будущих позиций по данным пользователя. Можно просто перетащить их из 'Торговых функций', например в 'Общие'.

 
Andrey Voytenko:
Разрешат ли вызов всех торговых функций, в частности OrderCalcMargin в индикаторах? Или ошибка 4014 - это приговор.
Четыре года прошло от момента публикации, и прогресса всё нет. Печально всё.
 
Vitaly Muzichenko:
Четыре года прошло от момента публикации, и прогресса всё нет. Печально всё.

Давно всё есть https://www.mql5.com/ru/articles/2555#not_enough_money

Какие проверки должен пройти торговый робот перед публикацией в Маркете
Какие проверки должен пройти торговый робот перед публикацией в Маркете
  • 2016.07.19
  • MetaQuotes Software Corp.
  • www.mql5.com
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку для обеспечения единого стандарта качества. В этой статье мы расскажем о наиболее частых ошибках, которые допускают разработчики в своих технических индикаторах и торговых роботах. А также покажем как самостоятельно проверить свой продукт перед отправкой в Маркет.
 
Konstantin Efremov:

Давно всё есть https://www.mql5.com/ru/articles/2555#not_enough_money

 OrderCalcMargin уже работает в индикаторе? Вы проверяли?
 

Удобно разместить эту функцию в OnInit() (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: ",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));                                   // Валюта депозита
      
      long CalcMode = 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);
   }
 
Vitaly Muzichenko #:
 OrderCalcMargin уже работает в индикаторе? Вы проверяли?
нет, не работает
 
Evgeniy Trofimov #:

Если валюта депозита и валюта маржи окажутся разными, то придётся переводить из одних единиц в другие. Я это делаю следующим образом:

 Если где ошибся - подскажите плиз!

Да вроде всё ок, взял в свою библиотеку часть вашего кода, спасибо!