Обсуждение статьи "Ограничения и проверки в экспертах" - страница 2

 

Спасибо.

 
double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);

'SYMBOL_VOLUME_LIMIT' - undeclared identifier.............

'SymbolInfoDouble' - no one of the overloads can be applied to the function call............

Это только у меня так? 

 

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

'SYMBOL_VOLUME_LIMIT' - undeclared identifier.............

'SymbolInfoDouble' - no one of the overloads can be applied to the function call............

Это только у меня так?

Как только выйдет новый билд - все станет нормально. Ждем билда.
 
Rosh:

а так можно?

lot_max=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
 

Ещё один вопрос по поводу функции SeriesInfoInteger().

При создании темы "AccountInfo... Актуальность информации"  узнал, что есть функции, которые используют данные, "кешируемые в программном окружении", и есть функции, всегда имеющие "прямой доступ к актуальным данным".

К какой категории функций относится  функция SeriesInfoInteger() ?

 

В функции CheckVolumeValue используется следующий код:

int ratio=(int)MathRound(volume/volume_step);

if(MathAbs(ratio*volume_step-volume)>0.0000001)

{

description=StringFormat("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",

volume_step,ratio*volume_step);

return(false);

}

 Но правильней будет: 

int ratio = (int)MathRound((volume-min_volume)/volume_step);

if (MathAbs(ratio*volume_step+min_volume-volume)>0.0000001)

{

description=StringFormat("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",

  volume_step,ratio*volume_step+min_volume);

return(false);

}

Поскольку минимальный шаг изменения объёма должен отсчитываться от минимального значения.

 

И, пожалуй, фрагмент кода:

//--- вычислим значение маржи

bool check=OrderCalcMargin(type,Symbol(),lots,last_tick.ask,margin);

 нужно заменить на:

//--- вычислим значение маржи

double price = (type == ORDER_TYPE_BUY || type == ORDER_TYPE_BUY_LIMIT || type == ORDER_TYPE_BUY_STOP || type == ORDER_TYPE_BUY_STOP_LIMIT) ? last_tick.ask : last_tick.bid;

bool check=OrderCalcMargin(type,Symbol(),lots,price,margin);

[Удален]  
Прилагаемые файлы исходного кода и вставки исходного кода в HTML-коде теперь полностью переведены на португальский язык для вашего удобства.
MQL5.community - User Memo
MQL5.community - User Memo
  • 2010.02.25
  • MetaQuotes Software Corp.
  • www.mql5.com
You have just registered and most likely you have questions such as, "How do I insert a picture to my a message?" "How do I format my MQL5 source code?" "Where are my personal messages kept?" You may have many other questions. In this article, we have prepared some hands-on tips that will help you get accustomed in MQL5.community and take full advantage of its available features.
 
Rashid Umarov:

В связи с изменениями в MQL5, теперь максимальный общий объем, допустимый для одного символа, можно получить следующим образом:

Не используйте старый вариант! Он выглядел следующим образом:

Статья исправлена, к ней прикреплен новый экспертный код Check_Order_And_Volume_Limits.mq5.

Уважаемый админ

Я пытаюсь использовать эту функцию, но она возвращает 0 во всех случаях.

Мой билд MT5 - 2280

 
double orders_volume_on_symbol=PendingsVolume(symbol);


выдает ошибку, нет такой функции

И после того, как я изменил функцию, чтобы не включать отложенные ордера, она дает 0


double NewOrderAllowedVolume(string symbol)
  {
   double allowed_volume=0;
//--- получить ограничение на максимальный объем ордера
   double symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- получить ограничение объема по символу
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);

//--- получить объем открытой позиции по символу
   double opened_volume=PositionVolume(symbol);
   if(opened_volume>=0)
     {
      //--- если мы уже использовали доступный объем
      if(max_volume-opened_volume<=0)
         return(0);

      //--- объем открытой позиции не превышает max_volume
      //double orders_volume_on_symbol=PendingsVolume(symbol);
      //allowed_volume=max_volume-opened_volume-orders_volume_on_symbol;
      allowed_volume=max_volume-opened_volume;
      if(allowed_volume>symbol_max_volume) allowed_volume=symbol_max_volume;
     }
   return(allowed_volume);
  }

Это потому, что max_volume равен 0, а open_volume равен 0;

Почему максимальный объем равен 0, если нет открытых позиций?

Build 2715

Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
  • www.mql5.com
Predefined Macro Substitutions - Named Constants - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5