Автор |
Сообщение |
sserk
Зарегистрирован: 15.01.2012
Сообщения: 23
|
Прошу знающих помочь.
Есть текстовый файл с данными вида:
Код: |
SBER,26.02.2004,10:30:00,1.035, 1
SBER,26.02.2004,14:05:00,-0.619, 2
SBER,26.02.2004,16:10:00,-0.202, 1
SBER,26.02.2004,18:30:00,-0.479, 2
SBER,27.02.2004,10:45:00,0.612, 1
SBER,27.02.2004,12:05:00,0.490, 2
SBER,27.02.2004,13:20:00,0.511, 1
SBER,27.02.2004,16:20:00,0.389, 2
SBER,27.02.2004,18:10:00,0.123, 1
SBER,27.02.2004,18:40:00,0.051, 2 |
т.е. тикер, дата, время, индюк1, индюк2.
Хотел с помощью кода типа:
Код: |
r = ParamToggle("read file", "No|Yes", 0); // читать или нет файл истории
if(r)
{
fh1 = fopen( "qqq.txt", "r");
if( fh1 )
{
Buy1 = Sell1 = 0;
pHist = dHist = timeHist = 0;
time = TimeNum();
while(!feof(fh1))
{
s = fgets(fh1);
if(StrExtract(s, 0) == Name())
{
timeHist = StrToNum(StrExtract(s,2));
bi = LastValue(BarIndex());
pHist = StrToNum(StrExtract(s,3));
dHist = StrExtract(s,4);
for( i = 1; i < 14; i++ )
{
VarSet( "pHist"+i, Ref( pHist, -i ) );
}
}
}
printf("pHist " +pHist+ "\n");
printf("pHist10 " +pHist10+ "\n");
fclose( fh1 );
}
} |
сохранить серию значений pHist от 0 до -14, но при проверке все переменные pHist равны значению из последней строки, которая будет прочтена из файла истории. Подскажите где ошибка? Почему не сохраняются значения прочтенного файла? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ну правильно.
Вот смотри.
Ты получил значение pHist = StrToNum(StrExtract(s,3)); из строки и потом это значение сохраняешь 14 раз в переменные pHist1, pHist2, pHist3...
for( i = 1; i < 14; i++ )
{
VarSet( "pHist"+i, Ref( pHist, -i ) );
}
Одно и то же значение сохраняешь 14 раз.
Надо как то так
Код: |
r = ParamToggle("read file", "No|Yes", 0); // читать или нет файл истории
if(r)
{
fh1 = fopen( "qqq.txt", "r");
if( fh1 )
{
Buy1 = Sell1 = 0;
pHist = dHist = timeHist = 0;
time = TimeNum();
k = 0;
while(!feof(fh1))
{
s = fgets(fh1);
if(StrExtract(s, 0) == Name())
{
timeHist = StrToNum(StrExtract(s,2));
bi = LastValue(BarIndex());
pHist = StrToNum(StrExtract(s,3));
dHist = StrExtract(s,4);
VarSet( "pHist"+k, Ref( pHist, -i ) );
//тут можно вывести pHist k-тое
k++;
}
}
fclose( fh1 );
}
} |
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
sserk
Зарегистрирован: 15.01.2012
Сообщения: 23
|
Попробовал, как предложено. Получилось, что при запросе pHist последнее равно последнему значению из последней строки файла, а pHist10 к примеру, равно значению из 11 строки от начала файла. Это немного не то, что нужно, потому что в файл при работе кода будут добавляться строчки.
Надо как то сохранить в память группу из нескольких значений pHist, чтобы потом её сравнивать с такой же группой показаний реал-тайм индикатора. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
???
Ну
Получится, что первая строка запомниться в pHist0, вторая в pHist1, третья в pHist2 и т.д. до последней строки.
Что не так? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
sserk
Зарегистрирован: 15.01.2012
Сообщения: 23
|
Все верно, при таком коде сохранены будут все pHist из всех прочтенных строк, а надо что то похожее на работу функции ValueWhen(),
Код: |
pHist = StrExtract(s,3);
pHist1=ValueWhen(pHist !=Ref(pHist,-1), Ref(pHist,-1), -1);
pHist2=ValueWhen(pHist1 !=Ref(pHist1,-1), Ref(pHist1,-1) ,-1);
|
но такая конструкция в коде не работает |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Надо создать длинный массив чтобы от первой даты, до следующей было одно значение, далее второе и т.п.? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
sserk
Зарегистрирован: 15.01.2012
Сообщения: 23
|
Да, наверно это можно назвать массивом. Нужно сформировать массив из значений полученных при чтении строк в файле. Но нужны не все значения, а только группа из 10 для примера, т.е. читаем 10 строк, получаем 10 значений, потом читаем 11 строку, все значения "сдвигаются" на одну позицию и бывшее первое становится вторым...., а бывшее 10 вообще выкидывается из памяти |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ну это не сложно.
Код: |
r = ParamToggle("read file", "No|Yes", 0); // читать или нет файл истории
if(r)
{
fh1 = fopen( "qqq.txt", "r");
if( fh1 )
{
Buy1 = Sell1 = 0;
pHist = dHist = timeHist = 0;
time = TimeNum();
k = 0;
while(!feof(fh1))
{
s = fgets(fh1);
if(StrExtract(s, 0) == Name())
{
timeHist = StrToNum(StrExtract(s,2));
bi = LastValue(BarIndex());
pHist = StrToNum(StrExtract(s,3));
dHist = StrExtract(s,4);
for( i = 0; i < 14; i++ )
{
k[i] = k[i + 1];
if(i == 13)
k[i] = pHist;
}
}
}
fclose( fh1 );
}
}
|
В результате получаем массив k[0] - k[13] значения которого равны последним 14 значениям из файла. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
sserk
Зарегистрирован: 15.01.2012
Сообщения: 23
|
Не выходит
Добавил в этот код строчки
Код: |
printf("pHist " +pHist+ "\n");
printf("pHist2 " +k[13]+ "\n");
fclose( fh1 ); |
там где pHist последнее значение из последней строки файла, а там где pHist2 - просто 0.
Причем ноль при любом значении к[i]
может я не верно пытаюсь вытащить значение из массива? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ну конечно. Мы же выдергиваем из строки строку. А я её пытаюсь в массив запихать.... Надо её сначала в число превратить.
В общем вот такой код
Код: |
r = 1; //ParamToggle("read file", "No|Yes", 1); // читать или нет файл истории
k = 0;
if(r)
{
fh1 = fopen( "C:\\qqq.txt", "r");
if( fh1 )
{
Buy1 = Sell1 = 0;
pHist = dHist = timeHist = 0;
time = TimeNum();
while(!feof(fh1))
{
s = fgets(fh1);
if(StrExtract(s, 0) == Name())
{
timeHist = StrToNum(StrExtract(s,2));
bi = LastValue(BarIndex());
pHist = StrToNum(StrExtract(s,3));
dHist = StrExtract(s,4);
dHist = StrToNum(dHist);
for( i = 0; i < 14; i++ )
{
k[i] = k[i + 1];
if(i == 13)
k[i] = dHist;
}
}
}
fclose( fh1 );
}
}
printf("pHist " + NumToStr(k[10]) + "\n");
printf("pHist2 " + NumToStr(k[13]) + "\n");
|
И вот такой файл
Код: |
SBER,26.02.2004,10:30:00,1.035, 1
SBER,26.02.2004,14:05:00,-0.619, 2
SBER,26.02.2004,16:10:00,-0.202, 3
SBER,26.02.2004,18:30:00,-0.479, 4
SBER,27.02.2004,10:45:00,0.612, 5
SBER,27.02.2004,12:05:00,0.490, 6
SBER,27.02.2004,13:20:00,0.511, 7
SBER,27.02.2004,16:20:00,0.389, 8
SBER,27.02.2004,18:10:00,0.123, 9
SBER,27.02.2004,18:40:00,0.051, 10
SBER,27.02.2004,18:40:00,0.051, 11
SBER,27.02.2004,18:40:00,0.051, 12
SBER,27.02.2004,18:40:00,0.051, 13
SBER,27.02.2004,18:40:00,0.051, 14
SBER,27.02.2004,18:40:00,0.051, 15
SBER,27.02.2004,18:40:00,0.051, 16
SBER,27.02.2004,18:40:00,0.051, 17
SBER,27.02.2004,18:40:00,0.051, 18
|
Замечательно работает. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
sserk
Зарегистрирован: 15.01.2012
Сообщения: 23
|
Огромнейшее спасибо!!!! добавил небольшое "спасибо" через qiwi
Код работает, массив такой, как надо!!! |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
И тебе спасибо! |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
sserk
Зарегистрирован: 15.01.2012
Сообщения: 23
|
Просьба помочь найти ошибку
Код: |
//// блок чтения файла и формирования массива данных для поиска и сравнения
r=ParamToggle("read file", "No|Yes", 0); // читать или нет файл истории
ti = m = ym = 0; // переменные для времени, счетчика и поиска совпадений
if(r)
{
fh1 = fopen( "gazp06_12.txt", "r"); // открываем файл для чтения
if( fh1 )
{
timeHist = 0; // переменная для чтения из файла
while(!feof(fh1))
{
s = fgets(fh1);
if(StrExtract(s, 0) == Name())
{
timeHist = StrExtract(s,2); //читаем третью колонку
timeHist = StrToNum(timeHist); // преобразуем из текста в цифру
for( i = 0; i < 11; i++ ) //формируем массив из 11 значений времени
{
ti[i] = ti[i + 1]; // нулевое значение соотв. ti[10]
if(i == 10)
ti[i] = timeHist;
}
if(ti[9]==LastValue(timeB1)) // задаем условие для поиска совпадений, timeB1 задается индикатором в формате ччммсс (время без пробелов и разделителей) тайм 5 минут
{m++; // определяем количество совпадений, для создания нужного количества элементов массива
for ( y = 0; y < m; y++) // пробуем создать массив из значений ti[10] попадающих под условие ti[9]= timeB1
{
ym[y] = ym[y+1];
if (y==m)
ym[y] = ti[10]; // а вот значений то в массиве и нет?????? где то ошибка
}
}
}
}
fclose( fh1 );
}
}
|
как создать массив для значений подходящих под условие в коде? и потом узнать среднее значение из всех полученных значений? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Может проще импортнуть этот файл в базу в виде еще одного тикера и работать с ним как с обычным тикером? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Если всетаки не хочешь импортировать файл в базу, то напиши словами что надо. Я из кода понять не смог.... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|