Как по очереди (по одному) удалить отложенные ордера?

 

Здравствуйте, уважаемые програмисты!

Помогите советом как написать код, что бы отложенные ордера удалялись по одному, последовательно? Например, есть три отлоденных ордера, при появлении четвертого, самый первый должен удалиться, при появлении пятого, удаляется второй и т.д...

 
Aleksandr Glebov:

Здравствуйте, уважаемые програмисты!

Помогите советом как написать код, что бы отложенные ордера удалялись по одному, последовательно? Например, есть три отлоденных ордера, при появлении четвертого, самый первый должен удалиться, при появлении пятого, удаляется второй и т.д...

А как бы вы их удаляли, если бы они физически были перед вашими глазами на столе в виде просто пронумерованных "кубиков"? Алгоритм каков?
 
Aleksandr Glebov:

Здравствуйте, уважаемые програмисты!

Помогите советом как написать код, что бы отложенные ордера удалялись по одному, последовательно? Например, есть три отлоденных ордера, при появлении четвертого, самый первый должен удалиться, при появлении пятого, удаляется второй и т.д...

Необходимо определиться, по какому признаку производится нумерация. К примеру, на ум сразу же приходит два варианта: по времени и по цене.

Если по времени, то нужно перебрать все ордера и найти среди них ордер с наименьшим временем открытия. Этот ордер и удаляем. Если же критерий "по цене", то среди Buy Stop или Sell Limit ордеров находим ордер с наибольшей ценой, а среди Buy Limit или Sell Stop ордеров находим ордер с наибольшей ценой. Удаляем его:

bool IsExtraOrderCriterion(int ticket)
{
   // Описать критерий выявления лишнего ордера
   return true;
}


int GetTicketOfExtraOrder()
{
   int ticket = -1;
   int cnt = 0;

   for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS))
         continue;

      if (OrderSymbol() != _Symbol)
         continue;
 
      if (OrderMagicNumber() != i_magicNumber)
         continue; 

      if (OrderType() == OP_BUY || OrderType() == OP_SELL)
         continue; 

      cnt++;
      if (IsExtraOrderCriterion(ticket))  
         ticket = OrderTicket();
   }

   if (cnt > 3)                       // Тут подставить нужное количество ордеров, при достижении которого следует удалять лишний ордер
      return ticket;

   return -1;
}

void OnTick()
{
   int ticket = GetExtraOrderCriterion();
   if (ticket > 0)
      OrderDelete(ticket);
}
 
Aleksandr Glebov:

Здравствуйте, уважаемые програмисты!

Помогите советом как написать код, что бы отложенные ордера удалялись по одному, последовательно? Например, есть три отлоденных ордера, при появлении четвертого, самый первый должен удалиться, при появлении пятого, удаляется второй и т.д...

Хорошо бы писать для ТМ4 или МТ5
 
Artyom Trishkin:
А как бы вы их удаляли, если бы они физически были перед вашими глазами на столе в виде просто пронумерованных "кубиков"? Алгоритм каков?

Я сделал вот так, только это работает не верно. Проблема в том, что два вида ордера одновременно не работают (появляется какая-то серьезная ошибка и работа прекращается, думаю связано это с массивами...). А если оставить один вид ордера, например байстоп, то работает отлично! Вот в чем

//+------------------------------------------------------------------+

int mas_tic_b[4]; //массив где будут храниться тикеты одеров бай

int mas_tic_s[4];//массив где будут храниться тикеты одеров сел

void Delete() //при достижении ордеров > 3 работает функция
{
   for(int i = 0; i<OrdersTotal(); i ++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == mag)
         {
            if(OrderType() == OP_BUYSTOP)
            {
               mas_tic_b[i] = OrderTicket();
               int index_min_ticeta_bay = ArrayMinimum(mas_tic_b, WHOLE_ARRAY, 0);//сортируем массив по мин.значениям
               int min_tic_bay = mas_tic_b[index_min_ticeta_bay];//получаем минимальный тикет
               bool del_bay = OrderDelete(min_tic_bay, clrNONE);//и удаляем 
            }
            if(OrderType() == OP_SELLSTOP)
            {
               mas_tic_s[i] = OrderTicket();
               int index_min_ticeta_sell = ArrayMinimum(mas_tic_s, WHOLE_ARRAY, 0);
               int min_tic_sell = mas_tic_s[index_min_ticeta_sell];
               bool del_sell = OrderDelete(min_tic_sell, clrNONE);
            }
         }
      }
   }
}
//+------------------------------------------------------------------+

 
Aleksandr Glebov:

Я сделал вот так, только это работает не верно. Проблема в том, что два вида ордера одновременно не работают (появляется какая-то серьезная ошибка и работа прекращается, думаю связано это с массивами...). А если оставить один вид ордера, например байстоп, то работает отлично! Вот в чем

//+------------------------------------------------------------------+

int mas_tic_b[4]; //массив где будут храниться тикеты одеров бай

int mas_tic_s[4];//массив где будут храниться тикеты одеров сел

void Delete() //при достижении ордеров > 3 работает функция
{
   for(int i = 0; i<OrdersTotal(); i ++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == mag)
         {
            if(OrderType() == OP_BUYSTOP)
            {
               mas_tic_b[i] = OrderTicket();
               int index_min_ticeta_bay = ArrayMinimum(mas_tic_b, WHOLE_ARRAY, 0);//сортируем массив по мин.значениям
               int min_tic_bay = mas_tic_b[index_min_ticeta_bay];//получаем минимальный тикет
               bool del_bay = OrderDelete(min_tic_bay, clrNONE);//и удаляем 
            }
            if(OrderType() == OP_SELLSTOP)
            {
               mas_tic_s[i] = OrderTicket();
               int index_min_ticeta_sell = ArrayMinimum(mas_tic_s, WHOLE_ARRAY, 0);
               int min_tic_sell = mas_tic_s[index_min_ticeta_sell];
               bool del_sell = OrderDelete(min_tic_sell, clrNONE);
            }
         }
      }
   }
}
//+------------------------------------------------------------------+

С заполненными массивами работайте уже за пределами цикла. И лучше сделайте цикл обратным - от OrdersTotal()-1 до >=0. Это первое, что пришло на ум при беглом (сонном) взгляде на код.

ЗЫ. Код вставляйте правильно, пожалуйста.

 
Artyom Trishkin:

С заполненными массивами работайте уже за пределами цикла. И лучше сделайте цикл обратным - от OrdersTotal()-1 до >=0. Это первое, что пришло на ум при беглом (сонном) взгляде на код.

ЗЫ. Код вставляйте правильно, пожалуйста.

Все равно не помогает...
 
Aleksandr Glebov:
Все равно не помогает...
Логика такова: как только отложенных ордеров становится больше трёх, ищем ордер с наименьшим временем открытия (установки) и удаляем его.
 
Artyom Trishkin:
Логика такова: как только отложенных ордеров становится больше трёх, ищем ордер с наименьшим временем открытия (установки) и удаляем его.
Вы знаете как это написать?
 
Aleksandr Glebov:
Вы знаете как это написать?
Я много чего знаю, в том числе и это конечно же ;)
 
Artyom Trishkin:
Я много чего знаю, в том числе и это конечно же ;)
Покажи код, как это реализовать
Причина обращения: