Чтение тикетов из файла и работа с ордерами

 

Доброго времени суток, господа.

Проблема такая: автоматически устанавливаются по 2 отложенника buystop и sellstop. Их тикеты запоимнаются в массиве и пишутся в файл. Задача: если оба ордера buystop стали рыночными - удалить sellstopы, если sellstopы в рынок перешли - удалить байстопы.

Если не закрывать советника - он сохраняет тикеты в массив и всё прекрасно работает. Закрываешь терминал - открываешь, тикеты записываются в массив из файла. Записываются правильно - адресация правильная, проверял, но блин напрочь отказывается манипулировать ордерами. Хотя массив заполнен правильно, тикеты у ордеров прежние. Должно работать, но не работает.

Если надо могу выложить куски кода.

 
Вопрос на засыпку -- нафига сохранять тикеты в файл?
 
TheXpert:
Вопрос на засыпку -- нафига сохранять тикеты в файл?
На каждом тике проверяю - если байстопы перешли в рынок то удаляю селлстопы, и наоборот. Тикеты хранятся в массиве. Если случайно был закрыт терминал, массив стерся - тикеты просрали... На этот случай они пишутся в файл
 
ilgar-90:
На каждом тике проверяю - если байстопы перешли в рынок то удаляю селлстопы, и наоборот. Тикеты хранятся в массиве. Если случайно был закрыт терминал, массив стерся - тикеты просрали... На этот случай они пишутся в файл

Зачем просто - когда можно сложно
 
ilgar-90:

Наиболее эффективный способ работы с тикетами -- запрашивать их у терминала когда они необходимы.

Все остальное -- ненадежно или громоздко. Проверено многими кодерами под MQL4

 
Vinin:

Зачем просто - когда можно сложно
А можно развернутый ответ пожалуйста?
 
TheXpert:

Наиболее эффективный способ работы с тикетами -- запрашивать их у терминала когда они необходимы.

Вот с этого места поподробнее, я записываю. Что значит "запрашивать у терминала"
 
ilgar-90:
Вот с этого места поподробнее, я записываю. Что значит "запрашивать у терминала"
int i, countOrders = OrdersTotal();

for (i = countOrders-1; i >=0 ; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber)
{
if(OrderType() == OP_BUYSTOP) OrderClose(OrderTicket(), OrderLots(), Ask, Slip, CLR_NONE);
...
}
}
 

Пользуюсь этой функцией и без разницы закрывалься терминал или нет.

https://www.mql5.com/ru/forum/131859/page3#434226

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает тикет последней открытой позиции или -1             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTicketLastPos(string sy="", int op=-1, int mn=-1) {
  datetime o;
  int      i, k=OrdersTotal(), r=-1;

  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) {
              if (o<OrderOpenTime()) {
                o=OrderOpenTime();
                r=OrderTicket();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
 

Так ладно, виноват. Опишу проблему яснее и подробнее. Противоположные отложенники у меня устанавливаются группами. К примеру 3 группы ордеров, в каждой группе по 4 ордера (2 байстоп, 2 селлстоп).

Для каждой группы надо проверять: если байстопы в этой группе перешли в рынок то удаляются селлстопы в этой группе, и наоборот. Как вот ЭТО грамотно реализовать? Спасибо за ответы.

 
Каждой группе назначаете свой магик привязанный к времени открытия, и потом проверяете.
Причина обращения: