تخطى إلى المحتوى

تعليمي شرح الداله OnTimer وكيفية حساب الوقت بشكل صحيح

تعليمي شرح الداله OnTimer وكيفية حساب الوقت بشكل صحيح

الداله OnTimer

كود PHP:
void OnTimer()

بخلاف الداله OnTick فالداله يتم إستدعائها كل وقت معين تقوم بتنفيذ الأوامر الموجوده بداخلها ويمكن أن يصل هذا الوقت حتى 1 ملي ثانيه
يتم إستدعائها في الإكسبرت أو المؤشرات فقط ولا يمكن إستخدامها مع الإسكربتات

لتفعيل الداله OnTimer يجب أن تحدد الفاصل الزمني لكل مره يتم إستدعاء الداله فيها بإستخدام الداله EventSetTimer
بداخل الداله OnInit
كود PHP:
EventSetTimer(1);

يعني سيتم إستدعاء الداله OnTimer كل 1 ثانيه
أو
كود PHP:
EventSetMillisecondTimer(1);

ويعني سيتم إستدعاء الداله OnTimer كل كل 1 ملي ثانيه

الداله EventKillTimer تستخدم لإنهاء عمل الداله OnTimer مثلا لو تريد توقف عمل الداله OnTimer عند تحقق شرط معين
كود PHP:
if(TimeCurrent()>Time[0])
{
EventKillTimer();
}

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

في البدايه سنعرف المتغير الخارجي لتحديد عدد الثواني
كود PHP:
input int CloseOrdersSeconds=0;

بداخل الداله OnInit سوف نحدد عمل الداله OnTimer كل 1 ثانيه
كود PHP:
int OnInit()
{
EventSetTimer(1);
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
EventKillTimer();
}

بداخل الداله OnTimer
كود PHP:
for(int i=OrdersTotal()-1;i>=0;i–)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
double ask=MarketInfo(OrderSymbol(),MODE_ASK);
double bid=MarketInfo(OrderSymbol(),MODE_BID);
datetime OpenTime=OrderOpenTime();

if(TimeCurrent()-OpenTime>=CloseOrdersSeconds&&CloseOrdersSeconds!=0)
{
if(OrderType()==OP_BUY)
{
bool close=OrderClose(OrderTicket(),OrderLots(),bid,3*P);
}
if(OrderType()==OP_SELL)
{
bool close=OrderClose(OrderTicket(),OrderLots(),ask,3*P);
}
}
}

لكن ستبقى مشكله أن الداله TimeCurrent تعود بقيمة التوقيت الحالي لآخر tick للسيرفر بالتالي إذا لم يتحرك السعر خلال فتره معينه حتى تتحدد الداله TimeCurrent فسوف تجد أن الداله OnTimer تحسب نفس التوقيت وبالتالي قد تتأخر إغلاق الصفقه بعض ثواني حتى يتحرك السعر ويحدث التوقيت الحالي الجديد

لتفادي هذه المشكله
سوف أقوم بتعريف متغير آخر يحسب التوقيت الجديد بإضافة +1 ثانيه مع كل عمل للداله OnTimer بالتالي حتى إذا لم يتحرك السعر ولم تتحدث الداله TimeCurrent فسوف أقوم بتحديث المتغير تلقائيا
كود PHP:
static datetime PreviousRecordedTime;
if(TimeCurrent()==PreviousRecordedTime)PreviousRecordedTime++;
else PreviousRecordedTime=TimeCurrent();

وسيصبح الكود النهائي
كود PHP:
void OnTimer()
{

static datetime PreviousRecordedTime;
if(TimeCurrent()==PreviousRecordedTime)PreviousRecordedTime++;
else PreviousRecordedTime=TimeCurrent();

for(int i=OrdersTotal()-1;i>=0;i–)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
double ask=MarketInfo(OrderSymbol(),MODE_ASK);
double bid=MarketInfo(OrderSymbol(),MODE_BID);
datetime OpenTime=OrderOpenTime();

if(PreviousRecordedTime-OpenTime>=CloseOrdersSeconds&&CloseOrdersSeconds!=0)
{
if(OrderType()==OP_BUY)
{
bool closeB=OrderClose(OrderTicket(),OrderLots(),bid,3*P);
}
if(OrderType()==OP_SELL)
{
bool closeS=OrderClose(OrderTicket(),OrderLots(),ask,3*P);
}
}
}

مرفق الإكسبرت
الملفات المرفقة

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

هذا الموقع يستخدم Akismet للحدّ من التعليقات المزعجة والغير مرغوبة. تعرّف على كيفية معالجة بيانات تعليقك.