EventChartCustom => indicator is too slow

 

Использую в советнике для получения тиков с других инструментов "индикатор-шпион":

#property indicator_chart_window
#property indicator_plots 0

input long              ChartId         = 0;    // Receiver Chart Id
input ushort            EventId         = 0;    // Custom Event Id

int OnInit()
{

   return(INIT_SUCCEEDED);
}

int OnCalculate( const int rates_total, const int prev_calculated, const int, const double &[] )
{

   if( prev_calculated > 0 )

      EventChartCustom( ChartId, EventId, 0, 0, _Symbol );

   return( rates_total );
}

Периодически в журнале появляются записи "indicator is too slow".
Я так понимаю, что при большом количестве тиков, очередь чарта забивается, и EventChartCustom не может отправить новое событие.

Вопрос: как пропустить тики, которые советник не успел обработать (реагировать только на последний тик из очереди)?
Почему вообще происходит клинч? Разве EventChartCustom синхронная функция? Я думал, что она просто добавляет событие в очередь, а обработка очереди — дело OnChartEvent запущенных на чарте программ (и тормозить должны они, если событий много).

Есть идея — передавать из индикатора текущий GetTickCount, а в советнике пропускать "тики", которые родились больше Х мс назад. Но есть риск пропустить нужный (один из последних) тик по инструменту.

Хотелось бы больше контроля над очередью событий. Или, хотя бы, полного понимания, как она работает.

@Slava, @Renat Fatkhullin, помогите, пожалуйста.

 
EventChartCustom - синхронная функция.
 
Slava:
EventChartCustom - синхронная функция.

Спасибо за разъяснение. Как решить проблему?

Или как другим способом получать тики по другим инструментам? Сокеты, мемори-маппинг?

 
Andrey Khatimlianskii:

Есть идея — передавать из индикатора текущий GetTickCount, а в советнике пропускать "тики", которые родились больше Х мс назад. Но есть риск пропустить нужный (один из последних) тик по инструменту.

Да, простая проверка

if ( GetTickCount64()-lparam > 16 ) return;

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

Но хотелось бы отсеять все, кроме последнего по каждому инструменту.

 
Slava:
EventChartCustom - синхронная функция.

Она что ли ждет, пока не сработают OnChartEvent по ее событию? Пожалуйста, разъясните.

Не может же быть такого, что если в OnChartEvent стоит Sleep, то другой советник будет ждать EventChartCustom.

 
Andrey Khatimlianskii:

Использую в советнике для получения тиков с других инструментов "индикатор-шпион":

Периодически в журнале появляются записи "indicator is too slow".
Я так понимаю, что при большом количестве тиков, очередь чарта забивается, и EventChartCustom не может отправить новое событие.

В MT4 несколько таких индикаторов отправляют каждый тик на десятки чартов. Таких сообщений в журнале нет.

 
Slava:
EventChartCustom - синхронная функция.

@Slava Можно поподробнее? Синхронная до какого момента?

из документации:

И в кодах ошибок есть только одна подходящая ошибка:


 
Самый быстрый способ получать тики с чужих инструментов - в бесконечном цикле опрашивать эти инструменты SymbolInfoTick, не забыв при этом Sleep(1) в конце цикла
 
Yury Kulikov:

@Slava Можно поподробнее? Синхронная до какого момента?

из документации:

И в кодах ошибок есть только одна подходящая ошибка:


Синхронная - означает, что перед тем как поставить событие в очередь соответствующего графика будут обработаны все предыдущие события этой очереди. Чтобы не было переполнения очереди. Мы гарантируем обработку события custom chart event, поэтому обязаны избегать переполнения очереди

Это событие будет роздано всем индикаторам на этом графике, потом будет проверка наличия эксперта. Если эксперта нга графике нет, тогда и будет ошибка 4104

 
Slava:

Синхронная - означает, что перед тем как поставить событие в очередь соответствующего графика будут обработаны все предыдущие события этой очереди. Чтобы не было переполнения очереди. Мы гарантируем обработку события custom chart event, поэтому обязаны избегать переполнения очереди

Это событие будет роздано всем индикаторам на этом графике, потом будет проверка наличия эксперта. Если эксперта нга графике нет, тогда и будет ошибка 4104

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

И это важно в первую очередь для индикаторов, которые генерируют пользовательские события.

 
fxsaber:

Она что ли ждет, пока не сработают OnChartEvent по ее событию? Пожалуйста, разъясните.

Не может же быть такого, что если в OnChartEvent стоит Sleep, то другой советник будет ждать EventChartCustom.

Нет. Ответом на постановку события custom chart event в очередь является факт сумели или нет поставить это событие в очередь (а не результат выполнения OnChartEvent). Если на графике нет эксперта, значит не сумели.