По сути функция должна работать согласно тому, чего Вы от нее ожидаете (вернет true, если есть рыночный ордер на текущем символе, и false, если рыночного ордера нет). Но более оптимальный и удобочитаемый вариант функции таков:
{
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS))
continue;
if (OrderSymbol() != Symbol())
continue;
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
return true;
}
return false;
}
Что именно здесь более оптимально и удобно:
- При переборе количества ордеров лучше использовать обратный перебор, т. к. на каждой итерации прямого цикла будет вызываться функция OrdersTotal(). В такой же интерпретации OrdersTotal() будет вызвана только один раз, независимо от кол-ва итераций цикла.
- Нет огромного числа вложенных if, что более явно показывает структуру кода.
- Убирается необходимость использования глобальной переменной symb (экономия стековой памяти, которой всегда мало).
- Код будет выполняться одинаково даже в том случае, если в какой-то момент разработчики МТ решат изменить значения именованных констант OP_BUY и OP_SELL (в Вашем коде есть явная привязка к этим значениям).
По сути функция должна работать согласно тому, чего Вы от нее ожидаете (вернет true, если есть рыночный ордер на текущем символе, и false, если рыночного ордера нет). Но более оптимальный и удобочитаемый вариант функции таков:
{
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS))
continue;
if (OrderSymbol() != Symbol())
continue;
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
return true;
}
return false;
}
Что именно здесь более оптимально и удобно:
- При переборе количества ордеров лучше использовать обратный перебор, т. к. на каждой итерации прямого цикла будет вызываться функция OrdersTotal(). В такой же интерпретации OrdersTotal будет вызвана только один раз, независимо от кол-ва итераций цикла.
- Нет огромного числа вложенных if, что более явно показывает структуру кода.
- Убирается необходимость использования глобальной переменной symb (экономия стековой памяти, которой всегда мало).
- Код будет выполняться одинаково даже в том случае, если в какой-то момент разработчики МТ решат изменить значения именованных констант OP_BUY и OP_SELL (в Вашем коде есть явная привязка к этим значениям).
isexistmarket , серьезно? что за функция такая, гейропейцы наверно придумали?)
По сути функция должна работать согласно тому, чего Вы от нее ожидаете (вернет true, если есть рыночный ордер на текущем символе, и false, если рыночного ордера нет). Но более оптимальный и удобочитаемый вариант функции таков:
{
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS))
continue;
if (OrderSymbol() != Symbol())
continue;
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
return true;
}
return false;
}
Что именно здесь более оптимально и удобно:
- При переборе количества ордеров лучше использовать обратный перебор, т. к. на каждой итерации прямого цикла будет вызываться функция OrdersTotal(). В такой же интерпретации OrdersTotal будет вызвана только один раз, независимо от кол-ва итераций цикла.
- Нет огромного числа вложенных if, что более явно показывает структуру кода.
- Убирается необходимость использования глобальной переменной symb (экономия стековой памяти, которой всегда мало).
- Код будет выполняться одинаково даже в том случае, если в какой-то момент разработчики МТ решат изменить значения именованных констант OP_BUY и OP_SELL (в Вашем коде есть явная привязка к этим значениям).
Всё гуд только опять.
Если точно используется 2 и более вызовов одной и той же функции с одинаковым результатом(тип ордера,количество знаков после точки в сиволе...), то нужно создавать локальную переменную(перед цыклом).
{
int type=-1;
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS))
continue;
if (OrderSymbol() != Symbol())
continue;
type=OrderType();
if (type == OP_BUY || type == OP_SELL)
return true;
}
return false;
}
isexistmarket , серьезно? что за функция такая, гейропейцы наверно придумали?)
Всё гуд только опять.
Если точно используется 2 и более вызовов одной и той же функции с одинаковым результатом(тип ордера,количество знаков после точки в сиволе...), то нужно создавать локальную переменную(перед цыклом).
{
int type=-1;
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS))
continue;
if (OrderSymbol() != Symbol())
continue;
type=OrderType();
if (type == OP_BUY || type == OP_SELL)
return true;
}
return false;
}
Всё гуд только опять.
Если точно используется 2 и более вызовов одной и той же функции с одинаковым результатом(тип ордера,количество знаков после точки в сиволе...), то нужно создавать локальную переменную(перед цыклом).
Не надо плодить лишние переменные. В первом варианте правильно было предложено:
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
return true;
...
Иначе через некоторое время сами запутаетесь в своих переменных. Например 'type' может означать тип чего угодно, а вот OrderType() только одна, хорошо документирована и более выразительна.
Просто считайте, что функции в MQL имеют нулевой оверхед и будет вам счастье.
Нет.
Не надо плодить лишние переменные. В первом варианте правильно было предложено:
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
return true;
...
Иначе через некоторое время сами запутаетесь в своих переменных. Например 'type' может означать тип чего угодно, а вот OrderType() только одна, хорошо документирована и более выразительна.
Просто считайте, что функции в MQL имеют нулевой оверхед и будет вам счастье.
...
OrderType() это функция. Вызов её ведёт к дополнительному использованию ресурсов.
Закрыть глаза и не видеть это??? Очень хорошее предложение.
Пользуйтесь им, но не советуйте.По сути функция должна работать согласно тому, чего Вы от нее ожидаете (вернет true, если есть рыночный ордер на текущем символе, и false, если рыночного ордера нет). Но более оптимальный и удобочитаемый вариант функции таков:
{
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS))
continue;
if (OrderSymbol() != Symbol())
continue;
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
return true;
}
return false;
}
Что именно здесь более оптимально и удобно:
- При переборе количества ордеров лучше использовать обратный перебор, т. к. на каждой итерации прямого цикла будет вызываться функция OrdersTotal(). В такой же интерпретации OrdersTotal() будет вызвана только один раз, независимо от кол-ва итераций цикла.
- Нет огромного числа вложенных if, что более явно показывает структуру кода.
- Убирается необходимость использования глобальной переменной symb (экономия стековой памяти, которой всегда мало).
- Код будет выполняться одинаково даже в том случае, если в какой-то момент разработчики МТ решат изменить значения именованных констант OP_BUY и OP_SELL (в Вашем коде есть явная привязка к этим значениям).
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте. Посмотрите следующий код и скажите правильно ли он написан:
int OnInit()
{
symb=Symbol();
}
void OnTick()
{
...
}
bool isexistmarket()
{
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==symb)
{
if(OrderType()<=1) return true;
}
}
}
return false;
}
Смысл функции "isexistmarket()" проверять существует ли открытый ордер(сделка) по инструменту, на котором работает робот. Функция верна?