النتائج 1 إلى 7 من 7
  1. #1
    الصورة الرمزية MR.dollar
    MR.dollar غير متواجد حالياً مشرف المتداول العربي
    تاريخ التسجيل
    Jun 2009
    الإقامة
    مصر
    المشاركات
    13,851

    افتراضي شرح الداله 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);  
       }
      }  
     } 
    ملحوظه :
    الداله OnTimer لا تعمل على الباك تست حتى الآن
    مرفق الإكسبرت
    الملفات المرفقة الملفات المرفقة
    آخر تعديل بواسطة MR.dollar ، 15-03-2015 الساعة 06:56 PM

  2. #2
    الصورة الرمزية Jmeel
    Jmeel غير متواجد حالياً عضو نشيط
    تاريخ التسجيل
    Sep 2008
    الإقامة
    في أرض الله
    المشاركات
    7,610

    افتراضي

    ماشاء الله إضافة قيمة تضاف لكل ماتعلمته منك ، بارك الله فيك أستاذي الفاضل .
    توقيع العضو
    اعتذر لمن لن أتمكن من تنفيذ طلبه بسبب عدم قناعتي بالفكرة

  3. #3
    الصورة الرمزية batttot
    batttot غير متواجد حالياً عضو المتداول العربي
    تاريخ التسجيل
    Jan 2010
    الإقامة
    مصر
    المشاركات
    921

    افتراضي

    السلام عليكم ورحمة الله وبركاته

    ما شاء الله
    هذه الاضافه ممتازه جدا بارك الله فيك استاذي الكريم مستر دولار

    منذذ مده وانا افكر كيف اجعل الميتا ترايدر يتعامل مع الميللي ثانيه وليس التيك حتي اتفادي التأخر الناتج من عدم تحرك السعر ...... وبما شرحته الان يصبح الامر سهل جدا باستخدام هذه الداله للتعامل مع المللي ثانيه وليس التيك
    شكرا لك مره اخري وجازاك الله خيرا

  4. #4
    الصورة الرمزية kira-h
    kira-h غير متواجد حالياً عضو نشيط
    تاريخ التسجيل
    Oct 2011
    الإقامة
    المغرب
    المشاركات
    1,334

    افتراضي

    معلومات قيمة وجد مفيدة، ولله الحمد
    جزاك الله خيرا
    توقيع العضو
    متداول فوركس، ومبرمج mql

  5. #5
    الصورة الرمزية MR.dollar
    MR.dollar غير متواجد حالياً مشرف المتداول العربي
    تاريخ التسجيل
    Jun 2009
    الإقامة
    مصر
    المشاركات
    13,851

    افتراضي

    اقتباس المشاركة الأصلية كتبت بواسطة Jmeel مشاهدة المشاركة
    ماشاء الله إضافة قيمة تضاف لكل ماتعلمته منك ، بارك الله فيك أستاذي الفاضل .
    يشرفني مرورك الكريم وإن شاء الله تستفيد منه

    اقتباس المشاركة الأصلية كتبت بواسطة batttot مشاهدة المشاركة
    السلام عليكم ورحمة الله وبركاته

    ما شاء الله
    هذه الاضافه ممتازه جدا بارك الله فيك استاذي الكريم مستر دولار

    منذذ مده وانا افكر كيف اجعل الميتا ترايدر يتعامل مع الميللي ثانيه وليس التيك حتي اتفادي التأخر الناتج من عدم تحرك السعر ...... وبما شرحته الان يصبح الامر سهل جدا باستخدام هذه الداله للتعامل مع المللي ثانيه وليس التيك
    شكرا لك مره اخري وجازاك الله خيرا
    وعليكم السلام ورحمة الله وبركاته
    نعم سابقا كان مستحيل وكان الحل الوحيد هو إستخدام حلقة غير منتهيه وإستخدام الداله sleep للتوقف عدد محدد لكن بعد التحديث الأخير للغة mql4 تم إضافة هذه الداله لتؤدي هذا الغرض

  6. #6
    الصورة الرمزية غلباوى
    غلباوى متواجد حالياً عضو المتداول العربي
    تاريخ التسجيل
    Feb 2012
    الإقامة
    مصر
    المشاركات
    124

    افتراضي

    السلام عليكم ورحمة الله وبركاتة
    اخى مستر دولار
    كيف اضيف هذة الدالة الى الاكسيبرت بحيث تقوم بالاتى
    عند توفر الشروط وارسال طلب البيع او الشراء تقوم هذة الدالة بارسال امر البيع او الشراء مرة اخرى حتى يتفعل الامر
    لانة فى احيان لا يستجيب سيرفر الشركة للامر

  7. #7
    الصورة الرمزية MR.dollar
    MR.dollar غير متواجد حالياً مشرف المتداول العربي
    تاريخ التسجيل
    Jun 2009
    الإقامة
    مصر
    المشاركات
    13,851

    افتراضي

    اقتباس المشاركة الأصلية كتبت بواسطة غلباوى مشاهدة المشاركة
    السلام عليكم ورحمة الله وبركاتة
    اخى مستر دولار
    كيف اضيف هذة الدالة الى الاكسيبرت بحيث تقوم بالاتى
    عند توفر الشروط وارسال طلب البيع او الشراء تقوم هذة الدالة بارسال امر البيع او الشراء مرة اخرى حتى يتفعل الامر
    لانة فى احيان لا يستجيب سيرفر الشركة للامر
    وعليكم السلام ورحمة الله وبركاته
    لن تحتاج الداله 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);       
     }




1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17