برمجة سؤال برمجي
النتائج 1 إلى 6 من 6

الموضوع: سؤال برمجي

  1. #1
    تاريخ التسجيل
    Jul 2018
    الإقامة
    لبنان
    المشاركات
    13

    14 سؤال برمجي

    بعد فتح الاكسبرت لعدة صفقات مثلا 4
    يضع الاكسبرت ايضا امر معلق بشكل تلقائي

    السؤال هو :
    اريد من الاكسبرت بعد مرور نصف ساعة على وضع الامر المعلق حذفه واعادة وضع امر معلق اخر؟
    فما هو الcode لهذه الوظيفة ؟؟؟( اي كل نصف ساعة يحذف الامر المعلق فقط )
    مع الشكر

  2. #2
    تاريخ التسجيل
    Jul 2018
    الإقامة
    لبنان
    المشاركات
    13

    افتراضي

    استعملت هذا الcode بعد عدة محاولات ظبط
    static datetime _lastBarTime = 0;
    extern int Period1 = PERIOD_H1;
    int OnInit()
    {
    _lastBarTime = iTime(Symbol(),Period1,0);
    return(INIT_SUCCEEDED);

    }

    bool NewBar()

    {
    if (iTime(Symbol(),Period1,0) != _lastBarTime)
    {
    _lastBarTime = iTime(Symbol(), Period1,0);

    return (true);
    }
    else
    return (false);
    }

    int start()
    {
    if(NewBar()==true)

    {

    closePendingOrder();
    }}

    void closePendingOrder()

    {

    for(int a=0;a<OrdersTotal();a++)
    {

    if(OrderSelect(a,SELECT_BY_POS)==true)

    {

    if(OrderType()==OP_SELLSTOP || OrderType()==OP_BUYSTOP)
    {

    OrderDelete(OrderTicket(),Violet);

    }

    }

    }

    }

  3. #3
    تاريخ التسجيل
    Jun 2009
    الإقامة
    مصر
    المشاركات
    12,822

    افتراضي

    اقتباس المشاركة الأصلية كتبت بواسطة النبيل مشاهدة المشاركة
    استعملت هذا الcode بعد عدة محاولات ظبط
    static datetime _lastBarTime = 0;
    extern int Period1 = PERIOD_H1;
    int OnInit()
    {
    _lastBarTime = iTime(Symbol(),Period1,0);
    return(INIT_SUCCEEDED);

    }

    bool NewBar()

    {
    if (iTime(Symbol(),Period1,0) != _lastBarTime)
    {
    _lastBarTime = iTime(Symbol(), Period1,0);

    return (true);
    }
    else
    return (false);
    }

    int start()
    {
    if(NewBar()==true)

    {

    closePendingOrder();
    }}

    void closePendingOrder()

    {

    for(int a=0;a<OrdersTotal();a++)
    {

    if(OrderSelect(a,SELECT_BY_POS)==true)

    {

    if(OrderType()==OP_SELLSTOP || OrderType()==OP_BUYSTOP)
    {

    OrderDelete(OrderTicket(),Violet);

    }

    }

    }

    }
    الكود صحيح
    يمكنك أيضا عمل دالة لحذف الأمر المعلق بعد توقيت معين من وضعه
    مثال
    كود PHP:
    void DeletePendingOrder(int timeMinutes)
    {
     for(
    int i=OrdersTotal()-1;i>=0;i--)
     {
      
    bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(
    OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()>OP_SELL)
      {
       if(
    TimeCurrent()-OrderOpenTime()>=timeMinutes*60)
       {
        
    bool del=OrderDelete(OrderTicket());
       } 
      }
     }

    توقيع العضو
    بناء أنظمة تداول آلي ويدوي لفحص سوق العملات ودمجها مع التحليل الفني لإتخاذ القرارات

  4. #4
    تاريخ التسجيل
    Jul 2018
    الإقامة
    لبنان
    المشاركات
    13

    افتراضي

    شكرا دكتور اسامة
    وان سمحت لي اود ان اسال عن امر اخر حاولت جاهدا ان اجد له كود فلم افلح.

    المشكلة: اريد ان افتح عددة صفقات هيدج او مضاعفات مع تحديد الهدف لكل صفقة هنا يبدأ الbalance بالتزايد اما equity فترتفع وتنخفض قيمتها تبعا لحجم اللوتات المفتوحة.
    المطلوب تحديد تحديد قيمة ثابت K يساوي قيمة الequity عند بداية السلسة.

    (0 == (if (TotalOrder(-1
    {k==equity}
    وتبقى الk ثابتة بحيث يحفظ قيمتها الاكسبرت رغم تغير ال equity اثناء فتح الاوامر الاخرى
    وتقفل جميع الصفقات المفتوحة عندما تصبح ال equity>k.

    ملاحظة: ال k ليس لها اي علاقة بال Balance لانه متغير بسبب اقفال بعض الصفقات على البروفيت فنهمله ونعتمد فقت على الequity الاساسية التي انطلقنا منها عند بداية السلسلة .


    مع الشكر الجزيل .

  5. #5
    تاريخ التسجيل
    Jul 2018
    الإقامة
    لبنان
    المشاركات
    13

    افتراضي

    مثال على ذلك وقت حاولت وضع الbalance وال equity على الشارت لتقريب المسألة
    في الصورة الاولى انطلقنا من equity تساوي 10000 وbalance يساوي 10000
    بدأ التغير في الصورة الثانية فزادت قيمة الbalance , وقلت قيمة الequity
    في الصورة الثالثة المطلوب وهو اقفال الصفقات بعد ان زادت الequity عن الequity الاساسية والتي كانت فيمتها 10000 وعبرنا عنها بالثابت k
    وفي الصورة الرابعة اصبح الثابت k هو 10107 والمطلوب اقفال الصفقات عندما اصبحت ال10708equity اكبر من الثابت k

    اضغط على الصورة لعرض أكبر

الاســـم:	21.png
المشاهدات:	4
الحجـــم:	57.4 كيلوبايت
الرقم:	497331

    اضغط على الصورة لعرض أكبر

الاســـم:	22.png
المشاهدات:	3
الحجـــم:	66.3 كيلوبايت
الرقم:	497332

    اضغط على الصورة لعرض أكبر

الاســـم:	23.png
المشاهدات:	3
الحجـــم:	58.6 كيلوبايت
الرقم:	497333

    اضغط على الصورة لعرض أكبر

الاســـم:	24.png
المشاهدات:	4
الحجـــم:	59.0 كيلوبايت
الرقم:	497334



    اضغط على الصورة لعرض أكبر

الاســـم:	24.png
المشاهدات:	4
الحجـــم:	59.0 كيلوبايت
الرقم:	497334اضغط على الصورة لعرض أكبر

الاســـم:	24.png
المشاهدات:	4
الحجـــم:	59.0 كيلوبايت
الرقم:	497334اضغط على الصورة لعرض أكبر

الاســـم:	24.png
المشاهدات:	4
الحجـــم:	59.0 كيلوبايت
الرقم:	497334اضغط على الصورة لعرض أكبر

الاســـم:	24.png
المشاهدات:	4
الحجـــم:	59.0 كيلوبايت
الرقم:	497334اضغط على الصورة لعرض أكبر

الاســـم:	24.png
المشاهدات:	4
الحجـــم:	59.0 كيلوبايت
الرقم:	497334

  6. #6
    تاريخ التسجيل
    Jul 2018
    الإقامة
    لبنان
    المشاركات
    13

    افتراضي

    اعتقد ان هذا الكود جيد ويحقق المطلوب مع بعض التعديلات
    int start()
    {
    static int MostRecentPeriodStartTime = 0;
    static double BalanceAtPeriodStart = 0;

    int Now = TimeCurrent();

    if (MathFloor(MostRecentPeriodStartTime / 86400) < MathFloor(Now / 86400)) {
    BalanceAtPeriodStart = AccountBalance();

    if (MostRecentPeriodStartTime == 0) {
    } else {
    }

    MostRecentPeriodStartTime = Now;
    }


    if (AccountEquity() >= BalanceAtPeriodStart * 1.02) {

    // Close trades at profit etc etc etc

    }
    }