google
twitter
facebook
twitter
google
forex

صفحة 1 من 10 1 2 3 ... الأخيرةالأخيرة
النتائج 1 إلى 10 من 94

الموضوع: المؤشرات و الاكسبيرتات والبرمجة

  1. #1
    تاريخ التسجيل
    Nov 2011
    المشاركات
    1,560

    افتراضي المؤشرات و الاكسبيرتات والبرمجة

    شرح طريقة عمل باكتيست 99% خاص للمنتدى و حصريا !
    كثير من الناس مجرد انها تحصل على نتائج سيئه من اكسبرت فكرته جميله .. فا تتخلى عن الاكسبرت

    لكن السوأل هل انتم واثقين من نتيجة الاكسبرت في الباك تيست ؟

    هل تعلم ان هناك بينات كثيره خاطئه و غير موجوده في الباكتيست ؟

    مثال شهر 6 غير موجود في اي ميتاتريدر


    توصل شخص اجنبي من ان يحصل على بيانات دقتها عاليه بنسبه 99% و هيا عباره عن بينات يتم تحميلها من بروكر Dukascopy و هو من اشهر البروكرات


    دليل واحد يكفي في ان يثبت صحة كلامي في اختلاف الباكتيست بشكل كبير عن الحقيقه

    باك تيست ميتاتريدر 90% لسنوات عديده يكون حجم الملف 30MB
    باك تيست عن طريق 99% يكون حجم الملف لسنه واحده فقط تقريبا 1000MB

    فا هل ترون الفرق الشاسع في حجم البيانات ؟؟



    خلاصة الكلام .. اذا كنت متأكد من فكرة الاكسبرت بعد دراستها يدوي فلا تلجأ الى الباكتيست و هذه نظرتي


    ================================================== ===============


    اسف على الاطاله سوف اقوم حاليا في شرح كيف يتم الحصول على باكتيست 99%


    الطريقه محتاجه تركيز فا خذو وقتكم للتركيز :


    1- حمل ملفات Mql-scrpits.rar and Loader.rar

    * الملف loader يحتوي على عدة ملفات بصيغة ExE ... فا يجب اختيار الملف الذي يكون نفس اخر Update للميتاتريدر .. و هو V402
    * الملف mql-scripts.rar يحتوني على ملفين ... ملف include and Scripts و الاثنين يتم وضعهم داخل ملف c:\Program Files\metatrader\Expert

    2- يتم تحميل البيانات التاريخيه للعمله حاليا انا عندي بيانات ل 4 عملات رفعتهم على سيرفر EURUSD/GBPUSD/USDJPY/USDCHF

    * بعد التحميل يتم وضع هذه الملفات في ملف اسمه Files و هو موجود داخل ملف c:\Program Files\metatrader\expert\files


    3- يتم تشغيل الميتاتريدر عن طريق ملف loader.exe ... يتم الضغط عليه و سوف تظهر رساله فا تقوم بالضغط عليها مره اخرى و راح يفتح الميتاتريدر

    4- بعدي ما يفتح الميتاتريدر ... تقوم بأغلاق جميع الجارتات الموجوده و تفتح فقط الجارت للعمله التي تريد اختبارها لتفرض EURUSD

    * اذا كنت تريد اختبار العمله على 1H فا يجب ان تخلي الجارت على 1H حتى تقوم في تحويل البيانات الى صيغه يقرأها الميتاتريدر و تختبرها

    5- تقوم بالذهاب الى قسم Scripts الذي يكون موجود على الشمال اخر قسم بعد المؤشرات و سوف تلاقي script اسمه JForex2FXT تقوم في وضعه على جارت الدولار

    * راح يفتح لك مربع في بيانات تتحكم فيها .. ملاحظه هاااامه جدا!! : اول خانه سوف تقوم بكتابت نفس اسم الملف الذي حملته من الموقع و الذي يحتوي على بيانات العمله

    * مثال اسم الملف EURUSD 2010 to 2011.csv فا ستقوم بوضع نفس الاسم بالضبط EURUSD 2010 to 2011.CSV

    * و تنتقل بالمربح الى الاسفل راح تلاقي هذه الشغلات المهمه التي يجب عليك وضعها و تختلف من بروكر الى اخر

    (GMT TIME - Spreads -leverage)

    و هذه يجب انت ان تضعها على حسب البروكر الذي تستخدمه

    6-بعد انتهاء من كتب هذه البيانات .. قوم بضعط على ok و انتظر دقائق حتى يقوم بتحويل هذا الملف .. و سوف تظهر رساله تقول انه انتهى

    7-تذهب الى الملف الذي وضعت فيه البيانات في مجلد c:\Program Files\metatrader\expert\files راح تلاقي عدة ملفات موجوده من نفس العمله

    * لكن !! راح تلاقي ملف واحد فقط حجمه مقارب الى حجم الملف الرئيسي الذي وضعته انت لكن !! بصيغة FXT !!

    8ا- انسخ هذا الملف و اذهب الى C:\Program Files\MetaTrader\tester\history و الصقه في هذا المكان

    9- الأن اخر خطوه و هي بعد وضع هذا الملف .. اذهب الى قسم Scripts في الميتاتريدر و اضغط على script اسمه brits patch و ضعه على جارت الدولار

    10- افتح الباكتيست على عملة يورودولار و ضع التايم 1H و ابتدي الاختبار



    اخر ملاحظه مهمه !!! : اذا كنت تريد ان تختبر على وقت ثاني من نفس العمله ( مثال EURUSD 30min) اذا كرر الخطوات من الرقم 5 الى الاخير





    فَقُلْتُ اسْتَغْفِرُوا رَبَّكُمْ إِنَّهُ كَانَ غَفَّارًا (10) يُرْسِلِ السَّمَاءَ عَلَيْكُمْ مِدْرَارًا (11) وَيُمْدِدْكُمْ بِأَمْوَالٍ وَبَنِينَ وَيَجْعَلْ لَكُمْ جَنَّاتٍ وَيَجْعَلْ لَكُمْ أَنْهَارًا (12) مَا لَكُمْ لَا تَرْجُونَ لِلَّهِ وَقَارًا (13)

  2. #2
    تاريخ التسجيل
    Nov 2011
    المشاركات
    1,560

    افتراضي

    تعال وتعلم معنا لغة MQL4 حتى الاحتراف

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


    هذا الموضوع سيكون سلسلة دروس لتعلم لغة المال MQL4 .

    أرجو من الله التوفيق لي ولكم

    ====================================

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

    ستكون هذه المعلومات على شكل نقاط لسهولة الطرح والفهم وطرح الأسئلة.

    1- هذه اللغة خاصة لبرامج التداول ميتاتريدر الإصدار الرابع وهو الإصدار الأحدث ( لأن لغة الإصدارات السابقة مختلفة وملغية ).

    2- هيكلية هذه اللغة مشابهة ومطابقة للغة السي ( C ) بحيث سيجد مبرمج السي سهولة أكبر في تعلمها ولكن يجب أن لا يخاف من لا يعرف السي أو البرمجة بشكل عام. لأنه يستطيع بسهولة مجاراة مبرمج السي مع قليل من الجهد.

    3- اللغة MQL4 حساسة لحالة الأحرف يعني مثلا الوظيفة OrderSend لن تتعرف عليها اللغة إذا ما كتبتها ordersend. وسيعطيك رسالة خطأ. لذلك يجب الانتباه جيدا عند كتابة الكود.

    4- الكود والسورس والنص البرمجي ونص البرنامج كلها مرادفات لنفس المعنى.

    5- لهذه اللغة MQL4 محرر برامج يسمى ميتا إيديتور ****Editor ومن خلاله نستطيع كتابة برامجنا وعمل نسخة تنفيذية لها ينفذها برنامج التداول.

    6- برنامج التداول ميتاتريدر ****Trader لا يتعرف على النص البرمجي مباشرة mq4 بل يتعرف فقط على النسخة التنفيذية ex4.

    7- هناك ثلاثة أنواع من البرامج التي يمكن كتابتها مع هذه اللغة: برنامج مؤشر - برنامج اكسبيرت - برنامج سكريبت.

    8- هناك أنواع إضافية مساعدة من أنواع الكود الذي يمكن كتابته أيضا مثل قوالب البرامج ومكتبات الأكواد الجاهزة.

    9- يحتوي برنامج الميتاإيديتور على نظام مساعدة قوي. فقط ضع الكورسر على أي كلمة في النص البرمجي واضغط F1 ليظهر لك مباشرة طريقة استخدام الوظيفة مع الشرح والبارامترات وأي وظائف أخرى مشابهة.


    شرح برنامج التداول من وجهة نظر لغة البرمجة MQL4:

    سأقوم هنا بشرح المفاهيم والمصطلحات التي سبق وأن تعرفت عليها في برنامج التداول والتي لها أهمية خاصة في لغة البرمجة MQL4 والتي سوف تراها كثيرا كوظائف أو متحولات في نص اللغة نفسها.

    بكلام آخر كل هذه المصطلحات ستراها في اللغة MQL4 لذلك ركز معها قليلا وحاول أن تنظر لها على أساس أنها مفاهيم برمجية.

    - رمز العملة Symbol وهو يمثل اسم العملة أو السلعة مثل GBPUSD أو EURUSD.

    - سعر الطلب Ask وهو يمثل السعر الذي تشتري به.

    - سعر العرض Bid وهو يمثل السعر الذي تبيع به.

    - أعلى سعر High وهو يمثل أعلى سعر وصل إليه في الشمعة المحددة.

    - أدنى سعر Low وهو يمثل أدنى سعر وصل إليه في الشمعة المحددة.

    - سعر الإفتتاح Open وهو يمثل سعر الافتتاح في الشمعة المحددة.

    - سعر الإغلاق Close وهو يمثل سعر الإغلاق في الشمعة المحددة.

    - حجم التداول Volume وهو يمثل حجم التداول الحاصل في الشمعة المحددة.

    - الزمن Time وهو يمثل وقت وتاريخ الشمعة الحالية.

    - الفترة Period وهو يمثل الفترة التي نعمل عليها هل هي يوم أو أربع ساعات وهكذا.

    - عدد الشموع Bars وهو يمثل عدد الشموع الموجودة على الشارت الحالي.

    - الخانات العشرية Digits وهو يمثل عدد الخانات العشرية لكل نوع من زوج العملات. فمثلا الباوند دولار له أربع خانات بعد الفاصلة بينما الذهب له خانتان فقط.

    - قيمة النقطة Point وهي تمثل قيمة النقطة العشرية. فهي مثلا في الباوند دولار تساوي 0.0001 وفي الذهب تساوي 0.01.

    - معلومات كاملة عن الصفقات المفتوحة تجدها أسفل البرنامج في صفحة Trades حيث نجد رقم الصفقة وتاريخ فتحها وسعر الفتح والهدف والستوب وغيرها من المعلومات الأخرى.
    كل هذه المعلومات نستطيع الوصول لها برمجيا من خلال وظائف خاصة بالصفقات.

    - في الصفحة المجاورة Account History سوف نجد كل المعلومات عن صفقاتنا المغلقة والمحذوفة وأيضا نستطيع الوصول لهذه المعلومات برمجيا بواسطة نفس الوظائف الخاصة بالصفقات.

    - كل المؤشرات القياسية والمؤشرات الخاصة والأدوات الرسومية الموجودة داخل برنامج الميتا تريدر نستطيع الوصول لها برمجيا واستخدامها داخل برامجنا.

    - كل المعلومات عن الحساب الحالي كرقمه واسمه واسم الشركة واسم السيرفر والربح أو الخسارة وغيرها من معلومات الحساب يمكن الوصول لهذه المعلومات برمجيا من خلال وظائف خاصة.


    وفيما يلي شرح نظري بحت عن لغة البرمجة MQL4

    وهو أيضا ينطبق على أي لغة برمجية أخرى.


    والغرض من هذا الشرح هو بناء أساس قوي لتعلم لغة البرمجة MQL4 وجعل أي معلومات مستقبلية مبنية على أساس متين من الفهم العميق لما تعنيه لغة البرمجة أصلا.


    - هذه اللغة مثل أي لغة برمجية أخرى كالفيجول بيسك أو الدلفي أو السي لها قواعد يجب أن تتعلمها وتمشي عليها.


    - لا يمكن بأي حال أن تخرج عن هذه القواعد قيد أنملة.


    - كل حرف أو فاصلة أو قوس له معنى وإن أي إخلال بهذه القواعد يعني عدم القدرة على تنفيذ البرنامج أصلا.


    - لغة البرمجة تستطيع أن تنظر لها على أنها لغة محكية مثل أي لغة موجودة عالميا كاللغة العربية أو الانجليزية.


    - فللغات المحكية قواعد للكتابة والقراءة وأسماء وجمل وحروف وهكذا. وهذه هي عناصر اللغة.


    - لن تستطيع البدء في كتابة برنامج قبل الإلمام التام بالعناصر الأساسية ونسبة كبيرة من العناصر الفرعية.


    - يعني يمكن البدء بالبرمجة بعد تمكنك من جميع العناصر الرئيسية للغة ومن ثم تثري خبرتك ومهاراتك بمزيد من الفهم للعناصر الإضافية المتنوعة.


    - وقد تصبح مبرمجا بارعا ولكنك مثلا لا تعرف طريقة إرسال بريد الكتروني أو كيفية نشر معلومات صفقاتك على النت مباشرة.


    - ولكن يجب عليك أن تعرف أن هناك هذه الإمكانية على الأقل في حال احتجت إليها.


    - نعود للغة البرمجة من جديد... كذلك فإن للغة البرمجة عناصر هي عبارة عن كلمات محجوزة وهيكلية معينة لكتابتها.


    - إن عناصر اللغة البرمجية تقريبا واحدة في كل لغات البرمجة ولكن تختلف كل لغة عن الأخرى بطريقة الكتابة وهيكلية اللغة.
    - كل اللغات البرمجية تتعامل مع الأرقام وحصرا مع الأرقام ولا تفهم إلا لغة الأرقام.


    - أي معلومة تتعامل معها اللغة البرمجية هي في النهاية رقم حتى ولو رأيتها أنت على أنها نص أو صورة أو رقم.


    - فمثلا لعرض نص معين على الشاشة نستخدم الأمر Print على الشكل التالي:
    - Print "Welcom World" فأنت هنا ترى نصا ولكنه في الحقيقة كله أرقام حيث أن الحرف W يمثله الرقم كذا والحرف e يمثله رقم آخر وهكذا.


    - وعند تنفيذ الأمر حقيقة يقوم الأمر Print بإعادة رقم الحرف W إلى حرف W على الشاشة وهلم جرا.


    - حتى الصور والأصوات يتم تحويلها إلى أرقام لتخزينها أو التعامل معها وعند عرضها أو عزفها بالنسبة للصوت يتم تحويل هذه الأرقام إلى صورة على الشاشة أو صوت يمرر إلى كرت الصوت.


    - لذلك يجب أن تفكر أنت أيضا بنفس طريقة لغة البرمجة بحيث ترى الأشياء أمامك على أنها أرقام.


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


    - لذلك سنتعلم في الدروس القادمة إن شاء الله أن نجعل طريقة تفكيرنا رقمية بحتة وأن نحول أي فكرة أو استراتيجية إلى مجرد أرقام لكي نستطيع أن نبرمج هذه الفكرة إلى مؤشر أو إلى اكسبيرت.



    - هذه المعلومات قد تبدو للوهلة الأولى بديهية لكنها على قدر كبير من الأهمية. ويجب التنبه لها جيدا.




    إن أي لغة برمجية تتكون من العناصر التالية:


    == الثوابت أو القيم الثابتة Constant: فكما قلنا سابقا بما أن اللغة البرمجية تتعامل مع الأرقام فقط ولأن العقل البشري لن يستطيع حفظ مدلولات كل الأرقام التي يحتاجها. فقد تطور مفهوم برمجي هام هو الثوابت.


    بمعنى بدل أن نستخدم الرقم 255 للدلالة على اللون الأحمر فإننا نكتب بدلا عن الرقم 255 الكلمة Red والتي هي عبارة عن متحول ثابت قيمته 255.


    وهكذا تم حل مشكلة التعامل مع مدلولات الأرقام بتحويل الأرقام إلى ثوابت ليتعامل معها المبرمج ثم يقوم البرنامج بتحويل هذه الثوابت إلى أرقام مرة أخرى عندما يتعامل هو معها.


    وسوف نجد الكثير من الثوابت في لغة البرمجة MQL4 والتي تسهل العملية البرمجية بشكل كبير.


    يمكننا طبعا إذا كانت ذاكرتنا قوية جدا أن نستخدم الأرقام مباشرة بدلا من استخدام الثوابت ولكن هذا الأمر شاق جدا عند كتابة الكود أو عند تعديله أيضا.


    == المتحولات Variables: وهي عبارة عن متحولات نستطيع تخزين قيم رقمية صحيحة دون فاصلة أو قيم رقمية بفاصلة أو قيم نصية أو قيم منطقية.


    والمتحولات هي عبارة أسماء نختارها نحن لحفظ المعلومات التي نريد فيها ويمكننا تغيير محتوياتها في أي لحظة نريد وذلك بعكس الثوابت التي لا يمكن تغيير محتواها.


    وهذه المتحولات ضرورية جدا لعمل البرنامج ولا يمكن أن يخلو أي برنامج منها.


    == المصفوفات Arrays: هي عبارة عن متحولات من نوع خاص مثل المصفوفات التي درسناها أيام الثانوي. بحيث تكون عبارة عن متحول له بعد واحد أو أكثر.


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


    مثال عن مصفوفات سوف نتعامل معها كثيرا في دروسنا القادمة هي مصفوفة سعر الإغلاق Close. حيث أن [Close[0 تعطينا سعر الإغلاق للشمعة الحالية.

    و [Close[1 تعطينا سعر الإغلاق للشمعة التي تسبقها وهكذا.
    وكذلك فإن لأسعار الفتح والأعلى والأدنى مصفوفات خاصة بها كما سنرى في الدروس القادمة بإذن الله.


    الشروط Conditions: تمكننا تعليمة الشروط من تنفيذ أمر برمجي أو كتلة من الأوامر البرمجية عند تحقق شرط أو شروط معينة.


    وعند عدم تحقق الشروط فإن الأوامر البرمجية الخاصة بهذه الشروط لن تنفذ. وهذه الخاصية الموجودة في كل اللغات هي ما تعطي لبرنامجنا نوع من الذكاء البشري.


    لأن معظم حياتنا تنطلق من تنفيذ شيء معين عند تحقق شروطه. فنحن نصلي العصر مثلا إذا أذن العصر أي أن الشرط قد تحقق. ولا نأكل حتى نجوع أي تحقق شرط الأكل ( نظريا ).
    فنحن دائما نتحقق من الشرط الخاص بالفعل لنقوم بهذا العمل في حال تحقق شرطه.


    وهكذا هي لغات البرمجة تبحث دائما عن تحقق شروط معينة لتنفيذ الأوامر المرتبطة بهذه الشروط. وإن قوة أي برنامج هي إحاطته الشاملة بكل الشروط والاحتمالات الممكنة والتي يعرف البرنامج عندها ماذا يفعل عند تحقق كل شرط منها.


    فمثلا من القصص الطريفة عن أحد البرامج المستخدمة في الحماية هو أن نظام حماية لأحد البنوك يديره برنامج وظيفته الاتصال بالطواريء عند تحقق أي شرط من شروط التسلل إلى هذا البنك بواسطة أجهزة حساسة.


    المهم هو أن أحد اللصوص قام بالتسلل إلى البنك وعندها شعر هذا البرنامج الذكي بذلك فقام بالاتصال بالطواريء. ولكن الخط كان مشغولا. ولأنه لم يعالج هذا الشرط أو هذا الاحتمال أن يجد الخط مشغولا فلم يعيد الاتصال مرة أخرى .


    وتصورا عندها انهيار كامل لهذا النظام الامني لأن البرنامج لم يعالج كل الاحتمالات الممكنة والتي سهلت على اللص مهمته.
    ( أنا أتوقع أن اللص هو المبرمج نفسه )


    == الحلقات Loops: تعتبر الحلقات من الأمور الضرورية في أي لغة برمجية ولا يمكن الاستغناء عنها أبدا. وهي عبارة عن طريقة نستطيع من خلالها تكرار عمل روتيني موحد عدد محدد من المرات.


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


    == الوظائف Functions: الوظائف هي عبارة عن كتل برمجية يتم تجميعها في وظيفة واحدة يمكننا عندها استدعاء وتنفيذ كل هذه الكتلة البرمجية بكتابة اسم الوظيفة فقط.


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


    لكل وظيفة بارامترات Parameters وهي عبارة عن قيم مدخلة إلى الوظيفة نفسها تستخدمها في كتلتها البرمجية ( سوف يتم شرح هذا الأمر بالتفصيل الممل )


    كل الوظائف تستطيع أن تعود بقيمة معينة يتم حسابها وفق المعلومات الداخلة إليها.


    == التعليقات Comments: أي لغة برمجة توفر للمبرمج القدرة على كتابة شرح أو تعليقات داخل الكود البرمجي نفسه وظيفة هذا الشرح هي سهولة التعديل فيما بعد للكود نفسه أو شرح الكود لغير المبرمج وذلك لتوضيح فكرة ما أو شرح طريقة استخدام البرنامج مثلا.


    == المترجم Compiler: قد يكون من المفاجيء لك أن البرنامج أو الكمبيوتر لن يفهم على كودك البرمجي مباشرة ولذلك فإن لكل لغة مترجم خاص بها يقوم بتحويل الكود البرمجي الذي أنت تكتبه إلى لغة أخرى عبارة عن أرقام يفهمها هو فقط.


    وكما قلنا سابقا فإن الكمبيوتر لا يفهم النص البرمجي الذي تكتبه أنت لذلك يقوم بترجمته أولا إلى لغته الرقمية الخاصة لكي يستطيع التعامل مع برنامجك وينفذه.


    == بيئة التطوير Devolopment Enviroment: لكل لغة برمجية برنامج تطوير خاص به تستطيع من خلاله كتابة برنامج جديد بامكانيات مختلفة كالنسخ واللصق والحذف والبحث والاستبدال وغيرها من الخدمات الأخرى.


    كما أنه يعرض لك كودك البرمجي بالألوان التي تميز الأوامر من الوظائف من المتحولات من الثوابت من التعليقات وهكذا.

    وهو أيضا يساعدنا كثيرا على كتابة الكود وعرض شرح مباشر لكل أوامر اللغة ومن ثم تصحيح البرنامج وتنقيحه ومن ثم حفظه وترجمته وتشغيله.


    في حالتنا فإن برنامج الميتا إيديتور هو بيئة التطوير للغلتنا MQL4.


    == نظام العمل System: نظام العمل هو عبارة عن النظام المستهدف من برنامجنا فنحن نكتب برنامج بلغة السي أو الفيجول بيسك ليعمل تحت النظام ويندوز.


    وفي حالتنا نحن فإننا نكتب برنامجنا الذي هو عبارة عن مؤشر أو اكسبيرت ليعمل على برنامج التداول ميتاتريدر.


    ولن يعمل أي برنامج إلا تحت بيئته المصمم لها.


    فبرنامج الفيجول بيسك أو السي لن يعمل تحت نظام الميتاتريدر وبرنامجنا المؤشر أو الاكسبيرت لن يعمل تحت نظام الويندوز.



    لا تخف من الكلام السابق لأنه سيصبح من البديهيات بالنسبة إليك فيما بعد إن شاء الله.




    وكل ما أريده منك أن تستعد للدروس القادمة ذات الوزن الثقيل.

    لذلك عليك الآن أن تقرأ هذا الدرس بعناية وتركيز ولا تعتبره قصة ما قبل النوم . وتحاول أن تسأل عن أي شي لم تفهمه أو تفهم المقصود منه.


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


    والآن أترك لأسئلتكم واستفساراتكم إثراء الموضوع أكثر وأكثر.

    وأعود وأكرر أن الكلام السابق مع أنك قد تجده في بعض الأحيان بديهيا إلا أنه هو الأساس الهام لبدء إنطلاقتنا مع تعلم لغة البرمجة الفوركسية MQL4.
    بسم الله الرحمن الرحيم

    في هذا الدرس سنتطرق إلى الخطوات الواجب اتباعها قبل أن نبدأ عمليا في برمجة المؤشر ( وليس الاكسبيرت فهو له موضوع آخر في درس آخر ).

    ثم نبدأ في كتابة مؤشر بسيط يكون أول مؤشر لنا في هذه الدورة المباركة إن شاء الله.

    وهذه الخطوات النظرية هي كالتالي:

    - أن تكون الفكرة النظرية للمؤشر والهدف منه واضحة تماما لنا وكذلك طريقة حسابه رياضيا.

    - أن نحدد هل سيتم رسم المؤشر في نافذة الشارت نفسه أم في نافذة منفصلة عنه.

    - يتم معرفة هذا الأمر من خلال فكرة المؤشر نفسه بحيث إذا كانت خطوط المؤشر ستكون قيمها قريبة من الأسعار على الشارت فهذا يعني أنه لا بد من رسم المؤشر على نافذة الشارت الأساسية.

    وذلك مثل مؤشر الموفينج أفريج حيث يتم رسمه على النافذة الأصلية للشارت ويدور حول السعر.

    أما إذا كان المؤشر يرسم لنا قيما مختلفة تماما عن السعر ولا يمكن وضعه على النافذة الأساسية لأنه لن يظهر أساسا لو فعلنا ذلك. فعندها يجب أن نرسمه على نافذة منفصلة فرعية.

    وذلك مثل معظم المؤشرات التذبذبية التي تأخذ قيما من 0 - 100 أو من -1 - +1 وهكذا.

    - إذن من خلال معرفتنا للقيم الناتجة عن مؤشرنا الجديد يجب أن نقرر هل سيكون في نافذة الشارت نفسه ( رقمها البرمجي صفر ) أو في نافذة منفصلة عن الشارت ( تأخذ رقم برمجي يبدأ من الواحد لأول نافذة منفصلة ثم اثنين وهكذا ).

    - يجب تحديد شكل المؤشر الذي نريده على الشارت هل هو خط متصل ( مثل مؤشر الموفينج أفريج ) أو خطوط عمودية ( مثل الماكد ويسمى تسمى هيستوغرام ) أو خطوط مقطعة مثل مؤشر الزيج زاك ).

    يتم تحديد الطريقة المناسبة لإظهار خطوط المؤشر بناء على رؤية المبرمج نفسها لمؤشره بحيث يعرض المؤشر بأسهل طريقة بالنسبة لمستخدمي مؤشره.

    - يجب تحديد الألوان المناسبة لخطوط المؤشر بحيث يراعي المبرمج فيها الوضوح والتباين الجيد لها وقدرة الألوان على الظهور بوضوح على الخلفية السوداء أو البيضاء للشارت.

    - هناك أمور شكلية أخرى مثل سماكة الخطوط وهل هي متصلة أم منقطة وهكذا.

    - يجب أيضا أن يسمح المبرمج لمستخدمي مؤشره أن يتحكموا في هذه الأمور الشكلية من خلال خصائص المؤشر نفسها.

    - يجب تحديد خصائص المؤشر الرئيسية التي يستطيع المستخدم تغييرها بناء على طريقته في استخدام المؤشر.
    وغالبا تكون خاصية الفترة من أهم هذه الخصائص.

    - أي يجب أن يكون المؤشر مرنا جدا في التعامل وذلك بأن يحاول المبرمج إخراج القيم الداخلية للمؤشر لتصبح خصائص يستطيع المستخدم التحكم فيها بنفسه.

    - يجب أيضا أن تكون هذه الخصائص واضحة للمستخدم أي يجب على المبرمج اختيار اسم واضح للخاصية يكون مفهوما منه عمل وتأثير هذه الخاصية على عمل المؤشر.

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

    - يجب أن تكون المعادلات الرياضية أو طريقة حساب قيم المؤشر واضحة للمبرمج.

    أمور أخرى يجب على المبرمج أن يحددها لمؤشره وهي:

    - اسم المؤشر التجاري ويفضل أن يكون له مدلولا واضحا وإذا أراد أن يربطه باسمه فلا بأس كما أفعل أنا مع مؤشراتي مثل Waddah Attar Explosion.

    - نص الحقوق المحفوظة وموقع أو إيميل المبرمج وهذا يسهل على المستخدمين أن يصلوا للمبرمج في حال انتشر هذا المؤشر على الشبكة العنكبوتية.

    - أي معلومات إضافية يريد المبرمج أن تظهر على الشارت كنصوص مساعدة أو خطوط أو غير ذلك من العناصر الإيضاحية.

    - أمور أخرى مثل تاريخ الصلاحية لمؤشره وهل يريده أن يعمل على حساب حقيقي فقط أو ديمو فقط أو الاثنان معا وهكذا.
    والآن سنتكلم عن الخطوات الفعلية لعمل مؤشر ومن ثم تشغيله على الشارت فعليا.

    وبذلك أنت ستكون قد وضعت رجلك على أولى خطوات أن تصبح مبرمجا إن شاء الله

    الخطوات الفعلية لعمل مؤشر حقيقي:

    1- توضيح الفكرة من هذا المؤشر الجديد والهدف منه:

    فكرة المؤشر هي عبارة عن رسم خطين عمودين لكل شمعة.
    الخط الأول باللون الأحمر يمثل طول الشمعة بالنقاط أي الفرق بين الهاي واللو لكل شمعة.

    الخط الثاني باللون الأخضر يمثل طول جسم الشمعة وأيضا بالنقاط أي الفرق بين الإغلاق والفتح.

    الهدف من هذا المؤشر معرفة مقدار التزايد في أطوال وأجسام الشموع الموجودة على الشارت.

    2- مؤشرنا سنقوم برسمه على نافذة منفصلة لأنه لا يمكن عمليا أن يرسم على الشارت نفسه لاختلاف النسب بين قيم المؤشر وبين قيم الأسعار.

    3- لا يوجد لهذا المؤشر أي خصائص خارجية حاليا.

    4- تم تحديد الألوان وطريقة إظهار الخطوط على النافذة المنفصلة.

    5- نص الحقوق المحفوظة سيكون "Copyright 2007 Waddah Attar".

    6- نص الرابط لموقع أو ايميل سيكون waddahattar@hotmail.com.

    7- اسم المؤشر سيكون Candle Length.

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

    والآن لنبدأ في الخطوات المباشرة لكتابة النص البرمجي للمؤشر:

    1- شغل برنامج التداول ميتا تريدر.

    2- اضغط F4 أو انقر الأيقونة الصفراء أعلى وسط برنامج التداول.

    3- سوف يظهر برنامج الميتا إيديتور. اضغط Ctrl+N لإنشاء برنامج جديد.

    4- سوف يظهر نافذة نحدد من خلالها نوع البرنامج الذي نريد إنشائه وهو عبارة عن مؤشر ولذلك نختار Custom Indicator. ثم نضغط زر التالي.

    5- سوف يظهر نافذة أخرى نكتب فيها اسم المؤشر Candle Length في حقل Name.

    6- نكتب أيضا معلومات الحقوق المحفوظة في حقل Author.

    7- نكتب اسم الموقع أو الإيميل في الحقل Link.

    8- الاسم ضروري كتابته أما الحقوق المحفوظة والرابط فهما اختياريان ولكن يفضل ليكون العمل احترافيا أن نكتبهما.

    9- نضغط زر التالي لتظهر نافذة أخرى جديدة.

    10- ما يهمنا فيها أن نختار أن المؤشر الجديد سيظهر في نافذة منفصلة لذلك نضع علامة اختيار على الخيار Indicator in separate window.

    11- نضغط إنهاء وعندها ستظهر نافذة المؤشر مع قليل من الكود البرمجي وتبقى علينا مهمة إكماله بالفكرة التي نريد من مؤشرنا أن يقوم بها.


    شرح أولي للكود الذي ظهر لنا:

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

    - أول سطرين نراهما باللون الأزرق هما الأمرين الذين وضعنا فيهما نص الحقوق المحفوظة ونص الرابط وهما على الشكل التالي:
    كود PHP:
    #property copyright "Copyright 2007 "
    #property link "waddahattar@hotmail.com" 
    بعد ذلك يأتينا سطر هام آخر نحدد من خلاله أن المؤشر سيظهر في نافذة منفصلة. وهو على الشكل التالي:
    كود PHP:
    #property indicator_separate_window 
    نستطيع بسهولة تغيير هذه الخاصية باستبدال السطر السابق بالسطر التالي:
    كود PHP:
    #property indicator_chart_window 
    بعد ذلك نجد الكود التالي ( بعد حذف التعليقات منه ):
    كود PHP:
    #property copyright "Copyright © 2007"
    #property link      "waddahattar@hotmail.com"
    #property indicator_chart_window
    int init()
      {
       return(
    0);
      }
    int deinit()
      {
       return(
    0);
      }
    int start()
      {
       
    int    counted_bars=IndicatorCounted();
       return(
    0);
      } 
    الكود السابق هو عبارة عن ثلاثة وظائف خاصة بلغة MQL4.

    الوظيفة init نضع فيها كل الأوامر البرمجية التي نريد تنفيذها مرة واحدة عند بدء تشغيل البرنامج ( المؤشر ).

    الوظيفة start نضع فيها كل الأوامر البرمجية التي نريد تنفيذها مع كل تغير في السعر.

    الوظيفة deinit نضع فيها كل الأوامر البرمجية التي نريد تنفيذها مرة واحدة عند إزالة المؤشر من على الشارت.

    شرح أكثر للوظيفة Function وطريقة كتابتها بشكل عام:

    كما قلنا في الدرس الأول أن الوظيفة عبارة عن كتلة من الأوامر البرمجية تنفذ بكتابة اسم الوظيفة.

    وهذه الوظيفة تعود لنا بقيمة نختارها عن طريق الأمر return وغالبا يكون موجودا آخر الوظيفة.

    لكل وظيفة اسم يجب أن يكون ملائما لشروط التسمية في لغة MQL4 وهي:

    - أن يبدأ اسم الوظيفة بحرف وليس رقم.
    - أن لا يزيد عن أربعين حرف.
    - أن لا يحتوي على رموز ممنوعة مثل + - \ / * % ^ # % @ ! الخ.
    - أن لا يكون أحد الأسماء المحجوزة للغة MQL4 نفسها مثل print و int وغيرها من الكلمات المحجوزة التي لا يمكننا تسمية وظائفنا بها.

    كما يجب أن نحدد للوظيفة نوع القيمة التي ستعود بها هل هي رقمية أو نصية أو غيرها من أنواع البيانات المعروفة.

    تكون الصيغة النصية لكتابة وظيفة ما على الشكل التالي:

    نكتب أولا نوع القيمة العائدة مثل int أو double حيث int تعني أن القيمة العائدة رقم صحيح مثل 859 و double تعني أن القيمة المعادة رقم بفاصلة عائمة مثل 1.2358.

    بعد ذلك نكتب اسم الوظيفة وفق شروط التسمية التي شرحناها أعلاه.

    بعد ذلك نكتب قوسين هلاليين يغلق الثاني الأول على الشكل ().
    بعد ذلك نفتح قوسين استهلاليين {} نكتب داخلهما الكود الذي نريد.

    وتكون صيغة الوظيفة النهائية على الشكل التالي:
    كود PHP:
    int FunctionName()
    {
    return(
    0);

    كما يمكن أن نكتبها كلها على سطر واحد كالتالي:
    كود PHP:
    int FunctionName() { return(0); } 
    وتوزيع الوظيفة على أكثر من سطر هو لسهولة القراءة فقط من قبل المبرمج أو من سيطلع على الكود بشكل عام.
    فَقُلْتُ اسْتَغْفِرُوا رَبَّكُمْ إِنَّهُ كَانَ غَفَّارًا (10) يُرْسِلِ السَّمَاءَ عَلَيْكُمْ مِدْرَارًا (11) وَيُمْدِدْكُمْ بِأَمْوَالٍ وَبَنِينَ وَيَجْعَلْ لَكُمْ جَنَّاتٍ وَيَجْعَلْ لَكُمْ أَنْهَارًا (12) مَا لَكُمْ لَا تَرْجُونَ لِلَّهِ وَقَارًا (13)

  3. #3
    تاريخ التسجيل
    Nov 2011
    المشاركات
    1,560

    افتراضي

    بسم الله الرحمن الرحيم

    في هذا الدرس سنتطرق إلى أنواع المعلومات التي يمكن للغة MQL4 أن تتعامل معها.

    هذه الأنواع هي:

    أولا: المعلومات أو البيانات الرقمية:

    والتي بدورها تنقسم إلى قسمين:

    -- أرقام صحيحة integer ليس فيها فاصلة عشرية مثل 245 و 900 و -98 و الصفر.

    يتم تعريف هذا النوع من المعلومات ( والتي تكون إما متحولا Variable أو وظيفة Function ) عبر الأمر int وهو طبعا اختصار لـ integer.

    حدود هذه الأرقام الصحيحة هي من -2147483648 إلى 2147483647 .

    أي رقم أكبر من المجال المسموح لن يخزن بشكل صحيح ولن تعرف النتيجة الحاصلة.

    أمثلة عن تعريف متحولات أو وظائف يكون نوع البيانات فيها من النوع الصحيح:
    كود PHP:
    int a;
    int b=5;
    int a,b=5;
    int a,b;
    int GetTop(int a,intb)
    {
    return(
    99);

    لاحظوا أننا عرفنا عدة متحولات صحيحة بعدة أشكال.

    يمكن تعريف عدة متحولات مع إعطائهم قيمة أولية.

    يمكن تعريف أكثر من متحول لنفس الأمر مع الفصل بينهما بالفاصلة العادية.

    أو يمكن تعريف كل متحول لوحده.

    إن تعامل الكمبيوتر مع الأرقام الصحيحة أسرع من تعامله مع الأرقام ذات الفاصلة العشرية.

    كما أنه يستهلك موارد ذاكرية أقل.

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

    مثلا عدد الشموع هو عدد صحيح دائما وأيضا عدد الصفقات المفتوحة مثلا.

    بينما الأسعار هي أرقام ذات فاصلة ولا يمكن تخزينها في متحولات صحيحة.

    لذلك يجب الانتباه جيدا عند التعامل مع المتحولات وإن عدم إدارة هذا الموضوع بشكل جيد قد يعرض برنامج للإخفاقات أو لا يعمل من أصله.

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

    والمصيبة أن اللغة لا تعطيك دائما رسائل خطأ تعلم من خلالها أن هناك مشكلة مع المتحولات.

    لنفرض أنك عرفت متحولا صحيحا ووضعت فيه القيمة 0.5
    عند محاولتك استخدام أو طباعة هذا المتحول ستجد أن القيمة المخزنة فيه هي صفر وليس 0.5 كما فعلت أنت.

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


    -- أرقام مضاعفة double والتي تستخدم لتخزين أرقام صحيحة أو التي تحتوي على فاصلة عشرية مثل ( 0.2589 - 1.2589 - 582 - 0 - (-98.25)).

    تستخدم غالبا المتحولات العشرية لتخزين الأسعار أو النسب المئوية وهكذا.

    مجال هذا النوع هو من -1.7 × e قوة -308 إلى 1.7 × e قوة 308 .

    e هي النسبة الرياضية المعروفة ( يمكن 2.8 ). وهذا يعني مجال واسع جدا جدا.


    ثانيا: المعلومات النصية:

    والتي تعرف من خلال الأمر string وهي تعني ان المتحول سنخزن فيه أحرفا أو أرقاما.

    والأرقام التي نخزنها في المتحول النصي لا يتعام معها الكمبيوتر على أنها أرقام بل يتعامل معها على أساس أنها أحرف.

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


    أمثلة:
    كود PHP:
    string MyName;
    string MyName,MyAddress;
    string MyName="Ahmad";
     
    string GetName(string address)
    {
    return(
    "Ahmad");

    يجب وضع القيم النصية داخل علامتي التنصيص المزدوجة " .

    ثالثا: المعلومات المنطقية Boolean:

    والتي تعرف من خلال الأمر bool . وهذه المتحولات تخزن فقط قيمتين هما صح true أو خطأ false.

    يستفاد من هذه المتحولات المنطقية للإشارة إلى نعم أو لا لأي احتمال ممكن.

    فأي احتمال مثل هل تريد أن يعمل التنبيه مثلا هو نعم أو لا .
    أو هل السعر قريب من المتوسط له بمقدار 10 نقاط هو نعم أو لا .

    ولا يوجد إجابة أخرى يعني إما أبيض وإما أسود.

    أمثلة:
    كود PHP:
    bool a=true,b=false;
    bool a;
     
    bool GetStatus()
    {
    return(
    true);


    رابعا: المعلومات أو البيانات الزمنية datetime:

    يتم تعريف المتحولات الزمنية بالأمر datetime ويمكنه تخزين تاريخ فقط أو تاريخ وزمن أو زمن فقط في هذا المتحول.
    المجال المتاح تخزينه في المتحولات الزمنية هو من Jan 1, 1970 إلى Dec 31, 2037.

    يعني في العام 2037 سوف تتوقف كل المؤشرات والاكسبيرتات.

    طبعا هذا المجال على مستوى الثواني.

    يتم إضافة الحرف D قبل القيمة الزمنيةالتي نريد وضعها في المتحول.

    أمثلة:
    كود PHP:
    datetime expiredate=D'2007.05.01 06:55:23';
    datetime dd=D'06:30'
    التنسيق الزمني هو: العام(.)الشهر(.)اليوم (مسافة) الساعة(الدقيقة(الثانية

    إذا لم تكتب التاريخ فسوف يكون التاريخ الافتراضي هو تاريخ عمل النسخة التنفيذية للمؤشر أو تاريخ التنفيذ.
    فَقُلْتُ اسْتَغْفِرُوا رَبَّكُمْ إِنَّهُ كَانَ غَفَّارًا (10) يُرْسِلِ السَّمَاءَ عَلَيْكُمْ مِدْرَارًا (11) وَيُمْدِدْكُمْ بِأَمْوَالٍ وَبَنِينَ وَيَجْعَلْ لَكُمْ جَنَّاتٍ وَيَجْعَلْ لَكُمْ أَنْهَارًا (12) مَا لَكُمْ لَا تَرْجُونَ لِلَّهِ وَقَارًا (13)

  4. #4
    تاريخ التسجيل
    Nov 2011
    المشاركات
    1,560

    افتراضي

    بعد أن تعرفنا على أنواع المتحولات والوظائف هناك موضوع غاية في الأهمية ألا وهو مجالات المتحولات Variable Scope .

    ما هو المعنى الفني لمصطلح مجالات المتحولات ؟

    ببساطة يمكن القول أن المجال يعني منطقة عمل هذه المتحولات.

    ولتبسيط هذا المفهوم نقول:

    افترض أن الكتلة البرمجية للبرنامج كلها هي مجال عمل للبرنامج كله.

    وافترض أن الكتلة البرمجية لأي وظيفة هي مجال فرعي من المجال الكلي للبرنامج.

    وكل كتلة برمجية وظيفية هي مجال فرعي من مجال البرنامج الكلي.

    ولاحظ أنه لا يوجد تداخل بين المجالات الفرعية للكتل الوظيفية. وكل هذه المجالات الفرعية هي حتما ضمن المجال الأكبر وهو مجال البرنامج.

    الآن لتخيل الموضوع أكثر افترض أن لدينا دائرة كبيرة هي دائرة البرنامج.

    وفي داخلها دوائر أصغر منها وموجودة كلها بداخل الكرة الكبيرة ولكن دون تقاطع فيما بين الدوائر الصغيرة.

    هذه الدوائر الصغيرة هي الوظائف الموجودة ضمن برنامجنا.

    والآن نعود لمفهوم مجالات المتحولات ونقول:

    إذا عرفنا المتحول ضمن دائرة مجال البرنامج كله فهذا يعني أننا نستطيع التعامل مع هذا المتحول من كل برنامجنا بما فيه المجالات الفرعية الأصغر للكتل الوظيفية.

    ويقصد بالتعامل مع المتحول قراءة قيمته وتغييرها.

    أما إذا عرفنا المتحول ضمن دائرة مجال الوظيفة الفرعية فإننا نستطيع التعامل معه فقط من داخل هذا المجال. وهذ المتحول لن يكون معرفا ولن نستطيع التعامل معه من خارج هذه الدائرة.

    الآن إذا أردنا لمتحول أن يكون عاما Global لكل برنامجنا فيجب تعريفه Declare في بداية برنامجنا وخارج أي كتلة وظيفية وفعليا يتم كتابته قبل الوظيفة init.

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

    وفي هذه الحالة لن يكون له قيمة أو يمكن التعامل معه من خارج هذه الوظيفة.

    إذا عرفنا متحول باسم a في المنطقة العامة للبرنامج فنحن لن نستطيع تعريفه بنفس الاسم داخل أي من وظائفنا الأخرى.

    أما إذا عرفنا المتحول a في الوظيفة F1 مثلا فنحن نستطيع أيضا أن نعرف متحول آخر بنفس الاسم a في الوظيفة F2 بدون مشاكل.

    ويكون المتحول الأول مختلفا عن الآخر.

    بمجرد خروج التنفيذ من الكتلة البرمجية للوظيفة فإن أي متحول معرف داخلها لن يكون له أي قيمة وغير معرف خارجها.

    ولن يعود له قيمة إلا إذا عدنا مرة أخرى لتنفيذ الوظيفة مرة أخرى.

    وهنا يجب التفريق بين حالتين:

    إذا أردنا أن نحافظ على قيمة المتحول داخل الوظيفة حتى ولو خرج التنفيذ وعاد لها مرة أخرى فإننا نستخدم التعبير static عند تعريف المتحولات.

    أما إذا كنا لا نريد الاحتفاظ بقيمة المتحول عند الخروج ولا يهمنا المحافظة عليها فإننا نعرفه داخل الوظيفة بالطريقة المعتادة.

    أمثلة توضح المقصود من مجالات المتحولات:

    المثال الأول:
    كود PHP:
    #property indicator_chart_window
    // المتحولات التي تعرف هنا عامة في جميع البرنامج
    int gNum=5;
    double gPrice=1.2587;
    int init()
    {
    // المتحولات التي تعرف من داخل الوظيفة تكون خاصة بها فقط
      
    string Name="Waddah Attar";
      
      Print(
    Name,gNum);
      return(
    0);
    }
    int deinit()
    {
      
    datetime ExpirDate=D'2007.05.01';
      Print(
    ExpireDate,gPrice);
      return(
    0);
    }
    int start()
    {
    // لا يمكن تعريف متحول هنا بنفس اسم متحول عام لذلك السطر التالي خطأ
      
    int gNum;
    // يمكن تعريف متحول هنا بنفس اسم متحول معرف داخل وظيفة أخرى مثل 
      
    string Name="Mohammed";
     
      
    int A,B;
     
      return(
    0);

    في المثال السابق عرفنا متحولين عامين هما gNum gPrice

    هذين المتحولين نستطيع التعامل معهما من أي جزء من برنامجنا ومن داخل أي وظيفة.

    عرفنا متحولات خاصة بالوظيفة init وهذه المتحولات لا يمكن التعامل معها إلا من داخل الوظيفة init نفسها.

    وأي محاولة للتعامل معها من خارج هذه الوظيفة سوف يقابل برسالة خطأ قاتلة Fatal Error.

    يمكن تعريف متحول في وظيفة بنفس الاسم المعرف بها في وظيفة أخرى.

    بهذا المثال نكون قد وضحنا تماما كيفية تعريف المتحولات داخل البرنامج.



    بقيت نقطة هامة أخرى وهي المتحولات الستاتيكية static variable

    انظروا لهذا المثال أولا:
    كود PHP:
    int start()
    {
      
    int a=5;
     
      Print(
    a);
      
    a=a+1;
     
      return(
    0);

    المثال السابق يعرف متحولا باسم a ويعطيه قيمة افتراضية هي 5 .
    ثم يقوم بطباعته وبعد ذلك يزيد لقيمته واحد .

    الآن بمجرد خروج التنفيذ من الوظيفة start ثم العودة لها مرة أخرى فإن قيمة a ستعود لتصبح 5 من جديد.

    ولكن لأننا في بعض الحالات نحتاج أن نحافظ على قيمة المتحول المعرف داخل الوظيفة بقيمته حتى ولو خرجنا من الوظيفة فإننا نعرفه على أساس أنه ستاتيك أي نطلب من البرنامج حفظ قيمته عند الخروج من الوظيفة.

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

    ولكي يصبح مثالنا السابق صحيحا فإن المثال يصبح على الشكل التالي:
    كود PHP:
    int start()
    {
      static 
    int a=5;
     
      Print(
    a);
      
    a=a+1;
     
      return(
    0);

    الآن أول مرة تنفذ فيها الوظيفة start فإن قيمة المتحول a ستكون 5 .

    ثم تصبح 6 بعد زيادة الواحد إليها.

    ثم ينتهي تنفيذ الوظيفة ويخرج التنفيذ منها.

    عند العودة مرة أخرى إلى تنفيذ الوظيفة start فإن القيمة الأخيرة 6 ستكون في المتحول a ولن يأخذ القيمة الافتراضية 5 .

    ثم يزداد واحد ليصبح 7 وهكذا مع كل تنفيذ.

    هذه هي فائدة المتحولات الستاتيكية في أنها تحافظ على قيمها عند خروج التنفيذ من الوظيفة التي عرفوا بها.

    هذه المفاهيم البرمجية ضرورية جدا للبرمجة فيما بعد وتعطيك آفاقا وأدواتا تساعدك على البرمجة الاحترافية وتحويل أفكارك إلى برامج دون صعوبات تذكر.

    أيضا يجب التنويه إلى أن المتحولات العامة تستهلك ذاكرة وموارد أكثر من المتحولات الستاتيكية

    بينما المتحولات المحلية Local Variable تستهلك أقل الموارد.
    فَقُلْتُ اسْتَغْفِرُوا رَبَّكُمْ إِنَّهُ كَانَ غَفَّارًا (10) يُرْسِلِ السَّمَاءَ عَلَيْكُمْ مِدْرَارًا (11) وَيُمْدِدْكُمْ بِأَمْوَالٍ وَبَنِينَ وَيَجْعَلْ لَكُمْ جَنَّاتٍ وَيَجْعَلْ لَكُمْ أَنْهَارًا (12) مَا لَكُمْ لَا تَرْجُونَ لِلَّهِ وَقَارًا (13)

  5. #5
    تاريخ التسجيل
    Nov 2011
    المشاركات
    1,560

    افتراضي

    بسم الله الرحمن الرحيم


    سنبدأ مع هذا الدرس البدء في بناء مؤشرنا الذي تحدثنا عنه في الدروس السابقة:

    الخطوات الفعلية لبناء مؤشر بشكل عام:

    - تجهيز خصائص المؤشر من حيث عدد الخطوط المطلوب رسمها ولونه.

    - تجهيز المصفوفات التي سنضع فيها القيم الرقمية لقيمة كل خط من المؤشر ولكل شمعة.

    لأنه يمكن أن يكون المؤشر عبارة عن خط أو أكثر.

    وكل مؤشر يستطيع إظهار حتى ثمانية خطوط في نفس الوقت.

    والخط يقصد به طبعا الشيء الذي نريد رسمه على الشارت ولكل شمعة.

    فمثلا مؤشر المتوسط المتحرك عبارة عن خط واحد بينما مؤشر البولينغر عبارة عن ثلاثة خطوط.

    كل خط من خطوط المؤشر يجب أن يرتبط بمصفوفة نقوم نحن بإنشائها داخل برنامجنا.

    - ربط مصفوفة كل خط مع الذاكرة الرسومية الوسيطة Buffer. وهي التي تحول مصفوفتنا وتربطها بمعالج داخلي للغة MQL4 والذي يقوم برسم قيم المصفوفة على الشارت نفسه.

    وأي تغيير في قيم هذه المصفوفة سينعكس مباشرة على الشارت.

    - إعطاء هذه الذاكرة الرسومية الوسيطة الخصائص الرسومية المناسبة لطريقة رسم الخط.

    هذه الخصائص الرسومية هي شكل الخط ولونه وطريقة رسمه.

    - آخر خطوة هي ملء المصفوفة بالقيم المناسبة في كل مرة يتغير فيها السعر.



    والآن سنبدأ في كتابة الكود البرمجي للمؤشر:

    تذكير فقط بمهمة مؤشرنا:

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

    الخطوة الأولى:

    لنعد إلى الكود الفارغ الذي أنشئناه في الدرس الثاني وهو كالتالي:
    كود PHP:
    //+------------------------------------------------------------------+
    //|                                                Candle Length.mq4 |
    //|                               Copyright © 2006, eng waddah attar |
    //| 
    كود PHP:
    http://www.****quotes.net |
    //+------------------------------------------------------------------+
    #property copyright "Copyright © 2006, eng waddah attar"
    #property link      "http://www.****quotes.net"
    #property indicator_separate_window
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function                         |
    //+------------------------------------------------------------------+
    int init()
      {
    //---- indicators
    //----
       
    return(0);
      }
    //+------------------------------------------------------------------+
    //| Custom indicator deinitialization function                       |
    //+------------------------------------------------------------------+
    int deinit()
      {
    //----
       
    //----
       
    return(0);
      }
    //+------------------------------------------------------------------+
    //| Custom indicator iteration function                              |
    //+------------------------------------------------------------------+
    int start()
      {
       
    int    counted_bars=IndicatorCounted(); 
    - يجب تحديد خصائص ابتدائية للمؤشر من حيث عدد الخطوط الواجب عرضها على الشارت وهي عندنا هنا 2 .

    ويتم ذلك بواسطة الأمر property والذي مهمته تحديد خصائص المؤشر.

    والأمر الكامل هو:
    كود PHP:
    #property indicator_buffers 2 
    بواسطة الأمر السابق حددنا للمترجم ( Compiler ) أن عدد الخطوط هو اثنان.

    وأي أمر في البرنامج تجد أوله هو # فهذا يعني أن هذا الأمر هو موجه للمترجم مباشرة.

    - نحدد الآن لون كل خط وذلك بواسطة الأمر property نفسه ولكن مع تغيير اسم الخاصية طبعا.

    والأمر الكامل هو:
    كود PHP:
    #property indicator_color1 Green
    #property indicator_color2 Red 

    لاحظوا أن أوامر المترجم لا تنتهي بالقاصلة المنقوطة.

    من الخطوات السابقة نتعلم أن أمر المعالج property هو لإعلام المترجم بالخصائص البرمجية المطلوبة لمؤشرنا ( وهي غير الخصائص للمؤشر نفسه والتي يستطيع المستخدم تغييرها ).

    لمعرفة الألوان المتاحة في المؤشر ضع الكورسر على الكلمة Green ثم اضغط F1 سيظهر لك جدول الألوان مع تسمياتها.

    - نبدأ الآن في كتابة أسطر تعريف المصفوفتين الضروريتين لعمل مؤشرنا.

    سنحجز مصفوفتين من النوع double أي أرقام بفاصلة عشرية لتخزين قيم طول كل شمعة.

    سنسمي الأولى BufLength1 والثانية BufLength2

    التسميات طبعا اختيارية ولكن يفضل أن تكون مفهومة ومعبرة عن الهدف منها.

    ويجب حجز هذه المصفوفات في مجال البرنامج كله ولذلك سنكتب أوامر التعريف قبل الوظيفة init

    ويصبح الكود النهائي على الشكل التالي:
    كود PHP:
    //+------------------------------------------------------------------+
    //|                                                Candle Length.mq4 |
    //|                               Copyright © 2006, eng waddah attar |
    //| 
    كود PHP:
    http://www.****quotes.net |
    //+------------------------------------------------------------------+
    #property copyright "Copyright © 2006, eng waddah attar"
    #property link      "http://www.****quotes.net"
    #property indicator_separate_window
    #property indicator_buffers 2
    #property indicator_color1 Green
    #property indicator_color2 Red
    double BufLength1[];
    double BufLength2[];
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function                         |
    //+------------------------------------------------------------------+
    int init()
      {
    //---- indicators
    //----
       
    return(0);
      }
    //+------------------------------------------------------------------+
    //| Custom indicator deinitialization function                       |
    //+------------------------------------------------------------------+
    int deinit()
      {
    //----
       
    //----
       
    return(0);
      }
    //+------------------------------------------------------------------+ 
    سنعمل الآن على ربط المصفوفات بالذاكرة الرسومية الوسيطة من خلال الوظيفة SetIndexBuffer

    هذه الوظيفة تقوم بربط الذاكرة الوسيطة ( وهي لها أرقام من 0 إلى 7 ) بالمصفوفة المطلوبة ويكون تنفيذ الأمر بالنسبة لمؤشرنا على الشكل التالي:
    كود PHP:
    SetIndexBuffer(0,BufLength1);
    SetIndexBuffer(1,BufLength2); 
    لهذه الوظيفة مدخلين فقط الأول هو رقم الذاكرة الوسيطة ( 0 - 7 ).

    والمدخل الثاني هو اسم المصفوفة المعرفة مسبقا ( دون الأقواس المربعة [ ] ).

    بهذه الخطوة نكون قد ربطنا مصفوفاتنا بالذاكرة الرسومية الوسيطة.

    والآن أي قيم رقمية سنضعها داخل هذه المصفوفة سينعكس مباشرة على الشارت.


    الآن يجب تحديد بعض الخصائص الرسومية لكل ذاكرة رسومية وسيطة مثل نوع الخط وسماكته ولونه.

    يتم تحديد نوع الخط المرسوم بواسطة الوظيفة SetIndexStyle

    لهذه الوظيفة عدة مدخلات الأول والثاني إجباري تحديد القيم لهما

    المدخلات الثلاثة الباقية تحديد قيمهم اختياري وهم سيأخذون قيما افتراضيا في حال عدم تحديد قيم لهم.

    المدخلتان ( البارامتران ) الأوليان هما رقم الذاكرة الوسيطة ( 0 - 7 ) ثم نوع رسم الخط على التوالي.

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

    وما يهمنا هنا هو نوعان فقط حاليا:

    النوع الأول : DRAW_LINE ( وهو عبارة عن قيمة ثابتة لها الرقم صفر ).

    النوع الثاني : DRAW_HISTOGRAM ( وهو عبارة عن قيمة ثابتة لها الرقم اثنان ).


    نحن سنحدد أن نوع رسم الخط هو خطوط عمودية HISTOGRAM وستكون الأوامر على الشكل التالي:
    كود PHP:
    SetIndexStyle(0,DRAW_HISTOGRAM);
    SetIndexStyle(1,DRAW_HISTOGRAM); 
    أي أننا نريد رسم الخط الأول والخط الثاني على شكل أعمدة ( مثل مؤشر الماكد ).

    بهذا قد نكون قد انتهينا من تحديد ما يلزمنا حاليا من خصائص رسومية ونستطيع إكمال مؤشرنا.

    ولكن سنعود حتما لهذا القسم لنضيف بعض الخصائص الرسومية الأخرى.

    هذا الربط بين المصفوفات والذاكرة الوسيطة وتحديد الخصائص الرسومية يتم تنفيذها مرة واحد فقط.

    لذلك نضع كل هذه التعليمات البرمجية داخل الوظيفة init والتي تنفذ مرة واحدة عند وضع المؤشر على الشارت.

    ويصبح الكود النهائي للمؤشر الحالي على الشكل التالي:
    كود PHP:
    //+------------------------------------------------------------------+
    //|                                                Candle Length.mq4 |
    //|                               Copyright © 2006, eng waddah attar |
    //|                                               www.****quotes.net |
    //+------------------------------------------------------------------+
    #property copyright "Copyright © 2006, eng waddah attar"
    #property link      "http://www.****quotes.net"
    #property indicator_separate_window
    #property indicator_buffers 2
    #property indicator_color1 Green
    #property indicator_color2 Red
    double BufLength1[];
    double BufLength2[];
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function                         |
    //+------------------------------------------------------------------+
    int init()
    {
      
    SetIndexBuffer(0,BufLength1);
      
    SetIndexBuffer(1,BufLength2);
      
    SetIndexStyle(0,DRAW_HISTOGRAM);
      
    SetIndexStyle(1,DRAW_HISTOGRAM);
      return(
    0);
    }
    //+------------------------------------------------------------------+
    //| Custom indicator deinitialization function                       |
    //+------------------------------------------------------------------+
    int deinit()
      {
    //---- 
    فَقُلْتُ اسْتَغْفِرُوا رَبَّكُمْ إِنَّهُ كَانَ غَفَّارًا (10) يُرْسِلِ السَّمَاءَ عَلَيْكُمْ مِدْرَارًا (11) وَيُمْدِدْكُمْ بِأَمْوَالٍ وَبَنِينَ وَيَجْعَلْ لَكُمْ جَنَّاتٍ وَيَجْعَلْ لَكُمْ أَنْهَارًا (12) مَا لَكُمْ لَا تَرْجُونَ لِلَّهِ وَقَارًا (13)

  6. #6
    تاريخ التسجيل
    Nov 2011
    المشاركات
    1,560

    افتراضي

    بسم الله الرحمن الرحيم

    تعلمنا في الدروس السابقة كل الأساسيات اللازمة لعمل فكرة مؤشرنا الجديد.

    بقي عندنا مفهوم واحد فقط ( ضروري لهذه المرحلة ) لم نشرحه حتى الآن وهو مفهوم الحلقات Loops.

    والحلقات ببساطة هي عبارة عن كتلة برمجية يتم تنفيذها عدد محدد من المرات.

    أي أن هذه الكتلة البرمجية سوف تنفذ n مرة بحيث n هي العدد المطلوب لتكرار تنفيذ هذه الكتلة البرمجية.

    عناصر الحلقة البرمجية:

    - متحول رقمي ( عداد ) قد يكون من النوع int أو من النوع double فقط.

    - شرط استمرار الحلقة وهو الشرط اللازم تحققه لاستمرار الحلقة. وبمجرد عدم تحقق الشرط للمرة الأولى يتم الخروج من الحلقة.

    - مقدار التزايد في عداد الحلقة في كل مرة يتم تنفيذ الكتلة البرمجية للحلقة.

    أمر الحلقة هو for وله ثلاثة بارامترات من نوع خاص.

    - البارامتر الأول هو متحول العداد الرقمي وقيمة ابتدائية له.

    - البارامتر الثاني هو شرط استمرار الحلقة.

    - البارامتر الثالث هو مقدار التزايد في عداد الحلقة كل مرة.

    هذه ليست بارامترات بالمعنى الحقيقي للبارامترات ولكنها عبارة عن أوامر برمجية.

    لذلك يتم الفصل بينها بالفاصلة المنقوطة وليس بالفاصلة العادية فانتبه لهذا الأمر.

    هذه الأمثلة سوف توضح بالضبط كل الحالات الممكنة لانشاء حلقة.

    مثال (1)
    كود PHP:
    for (int i=1;i<=10;i++)
    {
    Print(
    i);

    الحلقة السابقة تعرف العداد على أنه متحول رقمي صحيح يبدأ من الواحد.

    شرط استمرار الحلقة هو أن تكون قيمة المتحول أصغر من أو تساوي العشرة.

    العداد i سوف يزداد واحد كل مرة يتم تكرار تنفيذ الكتلة البرمجية الموجودة داخل الأقواس المعقوفة.

    وفي داخل الكتلة البرمجية للحلقة سوف تتغير قيمة المتحول العداد i لتأخذ القيمة الحالية ( أي تكون أول مرة واحد ثم تصبح اثنان وهكذا).

    هذا يعني أن حلقتنا سوف تبدأ من الواحد وحتى العشرة أي أنها ستنفذ عشرة مرات فقط.

    لأنه بمجرد ان تصبح قيمة العداد 11 سوف لن يتحقق شرط تنفيذ الحلقة.

    وعندها سينتقل التنفيذ البرمجي لما بعد الكتلة البرمجية للحلقة.

    مثال (2)
    كود PHP:
    for (int i=5;i<=100;i++)
    {
    Print(
    i);

    مشابهة للمثال الأول ولكن البداية ستكون من الخمسة والنهاية عند 100.


    مثال (3)
    كود PHP:
    for (int i=0;i<50;i=i+2)
    {
    Print(
    i);

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


    مثال (4)
    كود PHP:
    for (int xx=10;xx>0;xx--)
    {
    Print(
    xx);

    المثال السابق لحلقة عكسية تبدأ من العشرة وتنتهي بالواحد ( لاحظ الشرط كيف أصبح )

    ولاحظ أيضا كيف أننا جعلنا العداد يتناقص ولا يتزايد.

    وطبعا اسم المتحول هو اختياري ولكن جرى العرف البرمجي أن يكون اسمه i .

    مثال (5)
    كود PHP:
    for (double i=0.1;i<=1;i=i+0.1)
    {
    Print(
    i);

    في الحلقة السابقة جعلنا العداد متحول رقمي بفاصلة عائمة عشرية تبدأ من القيمة 0.1 وتنتهي بالواحد وتتزايد بمقدار 0.1 كل مرة.



    مثال (6)
    كود PHP:
    double i;
    for (
    i=0.1;i<=1;i=i+0.1)
    {
    Print(
    i);

    المثال السابق نفس الذي يسبقه تماما ولكني عرفت المتحول من خارج جسم الحلقة وليس من داخل الحلقة.


    يمكن وضع حلقة داخل حلقة بمعنى أنه يمكنك وضع حلقة كاملة مع كتلتها البرمجية داخل كتلة برمجية لحلقة أكبر.

    كما يمكن أن تكون الحلقة بعدادين أو أكثر. لأن الحلقات مرنة جدا جدا ومعقدة جدا جدا.

    ولكن لا أريد منكم الآن إلا أن تفهموا أبسط استخدام للحلقات البسيطة.
    فَقُلْتُ اسْتَغْفِرُوا رَبَّكُمْ إِنَّهُ كَانَ غَفَّارًا (10) يُرْسِلِ السَّمَاءَ عَلَيْكُمْ مِدْرَارًا (11) وَيُمْدِدْكُمْ بِأَمْوَالٍ وَبَنِينَ وَيَجْعَلْ لَكُمْ جَنَّاتٍ وَيَجْعَلْ لَكُمْ أَنْهَارًا (12) مَا لَكُمْ لَا تَرْجُونَ لِلَّهِ وَقَارًا (13)

  7. #7
    تاريخ التسجيل
    Nov 2011
    المشاركات
    1,560

    افتراضي

    بعد أن شرحنا مفهوم الحلقات البرمجي يمكننا الآن أن نستمر في بناء مؤشرنا الجديد.

    لنراجع آخر كود وصلنا إليه:
    كود PHP:
    //+------------------------------------------------------------------+
    //|                                                Candle Length.mq4 |
    //|                               Copyright © 2006, eng waddah attar |
    //|                                               www.****quotes.net |
    //+------------------------------------------------------------------+
    #property copyright "Copyright © 2006, eng waddah attar"
    #property link      "http://www.****quotes.net"
    #property indicator_separate_window
    #property indicator_buffers 2
    #property indicator_color1 Green
    #property indicator_color2 Red
    double BufLength1[];
    double BufLength2[];
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function                         |
    //+------------------------------------------------------------------+
    int init()
    {
      
    SetIndexBuffer(0,BufLength1);
      
    SetIndexBuffer(1,BufLength2);
      
    SetIndexStyle(0,DRAW_HISTOGRAM);
      
    SetIndexStyle(1,DRAW_HISTOGRAM);
      return(
    0);
    }
    //+------------------------------------------------------------------+
    //| Custom indicator deinitialization function                       |
    //+------------------------------------------------------------------+
    int deinit()
      {
    //---- 
    الآن سنضيف الحلقة الرئيسية للمؤشر ومهمة هذه الحلقة هي المرور على كل الشمعات على الشارت وحساب قيم مؤشرنا عند كل شمعة.

    وبالتالي سوف تظهر خطوط المؤشر على الشارت.

    الحلقة ستكون على الشكل التالي:
    كود PHP:
    for(int i=0;i<Bars;i++) 
    كل شيء معروف لكن هناك المتحول الجديد Bars والذي هو عبارة عن متحول جاهز ضمن اللغة نفسها.

    في هذا المتحول Bars تخزن قيمة رقمية صحيحة تمثل عدد الشموع على الشارت الذي وضعنا عليه مؤشرنا.

    ولا نحتاج لتعريف المتحول Bars لأنه معرف داخليا مع قيمة تمثل عدد الشموع.

    في الحلقة السابقة نحن نقول للبرنامج أن ينفذ الكتلة البرمجية للحلقة بدءا من القيمة صفر وحتى آخر شمعة موجودة على الشارت.

    سوف نضيف جسم الحلقة إلى الكود ونحذف السطر:
    كود PHP:
    int counted_bars=IndicatorCounted(); 
    لأننا سنشرحه فيما بعد.


    والآن سنضيف كتلة الحلقة البرمجية والتي من خلالها سنحسب قيم مؤشرنا لعرضها على الشارت.

    نحن نريد حساب طول الشمعة أي الفرق بين الهاي واللو.
    ولذلك فإن قيمة المصفوفة الأولى ستكون:
    كود PHP:
    BufLength1[i]=High[i]-Low[i]; 
    أي أننا سنضع في الحجرة الأولى للمصفوفة BufLength1 وهي التي لها رقم صفر.

    الفرق بين قيمة الهاي واللو للشمعة رقم صفر.

    وكما وضحنا سابقا فإن المصفوفة High والمصفوفة Low هي مصفوفات جاهزة وفيه قيم الشمعات الموجودة على الشارت الحالي.

    ستصبح الحلقة على الشكل التالي:
    كود PHP:
    for(int i=0;i<Bars;i++)
       {
         
    BufLength1[i]=High[i]-Low[i];
       } 
    وسيصبح المثال على الشكل التالي :
    كود PHP:
    //+------------------------------------------------------------------+
    //|                                                Candle Length.mq4 |
    //|                               Copyright © 2006, eng waddah attar |
    //|                                               www.****quotes.net |
    //+------------------------------------------------------------------+
    #property copyright "Copyright © 2006, eng waddah attar"
    #property link      "http://www.****quotes.net"
    #property indicator_separate_window
    #property indicator_buffers 2
    #property indicator_color1 Green
    #property indicator_color2 Red
    double BufLength1[];
    double BufLength2[];
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function                         |
    //+------------------------------------------------------------------+
    int init()
    {
      
    SetIndexBuffer(0,BufLength1);
      
    SetIndexBuffer(1,BufLength2);
      
    SetIndexStyle(0,DRAW_HISTOGRAM);
      
    SetIndexStyle(1,DRAW_HISTOGRAM);
      return(
    0);
    }
    //+------------------------------------------------------------------+
    //| Custom indicator deinitialization function                       |
    //+------------------------------------------------------------------+
    int deinit()
      {
    //---- 
    فَقُلْتُ اسْتَغْفِرُوا رَبَّكُمْ إِنَّهُ كَانَ غَفَّارًا (10) يُرْسِلِ السَّمَاءَ عَلَيْكُمْ مِدْرَارًا (11) وَيُمْدِدْكُمْ بِأَمْوَالٍ وَبَنِينَ وَيَجْعَلْ لَكُمْ جَنَّاتٍ وَيَجْعَلْ لَكُمْ أَنْهَارًا (12) مَا لَكُمْ لَا تَرْجُونَ لِلَّهِ وَقَارًا (13)

  8. #8
    تاريخ التسجيل
    Nov 2011
    المشاركات
    1,560

    افتراضي

    بسم الله الرحمن الرحيم

    في هذا الدرس سنتكلم عن الشروط Conditions وكيفية معالجتها والتعامل معها برمجيا.

    ولكن قبل البدء سنتكلم نظريا لاستيعاب الفكرة الأساسية للشروط ومفهمومها البرمجي.

    الشرط هو عبارة عن مقارنة رياضية بين قيمتين رقميتين أو نصيتين.

    والمقارنات الرياضية هي نفسها المعروفة للجميع وهي:

    - يساوي ويرمز لها بالرمز ( == ).

    - لا يساوي ويرمز لها بالرمز ( =! ).

    - أكبر من ولها الرمز ( < ).

    - أصغر من ولها الرمز ( > ).

    - أكبر من أو يساوي ( =< ).

    - أصغر من أو يساوي ( => ).

    بحيث يتم وضع العلاقات السابقة بين متحولين أو قيمتين على الشكل التالي:

    (A==B) \\ الشرط هو أن تكون قيمة المتحول A تساوي قيمة المتحول B.

    (A>=5) \\ الشرط هو أن تكون قيمة المتحول A أكبر من أو تساوي الخمسة.

    (GetNum()!=old) \\ الشرط هو أن تكون القيمة العائدة من الوظيفة GetNum لا تساوي قيمة المتحول old .

    ('AccName=='khaled) \\ الشرط هو أن تكون قيمة المتحول AccName هو القيمة النصية khaled.


    تتم معالجة الشرط عند التنفيذ كما يلي:

    - يقوم البرنامج باستبدال المتحولات بقيمها لحظة التنفيذ في عبارة الشرط.

    - ثم يقوم بالمقارنة الرياضية بين القيم.

    - عند تحقق الشرط يضع القيمة صح true.

    - عند عدم تحقق الشرط يضع القيمة خطأ false.

    مثال:

    لدينا مثلا الشرط (A==B) بحيث كانت قيمة A تساوي 4 وقيمة B تساوي 4 لحظة تنفيذ عبارة الشرط.

    يقوم منفذ التعليمات البرمجية باستبدال المتحولات بقيمها ليصبح الشرط (4==4).

    ثم يقوم بالمقارنة الرياضية ليجدها صحيحة ويضع قيمة true.
    وتصبح عبارة الشرط (A==B) تصبح (true).

    طبعا المعالجة السابقة تتم في الذاكرة وليس على نص البرنامج الأصلي.

    مما سبق نريد أن نقول أن أي شرط يتحول في نهاية المطاف إلى قيمتين فقط هما true في حال كان الشرط صحيحا أو false في حال كان الشرط خاطئا.


    الشرح السابق الهدف منه هو شرح كيفية تعامل منفذ الأوامر مع الشروط وأيضا هو تمهيد لشرح أمر آخر وهو العلاقات المنطقية Booleans بين الشروط نفسها.

    في الشرح السابق تكلمنا عن عبارة تحوي شرطا واحدا فقط.
    ولكننا قد نحتاج إلى فحص شرطين أو أكثر في نفس الوقت.
    أي أن عبارة الشرط تتكون من عدة شروط تحكمها علاقات منطقية بووليانية.

    ما هي العلاقات المنطقية البووليانية؟

    لدينا ثلاثة علاقات منطقية أساسية هم:

    - العلاقة ( و ) AND ويرمز لها برمجيا بالرمز && .

    - العلاقة ( أو ) OR ويرمز لها برمجيا بالرمز || .

    - العلاقة ( عكس ) NOT ويرمز لها برمجيا بالرمز ! .

    العلاقة AND ببساطة تعني أنه يجب تحقق كل الشروط الفرعية ليصبح الشرط النهائي محققا.

    العلاقة OR تعني أنه يكفي تحقق أحد الشروط الفرعية ليصبح الشرط النهائي محققا.

    العلاقة NOT تعني أنه يجب عدم تحقق الشروط الفرعية ليتحقق الشرط النهائي.

    أمثلة توضيحية:

    لدينا مثلا شرطان الأول هو (A==B) والثاني هو (B>=5).
    ونريد أن ندمج هذين الشرطين في شرط واحد بحيث نريد تحقق كلا الشرطين معا.

    لتصبح العبارة الشرطية على الشكل التالي:

    (A==B) && (B>=5)

    أما إذا أردنا تحقق أحد الشرطين فقط فإن العبارة الشرطية تصبح على الشكل التالي:

    (A==B) || (B>=5)

    أما إذا كان شرطنا الأساسي هو عدم تحقق كلا الشرطين فإن العبارة تصبح:

    ((A==B) && (B>=5))!

    والحالة الأخيرة هي إذا كان شرطنا الأساسي هو عدم تحقق أحد الشرطين فإن العبارة تصبح:

    ((A==B) || (B>=5))!

    قد يحصل معكم لبس قليل في حالة المقارنة المنطقية NOT ولكنها ستزول بعد فترة.

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

    بالنسبة للعلاقات الرياضية بين القيم الرقمية فهي مفهومة كأن تكون 6 أكبر من 3.

    ولكن تطبيق العلاقات الرياضية بين النصوص قد يشكل لبسا لديكم ولكن الأمر بسيط أيضا.

    فالمساواة بين النصوص هي أن تكون النصوص متساوية حرفيا.

    أما علاقات الأكبر والأصغر فهي تعني الترتيب الأبجدي فمثلا الحرف a أصغر من الحرف b وهكذا.

    الأمر الذي يعالج الشروط وينفذ الأوامر البرمجية بناء على نتائج هذه الشروط هو الأمر if ويتم وضع كل الشروط داخل قوسين () .

    في حال تحقق الشرط فإن منفذ الأوامر سوف ينفذ الكتلة البرمجية المرتبطة بالأمر if.

    يمكن إضافة كتلة برمجية أخرى للأمر if تأتي بعد الأمر else وهي تعني في حال عدم تحقق شروط if فيجب تنفيذ الكتلة البرمجية التابعة للأمر else.

    وتكون الصيغة البرمجية للأمر if كما يلي:
    كود PHP:
    if(A==B)
    {
     
    الكتلة البرمجية للأمر if

    أو مع وجود أمر else
    كود PHP:
    if(A==B)
    {
     
    الكتلة البرمجية للأمر if
    }
    else
    {
     
    الكتلة البرمجية للأمر else

    لأمر else وكتلته البرمجية أمر خياري يعني يمكن عدم كتابته أصلا. وهذا راجع لاحتياجات المبرمج وطريقة برمجته.


    عودة لمؤشرنا ولنتذكر هنا آخر كود وصلنا إليه:
    كود PHP:
    //+------------------------------------------------------------------+
    //|                                                Candle Length.mq4 |
    //|                               Copyright © 2006, eng waddah attar |
    //|                                               www.****quotes.net |
    //+------------------------------------------------------------------+
    #property copyright "Copyright © 2006, eng waddah attar"
    #property link      "http://www.****quotes.net"
    #property indicator_separate_window
    #property indicator_buffers 2
    #property indicator_color1 Green
    #property indicator_color2 Red
    double BufLength1[];
    double BufLength2[];
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function                         |
    //+------------------------------------------------------------------+
    int init()
    {
      
    SetIndexBuffer(0,BufLength1);
      
    SetIndexBuffer(1,BufLength2);
      
    SetIndexStyle(0,DRAW_HISTOGRAM);
      
    SetIndexStyle(1,DRAW_HISTOGRAM);
      return(
    0);
    }
    //+------------------------------------------------------------------+
    //| Custom indicator deinitialization function                       |
    //+------------------------------------------------------------------+
    int deinit()
      {
    //---- 
    لقد جعلنا المؤشر يقوم برسم خطوط عمودية تمثل طول الشمعة الحالية.

    وبما أن الطول هو عبارة عن الفرق بين الهاي واللو فهذا يعني أنه موجب دائما.

    ولكن طول جسم الشمعة بما أنه الفرق بين الإغلاق والفتح فهذا يعني أنه قد يكون موجبا أو سالبا.

    وبما أننا خططنا لمؤشرنا أن يرسم خطي الطول فهذا يعني أن يكون كلا الطولين موجبا دائما.

    ولذلك سنطبق ما تعلمناه عن الشروط لمعالجة هذا الأمر وذلك لرسم الخط الثاني بشكل موجب وصحيح دائما.

    بشكل بسيط سوف نحسب طول جسم الشمعة على أنه الفرق بين الإغلاق والفتح.

    في حال كان الإغلاق أكبر من الفتح فهذا يعني أن الطول سيكون موجبا وهو الحالة الصحيحة الأولى.

    في حال كان الإغلاق أصغر من الفتح فهذا يعني أن الطول سيصبح سالبا ولذلك يجب تغيير كيفية حساب الطول إلى الفتح ناقص الإغلاق.

    طبعا يمكن معالجة هذه الحالة برمجيا بعدة طرق سنستعرض معظمها لزيادة الشرح والفهم.

    وأي طريقة منها تعطينا النتيجة الصحيحة فهي صحيحة بالنهاية.

    ويعود اختيار أحدها إلى المبرمج نفسه وطريقة تفكيره ومعالجته للأمر.

    الطريقة الأولى:

    وضع الشرط والحساب في كتلة برمجية واحد تتضمن if و else كالتالي:
    كود PHP:
    if(Close[i]>Open[i])
    {
    BufLength2[i]=Close[i]-Open[i];
    }
    else
    {
    BufLength2[i]=Open[i]-Close[i];

    المثال السابق يقول في حال كان الإغلاق أكبر من الفتح فإن طول الشمعة يساوي الإغلاق ناقص الفتح.

    وإلا ( else ) في حال عدم تحقق الشرط أي أن الإغلاق أصغر من أو يساوي الفتح فإن طول الشمعة يساوي الفتح ناقص الإغلاق.

    وتصبح كتلة الوظيفة start كالتالي:
    كود PHP:
    int start()
      {
    //----
       
    for(int i=0;i<Bars;i++)
       {
         
    BufLength1[i]=High[i]-Low[i];
         if(
    Close[i]>Open[i])
         {
           
    BufLength2[i]=Close[i]-Open[i];
         }
         else
         {
           
    BufLength2[i]=Open[i]-Close[i];
         }
       }
       return(
    0);
      } 
    الطريقة الثانية:

    حساب طول جسم الشمعة دائما على أنه الإغلاق ناقص الفتح وفي حال كان الطول سالبا نضرب النتاتج في -1 ليصبح موجبا ويكون الكود كالتالي:
    كود PHP:
    LL=Close[i]-Open[i];
         if(
    LL<0)
         {
           
    LL=-1*LL;
         }
         
    BufLength2[i]=LL
    وتصبح كتلة الوظيفة start كالتالي:
    كود PHP:
    int start()
      {
    //----
       
    double LL;
       
       for(
    int i=0;i<Bars;i++)
       {
         
    BufLength1[i]=High[i]-Low[i];
         
         
    LL=Close[i]-Open[i];
         if(
    LL<0)
         {
           
    LL=-1*LL;
         }
         
    BufLength2[i]=LL;
       }
       return(
    0);
      } 
    الطريقة الثالثة:

    في هذه الطريقة سنستخدم الوظائف الحسابية المتوفرة في لغة MQL4 والتي تسهل علينا كثيرا القيام بعمليات حسابية دون الخوض بطريقة عملها الداخلية.

    الوظيفة التي سنستخدمها هي الوظيفة MathAbs وهي تعطينا القيمة المطلقة ( الموجبة ) لأي رقم سالب أو موجب.

    المدخلات لهذه الوظيفة هي الرقم الذي نريد حساب القيمة المطلقة له.
    والمخرجات هي القيمة المطلقة.
    كود PHP:
    Print(MathAbs(-5));
     
    سيتم طباعة 5 
    كود PHP:
    Print(MathAbs(7));
     
    سيتم طباعة 7 
    وباستخدام الوظيفة MathAbs نكون قد استغنينا عن الشرط الذي وضعناه سابقا

    ويصبح الكود على الشكل التالي:
    كود PHP:
    //+------------------------------------------------------------------+
    //|                                                Candle Length.mq4 |
    //|                               Copyright © 2006, eng waddah attar |
    //|                                               www.****quotes.net |
    //+------------------------------------------------------------------+
    #property copyright "Copyright © 2006, eng waddah attar"
    #property link      "http://www.****quotes.net"
    #property indicator_separate_window
    #property indicator_buffers 2
    #property indicator_color1 Green
    #property indicator_color2 Red
    double BufLength1[];
    double BufLength2[];
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function                         |
    //+------------------------------------------------------------------+
    int init()
    {
      
    SetIndexBuffer(0,BufLength1);
      
    SetIndexBuffer(1,BufLength2);
      
    SetIndexStyle(0,DRAW_HISTOGRAM);
      
    SetIndexStyle(1,DRAW_HISTOGRAM);
      return(
    0);
    }
    //+------------------------------------------------------------------+
    //| Custom indicator deinitialization function                       |
    //+------------------------------------------------------------------+
    int deinit()
      {
    //---- 
    ولن يهمنا عندا هل الإغلاق أكبر من الفتح أم الفتح أكبر من الإغلاق


    والطرق الثلاث تعطي نفس النتائج.
    سنتعرف أكثر عن الوظائف الحسابية المتوفرة في لغة MQL4
    مع ملاحظة أن كل الوظائف الحسابية تبدأ بالاسم Mathxxxx

    الوظيفة MathAbs لحساب القيمة المطلقة .

    الوظيفة MathCos لحساب قيمة Cosine الزاوية ( خاصة بعلم المثلثات ).

    الوظيفة MathSin لحساب قيمة Sine الزاوية ( خاصة بعلم المثلثات ).

    الوظيفة MathTan لحساب قيمة Tan الزاوية ( خاصة بعلم المثلثات ).

    الوظيفة MathArccos لحساب قيمة Arc Cosine الزاوية ( خاصة بعلم المثلثات ).

    الوظيفة MathArcsin لحساب قيمة Arc Sine الزاوية ( خاصة بعلم المثلثات ).

    الوظيفة MathArctan لحساب قيمة Arc Tan الزاوية ( خاصة بعلم المثلثات ).

    وهي كلها معروفة لنا وقد درسناها في المرحلة الثانوية ولكن تسميتها تختلف من دولة لأخرى.

    نحن عندنا في سورية نرمز لها ( جب - تجب - ظل ... الخ )
    في السعودية كما أذكر يرمزون لها ( جا - جتا - ظا - ظتا ... الخ )

    بالنسبة لي لم أستخدم هذه الوظائف في برمجتي أبدا لأني حتى الآن لم أجد استراتيجية أو طريقة تحتاج مثل هذه الحسابات.

    الوظيفة MathLog لحساب قيمة اللوغاريتم ( خاصة بعلم المثلثات ).

    الوظيفة MathCeil تقوم بحساب أكبر قيمة صحيحة للرقم المدخل ( 5.5 تصبح 6 و -5.5 تصبح -5 )

    الوظيفة MathFloor تقوم بحساب أصغر قيمة صحيحة للرقم المدخل ( 5.5 تصبح 5 و -5.5 تصبح -6 )

    الوظيفة MathMin تعيد القيمة الصغرى للقيمتين المدخلتين للوظيفة نفسها.

    الوظيفة MathMax تعيد القيمة الكبرى للقيمتين المدخلتين للوظيفة نفسها.

    الوظيفة MathPow تعيد قيمة الرقم مضروب بنفسه عدد محدد من المرات.

    مثال:
    MathPow(3,2)
    سوف تعطينا النتيجة 3×3 = 9

    MathPow(4,3)
    سوف تعطينا النتيجة 4×4×4= 64

    الوظيفة MathRand تعطينا دائما رقم عشوائي متغير من 0 - 32767

    الوظيفة MathRound تقوم بتقريب الرقم إلى أقرب رقم صحيح ( 2.3 تصبح 2 و 2.6 تصبح 3 )

    الوظيفة MathSqrt تقوم بحساب الجذر التربيعي للرقم المدخل.

    كل الوظائف الحسابية السابقة مدخلاتها عبارة عن الرقم الذي نريد حساب الشيء عليه والخرج دائما هو النتيجة.
    فَقُلْتُ اسْتَغْفِرُوا رَبَّكُمْ إِنَّهُ كَانَ غَفَّارًا (10) يُرْسِلِ السَّمَاءَ عَلَيْكُمْ مِدْرَارًا (11) وَيُمْدِدْكُمْ بِأَمْوَالٍ وَبَنِينَ وَيَجْعَلْ لَكُمْ جَنَّاتٍ وَيَجْعَلْ لَكُمْ أَنْهَارًا (12) مَا لَكُمْ لَا تَرْجُونَ لِلَّهِ وَقَارًا (13)

  9. #9
    تاريخ التسجيل
    Nov 2011
    المشاركات
    1,560

    افتراضي

    الوظيفة MathRound تقرب الأرقام العشرية

    بمعنى إذا كانت الأرقام العشرية أكبر أو تساوي 0.5 فإنها تزيد الرقم واحدا.

    مثلا الرقم 2.6 تصبح 3 لأن الرقم العشري أكبر من 0.5

    ولكن 2.4 تصبح 2 لأن الرقم العشري أصغر من 0.5


    الوظيفة MathFloor تزيل الرقم العشري ولا تقربه .

    وتحول الرقم إلى الرقم الأصغر

    مثلا 8.9 تصبح 8

    و -4.2 تصبح -5 على اعتبار أن -5 هي الرقم الأصغر وليس -4


    كل وظيفة تعمل بنظام مختلف ولكن ليسوا عكس بعض
    سنضيف بعض البهارات إلى مؤشرنا لمزيد من الإحاطة.

    أولا: تقييد مجال عرض قيم المؤشر:

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

    هذا الأمر مسؤول عنه خاصية للمؤشر هي indicator_minimum وهي تحدد القيمة الصغرى لمجال عرض القيم على المؤشر.

    يمكن طبعا للمستخدم التحكم يدويا في هذه القيمة من خلال خصائص المؤشر نفسها.

    ولكن إعطاء قيمة افتراضية لهذه الخاصية يزيد مؤشرنا قوة وسهولة.

    والآن سنضيف الخاصية الجديدة لمؤشرنا أعلى الكود مع باقي الخصائص الأخرى على الشكل التالي:
    كود PHP:
    #property indicator_minimum 0 
    نكتب اسم الخاصية ثم مسافة ثم القيمة ولا نضع أي فواصل من أي نوع.

    بالمناسبة فإن هناك خاصية مكملة لهذه الخاصية وهي تحدد المجال الأكبر للمؤشر على النافذة وهي indicator_maximum.

    ويتم إعطاء قيمة لهذه الخاصية بنفس الطريقة السابقة تماما.
    ولكن مؤشرنا لا يحتاج لهذه الخاصية لأن المجال الموجب مفتوح ولا نعرف أقصى قيمة ستكون عليه طول الشمعات.

    ولذلك لم نستخدم هذه الخاصية وشرحناها فقط لإكمال الفكرة.


    ثانيا: إضافة مستويات جاهزة للمؤشر:

    سنضيف أيضا في مؤشرنا الجديد بعض المستويات ( يستطيع أي مؤشر أن يحتوي حتى 8 مستويات فقط )

    والمستوى هو خط أفقي يتم رسمه على نافذة المؤشر وأيضا يستطيع المستخدم التحكم بهذه المستويات من خلال خصائص المؤشر.

    يتم إضافة مستويات للمؤشر عن طريق الخصائص indicator_level1 و indicator_level2 و indicator_level3 وهكذا حتى indicator_level8.

    ويتم تحديد قيمته على الشكل التالي:
    كود PHP:
    #property indicator_level1 0.0020 
    الكود السابق أضاف لنا مستوى عند القيمة 0.0020 للمؤشر أي عند مستوى 20 نقطة.

    كم يمكننا إضافة مستوى آخر عند القيمة 0.0040 مثلا بواسطة الكود:
    كود PHP:
    #property indicator_level2 0.0040 
    كما يمكن لنا بواسطة الخصائص indicator_levelcolor و indicator_levelwidth و indicator_levelstyle التحكم بلون وسماكة وطريقة رسم المستويات على التوالي.

    طرق عرض المستويات هي لكل المستويات مجتمعة وليست لكل مستوى على حدة.


    كما يرجى ملاحظة أن بعض التغييرات في بعض الخصائص قد يضطرك إلى إزالة المؤشر من على الشارت ثم إعادته من جديد لتظهر هذه التغييرات.
    فَقُلْتُ اسْتَغْفِرُوا رَبَّكُمْ إِنَّهُ كَانَ غَفَّارًا (10) يُرْسِلِ السَّمَاءَ عَلَيْكُمْ مِدْرَارًا (11) وَيُمْدِدْكُمْ بِأَمْوَالٍ وَبَنِينَ وَيَجْعَلْ لَكُمْ جَنَّاتٍ وَيَجْعَلْ لَكُمْ أَنْهَارًا (12) مَا لَكُمْ لَا تَرْجُونَ لِلَّهِ وَقَارًا (13)

  10. #10
    تاريخ التسجيل
    Nov 2011
    المشاركات
    1,560

    افتراضي

    بسم الله الرحمن الرحيم

    في هذا الدرس سنقوم بإذن الله بشرح المؤشرات المبيتة والداخلية والاستفادة منها وقراءة قيمها على أي شمعة على الشارت.

    المؤشرات المبيتة هي المؤشرات القياسية التي تأتي مع برنامج الميتاتريدر مثل الماكد و RSI و البولينغر باند وغيرها من المؤشرات الأخرى.

    المؤشرات المبيتة كلها عبارة عن وظائف تبدأ بالحرف i مثل iMA لمؤشر الموفينغ أفريج و iRSI لمؤشر RSI وهكذا.

    لكل وظيفة مؤشر هناك عدة مدخلات ( بارامترات ) يجب أن نتكبها بشكل صحيح حتى تعطينا الوظيفة القراءة الصحيحة.

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

    هذه المؤشرات يتم حساب قيمها داخليا بدون أن يكون لنا علاقة بالمعادلات الرياضية الداخلية للوظيفة.

    مع أنه من المفيد معرفة كيفية حسابها إلا أن الوظيفة تعطينا النتائج دون الخوض في تفاصيل الحساب.

    وهي أيضا توفر علينا الوقت والجهد وتصحيح الأخطاء وكبر حجم الكود.

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

    فمثلا مؤشر الانفجار السعري يعتمد على مؤشرين هما البولنغر باند والماكد.

    وسوف أقوم بشرحه بالتفصيل بعد هذا الدرس مباشرة في درس جديد.

    وفهم هذا المؤشر وكيفية برمجته وعمله أمر مهم جدا لفهم برمجة المؤشرات بشكل عام.


    كما قلنا فإن أي مؤشر هو عبارة عن وظيفة Function داخلية وفرتها لنا لغة MQL4 .

    وكل ما علينا فعله هو استدعاء هذه الوظيفة مع كتابة مدخلاتها بشكل صحيح وسوف نحصل على قيمة وحيدة عند كل شمعة تمثل قيمة المؤشر عند هذه الشمعة على الشارت.


    نبدأ أولا مع مؤشر معروف وبسيط وهو المتوسط المتحرك Moving Average

    اسم الوظيفة هو iMA ولها البارامترات التالية:
    كود PHP:
    double iMA(string symbolint timefra meint periodint ma_shiftint ma_methodint applied_priceint shift
    شرح البارامترات المطلوبة لعمل هذه الوظيفة:

    - اسم الزوج Symbol: وهو قيمة نصية ولدينا ثلاثة احتمالات لكتابة اسم الزوج وهي:

    1- أن نكتبه بشكل مباشر مثل "GBPUSD" بأحرف كبيرة وهذه الحالة تكون عندما يكون المؤشر الذي نصممه يعمل فقط مع هذا الزوج وليس مع الزوج الذي وضع المؤشر عليه.

    ففي بعض الحالات قد نضطر لمعرفة قيمة المتوسط المتحرك لزوج محدد وليس للزوج المحدد على الشارت.

    ويجب أيضا أن يكون اسم الزوج صحيحا تماما ومطابقا للأسماء القياسية المعروفة.

    2- أن نضع الثابت NULL والذي يعني أننا نريد حساب المتوسط للزوج الموجود على الشارت مهما كان نوعه.

    3- أن نضع المتحول ()Symbol وهو متحول داخلي يعطينا اسم الزوج الحالي الموجود على الشارت.

    الطريقة الثانية والثالثة لها نفس التأثير لكني أفضل الطريقة الثالثة لأن بعض الوظائف وخصوصا عند تعاملنا مع الاكسبيرتات لا تقبل الطريقة الثانية في تحديد نوع الزوج وهي تريد تحديد أكثر لاسم الزوج.

    لذلك يجب أن نعتاد على استخدام Symbol لتحديد اسم الزوج حتى لا نقع في مشاكل مستقبلية.


    - نوع الفريم المستخدم timefra me: وهو قيمة رقمية تحدد لوظيفة نوع الفريم المستخدم وله أيضا عدة حالات:

    1- صفر ( 0 ) وهذا يعني أننا نريد حساب المتوسط المتحرك للفريم الحالي الموجود على الشارت.

    2- رقم 1 وهذا يعني أننا نريد حساب المتوسط المتحرك لفريم الدقيقة بغض النظر عن الفريم الحالي.

    3- رقم 5 وهذا يعني أننا نريد حساب المتوسط المتحرك لفريم الخمس دقائق بغض النظر عن الفريم الحالي.

    4- رقم 15 للربع ساعة و 30 للنصف ساعة و 60 للساعة و 240 للأربع ساعات و 1440 لليوم و 10080 للاسبوع و 43200 للشهر.

    5- أن نكتب بدلا من الأرقام السابقة ثوابت تدل عليها ولها نفس التأثير ولكن تكون أوضح للقراءة والتعديل على الكود وهي:
    PERIOD_M1 1 1 minute.
    PERIOD_M5 5 5 minutes.
    PERIOD_M15 15 15 minutes.
    PERIOD_M30 30 30 minutes.
    PERIOD_H1 60 1 hour.
    PERIOD_H4 240 4 hour.
    PERIOD_D1 1440 Daily.
    PERIOD_W1 10080 Weekly.
    PERIOD_MN1 43200 Monthly.
    ويجب كتابتها بأحرف كبيرة كما هي مكتوبة بالجدول السابق تماما.


    - الفترة period : وهي قيمة رقمية تحدد الفترة المستخدمة لحساب المتوسط هل هي 14 أو 20 وهكذا.

    هذه الفترة هي نفسها التي تضعها في خصائص مؤشر المتوسط المتحرك من برنامج التداول نفسه.

    - إزاحة المتوسط ma_shift : وهي قيمة رقمية سالبة أو موجبة تقوم بإزاحة المتوسط إلى اليمين أو اليسار بمقدار محدد من الشموع.

    وهذه الخاصية أيضا تجدها في خصائص المؤشر في برنامج التداول نفسه.

    جرب من برنامج التداول وضع قيم مختلفة عن الصفر مثل 10 و -10 وانظر الفرق وكيف يتم إزاحة المؤشر يمينا أو يسارا على الشارت.

    - طريقة حساب قيم المتوسط ma_method : وهي قيمة رقمية يمكن كتابتها كأرقام 0 - 1 - 2 - 3 حيث:

    1- الرقم صفر للمتوسط البسيط Simple .
    2- الرقم واحد للمتوسط الأسي Exponential.
    3- الرقم اثنان للمتوسط المنعم Smoothed.
    4- الرقم ثلاثة للمتوسط الموزون Weighted.

    يمكن أيضا كتابة ثوابت خاصة حسب الجدول المرفق:
    كود PHP:
    MODE_SMA      0      Simple moving average,
    MODE_EMA      1      Exponential moving average,
    MODE_SMMA   2      Smoothed moving average,
    MODE_LWMA   3       Linear weighted moving average
    يمكنك كتابة رقم مجرد أو اسم الثابت ويفضل طبعا كتابة الثابت لسهولة قراءة الكود وتعديله.

    كل طريقة من الطرق السابقة لها كيفية حسابية معينة تعطي نتائج مختلفة قليلا عن سابقتها.

    - السعر الذي سيطبق عليه حساب المتوسط applied_price : وهو قيمة رقمية تحدد نوع السعر الذي سيطبق عليه حساب المتوسط. هل هو سعر الإغلاق أو الفتح أو الأعلى وهكذا.

    وهو له القيم التالية:
    كود PHP:
    PRICE_CLOSE          0         Close price.
    PRICE_OPEN             1        Open price.
    PRICE_HIGH              2        High price.
    PRICE_LOW               3        Low price.
    PRICE_MEDIAN         4        Median price, (high+low)/2.
    PRICE_TYPICAL       5         Typical price
    , (high+low+close)/3.
    PRICE_WEIGHTED   6        Weighted close price
    , (high+low+close+close)/4. 
    يمكن طبعا كتابة رقم أو اسم الثابت والأسعار فوق واضحة طبعا.


    - رقم الشمعة shift : وهو قيمة رقمية تحدد رقم الشمعة على الشارت الذي سنحسب لها المتوسط المتحرك.

    والشمعة الأولى على اليمين تأخذ الرقم صفر والتي تليها تأخذ الرقم واحد وهكذا.

    عند تشكل شمعة جديدة فإنها تأخذ فورا الرقم صفر والتي تليها يصبح رقمها واحد وهكذا.


    أمثلة توضيحية:
    كود PHP:
    double myMA;
    myMA=iMA(Symbol(),0,14,0,MODE_SMA,PRICE_CLOSE,0); 
    المثال السابق يحسب لنا قيمة المتوسط المتحرك البسيط بفترة 14 للزوج الحالي والفريم الحالي المستخدم على الشارت.

    والحساب سيكون وفق سعر الإغلاق وللشمعة رقم صفر وهي أول شمعة على اليمين.
    كود PHP:
    double myMA;
    myMA=iMA(NULL,PERIOD_M30,30,0,MODE_EMA,PRICE_HIGH,5); 
    المثال السابق يحسب لنا قيمة المتوسط الأسي بفترة 30 للزوج الحالي وللفريم نصف ساعة على سعر الهاي.

    والحساب هو للشمعة السادسة على الشارت.
    شرح بعض الوظائف الأخرى للمؤشرات القياسية المبيتة

    مؤشر البولنغر باند:

    اسم وظيفته هي iBands ولها الصيغة التالية:
    كود PHP:
    double iBandsstring symbolint timef rameint periodint deviationint bands_shiftint 
    applied_price
    int modeint shift
    البارامترات الثلاثة الأولى شرحت بالسابق وهي لها نفس الاستخدام.

    البارامتر deviation وهو عبارة عن رقم صحيح يأخذ رقم من 1 إلى أي رقم موجب وهو معدل انحراف البولنغر.

    البارامتر bands_shift وهو قيمة رقمية تمثل انزياح المؤشر عن السعر وهي أيضا مشروحة سابقا.

    السعر المطبق أيضا شرحت سابقا.

    البارامتر mode له قيمتان فقط تحددان نوع القيمة المقروؤة هل هي للخط العلوي للبولنغر أم الخط السفلي والقيمتان هما:

    MODE_UPPER 1 Upper line.
    MODE_LOWER 2 Lower line.

    فإذا أردنا قراءة قيمة الخط العلوي نضع 1 أو MODE_UPPER ونضع 2 أو MODE_LOWER إذا أردنا قراءة قيمة الخط السفلي.

    الخط المتوسط لا يتم قرائته مباشرة من خلال هذه الوظيفة لأنه ببساطة هو متوسط متحرك بسيط له نفس الفترة.

    ونقرأ قيمته من من الوظيفة iMA المشروحة سابقا.

    مؤشر ADX واسم وظيفته iADX

    وله الصيغة التالية:
    كود PHP:
    double iADXstring symbolint time*****, int periodint applied_priceint modeint shift
    كل البارامترات السابقة مشروحة ولها نفس المعنى
    ولكن الفرق هي في قيم البارامتر mode حيث تأخذ القيم التالية:

    MODE_MAIN 0 Base indicator line.
    MODE_PLUSDI 1 +DI indicator line.
    MODE_MINUSDI 2 -DI indicator line.

    حيث مؤشر ADX له ثلاثة خطوط : الخط الرئيسي والخط الموجب والخط السالب ولكل مؤشر نريد قراءة قيمته نضع القيمة المناسبة في المتحول mode

    هذه هي الفكرة الرئيسية من وظائف المؤشرات القياسية المبيتة في اللغة نفسها.

    لا يوجد فروقات كثيرة بينها من حيث الاستخدام ويكفي قراءة البارامترات لمعرفة ما هي القيم المطلوبة ليعيد لنا القراءة
    الصحيحة.

    تقنيات مختلفة مفيدة مع المؤشرات:

    - غالبا يتم إخراج بعض قيم المتحولات كخصائص يستطيع المستخدم تغييرها من خارج كود المؤشر.

    أي متحول نريد جعله خاصية خارجية نضع قبل أمر تعريفه التعبير extern ( اختصار external خارجي ).

    فمثلا المتحول
    كود PHP:
    double MyNum=6
    لن يستطيع المستخدم تغيير قيمة هذا المتحول من خارج الكود.
    بينما إذا أردنا إتاحة إمكانية تغيير قيمة هذا المتحول من خلال خصائص المؤشر فإننا نكتب الكود على الشكل التالي:
    كود PHP:
    extern double MyNum=6
    والآن يستطيع المستخدم تغيير قيمة هذا المتحول خارجيا.
    يستفاد من هذه الميزة بشكل عام جعل المؤشر مرن مع احتياجات المستخدم.

    كما أنه يجب الموازنة بين المرونة وبين كثرة الخصائص الخارجية التي قد تربك المستخدم أحيانا

    كما يجب اختيار أسماء معبرة عن معنى الخاصية لتكون عونا للمستخدم على فهم المقصود من هذه الخاصية.

    - تسريع عمل المؤشر .

    من الطبيعي أن نقوم بحساب قيم المؤشر لكل الشمعات الموجودة على الشارت عند تغير السعر اللحظي.

    وذلك عبر حلقة تمر على كل الشمعات .
    ولكن هذا الأمر قد يستغرق وقتا طويلا إذا كانت الحسابات معقدة جدا وكانت عدد الشمعات على الشارت كبير جدا.

    ولذلك نستخدم تقنية جديدة لحساب قيم الشمعات الجديدة فقط دون الحاجة إلى إعادة الحساب كل مرة على كل الشمعات.

    وذلك بالاستعانة بالوظيفة IndicatorCounted والتي تعطينا عدد الشمعات التي حسبنا عليها المؤشر.

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

    والكود هو التالي:
    كود PHP:
    int    limiticounted_bars IndicatorCounted();
    //  إذا لم يكن هناك شمعات جديدة اخرج دون حساب
       
    if(counted_bars 0
           return(-
    1);
    //  إذا كان هناك شمعات جديدة احسب مقدار الشموع الجديدة فقط
       
    if(counted_bars 0
           
    counted_bars--;
       
    limit Bars counted_bars;
    //  الحلقة تكون من عدد الشموع الجديدة المكونة وحتى الشمعة الحالية رقم صفر
       
    for(limit 1>= 0i--)
       {
        
    ///  حساب المؤشر
       

    - وضع اسم المؤشر على الشارت مع إظهار قيم الخصائص:
    تفيد هذه الطريقة في معرفة اسم المؤشر الحالي على الشارت وقيم الخصائص التي اختارها المستخدم وذلك تسهيلا عليه في معرفة هذه الخصائص دون الحاجة للدخول إلى نافذة الخصائص.

    يتم هذا الأمر بواسطة الوظيفة IndicatorShortName وتوضع هذه الوظيفة في الوظيفة init.
    ويتم وضع الاسم وقيم الخصائص في مدخلات هذه الوظيفة.

    مثال:
    كود PHP:
    IndicatorShortName("Indicator Name :  Period= " MyPeriod ); 
    حيث من المفروض أن تكون MyPeriod خاصية معرفة ولها قيمة.
    فَقُلْتُ اسْتَغْفِرُوا رَبَّكُمْ إِنَّهُ كَانَ غَفَّارًا (10) يُرْسِلِ السَّمَاءَ عَلَيْكُمْ مِدْرَارًا (11) وَيُمْدِدْكُمْ بِأَمْوَالٍ وَبَنِينَ وَيَجْعَلْ لَكُمْ جَنَّاتٍ وَيَجْعَلْ لَكُمْ أَنْهَارًا (12) مَا لَكُمْ لَا تَرْجُونَ لِلَّهِ وَقَارًا (13)

ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •