Совершенно верно!
Мой эксперт регистрирует событие Trade трижды при открытии-закрытии-срабатывании стопов. Первое- установка ордера, второе- открытие позиции, а вот третье событие ничего не изменяет в истории, Наверное, здесь и должна модифицироваться история сделок и ордеров. А они появляются в истории позже.
я ещё недошол до этого
но такая штука я заметил в описании функции
HistorySelect
Примечание
Функция HistorySelect() создает в mql5-программе список ордеров и список сделок для дальнейшего обращения к элементам списка посредством соответствующих функций. Размер списка сделок можно узнать с помощью функции HistoryDealsTotal(), размер списка ордеров в истории можно получить с HistoryOrdersTotal(). Перебор элементов списка ордеров лучше всего проводить функцией HistoryOrderGetTicket(), для элементов списка сделок соответственно подходит функция HistoryDealGetTicket().
После применения функции HistoryOrderSelect() список ордеров в истории, доступных mql5-программе, сбрасывается и заполняется заново найденным ордером, если поиск ордера по тикету завершился успешно. То же самое относится к списку сделок, доступных mql5-программе – он сбрасывается функцией HistoryDealSelect() и заполняется заново в случае успешного получения сделки по номеру тикета.
то есть возможность стоит ещё раз вызвать функцию HistorySelect для того чтобы сбросить текущий фильтр.
но опять такиже надо пробовать но я пока не добрался до этой части
После применения функции HistoryOrderSelect() список ордеров в истории, доступных mql5-программе, сбрасывается и заполняется заново найденным ордером, если поиск ордера по тикету завершился успешно. То же самое относится к списку сделок, доступных mql5-программе – он сбрасывается функцией HistoryDealSelect() и заполняется заново в случае успешного получения сделки по номеру тикета.
то есть возможность стоит ещё раз вызвать функцию HistorySelect для того чтобы сбросить текущий фильтр.
из одного " заново найденного ордера " ?
Для функции HistoryOrderSelect() необходим тиккет ордера. Ну, допустим, запомнили мы его на прошлом событии Trade, когда он ещё стоял в очереди на исполнение. Но ведь таких ордеров может быть одновременно > 1. И какой из них выбирать и как ? По времени установки ? Так оно может совпадать. Запоминать тиккеты всех установленных ордеров и потом их все анализировать ?
Думаю, нужен конкретный пример от разработчика, который знает, как оно всё у них там внутри крутится, чтобы не заниматься догадками и домыслами.
Думаю, нужен конкретный пример от разработчика, который знает, как оно всё у них там внутри крутится, чтобы не заниматься догадками и домыслами.
Посмотрите пример для функции HistorySelect, в нем реализован перебор сделок из диапазона дат, указанных в функции HistorySelect:
void OnStart() { color BuyColor =Blue; color SellColor=Red; //--- request trade history HistorySelect(0,TimeCurrent()); //--- create objects string name; uint total=HistoryDealsTotal(); ulong ticket=0; double price; double profit; datetime time; string symbol; long type; long entry; //--- for all deals for(uint i=0;i<total;i++) { //--- try to get deals ticket if(ticket=HistoryDealGetTicket(i)) { //--- get deals properties price =HistoryDealGetDouble(ticket,DEAL_PRICE); time =HistoryDealGetInteger(ticket,DEAL_TIME); symbol=HistoryDealGetString(ticket,DEAL_SYMBOL); type =HistoryDealGetInteger(ticket,DEAL_TYPE); entry =HistoryDealGetInteger(ticket,DEAL_ENTRY); profit=HistoryDealGetDouble(ticket,DEAL_PROFIT); //--- only for current symbol if(price && time && symbol==Symbol()) { //--- create price object name="TradeHistory_Deal_"+string(ticket); if(entry) ObjectCreate(0,name,OBJ_ARROW_RIGHT_PRICE,0,time,price,0,0); else ObjectCreate(0,name,OBJ_ARROW_LEFT_PRICE,0,time,price,0,0); //--- set object properties ObjectSetInteger(0,name,OBJPROP_SELECTABLE,0); ObjectSetInteger(0,name,OBJPROP_BACK,0); ObjectSetInteger(0,name,OBJPROP_COLOR,type?BuyColor:SellColor); if(profit!=0) ObjectSetString(0,name,OBJPROP_TEXT,"Profit: "+string(profit)); } } } //--- apply on chart ChartRedraw(); }
Совершенно верно!
Мой эксперт регистрирует событие Trade трижды при открытии-закрытии-срабатывании стопов. Первое- установка ордера, второе- открытие позиции, а вот третье событие ничего не изменяет в истории, Наверное, здесь и должна модифицироваться история сделок и ордеров. А они появляются в истории позже.
В моей ситуации работы со стопами пока нету. Я всего лишь отлавливаю появление ордеров и анализирую соответствующие им сделки. Т.о. ловлю вход/выход из рынка и переворот.
У меня Trade поступает только по два раза: когда появился и имеет тип started и когда ордер уже обработан сервером и открыта позиция. Самое прискорбное то, что во время второго появления trade я обращаюсь к истории сделок, но последней сделки там не нахожу, хотя по логике она там должна быть! И получается, что нужная сделка оказывается в истории только в следующему вызову Trade (т.е. когда я еще один ордер), вот так с запаздыванием на один ордер все и обрабатывается :)
HistorySelect
Уже пробовал в самых разных местах! С руки, с ноги из под колена.. Че только не делал, пока не прочитал примечание про "список ордеров в истории, доступных mql5-программе, сбрасывается и заполняется заново найденным ордером". Так что HistorySelect тут не поможет.
И какой из них выбирать и как ? По времени установки ?
Я для обработки события беру последний ордер и последнее событие:
HistoryDealGetTicket(HistoryDealsTotal()-1); // Последняя сделка в истории :) HistoryOrderGetTicket(HistoryOrdersTotal()-1); // Последний ордер
Но и перебирать я их пробовал, когда столкнулся с описанной проблемой. Последней сделки в истории все равно нету.
Ну и согласен с Valamars, остается только ждать комментариев от разработчиков, т.к. нигде нет описания последовательности выполнения торговых операций, во всяком случае я его не нашел.
Посмотрите пример для функции HistorySelect, в нем реализован перебор сделок из диапазона дат, указанных в функции HistorySelect:
Да, похоже я напутал: не с той строки считал события. Вот пример:
2010.04.01 23:45:01 Test (EURUSD,M1) OrdersTotal= 0 PositionsTotal= 3 HistoryOrdersTotal= 263 HistoryDealsTotal= 2642010.04.01 23:45:01 Test (EURUSD,M1) POSITION_MAGIC= 123456
2010.04.01 23:45:01 Test (EURUSD,M1) LastHistoryDealsTicket= 667912 USDCHF DEAL_MAGIC= 123456 ENTRY= 0
2010.04.01 23:45:01 Test (EURUSD,M1) LastHistoryOrderTicket= 608119 ORDER_MAGIC= 123456 // Далее ничего не изменилось
2010.04.01 23:45:01 Test (EURUSD,M1) Обработка события Trade... // Третье событие Trade
2010.04.01 23:45:01 Test (EURUSD,M1) OrdersTotal= 0 PositionsTotal= 3 HistoryOrdersTotal= 263 HistoryDealsTotal= 264 // Число позиций и ордеров и сделок в истории инкрементировано
2010.04.01 23:45:01 Test (EURUSD,M1) POSITION_MAGIC= 123456
2010.04.01 23:45:01 Test (EURUSD,M1) LastHistoryDealsTicket= 667912 USDCHF DEAL_MAGIC= 123456 ENTRY= 0 // Новая сделка добавилась в историю
2010.04.01 23:45:01 Test (EURUSD,M1) LastHistoryOrderTicket= 608119 ORDER_MAGIC= 123456 // Новый ордер перешёл в историю
2010.04.01 23:45:01 Test (EURUSD,M1) Обработка события Trade... // Второе событи Trade
2010.04.01 23:45:01 PriceChannel_ (USDCHF,M15) Short Position by USDCHF to be opened // Открылась позиция
2010.04.01 23:44:58 Test (EURUSD,M1) OrdersTotal= 1 PositionsTotal= 2 HistoryOrdersTotal= 262 HistoryDealsTotal= 263 // Добавился ордер
2010.04.01 23:44:58 Test (EURUSD,M1) LastHistoryDealsTicket= 667814 USDCHF DEAL_MAGIC= 0 ENTRY= 1 // Старая сделка
2010.04.01 23:44:58 Test (EURUSD,M1) LastHistoryOrderTicket= 608018 ORDER_MAGIC= 0 // Старый тиккет
2010.04.01 23:44:58 Test (EURUSD,M1) OrderTicket= 608119 ORDER_MAGIC= 123456 // Новый ордер
2010.04.01 23:44:58 Test (EURUSD,M1) Обработка события Trade... // Первое событие Trade
2010.04.01 23:43:43 Test (EURUSD,M1) Init: OrdersTotal= 0 PositionsTotal= 2 HistoryOrdersTotal= 262 HistoryDealsTotal= 263
Извиняюсь за неверную информацию. Но всё же , зачем нужно третье событие Trade ? Или только у меня глюк такой возникает ?
А что означает "... список ордеров в истории, доступных mql5-программе, сбрасывается и заполняется заново найденным ордером..." . Это что, весь список сбрасываетсмя в 0 и состоит
из одного " заново найденного ордера " ?
Для функции HistoryOrderSelect() необходим тиккет ордера. Ну, допустим, запомнили мы его на прошлом событии Trade, когда он ещё стоял в очереди на исполнение. Но ведь таких ордеров может быть одновременно > 1. И какой из них выбирать и как ? По времени установки ? Так оно может совпадать. Запоминать тиккеты всех установленных ордеров и потом их все анализировать ?
Думаю, нужен конкретный пример от разработчика, который знает, как оно всё у них там внутри крутится, чтобы не заниматься догадками и домыслами.
вот тут я сам понять не могу что иммели ввиду разработчики....
вроде с одной стороны поидее список истории посли применения хистору селект должен состатья из ордеров по фильтру
тоесть исключительно для это программы или для терминала в целом....
и когда я делаю перебор ордеров и возвршаю тикет мне что опять хисториселект делать????
про пример ладно в примере все понятно но тут проблема в тексте описания...
Может он трайде слишком быстро прибегает недождавшись результата и поэтому невидит
может его спать попробовать положить на неск секунд.... ну так как тест....
насколько я помню в мт5 есть такие веши когда колеса впереди машины мчаться
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте!
Пишу код для отслеживания изменений в ордерах/позициях/сделках по событию Trade. Не могу понять одну вещь. Представьте следующую ситуацию:
Затем
Это нормально? Или это косяк разработчиков?
Если это нормально, тогда как иначе можно понять какая торговая операция выполнена??