Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Много подписчиков на сигнале? Задумайся о платной подписке!
Sergey Gritsay
5543
Sergey Gritsay 2010.05.01 11:13 
Нужен простой пример как узнать сработал стоплосс или тейкпрофит у определенной позиции в истории.
o_O
Модератор
23319
o_O 2010.05.02 00:00  
sergey1294 писал(а)  :
Нужен простой пример как узнать сработал стоплосс или тейкпрофит у определенной позиции в истории.
нверно по аналогии с МТ4. или по положительному профиту или по цене закрытия.
Sergey Gritsay
5543
Sergey Gritsay 2010.05.02 06:24  
sergeev:
нверно по аналогии с МТ4. или по положительному профиту или по цене закрытия.

 В мт4 проще это организовать, ордер  можно отыскать в истории по его тикету. а в мт5 у открытой позиции номер тикета один, у закрытой другой. В общем нужен аналог этой статьи из MQL4

http://articles.mql4.com/ru/119

События в МetaТrader 4 - Статьи по MQL4
  • articles.mql4.com
События в МetaТrader 4 - Статьи по MQL4: примеры использования экспертов, тестирования и оптимизации
Владимир
809
Владимир 2010.05.02 09:33  

Было бы намного проще если бы разработчики в функцию OnTrade() ввели коды типа: 1-открыта позиция, 2-закрыта, 3-сработал стоп-лосс, 4-модифицирован стоп-лосс и т. д.

Валерий
1436
Валерий 2010.05.03 07:31  
Ну, по комменту то довольно просто  проверяется. Вопрос в том, насколько такая проверка легитимна.

Проверяет, как была закрыта последняя позиция по символу:

void OnStart()
  {
//--- request trade history
   HistorySelect(0,TimeCurrent());
   uint total_deal=HistoryDealsTotal();
   for(uint i=total_deal-1;i>=0;i--)
     {
      ulong ticket=HistoryDealGetTicket(i);
      if(!(HistoryDealGetString(ticket,DEAL_SYMBOL)==Symbol()) ||
         !(HistoryDealGetInteger(ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT))
           continue;
      enum_boss boss=boss((int)i);
      string str="Последняя позиция по символу "+Symbol()+" закрыта"; 
      switch (boss)
         {
          case stoploss:   str=str+" по стоп-лоссу";break;
          case takeprofit: str=str+" по тейк-профиту";break;
          case expert:     str=str+" экспретом";break;
          case hand:       str=str+" вручную";break;
         }
      Print (str);
      Print ("PositionID:",HistoryDealGetInteger(ticket,DEAL_POSITION_ID),
             ", Deal:",ticket,", Order:",HistoryDealGetInteger(ticket,DEAL_ORDER),
             ", Close_price:",HistoryDealGetDouble(ticket,DEAL_PRICE),
             ", Volume:",HistoryDealGetDouble(ticket,DEAL_VOLUME),"Lots",
             ", Profit:",HistoryDealGetDouble(ticket,DEAL_PROFIT),
             ", Comment:",HistoryDealGetString(ticket,DEAL_COMMENT));
      break;  
     }
  }
//+------------------------------------------------------------------+
enum enum_boss
  {
   hand,expert,stoploss,takeprofit
  };
//+------------------------------------------------------------------+
//| Get the property value "enum_boss".                              |
//| INPUT:  num_deal-number deals in deals history list.             |
//| OUTPUT: the property value "enum_boss".                          |
//| REMARK: enum_boss boss - deals initiator.                                                      |
//+------------------------------------------------------------------+
enum_boss boss(int num_deal)
  {
    ulong ticket=HistoryDealGetTicket(num_deal);
    if(HistoryDealGetInteger(ticket,DEAL_MAGIC)>0)
      return(expert);
    if(StringFind(HistoryDealGetString(ticket,DEAL_COMMENT),"[sl")>=0)
      return(stoploss);
    if(StringFind(HistoryDealGetString(ticket,DEAL_COMMENT),"[tp")>=0)
      return(takeprofit);
    return(hand);      
  }
//+------------------------------------------------------------------+
Sergey Gritsay
5543
Sergey Gritsay 2010.05.03 15:27  
Valmars:
Ну, по комменту то довольно просто  проверяется. Вопрос в том, насколько такая проверка легитимна.

Проверяет, как была закрыта последняя позиция по символу:

  Спасибо за помощь, проблема в том что нужно отыскать нужную позицию в истории среди множества и узнать как она закрылась.
Валерий
1436
Валерий 2010.05.04 23:49  
sergey1294:
  Спасибо за помощь, проблема в том что нужно отыскать нужную позицию в истории среди множества и узнать как она закрылась.

А какова исходная информация для поиска : ордер, участвовавший в формировании позиции, сделка, принадлежащая позиции, время и символ, по которому была открыта позиция ?

В MQL5 все ордера, сделки и сама позиция отмечены одним и тем же Position identifier, который равен тиккету ордера, открывшего позицию. Его и надо использовать для поиска. А как его получить зависит от того, что Вам известно.

Mikhail Filimonov
5918
Mikhail Filimonov 2012.04.11 02:13  

Добрый день!

Я делаю так:

Узнаю билет ордера (order_tiket), при установке ордера,

а дальше

if ( order_ticket > 0 )
  {
//--- Check for stoploss triggered
        ResetLastError();
       
        if ( !OrderSelect( order_ticket ) )
        {
          if ( GetLastError() == ERR_TRADE_ORDER_NOT_FOUND )
          {
            order_ticket = 0;
            Print( "Order removed by stoploss or takeprofit." );
          }
        }

   } 

 

Работает 100% в отличии от HistorySelect 

 

Михаил 

Rashid Umarov
Админ
6606
Rashid Umarov 2012.04.13 11:05  
Mikalas:

Работает 100% в отличии от HistorySelect 

Функция работает как то нет так, как заявлено в справке? HistorySelect()

Примечание

Функция HistorySelect() создает в mql5-программе список ордеров и список сделок для дальнейшего обращения к элементам списка посредством соответствующих функций. Размер списка сделок можно узнать с помощью функции HistoryDealsTotal(), размер списка ордеров в истории можно получить с HistoryOrdersTotal(). Перебор элементов списка ордеров лучше всего проводить функцией HistoryOrderGetTicket(), для элементов списка сделок соответственно подходит функция HistoryDealGetTicket().

После применения функции HistoryOrderSelect() список ордеров в истории, доступных mql5-программе, сбрасывается и заполняется заново найденным ордером, если поиск ордера по тикету завершился успешно. То же самое относится к списку сделок, доступных mql5-программе – он сбрасывается функцией HistoryDealSelect() и заполняется заново в случае успешного получения сделки по номеру тикета.


Rashid Umarov
Админ
6606
Rashid Umarov 2012.04.13 11:05  
Mikalas:

Добрый день!

Я делаю так:

..
Лучше делайте так : Как вставлять код
MQL5.community - Памятка пользователя
MQL5.community - Памятка пользователя
  • 2010.02.23
  • MetaQuotes Software Corp.
  • www.mql5.com
Вы недавно зарегистрировались и у вас возникли вопросы: Как вставить картинку в сообщение на форуме, как красиво оформить исходный код MQL5, где находятся ваши Личные сообщения? В этой статье мы подготовили для вас несколько практических советов, которые помогут быстрее освоиться на сайте MQL5.community и позволят в полной мере воспользоваться доступными функциональными возможностями.
o_O
Модератор
23319
o_O 2012.04.13 11:55  
Rosh:
Лучше делайте так : Как вставлять код

если честно, то в том тексте теряется "Кнопка SRC", за огромной картинкой вставки видео. Эта картинка, имеющая почти созвучное название очень сбивает с толку.

Добавьте пожалуйста такую же картинку для вставки кода. То есть какое будет окно при вставке кода при нажатии на эту кнопку SRC  ну и в него кода немного.


/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий