Создание офф-лайн графиков .hst

 

Может кто сталкивался с таким?

Мною написан конвертер тиковой истории. Каждые 10 секунд конвертер пишет в файл .hst по определенному алгоритму High, low, open, close, volume.

Через какое-то время файл разрастается в размере и метатрадер 4 начинает сильно тормозить.

Появилась идея отображать только последние 1000 баров.

Для этого с 1001 бара нужно будет двигать весь массив данных на одну позицию назад каждый раз для нового бара.

Это получится цикл с перезаписью 1000 наборов, первый набор будет удаляться и заменяться последующим.


Будет ли толк от такого алгоритма перезаписи или же нет смысла пробовать?

 
Fedor Arkhipov:

Может кто сталкивался с таким?

Мною написан конвертер тиковой истории. Каждые 10 секунд конвертер пишет в файл .hst по определенному алгоритму High, low, open, close, volume.


Будет ли толк от такого алгоритма перезаписи или же нет смысла пробовать?

Я пишу в базу данных (БД). Можно даже в Access. Никаких тормозов. И никаких ограничений до 1000. Если данных оч много, то лучше бесплатный MS SQL или MySQL.

Где-то в статьях было как связать МТ с БД. 

В файл безусловно не оч здорово. 

 
Yuriy Asaulenko:

Я пишу в базу данных (БД). Можно даже в Access. Никаких тормозов. И никаких ограничений до 1000. Если данных оч много, то лучше бесплатный MS SQL или MySQL.

Где-то в статьях было как связать МТ с БД. 

В файл безусловно не оч здорово. 

Спасибо, поишу про Access.
 

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

 

Может это поможет. Двигает массив   Mas[]   на 1 позицию.

ArrayCopy(Mas, Mas, 0, 1, WHOLE_ARRAY); 

 

Не надо двигать каждый раз. Как размер разросся до, этак 5000-10000, тогда обрезать до 1000.

БД вообще тут не при делах, для offline графика файл hst нужен.  Даже если файлы резать, соединять, не проблема в бинарном режиме с использованием массива, будет быстро работать. Только по одному бару не надо. 

 
Fedor Arkhipov:

Может кто сталкивался с таким?

Мною написан конвертер тиковой истории. Каждые 10 секунд конвертер пишет в файл .hst по определенному алгоритму High, low, open, close, volume.

Через какое-то время файл разрастается в размере и метатрадер 4 начинает сильно тормозить.

Появилась идея отображать только последние 1000 баров.

Для этого с 1001 бара нужно будет двигать весь массив данных на одну позицию назад каждый раз для нового бара.

Это получится цикл с перезаписью 1000 наборов, первый набор будет удаляться и заменяться последующим.


Будет ли толк от такого алгоритма перезаписи или же нет смысла пробовать?

это не эфективно. лучше копить записи до 1050й, и когда накопится - обрезать 50 записей. 
чтобы операция "обрезания" выполнялась раз в 50 баров, т.е. каждые 500 секунду а не каждые 10. так будет работать быстрей.
 

Про БД сходу ищется статья SQL И MQL5: РАБОТАЕМ С БАЗОЙ ДАННЫХ SQLITE

Ну, а катит БД - не катит, решайте сами.) 

 
а зачем двигать весь массив каждый раз, это же глупо учитывая что изменился всего 1 элемент. Гораздо эффективнее организовать запись "по кругу" и ввести индекс, указывающий начало массива.
 
Хоть заголовок темы читайте, прежде чем советовать.
 
Dmitry Fedoseev:

Не надо двигать каждый раз. Как размер разросся до, этак 5000-10000, тогда обрезать до 1000.

БД вообще тут не при делах, для offline графика файл hst нужен.  Даже если файлы резать, соединять, не проблема в бинарном режиме с использованием массива, будет быстро работать. Только по одному бару не надо. 

Вы имеете ввиду копировать данные из файла в массив и перезаписывать файл? Не каждый бар, а каждые 50, например. Возможно тогда сам график будет зависать и не известно как будут работать индикаторы на таком графике, тоже еще вопрос. Надо наверное пробовать и смотреть что получиться.
 
Видимо, что-то не так с реализацией. Уже несколько лет работаю с оффлайн-графиками, никогда не замечал особых тормозов (история с 2000-го года минутки). Возможно, приведенный код поможет найти проблему.