Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Используй MQL5 Cloud Network. Тестируй роботов с гиперскоростью!
Forex Trader
114255
Forex Trader 2005.11.12 00:42 
При попытке выбрать ордер, функция 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() с таким же успехом можно вставить остальные параметры. Что здесь не так? Хелп плз!!!

MetaQuotes Software Corp.
Модератор
181025
MetaQuotes Software Corp. 2005.11.12 12:58  
Сразу видна ошибка:
if (OrderSelect (0, SELECT_BY_POS, MODE_TRADES))


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

Forex Trader
114255
Forex Trader 2005.11.12 15:53  
Сразу видна ошибка:
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
......................................................
MetaQuotes Software Corp.
Модератор
181025
MetaQuotes Software Corp. 2005.11.13 19:40  
Я упростил пример до такого состояния:
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



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

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

Forex Trader
114255
Forex Trader 2005.11.13 22:09  
В тестере при выборках ордеров они меняются местами.
Видимо, на это влияет механизм автоматической пересортировки сделок в базе.

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


Спасибо Ренат.
Это будет следующий билд?
MetaQuotes Software Corp.
Модератор
181025
MetaQuotes Software Corp. 2005.11.13 23:45  
В тестере при выборках ордеров они меняются местами.
Видимо, на это влияет механизм автоматической пересортировки сделок в базе.

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


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

Как минимум, в понедельник выложим текущий билд.
Forex Trader
114255
Forex Trader 2005.11.16 14:10  
понедельник 21.11.05 ? :)
MetaQuotes Software Corp.
Модератор
181025
MetaQuotes Software Corp. 2005.11.16 19:13  
понедельник 21.11.05 ? :)

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