При создании темы "AccountInfo... Актуальность информации" узнал, что есть функции, которые используют данные, "кешируемые в программном окружении", и есть функции, всегда имеющие "прямой доступ к актуальным данным".
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.
И после того, как я изменил функцию, чтобы не включать отложенные ордера, она дает 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, если нет открытых позиций?
Predefined Macro Substitutions - Named Constants - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
Спасибо.
'SYMBOL_VOLUME_LIMIT' - undeclared identifier.............
'SymbolInfoDouble' - no one of the overloads can be applied to the function call............
Это только у меня так?
'SYMBOL_VOLUME_LIMIT' - undeclared identifier.............
'SymbolInfoDouble' - no one of the overloads can be applied to the function call............
Это только у меня так?
а так можно?
Ещё один вопрос по поводу функции 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);
В связи с изменениями в MQL5, теперь максимальный общий объем, допустимый для одного символа, можно получить следующим образом:
Не используйте старый вариант! Он выглядел следующим образом:
Статья исправлена, к ней прикреплен новый экспертный код Check_Order_And_Volume_Limits.mq5.Уважаемый админ
Я пытаюсь использовать эту функцию, но она возвращает 0 во всех случаях.
Мой билд MT5 - 2280
double orders_volume_on_symbol=PendingsVolume(symbol);выдает ошибку, нет такой функции
И после того, как я изменил функцию, чтобы не включать отложенные ордера, она дает 0
Это потому, что max_volume равен 0, а open_volume равен 0;
Почему максимальный объем равен 0, если нет открытых позиций?
Build 2715