Funkcje operacji plikowych

W MQL4 istnieje możliwość operowania na plikach, ale ze względów bezpieczeństwa funkcje plikowe mogą pracować tylko z plikami, które są w poniższych podkatalogach (lub ich podkatalogach): terminal_dir/history/<nazwa_aktualnego_brokera> - operacje na danych historycznych funkcje typu FileOpenHistory

  • terminal_dir/experts/files – wspólny katalog dla plików EA, wskaźników skryptów
  • terminal_dir/tester/files – pliki wykorzystywane podczas testowania EA

FileClose

Funkcja zamyka plik otwarty uprzednio funkcją FileOpen().

Składnia:

void FileClose( int handle )
Parametry
handle – uchwyt pliku zwracany przez funkcję FileOpen()
Wartość zwracana
brak

Przykład:

int handle = FileOpen("nazwa_pliku", FILE_CSV|FILE_READ);
if( handle > 0 )
{
// jakieś operacje na plikach ...
FileClose(handle);
}

FileDelete

Funkcja usuwa plik o podanej nazwie, jako parametr wywołania funkcji. Aby uzyskać szczegółowe informacje o błędzie, korzystamy z funkcji GetLastError().

Pliki mogą być tylko usunięte ze standardowych katalogów widocznych przez terminal MT4: terminal_dir\experts\file, terminal_directory\tester\file oraz z podkatalogów.

Składnia:

void FileDelete( string nazwa_pliku )
Parametry
nazwa_pliku – nazwa pliku lub ścieżka i nazwa pliku
Wartość zwracana
brak

Przykład:

// usunięcie pliku moje_dane.csv z podkatalogu terminal_dir\experts\files
int lastError;
FileDelete("moje_dane.csv");
lastError=GetLastError();
if(laseError!=ERR_NOERROR)
{
Print("Błąd usunięcia (",lastError,") pliku moje_dane.csv");
return(0);
}

FileFlush

Funkcja czyści, opróżnia bufor przechowujący dane do pliku. Podczas operacji plikowych zapis danych jest buforowany w celu przyspieszenia wykonywania się programu i nie blokowania obliczeń programu przez zapis/odczyt danych plikowych, który jest znacznie wolniejszy, niż obliczenia procesora, operacje w pamięci operacyjnej.

Uwagi! Funkcja FileFlush() ma rację bytu, kiedy wywoływana jest podczas operacji odczytu/zapisu pliku. Nie ma konieczności wywoływania FileFlush przed zamknięciem pliku, ponieważ przy zamknięciu pliku FileCLose(), dane z bufora są automatycznie opróżniane.

Składnia:

void FileFlush( int handle )
Parametry
handle – uchwyt pliku zwracany przez funkcję FileOpen()
Wartość zwracana
brak

Przykład:

int bars_count = Bars;
int handle = FileOpen("moje_dane.csv",FILE_CSV|FILE_WRITE);
if(handle>0)
{
FileWrite(handle, "#","OPEN","CLOSE","HIGH","LOW");
for(int i=0;i<bars_count;i++)
FileWrite(handle, i+1,Open[i],Close[i],High[i], Low[i]);
FileFlush(handle);
...
for(int i=0;i<bars_count;i++)
FileWrite(handle, i+1,Open[i],Close[i],High[i], Low[i]);
FileClose(handle);
}

FileIsEnding

Funkcja zwraca wartość logiczną true (prawda) jeśli wskaźnik pozycji pliku ustawiony jest na końcu pliku, w przeciwnym razie zwraca false (fałsz). Typowe zastosowanie funkcji to odczyt pliku w pętli i sprawdzanie czy osiągnięto koniec pliku wówczas koniec odczytu pliku. Aby uzyskać szczegółowe informacje o błędzie, korzystamy z funkcji GetLastError().

Składnia:

bool FileIsEnding( int handle )
Parametry
handle – uchwyt pliku zwracany przez funkcję FileOpen()
Wartość zwracana
true – jeśli koniec pliku
false – jeśli wskaźnik pozycji nie jest na końcu pliku

Przykład:

while(FileIsEnding(handle1))
{
int n = FileReadNumber(handle1);
Print("Odczytana liczba =",n);
}

FileIsLineEnding

Funkcja zwraca wartość true jeśli w pliku tekstowym wskaźnik pozycji w pliku osiągnął koniec linii w przeciwnym razie wskazuje false. Typowe zastosowanie to odczyt plików tekstowych o zmiennej długości danych w pojedynczej linii. Aby uzyskać szczegółowe informacje o błędzie, korzystamy z funkcji GetLastError()

Składnia:

bool FileIsLineEnding( int handle )
Parametry
handle – uchwyt pliku zwracany przez funkcję FileOpen()
Wartość zwracana
true – jeśli wskaźnik jest na końcu linii
false – jeśli wskaźnik nie osiągnął końca linii

Przykład:

if(FileIsLineEnding(handle1))
{
FileClose(handle1);
return(false);
}

FileOpen

Jest to jedna z najważniejszych funkcji plikowych otwierająca plik i zwracająca identyfikator, tak zwany uchwyt pliku wykorzystywany przez pozostałe funkcje np. odczytu czy zapisu danych do pliku. Aby uzyskać szczegółowe informacje o błędzie, korzystamy z funkcji GetLastError().
Uwaga! Pliki mogą być otwierane tylko ze standardowych katalogów widocznych przez terminal MT4: terminal_dir\experts\file, terminal_directory\tester\file oraz z podkatalogów.

Parametry otwarcia pliku mogą być łączone (|). Wyjątkiem jest tryb formatu pliku, którego nie można stosować jednocześnie FILE_BIN i FILE_CSV. Jeśli zastosujemy jednocześnie tryb FILE_WRITE oraz FILE_READ to otwarty zostanie plik wyzerowany, pusty w trybie do zapisu i odczytu, a jeśli wcześniej w pliku były dane to zostaną one usunięte. Z trybu FILE_READ, korzystamy gdy chcemy otworzyć istniejący plik tylko do odczytu, a z FILE_WRITE gdy chcemy utworzyć nowy plik.
Możemy otworzyć jednocześnie maksymalnie 32 pliki w ramach jednego programu, modułu EA, wskaźnika, skryptu, biblioteki i nie możemy przekazywać uchwytu pliku po między modułami.

Składnia:

int FileOpen( string nazwa_pliku, int mode, int delimiter=';')
Parametry
nazwa_pliku – nazwa pliku do otwarcia
mode – tryb otwarcia pliku może mieć poniższe wartości, łączone:
- FILE_BIN – otwiera plik w trybie binarnym
- FILE_CSV – otwiera plik w trybie tekstowym
- FILE_READ – otwiera plik do odczytu
- FILE_WRITE – otwiera plik do zapisu
delimiter – separator dla plików tekstowych typu csv. Domyślna wartość
jeśli nie podamy podczas wywołania to średnik (;)
Wartość zwracana
identyfikator, uchwyt pliku

Przykład:

int handle;
handle = FileOpen("moje_dane.csv",FILE_CSV|FILE_READ,';');
if(handle<1)
{
Print("Nie można otworzyć pliku moje_dane.dat, błąd otwarcia pliku =",
GetLastError());
return(false);
}

FileOpenHistory

Funkcja działa podobnie jak FIleOpen, ale otwiera tylko pliki z danymi historycznymi, które znajdują się w podkatalogu terminal MT4 terminal_directory\histiry\<nazwa_serwera_brokera> lub jego podkatalogach. Jeśli funkcja się powiedzie zwraca uchwyt pliku, a jeśli nie to zwraca wartość -1,. Aby uzyskać szczegółowe informacje o błędzie, korzystamy z funkcji GetLastError().

Uwaga! Terminal klienta MT4, może korzystać (można się logować do różnych serwerów, brokerów), dlatego aktualne dane (format HST) w zależności od zalogowanego klienta mogą znajdować się w różnych podkatalogach, co należy uwzględnić w naszych programach. Funkcja może być przydatna do tworzenia własnych danych historii np. danych typu 3 minutowe słupki lub konwersji do innych formatów. Plik utworzony w folderze historii mogą być otwierane w trybie offline tzn. nie są aktualizowane na bieżąco i w danym momencie nie muszą być identyczne z danymi na wykresie.

Składnia:

int FileOpenHistory( string nazwa_pliku, int mode, int delimiter=';')
Parametry
nazwa_pliku – nazwa pliku danych historycznych w formacie hst
mode – tryb otwarcia pliku może mieć poniższe parametry łączone:
FILE_BIN – tryb binarny, zalecany
FILE_CSV – tryb tekstowy, raczej nie stosowany
FILE_READ – tryb do odczytu
FILE_WRITE – tryb do zapisu
delimiter – separator dla pliku tekstowego
Wartość zwracana
uchwyt pliku

Przykład:

int handle = FileOpenHistory("USDX3.HST",FILE_BIN|FILE_WRITE);
if(handle<1)
{
Print("Nie mogę utworzyć pliku USDX3.HST");
return(false);
}
// operacje na pliku
// ...
FileClose(handle);

FileReadArray

Funkcja odczytuje określoną ilość elementów tablicy z pliku binarnego. Należy dokładnie zweryfikować ilość odczytywanych danych z pliku, tak aby nie była większa niż wielkość tablicy. Aby uzyskać szczegółowe informacje o błędzie, korzystamy z funkcji GetLastError().

Składnia:

int FileReadArray( int handle, object&array[], int start, int count )
Parametry
handle – uchwyt pliku zwracany przez funkcję FileOpen()
array[] – tablica w której zostaną umieszczone odczytane dane
start – pozycja w pliku od której będą odczytywane dane
count – ilość elementów, która ma być odczytana
Wartość zwracana
ilość odczytanych elementów

Przykład:

int handle;
double varray[10];
handle=FileOpen("plik_danych.dat", FILE_BIN|FILE_READ);
if(handle>0)
{
FileReadArray(handle, varray, 0, 10);
FileClose(handle);
}

FileReadDouble

Funkcja odczytuje dane z pliku w formacie zmiennoprzecinkowym double zaczynając od aktualnej pozycji w pliku. Format danych zmiennoprzecinkowych może być 8 bajtowy lub 4 bajtowy, co określamy jako parametr wywołania funkcji. Aby uzyskać informacje o błędach, korzystamy z funkcji GetLastError().

Składnia:

double FileReadDouble( int handle, int size=DOUBLE_VALUE )
Parametry
handle – uchwyt pliku zwracany przez funkcję FileOpen()
size – parametr określający wielkość odczytywanych danych
zmiennoprzecinkowych i może przyjmować wartość:
- DOUBLE_VALUE – 8 bajtów
- FLOAT_VALUE - 4 bajty
Wartość zwracana
odczytana wartość

Przykład:

int handle;
double value;
handle = FileOpen("moje_dane.dat",FILE_BIN);
if(handle>0)
{
value=FileReadDouble(handle,DOUBLE_VALUE);
FileClose(handle);
}

FileReadInteger

Funkcja odczytuje liczbę całkowitą zaczynając od aktualnej pozycji pliku binarnego. Format liczby całkowitej może być długości 1, 2 lub 4 bajty. Jeśli format nie został określony, zostanie przyjęta wartość domyślna 4 bajty. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError().

Składnia:

int FileReadInteger( int handle, int size=LONG_VALUE )
Parametry
handle – uchwyt pliku zwracany przez funkcję FileOpen()
size – format określający długość może przyjmować poniższe wartości:
- CHAR_VALUE - 1 bajt
- SHORT_VALUE - 2 bajty
- LONG_VALUE - 4 bajty
Wartość zwracana
odczytana wartość typu integer

Przykłady:

int handle;
int value;
handle=FileOpen("moje_dane.dat", FILE_BIN|FILE_READ);
if(handle>0)
{
value=FileReadInteger(handle,2);
FileClose(handle);
}

FileReadNumber

Funkcja odczytuje wartość numeryczną z pliku tekstowego i może być stosowana tylko dla pliku typu tekstowego CSV. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError().

Składnia:

double FileReadNumber( int handle )
Parametry
handle – uchwyt pliku zwracany przez funkcję FileOpen()
Wartość zwracana
odczytana wartość numeryczna

Przykład:

int handle;
int value;
handle=FileOpen("moje_dane_tekstowe.csv", FILE_CSV, ';');
if(handle>0)
{
value=FileReadNumber(handle);
FileClose(handle);
}

FileReadString

Funkcja odczytuje ciąg znaków (string) zaczynając od aktualnej pozycji w pliku. Dotyczy to zarówno plików binarnych i tekstowych CSV. Dla plików tekstowych, ciąg znaków zostanie odczytany bez ogranicznika (;). W przypadku pliku binarnego odczytane zostaną wszystkie dane określone długością length. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError().

Składnia:

string FileReadString( int handle, int length=0 )
Parametry
handle – uchwyt pliku zwracany przez funkcję FileOpen()
length – długość ciągu danych tekstowych do odczytu
Wartość zwracana
o0dczytany string

Przykład:

int handle;
string str;
handle=FileOpen("moj_plik.csv", FILE_CSV|FILE_READ);
if(handle>0)
{
str=FileReadString(handle);
FileClose(handle);

FileSeek

Funkcja ustawia pozycję wskaźnik pliku na nową określoną parametrem, licząc w bajtach od początku/końca/aktualnej pozycji w pliku. Jeśli przesunięcie wskaźnika w pliku zakończyło się pozytywnie zwracaną wartością jest true, w przeciwnym wypadku zwraca false. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError().

Składnia:

bool FileSeek( int handle, int offset, int origin )
Parametry
handle – uchwyt pliku zwracany przez funkcję FileOpen()
offset – przesunięcie w bajtach
origin – pozycja, od której liczone będzie przesunięcie:
- SEEK_CUR – od aktualnej pozycji wskaźnika
- SEEK_SET – od początku pliku
- SEEK_END – od końca pliku
Wartość zwracana
true – jeśli prawidłowo przesunięto kursor
false – jeśli błąd przesunięcia kursora

Przykład:

int handle=FileOpen("moj_plik.csv", FILE_CSV|FILE_READ|FILE_WRITE, ';');
if(handle>0)
{
FileSeek(handle, 0, SEEK_END);
//---- dopisanie wartości na koniec pliku
FileWrite(handle, dane1, dane2);
FileClose(handle);
handle=0;
}

FileSize

Funkcja zwraca rozmiar pliku w bajtach. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError().

Składnia:

int FileSize( int handle )
Parametry
handle – uchwyt pliku zwracany przez funkcję FileOpen()
Wartość zwracana
wielkość pliku w bajtach

Przykład:

int handle;
int size;
handle=FileOpen("moje_dane.dat", FILE_BIN|FILE_READ);
if(handle>0)
{
size=FileSize(handle);
Print( "Plik moje_dane.dat jest wielkości =", size, " bajtów");
FileClose(handle);
}

FileTell

Funkcja zwraca aktualną pozycję wskaźnika w pliku. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError().

Składnia:

int FileTell( int handle )
Parametry
handle – uchwyt pliku zwracany przez funkcję FileOpen()
Wartość zwracana
aktualna pozycja wskaźnika w pliku

Przykłady:

int handle;
int pos;
handle=FileOpen("moje_dane.dat", FILE_BIN|FILE_READ);
// odczytujemy aktualną pozycję wskaźnika
pos=FileTell(handle);
Print("Aktualna pozycja =", pos);

FileWrite

Funkcja jest przeznaczona do zapisu danych tekstowych do pliku typu CSV, ograniczniki są dopisywane automatycznie. Po zapisie, pojedynczym wywołaniu funkcji FileWrite na końcu dodawana jest wartść znaku końca linii (\ r\n). Aby uzyskać szczegółowe informacje o błędach, trzeba wywołać GetLastError (). Kolejne dane, które mają być zapisane w pliku oddzielamy przecinkami, parametrów może być maksymalnie 63. Dane typu int i double zostaną automatycznie skonwertowane do typu string, dane typu color, datetime i bool nie zostaną skonwertowane i zostaną zapisane w formacie integer. Tablice nie mogą być przekazywane, jako parametr i zapisane w pliku.

Składnia:

int FileWrite( int handle, ...)
Parametry
handle – uchwyt pliku zwracany przez funkcję FileOpen()
... – dane które mają być zapisane do pliku oddzielone przecinkami,
maksymalnie do 63 parametrów
Wartość zwracana
ilość zapisanych znaków do pliku lub -1 jeśli błąd zapisu

Przykład:

int handle;
datetime dataOtwarciaPozycji = OrderOpenTime();
handle=FileOpen("plik_tekstowy.csv", FILE_CSV|FILE_WRITE, ';');
if(handle>0)
{
FileWrite(handle, Close[0], Open[0], High[0], Low[0],
TimeToStr(dataOtwarciaPozycji));
FileClose(handle);
}

FileWriteArray

Funkcja zapisuje tablicę do pliku binarnego. Tablice typu integer, datetime, color będą zapisane jako wartości 4-bajtowe, a tablice typu double jako wartości 8-bajtowe. Tablica typu string zostanie zapisana z separatorami, a na końcu dodany zostanie znak końca linii (\r\n). Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError().

Składnia:

int FileWriteArray( int handle, object array[], int start, int count )
Parametry
handle – uchwyt pliku zwracany przez funkcję FileOpen()
array[] – tablica która zostanie zapisana
start – pierwszy element tablicy, który ma zostać zapisany
count – ilość elementów do zapisania z tablicy
Wartość zwracana
ilość zapisanych elementów tablicy lub -1 jeśli błąd zapisu

Przykład:

int handle;
double BarOpenValues[10];
// kopiuje 10 elementów z tablicy
for(int i=0;i<10; i++)
BarOpenValues[i]=Open[i];
// otwiera plik do zapisu binarnego, tablicy
handle=FileOpen("moje_dane.dat", FILE_BIN|FILE_WRITE);
if(handle>0)
{
// zapisuje 7 elementów z tablicy zaczynając od trzeciego
FileWriteArray(handle, BarOpenValues, 3, 7);
FileClose(handle);
}

FileWriteDouble

Funkcja zapisuje wartości typu zmiennoprzecinkowego, double do pliku binarnego. Domyślny format double to 8 bajtów DOUBLE_VALUE lub podajemy FLOAT_VALUE wówczas zapisana wartość będzie 4 bajtowa. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError().

Składnia:

int FileWriteDouble( int handle, double value, int size=DOUBLE_VALUE )
Parametry
handle – uchwyt pliku zwracany przez funkcję FileOpen().
value – wartość, która ma zostać zapisana w pliku
size – opcjonalnie podajemy format double:
- DOUBLE_VALUE - 8 bajtów, domyślna wartość
- FLOAT_VALUE – 4 bajty
Wartość zwracana
ilość zapisanych bajtów lub -1 jeśli błąd

Przykład:

int handle;
double var1=0.345;
handle=FileOpen("moje_dane.dat", FILE_BIN|FILE_WRITE);
if(handle<1)
{
Print("Nie mogę zapisać danych =",GetLastError());
return(0);
}
FileWriteDouble(handle, var1, DOUBLE_VALUE);
//...
FileClose(handle)

FileWriteInteger

Funkcja zapisuje wartość całkowitą, integer do pliku binarnego. Domyślna wielkość zapisywanych danych to LONG_VALUE 4 bajty, lub podać typ SHORT_VALUE to 2 bajty, albo CHAR_VALUE to 1 bajt. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError().

Składnia:

int FileWriteInteger( int handle, int value, int size=LONG_VALUE )
Parametry
handle – uchwyt pliku zwracany przez funkcję FileOpen()
value – wartość która będzie zapisana do pliku
size – opcjonalna wartość format danych:
CHAR_VALUE - 1 bajt
SHORT_VALUE - 2 bajty
LONG_VALUE - 4 bajty, domyślnie
Wartość zwracana
liczba zapisanych bajtów, lub -1 jeśli błąd

Przykład:

int handle;
int value=10;
handle=FileOpen("moje_dane.dat", FILE_BIN|FILE_WRITE);
if(handle<1)
{
Print("Nie mogę zapisać do pliku, błąd =",GetLastError());
return(0);
}
FileWriteInteger(handle, value, SHORT_VALUE);
//...
FileClose(handle)

FileWriteString

Funkcja zapisuje wartość typu string (ciąg znaków) do pliku binarnego zaczynając od aktualnej pozycji w pliku. Aby uzyskać szczegółowe informacje o błędach, korzystamy z funkcji GetLastError().

Składnia:

int FileWriteString( int handle, string value, int length )
Parametry
handle – uchwyt pliku zwracany przez funkcję FileOpen()
value – ciąg znaków który zostanie zapisany w pliku
length – długość ciągu która ma zostać zapisana
Wartość zwracana
ilość zapisanych znaków lub -1 jeśli błąd

Przykład:

int handle;
string str="ciąg znaków do zapisu w pliku";
handle=FileOpen("moj_plik.bin", FILE_BIN|FILE_WRITE);
if(handle<1)
{
Print("Nie mogę zapisać do pliku, błąd =",GetLastError());
return(0);
}
FileWriteString(handle, str, 29);
FileClose(handle);

Niniejszy materiał, przygotowany przez DM BOŚ S.A. ma charakter wyłącznie informacyjny, prezentowany jest w celach edukacyjnych i nie stanowi porady prawnej oraz nie jest rekomendacją osobistą w ramach świadczenia usługi doradztwa inwestycyjnego zgodnie z przepisami prawa. DM BOŚ S.A. nie udziela gwarancji dokładności, aktualności, oraz kompletności niniejszych informacji. Zaleca się przeprowadzenie we własnym zakresie niezależnego przeglądu informacji z niniejszego materiału.

1/1