Разработчикам - OrderSelect не селектит

 
При попытке выбрать ордер, функция OrderSelect выбирает то один, то другой ордер, напоминает качели.

Код эксперта (build 186)
int start()
  {
   Print("tick-----------------------------------------------------------------"); // для наглядности

   if (OrdersTotal() < 1) 
       {
        OrderSend (Symbol(), OP_SELL, 0.1, Bid, 3, 0, 0, "xxx", 0, 0, Blue); // ставим фанарный ордер бай
        return(0);
        }

   int amount; // общее кол-во открытых ордеров бай
   if (OrdersTotal() > 0) 
       {
        for (int cnt = 0; cnt < OrdersTotal(); cnt++)        
             {
              if (OrderSelect (0, SELECT_BY_POS, MODE_TRADES)) 
                  {
                   if (OrderType() == OP_SELL && OrderSymbol() == Symbol())                     
                       {
                        amount++;                                 
                        Print("cnt = " + cnt); 
                        Print("OrderTicket = " + OrderTicket());  
                        }
                   } else Print(GetLastError());
              }
        }

   if (amount == 1)  // ставим еще один фанарный ордер (всего их два)
       {
        for (int j = 0; j < OrdersTotal(); j++) 
             {
              if (OrderSelect (j, SELECT_BY_POS, MODE_TRADES))   
                  {
                   if (OrderType() == OP_SELL && OrderSymbol() == Symbol())                          
                       {
                        if (Bid >= OrderOpenPrice() + 1 * Point)
                            {
                             OrderSend (Symbol(), OP_SELL, 0.1, Bid, 5, 0, 0, "xxx", 0, 0, Blue);
                             return(0);
                             }
                        }
                   } else Print(GetLastError());          
              }
        }
   
   return(0);
  }



В логе такая инфа

00:28:35 XXX GBPUSD,M1: loaded successfully
00:28:36 XXX started for testing
00:28:36 2005.04.11 01:41  XXX GBPUSD,M1: tick-----------------------------------------------------------------
00:28:36 2005.04.11 01:41  XXX GBPUSD,M1: open #1 sell 0.10 GBPUSD at 1.8824 ok
00:28:36 2005.04.11 01:42  XXX GBPUSD,M1: tick-----------------------------------------------------------------
00:28:36 2005.04.11 01:42  XXX GBPUSD,M1: cnt = 0
00:28:36 2005.04.11 01:42  XXX GBPUSD,M1: OrderTicket = 1
00:28:36 2005.04.11 01:43  XXX GBPUSD,M1: tick-----------------------------------------------------------------
................................................................
00:28:36 2005.04.11 01:57  XXX GBPUSD,M1: tick-----------------------------------------------------------------
00:28:36 2005.04.11 01:57  XXX GBPUSD,M1: cnt = 0
00:28:36 2005.04.11 01:57  XXX GBPUSD,M1: OrderTicket = 1
00:28:36 2005.04.11 01:57  XXX GBPUSD,M1: open #2 sell 0.10 GBPUSD at 1.8825 ok
00:28:36 2005.04.11 01:58  XXX GBPUSD,M1: tick-----------------------------------------------------------------
00:28:36 2005.04.11 01:58  XXX GBPUSD,M1: cnt = 0
00:28:36 2005.04.11 01:58  XXX GBPUSD,M1: OrderTicket = 2
00:28:36 2005.04.11 01:58  XXX GBPUSD,M1: cnt = 1
00:28:36 2005.04.11 01:58  XXX GBPUSD,M1: OrderTicket = 2
00:28:36 2005.04.11 01:59  XXX GBPUSD,M1: tick-----------------------------------------------------------------
00:28:36 2005.04.11 01:59  XXX GBPUSD,M1: cnt = 0
00:28:36 2005.04.11 01:59  XXX GBPUSD,M1: OrderTicket = 1
00:28:36 2005.04.11 01:59  XXX GBPUSD,M1: cnt = 1
00:28:36 2005.04.11 01:59  XXX GBPUSD,M1: OrderTicket = 1
00:28:36 2005.04.11 02:00  XXX GBPUSD,M1: tick-----------------------------------------------------------------
00:28:36 2005.04.11 02:00  XXX GBPUSD,M1: cnt = 0
00:28:36 2005.04.11 02:00  XXX GBPUSD,M1: OrderTicket = 2
00:28:36 2005.04.11 02:00  XXX GBPUSD,M1: cnt = 1
00:28:36 2005.04.11 02:00  XXX GBPUSD,M1: OrderTicket = 2
00:28:36 2005.04.11 02:01  XXX GBPUSD,M1: tick-----------------------------------------------------------------
00:28:36 2005.04.11 02:01  XXX GBPUSD,M1: cnt = 0
00:28:36 2005.04.11 02:01  XXX GBPUSD,M1: OrderTicket = 1
00:28:36 2005.04.11 02:01  XXX GBPUSD,M1: cnt = 1
00:28:36 2005.04.11 02:01  XXX GBPUSD,M1: OrderTicket = 1
00:28:36 2005.04.11 02:02  XXX GBPUSD,M1: tick-----------------------------------------------------------------
00:28:36 2005.04.11 02:02  XXX GBPUSD,M1: cnt = 0
00:28:36 2005.04.11 02:02  XXX GBPUSD,M1: OrderTicket = 2
00:28:36 2005.04.11 02:02  XXX GBPUSD,M1: cnt = 1
00:28:36 2005.04.11 02:02  XXX GBPUSD,M1: OrderTicket = 2
00:28:36 2005.04.11 02:03  XXX GBPUSD,M1: tick-----------------------------------------------------------------
..............................................................................и т.д.


Получается, что на каждый тик код выдает разные параметры ордеров, т.е. в цикле функция выбирает оба ордера, а возвращает значения одного, потом другого и так до беск. Вместо OrderTicket() с таким же успехом можно вставить остальные параметры. Что здесь не так? Хелп плз!!!

 
Сразу видна ошибка:
if (OrderSelect (0, SELECT_BY_POS, MODE_TRADES))


По логике видно, что вместо постоянного нулевого элемента должна стоять переменная счетчика cnt.

 
Сразу видна ошибка:
if (OrderSelect (0, SELECT_BY_POS, MODE_TRADES))


По логике видно, что вместо постоянного нулевого элемента должна стоять переменная счетчика cnt.



Вопрос не об этом, 0 (ноль) стоит специально для проверки селекта, т.е. открыто два ордера, (например)бай, мне нужно сравнить их цены открытия (использую при усреднении или локировании), но при выборе ордера среди открытых ордеров функция селект каждый тик выбирает то первый открытый ордер по списку, то второй, в результате имеем, что позиция ордера в списке одна, а цена другая. Хорошо, изменяем 0 (ноль) на cnt if (OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES))

добавим принт прайса
.........................
{
amount++;
Print("cnt = " + cnt); 
Print("OrderTicket = " + OrderTicket());
Print("OrderOpenPrice = " + DoubleToStr(OrderOpenPrice(),4));  
}
..........................



получаем теже яйца только сбоку, cnt для одного и того же ордера на каждом тике меняется местом

15:14:14 XXX GBPUSD,M1: loaded successfully
15:14:16 XXX started for testing
15:14:16 2005.04.11 01:41  XXX GBPUSD,M1: tick-----------------------------------------------------------------
15:14:16 2005.04.11 01:41  XXX GBPUSD,M1: open #1 sell 0.10 GBPUSD at 1.8824 ok
15:14:16 2005.04.11 01:42  XXX GBPUSD,M1: tick-----------------------------------------------------------------
15:14:16 2005.04.11 01:42  XXX GBPUSD,M1: cnt = 0
15:14:16 2005.04.11 01:42  XXX GBPUSD,M1: OrderTicket = 1
15:14:16 2005.04.11 01:42  XXX GBPUSD,M1: OrderOpenPrice = 1.8824
15:14:16 2005.04.11 01:43  XXX GBPUSD,M1: tick-----------------------------------------------------------------
............................................
15:14:16 2005.04.11 01:57  XXX GBPUSD,M1: open #2 sell 0.10 GBPUSD at 1.8825 ok
15:14:16 2005.04.11 01:58  XXX GBPUSD,M1: tick-----------------------------------------------------------------
15:14:16 2005.04.11 01:58  XXX GBPUSD,M1: cnt = 0
15:14:16 2005.04.11 01:58  XXX GBPUSD,M1: OrderTicket = 2
15:14:16 2005.04.11 01:58  XXX GBPUSD,M1: OrderOpenPrice = 1.8825
15:14:16 2005.04.11 01:58  XXX GBPUSD,M1: cnt = 1
15:14:16 2005.04.11 01:58  XXX GBPUSD,M1: OrderTicket = 1
15:14:16 2005.04.11 01:58  XXX GBPUSD,M1: OrderOpenPrice = 1.8824
15:14:16 2005.04.11 01:59  XXX GBPUSD,M1: tick-----------------------------------------------------------------
15:14:16 2005.04.11 01:59  XXX GBPUSD,M1: cnt = 0
15:14:16 2005.04.11 01:59  XXX GBPUSD,M1: OrderTicket = 1
15:14:16 2005.04.11 01:59  XXX GBPUSD,M1: OrderOpenPrice = 1.8824
15:14:16 2005.04.11 01:59  XXX GBPUSD,M1: cnt = 1
15:14:16 2005.04.11 01:59  XXX GBPUSD,M1: OrderTicket = 2
15:14:16 2005.04.11 01:59  XXX GBPUSD,M1: OrderOpenPrice = 1.8825
15:14:16 2005.04.11 02:00  XXX GBPUSD,M1: tick-----------------------------------------------------------------
15:14:16 2005.04.11 02:00  XXX GBPUSD,M1: cnt = 0
15:14:16 2005.04.11 02:00  XXX GBPUSD,M1: OrderTicket = 2
15:14:16 2005.04.11 02:00  XXX GBPUSD,M1: OrderOpenPrice = 1.8825
15:14:16 2005.04.11 02:00  XXX GBPUSD,M1: cnt = 1
15:14:16 2005.04.11 02:00  XXX GBPUSD,M1: OrderTicket = 1
15:14:16 2005.04.11 02:00  XXX GBPUSD,M1: OrderOpenPrice = 1.8824
15:14:16 2005.04.11 02:01  XXX GBPUSD,M1: tick-----------------------------------------------------------------
15:14:16 2005.04.11 02:01  XXX GBPUSD,M1: cnt = 0
15:14:16 2005.04.11 02:01  XXX GBPUSD,M1: OrderTicket = 1
15:14:16 2005.04.11 02:01  XXX GBPUSD,M1: OrderOpenPrice = 1.8824
15:14:16 2005.04.11 02:01  XXX GBPUSD,M1: cnt = 1
15:14:16 2005.04.11 02:01  XXX GBPUSD,M1: OrderTicket = 2
15:14:16 2005.04.11 02:01  XXX GBPUSD,M1: OrderOpenPrice = 1.8825
......................................................
 
Я упростил пример до такого состояния:
int start()
  {
   Print("tick-----------------------------------------------------------------");
   if (OrdersTotal() < 1) 
     {
      OrderSend (Symbol(), OP_SELL, 0.1, Bid, 3, 0, 0, "xxx", 0, 0, Blue);
      OrderSend (Symbol(), OP_SELL, 0.1, Bid, 3, 0, 0, "xxx", 0, 0, Blue);
      return(0);
     }
   if (OrdersTotal() > 0) 
     {
      for (int cnt = 0; cnt < OrdersTotal(); cnt++)        
        if (OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES)) 
           Print(cnt, " #",OrderTicket());  
     }
   return(0);
  }


И получил результаты:

EURUSD,H1: tick-----------------------------------------------------------------
EURUSD,H1: open #1 sell 0.10 EURUSD at 0.9925 ok
EURUSD,H1: open #2 sell 0.10 EURUSD at 0.9925 ok
EURUSD,H1: tick-----------------------------------------------------------------
EURUSD,H1: 0 #2
EURUSD,H1: 1 #1
EURUSD,H1: tick-----------------------------------------------------------------
EURUSD,H1: 0 #1
EURUSD,H1: 1 #2



В тестере при выборках ордеров они меняются местами.
Видимо, на это влияет механизм автоматической пересортировки сделок в базе.

Большое спасибо за найденную аномалию - обязательно исправим.

 
В тестере при выборках ордеров они меняются местами.
Видимо, на это влияет механизм автоматической пересортировки сделок в базе.

Большое спасибо за найденную аномалию - обязательно исправим.


Спасибо Ренат.
Это будет следующий билд?
 
В тестере при выборках ордеров они меняются местами.
Видимо, на это влияет механизм автоматической пересортировки сделок в базе.

Большое спасибо за найденную аномалию - обязательно исправим.


Спасибо Ренат.
Это будет следующий билд?

Как минимум, в понедельник выложим текущий билд.
 
понедельник 21.11.05 ? :)
 
понедельник 21.11.05 ? :)

Чуток опоздали с понедельником - сегодня-завтра будет выложен обновленный 186 билд в виде дистрибутива.