Особенности языка mql5, тонкости и приёмы работы - страница 165

 
fxsaber:

Да, у меня чтение истории присутствует.

Вы писали тогда, что мой индикатор тормозит. 
Я нашел причину именно в этом. Когда загрузил на счет с 30000 сделками. 
Мне удалось снизить тормоза . Раза в 4. Немного переделал чтение истории и оптимизировал код. Но они все равно есть. Потому что там фильтры и при нажатии на один фильтр все пересчитывается. 
Хотя все читается с массивов. 
На счетах с 5000 сделками все ок. А вот на больших это проблема. 
Это касается не только того индикатора. 

Я сделал чистый проект по чтению истории. 
Может быть дело в инете. Ведь вся история это много данных. 

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: Easy Canvas

Nikolai Semko, 2020.02.17 05:15

Хочу прояснить заинтерисованным программистам важным момент работы канваса в режиме тестера. 
Ко мне обратился один известный программист в этом сообществе с таким вопросом:

 - Почему в режиме тестера панель, созданная на объектах перерисовывается на порядок быстрее, чем реализованная на канвасе, тогда как в обычном режиме со скоростью канваса все в порядке?

Разобравшись, понял причину и решение данной проблемы.

Дело в том, что при объектах перерисовка происходит вместе с перерисовкой всего экрана, а экран в тестере перерисовывается не чаще, чем 30 кадров с секунду.

Объекты - это в конечном счете тот же канвас (внутренний), но когда вы изменяете своиства объекта, то канвас объекта не формируется(не пересчитывается), а формируется лишь в момент обновления экрана (ChartRedraw), что происходит в тестере (да и в обычном режиме тоже) не чаще, чем способен различить изменения наш глаз, т.е. не чаще ~ 32 кадров в секунду.

Допустим панель меняется каждый тик. Тогда и в тестере по умолчанию канвас будет пересчитываться каждый тик, но перерисовка в тестере происходит все равно не чаще ~30 милисекунд (~30 кадров в секунду).

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

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

Например так:

void OnTick()
  {
  static uint lastCalc=0;
  uint cur=GetTickCount();
  if (cur-lastCalc>15) {
    ReDrawMyCanvas();
    lastCalc=cur;
   }
  }

 
Если, например, нужно создать файл "EURUSD.txt" (большие символы), а на диске уже есть "eurusd.txt" (малые символы), то имя у файла будет, как прежде.
 
fxsaber:
Если, например, нужно создать файл "EURUSD.txt" (большие символы), а на диске уже есть "eurusd.txt" (малые символы), то имя у файла будет, как прежде.

Больше того, когда я сохраняю EURUSD TicksLongOpt.set, сохраняется eurusd tickslongopt.set. Приходится потом переименовывать. И таких досадных мелочей много.

 
Edgar Akhmadeev:

Больше того, когда я сохраняю EURUSD TicksLongOpt.set, сохраняется eurusd tickslongopt.set. Приходится потом переименовывать. И таких досадных мелочей много.

Думаю, если сначала удалить, а потом создать, то все будет нормально.

 
fxsaber:

Думаю, если сначала удалить, а потом создать, то все будет нормально.

Нет, я про создание нового файла, именно при сохранении из диалога терминала. Если такое не у всех, значит ещё от чего-то зависит. У меня Win7, если что.

 
Edgar Akhmadeev:

Нет, я про создание нового файла, именно при сохранении из диалога терминала. Если такое не у всех, значит ещё от чего-то зависит. У меня Win7, если что.

Имел в виду FileOpen и FileSave функции.

 
fxsaber:

Имел в виду FileOpen и FileSave функции.

Да, только сейчас понял, что не к месту, тема же про язык...

 
fxsaber:
Удобная сортировка массива структур


Применение


Результат

Не работает, можете обновить ? Пишет template declarations are not allowed in local classes TestarrSort.mq5 81 3

// Сортировка массива структур и указателей на объекты по (под-) полю/методу.
#define ArraySortStruct(ARRAY, FIELD)                                            \
{                                                                                \
  class SORT                                                                     \
  {                                                                              \
  private:                                                                       \
    template <typename T>                                                        \
    static void Swap( T &Array[], const int i, const int j )                     \
    {                                                                            \
      const T Temp = Array[i];                                                   \
                                                                                 \
      Array[i] = Array[j];                                                       \
      Array[j] = Temp;                                                           \
                                                                                 \
      return;                                                                    \
    }                                                                            \
                                                                                 \
    template <typename T>                                                        \
    static int Partition( T &Array[], const int Start, const int End )           \
    {                                                                            \
      int Marker = Start;                                                        \
                                                                                 \          
      for (int i = Start; i <= End; i++)                                         \
        if (Array[i].##FIELD <= Array[End].##FIELD)                              \
        {                                                                        \
          SORT::Swap(Array, i, Marker);                                          \
                                                                                 \
          Marker++;                                                              \
        }                                                                        \
                                                                                 \
       return(Marker - 1);                                                       \
    }                                                                            \
                                                                                 \
    template <typename T>                                                        \
    static void QuickSort( T &Array[], const int Start, const int End )          \
    {                                                                            \
      if (Start < End)                                                           \
      {                                                                          \
        const int Pivot = Partition(Array, Start, End);                          \
                                                                                 \
        SORT::QuickSort(Array, Start, Pivot - 1);                                \
        SORT::QuickSort(Array, Pivot + 1, End);                                  \
      }                                                                          \
                                                                                 \
      return;                                                                    \
    }                                                                            \
                                                                                 \
  public:                                                                        \
    template <typename T>                                                        \ 
    static void Sort( T &Array[], int Count = WHOLE_ARRAY, const int Start = 0 ) \
    {                                                                            \
      if (Count == WHOLE_ARRAY)                                                  \
        Count = ::ArraySize(Array)- Start; ;                                     \
                                                                                 \
      SORT::QuickSort(Array, Start, Start + Count - 1);                          \
                                                                                 \
      return;                                                                    \
    }                                                                            \
  };                                                                             \
                                                                                 \
  SORT::Sort(ARRAY);                                                             \
}                                                                                \


void OnStart()
{
  MqlRates Rates[];
  
  CopyRates(_Symbol, PERIOD_CURRENT, 0, 5, Rates); // Взяли бары
  
  Print("\nБары без сортировки - как получили.");
  ArrayPrint(Rates);
  
  Print("\nСортируем по open-цене.");
  ArraySortStruct(Rates, open);
  ArrayPrint(Rates);

  Print("\nСортируем по high-цене.");
  ArraySortStruct(Rates, high);
  ArrayPrint(Rates);

  Print("\nСортируем по времени.");
  ArraySortStruct(Rates, time);
  ArrayPrint(Rates);
}

 
Vladimir Pastushak:

Не работает, можете обновить ? Пишет template declarations are not allowed in local classes TestarrSort.mq5 81 3

К сожалению, возможности языка обрезали. Такой код не работает.

void OnStart()
{
  class A
  {
    template <typename T> // template declarations are not allowed in local classes
    void f() {}
  };
}


Но Вы можете попробовать альтернативный вариант.

template <typename T>                                       
void ArrayReindex( T &Array[], const double &TmpSort[][2] )
{                         
  T TmpArray[];
  
  for (int i = ::ArrayResize(TmpArray, ::ArrayRange(TmpSort, 0)) - 1; i >= 0; i--)
    TmpArray[i] = Array[(int)(TmpSort[i][1] + 0.1)];
    
  ::ArraySwap(Array, TmpArray);
              
  return;     
}             

// Сортировка массива структур и указателей на объекты по (под-) полю/методу.
#define ArraySortStruct(ARRAY, FIELD)                                      \
{                                                                          \
  double TmpSort[][2];                                                     \
                                                                           \
  for (int i =::ArrayResize(TmpSort, ::ArraySize(ARRAY)) - 1; i >= 0; i--) \
  {                                                                        \
    TmpSort[i][0] = (double)ARRAY[i].FIELD;                                \
    TmpSort[i][1] = i;                                                     \
  }                                                                        \
                                                                           \
  ::ArraySort(TmpSort);                                                    \
  ::ArrayReindex(ARRAY, TmpSort);                                          \
}                                         

void OnStart()
{
  MqlRates Rates[];
  
  CopyRates(_Symbol, PERIOD_CURRENT, 0, 5, Rates); // Взяли бары
  
  Print("\nБары без сортировки - как получили.");
  ArrayPrint(Rates);
  
  Print("\nСортируем по open-цене.");
  ArraySortStruct(Rates, open);
  ArrayPrint(Rates);

  Print("\nСортируем по high-цене.");
  ArraySortStruct(Rates, high);
  ArrayPrint(Rates);

  Print("\nСортируем по времени.");
  ArraySortStruct(Rates, time);
  ArrayPrint(Rates);
}


ЗЫ Здесь еще пример использования.

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