الأسئلة البرمجية MT5 & MT4

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • المشاركة الأصلية بواسطة Turkm مشاهدة المشاركة

    بسيطة ابحث عن الاممر الذي له نفس الماجيك نمبر ثم استرجع من هذا الامر فقط التيكت ثم قم باغلاق الامر الذي له نفس التيكت المسترجع:

    كود PHP:
    int OrderTicketInfo(int Mgic_Number)
    {
    for(int i = OrdersTotal() - 1; i >= 0 ; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    if(OrderSymbol() == Symbol()
    && OrderMagicNumber() == Mgic_Number)
    {
    return (OrderTicket());
    }
    }
    return(0);
    }
    عاشت يداك وأنار الله قلبك وعقلك بنوره

    تعليق


    • المشاركة الأصلية بواسطة zooz1o مشاهدة المشاركة

      عاشت يداك وأنار الله قلبك وعقلك بنوره
      على الرحب والسعة اخي الكريم

      تعليق


      • السلام عليكم اخي
        في الميتاتريدر 4 على فريم ال5 دقائق
        معروف ان كل شمعة مدتها 300 ثانية
        كما ذكرت لك انني اريد فتح صفقة لكل اشارة وهذا من خلال مقارنة الوقت الحالي بوقت فتح الصفقة
        فأكتب هكذا:
        في حالة كان الوقت الحالي اكبر من وقت فتح الصفقة + 300 ثانية
        فهنا يكون وقت فتح الصفقة الساعة ال5:00 ثم نضيف 300 ثانية سيكون الوقت الحالي هو 5:05
        لحد هنا طبيعي جدا
        لكن ما يحدث انه في حالة تحقق الهدف في نفس الشمعة التي حدث بها الفتح يقوم الاكسبيرت بفتح صفقة في نفس وقت الغلق ويتجاهل تماما الشرط

        فهل من تفسير؟

        كود PHP:
        if(Arrow_UP!=EMPTY_VALUE &&Arrow_UP>0
        && TimeCurrent()>LastOrderInfo("Time")+299
        && TimeCurrent()>LastClosedInfo("Time")+299​) 
        
        ملحوظة: الدوال ترجع قيم اسعار فتح الشمعة سواء بيانات حالية او تاريخية

        تعليق


        • المشاركة الأصلية بواسطة zooz1o مشاهدة المشاركة
          السلام عليكم اخي
          في الميتاتريدر 4 على فريم ال5 دقائق
          معروف ان كل شمعة مدتها 300 ثانية
          كما ذكرت لك انني اريد فتح صفقة لكل اشارة وهذا من خلال مقارنة الوقت الحالي بوقت فتح الصفقة
          فأكتب هكذا:
          في حالة كان الوقت الحالي اكبر من وقت فتح الصفقة + 300 ثانية
          فهنا يكون وقت فتح الصفقة الساعة ال5:00 ثم نضيف 300 ثانية سيكون الوقت الحالي هو 5:05
          لحد هنا طبيعي جدا
          لكن ما يحدث انه في حالة تحقق الهدف في نفس الشمعة التي حدث بها الفتح يقوم الاكسبيرت بفتح صفقة في نفس وقت الغلق ويتجاهل تماما الشرط

          فهل من تفسير؟

          كود PHP:
          if(Arrow_UP!=EMPTY_VALUE &&Arrow_UP>0
          && TimeCurrent()>LastOrderInfo("Time")+299
          && TimeCurrent()>LastClosedInfo("Time")+299​) 
          
          ملحوظة: الدوال ترجع قيم اسعار فتح الشمعة سواء بيانات حالية او تاريخية


          وعليكم السلام

          اولا لا افهم لما كل هذا التعقيد فعند اشارة الشراء يفتح شراء وعند البيع يفتح بيع وتستطيع التمييز بين اشارات المؤشر لان كل اشارة سهم هي تتبع بفر مختلف عن الآخر لذلك تابع كل بفر لوحدو وبالتالي تستطيع تمييز الاشارات

          وبالنسبة للشرط الذي كتبته فهو خاطئ 100% لعدة اسباب:
          اولا ماهو نوع البيانات المسترجعة من دالة LastClosedInfo("Time") وماهو نوع الدالة LastClosedInfo
          ثانيا سافترض ان نوع الدالة LastClosedInfo هو datetime وانت تقارنها بالدالة TimeCurrent لحد الآن كل شيئ جيد ولكنك تقوم بجمع 299 وهو من نوع int الى شرط مقارنة بين متغييرين من نوع datetime لذلك من المؤكد انك ستحصل على نتيجة غير صحيحة


          تعليق


          • المؤشر عبارة عن 2 بافر
            الاول لأشارات الشراء والثاني لأشارات البيع
            كيف يتم التمييز بين اشارات الشراء العديدة هذه؟

            تعليق


            • المشاركة الأصلية بواسطة zooz1o مشاهدة المشاركة
              المؤشر عبارة عن 2 بافر
              الاول لأشارات الشراء والثاني لأشارات البيع
              كيف يتم التمييز بين اشارات الشراء العديدة هذه؟
              لايمكن

              لان البفر يعطيك آخر اشارة فقط
              الحل الوحيد ان تقوم بقراءة كل قيم البفر تماما مثلما تقوم بقراءة اغلاقات آخر 500 شمعة للخلف

              تعليق


              • المشاركة الأصلية بواسطة Turkm مشاهدة المشاركة

                لايمكن

                لان البفر يعطيك آخر اشارة فقط
                الحل الوحيد ان تقوم بقراءة كل قيم البفر تماما مثلما تقوم بقراءة اغلاقات آخر 500 شمعة للخلف
                نظراً لصعوبة تنفيذ ذلك بالنسبة لي فأفضل الاستمرار في الطريقة التي تعتمد على الوقت
                اضغط على الصورة لعرض أكبر. 

الإسم:	tawkeet.png 
مشاهدات:	59 
الحجم:	6.3 كيلوبايت 
الهوية:	951546



                في هذه الصورة تم الخروج من الصفقات 54 و 53 و 52 بهذا الترتيب
                ولأن دالة LastClosedInfo تأخذ بيانتها من اخر كلوز فهنا سعر الفتح للصفقة رقم 52 كان 19:20 لذلك عند وضع الشرط هو ان يكون سعر الفتح اكبر من او يساوي 19:25
                فعندما اغلقت الصفقة في الوقت 19:42 كان شرط الدخول محقق لذلك فتحت الصفقة التالية الجديدة في الوقت نفسه وهو وقت خاطئ

                لأن دالة lastClosedInfo اخذت بياناتها من صفقة 52 وليس 54
                فالمفترض ان أأخذ سعر الفتح للصفقة التي فتحت أخيرا وهي صفقة 54 وليس 52
                فلماذا هذه الدالة تأخذ بالأقدم؟
                لماذا اولوية غلق الصفقات يتم من الاحدث الى الاقدم اساسا؟
                وكيف اغير هذه الاولوية في غلق الصفقات فبدلا من ان يغلق 54 ثم 53 ثم 52 أريده ان يغلق 52 ثم 53 ثم 54

                كود PHP:
                double LastClosedInfo(string S, int type = -1)
                {
                for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
                if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
                if(OrderSymbol() == Symbol()
                && OrderMagicNumber() == MagicNumber
                && (OrderType() == type || type == -1))
                {
                if(S == "Lots") return(OrderLots());
                else if(S == "Price") return(OrderOpenPrice());
                else if(S == "TP") return(OrderTakeProfit());
                else if(S == "SL") return(OrderStopLoss());
                else if(S == "Type") return(OrderType());
                else if(S == "Profit") return(OrderProfit());
                else if(S == "Time") return(OrderOpenTime());
                else if(S == "Comment") return(OrderComment());
                else if(S == "MagicNumber") return(OrderMagicNumber());
                else if(S == "Time2") return(OrderCloseTime());
                }
                return(0);
                }

                تعليق


                • المشاركة الأصلية بواسطة zooz1o مشاهدة المشاركة

                  نظراً لصعوبة تنفيذ ذلك بالنسبة لي فأفضل الاستمرار في الطريقة التي تعتمد على الوقت
                  اضغط على الصورة لعرض أكبر. 

الإسم:	tawkeet.png 
مشاهدات:	59 
الحجم:	6.3 كيلوبايت 
الهوية:	951546



                  في هذه الصورة تم الخروج من الصفقات 54 و 53 و 52 بهذا الترتيب
                  ولأن دالة LastClosedInfo تأخذ بيانتها من اخر كلوز فهنا سعر الفتح للصفقة رقم 52 كان 19:20 لذلك عند وضع الشرط هو ان يكون سعر الفتح اكبر من او يساوي 19:25
                  فعندما اغلقت الصفقة في الوقت 19:42 كان شرط الدخول محقق لذلك فتحت الصفقة التالية الجديدة في الوقت نفسه وهو وقت خاطئ

                  لأن دالة lastClosedInfo اخذت بياناتها من صفقة 52 وليس 54
                  فالمفترض ان أأخذ سعر الفتح للصفقة التي فتحت أخيرا وهي صفقة 54 وليس 52
                  فلماذا هذه الدالة تأخذ بالأقدم؟
                  لماذا اولوية غلق الصفقات يتم من الاحدث الى الاقدم اساسا؟
                  وكيف اغير هذه الاولوية في غلق الصفقات فبدلا من ان يغلق 54 ثم 53 ثم 52 أريده ان يغلق 52 ثم 53 ثم 54

                  كود PHP:
                  double LastClosedInfo(string S, int type = -1)
                  {
                  for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
                  if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
                  if(OrderSymbol() == Symbol()
                  && OrderMagicNumber() == MagicNumber
                  && (OrderType() == type || type == -1))
                  {
                  if(S == "Lots") return(OrderLots());
                  else if(S == "Price") return(OrderOpenPrice());
                  else if(S == "TP") return(OrderTakeProfit());
                  else if(S == "SL") return(OrderStopLoss());
                  else if(S == "Type") return(OrderType());
                  else if(S == "Profit") return(OrderProfit());
                  else if(S == "Time") return(OrderOpenTime());
                  else if(S == "Comment") return(OrderComment());
                  else if(S == "MagicNumber") return(OrderMagicNumber());
                  else if(S == "Time2") return(OrderCloseTime());
                  }
                  return(0);
                  }
                  بسبب هذا السطر:

                  كود PHP:
                  for(int i = OrdersHistoryTotal() - 1; i >= 0; i--) 
                  
                  لان اول قيمة في الحلقة هو OrdersHistoryTotal() - 1 اي آخر صفقة مغلقة ثم يرجع للبداية

                  تعليق


                  • اعطيني دالة ال iCustome التي تسترجع منها قيم المؤشر

                    تعليق


                    • المشاركة الأصلية بواسطة Turkm مشاهدة المشاركة
                      اعطيني دالة ال iCustome التي تسترجع منها قيم المؤشر
                      تفضل اخي
                      كود PHP:
                      double Arrow_UP=iCustom(Symbol(),Charts,"Indicator 1",Charts,0,1); 
                      

                      تعليق


                      • المشاركة الأصلية بواسطة Turkm مشاهدة المشاركة

                        بسبب هذا السطر:

                        كود PHP:
                        for(int i = OrdersHistoryTotal() - 1; i >= 0; i--) 
                        
                        لان اول قيمة في الحلقة هو OrdersHistoryTotal() - 1 اي آخر صفقة مغلقة ثم يرجع للبداية
                        هو بالفعل يرجع لسعر فتح اخر صفقة مغلقة

                        تعليق


                        • تفضل هذه الدالة ولو تلاحظ فهي مشابهة لدالة الزجزاج

                          كود PHP:
                          //+------------------------------------------------------------------+
                          //| |
                          //+------------------------------------------------------------------+
                          double SearchSignals(int Charts, int Q, int BufferLine)
                          {
                          int First = 0;
                          for(int i = 0; i < 1000; i++)
                          {
                          double Arrow_UP=iCustom(Symbol(), Period(),"Indicator 1", Charts, BufferLine, i);
                          if(Arrow_UP!=0)First++;
                          if(First==1 && Q == 0 && Arrow_UP != 0) {return(Arrow_UP);}
                          if(First==2 && Q == 1 && Arrow_UP != 0) {return(Arrow_UP);}
                          if(First==3 && Q == 2 && Arrow_UP != 0) {return(Arrow_UP);}
                          if(First==4 && Q == 3 && Arrow_UP != 0) {return(Arrow_UP);}
                          if(First==5 && Q == 4 && Arrow_UP != 0) {return(Arrow_UP);}
                          if(First==6 && Q == 5 && Arrow_UP != 0) {return(Arrow_UP);}
                          if(First==7 && Q == 6 && Arrow_UP != 0) {return(Arrow_UP);}
                          if(First==8 && Q == 7 && Arrow_UP != 0) {return(Arrow_UP);}
                          if(First==9 && Q == 8 && Arrow_UP != 0) {return(Arrow_UP);}
                          if(First==10 && Q == 9 && Arrow_UP != 0) {return(Arrow_UP);}
                          }
                          return 0;
                          }
                          من المتغير BufferLine تحدد اي بفر تريد البحث مثلا لو نفرض ان بفر اشارات الشرء = 1 وانت تريد الاشارة الثالثة فتكتب:

                          كود PHP:
                          SearchSignals( 1, 2, 1); 
                          
                          رقم 1 في البداية هو تابع لمتغير Charts لاأعلم ماغايته لانك انت من وضعته في دالة iCustom عموما حاول ممكن يحتاج لتعديلات بسيطة ولكن هذا هو شكل الدالة التي ستحضر لك قيم الاشارات السابقة حتى 10 اشارات للخلف

                          بالتوفيق

                          تعليق


                          • السلام عليكم
                            عندي سؤال:
                            ليه لما بحط الكود ده في اكسبيرت الميتاتريدر 4 مش بيشتغل؟
                            كود PHP:
                            double RSI[];
                            double RSIMAX[];
                            double RSIMIN[];
                            كود PHP:
                            int counted_bars = IndicatorCounted();
                            if(counted_bars>0) counted_bars--;
                            int limit=Bars-counted_bars;
                            for(int i = limit-1; i >= 0; i--)
                            if(Ask){RSI[i]    = iRSI(NULL,0,11,PRICE_CLOSE,i);}
                            if(Ask){RSIMAX[i] = RSI[ArrayMaximum(RSI, 120, i)];}
                            if(Ask){RSIMIN[i] = RSI[ArrayMinimum(RSI, 120, i)];}

                            تعليق


                            • المشاركة الأصلية بواسطة zooz1o مشاهدة المشاركة
                              السلام عليكم
                              عندي سؤال:
                              ليه لما بحط الكود ده في اكسبيرت الميتاتريدر 4 مش بيشتغل؟
                              كود PHP:
                              double RSI[];  double RSIMAX[];  double RSIMIN[];
                              كود PHP:
                              int counted_bars = IndicatorCounted();  if(counted_bars>0) counted_bars--;  int limit=Bars-counted_bars;  for(int i = limit-1; i >= 0; i--)  if(Ask == ???? ){RSI[i] = iRSI(NULL,0,11,PRICE_CLOSE,i);}  if(Ask == ???? )zz0.50dkkwi6ojfzz){RSIMAX[i] = RSI[ArrayMaximum(RSI, 120, i)];}  if(Ask == ???? ){RSIMIN[i] = RSI[ArrayMinimum(RSI, 120, i)];}


                              اين الشرط ؟ هل يجوز ان تقول اذا كان السعر وتسكت ولاتكمل الشرط

                              تعليق


                              • المشاركة الأصلية بواسطة Turkm مشاهدة المشاركة



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

                                في هذا الكود:
                                كود PHP:
                                const int Handle_TENKANSEN=0;
                                const int Handle_KIJUNSEN=1;
                                const int Handle_SENKOUSPANA=2;
                                const int Handle_SENKOUSPANB=3;
                                const int Handle_CHIKOUSPAN=4;
                                int Handle;
                                double BufferTENKANSEN[27];
                                double BufferKIJUNSEN[27];
                                double BufferSENKOUSPANA[27];
                                double BufferSENKOUSPANB[27];
                                double BufferCHIKOUSPAN[27];
                                
                                int OnInit() {
                                Trade=new CTrade();
                                Trade.SetExpertMagicNumber(MagicNumber);
                                
                                Handle=iIchimoku(_Symbol,Charts,9,26,52);
                                if(Handle==INVALID_HANDLE)
                                     {
                                      PrintFormat("Failed",GetLastError());
                                      return(INIT_FAILED);
                                     }
                                   return(INIT_SUCCEEDED);
                                  }
                                void OnDeinit(const int reason) {
                                IndicatorRelease(Handle);
                                }
                                
                                
                                void OnTick()
                                {
                                
                                CTrade trade;
                                trade.SetExpertMagicNumber(MagicNumber);
                                
                                int cnt_1 = CopyBuffer(Handle,Handle_TENKANSEN,0,27,BufferTENKANSEN);
                                int cnt_2 = CopyBuffer(Handle,Handle_KIJUNSEN,0,27,BufferKIJUNSEN);
                                int cnt_3 = CopyBuffer(Handle,Handle_SENKOUSPANA,0,27,BufferSENKOUSPANA);
                                int cnt_4 = CopyBuffer(Handle,Handle_SENKOUSPANB,0,27,BufferSENKOUSPANB);
                                int cnt_5 = CopyBuffer(Handle,Handle_CHIKOUSPAN,0,27,BufferCHIKOUSPAN);
                                      
                                double Previous_TENKANSEN   = BufferTENKANSEN[1];
                                double Current_TENKANSEN    = BufferTENKANSEN[0];
                                double TENKANSEN_26         = BufferTENKANSEN[26];
                                  
                                double Previous_KIJUNSEN    = BufferKIJUNSEN[1];
                                double Current_KIJUNSEN     = BufferKIJUNSEN[0];
                                double KIJUNSEN_26          = BufferKIJUNSEN[26];
                                
                                double Previous_SENKOUSPANA = BufferSENKOUSPANA[1];
                                double Current_SENKOUSPANA  = BufferSENKOUSPANA[0];
                                double SENKOUSPANA_26       = BufferSENKOUSPANA[26];
                                
                                double Previous_SENKOUSPANB = BufferSENKOUSPANB[1];
                                double Current_SENKOUSPANB  = BufferSENKOUSPANB[0];
                                double SENKOUSPANB_26       = BufferSENKOUSPANB[26];
                                
                                double Previous_CHIKOUSPAN  = BufferCHIKOUSPAN[1];
                                double Current_CHIKOUSPAN   = BufferCHIKOUSPAN[0];
                                double CHIKOUSPAN_26        = BufferCHIKOUSPAN[26];
                                حاولت ايجاد قيم مؤشر الايشموكو في الشمعة رقم 26
                                ينجح في الشمعة الحالية والسابقة فقط ولكنها يفشل في ايجاد قيم المؤشر في الشمعة رقم 26
                                فما الخطأ عندي؟

                                تعليق

                                يعمل...
                                X