Zapisywanie i odczytywanie tablic z pliku.

O jezykach programowania w platformach i nie tylko.
Huxley
Stały bywalec
Stały bywalec
Posty: 68
Rejestracja: 21 mar 2012, 17:29

Zapisywanie i odczytywanie tablic z pliku.

Nieprzeczytany post autor: Huxley »

Najbardziej kuriozalny błąd z jakim się spotkałem w mql, a z którym w żaden sposób sobie nie potrafię poradzić.

Jest pewna bardzo zasobożerna funkcja, która zapisuje czas słupków do tablicy. By oszczędzić sobie czekania, jak i CPU pracy, stworzoną przez funkcję tablicę zapisuję do pliku, by później mielić od ostatniego sprawdzanego słupka, i mieć x ostatnich wartości w tablicy. Zapisuję również do innego pliku rozmiar owej tablicy, gdyż podczas odczytywania muszę znaćzakres.

Tablica jest jako SetAsSeries, bym ostatni czas słupka na którym wystąpiło pewne zdarzenie zawsze miał na miejscu 0 w tablicy.

Zapisywane wartości wyglądają tak
Obrazek

Odczytywane natomiast tak
Obrazek

Kod do zapisywania
Obrazek

Kod do odczytywania
Obrazek

Pytanie jest, co robię źle i czego nie rozumiem?

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

mógłbym kolego spróbować Ci pomoc ale powiem szczerze ze nie chce mi się przepisywać, wiec jak możesz to wklej kod jako tekst żebym mógł go skopiować ;) i zobaczyć u siebie co jest nie teges ;)

pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Huxley
Stały bywalec
Stały bywalec
Posty: 68
Rejestracja: 21 mar 2012, 17:29

Nieprzeczytany post autor: Huxley »

Kod: Zaznacz cały

void GetWRBArray( string symbol, int timeframe, int bars.back, int& wrb.array[][2], bool mirror = false ) {
	// First Dimension = number, Second Dimension, 0 = time, 1 =type
	int limit, del.count, array.size, open.file, timeframe.dim;
	string file.name;
	static int indicator.counted[9];
	// comment
	if ( timeframe == 1 ) {
		timeframe.dim = 1;
	} else if ( timeframe == 5 ) {
		timeframe.dim = 2;
	} else if ( timeframe == 15 ) {
		timeframe.dim = 3;
	}  else if ( timeframe == 30 ) {
		timeframe.dim = 4;
	}  else if ( timeframe == 60 ) {
		timeframe.dim = 5;
	}  else if ( timeframe == 240 ) {
		timeframe.dim = 6;
	}  else if ( timeframe == 1440 ) {
		timeframe.dim = 7;
	}  else if ( timeframe == 10080 ) {
		timeframe.dim = 8;
	}  else if ( timeframe == 43200 ) {
		timeframe.dim = 9;
	} 
	if ( indicator.counted[timeframe.dim] == 0 ) {
		// Check for saved indicator.cunted
		file.name = StringConcatenate( symbol,"-M", timeframe, "-Zone-IndicatorCounted.DAT" );
		open.file = FileOpen( file.name, FILE_BIN|FILE_READ );
		if ( open.file > 0 ) {
			FileReadArray( open.file, indicator.counted, 0, ArraySize( indicator.counted ) );
			FileClose( open.file );
		}
	}
	if ( ArrayRange( wrb.array, 0 ) == 0 ) {
		// Check for saved Array
		// Load Array Size
		file.name = StringConcatenate( symbol,"-M", timeframe, "-WRB-Zones-Array-Size.DAT" );
		open.file = FileOpen( file.name, FILE_BIN|FILE_READ );
		if ( open.file > 0 ) {
			array.size = FileReadInteger( open.file );
			FileClose( open.file );
		}
		if ( array.size > 0 ) {
			// Load Array
			file.name = StringConcatenate( symbol,"-M", timeframe, "-WRB-Zones-Array.DAT" );
			open.file=FileOpen( file.name, FILE_BIN|FILE_READ );		
			if ( open.file > 0 ) {
				ArraySetAsSeries( wrb.array, true );
				ArrayResize( wrb.array, array.size );
				FileReadArray( open.file, wrb.array, 0, array.size );
				FileClose( open.file );
				for ( int c = 0; c < array.size; c++ ) {
					if ( timeframe == 60 )Print(" w miejscu:  ", c," jest zapisany czas:  ",TimeToStr( wrb.array[c][0] ) );
				}
			}
		}
		
	}
	if ( ArrayRange( wrb.array, 0 ) > 0 ) {
		// Validate Array Data
		for( int i = 0; i < ArrayRange( wrb.array, 0 ); i ++ ) {
			if ( iBarShift( symbol, timeframe, wrb.array[i][0] ) > bars.back ) {
				del.count++;
			}
		}
		// Delete not valid data
		array.size = ArrayRange( wrb.array, 0 ) - del.count;
		ArraySetAsSeries( wrb.array, false );
		ArrayResize( wrb.array, array.size );
		ArraySetAsSeries( wrb.array, true );
	}
	limit = MathMin( bars.back, iBarShift( symbol, timeframe, wrb.array[0][0] ) );
	limit = MathMin( limit, iBarShift( symbol, timeframe, indicator.counted[timeframe.dim] ) );
	if ( timeframe == 5 )Print( "limit ", limit );
	if ( timeframe == 5 )Print( "last.time ", iBarShift( symbol, timeframe, wrb.array[0][0] ) );
	for ( i = limit-1; i >= 0; i-- ) {
		indicator.counted[timeframe.dim] = iTime( symbol, timeframe, i );
		if ( iClose( symbol, timeframe, i ) > iOpen( symbol, timeframe, i ) ) {
			// Look for wrb
			if ( isWRB( symbol, timeframe, i ) >= is.bull.wrb ) {
				ArraySetAsSeries( wrb.array, false );
				ArrayResize( wrb.array, ArrayRange( wrb.array, 0 ) + 1 );
				ArraySetAsSeries( wrb.array, true );
				// Save Time
				wrb.array[0][0] = iTime( symbol, timeframe, i );
				// Look for wrb hidden gap
				if ( isWRB( symbol, timeframe, i ) == is.bull.wrb.hg ) {
					// Look for wrb zone
					if ( wrb.array[0][1] == 0 ) {
						wrb.array[0][1] = isSwingPoint_1( symbol, timeframe, i );
					}
					if ( wrb.array[0][1] == 0 ) {
						wrb.array[0][1] = isSwingPoint_2( symbol, timeframe, i );
					}					
					if ( wrb.array[0][1] == 0 ) {
						wrb.array[0][1] = isStrongContinuation_1( symbol, timeframe, i );
					}
					if ( wrb.array[0][1] == 0 ) {
						wrb.array[0][1] = isStrongContinuation_2( symbol, timeframe, i );
					}
					if ( wrb.array[0][1] == 0 ) {
						wrb.array[0][1] = isStrongContinuation_3( symbol, timeframe, i );
					}
					if ( wrb.array[0][1] == 0 ) {
						wrb.array[0][1] = isStrongContinuation_4( symbol, timeframe, i );
					}
					if ( wrb.array[0][1] == 0 ) {
						// Save hg
						wrb.array[0][1] = is.bull.wrb.hg;
					}
				}
				if ( wrb.array[0][1] == 0 ) {
					// Save hg
					wrb.array[0][1] = is.bull.wrb;
				}
				// Mirror type
				if ( mirror ) {
					wrb.array[0][1] *= -1;
				}
			}
		} else if ( iClose( symbol, timeframe, i ) < iOpen( symbol, timeframe, i ) ) {
			if ( isWRB( symbol, timeframe, i ) <= is.bear.wrb ) {
				ArraySetAsSeries( wrb.array, false );
				ArrayResize( wrb.array, ArrayRange( wrb.array, 0 ) + 1 );
				ArraySetAsSeries( wrb.array, true );
				// Save Time
				wrb.array[0][0] = iTime( symbol, timeframe, i );
				// Look for wrb hidden gap
				if ( isWRB( symbol, timeframe, i ) == is.bear.wrb.hg ) {
					// Look for wrb zone
					if ( wrb.array[0][1] == 0 ) {
						wrb.array[0][1] = isStrongContinuation_1( symbol, timeframe, i );
					}
					if ( wrb.array[0][1] == 0 ) {
						wrb.array[0][1] = isSwingPoint_1( symbol, timeframe, i );
					}
					if ( wrb.array[0][1] == 0 ) {
						wrb.array[0][1] = isStrongContinuation_2( symbol, timeframe, i );
					}
					if ( wrb.array[0][1] == 0 ) {
						wrb.array[0][1] = isSwingPoint_2( symbol, timeframe, i );
					}					
					if ( wrb.array[0][1] == 0 ) {
						// Save hg
						wrb.array[0][1] = is.bear.wrb.hg;
					}
				}
				if ( wrb.array[0][1] == 0 ) {
					// Save hg
					wrb.array[0][1] = is.bear.wrb;
				}
				// Mirror type
				if ( mirror ) {
					wrb.array[0][1] *= -1;
				}
			}
		}
	}
	// Save WRB Array to file
	array.size = ArrayRange( wrb.array, 0 );
		
	if ( array.size > 0 ) {
		for ( c = 0; c < array.size; c++ ) {
			if ( timeframe == 60 ) Print("zapisuje w tablicy na miejscu:  ", c,"   czas:  ",TimeToStr( wrb.array[c][0] ) );
		}
		// Save Array Size
		file.name = StringConcatenate( symbol,"-M", timeframe, "-WRB-Zones-Array-Size.DAT" );
		open.file = FileOpen( file.name, FILE_BIN|FILE_WRITE );
		if ( open.file > 0 ) {
			FileWriteInteger( open.file, array.size );
			FileClose( open.file );
		}
		// Save Array Data
		file.name = StringConcatenate( symbol,"-M", timeframe, "-WRB-Zones-Array.DAT" );
		open.file=FileOpen( file.name, FILE_BIN|FILE_WRITE );		
		if ( open.file > 0 ) {
			FileWriteArray( open.file, wrb.array, 0, array.size );
			FileClose( open.file );
		}
		// Save Indicator Counted
		file.name = StringConcatenate( symbol,"-M", timeframe, "-Zone-IndicatorCounted.DAT" );
		open.file=FileOpen( file.name, FILE_BIN|FILE_WRITE );		
		if ( open.file > 0 ) {
			FileWriteArray( open.file, indicator.counted, 0, ArraySize( indicator.counted ) );
			FileClose( open.file );
		}
	}
}
Wytnij co tylko Ci się podoba. Dzięki za chęci.

Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

nie wnikając w kod powiem że otwarcie pliku dawaj w INIT a zamknięcie w DEINIT tym samym pomijasz otwieranie plików/zamykanie i odczytywanie pozycji do zapisu
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

Problem lezy prawdopodobnie w zapisie do pliku tablicy wielowymiarowej , przynajmniej tak mi sie wydaje ( bo juz pozno a trche przed monitorami juz siedze dzisiaj :D)

tutaj masz takie roboczy skrypt ktorym sprawdzalem na tablich jedno wymiarowych i poszlo bez problemu);

Kod: Zaznacz cały

int start()
{
   save();
   read();
}

double wrb.array[][6];
double wrb.array1[];
double wrb.array2[];
void save()
{
   int open.file;
   string symbol = Symbol();
   string file.name;
   int timeframe = PERIOD_H1;
   int c;
   ArrayCopyRates(wrb.array,symbol,timeframe);
   int array.size = ArrayRange( wrb.array, 0 ); 
       
   if ( array.size > 0 ) { 
   ArrayResize(wrb.array1,array.size);
      for ( c = 0; c < array.size; c++ ) { 
         if ( timeframe == 60 ) Print("zapisuje w tablicy na miejscu:  ", c,"   czas:  ",TimeToStr( wrb.array[c][0] ) );
         wrb.array1[c] =  wrb.array[c][0];
      } 
      // Save Array Size 
      file.name = StringConcatenate( symbol,"-M", timeframe, "-WRB-Zones-Array-Size.DAT" ); 
      open.file = FileOpen( file.name, FILE_BIN|FILE_WRITE ); 
      if ( open.file > 0 ) { 
         FileWriteInteger( open.file, array.size ); 
         FileClose( open.file ); 
      } 
      // Save Array Data 
      file.name = StringConcatenate( symbol,"-M", timeframe, "-WRB-Zones-Array.DAT" ); 
      open.file=FileOpen( file.name, FILE_BIN|FILE_WRITE );       
      if ( open.file > 0 ) { 
         FileWriteArray( open.file, wrb.array1, 0, array.size ); 
         FileClose( open.file ); 
      } 
   } 
}

void read()
{
   int open.file;
   string symbol = Symbol();
   string file.name;
   int timeframe = PERIOD_H1;
   int array.size;
   if ( ArrayRange( wrb.array, 0 ) != 0 ) { 
      // Check for saved Array 
      // Load Array Size 
      file.name = StringConcatenate( symbol,"-M", timeframe, "-WRB-Zones-Array-Size.DAT" ); 
      open.file = FileOpen( file.name, FILE_BIN|FILE_READ ); 
      if ( open.file > 0 ) { 
         array.size = FileReadInteger( open.file ); 
         FileClose( open.file ); 
      } 
      if ( array.size > 0 ) { 
         // Load Array 
         file.name = StringConcatenate( symbol,"-M", timeframe, "-WRB-Zones-Array.DAT" ); 
         open.file=FileOpen( file.name, FILE_BIN|FILE_READ|FILE_WRITE );       
         if ( open.file > 0 ) {
            ArraySetAsSeries( wrb.array2, true );  
            ArrayResize( wrb.array2, array.size ); 
            FileReadArray( open.file, wrb.array2, 0, array.size); 
            FileClose( open.file ); 
            for ( int c = 0; c < array.size; c++ ) { 
               if ( timeframe == 60 )Print(" w miejscu:  ", c," jest zapisany czas:  ",TimeToStr( wrb.array2[c]  )); 
            } 
         } 
      } 
       
   } 
}
pozdrawiam
Andrzej Pierz

Huxley
Stały bywalec
Stały bywalec
Posty: 68
Rejestracja: 21 mar 2012, 17:29

Nieprzeczytany post autor: Huxley »

nie wnikając w kod powiem że otwarcie pliku dawaj w INIT a zamknięcie w DEINIT tym samym pomijasz otwieranie plików/zamykanie i odczytywanie pozycji do zapisu
Zazwyczaj tak robię. Tu jest problem, że ogólnie funkcja jest z dashbardu gdzie mam zapisywane i odczytywane mnóstwo rzeczy. Wszystkie timeframy*7 na chwile obecną i wszystko mielone przez zewnętrzne bibliotek poprzez include. Każda ma swoje funkcje zapisu i odczytu. Z odczytem problem obszedłem, bo wczytuję tylko gdy tablica jest pusta. Zapis jednak chyba mimo wszystko wrzucę w DEINIT.

/////

W międzyczasie pisania poszperałem jeszcze na forum metaquotes i znalazłem CHYBA rozwiązanie. Jest ~2 w nocy a ja jestem w stanie w którym raczej dobrze się bawię a nie męczę się z kodem.

Zapisując jak i odczytując z pliku wielowymiarową tablice muszę jako koniec tablicy używać ArraySize nie ArrayRange. Niby oczywiste jak teraz o tym myślę, ale równie oczywiste nie było wcześniej.

Pojawia się inne pytanie, na które być może ktoś zechce mi odpowiedzieć, bo na to odpowiedzi już panowie z metaquotes nie dali.

Do pliku zapisuję również ArrayRange, gdyż przed wczytaniej danych do tablicy muszę ją rozszerzyć. Jednak tu wkracza niekonsekwencja panów z metaquotes gdyż mogę rozszerzyć tylko pierwszy wymiar tablicy, więc interesuje mnie wartość ArrayRange, ale już gdy chce wczytać dane do tej tablicy, to muszę podać ArraySize....

Ktoś gdzieś widzi furtkę w tej sytuacji? Jakieś światełko w tunelu? Czy może zostaje mi zapisywanie do pliku tak ArraySize i ArrayRange? Być może prościej jest używać zapisu do CSV ale jeszcze tego nie praktykowałem. Jak ktoś ma coś na ten temat do powiedzenia będę dłużnikiem. W ogóle jakakolwiek kwestia pomagająca zoptymalizować kod multitimeframe jest mile widziana.

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

do zapisu musisz podac array size bo zapisuje cala tablice ...

np :

Kod: Zaznacz cały

array[0][0]
array[0][1]
array[1][0]
array[1][1]
.................
Huxley pisze:Do pliku zapisuję również ArrayRange, gdyż przed wczytaniej danych do tablicy muszę ją rozszerzyć.
nie dokonca jest to prawda ;) FileReadArray moze skorystac z tablicy bez wymiaru i sama ja rozszerzy ... ;)

pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Huxley
Stały bywalec
Stały bywalec
Posty: 68
Rejestracja: 21 mar 2012, 17:29

Nieprzeczytany post autor: Huxley »

Było by naprawdę miło, jeśli jest tak jak mówisz. Byłem pewien, że jest inaczej, gdyż dokumentacja mówi....

Reads the specified amount of elements from the binary file into array. Before reading, make sure that the array is large enough. Returns the amount of actually read elements.

Zaraz sprawdzę jak wygląda to w praktyce
Obrazek

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

Witam
ponownie troche potestowalem i dziwne rzeczy dzieja sie gdy tablica ktora jest zapisywana do pliku wczesniej byla przypisana przez funkcje

Kod: Zaznacz cały

ArrayCopyRates
wiec stworzylem wlasna funkcje

Kod: Zaznacz cały

   ArrayCopyRates_
i poszlo bez poblemu ;)

zobacz kod ponizej

Kod: Zaznacz cały

double array_write[][6];
double array_read[][6];
void start()
{
   array();
   save();
   read();
   print();
}

void array()
{
   Print("funkcja array");

   //ArrayCopyRates(array_write,Symbol(),Period());//dziwnie zapisuje do pliku ??
   ArrayCopyRates_(array_write,Symbol(),Period());//dziala ok
   Print("przypisano "+ArraySize(array_write));
}

void save()
{
   Print("funkcja zapisu do pliku");
   int size = ArraySize(array_write) ;
   FileDelete("test_array.dat");
   int hwnd = FileOpen("test_array.dat", FILE_BIN|FILE_WRITE|FILE_READ );
   if (hwnd > 0)
   {
      int write = FileWriteArray( hwnd, array_write, 0, size ); 
      FileClose( hwnd );
      Print("zapisano "+write);
   }
}

void read()
{
   Print("funkcja odczytu z pliku");
   int size = ArraySize(array_write) ;
   int hwnd = FileOpen("test_array.dat", FILE_BIN|FILE_WRITE|FILE_READ );
   if (hwnd > 0)
   {
      int read = FileReadArray( hwnd, array_read, 0, size ); 
      FileClose( hwnd );
      Print("odczytano "+read);
      Print("przypisano "+ArraySize(array_read));
   }
}

void print()
{
   Print("funkcja print");
   int size = ArrayRange(array_read , 0);
   for (int i = 0;i < size;i++)
   {
      Print("["+i+",0] time "+array_read[i][0]);
      Print("["+i+",1] open "+array_read[i][1]);
      Print("["+i+",2] low "+array_read[i][2]);
      Print("["+i+",3] high "+array_read[i][3]);
      Print("["+i+",4] close "+array_read[i][4]);
      Print("["+i+",5] volume "+array_read[i][5]);
   }
}

void ArrayCopyRates_(double& array[][],string symbol,int period)
{
   int size = iBars(symbol,period);
   ArrayResize(array,size + 1);
   for (int i = 0; i <= size;i++)
   {  
      array[i][0] = iTime(symbol,period,i);
      array[i][1] = iOpen(symbol,period,i);
      array[i][2] = iLow(symbol,period,i);
      array[i][3] = iHigh(symbol,period,i);
      array[i][4] = iClose(symbol,period,i);
      array[i][5] = iVolume(symbol,period,i);
   }
}
pozdrawiam
Andrzej Pierz

Huxley
Stały bywalec
Stały bywalec
Posty: 68
Rejestracja: 21 mar 2012, 17:29

Nieprzeczytany post autor: Huxley »

Dzięki Andrzej. Jestem dłużnikiem.
Obrazek

ODPOWIEDZ