У вас отслеживается условие правильно, по символу и номеру, но потом перебивает условие
OrdersTotal()
Которое выдает всё что есть в терминале
У вас отслеживается условие правильно, по символу и номеру, но потом перебивает условие
Которое выдает всё что есть в терминале
Нет у меня сейчас стоит только
if(OrdersTotal() == 0)
И именно про это я и спросила.
Но поняла по вашему ответу, что нужно использовать иной вариант
так как if(OrdersTotal() == 0) отслеживает все что происходит в терминале
вот функция возращает количество и работает безошибочно.
//+----------------------------------------------------------------------------+ | //| Описание : Возвращает количество позиций. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfPositions(string sy="", int op=-1, int mn=-1) { int i, k=OrdersTotal(), kp=0; if(sy=="0") sy=_Symbol; for(i=0; i<k; i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol()==sy || sy=="") { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(op<0 || OrderType()==op) { if(mn<0 || OrderMagicNumber()==mn) kp++; } } } } } return(kp); } //End
Более компактное решение
//+------------------------------------------------------------------+ //| Подсчет ордеров по символу и типу | //+------------------------------------------------------------------+ int OP(int type=-1){ int i,res=0; for(i=OrdersTotal()-1; i>=0; i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic||Magic==0)) { if(OrderType()==type || type<0) res++;} return(res);}
if (OP(0) == 0) //Buy ордеров нет по символу
if (OP(1) == 0) //Sell ордеров нет по символу
if (OP(-1) == 0) //Всех типов ордеров нет по символу
и избегайте условий, которые не будут выполняться так, как написано
а выполнятся в точности по алгоритму
for(int i = OrdersTotal() - 1; i>0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { if(OrdersTotal() >= 0)
в Вашем случае i никогда не будет 0
то есть то что написано ниже >=0 можно уже не читать
Скажите если я в советнике пишу
при этом у меня в данном терминале запущено 2-3 этих же советника на других парах
данная функция проверяет наличие ордеров на данной паре или вообще в терминале?
Так как я видела что для проверки делают и иное
Вот пример
Наличие позиций по символу можно проверить проще
bool OrdersTotals(const int magic, const string symbol, const int type) { for(int i = 0; i<OrdersTotal(); i++) { if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderMagicNumber() != magic) continue; if(OrderSymbol() != symbol) continue; if(OrderType() != type) continue; return true; } return false; }
Вам ведь просто нужно проверить и все. Тут я прописал проверку типа. Это MT4 поэтому отложки в куче будут. Но можно по другому просто проверить какие вам нужны ордера.
Сам смысл думаю понятен. А дальше ваша фантазия.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Скажите если я в советнике пишу
при этом у меня в данном терминале запущено 2-3 этих же советника на других парах
данная функция проверяет наличие ордеров на данной паре или вообще в терминале?
Так как я видела что для проверки делают и иное
Вот пример