EventChartCustom => indicator is too slow

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Andrey Khatimlianskii
55972
Andrey Khatimlianskii  

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

#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, помогите, пожалуйста.

Slava
Модератор
13448
Slava  
EventChartCustom - синхронная функция.
Andrey Khatimlianskii
55972
Andrey Khatimlianskii  
Slava:
EventChartCustom - синхронная функция.

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

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

Andrey Khatimlianskii
55972
Andrey Khatimlianskii  
Andrey Khatimlianskii:

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

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

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

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

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

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

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

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

fxsaber
16737
fxsaber  
Andrey Khatimlianskii:

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

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

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

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

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

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

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


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

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

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

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


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

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

Yury Kulikov
36834
Yury Kulikov  
Slava:

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

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

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

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

Slava
Модератор
13448
Slava  
fxsaber:

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

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

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