Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 558

 

Все, нашел ошибку. Некоторым нужно озвучить свой вопрос, чтобы понять потом, как же он ошибся.

К сожалению к таким персонажам отношусь, видимо, и я. ((( 

 
Konstantin Nikitin:

OrderSend
OrderSelect

Я так полагаю вы имеете ввиду по номеру тикета?

Есть "подводные камни"?

 
Decromor:

Приветствую!


Обратиться к ордеру можно с помощью команды OrderSelect по его номеру.

Вопрос, возможно ли заранее знать номера существующих ордеров, что бы не перебирать их все? Например запоминать этот номер при открытии нового ордера.

Я так понимаю этот номер присваивается по порядку начиная с 1. Какие могут быть нюансы?

За ранее спасибо.

  1. Обратиться можно по его индексу в списке ордеров (при переборе в цикле), либо по его тикету (если он заранее известен)
  2. Не желательно - при любом сбое (перезапуске советника, перезагрузке терминала, сбое системы, и т.д.), запомненные тикеты могут быть утеряны. Значит нужно их хранить либо в глобальных переменных терминала, либо в файле, что реализуемо, но сложнее обычного перебора, который делается не на каждом тике, а лишь по мере надобности.
  3. Нет. Начиная с номера 1, и по порядку возрастания - только в тестере.
  4. Пожалуйста.
 
Artyom Trishkin:
  1. Обратиться можно по его индексу в списке ордеров (при переборе в цикле), либо по его тикету (если он заранее известен)
  2. Не желательно - при любом сбое (перезапуске советника, перезагрузке терминала, сбое системы, и т.д.), запомненные тикеты могут быть утеряны. Значит нужно их хранить либо в глобальных переменных терминала, либо в файле, что реализуемо, но сложнее обычного перебора, который делается не на каждом тике, а лишь по мере надобности.
  3. Нет. Начиная с номера 1, и по порядку возрастания - только в тестере.
  4. Пожалуйста.

А возможно при запуске программы в теле OnInit() пробежаться в цикле OrdersTotal() и собрать всю инфу по открытым ордерам, в частности OrderTicket()?

string orders[][3];

int OnInit() {
   for (int n = OrdersTotal() + 1; n >= 0; n--) {              
      if (OrderSelect(n, SELECT_BY_POS, MODE_TRADES)) {
         int i = (ArraySize(orders) / 3);
         ArrayResize(orders, i + 1);
         orders[i][0] = IntegerToString(OrderTicket());
         orders[i][1] = IntegerToString(OrderType());
         orders[i][2] = DoubleToString(OrderOpenPrice(), Digits);   
      } 
   }
   return(INIT_SUCCEEDED);
}


При автоматическом закрытии ордера по TP или SP можно получить данные этого ордера?

 
Decromor:

А возможно при запуске программы в теле OnInit() пробежаться в цикле OrdersTotal() и собрать всю инфу по открытым ордерам, в частности OrderTicket()?


При автоматическом закрытии ордера по TP или SP можно получить данные этого ордера?

  1. Можно. А далее что? Ордера могут меняться со временем, и информация по ним, собранная при инициализации, устареет.
  2. Нужно найти последний закрытый ордер и получить всю необходимую по нему информацию.
 
Artyom Trishkin:
  1. Можно. А далее что? Ордера могут меняться со временем, и информация по ним, собранная при инициализации, устареет.
  2. Нужно найти последний закрытый ордер и получить всю необходимую по нему информацию.

Я при BUY, SELL сохраняю мне нужные данные в массив, далее в тике кручу этот массив и в зависимости от цены делаю мне необходимые изменения (Перенос SL в безубыток, закрытие ордера после разворота и т.п.) обратившись к нужному ордеру по тикету.

Но у меня имеются ордера с TP и SL, которые без моего ведома могут закрыться. Вариант каждый тик смотреть последний закрывшийся ордер и искать его в моём массиве, для корректировки этого массива мне не нравится.

"Ордера могут меняться со временем, и информация по ним, собранная при инициализации, устареет." Я так полагаю это и имеется ввиду - закрытие ордера?

Вижу только один вариант - в тике крутить 2 цикла, мой с ордерами и OrdersTotal() и это мне тоже не нравится.

"но сложнее обычного перебора, который делается не на каждом тике, а лишь по мере надобности." Пожалуйста, поделитесь этим алгоритмом.

 
Decromor:

А возможно при запуске программы в теле OnInit() пробежаться в цикле OrdersTotal() и собрать всю инфу по открытым ордерам, в частности OrderTicket()?


При автоматическом закрытии ордера по TP или SP можно получить данные этого ордера?

А зачем всё это переводить в строку??? Тип string?

 
Decromor:

А возможно при запуске программы в теле OnInit() пробежаться в цикле OrdersTotal() и собрать всю инфу по открытым ордерам, в частности OrderTicket()?


При автоматическом закрытии ордера по TP или SP можно получить данные этого ордера?

struct SOrders
{
     int ticket,
         type;
     double price;
} orders[];

int OnInit() {
   for (int n = 0; n < OrdersTotal(); n++)
   {              
      if(!OrderSelect(n, SELECT_BY_POS, MODE_TRADES)) continue;
      int i = ArraySize(orders);
      if(ArrayResize(orders, i+1) < i+1) continue;
      orders[i].ticket = OrderTicket();
      orders[i].type   = OrderType();
      orders[i].price  = OrderOpenPrice();
   }
   return(INIT_SUCCEEDED);
}
 
Konstantin Nikitin:
Большое спасибо за инфу, для меня это что-то новенькое.
 
Alexey Viktorov:

А зачем всё это переводить в строку??? Тип string?

т.к. к примеру тикет имеет тип Int, цена Double, а массив может быть только одного типа.
Причина обращения: