Вопрос по выбору нужного ордера

 

Всех приветствую!

 

Пример, есть история сделок:

1. EUR\USD sell magic1

2. EUR\USD buy magic5

3. EUR\USD sell magic3

4. EUR\USD sell magic2

5. EUR\USD buy magic4

 

Вопрос, как выбрать последний закрытый ордер с определённым магиком, например EUR\USD sell magic3, который по факту закрылся не последним?


Интересует реализация на языке mql4

 

А что тут сложного ?

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

 
George Merts:

А что тут сложного ?

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


а по подробнее и с примером кода можно? Я не мега-программист...

 
Sergei Smetankin:

Вопрос, как выбрать последний закрытый ордер ........, который по факту закрылся не последним?


Это как? Что такое "по факту"? Есть еще какое-то закрытие "не по факту"? 

 
Galina Bobro:  Это как? Что такое "по факту"? Есть еще какое-то закрытие "не по факту"? 
Тоже так написал. Потом подумал: Ордер, который закрылся последним, был открыт раньше и в базе данных стоит где-то впереди последнего. И удалил
 
Sergei Smetankin:  Вопрос, как выбрать последний закрытый ордер с определённым магиком, например EUR\USD sell magic3

Объясняю на арбузах. Надо выбрать самый большой (с самым большим временем открытия) полосатый (магик). Этап 1. Идем вдоль грядки и ищем полосатый. Нашли - кладем в корзинку. Отдыхаем, съедаем бутерброд. Этап 2. Идем с того места дальше. А если забыли - с самого начала. В корзинке полосатый арбуз. Если видим полосатый - сравниваем с корзинкиным. Если меньше - идем дальше. Если больше - вытряхиваем из корзинки и кладем найденный. Идем дальше...

Лучше всего написать и отлаживать скрипт. Сначала Этап 1. Получится - переходим к Этап 2.

 
double FindLastCloseOrder(int Mag)
{
   double Lotest=0;
   datetime t=0;
   for(int i=OrdersHistoryTotal()-1;i>=0;i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      {
         if(OrderCloseTime()>t)
         {
            if(OrderMagicNumber()==Mag)
            {
               Lotest=OrderLots();
            }           
            t=OrderCloseTime();
         }
      }
   }
   return(Lotest);
}
Этот код возвращает лотность нужного Вам закрытого ордера, можете поменять на свой параметр...
 
Galina Bobro:

Это как? Что такое "по факту"? Есть еще какое-то закрытие "не по факту"? 


Есть советник с n-количеством разных стратегий, отсюда и магики на одной паре разные, вот нужно сделать так, чтобы он находил последний закрытый ордер определённой стратегии из всей этой кучи закрытых ордеров, так понятнее?

 
Maksim Neimerik:
Этот код возвращает лотность нужного Вам закрытого ордера, можете поменять на свой параметр...

здесь не совсем верно, он найдёт последний закрытый ордер и проверит, совпадает ли магик с моим магиком, а если нужный мне ордер будет 3-им из закрывшихся, то он его не найдёт,

я думаю использовать, что-то типа:

while (OrderMagicNumber()==magic3)

//перебор всех ордеров до тех пор, пока не найдёт нужный

{

(условие)

}

но тут проблема в том, а если пустая история?...

 
LRA:

Объясняю на арбузах. Надо выбрать самый большой (с самым большим временем открытия) полосатый (магик). Этап 1. Идем вдоль грядки и ищем полосатый. Нашли - кладем в корзинку. Отдыхаем, съедаем бутерброд. Этап 2. Идем с того места дальше. А если забыли - с самого начала. В корзинке полосатый арбуз. Если видим полосатый - сравниваем с корзинкиным. Если меньше - идем дальше. Если больше - вытряхиваем из корзинки и кладем найденный. Идем дальше...

Лучше всего написать и отлаживать скрипт. Сначала Этап 1. Получится - переходим к Этап 2.


с 2-мя условиями, да, скорее так и нужно, вот как это реализовать?...

 
Sergei Smetankin:

с 2-мя условиями, да, скорее так и нужно, вот как это реализовать?...

//+----------------поиск последнего по времени ордера----------------------------+
int findlastcltime(int magik)
  {
   int ticket=0;
   datetime cltime=0;
   datetime oldcltime=0;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==magik)
            cltime=OrderCloseTime();
         if(oldcltime<cltime)
         {
            oldcltime = cltime();
             ticket = OrderTicket();
          }
        }
     }
   return(ticket);
  }

Вот используйте шаблонную функцию с ячейкой памяти, обычно кучу таких вот мелких функции сводят в одну, а вместо ячейки памяти используется уже глоб массив

Причина обращения: