нверно по аналогии с МТ4. или по положительному профиту или по цене закрытия.
В мт4 проще это организовать, ордер можно отыскать в истории по его тикету. а в мт5 у открытой позиции номер тикета один, у закрытой другой. В общем нужен аналог этой статьи из MQL4
- www.mql5.com
Было бы намного проще если бы разработчики в функцию OnTrade() ввели коды типа: 1-открыта позиция, 2-закрыта, 3-сработал стоп-лосс, 4-модифицирован стоп-лосс и т. д.
Проверяет, как была закрыта последняя позиция по символу:
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); } //+------------------------------------------------------------------+
Ну, по комменту то довольно просто проверяется. Вопрос в том, насколько такая проверка легитимна.
Проверяет, как была закрыта последняя позиция по символу:
Спасибо за помощь, проблема в том что нужно отыскать нужную позицию в истории среди множества и узнать как она закрылась.
А какова исходная информация для поиска : ордер, участвовавший в формировании позиции, сделка, принадлежащая позиции, время и символ, по которому была открыта позиция ?
В MQL5 все ордера, сделки и сама позиция отмечены одним и тем же Position identifier, который равен тиккету ордера, открывшего позицию. Его и надо использовать для поиска. А как его получить зависит от того, что Вам известно.
Добрый день!
Я делаю так:
Узнаю билет ордера (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
Михаил
Работает 100% в отличии от HistorySelect
Функция работает как то нет так, как заявлено в справке? HistorySelect()
Примечание
Функция HistorySelect() создает в mql5-программе список ордеров и список сделок для дальнейшего обращения к элементам списка посредством соответствующих функций. Размер списка сделок можно узнать с помощью функции HistoryDealsTotal(), размер списка ордеров в истории можно получить с HistoryOrdersTotal(). Перебор элементов списка ордеров лучше всего проводить функцией HistoryOrderGetTicket(), для элементов списка сделок соответственно подходит функция HistoryDealGetTicket().
После применения функции HistoryOrderSelect() список ордеров в истории, доступных mql5-программе, сбрасывается и заполняется заново найденным ордером, если поиск ордера по тикету завершился успешно. То же самое относится к списку сделок, доступных mql5-программе – он сбрасывается функцией HistoryDealSelect() и заполняется заново в случае успешного получения сделки по номеру тикета.
Добрый день!
Я делаю так:
..![MQL5.community - Памятка пользователя MQL5.community - Памятка пользователя](https://c.mql5.com/36/1/mql5-community-pamyatka-polzovately__9.png)
- 2010.02.23
- MetaQuotes Software Corp.
- www.mql5.com
если честно, то в том тексте теряется "Кнопка SRC", за огромной картинкой вставки видео. Эта картинка, имеющая почти созвучное название очень сбивает с толку.
Добавьте пожалуйста такую же картинку для вставки кода. То есть какое будет окно при вставке кода при нажатии на эту кнопку SRC ну и в него кода немного.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования