النتائج 1 إلى 7 من 7
- 15-03-2015, 03:53 PM #1
شرح الداله OnTimer وكيفية حساب الوقت بشكل صحيح
الداله OnTimer
بخلاف الداله OnTick فالداله يتم إستدعائها كل وقت معين تقوم بتنفيذ الأوامر الموجوده بداخلها ويمكن أن يصل هذا الوقت حتى 1 ملي ثانيهكود PHP:void OnTimer()
يتم إستدعائها في الإكسبرت أو المؤشرات فقط ولا يمكن إستخدامها مع الإسكربتات
لتفعيل الداله OnTimer يجب أن تحدد الفاصل الزمني لكل مره يتم إستدعاء الداله فيها بإستخدام الداله EventSetTimer
بداخل الداله OnInit
يعني سيتم إستدعاء الداله OnTimer كل 1 ثانيهكود PHP:EventSetTimer(1);
أو
ويعني سيتم إستدعاء الداله OnTimer كل كل 1 ملي ثانيهكود PHP:EventSetMillisecondTimer(1);
الداله EventKillTimer تستخدم لإنهاء عمل الداله OnTimer مثلا لو تريد توقف عمل الداله OnTimer عند تحقق شرط معين
كود PHP:if(TimeCurrent()>Time[0])
{
EventKillTimer();
}
في هذا الموضوع سوف أقوم بعمل إكسبرت يغلق الصفقه بعد مرور عدد ثواني محدده من فتحها
في البدايه سنعرف المتغير الخارجي لتحديد عدد الثواني
بداخل الداله OnInit سوف نحدد عمل الداله OnTimer كل 1 ثانيهكود PHP:input int CloseOrdersSeconds=0;
بداخل الداله OnTimerكود PHP:int OnInit()
{
EventSetTimer(1);
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
EventKillTimer();
}
لكن ستبقى مشكله أن الداله TimeCurrent تعود بقيمة التوقيت الحالي لآخر tick للسيرفر بالتالي إذا لم يتحرك السعر خلال فتره معينه حتى تتحدد الداله TimeCurrent فسوف تجد أن الداله 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);
}
}
}
لتفادي هذه المشكله
سوف أقوم بتعريف متغير آخر يحسب التوقيت الجديد بإضافة +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);
}
}
}
الداله OnTimer لا تعمل على الباك تست حتى الآن
مرفق الإكسبرتآخر تعديل بواسطة MR.dollar ، 15-03-2015 الساعة 06:56 PM
- 15-03-2015, 04:43 PM #2
ماشاء الله إضافة قيمة تضاف لكل ماتعلمته منك ، بارك الله فيك أستاذي الفاضل .
- 15-03-2015, 05:58 PM #3
السلام عليكم ورحمة الله وبركاته
ما شاء الله
هذه الاضافه ممتازه جدا بارك الله فيك استاذي الكريم مستر دولار
منذذ مده وانا افكر كيف اجعل الميتا ترايدر يتعامل مع الميللي ثانيه وليس التيك حتي اتفادي التأخر الناتج من عدم تحرك السعر ...... وبما شرحته الان يصبح الامر سهل جدا باستخدام هذه الداله للتعامل مع المللي ثانيه وليس التيك
شكرا لك مره اخري وجازاك الله خيرا
- 15-03-2015, 07:07 PM #4
معلومات قيمة وجد مفيدة، ولله الحمد
جزاك الله خيرا
- 15-03-2015, 09:07 PM #5
يشرفني مرورك الكريم وإن شاء الله تستفيد منه
وعليكم السلام ورحمة الله وبركاته
نعم سابقا كان مستحيل وكان الحل الوحيد هو إستخدام حلقة غير منتهيه وإستخدام الداله sleep للتوقف عدد محدد لكن بعد التحديث الأخير للغة mql4 تم إضافة هذه الداله لتؤدي هذا الغرض
- 17-03-2015, 10:55 PM #6
السلام عليكم ورحمة الله وبركاتة
اخى مستر دولار
كيف اضيف هذة الدالة الى الاكسيبرت بحيث تقوم بالاتى
عند توفر الشروط وارسال طلب البيع او الشراء تقوم هذة الدالة بارسال امر البيع او الشراء مرة اخرى حتى يتفعل الامر
لانة فى احيان لا يستجيب سيرفر الشركة للامر
- 18-03-2015, 12:29 AM #7
وعليكم السلام ورحمة الله وبركاته
لن تحتاج الداله OnTimer لكن يمكنك إستخدام الكود التالي كمثال
كود PHP:int ticket=-1;
if(rsi>50)
{
while(ticket<0)
{
ticket=OrderSend(Symbol(),OP_BUY,NewLot,NormalizeDouble(Ask,Digits),3*P,0,0,"EA",MagicNumber,0,Blue);
Sleep(100);
}
}
الأكثر زيارة
رد مع اقتباس