Ошибки, баги, вопросы - страница 2194

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

Ну перестаньте. Все отмычки здесь.
Ширина бара принимает только значения 1,2,4,8,16,32

Странно, но идентификатор CHART_POINTS_PER_BAR не работает.

Но ширину бара в пикселях можно легко вычислить:

int WidthBar=int(1<<ChartGetInteger(0,CHART_SCALE));
Левый бар всегда рисуется от центра, правый как угодно. Поэтому начало координат в нуле (слева).
 
Nikolai Semko:

Ну перестаньте. Все отмычки здесь.
Ширина бара принимает только значения 1,2,4,8,16,32

Странно, но идентификатор CHART_POINTS_PER_BAR не работает.

Но ширину бара в пикселях можно легко вычислить:

Левый бар всегда рисуется от центра, правый как угодно. Поэтому начало координат в нуле (слева).

Это теория, пока самый лучший (более точный) вариант это такой:

pp=(double)ChartGetInteger(handle,CHART_WIDTH_IN_PIXELS)/(double)ChartGetInteger(handle,CHART_WIDTH_IN_BARS)*((Shift_Start-Shift_Stop)*(-1)+2)+Schkala+3;

но и он дает сбои парой.

 
Aleksey Vyazmikin:

Это теория, пока самый лучший (более точный) вариант это такой:

но и он дает сбои парой.

:))
Сформулируйте чётко задачу. Какое значение вам нужно получить?
 
Nikolai Semko:
:))
Сформулируйте чётко задачу. Какое значение вам нужно получить?

Мне нужно сделать скрин от даты А до даты Б включительно. При этом отработка функции должна быть корректна на любом зуме.

 

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

https://www.mql5.com/ru/forum/237291

Организация пакетной обработки задачи по снятия изображений с экрана графика
Организация пакетной обработки задачи по снятия изображений с экрана графика
  • 2018.04.15
  • www.mql5.com
Встала у меня задача доработать скрипт https://www.mql5.com/ru/code/936 , который делает скрины...
 
Artyom Trishkin:

Привет от fxsaber:

А можно картинку увидеть - что он (код) делает?

 

Просьба объяснить, почему ArrayResize работает очень медленно с Reserve-заданием?

Скрипт

// Добавление элемента в конец произвольного массива
template <typename T>
void AddElement( T &Array[], const T &Value, const int Reserve = 0 )
{
  const int Size = ::ArraySize(Array);

  ::ArrayResize(Array, Size + 1, Reserve);

  Array[Size] = Value;
}


#define BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

int Bench( const int Size, const int Reserve )
{
  const MqlTick NullTick = {0};
  MqlTick Ticks[];  
  
  for (int i = 0; i < Size; i++)
    AddElement(Ticks, NullTick, Reserve);
    
  return(ArraySize(Ticks));
}

void OnStart()
{
  BENCH(Bench(1e7, 1e5)); // 100 раз выделяется память
  BENCH(Bench(1e7, 1e6)); //  10 раз выделяется память
  BENCH(Bench(1e7, 1e7)); //   1 раз выделяется память
}


Результат

Time[Bench(1e7,1e5)] = 38199494
Time[Bench(1e7,1e6)] = 3867983
Time[Bench(1e7,1e7)] = 479303


100 раз выделение памяти (от 5 Mb до 500 Mb) отнимает 38 секунд. Это нормально?

Практическое применение идет в кастомных символах, когда нужно подготовить тиковую историю перед импортом. Допустим, в локальном хранилище есть сколько-то CSV-файлов с тиковыми данным, необходимо из них составить MqlTick-массив. Как это сделать оптимальным способом? Заранее посчитать количество тиков в этих файлах нельзя.

 
fxsaber:

Заранее посчитать количество тиков в этих файлах нельзя.

Поделить размер файла на примерный размер одного тика?