Последний закрытый ордер?

 

Пишу советник в котором используеться отложные ордера.

Мне надо знать, какой ордер был закрыт последним, бай или селл, и как определить, закрыт он по лосю или по трейку?

Большое спасибо.

 

peter888 писал(а) >>

Мне надо знать, какой ордер был закрыт последним, бай или селл, и как определить, закрыт он по лосю или по трейку?

У мну так:

bool LastWasLoss(int MN, int type = -1)
{
   datetime max = 0;
   int ticket = -1;
   
   for(int i = 0; i < OrdersHistoryTotal(); i++)
   {
      // already closed
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == false) continue;
      // not current symbol
      if(OrderSymbol() != Symbol()) continue;
      // order was opened in another way
      if(OrderMagicNumber() != MN) continue;

      if(OrderType() != OP_BUY && OrderType() != OP_SELL) continue;
      
      datetime current = OrderOpenTime();
      
      if (current > max) 
      {
         max = current;
         ticket = OrderTicket();
      }
   }
   
   if (!OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) return (false);
   
   if (OrderType() == OP_BUY)
   {
      if (type == OP_BUY || type == -1)
      {
         return (OrderClosePrice() < OrderStopLoss() + 0.5*Point);
      }
      else
      {
         return (false);
      }
   }
   else if (OrderType() == OP_SELL)
   {
      if (type == OP_SELL || type == -1)
      {
         return (OrderClosePrice() > OrderStopLoss() - 0.5*Point);
      }
      else
      {
         return (false);
      }
   }

   return (false);
}
У Игоря еще можете посмотреть.
 
peter888 >>:

Пишу советник в котором используеться отложные ордера.

Мне надо знать, какой ордер был закрыт последним, бай или селл, и как определить, закрыт он по лосю или по трейку?

Большое спасибо.

можно проще вот пример скрипта


int start()
{
if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
{
double PROFIT =OrderProfit();//определяем закрылся в плюсе или в минусе
int TUPE =OrderType();//определяем ордер
}
Comment("PROFIT= "+PROFIT," TUPE= "+TUPE);
}

 
forex-k >>:

можно проще вот пример скрипта

Угу, удачи. Много чего можно проще, если вам с тестером побаловаться.

 

Поройтесь а кимовских функциях, или напишите свою подобную : перебор всех ордеров и фильтр по времени закрытия - обязателен...

 
Koнстантин:

можно проще вот пример скрипта


int start()
{
if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
{
double PROFIT =OrderProfit();//определяем закрылся в плюсе или в минусе
int TUPE =OrderType();//определяем ордер
}
Comment("PROFIT= "+PROFIT," TUPE= "+TUPE);
}

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

Ордер 1 открыт.

Ордер 2 Открыт.

Ордер 2 закрыт.

Ордео 1 закрыт.

То в током случае я по вашей формуле выведу лишь Ордер 2, а я хочу увидеть отрер 1 так как он закрыт был позже.

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

 
Peter:

Пишу советник в котором используеться отложные ордера.

Мне надо знать, какой ордер был закрыт последним, бай или селл

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

 
Andrey Sokolov:

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

в 2 прохода перебора ордеров решается такая задача: на первом проходе находите ордер с самым большим временем закрытия, на втором проходе ищете ордера со временем равным времени закрытия самого последнего ордера, вот что то похожее делал 

https://www.mql5.com/ru/forum/247136#comment_7557763

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

История ордеров
История ордеров
  • 2018.05.24
  • www.mql5.com
Всем привет! Столкнулся с проблемой... сделал робота, который читает историю и открывает сделку...
 
Igor Makanu:

в 2 прохода перебора ордеров решается такая задача: на первом проходе находите ордер с самым большим временем закрытия, на втором проходе ищете ордера со временем равным времени закрытия самого последнего ордера, вот что то похожее делал 

https://www.mql5.com/ru/forum/247136#comment_7557763

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

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

А про решение, если на вскидку, то я бы записывал тикет последнего и при новом поиске сравнивал записанный с предпоследним и нулем в while

 
Andrey Sokolov:

А про решение, если на вскидку, то я бы записывал тикет последнего и при новом поиске сравнивал записанный с предпоследним и нулем в while

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

 

Как-то так. Возврат функции сам придумывай (пофит, убыток, по стопу и т.п.).

ENUM_LAST_RESULT LastOrder(){
   for (int i=OrdersHistoryTotal()-1;i>=0;i--)
      if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)||OrderType()>1) continue;
      else return(LastResult());
   return(RESULT_NONE);}
//-------------------------------------------------------------------------
ENUM_LAST_RESULT LastResult(){
   Здесь сам изобретай велосипед, под mql5 элементарно решается, а в 4-ке нет возврата причины закрытия позиции. Поэтому или профит/убыток или больше/меньше уровня стопа, в любом случае неопределенность остается.
}
Причина обращения: