إستخدام مكتبات الدل لتحديد فرق بين توقيت السيرفر وتوقيت جرينتش (موضوع تعليمي)
بناء على طلب أحد الأعضاء لشرح كيفية تحديد الفرق بين توقيت البروكر وتوقيت جرينتش بطريقة أوتوماتيكية قررت شرح الطريقه في موضوع مستقل
ملحوظه يجب أن يكون توقيت الكمبيوتر صحيح لأنه من خلاله سنقوم بمعرفة توقيت جرينتش
تقوم الفكره على إيجاد توقيت جرينتش وتوقيت البروكر ثم يكون الفرق بينهم هو الإختلاف أو كما يسمى GMT offset والذي تستخدمه أغلب إكسبرتات الإسكالبينج التي تعتمد على العمل فترة معينه ونظرا لإختلاف فرق التوقيت من بروكر لآخر فيتم إستخدام هذا الكود لتحديد التوقيت أوتوماتيكيا
وسنستخدم أحد مكتبات الدل الموجوده في الويندوز وهي مكتبة kernel32.dll
في البداية سنقوم بإستدعاء مكتبة الدل والأكواد المكتوبه بداخلها عن طريق الأمر import#
كما في الكود التالي
كود PHP:
#import "kernel32.dll"
int GetTimeZoneInformation(int& TZInfoArray[]);
#import
سنقوم بتعريف متغيرات خارجيه الخاصه بتفعيل إستخدام فرق التوقيت بشكل أوتوماتيكي أو يدويا وتحديد ساعة البدايه والنهايه في قسم المتغيرات الخارجيه أعلى الإكسبرت
كود PHP:
extern bool AutomaticGMT_Offset=true;
extern int GMT_OffsetHour=0;
extern int StartHour = 7;
extern int EndHour = 20;
extern bool UseHourTrading= true;
بداخل الداله start
سنقوم بكتابة الكود لمعرفة فرق التوقيت بين البروكر وتوقيت جرينتش
كود PHP:
if (AutomaticGMT_Offset == TRUE) {
if (!(IsTesting() || IsOptimization())) {
int GMT_Shift=0;
int TZ_Info[43];
int DST = GetTimeZoneInformation(TZ_Info);
if (DST != 0)
GMT_Shift = TZ_Info[0];
if (DST == 2)
GMT_Shift += TZ_Info[42];
int GMTt = TimeLocal() + GMT_Shift * 60;
GMT_OffsetHour = ((TimeCurrent() - GMTt)/3500);
}
}
السطر الأول
كود PHP:
if (!(IsTesting() || IsOptimization()))
هذا الشرط تم وضعه حتى نتأكد من أن الإكسبرت لا يقوم بعمل باك تست أو تحسين فإذا كان كذلك فيجب أن يتم تحديد فرق التوقيت يدويا ولا يمكن ذلك أوتوماتيكيا
كود PHP:
int GMT_Shift=0;
int TZ_Info[43];
int DST = GetTimeZoneInformation(TZ_Info);
if (DST != 0)
GMT_Shift = TZ_Info[0];
if (DST == 2)
GMT_Shift += TZ_Info[42];
هذا الجزء يتعلق بإيجاد التوقيت الشتوي والصيفي
ويأخذ المتغير DST ثلاثة قيم 0 و 1 و 2
0 تعني أن المنقطة غير معروفه وقد تعطي الساعه توقيت خاطئ
1 للتوقيت الغير متغير أو المناطق الزمنيه القياسيه
2 للتوقيت الصيفي
لن أشرح هذا الجزء أكثر لأنه يتعلق بملف الدل الذي قمنا بإستدعائه
ثم سيصبح توقيت جرينتش بالشكل التالي
كود PHP:
int GMT = TimeLocal() + GMT_Shift * 60;
وسيكون الفرق بين توقيت السيرفر وتوقيت جرينتش هو توقيت السيرفر - توقيت جرينتش
كود PHP:
GMT_OffsetHour = ((TimeCurrent() - GMT)/3500);
وسيكون OffsetHour هو فرق التوقيت بالساعه
والجزء الأخير الخاص بوضع شرط الدخول أو عدم الدخول سيكون كالآتي
كود PHP:
if(UseHourTrading){
if (!((StartHour+GMT_OffsetHour < EndHour+GMT_OffsetHour && TimeHour(TimeCurrent()) >= StartHour+GMT_OffsetHour && TimeHour(TimeCurrent()) < EndHour+GMT_OffsetHour) || (StartHour+GMT_OffsetHour > EndHour+GMT_OffsetHour && TimeHour(TimeCurrent()) >= StartHour+GMT_OffsetHour ||
TimeHour(TimeCurrent()) < EndHour+GMT_OffsetHour)))
{
Comment("Non-Trading Hours!");
return(0);
}
}
وسيصبح الكود بالشكل النهائي
كود PHP:
if (AutomaticGMT_Offset == TRUE) {
if (!(IsTesting() || IsOptimization())) {
int GMT_Shift=0;
int TZ_Info[43];
int DST = GetTimeZoneInformation(TZ_Info);
if (DST != 0)
GMT_Shift = TZ_Info[0];
if (DST == 2)
GMT_Shift += TZ_Info[42];
int GMT = TimeLocal() + GMT_Shift * 60;
GMT_OffsetHour = ((TimeCurrent() - GMT)/3500);
}
}
if(UseHourTrading){
if (!((StartHour+GMT_OffsetHour < EndHour+GMT_OffsetHour && TimeHour(TimeCurrent()) >= StartHour+GMT_OffsetHour && TimeHour(TimeCurrent()) < EndHour+GMT_OffsetHour) || (StartHour+GMT_OffsetHour > EndHour+GMT_OffsetHour && TimeHour(TimeCurrent()) >= StartHour+GMT_OffsetHour ||
TimeHour(TimeCurrent()) < EndHour+GMT_OffsetHour)))
{
Comment("Non-Trading Hours!");
return(0);
}
}
رد: إستخدام مكتبات الدل لتحديد فرق بين توقيت السيرفر وتوقيت جرينتش (موضوع تعليمي)
جزاك الله ألف خير أخي الكريم مس دولار
وجعله في ميزان حسناتك وأثابك ورزقك من حيث لا تحتسب
ورفع قدرك في الدنيا والآخرة يارب العالمين
ما تتخيل قد اش أفدتني تحية كبيرة لك يا اخي
في حفظ الرحمن / هاشمية
1 مرفق
رد: إستخدام مكتبات الدل لتحديد فرق بين توقيت السيرفر وتوقيت جرينتش (موضوع تعليمي)
جزاك الله كل خير اخي اسامة
حقيقة لقد استفدت من هذا الكود
ولقد بحثت عن مؤشرات اخرى ووجدت المؤشر الموجود في المرفقات
وهناك شيء آخر
هذا الكود
كود PHP:
GMT_OffsetHour = ((TimeCurrent() - GMTt)/3500);
يجب استبداله بهذا الكود
كود PHP:
GMT_OffsetHour = ((TimeCurrent() - GMTt)/3600);
اليس كذلك ؟
لأن 3600 عبارة عن 60 ثانية مضروبة في 60 دقيقة
تحياتي
رد: إستخدام مكتبات الدل لتحديد فرق بين توقيت السيرفر وتوقيت جرينتش (موضوع تعليمي)
اقتباس:
المشاركة الأصلية كتبت بواسطة wajdyss
جزاك الله كل خير اخي اسامة
حقيقة لقد استفدت من هذا الكود
ولقد بحثت عن مؤشرات اخرى ووجدت المؤشر الموجود في المرفقات
وهناك شيء آخر
هذا الكود
كود PHP:
GMT_OffsetHour = ((TimeCurrent() - GMTt)/3500);
يجب استبداله بهذا الكود
كود PHP:
GMT_OffsetHour = ((TimeCurrent() - GMTt)/3600);
اليس كذلك ؟
لأن 3600 عبارة عن 60 ثانية مضروبة في 60 دقيقة
تحياتي
بالفعل بارك الله فيك على تصحيح الخطأ
وحتى إذا كانت 3500 فسوف تعطي نتيجه صحيحه أيضا لأن GMT_OffsetHour تم تعريفه على أنه متغير صحيح فبالتالي لن تكون هناك فواصل وسيتم تقريب الرقم بالتالي ستكون النتيجه 3500 هي نفسها 3600
ولكن طبعا كتابة الكود بشكل سليم هي الأصح
تحياتي لك :eh_s(7):