Вопрос о функции OnTradeTransaction - страница 6

 
Mikalas:

Нет, транзакции не теряются, просто они могут приходить не в определённой последовательности.

Только TRADE_TRANSACTION_REQUEST приходит всегда первым, иначе Вы не получите билет ордера. 

Читайте ВНИМАТЕЛЬНО документацию. 

Михаил, извини, но мне показалось что ты ответил только на последний пост, а он как следствие всего что описывалось в первом на этой странице.

И как-то странно слышать в свой адрес рекомендацию читать документацию. Я её читаю, перечитываю и ещё раз читаю.

А уточни пожалуйста что ты понимаешь под "Билет ордера"? такого в документации я не встречал.

 
AlexeyVik:

Михаил, извини, но мне показалось что ты ответил только на последний пост, а он как следствие всего что описывалось в первом на этой странице.

И как-то странно слышать в свой адрес рекомендацию читать документацию. Я её читаю, перечитываю и ещё раз читаю.

А уточни пожалуйста что ты понимаешь под "Билет ордера"? такого в документации я не встречал.

Билет (ulong  ticket) - это уникальное число, которое присваивается выставленному ордеру.

Это число не меняется в течении всей жизни ордера, равно как и в истории.

По билету (tikcet) мы получаем информацию об ордере.

 
Mikalas:

Билет (ulong  ticket) - это уникальное число, которое присваивается выставленному ордеру.

Это число не меняется в течении всей жизни ордера, равно как и в истории.

По билету (tikcet) мы получаем информацию об ордере.

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


Но всё-же поведение тикетов достаточно странное.

Пример: тикеты и объёмы из прогона в тестере.

Открывается позиция Buy 0.1 лот, тикет 2. Выставляется SellStop 0.78 тикет 3

Когда активируется SellStop остаётся позиция 0.68 а в историю попадает ордер 3 объёмом 0.78 и с отрицательной прибылью.

При этом остаётся позиция с тикетом 4

А куда-же пропал убыток позиции с тикетом 2 совершенно не понятно.


В общем не всегда можно верить тому что написано. Потому, что написано не полностью.

Выходит так, что если активируется отложник то тикет остаётся, но если при этом закрывается другая позиция тикет назначается новый.

 

Тоже самое с тикетами происходит если позиция и отложник в одном направлении. Тикет меняется.


 
AlexeyVik:

Видимо это и есть потеря транзакций... и, в первую очередь, (вырезка из документации)

Василий, а это тестер или демка? У меня пробы с тестера. Интересно есть-ли разница срабатывания OnTradeTransaction в тестере и на счёте? При случае проверю.

Это демка. Возможно событийная модель на тестере и в реалтайм различается.

 

У меня в МТ5 на Фортс стоит несколько ботов. В том числе на одном инструменте несколько. Использую для определения сколько у какого "робота" контрактов пробежку по истории сделок. В принципе все работает. Сейчас решил попробовать использовать  OnTradeTransaction. Идея, как реализовать простая - приходит сделка, смотрим сколько по ней продано или куплено контрактов и какой бот совершил сделку (по спец комментарию к сделке или Magic Number), записываем эту информацию в файл. А вопрос такой. Если OnTradeTransaction будет в каждом советнике, то как они будут вызываться последовательно или как-то параллельно? Допустим произошла сделка  - пошла куча событий и по каждому событию последовательно в каждом боте будет вызываться OnTradeTransaction? Т.е., я так понимаю, что проще сделать один обработчик OnTradeTransaction, который будет отвечать за всех ботов? Если что я не программист, хотя и напрограммировал кучу всего уже. Код может и убогий, но всегда добиваюсь, что работает как надо.

 
votor:

У меня в МТ5 на Фортс стоит несколько ботов. В том числе на одном инструменте несколько. Использую для определения сколько у какого "робота" контрактов пробежку по истории сделок. В принципе все работает. Сейчас решил попробовать использовать  OnTradeTransaction. Идея, как реализовать простая - приходит сделка, смотрим сколько по ней продано или куплено контрактов и какой бот совершил сделку (по спец комментарию к сделке или Magic Number), записываем эту информацию в файл. А вопрос такой. Если OnTradeTransaction будет в каждом советнике, то как они будут вызываться последовательно или как-то параллельно? Допустим произошла сделка  - пошла куча событий и по каждому событию последовательно в каждом боте будет вызываться OnTradeTransaction? Т.е., я так понимаю, что проще сделать один обработчик OnTradeTransaction, который будет отвечать за всех ботов? Если что я не программист, хотя и напрограммировал кучу всего уже. Код может и убогий, но всегда добиваюсь, что работает как надо.

Да, в каждом советнике отработает OnTradeTransaction. Их надо фильтровать по символу и если на одном символе не один советник, то и по магику.

 

Спасибо за ответ. Это я уже проверил и вижу, что во всех советниках отрабатывает. Вопрос в другом ( может глупый вопрос ), все эти OnTradeTransaction во всех советниках будут последовательно отрабатывать, вначале в одном советнике, затем в следующем и т.д., а не параллельно, правильно?  Т.е. по идее раз отработка их последовательная(?), то лучше сделать один обработчик на все боты и в нем фильтровать то что нужно.

 
votor:

Спасибо за ответ. Это я уже проверил и вижу, что во всех советниках отрабатывает. Вопрос в другом ( может глупый вопрос ), все эти OnTradeTransaction во всех советниках будут последовательно отрабатывать, вначале в одном советнике, затем в следующем и т.д., а не параллельно, правильно?  Т.е. по идее раз отработка их последовательная(?), то лучше сделать один обработчик на все боты и в нем фильтровать то что нужно.

Не проверял, но кажется никакой закономерности. Типа кто первый встал того и тапки. А возможно, что если встали одновременно, то каждому по одному тапку.

Пока мне представляется лучшим вариантом фильтровать по символу и магику. Чья позиция тот и пишет о ней информацию.

 

Что-то не получается у меня пояснить, видимо. Вот реальный пример. Вот такой код:

void OnTradeTransaction(const MqlTradeTransaction& trans,

                        const MqlTradeRequest& request,

                        const MqlTradeResult& result)

  {

      Count++;   

  Print("Ontrade_test = ",Count);

 }

Обработчик стоит в двух советниках, при совершении 1 сделки он отрабатывается множество раз в двух советниках. Код выдает:

   18:31:06.495 ontrade_trans_functions (MXI-12.17,H1) Ontrade_test = 1

   18:31:06.495 ontrade_trans_functions2 (MXI-12.17,H1) Ontrade_test = 1

   18:31:06.497 ontrade_trans_functions (MXI-12.17,H1) Ontrade_test = 2

   18:31:06.497 ontrade_trans_functions2 (MXI-12.17,M5) Ontrade_test = 2

   18:31:06.498 ontrade_trans_functions (MXI-12.17,M5) Ontrade_test = 3

   18:31:06.498 ontrade_trans_functions2 (MXI-12.17,H1) Ontrade_test = 3

   18:31:06.500 ontrade_trans_functions (MXI-12.17,M5) Ontrade_test = 4

   18:31:06.500 ontrade_trans_functions2 (MXI-12.17,H1) Ontrade_test = 4 ...

и так далее.

Видно, что время отработки  OnTradeTransaction  в двух советниках совпадает до миллисекунд. Вот и возник вопрос, событие "сделка" приходит вначале в один  OnTradeTransaction в одном советнике, затем в следующий в другом советнике или каким-то образом параллельно сразу во все обработчики во всех советниках поступает? Ну типа параллельная многопоточная работа или как это называется в программировании. Я уверен, что все происходит последовательно, просто отрабатыается быстро в одну миллисекунду, но на всякий случай спросил.

Причина обращения: