OnCalculate - переиндексация на каждом тике - страница 3

 
sandex:
за один такт чего, процессора

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

Но здесь я специально сказал "1 такт на фоне 1 000 000 тактов". То есть, не надо париться с этим вопросом - просто выставляйте нужный флаг и всё.

 
Slawa:

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

Но здесь я специально сказал "1 такт на фоне 1 000 000 тактов". То есть, не надо париться с этим вопросом - просто выставляйте нужный флаг и всё.

Ок, спасибо за пояснения.
 

А технически возможно ли восемь динамических массивов из функции OnCalculate в одну структуру определить?

Тогда был бы удобен еще один вариант функции, ну типа такого:

int OnCalculate(const int rates_total, const int prev_calculated, const MqlRts &rates, bool flag); 

 flag - смена направления индексации для членов структуры.

 
Vasiliy Pushkaryov:

А технически возможно ли восемь динамических массивов из функции OnCalculate в одну структуру определить?

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

В Стандартной Библиотеке имеются классы таймсерий, и я давно на их основе уже сделал класс-контейнер, который работает, как единое целое:

class CMySeriesContainer: public CMySeriesContainerI
{
protected:
static const string CSV_SEPARATOR;
static const string HEADER_CSV_STRING;

   CMyOpen*                   m_pmoOpen; 
   CMyHigh*                   m_pmhHigh;
   CMyLow*                    m_pmlLow;
   CMyClose*                  m_pmcClose;
   CMySpread*                 m_pmsSpread;     
   CMyTime*                   m_pmtTime;
   CMyTickVolume*             m_pmtvTickVolume;
   CMyRealVolume*             m_pmrvRealVolume;
  
   CPricePrecisionController  m_ppPrecController; 
  
   // Функция пробегается по всем таймсериям, и возвращает значение минимального размера таймсерии
   int  _GetMinSeriesSize();

....

// Продолжение класса

..

Было бы, действительно, удобно, если бы были указатели на массивы, в принципе, вся функциональность у меня вынесена в интерфейс предка  CMySeriesContainerI, думаю, рано или поздно появятся указатели на массивы - у меня все готово для этого

 
Slawa:

То есть, не надо париться с этим вопросом - просто выставляйте нужный флаг и всё.

Профилируя несложный индикатор, обратил внимание на 1.42% времени потраченных на ArraySetAsSeries:

 

 

Дольше всего отрабатывала установка индексации для buffer_AO.

Понятно, что такое кол-во вызовов - не показатель. Но сам факт - что это ни разу не "1 такт на фоне 1 000 000 тактов" - на лицо.

 
Профилирование другого аналогичного индикатора, в котором ArraySetAsSeries применяется только к индикаторным буферам (не к тайм-сериям), показало аналогичный результат - 2.04% на вызовы ArraySetAsSeries (замер на 200 вызовах OnCalculate).
 
Andrey Khatimlianskii:

Профилируя несложный индикатор, обратил внимание на 1.42% времени потраченных на ArraySetAsSeries:

 

 

Дольше всего отрабатывала установка индексации для buffer_AO.

Понятно, что такое кол-во вызовов - не показатель. Но сам факт - что это ни разу не "1 такт на фоне 1 000 000 тактов" - на лицо.

Всю функцию OnCalculate, которую профилировали, покажите
 
К тому же учтите, что сборка данных профилировки тоже занимает такты.
Для замера ArraySetAsSeries это существенно, более 50% показанного Вами времени занял сбор данных профилировки
 
Slawa:
Всю функцию OnCalculate, которую профилировали, покажите

Да нечего там особо показывать - цикл по барам, заполнение буферов по простым правилам в несколько иф-ов. Если надо, в сервис-деск сброшу.

 

Ilyas:
К тому же учтите, что сборка данных профилировки тоже занимает такты.
Для замера ArraySetAsSeries это существенно, более 50% показанного Вами времени занял сбор данных профилировки

Этого не учел, действительно профилирование отличается от обычной работы.

Будет ли корректно замерить время выполнения с помощью нового микро-секундного таймера (разделив замеры на 2 части OnCalculate)? 

 

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

Но проявились другие узкие места. У меня, например, в сложной панели, основанной на стандартной библиотеке, стал занимать 70% ArrayResize( m_controls, i+1, 16) в функции Add() для элементов панели =)
Добавил резерв на большее кол-во элементов, и проблема пропала.

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