Jump to content
Sign in to follow this  
дима123

как найти тип последнего закрытого ордера

Recommended Posts

дима123
Здравствуйте!

Подскажите пожалуйста: как найти тип последнего закрытого ордера и если он закрылся по тейкпрофиту одно условие если по стоплоссу другое условие. За ранние всех благодарю.

Share this post


Link to post
Share on other sites
AntFX

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

после того, как последний закрытый ордер будет найден, нужно сравнить его комментарий со строками "[sl]" или "[tp]", только так можно достоверно узнать, что ордер был закрыт по стопу или по тейку, а не вручную. Правда, у некоторых брокеров эта отметка не ставится. Но другого способа надежно определить, что ордер был закрыт именно по стопу или тейку, в MQL4 нет


1

Share this post


Link to post
Share on other sites
Wowa

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

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


Мы сами знаем, что проблема не имеет решения. Мы хотим знать, как ее решать. (с) К. Хунта

Share this post


Link to post
Share on other sites
AntFX

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

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


1

Share this post


Link to post
Share on other sites
дима123

я не совсем понел ответ возможно потому что не корректно написал вопрос попытаюсь перефразировать

я учусь писать советник мне нужно найти последний закрытый ордер я буду это делать так: for (int i = OrderHistoryTotal()-1; i>=0; i--) (я ищу всегда с конца так сокращается время на поиск ведь ордеров может быть много) если что то не так скажите

дальше я его выбираю if (OrderSelect(i, ORDER_BY_POS, MODE_HISTORY))

далее мне нужно узнать какой у этого ордера тип 

далее мне нужно узнать как он закрылся по тейкпрофиту или по стоплоссу

потом написать условие: если ордер закрылся по тейкпрофиту одно условие если по стоплоссу другое условие.

 

P.S Спасибо что откликнулись.

Share this post


Link to post
Share on other sites
Ugar68

Если ордер закрылся по тейк профит

if(StringFind(OrderComment(),"[tp",0)>=0)

{

 

}

Если ордер закрылся по стоп лосс или стоп трейд

if(StringFind(OrderComment(),"[sl",0)>=0)

{

 

}
Такая конструкция работает на многих ДЦ, но не на всех.

Edited by Ugar68

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
дима123

Если ордер закрылся по тейк профит

if(StringFind(OrderComment(),"[tp",0)>=0)

{

 

}

Если ордер закрылся по стоп лосс или стоп трейд

if(StringFind(OrderComment(),"[sl",0)>=0)

{

 

}

Такая конструкция работает на многих ДЦ, но не на всех.

А между скобками я могу писать условия правильно я понел?

Share this post


Link to post
Share on other sites
Ugar68

А между скобками я могу писать условия правильно я понел?

Между фигурными скобками пишется действие которое должно выполниться, или дополнительные условия потом действия.


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
Circle

 

Здравствуйте!
Подскажите пожалуйста: как найти тип последнего закрытого ордера и если он закрылся по тейкпрофиту одно условие если по стоплоссу другое условие. За ранние всех благодарю.

 

Попробуйте вот эту функцию.

Функция возвращает тикет последнего закрытого ордера или -1 если таких ордеров нет.

После чего вы можете получить всю необходимую информацию по этому ордеру.

И соответственно установить был ли закрыть ордер по тейк профиту или по стоп лосу.

Как это сделать советовали выше. 

 

GetLastCloseOrderTicket(string Smb, int MN)
{
   datetime tclose=0;
   int i=0,ticket=0;
   for (i=0; i<OrdersHistoryTotal(); i++) 
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (MN!=0) 
         if (OrderMagicNumber()!=MN) continue;
      if (OrderSymbol()!=Smb) continue;
      if (tclose<OrderCloseTime())
      {
         tclose=OrderCloseTime();
         ticket=OrderTicket();         
      }
   }
   if (OrderSelect(ticket,SELECT_BY_TICKET)) return(OrderTicket());
   else return(-1);

}
Edited by Circle

Что такое форекс? Это там где деньги лежат.  :)

Share this post


Link to post
Share on other sites
Ugar68

 

Попробуйте вот эту функцию.

Функция возвращает тикет последнего закрытого ордера или -1 если таких ордеров нет.

После чего вы можете получить всю необходимую информацию по этому ордеру.

И соответственно установить был ли закрыть ордер по тейк профиту или по стоп лосу.

Как это сделать советовали выше. 

GetLastCloseOrderTicket(string Smb, int MN)
{
   datetime tclose=0;
   int i=0,ticket=0;
   for (i=0; i<OrdersHistoryTotal(); i++) 
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (MN!=0) 
         if (OrderMagicNumber()!=MN) continue;
      if (OrderSymbol()!=Smb) continue;
      if (tclose<OrderCloseTime())
      {
         tclose=OrderCloseTime();
         ticket=OrderTicket();         
      }
   }
   if (OrderSelect(ticket,SELECT_BY_TICKET)) return(OrderTicket());
   else return(-1);

}

Зачем последний выбор ордера, если надо вернуть тикет и он уже найден?

Почему бы сразу не присвоить int i=0,ticket=-1;, а закончить return(ticket);?


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
Circle

Зачем последний выбор ордера, если надо вернуть тикет и он уже найден?

Почему бы сразу не присвоить int i=0,ticket=-1;, а закончить return(ticket);?

Можно конечно и так, но я почему то реализовал это в таком виде.


Что такое форекс? Это там где деньги лежат.  :)

Share this post


Link to post
Share on other sites
Ugar68

Можно конечно и так, но я почему то реализовал это в таком виде.

Так обычно делают, когда надо вернуть какой то другой параметр ордера. Например лот или тип.

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

Edited by Ugar68

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
Circle

Так обычно делают, когда надо вернуть какой то другой параметр ордера. Например лот или тип.

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

Я скорее всего подстраховался и OrderSelect использовал для проверки существования ордера перед тем как вернуть его тикет. 

И уже в последующем коде не надо было вызывать OrderSelect

Например:

int ticet = GetLastCloseOrderTicket(Smb, MN);

if (ticet>0)

{

    Print(OrderOpenPrice());

    ....

    и всякие другие манипуляции с ордером.

}

 

А если точнее то уже не помню зачем это надо было. 


Что такое форекс? Это там где деньги лежат.  :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×