شرح التعامل مع الملفات بإستخدام لغة MQL4
هذا الموضوع التعليمي سيكون مخصص للشرح التفصيلي للدوال التي تتعامل مع الملفات سواء القراءة من الملفات الخارجية أو الكتابة في الملفات بإستخدام لغة MQL4
بداية عند إستخدام الدوال في لغة MQL4 للتعامل مع الملفات فلا يمكن هذه الدوال أن تتعامل إلا مع الملفات التي بداخل فولدر Data Folder الخاص بالميتاتريدر داخل ملف Files
أو في المسار الذي قمت بتنصيب الميتاتريدر فيه أيضا داخل ملف Files
في البداية قبل القراءة أو الكتابة في الملفات يجب أن نقوم بفتح الملف ونستخدم الداله FileOpen وتعود برقم معين يستخدم لاحقا للتعامل مع البيانات داخل هذا الملف
كود PHP:
int FileOpen(
string file_name, // File name
int open_flags, // Combination of flags
short delimiter=';', // Delimiter
uint codepage=CP_ACP // Code page
);
file_name هو إسم الملف الذي تريد فتحه في حال كان الملف غير موجود فسوف تقوم الداله بعمل ملف جديد بهذا الإسم
open_flags نوع العملية للملف الذي ستقوم بفتحه ( مثلا الملف للقراءة أو الكتابه أو هل الملف نصي أو أكسل .. إلخ )
delimiter الحرف الذي سيستخدم للفصل بين القيم سواء في الملف النصي أو ملف الأكسل ( مثلا لو تريد وضع كل قيمة في عمود جديد في ملف الأكسل فيجب أن تحدد ما هو الفاصل الذي ستستخدمه )
codepage كود الترميز عند تحويل النص إلى حروف ( لن نستخدم هذا الخيار فسوف نجعله الخيار الإفتراضي
مثال عملي
سوف أقوم بفتح ملف من نوع تكست ( ملف نصي ) وسوف أجعله للقراءة والحرف الفاصل بين الأسطر ستكون ( , )
كود PHP:
int file_handle=FileOpen("My File"+".txt",FILE_TXT|FILE_READ,',');
بعد فتح الملف الذي نريده
1- قراءة الملفات
في البداية سوف نضع شرط هل تم فتح الملف بشكل صحيح أم لأ
كود PHP:
if(file_handle!=INVALID_HANDLE)
ثم سنستخدم الداله FileIsEnding للتأكد من قراءة جميع القيم في الملف
الدالة FileIsEnding تعود بالقيمه true إذا وصلت القراءة لنهاية الملف والعكس تعود بالقيمة false
كود PHP:
while(!FileIsEnding(file_handle))
قراءة القيم في الملف
يوجد أكثر من دالة لقراءة القيم في الملف أهم جزء والذي سأقوم بشرحه هو
قراءة النص FileReadString
هذه الدالة سوف تقوم بقراءة النص داخل الملف .
إذا كان الملف من نوع bin-file فيجب أن يتم تحديد عدد الحروف التي يتم قرائتها, إذا كان الملف Text فلا داعي لتحديد عدد الحروف وسوف يقرأ كل سطر على حده, إذا كان الملف أكسل فسوف يقرأ حتى الحرف الفاصل الذي تم تحديده عند فتح الملف .
مثال
كود PHP:
string line=FileReadString(file_handle);
2- الكتابة في الملفات
أولا يجب أن نقوم بإضافة خيار الكتابة عند فتح الملف بإستخدام الداله FileOpen
كود PHP:
int file_handle=FileOpen("My File"+".txt",FILE_TXT|FILE_READ|FILE_WRITE,',');
ثم سنستخدم الدالة FileWrite للكتابة في ملف معين
مثال
كود PHP:
FileWrite(file_handle,"this is first line\n"+"this is second line");
ملحوظه :
عند فتح ملف سابق كان به بيانات سابقه وتريد الكتابة أسفل آخر بيانات موجوده سابقا فقم بقرائتها أولا ثم الكتابة لكن إذا قمت بالكتابة مباشرة فسوف يبدأ في الكتابة من أول الملف بالتالي سيحذف البيانات القديمه
إغلاق الملف و حفظ البيانات التي تم كتابتها :
حتى يتم حفظ البيانات بشكل كامل في الملف يمكن ذلك بطريقتين
الطريقة الأولى إغلاق الملف بإستخدام الداله FileClose
كود PHP:
FileClose(file_handle);
الطريقه الثانيه إستخدام الداله FileFlush حتى يجبر الداتا المتبقيه في الذاكره على الكتابه في الفايل
كود PHP:
FileWrite(file_handle,"this is first line\n"+"this is second line");
FileFlush(file_handle);
أخيرا سيكون الكود بشكل كامل هو
كود PHP:
void OnStart()
{
int file_handle=FileOpen("My File"+".txt",FILE_TXT|FILE_READ|FILE_WRITE,',');
if(file_handle!=INVALID_HANDLE)
{
while(!FileIsEnding(file_handle))
{
string line=FileReadString(file_handle);
Print(line);
}
}
else Print("Error Open File "+GetLastError());
FileWrite(file_handle,"this is first line\n"+"this is second line");
FileClose(file_handle);
//---
}
القراءة من ملف أكسل
كمثال لو أريد قراءة بيانات كل صف وعمود في ملف أكسل وحفظها في مصفوفه
أولا سأقوم بفتح ملف الأكسل
كود PHP:
int file_handle=FileOpen("My File"+".csv",FILE_CSV|FILE_READ|FILE_WRITE,',');
ثم دالة قراءة البيانات
كود PHP:
while(!FileIsEnding(file_handle))
{
int size=ArraySize(Row);
ArrayResize(Row,size+1);
string Row[size]=FileReadString(file_handle);
Print(Row[size]);
}
الكتابة في ملف أكسل
عند الكتابة في ملف الأكسل فيجب أن نستخدم الفاصل الذي قمنا بتحديده عند فتح الملف بإستخدام FileOpen حتى نقوم بتقسيم الداتا في كل عمود
مثال
كود PHP:
FileWrite(file_handle,"Second Column","Second Column","Third Column","Fourth Column","Fifth Column");
ثم لنفرض أنك تريد الإنتقال للصف التاي فسوف تستخدم FileWrite مره أخرى وهكذا
أو يمكنك وضعها داخل حلقه
مثال
كود PHP:
for(int i=1;i<=10;i++)
{
FileWrite(file_handle,"Second Column","Second Column","Third Column","Fourth Column","Fifth Column");
}
أخيرا في حال وجود أي تسؤال يخص هذه الدالة فأرجو إضافته في الموضوع وسوف أشرحه بالتفصيل