النتائج 1 إلى 7 من 7
- 15-03-2015, 03:53 PM #1
شرح الداله OnTimer وكيفية حساب الوقت بشكل صحيح
الداله OnTimer
كود PHP:void OnTimer()
يتم إستدعائها في الإكسبرت أو المؤشرات فقط ولا يمكن إستخدامها مع الإسكربتات
لتفعيل الداله OnTimer يجب أن تحدد الفاصل الزمني لكل مره يتم إستدعاء الداله فيها بإستخدام الداله EventSetTimer
بداخل الداله OnInit
كود PHP:EventSetTimer(1);
أو
كود PHP:EventSetMillisecondTimer(1);
الداله EventKillTimer تستخدم لإنهاء عمل الداله OnTimer مثلا لو تريد توقف عمل الداله OnTimer عند تحقق شرط معين
كود PHP:if(TimeCurrent()>Time[0])
{
EventKillTimer();
}
في هذا الموضوع سوف أقوم بعمل إكسبرت يغلق الصفقه بعد مرور عدد ثواني محدده من فتحها
في البدايه سنعرف المتغير الخارجي لتحديد عدد الثواني
كود PHP:input int CloseOrdersSeconds=0;
كود PHP:int OnInit()
{
EventSetTimer(1);
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
EventKillTimer();
}
كود 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);
}
}