المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : هل يوجد كود لارسال اشارات المؤشر الى ملف اكسل



11abde
14-07-2020, 02:28 PM
السلام عليكم و رحمه الله.
من فضلكم هل يوجد كود mq4 لارسال اشارات المؤشر الى ملف اكسل. سواء ملف DDE . أو غيره وشكرا جزيلا

kira-h
15-07-2020, 01:41 AM
السلام عليكم و رحمه الله.
من فضلكم هل يوجد كود mq4 لارسال اشارات المؤشر الى ملف اكسل. سواء ملف DDE . أو غيره وشكرا جزيلا
وعليكم السلام
نعم ممكن ويمكنك مراجعة كل الدوال التي لها علاقة بالملفات بالرابط التالي (مصدر اللغة) https://docs.mql4.com/files

ثم راجع الشرح التالي المنقول من أحد الشروحات التعليمية للأستاذ القدير مستر دولار

بداية عند إستخدام الدوال في لغة MQL4 للتعامل مع الملفات فلا يمكن هذه الدوال أن تتعامل إلا مع الملفات التي بداخل فولدر Data Folder الخاص بالميتاتريدر داخل ملف Files


في البداية قبل القراءة أو الكتابة في الملفات يجب أن نقوم بفتح الملف ونستخدم الداله FileOpen وتعود برقم معين يستخدم لاحقا للتعامل مع البيانات داخل هذا الملف




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 كود الترميز عند تحويل النص إلى حروف ( لن نستخدم هذا الخيار فسوف نجعله الخيار الإفتراضي




مثال عملي
سوف أقوم بفتح ملف من نوع تكست ( ملف نصي ) وسوف أجعله للقراءة والحرف الفاصل بين الأسطر ستكون ( , )




int file_handle=FileOpen("My File"+".txt",FILE_TXT|FILE_READ,',');



بعد فتح الملف الذي نريده






1- قراءة الملفات



في البداية سوف نضع شرط هل تم فتح الملف بشكل صحيح أم لأ


if(file_handle!=INVALID_HANDLE)



ثم سنستخدم الداله FileIsEnding للتأكد من قراءة جميع القيم في الملف
الدالة FileIsEnding تعود بالقيمه true إذا وصلت القراءة لنهاية الملف والعكس تعود بالقيمة false


while(!FileIsEnding(file_handle))



قراءة القيم في الملف
يوجد أكثر من دالة لقراءة القيم في الملف أهم جزء والذي سأقوم بشرحه هو



قراءة النص FileReadString




هذه الدالة سوف تقوم بقراءة النص داخل الملف .
إذا كان الملف من نوع bin-file فيجب أن يتم تحديد عدد الحروف التي يتم قرائتها, إذا كان الملف Text فلا داعي لتحديد عدد الحروف وسوف يقرأ كل سطر على حده, إذا كان الملف أكسل فسوف يقرأ حتى الحرف الفاصل الذي تم تحديده عند فتح الملف .
مثال

string line=FileReadString(file_handle);



2- الكتابة في الملفات

أولا يجب أن نقوم بإضافة خيار الكتابة عند فتح الملف بإستخدام الداله FileOpen

int file_handle=FileOpen("My File"+".txt",FILE_TXT|FILE_READ|FILE_WRITE,',');


ثم سنستخدم الدالة FileWrite للكتابة في ملف معين
مثال




FileWrite(file_handle,"this is first line\n"+"this is second line");


ملحوظه :



عند فتح ملف سابق كان به بيانات سابقه وتريد الكتابة أسفل آخر بيانات موجوده سابقا فقم بقرائتها أولا ثم الكتابة لكن إذا قمت بالكتابة مباشرة فسوف يبدأ في الكتابة من أول الملف بالتالي سيحذف البيانات القديمه




إغلاق الملف و حفظ البيانات التي تم كتابتها :



حتى يتم حفظ البيانات بشكل كامل في الملف يمكن ذلك بطريقتين
الطريقة الأولى إغلاق الملف بإستخدام الداله FileClose

FileClose(file_handle);

الطريقه الثانيه إستخدام الداله FileFlush حتى يجبر الداتا المتبقيه في الذاكره على الكتابه في الفايل

FileWrite(file_handle,"this is first line\n"+"this is second line");
FileFlush(file_handle);

أخيرا سيكون الكود بشكل كامل هو


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);
}
//---





القراءة من ملف أكسل


كمثال لو أريد قراءة بيانات كل صف وعمود في ملف أكسل وحفظها في مصفوفه
أولا سأقوم بفتح ملف الأكسل

int file_handle=FileOpen("My File"+".csv",FILE_CSV|FILE_READ|FILE_WRITE,',');

ثم دالة قراءة البيانات


while(!FileIsEnding(file_handle))
{
int size=ArraySize(Row);
ArrayResize(Row,size+1);
string Row[size]=FileReadString(file_handle);
Print(Row[size]);
}





الكتابة في ملف أكسل


عند الكتابة في ملف الأكسل فيجب أن نستخدم الفاصل الذي قمنا بتحديده عند فتح الملف بإستخدام FileOpen حتى نقوم بتقسيم الداتا في كل عمود
مثال

FileWrite(file_handle,"Second Column","Second Column","Third Column","Fourth Column","Fifth Column");

ثم لنفرض أنك تريد الإنتقال للصف التاي فسوف تستخدم FileWrite مره أخرى وهكذا
أو يمكنك وضعها داخل حلقه
مثال



for(int i=1;i<=10;i++) {

FileWrite(file_handle,"Second Column","Second Column","Third Column","Fourth Column","Fifth Column");
}





مثال عملي لإسكربت يقوم بكتابة بيانات الزوج ( الهاي, اللو, الإفتتاح, الإغلاق ) في ملف أكسل
أولا سنقوم بعمل الملف الجديد


int file_handle=FileOpen("Record Candle Data"+Symbol()+".csv",FILE_CSV|FILE_WRITE,',');


بداية سوف أكتب أول سطر وهو عناوين كل عمود حتى يكون واضح


int write=FileWrite(file_handle,"Pair","Time","Open","Close","High","Low");


ثم سنكتب الحلقه للبحث في جميع الشموع


for(int i=1;i<Bars;i++)
{
string time=TimeToStr(Time[i],TIME_DATE|TIME_MINUTES);
string open=DoubleToStr(Open[i],Digits);
string close=DoubleToStr(Close[i],Digits);
string high=DoubleToStr(High[i],Digits);
string low=DoubleToStr(Low[i],Digits);

write=FileWrite(file_handle,Symbol(),time,open,clo se,high,low);
}


وأخيرا إغلاق الملف بعد فتحه


FileClose(file_handle);


سيكون شكل الملف

22377

11abde
15-07-2020, 12:26 PM
شكرا جزيلا يا أستاذ كيرا.

kira-h
15-07-2020, 02:59 PM
العفو اخي الكريم