
رد: اخ سمير ممكن مساعدة في تصحيح اكسبيرت خدمي من صنعي
اقتباس:
المشاركة الأصلية كتبت بواسطة yane200
السلام عليكم ورحمة الله وبركاته,
حاولت اصلاحه فلم افلح اتمنى بكل من لديه فكرة
الاكسبيرت فكرته بسيطة . اعطيه رقم الصفقات الاساسية التي اود ان يديرها بحيت كلما عكس السعر عن الصفقة الأساسية بعدد من النقاط يقوم بعمل تبريد بلوط وربح انا احددهم مسبقا لكل تبريد على حدا بالتسلسل. الاخطاء التي واجهتني هي انه يبرد فقط صفقة واحدة على الشارت ولا يبرد الصفقة الاساسية الاخرى. المشكلة التانية لما تتفعل الصفقة الاساسية الاولى اللوط المخصص لكل تبريد يتم حسابه بشكل جيد فلما يتم تفعيل الصفقة الاساسية الثانية تتشابك لوتات الصفقات فتكون هناك اخطاء في لوت التبريدات والمشكلة الثالثة هو حساب الربح لكل تبريد لم استطع فهم الخطء.
وعليكم السلام ورحمة الله وبركاته
ما شاء الله عليك .. كود مفهوم وأخطاء بسيطة
عندك أخطاء لا تؤثر على عمل البرنامج وأخطاء تؤثر .. وسأقوم بشرح كل خطأ بالتفصيل لعله يساعدك في مسيرة البرمجة
أخطاء لاتؤثر على عمل البرنامج
خطأ في دالة OrdesTotalByMain قمت بتعريف com على أنه نص string ولكن داخل الدالة تمت مقارنته بعدد صحيح فدالة OrderMagicNumber ترجع قيمة صحيحة int .. هذا الخطأ لا يؤثر على عمل البرنامج لأن الميتاتريدر ستقوم بعمل cast للمتغيير ليكون من نفس النوع في المقارنة وهذا الشي يسبب أخطاء في البرامج الكبيرة ولهذا دائما قم بعمل ال cast ولا تجعل ميتاتريدر يقوم به لك
أستخدام ; في نهاية الشرط يلغي else وملحقاتها فإمسح ; ودع else تعمل أو أمسح else
متغير StopLoss عبارة عن مدخل في صفحة البرنامج أو ما يسمى input parameter وأنت هنا تقوم بتعديل هذا المدخل وهنا ميتاتريدر سمح لك بهذا التعديل لأنك أستخدمت extern ولو كنت وضعت هذا المدخل بصيغة input لأعطاك خطأ لا يمكن الأكمال بدون تصحيحه وفي العادة لا يقوم المبرمج بتعديل المدخل إلا إذا أراد أن يعطي المستخدم قيم أخرى وقت عمل البرنامج .. أيضا متغير StopLoss عرفته على أنه عدد صحيح int ولكن أستخدمته على لتحفظ قيمة عدد حقيقي double طبعا الكود لا يؤثر على ما تريد عمله لأنك لم تستخدمه .. ففي دالة OrderSend الستوب لوس صفر
أستخدام continue في المكان هذا لا يؤثر بسبب أنتهاء الشرط
أستخدام MathMax و MathMin من غير الحاجة لذلك .. فأستخدام openprice يكفي .. وفي هذا البرنامج عند أنعكاس السعر دائما سيكون openprice أكبر من Ask في حالة الشراء ويكون أصغر من Bid في حالة البيع
أخطاء تؤثر على عمل البرنامج
متغير OrdersOpenByMain يبدأ بصفر فأول أمر مضاعف سيكون في نفس مكان الأمر الأصلي وهذا غير منطقي فأول أمر مضاعف يجب أن يفتح بعد تخطي المسافة المدخلة
وسيقوم البرنامج بفتح صفقتين في نفس المكان أو السعر .. وهنا أقصد الصفقة 2 هي الأساسي و3 هي الصفقة المضاعفة .. لا تهتم للصفقة 4 فهذا خطأ آخر
ولهذا قم بإضافة واحد إلى هذا المتغير في هذا الأستخدام فقط
متفير TakeProfitSolo معرف على أنه عدد صحيح int لكن أستخدامه في البرنامج لحفظ عدد حقيقي double .. نفس مشكلة StopLoss .. ولهذا في هذه العملية يتم تخزين العدد 1 فقط لأن الميتاتريدر سيقوم بعملية ال cast ليكون العدد صحيح int وسيكون هدف الربح في الصفقات هو 1 ولهذا هو يعمل مع عمليات البيع لأن الهدف أقل من نقطة الدخول ولا يعمل مع عمليات الشراء لنفس السبب
خطأ بسبب أستخدام دالة OrderSelect في نفس الدائرة أو loop وهذا سيقوم بعمل override للدالة الأولى وتغيير قيمة OrderType ولهذا قم بحفظ قيمة OrderType كما فعلت مع openprice هذا الخطأ هو من يطعيك الصفقة 4 في الصورة السابقة

بعد التعديل
ناتج البرنامج قبل التعديل
ناتج البرنامج بعد التعديل
أتمنى أن تكون المعلومات وصلت
بالتوفيق