нужна помощь ( работа с массивами и файлами)

 

Доброго времени суток!

Необходимо решить следующую задачу:

1 записать массив xmas=(a1,a2,a3,a4) в файл, затем извлечь и использовать в процедуре,

2 на следующем баре xmas=(a5,a6,a7,a8) записать в файл по верх массива пришедшего на предыдущем шаге,

так чтобы в процедуре можно было работать c матрицей

x_history= (a1,a2,a3,a4)

a5,a6,a7,a8

...

k x_history= ( a1, a2,a3,a4)

... ... ... ...

ak ... ... ak+3

как реализовать это на MQL, существенные трудности вызывает лишь запись и чтение из файла так чтобы не удалялась пред история!

 
Объявите глобальный массив, и не мучаетесь. Сохраняйте в файл только при перезагрузке.
 

Использовать файл в бинарном режиме.

FileOpen("filename",FILE_BIN|FILE_READ|FILE_WRITE);

Сначала в файл записываем переменную int с размером массива и следом массив. Если надо дописать в конец файла, перемещаем указатель:

FileSeek(h,0,SEEK_END); 

и также сначала пишем int с размером массива, затем массив.

Если надо извлчечь какой-то участок, в цикле вычисляем начало очередного участка (читаем записанные ранее переменные int, умножаем на размер одного элемента массива), пока вычисленное положения указателя не станет равным размеру файла. Можно немного упростить дело, сначала в файл писать int с количеством участков, потом int с размером первого участка и т.д.

Это поможет вычислить размер массива для переноса указателя.

Примерно так... возможны произвольные вариации.

 
FAQ:
Объявите глобальный массив, и не мучаетесь. Сохраняйте в файл только при перезагрузке.

Глобальный массив есть, но необходима работа с файлами, связанна она с перезагрузкой(выкл. и вкл. советника из торговли)
 
Integer:

Использовать файл в бинарном режиме.

Сначала в файл записываем переменную int с размером массива и следом массив. Если надо дописать в конец файла, перемещаем указатель:

и также сначала пишем int с размером массива, затем массив.

Если надо извлчечь какой-то участок, в цикле вычисляем начало очередного участка (читаем записанные ранее переменные int, умножаем на размер одного элемента массива), пока вычисленное положения указателя не станет равным размеру файла. Можно немного упростить дело, сначала в файл писать int с количеством участков, потом int с размером первого участка и т.д.

Это поможет вычислить размер массива для переноса указателя.

Примерно так... возможны произвольные вариации.


Т.е. после того как с помощью выше указанной команды перемещен указатель, затем будет записана следующая строчка массива?
 
orb:

Т.е. после того как с помощью выше указанной команды перемещен указатель, затем будет записана следующая строчка массива?

В бинарном режиме не строчки записываются, а массивы. Как там данные в файле располагаются не важно, нам известен размер массива, тип массива, можно вычислить начало следующего куска данных.
 
orb:

Т.е. после того как с помощью выше указанной команды перемещен указатель, затем будет записана следующая строчка массива?

Если файл используется в FILE_CSV, то после установки указателя в конец файла, новая запись будет на новой строке.
 
Спасибо Дмитрий! Последний вопрос, получается что массив имеет динамический размер, т.е. сначала double xmas[1][4] (кажется так оформляется мой массив.) затем double xmas[2][4], ... double xmas[k][4]. конкретный пример (кусочек кода) не могли бы прописать?
 
Integer:

Если файл используется в FILE_CSV, то после установки указателя в конец файла, новая запись будет на новой строке.

Ответьте на вопрос выше, если несложно...
 
orb:
Спасибо Дмитрий! Последний вопрос, получается что массив имеет динамический размер, т.е. сначала double xmas[1][4] (кажется так оформляется мой массив.) затем double xmas[2][4], ... double xmas[k][4]. конкретный пример (кусочек кода) не могли бы прописать?


Сначала просто про массивы пишите, теперь оказывается, что массив многомерный (или не оказывается, а только кажется)...

Можно дописывать:

#define DIM2_SIZE 4


int start(){

   int x[2][DIM2_SIZE];
   x[0][0]=0;x[0][1]=1;x[0][2]=2;x[0][3]=3;
   x[1][0]=10;x[1][1]=11;x[1][2]=12;x[1][3]=13;

   int y[DIM2_SIZE]={20,21,22,23};

   // записываем в файл массив x
   int h=FileOpen("1.txt",FILE_BIN|FILE_WRITE|FILE_READ);
   FileWriteInteger(h,ArraySize(x),LONG_VALUE);
   FileWriteArray(h,x,0,ArraySize(x));
   FileClose(h);   

   // дописываем в конец массив y
   h=FileOpen("1.txt",FILE_BIN|FILE_WRITE|FILE_READ);
   int size=FileReadInteger(h,LONG_VALUE);
   FileSeek(h,0,SEEK_END);
   FileWriteArray(h,y,0,ArraySize(y));
   FileSeek(h,0,SEEK_SET);
   FileWriteInteger(h,size+ArraySize(y),LONG_VALUE);
   FileClose(h); 


   // читаем весь файл в массив z
   int z[][DIM2_SIZE];
   h=FileOpen("1.txt",FILE_BIN|FILE_WRITE|FILE_READ);
   size=FileReadInteger(h,LONG_VALUE);
    ArrayResize(z,size/DIM2_SIZE);
   FileReadArray(h,z,0,size);

   // смотрим что находится в z
   for(int i=0;i<ArraySize(z)/DIM2_SIZE;i++){
      string s="";
         for(int j=0;j<4;j++){
            s=s+z[i][j]+" ";
         }
      Alert(s);                                                
   }
   return(0);
}
 
Integer:


Сначала просто про массивы пишите, теперь оказывается, что массив многомерный (или не оказывается, а только кажется)...

Можно дописывать:


Согласен вопрос некорректно задал, а правильно заданный вопрос залог правильного ответа, сошлюсь на то, что я человек новый в MQL. Теперь уловил суть, теперь буду делать. Спасибо большое!
Причина обращения: