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

 
Mikalas:

Да, можно не использовать OnTradeTransaction, но тогда Вам придётся копаться в истории, что на много снизит общее быстродействие советника.

Выбор есть у каждого разработчика! 

Потому-то я и начал копать в этом направлении...

Спасибо за разъяснения. Буду копать дальше. Никто не торопит. :))))

 
AlexeyVik:

Потому-то я и начал копать в этом направлении...

Спасибо за разъяснения. Буду копать дальше. Никто не торопит. :))))

Дело в том, что приведённый мною пример - лишь страховка от того, что не наступит событие TradeTransaction

В действительности, у меня за 6 месяцев каждодневной работы советника на реальном счёте с 2000 транзакций в день,

НИ РАЗУ не было "аварийной" ситуации!  

Удачи!

 
C-4:
Как бы мы все поняли и хлопаем в ладоши от радости. Извините, но в Вашем коде черт ногу сломит. 

Да, совсем забыл, Василий!

Код 100% рабочий, - бросьте советника на демо и посмотрите как он работает

в штатном режиме, а потом закоментарьте функцию OnTradeTransaction и будет

видно, как работает "аварийный" режим. 

 
AlexeyVik:

Тоесть, если не применять асинхронность, то и отпадает необходимость в обработчике OnTradeTransaction поскольку сов будет ожидать ответ от сервера?

Не усложняйте. Что бы торговать на ФОРТС нет необходимости использовать асинхронность. Для начала посмотрите вот эту статью, главу 3: "Основы асинхронных операций". Там не много и самые азы, но для начала изучения хватит. Описываемый там код 100% асинхронный, тем не менее ему это не мешает работать в синхронном режиме, без получения всяких OnTradeTransaction и прочих событий. 

AlexeyVik:

Но пока я не нашёл оптимальный способ определения что активировался стоп.ордер. Например поставлен рыночный Buy 0.1 и SellStop 0.3 а когда активируется 0.3 то останется 0.2 и в какой момент надо следить за ним... Получается что на каждом тике надо следить за двумя ордерами. А мне хотелось разгрузить сов и вести контроль только после свершения транзакции. Даже не вести контроль, а единожды проверить что произошло и определиться как поступить. Но видимо не судьба... Наверное лучше вернуться к старым проверенным методам...

 Решение должно исходить из Вашей задачи. В MetaTrader 5 у Вас в каждый момент времени только одна активная позиция, вот за ней и следите. Не нужно лезть в историю ордеров. Если необходимость в истории ордеров все равно возникает, тогда нужно уточнить Вашу задачу.

 
Mikalas:

Да, совсем забыл, Василий!

Код 100% рабочий, - бросьте советника на демо и посмотрите как он работает

в штатном режиме, а потом закоментарьте функцию OnTradeTransaction и будет

видно, как работает "аварийный" режим. 

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

Mikalas:

Да, можно не использовать OnTradeTransaction, но тогда Вам придётся копаться в истории, что на много снизит общее быстродействие советника.

Выбор есть у каждого разработчика! 

Это неправда. Анализ истории не снижает быстродействие советника. Вместо Вашей длиннющей CheckOrder() достаточно написать что то типа этого (реальный рабочий код):

///
/// Отслеживает поступление новых трейдов в истории трейдов.
///
void TrackingHistoryDeals()
{
    int total = HistoryDealsTotal();
    //Перебираем все доступные трейды и формируем на их основе прототипы будущих позиций типа COrder
    for(; dealsCountNow < HistoryDealsTotal(); dealsCountNow++)
    {  
        ulong ticket = HistoryDealGetTicket(dealsCountNow);
        AddNewDeal(ticket);
        graphRebuild = true;
    }
}

Все. Поступление новых сделок будет автоматически детектироваться функцией TrackingHistoryDeals(), которая в свою очередь будет вызываться системным таймером. Что бы получить ускорение и не зависеть от установленного разрешения таймера эту функцию стоит также вызывать в OnTradeTransaction() например при наступлении события TRADE_TRANSACTION_DEAL_ADD. Если событие потеряется, ничего страшного не произойдет, просто эксперт чуть позже (у меня на 200 милисек.) узнает о сделанных изменениях, дождется следующего вызова таймера и благополучно узнает о срабатывании ордера.

 
C-4:

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

Это неправда. Анализ истории не снижает быстродействие советника. Вместо Вашей длиннющей CheckOrder() достаточно написать что то типа этого (реальный рабочий код):

Все. Поступление новых сделок будет автоматически детектироваться функцией TrackingHistoryDeals(), которая в свою очередь будет вызываться системным таймером. Что бы получить ускорение и не зависеть от установленного разрешения таймера эту функцию стоит также вызывать в OnTradeTransaction() например при наступлении события TRADE_TRANSACTION_DEAL_ADD. Если событие потеряется, ничего страшного не произойдет, просто эксперт чуть позже (у меня на 200 милисек.) узнает о сделанных изменениях, дождется следующего вызова таймера и благополучно узнает о срабатывании ордера.

Мы говорим с Вами на "разных языках".

Оставайтесь при своём мнении, а я, с Вашего позволения, останусь при своём. 

Вы даже не видите совсем очевидных вещей:

C приходом события TradeTransaction ВООБЩЕ НИЧЕГО не нужно проверять - ВСЕ данные уже есть!

Функция CheckOrder() ВООБЩЕ не работает, если пришло событие TradeTransaction!!!

 
Mikalas:

Мы говорим с Вами на "разных языках".

Оставайтесь при своём мнении, а я, с Вашего позволения, останусь при своём. 

Нет, мы с Вами говорим на одном языке - на MQL5 и его асинхронном диалекте OrderSendAsync. Как не крути, а задачи при Async необходимо решать одни и те же. Посмотрите на мою статью выше. Асинхронный код - синхронно взаимодействует с внешними экспертами. По сути нетривиальное проявление полиморфизма. Все благодаря тому, что упор в этом коде сделан на анализ изменений торгового окружения. Что еще раз доказывает, что событийная модель носит полезный но второстепенный характер, без которой можно и обойтись даже при асинхронных операциях.
 
C-4:
Нет, мы с Вами говорим на одном языке - на MQL5 и его асинхронном диалекте OrderSendAsync. Как не крути, а задачи при Async необходимо решать одни и те же. Посмотрите на мою статью выше. Асинхронный код - синхронно взаимодействует с внешними экспертами. По сути нетривиальное проявление полиморфизма. Все благодаря тому, что упор в этом коде сделан на анализ изменений торгового окружения. Что еще раз доказывает, что событийная модель носит полезный но второстепенный характер, без которой можно и обойтись даже при асинхронных операциях.
Василий, не упорствуйте, а запустите пример на демо - тогда ВСЁ поймёте!
 
Mikalas:
Василий, не упорствуйте, а запустите пример на демо - тогда ВСЁ поймёте!

Спасибо, больше как-то не хочется:

2015.02.05 23:37:21.147 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Не получен билет ордера. Запрос = 14

2015.02.05 23:37:20.767 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Не получен билет ордера. Запрос = 13

2015.02.05 23:37:20.464 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Не получен билет ордера. Запрос = 12

2015.02.05 23:37:20.105 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Не получен билет ордера. Запрос = 11

2015.02.05 23:37:19.912 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Не получен билет ордера. Запрос = 10

2015.02.05 23:37:19.832 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Не получен билет ордера. Запрос = 9

2015.02.05 23:37:19.036 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Не получен билет ордера. Запрос = 7

2015.02.05 23:37:05.723 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Не получен билет ордера. Запрос = 6

2015.02.05 23:36:59.919 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Не получен билет ордера. Запрос = 5

2015.02.05 23:36:59.199 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Не получен билет ордера. Запрос = 4

2015.02.05 23:36:53.693 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Не получен билет ордера. Запрос = 3

2015.02.05 23:36:52.689 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: Не получен билет ордера. Запрос = 2

2015.02.05 23:36:44.410 Experts AutoTrading is enabled

2015.02.05 23:36:41.995 TestTradeTrans (AUDCAD,H1) Ордер не отправлен! AUDCAD Код возврата = Автотрейдинг запрещен клиентским терминалом

2015.02.05 23:36:39.996 TestTradeTrans (AUDCAD,H1) Ордер не отправлен! AUDCAD Код возврата = Автотрейдинг запрещен клиентским терминалом

2015.02.05 23:36:39.958 TestTradeTrans (AUDCAD,H1) Ордер не отправлен! AUDCAD Код возврата = Автотрейдинг запрещен клиентским терминалом

2015.02.05 23:36:34.581 MQL5 'TestTradeTrans.mq5' successfully compiled

Успел вырубить, иначе отолжки заполонили бы весь терминал.

З.Ы. Кстати не удумайте этот код в статью зашивать. Пример неприемлем не при каких обстоятельсвах, т.к. жутко спамит бессысленными ордерами на каждом тике!!!  

 
C-4:

Спасибо, больше как-то не хочется:

Успел вырубить, иначе отолжки заполонили бы весь терминал.

:)

1. ПРИМЕР для ФОРТС

2. А брекпоинты нельзя поставить?

3. Создаётся такое впечатление, что Вы читаете сообщения через строчку :)  

 

Давайте поступим следующим образом.

Я буду задавать Вам вопросы, а Вы на них отвечать, хорошо?

 

Ворос 1. Как Вы узнаете Билет ордера (послав команду OrderSendAsync), если не пришло (или не используете) событие TradeTransaction? 

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