MT5 и скорость в боевом исполнении - страница 7

 
fxsaber:

Ничего вы не поняли. Когда делаем return, то заходим в On-функции сформированной очереди. Это может вызвать паузу, которая не даст СРАЗУ после первого OrderSend послать правильный второй.

А в чем пауза\задержка? В копировании 3х структур?

OnTradeTransaction( параметры )
{
        поместить параметры в очередь
        OnMain();
}

Вы же предлагаете накопить очередь через сохранение всех On-функций после return, дождавшись On-функцию, в которой будет сообщение о завершении первого OrderSend. И тогда только отправлять второй OrderSend.

Накапливать все события не обязательно. Не ждите копирования следующее события - можно обрабатывать события и до return и отправлять второй OrderSend как только для этого возникнут предпосылки

При этом еще и не понимаете, что тейк позиции может исполниться во время первого OrderSend, но его OnTradeTransaction будет в очереди позже (в ту же микросекунду, но позже), чем завершающий OnTradeTransaction от первого OrderSend.

А как Вам в такой ситуации поможет?

bool HandleNextEvent(ENUM_EVENT_TYPE);

Оно что здесь будет последним, что там

 
fxsaber:

Ничего вы не поняли. Когда делаем return, то заходим в On-функции сформированной очереди. Это может вызвать паузу, которая не даст СРАЗУ после первого OrderSend послать правильный второй.

Вы же предлагаете накопить очередь через сохранение всех On-функций после return, дождавшись On-функцию, в которой будет сообщение о завершении первого OrderSend. И тогда только отправлять второй OrderSend.

При этом еще и не понимаете, что тейк позиции может исполниться во время первого OrderSend, но его OnTradeTransaction будет в очереди позже (в ту же микросекунду, но позже), чем завершающий OnTradeTransaction от первого OrderSend.

Нет никакой очереди. Новое событие будет обрабатываться после текущего, а все произошедшие в этот период события будут проигнорированы. 

 
Очередь, или стек формируете вы сами, MQ этого не делает. 
 

На мой взгляд, решением проблемы стала бы возможность "подписаться" на какой-либо ордер. Т.е. чтобы терминал генерировал событие по возникновению какой-либо сделки по ордеру.

Но это должны реализовать разработчики, а не мы. Все наши решения, так или иначе будут возвращаться к истории сделок. У  меня такой критичности по микросекундам нет, но реально

раздражает написание разной сложности велосипедов для того, чтобы узнать, что сделка прошла/не прошла, сработали уровни или кто-то подправил позицию из терминала.

Хотя казалось бы простая вещь - событие на сделку по позиции - и все стало бы намного проще.

 
Maksim Emeliashin:

Но это должны реализовать разработчики, а не мы.

Разработчики должны только дать инструменты. MQL это по сути низкоуровневый язык программирования (как впрочем и С++). На нем Вы рассуждаете не в терминах задачи, а в терминах вычислений. А все высокоуровневые решения сами делаете. Может не хватать инструментов, но не готовых решений

 
A100:

А в чем пауза\задержка? В копировании 3х структур?

В обработке очереди разноплановых событий.

А как Вам в такой ситуации поможет?

Оно что здесь будет последним, что там

Буду знать о закрытии по тейку.

 
Алексей Тарабанов:

Нет никакой очереди. Новое событие будет обрабатываться после текущего, а все произошедшие в этот период события будут проигнорированы. 

Некомпетентны.

 
fxsaber:

В обработке очереди разноплановых событий.

Буду знать о закрытии по тейку.

Остановимся на том, что я действительно (без кода с HandleNextEvent ) не понимаю элементарных вещей.

Напоследок отмечу, что разница между предлагаемой HandleNextEvent и тем что я написал, в том, что она через рекурсию, а у меня через цикл. В конечном итоге это одно и тоже. Кроме того у меня очередь изначально явно формируется и можно ей управлять... какие то события обрабатываете сразу, какие то откладываете на потом - полная свобода, а через предлагаемую функцию HandleNextEvent - Вы связаны по рукам и ногам

 
По какой причине этот советник не алертит?
const MqlTick GetMarketWatchTick( void )
{
  MqlTick Tick = {0};
  
  ::SymbolInfoTick(_Symbol, Tick);
  
  return(Tick);
}

const MqlTick GetLastHistoryTick()
{
  MqlTick Tick[1];
  
  ::CopyTicks(_Symbol, Tick, COPY_TICKS_ALL, 0, 1);
  
  return(Tick[0]);
}

void OnTick()
{
  if (GetMarketWatchTick().time_msc > GetLastHistoryTick().time_msc) // Тик из Обзора рынка свежее, чем последний тик из истории.
    Alert("Hello!");
}


В то же время эта же проверка, зашитая в боевой торговый советник на том же Терминале, Алертит. В чем может быть причина?

 

2474.

        Last tick time. Selected orders: 0; max time: 0.187 ms; avr time: 0.022 ms; 100000 iterations
        Last 3 days. Selected orders: 1956; max time: 1.832 ms; avr time: 0.301 ms; 100000 iterations
        Orders total: 56561

Стало очень хорошо. Если меняли - Спасибо. Понаблюдаю за показателями в боевом режиме.


PS В боевом режиме, когда совершаются сделки, почти всегда лаги (вывожу только случаи больше 5 миллисекунд).

2020.06.03 13:57:27.895 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 14 ms.
2020.06.03 13:57:47.780 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 5 ms.
2020.06.03 14:03:49.844 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 9 ms.
2020.06.03 14:03:51.063 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 8 ms.
2020.06.03 14:03:55.115 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 12 ms.
2020.06.03 14:03:56.935 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 6 ms.

В остальном, вроде, гораздо лучше, чем 2470.