Всем привет, добрые люди по моей вчерашней просьбе скинули склеенную 5 минутную историю с 1997 по 2016 гг
одним большим файлом..
поскольку тест проводился в МТ4, то я решил, что неплохо было
БЫ )) воткнуть всю эту историю в массивы в МТ4, и прогнать по уже имеющимся алгоритмам в самом терминале… иначе ведь надо будет писать полностью свой собственный тестер как отдельное приложение...
файл мне скинули вот такого формата:
ESU97;19970910;001000000;934.00;934.00;934.00;934.00;0
парсим простыми методами:
int start1()
{
int hFile,
bool read = true;
datetime tm1 = TimeCurrent(), tm2;
string filename = "ES.TXT";
hFile = FileOpen(filename, FILE_CSV|FILE_READ, ';'); if (hFile<1) { Alert("Файл "+filename+" не найден!"); return(false); }
while (read)
{
int i = ArraySize(HistBar); ArrayResize(HistBar,i+1);
HistBar[i].NameB = FileReadString(hFile);
string data = FileReadString(hFile);
string data1 = FileReadString(hFile);
HistBar[i].TimeB = conkdata(data, data1);
HistBar[i].OpenB = FileReadString(hFile);
HistBar[i].HighB = FileReadString(hFile);
HistBar[i].LowB = FileReadString(hFile);
HistBar[i].CloseB = FileReadString(hFile);
HistBar[i].SizeB = FileReadString(hFile);
if(FileIsEnding(hFile)==true) read = false;
// Print(TimeToString(HistBar[i].TimeB, TIME_DATE|TIME_MINUTES ), " ", DoubleToStr(HistBar[i].OpenB, 2)," ",DoubleToStr(HistBar[i].HighB, 2)," ",DoubleToStr(HistBar[i].LowB, 2)," ",DoubleToStr(HistBar[i].CloseB, 2)," " );
}
tm2 = TimeCurrent();
FileClose(hFile);
Print(ArraySize(HistBar));
Print(TimeToString(tm1, TIME_DATE|TIME_SECONDS ) ," ",TimeToString(tm2, TIME_DATE|TIME_SECONDS ) );
return (0);
}
/////////////////////////////
datetime conkdata( string data, string data1)
{
datetime vzv = StrToTime(StringSubstr(data, 0, 4) + "."+ StringSubstr(data, 4, 2)+ "."+ StringSubstr(data, 6, 2)+ " "+ StringSubstr(data1, 0, 2)+ ":"+ StringSubstr(data1, 2, 2));
return(vzv);
}
и все вроде хорошо… но что то пошло не так ))
файл ES имеет размер 67 мегабайт...
и вышеописанный алгоритм считывания работает на меньших данных, но на этом файле он просто умер ))
вот уже полчаса терминал висит и идет его считывание...
так дело не пойдет. придется создавать виртуальный инструмент и в режиме АВТОНОМНОЙ работы с графиком — работать с этими данными..
скорее всего еще придется разбить по годам, и создавать 10 разных графиков с разными годами… ибо на одном графике 10 летняя история с периодом 5 минут — просто не влезет в МТ4 ...
тоесть он просто считает количество строк в файле..
и...
и мт4 опять умер (((
resize в огромном цикле это нонсенс, попробуй сначала узнать количество строк и потом разово вызвать resize.
Судя по таким ошибкам в базовых вещах, ни о какой реализации более менее сложного алгоритма речи идти не может
учел ваши советы и исправил ошибки ))
Про строки я привел для примера, т.к. в некоторых компиляторах (старых, но все же встречается иногда) int является 16 битовым, т.е. всего 64000. Сталкивался с такой ошибкой у некоторых...
Но возможных нюансов намного больше, так что удачи в написании кода. В любом случае зависать из-за считывания строк не должно.
признаю что допустил ошибку в коде, и приношу свои извинения за свои слова в отношении вас.
еще раз пробежав по коду выявил ошибки.
и теперь 67 мегабайтный файл считывается за 3 секунды
ошибка была не только в РЕСАЙЗ, но и в синтаксисе...
а в нем как бы вот так: