• 9:35 مساءاً




للتثبيت :- مشروع نخريج 5000 مبرمج عربي باكاديمية لورصات

إضافة رد
أدوات الموضوع
عضو جديد
تاريخ التسجيل: Oct 2015
المشاركات: 116
معدل تقييم المستوى: 9
m_nasseem1 is on a distinguished road
11 - 11 - 2015, 02:04 AM
  #1
m_nasseem1 غير متواجد حالياً  
افتراضي للتثبيت :- مشروع نخريج 5000 مبرمج عربي باكاديمية لورصات
[سم الله الرحمن الرحيم
ارجو ان تجد هذه الفكرة طريقها للنور بمباركة الاخوة اعضاء الادارة ومبرمجي بورصات علي ان تكون تحت اشراف العظيم سمير ارمان ومبرمجي بوصات
من منطلق خيركم من تعلم العلم وعلمه واظن ان ما وجدته في هذا المنتدي من حب وتعاون وعم ايثار بين اعضائه واحتضانهم لكل وافد ومبتدي بالنصيحة والمعلومة والمساعدة شجعني علي ان اضع لبنة هذه الفكرة وهو منقول للامانة من منتدي اخر حتي لا تبخس حق كاتبه
وتخصص تلك المشاركة لشرح اكواد لغة mql4 واستفسارات الاعضاء بشانها
علي الادارة اختيار من تراه مناسبا لاشراف علي الصفحة وتطويرها
تقبلوا تحياتي
رد مع اقتباس

عضو جديد
 
تاريخ التسجيل: Oct 2015
المشاركات: 116
معدل تقييم المستوى: 9
m_nasseem1 is on a distinguished road
افتراضي رد: للتثبيت :- مشروع نخريج 5000 مبرمج عربي باكاديمية لورصات
2#
11 - 11 - 2015, 02:06 AM
بسم الله نفتتح

تعال وتعلم معنا لغة 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- نص الرابط لموقع أو ايميل سيكون [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ].

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- نضغط إنهاء وعندها ستظهر نافذة المؤشر مع قليل من الكود البرمجي وتبقى علينا مهمة إكماله بالفكرة التي نريد من مؤشرنا أن يقوم بها.


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

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

- أول سطرين نراهما باللون الأزرق هما الأمرين الذين وضعنا فيهما نص الحقوق المحفوظة ونص الرابط وهما على الشكل التالي:

#property copyright "Copyright 2007 "
#property link "[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]"
بعد ذلك يأتينا سطر هام آخر نحدد من خلاله أن المؤشر سيظهر في نافذة منفصلة. وهو على الشكل التالي:

#property indicator_separate_window

نستطيع بسهولة تغيير هذه الخاصية باستبدال السطر السابق بالسطر التالي:

#property indicator_chart_window

بعد ذلك نجد الكود التالي ( بعد حذف التعليقات منه ):

#property copyright "Copyright © 2007"
#property link "[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]"
#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.

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

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

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

int FunctionName()
{
return(0);
}

كما يمكن أن نكتبها كلها على سطر واحد كالتالي:

int FunctionName() { return(0); }

وتوزيع الوظيفة على أكثر من سطر هو لسهولة القراءة فقط من قبل المبرمج أو من سيطلع على الكود بشكل عام.
ettahrim
01-31-2012, 12:15 PM
بسم الله الرحمن الرحيم

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

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

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

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

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

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

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

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

أمثلة عن تعريف متحولات أو وظائف يكون نوع البيانات فيها من النوع الصحيح:

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 وهي تعني ان المتحول سنخزن فيه أحرفا أو أرقاما.

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

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


أمثلة:

string MyName;
string MyName,MyAddress;
string MyName="Ahmad";

string GetName(string address)
{
return("Ahmad");
}

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

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

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

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

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

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

أمثلة:

bool a=true,b=false;
bool a;

bool GetStatus()
{
return(true);
}


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

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

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

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

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

أمثلة:

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

إذا لم تكتب التاريخ فسوف يكون التاريخ الافتراضي هو تاريخ عمل النسخة التنفيذية للمؤشر أو تاريخ التنفيذ.
ettahrim
01-31-2012, 12:18 PM
بعد أن تعرفنا على أنواع المتحولات والوظائف هناك موضوع غاية في الأهمية ألا وهو مجالات المتحولات Variable Scope .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

المثال الأول:


#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

انظروا لهذا المثال أولا:

int start()
{
int a=5;

Print(a);
a=a+1;

return(0);
}

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

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

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

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

ولكي يصبح مثالنا السابق صحيحا فإن المثال يصبح على الشكل التالي:

int start()
{
static int a=5;

Print(a);
a=a+1;

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

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

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

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

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

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

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

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

بينما المتحولات المحلية Local Variable تستهلك أقل الموارد.
ettahrim
01-31-2012, 12:25 PM
بسم الله الرحمن الرحيم


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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

لنعد إلى الكود الفارغ الذي أنشئناه في الدرس الثاني وهو كالتالي:

//+------------------------------------------------------------------+
//| Candle Length.mq4 |
//| Copyright © 2006, eng waddah attar |
//|

[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ] |
//+------------------------------------------------------------------+
#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 والذي مهمته تحديد خصائص المؤشر.

والأمر الكامل هو:

#property indicator_buffers 2


بواسطة الأمر السابق حددنا للمترجم ( Compiler ) أن عدد الخطوط هو اثنان.

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

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

والأمر الكامل هو:

#property indicator_color1 Green
#property indicator_color2 Red


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

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

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

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

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

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

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

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

ويصبح الكود النهائي على الشكل التالي:

//+------------------------------------------------------------------+
//| Candle Length.mq4 |
//| Copyright © 2006, eng waddah attar |
//|

[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ] |
//+------------------------------------------------------------------+
#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 ) بالمصفوفة المطلوبة ويكون تنفيذ الأمر بالنسبة لمؤشرنا على الشكل التالي:

SetIndexBuffer(0,BufLength1);
SetIndexBuffer(1,BufLength2);

لهذه الوظيفة مدخلين فقط الأول هو رقم الذاكرة الوسيطة ( 0 - 7 ).

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

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

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


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

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

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

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

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

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

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

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

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


نحن سنحدد أن نوع رسم الخط هو خطوط عمودية HISTOGRAM وستكون الأوامر على الشكل التالي:

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

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

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

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

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

ويصبح الكود النهائي للمؤشر الحالي على الشكل التالي:

//+------------------------------------------------------------------+
//| Candle Length.mq4 |
//| Copyright © 2006, eng waddah attar |
//| [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ] |
//+------------------------------------------------------------------+
#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()
{
//----
ettahrim
01-31-2012, 12:29 PM
بسم الله الرحمن الرحيم

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

مثال (1)

for (int i=1;i<=10;i++)
{
Print;
}
الحلقة السابقة تعرف العداد على أنه متحول رقمي صحيح يبدأ من الواحد.

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

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

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

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

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

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

مثال (2)

for (int i=5;i<=100;i++)
{
Print;
}

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


مثال (3)

for (int i=0;i<50;i=i+2)
{
Print;
}

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


مثال (4)

for (int xx=10;xx>0;xx--)
{
Print(xx);
}
المثال السابق لحلقة عكسية تبدأ من العشرة وتنتهي بالواحد ( لاحظ الشرط كيف أصبح )

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

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

مثال (5)

for (double i=0.1;i<=1;i=i+0.1)
{
Print;
}

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



مثال (6)

double i;
for (i=0.1;i<=1;i=i+0.1)
{
Print;
}
المثال السابق نفس الذي يسبقه تماما ولكني عرفت المتحول من خارج جسم الحلقة وليس من داخل الحلقة.


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

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

ولكن لا أريد منكم الآن إلا أن تفهموا أبسط استخدام للحلقات البسيطة.
ettahrim
01-31-2012, 12:33 PM
بعد أن شرحنا مفهوم الحلقات البرمجي يمكننا الآن أن نستمر في بناء مؤشرنا الجديد.

لنراجع آخر كود وصلنا إليه:

//+------------------------------------------------------------------+
//| Candle Length.mq4 |
//| Copyright © 2006, eng waddah attar |
//| [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ] |
//+------------------------------------------------------------------+
#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()
{
//----

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

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

الحلقة ستكون على الشكل التالي:

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

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

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

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

سوف نضيف جسم الحلقة إلى الكود ونحذف السطر:

int counted_bars=IndicatorCounted();

لأننا سنشرحه فيما بعد.


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

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

BufLength1[i]=High[i]-Low[i];
أي أننا سنضع في الحجرة الأولى للمصفوفة BufLength1 وهي التي لها رقم صفر.

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

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

ستصبح الحلقة على الشكل التالي:

for(int i=0;i<Bars;i++)
{
BufLength1[i]=High[i]-Low[i];
}

وسيصبح المثال على الشكل التالي :

//+------------------------------------------------------------------+
//| Candle Length.mq4 |
//| Copyright © 2006, eng waddah attar |
//| [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ] |
//+------------------------------------------------------------------+
#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()
{
//----
ettahrim
01-31-2012, 12:40 PM
بسم الله الرحمن الرحيم

في هذا الدرس سنتكلم عن الشروط 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 كما يلي:

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

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

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


عودة لمؤشرنا ولنتذكر هنا آخر كود وصلنا إليه:

//+------------------------------------------------------------------+
//| Candle Length.mq4 |
//| Copyright © 2006, eng waddah attar |
//| [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ] |
//+------------------------------------------------------------------+
#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 كالتالي:

if(Close[i]>Open[i])
{
BufLength2[i]=Close[i]-Open[i];
}
else
{
BufLength2[i]=Open[i]-Close[i];
}

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

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

وتصبح كتلة الوظيفة start كالتالي:

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 ليصبح موجبا ويكون الكود كالتالي:

LL=Close[i]-Open[i];
if(LL<0)
{
LL=-1*LL;
}
BufLength2[i]=LL;
وتصبح كتلة الوظيفة start كالتالي:

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 وهي تعطينا القيمة المطلقة ( الموجبة ) لأي رقم سالب أو موجب.

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

Print(MathAbs(-5));
سيتم طباعة 5

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

ويصبح الكود على الشكل التالي:

//+------------------------------------------------------------------+
//| Candle Length.mq4 |
//| Copyright © 2006, eng waddah attar |
//| [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ] |
//+------------------------------------------------------------------+
#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 تقوم بحساب الجذر التربيعي للرقم المدخل.

كل الوظائف الحسابية السابقة مدخلاتها عبارة عن الرقم الذي نريد حساب الشيء عليه والخرج دائما هو النتيجة.
ettahrim
01-31-2012, 12:42 PM
الوظيفة MathRound تقرب الأرقام العشرية

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

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

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


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

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

مثلا 8.9 تصبح 8

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


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

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

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

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

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

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

والآن سنضيف الخاصية الجديدة لمؤشرنا أعلى الكود مع باقي الخصائص الأخرى على الشكل التالي:

#property indicator_minimum 0
نكتب اسم الخاصية ثم مسافة ثم القيمة ولا نضع أي فواصل من أي نوع.

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

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

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


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

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

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

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

ويتم تحديد قيمته على الشكل التالي:

#property indicator_level1 0.0020


الكود السابق أضاف لنا مستوى عند القيمة 0.0020 للمؤشر أي عند مستوى 20 نقطة.

كم يمكننا إضافة مستوى آخر عند القيمة 0.0040 مثلا بواسطة الكود:

#property indicator_level2 0.0040

كما يمكن لنا بواسطة الخصائص indicator_levelcolor و indicator_levelwidth و indicator_levelstyle التحكم بلون وسماكة وطريقة رسم المستويات على التوالي.

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


كما يرجى ملاحظة أن بعض التغييرات في بعض الخصائص قد يضطرك إلى إزالة المؤشر من على الشارت ثم إعادته من جديد لتظهر هذه التغييرات.
ettahrim
01-31-2012, 12:49 PM
بسم الله الرحمن الرحيم

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

اسم الوظيفة هو iMA ولها البارامترات التالية:

double iMA(string symbol, int timefra me, int period, int ma_shift, int ma_method, int applied_price, int 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.

يمكن أيضا كتابة ثوابت خاصة حسب الجدول المرفق:

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 : وهو قيمة رقمية تحدد نوع السعر الذي سيطبق عليه حساب المتوسط. هل هو سعر الإغلاق أو الفتح أو الأعلى وهكذا.

وهو له القيم التالية:

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 : وهو قيمة رقمية تحدد رقم الشمعة على الشارت الذي سنحسب لها المتوسط المتحرك.

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

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


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

double myMA;
myMA=iMA(Symbol(),0,14,0,MODE_SMA,PRICE_CLOSE,0);

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

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

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

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

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

اسم وظيفته هي iBands ولها الصيغة التالية:

double iBands( string symbol, int timef rame, int period, int deviation, int bands_shift, int
applied_price, int mode, int 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

وله الصيغة التالية:

double iADX( string symbol, int time*****, int period, int applied_price, int mode, int shift)

كل البارامترات السابقة مشروحة ولها نفس المعنى
ولكن الفرق هي في قيم البارامتر mode حيث تأخذ القيم التالية:

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

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

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

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

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

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

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

فمثلا المتحول

double MyNum=6;


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

extern double MyNum=6;


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

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

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

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

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

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

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

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

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

والكود هو التالي:

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

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

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

مثال:

IndicatorShortName("Indicator Name : Period= " + MyPeriod );

حيث من المفروض أن تكون MyPeriod خاصية معرفة ولها قيمة.
ettahrim
01-31-2012, 12:56 PM
بسم الله الرحمن الرحيم

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

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

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

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

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

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

هذا الخط هو بكل بساطة عبارة عن الفرق بين الخط العلوي للبولنغر وبين الخط السفلي له.

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

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

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

فكرت في إضافة مؤشر آخر وكان اختياري هو الماكد لمعرفة الاتجاه الحالي.

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

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

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

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

فكلما زادت الحساسية زادت المخاطرة والعكس صحيح.

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

طبعا في البداية هي فكرة تم تطويرها على مراحل.

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

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

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

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

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

و هبوط هذه الخطوط مرة أخرى تحته هي نهاية الانفجار.


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

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


والآن نأتي للكود مع الشرح.

القسم الأول:

//+------------------------------------------------------------------+
//| Waddah_Attar_Explosion.mq4 |
//| Copyright © 2006, Eng. Waddah Attar |
//| [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ] |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Eng. Waddah Attar"
#property link "[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]"
//----
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_color3 Sienna
#property indicator_color4 Blue
#property indicator_minimum 0.0

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

وبما أن عملنا هو في القسم الموجب فقط فقد حددنا المجال الأدنى للمؤشر بصفر.


القسم الثاني:

extern int Sensetive = 150;
extern int DeadZonePip = 30;
extern int ExplosionPower = 15;
extern int TrendPower = 15;
extern bool AlertWindow = true;
extern int AlertCount = 500;
extern bool AlertLong = true;
extern bool AlertShort = true;
extern bool AlertExitLong = true;
extern bool AlertExitShort = true;
هذه هي خصائص المؤشر العامة الحساسية ومقدار المجال الميت.

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

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

وقوة الميل هي نسبة الزيادة لعمود الماكد الأخير عن الخط الذي يسبقه.

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

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

ويستطيع المستخدم تغيير هذه القيم حسب درجة مخاطرته التي يريدها.

الخصائص المتبقية هي خصائص التنبيه بحيث يقوم المؤشر آليا بتنبيه المستخدم لبدء حدوث الانفجار في كلا الاتجاهين.

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

القسم الثالث:

double ind_buffer1[];
double ind_buffer2[];
double ind_buffer3[];
double ind_buffer4[];
//----
int LastTime1 = 1;
int LastTime2 = 1;
int LastTime3 = 1;
int LastTime4 = 1;
int Status = 0, PrevStatus = -1;
double bask, bbid;
تعريف المصفوفات وبعض المتحولات التي ستلزمنا في عمل نظام التنبيهات.


القسم الرابع:

int init()
{
SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, 2);
SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID, 2);
SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 2);
SetIndexStyle(3, DRAW_LINE, STYLE_DOT, 1);
//----
SetIndexBuffer(0, ind_buffer1);
SetIndexBuffer(1, ind_buffer2);
SetIndexBuffer(2, ind_buffer3);
SetIndexBuffer(3, ind_buffer4);
//----
IndicatorShortName("Waddah Attar Explosion: [S(" + Sensetive +
") - DZ(" + DeadZonePip + ") - EP(" + ExplosionPower +
") - TP(" + TrendPower + ")]");
Comment("copyright [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]");
return(0);
}

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

كذلك جعلنا المؤشر يظهر اسم المؤشر والخصائص التي اختارها المستخدم.


القسم الخامس:

int start()
{
// تعريف متحولات لوضع قيم مؤشرات الماكد والبولنغر وقوة كل منهما
double Trend1, Trend2, Explo1, Explo2, Dead;
double pwrt, pwre;
// حساب عدد الشمعات الجديدة فقط
int limit, i, counted_bars = IndicatorCounted();
//----
if(counted_bars < 0)
return(-1);
//----
if(counted_bars > 0)
counted_bars--;
limit = Bars - counted_bars;
// بدء الحلقة الرئيسية لحساب قيم خطوط المؤشر
for(i = limit - 1; i >= 0; i--)
{
// حساب قيمة الفرق بين الماكد للشمعة الحالية والشمعة التي تسبقها مباشرة وضرب الناتج في الحساسية لتكبير الإشارة
Trend1 = (iMACD(NULL, 0, 20, 40, 9, PRICE_CLOSE, MODE_MAIN, i) -
iMACD(NULL, 0, 20, 40, 9, PRICE_CLOSE, MODE_MAIN, i + 1))*Sensetive;

// نفس الحساب السابق ولكن للشمعة التي تسبقها
Trend2 = (iMACD(NULL, 0, 20, 40, 9, PRICE_CLOSE, MODE_MAIN, i + 2) -
iMACD(NULL, 0, 20, 40, 9, PRICE_CLOSE, MODE_MAIN, i + 3))*Sensetive;

// حساب الفرق بين خطي البولنغر للشمعة الحالية
Explo1 = (iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_UPPER, i) -
iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_LOWER, i));
// حساب نفس الفرق السابق ولكن للشمعة السابقة
Explo2 = (iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_UPPER, i + 1) -
iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_LOWER, i + 1));

// حساب قيمة المنطقة الميتة
Dead = Point * DeadZonePip;
// تصفير قيم المصفوفات
ind_buffer1[i] = 0;
ind_buffer2[i] = 0;
ind_buffer3[i] = 0;
ind_buffer4[i] = 0;

// رسم خطوط خضراء في حال كان اتجاه الماكد لأعلى
if(Trend1 >= 0)
ind_buffer1[i] = Trend1;
// رسم خطوط خضراء في حال كان الاتجاه لأسفل
if(Trend1 < 0)
ind_buffer2[i] = (-1*Trend1);
// رسم خط البولنغر
ind_buffer3[i] = Explo1;
// رسم الخط المنقط الأبيض للمنطقة الميتة
ind_buffer4[i] = Dead;
والشرح في نفس الكود.
ettahrim
01-31-2012, 12:57 PM
القسم السادس:

وهو الجزء الخاص بنظام التنبيهات Alerts
يعمل هذا النظام على تنبيه المستخدم في حال بدء انفجار سعري وفق الشروط التي حددها في خصائص المؤشر.

والشرح في الكود

// التأكد أننا في الشمعة رقم صفر والأخيرة حتى يعمل نظام التنبيهات
if(i == 0)
{
// في حال تحققت الشروط التالية يجب التنبيه:
// قيمة الترند الحالي أكبر من الصفر
// قيمة الترند الحالي أكبر من قيمة الانفجار
// قيمة الترند الحالي أكبر من المنطقة الميتة
// قيمة الانفجار أكبر من المنطقة الميتة
// الانفجار الحالي أكبر من الانفجار السابق
// الترند الحالي أكبر من السابق
// لم يتجاوز عدد مرات التنبيه
// المستخدم يريد تنبيه انفجارات الشراء
// السعر تغير حتى لا ينبهه بدون تغير في السعر
if(Trend1 > 0 && Trend1 > Explo1 && Trend1 > Dead &&
Explo1 > Dead && Explo1 > Explo2 && Trend1 > Trend2 &&
LastTime1 < AlertCount && AlertLong == true && Ask != bask)
{
// حساب قوة الترند وقوة الانفجار
pwrt = 100*(Trend1 - Trend2) / Trend1;
pwre = 100*(Explo1 - Explo2) / Explo1;
bask = Ask;
// قوة الانفجار أكبر من القوة المحددة وكذلك قوة الترند
if(pwre >= ExplosionPower && pwrt >= TrendPower)
{
// تفعيل التنبيه في حال كان المستخدم يريد تفعيل التنبيه بشكل عام
if(AlertWindow == true)
{
// إعطاء المستخدم معلومات عن الوضع الحالي للانفجار السعري
Alert(LastTime1, "- ", Symbol(), " - BUY ", " (",
DoubleToStr(bask, Digits) , ") Trend PWR " ,
DoubleToStr(pwrt,0), " - Exp PWR ", DoubleToStr(pwre, 0));
}
// حتى في حال لم يكن المستخدم يفعل نظام التنبيه أظهر له المعلومات عن طريق الطباعة
else
{
Print(LastTime1, "- ", Symbol(), " - BUY ", " (",
DoubleToStr(bask, Digits), ") Trend PWR ",
DoubleToStr(pwrt, 0), " - Exp PWR ", DoubleToStr(pwre, 0));
}
LastTime1++;
}
Status = 1;
}
// نفس الشرح السابق لتنبيه المستخدم عن صفقات البيع
if(Trend1 < 0 && MathAbs(Trend1) > Explo1 && MathAbs(Trend1) > Dead &&
Explo1 > Dead && Explo1 > Explo2 && MathAbs(Trend1) > MathAbs(Trend2) &&
LastTime2 < AlertCount && AlertShort == true && Bid != bbid)
{
pwrt = 100*(MathAbs(Trend1) - MathAbs(Trend2)) / MathAbs(Trend1);
pwre = 100*(Explo1 - Explo2) / Explo1;
bbid = Bid;
if(pwre >= ExplosionPower && pwrt >= TrendPower)
{
if(AlertWindow == true)
{
Alert(LastTime2, "- ", Symbol(), " - SELL ", " (",
DoubleToStr(bbid, Digits), ") Trend PWR ",
DoubleToStr(pwrt,0), " - Exp PWR ", DoubleToStr(pwre, 0));
}
else
{
Print(LastTime2, "- ", Symbol(), " - SELL ", " (",
DoubleToStr(bbid, Digits), ") Trend PWR " ,
DoubleToStr(pwrt, 0), " - Exp PWR ", DoubleToStr(pwre, 0));
}
LastTime2++;
}
Status = 2;
}
// تنبيه المستخدم للخروج من الشراء
if(Trend1 > 0 && Trend1 < Explo1 && Trend1 < Trend2 && Trend2 > Explo2 &&
Trend1 > Dead && Explo1 > Dead && LastTime3 <= AlertCount &&
AlertExitLong == true && Bid != bbid)
{
bbid = Bid;
if(AlertWindow == true)
{
Alert(LastTime3, "- ", Symbol(), " - Exit BUY ", " ",
DoubleToStr(bbid, Digits));
}
else
{
Print(LastTime3, "- ", Symbol(), " - Exit BUY ", " ",
DoubleToStr(bbid, Digits));
}
Status = 3;
LastTime3++;
}
// تنبيه المستخدم للخروج من البيع
if(Trend1 < 0 && MathAbs(Trend1) < Explo1 &&
MathAbs(Trend1) < MathAbs(Trend2) && MathAbs(Trend2) > Explo2 &&
Trend1 > Dead && Explo1 > Dead && LastTime4 <= AlertCount &&
AlertExitShort == true && Ask != bask)
{
bask = Ask;
if(AlertWindow == true)
{
Alert(LastTime4, "- ", Symbol(), " - Exit SELL ", " ",
DoubleToStr(bask, Digits));
}
else
{
Print(LastTime4, "- ", Symbol(), " - Exit SELL ", " ",
DoubleToStr(bask, Digits));
}
Status = 4;
LastTime4++;
}
PrevStatus = Status;
}
// تصفير العدادت في حال تغيرت حالة الصفقات
if(Status != PrevStatus)
{
LastTime1 = 1;
LastTime2 = 1;
LastTime3 = 1;
LastTime4 = 1;
}
}
return(0);
}
//+------------------------------------------------------------------+
أرجو أن تمخمخوا كثيرا في هذا الكود

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

فأي مؤشر يبدأ صغيرا وبسيطا ثم يزداد تعقيدا وصعوبة مع مرور الوقت وعمل التطويرات عليه.
ettahrim
01-31-2012, 01:03 PM
بسم الله الرحمن الرحيم

سنتكلم في هذا الدرس عن بعض الوظائف الهامة مع الشرح


- الوظيفة NormalizeDouble :

استخدام الوظيفة يكون على الشكل التالي:

NormalizeDouble(double value, int digits);


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

مثلا الرقم 1.298765 يمكن تحويله إلى 1.2987 أو إلى الرقم 1.29 وهكذا.

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

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

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

double A=(معادلة حسابية);
double myAsk = NormalizeDouble(A,Digits);
وكما تعلمنا سابقا فإن Digits تعطينا عدد الخانات العشرية المتبعة مع الزوج الحالي.

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

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



- الوظيفة DoubleToStr :

تستخدم هذه الوظيفة على الشكل التالي:

string DoubleToStr(double value, int digits);

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


- الوظيفة StrToDouble :

تستخدم على الشكل التالي

double StrToDouble(string value);

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

لأن الرقم النصي مثل "4.3445" لا يمكن التعامل معه رياضيا.

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


- الوظيفة StrToInteger :

تستخدم على الشكل التالي:

int StrToInteger(string value);

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


- الوظيفة StrToTime :

لها الاستخدام التالي:

datetime StrToTime(string value);

وهي تحول النص الذي يتضمن تاريخا مثل "2007.05.06 05:30" إلى قيمة في متحول زمني datetime.


الوظيفة TimeToStr :

لها الاستخدام التالي:

string TimeToStr(datetime value, int mode=TIME_DATE|TIME_MINUTES)

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

القيمة الافتراضية هي TIME_DATE|TIME_MINUTES أي أننا نريد تحويل النص الزمني إلى تاريخ وإلى دقائق بدون ثواني.

أما إذا وضعنا الثابت TIME_DATE|TIME_SECOND فهذا سيجعل القيمة النهائية تحتوي على ثواني أيضا.

مثال:

string var1=TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECOND S);


سينتج لنا نص يحتوي على التاريخ الحالي متضمنا الثواني أيضا.


- الوظيفة CharToStr :

لها الاستخدام التالي:

string CharToStr(int char_code);

مهمة هذه الوظيفة هي تحويل رقم صحيح من 0 - 255 إلى حرف وحيد.

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

وهذه الأرقام تعرف بجدول الآسكي ASCII .

فمثلا رمز المسافة هو 32 ورمز الحرف a هو 65 وهكذا.

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


كل الوظائف السابقة تسمى وظائف التحويلات ومهمتها التحويل بين أنواع المتحولات المختلفة وهي ضرورية جدا لعمل برامجنا في المستقبل.
ettahrim
01-31-2012, 01:12 PM
نكمل شرح بعض الوظائف الهامة الأخرى:

الوظائف الزمنية:

- الوظيفة Day :

هذه الوظيفة تعيد لنا قيمة اليوم كرقم فمثلا نحن الآن في التاريخ 16/7/2007 فإن قيمة ()Day ستكون 16.

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

- الوظيفة DayOfWeek :

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

يمكن مثلا وضع الشرط الحالي في اكسبيرت ما لكي لا يعمل في أيام العطل السبت والأحد.

// يجب عدم العمل في أيام العطل
if(DayOfWeek()==0 || DayOfWeek()==6) return(0);

- الوظيفة DayOfYear :

تعود لنا برقم اليوم بالنسبة للسنة الحالية بدءا من الرقم واحد لأول يوم في السنة انتهاء بالرقم 365 لآخر يوم في السنة.


- الوظيفة Hour :

تعيد لنا هذه الوظيفة رقم الساعة بالنسبة لليوم ابتداء من الرقم صفر للساعة 12 عند منتصف الليل وانتهاء بالرقم 23 للساعة 11 مساء.

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

int start()
{
if(Hour()<12 || Hour()>17) return(0);
......
}

- الوظيفة Minute :

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

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


- الوظيفة Month :

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


- الوظيفة Seconds:

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


- الوظيفة Year :

تعيد لنا رقما عبارة عن السنة الحالية فمثلا:

Print(Year());
// الناتج سيكون 2008

- الوظيفة TimeCurrent :

تعيد لنا آخر تاريخ ووقت حصل فيه تغير للسعر للزوج المستخدم على الشارت.


- الوظيفة TimeDay :

تعيد لنا رقم اليوم بالنسبة لتاريخ مدخل مثلا:

int day=TimeDay(D'2003.12.31');
// النتيجة ستكون 31
هذه الوظيفة مشابهة للوظيفة Day ولكنها تحتاج لتاريخ محدد.


- الوظائف TimeDayOfWeek TimeDayOfYear TimeHour TimeMinute TimeMonth TimeSeconds TimeYear :

نفس عمل الوظائف المشروحة سابقا والتي لها نفس الاسم بدون Time.

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



- الوظيفة TimeLocal :

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


والآن أصبح لديك كل الوظائف اللازمة للتعامل مع التاريخ والوقت وسنرى في الدروس القادمة أنها وظائف هامة فعلا وخصوصا عند تعاملنا مع الاكسبيرتات.
ettahrim
01-31-2012, 01:30 PM
بسم الله الرحمن الرحيم

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

الكائنات الرسومية هي ( مع أسمائها البرمجية ) :

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

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

- الخط الأفقي OBJ_HLINE:
وهو عبارة عن خط أفقي يرسم على كامل الشارت وله مثل خصائص الخط العمودي أعلاه.

وهو يحتاج فقط إلى السعر الذي سيرسم عليه الخط الأفقي.

- الخط المائل OBJ_TREND:
وهو خط الترند المعروف ويتم تحديده بنقطتين فقط. بحيث يكون لكل نقطة زمن وسعر.

وله أيضا نفس الخصائص الرسومية السابقة.

كما أن له أيضا خاصية جديدة هي Ray والتي تأخذ قيمتين هما true أو false.

في حال كانت true فإن خط الترند يرسم حتى يخرج من حدود الشارت.

في حال كانت false فإن خط الترند يرسم فقط بين النقطتين المحددتين.

- الخط المائل بزاوية OBJ_TRENDBYANGLE:
وهو مشابه للترند السابق ولكنه يرسم من نقطة واحدة فقط مع إعطائه زاوية معينة.

- نسب فيبوناتشي OBJ_FIBO:
وهي كائن فيبوناتشي المعروفة وترسم بتحديد نقطين فقط. وسيظهر الكائن على الشارت وفق الإعدادات الإفتراضية لمستوياته.

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

- المستطيل OBJ_RECTANGLE:
يتم رسم مستطيل على الشارت بتحديد نقطتين فقط بحيث تكون كل نقطة زمن وسعر.

- المثلث OBJ_TRIANGLE:
يتم رسم مثلث على الشارت بتحديد ثلاث نقط.

- القطع الناقص OBJ_ELLIPSE:
يتم رسمه بتحديد نقطتين فقط.

- الدائرة OBJ_CYCLES:
يتم رسمها أيضا بتحديد نقطتين فقط.

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

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

هذه الأسهم والأشكال مختلفة عن أسهم المؤشرات المتعارف عليها في رسم أسهم المؤشرات.

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

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


- مربع نص OBJ_TEXT:
لرسمه نحتاج فقط إلى نقطة واحدة مكونة من زمن وسعر. حيث دائما الزمن يكون محور X والسعر هو محور Y.



كل الكائنات الرسومية السابقة تعتمد على نقاط تموضع على الشارت مكونة من زمن X وسعر Y.

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

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

- بطاقة نص OBJ_LABEL:
لرسم هذه البطاقة التي تظهر لنا نصا داخلها بلون وخط محددين فإننا نحتاج إلى تحديد X و Y لها بالبيكسل.

والبيكسل هو أصغر نقطة ضوئية على الشاشة بالدقة المحددة مثلا 1024 × 768 بيكسل.

والنقطة صفر × صفر هي النقطة اليسارية العلوية من نافذة الشارت.

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

وكلما زدنا القيمة بالموجب فإن النقطة تنزل إلى الأسفل وتقترب من اليمين أكثر.

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

وهو حل جيد لمشكلة Comment التي واجهناها في السابق.

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

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

وسنرى بعد قليل كيف نستطيع جعل مؤشرنا يقوم برسم هذه الكائنات على الشارت آليا وفق آلية معينة

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

شرح الوظائف المستخدمة مع الكائنات الرسومية:

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

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

تستخدم الوظيفة ObjectCreate كالتالي:

bool ObjectCreate(string name, int type, int window, datetime time1, double price1, datetime time2=0, double price2=0, datetime time3=0, double price3=0)
البارامتر الأول هو اسم الكائن الرسومي البرمجي والذي من خلاله نستطيع تعديل صفاته الرسومية أو تغيير مكانه أو حتى حذفه.

وهو كما قلنا يجب ان يكون فريدا أي غير مكرر.

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

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

البارامترات الستة الباقية هو نقاط تمركز وتموضع هذا الكائن على الشارت.

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

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

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

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

مثال لرسم خط عمودي:

if (ObjectCreate("VerLine1",OBJ_VLINE,0, D'2007.07.25 12:30',0))
{
..... نجاح الوظيفة في رسم الخط العمودي
}
else
{
Print("Cant Draw VLINE");
}

الكود السابق يعني ارسم خط عمودي باسم VerLine1 على النافذة الأساسية في التاريخ 2007.07.25 12:30

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


مثال آخر لرسم الترند المرتكز على نقطتين:

ObjectCreate("Trend1",OBJ_TREND,0,Time[0],Low[0],Time[10],High[9]);

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



الوظيفة ObjectDelete:

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

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

فمثلا الكود التالي يحذف الكائن الرسومي الذي اسمه Trend1.

ObjectDelete("Trend1");
وهي تعود بقيمة true في حال نجحت في حذف الكائن أو false في حال فشلت.

والفشل يكون هنا في حال لم تعثر الوظيفة على كائن بهذا الاسم.


الوظيفة ObjectsDeleteAll:

هذه الوظيفة لها ثلاثة استخدامات:

1- تقوم هذه الوظيفة بحذف كل الكائنات الرسومية الموجودة على الشارت وذلك باستدعائها دون بارامترات مثل:

ObjectsDeleteAll();

- أو حذف كل الكائنات الرسومية من نافذة محددة ( صفر للرئيسية ثم واحد للفرعية وهكذا )

فمثلا المثال التالي يحذف كل الكائنات الرسومية الموجودة على النافذة الفرعية الأولى:

ObjectsDeleteAll(1);
- أو حذف كل الكائنات الرسومية التي لها نوع محدد من النافذة المحددة.

فمثلا الكود التالي يحذف كل الترندات المرسومة على النافذة الرئيسية للشارت:

ObjectsDeleteAll(0,OBJ_TREND);

الوظيفة ObjectFind:

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

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

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

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

int wi=ObjectFind("Trend1");
if (wi==-1)
{
Print ("الترند غير موجود");
}
else
{
Print("الترند موجود على النافذة رقم " ,wi);
}

الوظيفة ObjectTotal:

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

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

الوظيفة ObjectTotal تعطينا عدد الكائنات الرسومية الموجودة على الشارت.

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

Print("عدد كل الكائنات " , ObjectTotal());
Print("عدد الترندات فقط " , ObjectTotal(OBJ_TREND));
الوظيفة ObjectType:

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

فمثلا الكود التالي يعطينا نوع الكائن الرسومي الذي اسمه Line.

Print(ObjectType("Line"));
بقي شرح بسيط وننتهي من درس الكائنات الرسومية

الوظيفة ObjectSet :

هذه الوظيفة تقوم بتغيير مواصفات الكائن الرسومي على الشارت وتستخدم على الشكل التالي:

bool ObjectSet( string name, int index, double value)


البارامتر الأول هو اسم الكائن الرسومي الذي نريد تغيير إحدى خصائصه.

البارامتر الثاني هو رقم الخاصية التي نريد تغيير قيمتها.

البارامتر الثالث هي القيمة الجديدة للخاصية.

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

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

OBJPROP_PRICE1 1
لتغيير موقع الكائن السعري الأول.
OBJPROP_TIME2 2
لتغيير موقع الكائن الزمني الثاني.
OBJPROP_PRICE2 3
لتغيير موقع الكائن السعري الثاني.
OBJPROP_TIME3 4
لتغيير موقع الكائن الزمني الثالث.
OBJPROP_PRICE3 5
لتغيير موقع الكائن السعري الثالث.
OBJPROP_COLOR 6
لتغيير لون الكائن الرسومي.
OBJPROP_STYLE 7
لتغيير طريقة رسم الكائن الرسومي وهي تأخذ إحدى الحالات التالية: STYLE_SOLID, STYLE_DASH, STYLE_DOT,
STYLE_DASHDOT, STYLE_DASHDOTDOT
OBJPROP_WIDTH 8
لتغيير عرض وسماكة الخط وتأخذ قيم من 1 إلى 5 .
OBJPROP_BACK 9
لجعل الخلفية مصبوغة بالكامل أو مجرد حدود فقط.
OBJPROP_RAY 10
لتغيير خاصية RAY والتي تجعل الترند ممتدا إلى خارج الشارت أو فقط خط بين نقطيتن.
OBJPROP_ANGLE 13
لتغيير زاوية رسم الكائن الرسومي أو زاوية الاستدارة.
OBJPROP_ARROWCODE 14
لتغيير رمز السهم للكائن الرسومي الذي يظهر أشكال محددة أو أسهم.
OBJPROP_TIME*****S 15
لتغيير خاصية ظهور الكائن على بعض الفريمات فقط وليس كلها.OBJPROP_FONTSIZE 100
لتغيير حجم الفونت للكائنات التي تظهر نصا داخلها.
OBJPROP_CORNER 101
لتغيير زاوية تموضع كائن البطاقة النصية وهي تأخذ قيم من 0 إلى ثلاثة حيث الصفر هي الزاوية العلوية اليسارية للشارت وهكذا.
OBJPROP_XDISTANCE 102
لتغيير قيمة المحور X للكائن البطاقة النصية وهذه القيمة بالبيكسل.
OBJPROP_YDISTANCE 103
لتغيير قيمة المحور Y للكائن البطاقة النصية وهذه القيمة بالبيكسل.
OBJPROP_LEVELCOLOR 201
لتغيير ألوان مستويات الكائن الرسومي.
OBJPROP_LEVELSTYLE 202
لتغيير طريقة رسم خطوط المستويات.OBJPROP_LEVELWIDTH 203
لتغيير عرض خطوط المستويات.
أمثلة:

// لتغيير تموضع الكائن الزمني الأول
ObjectSet("MyTrend", OBJPROP_TIME1, Time[0]);
// لتغيير عرض خط الترند إلى 3
ObjectSet("MyTrend", OBJPROP_WIDTH, 3);
// لجعل الكائن يظهر فقط على الفريم ربع الساعة والساعة
ObjectSet("MyObject", OBJPROP_TIME*****S, OBJ_PERIOD_M15 | OBJ_PERIOD_H1);

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

في المصطلحات البرمجية فإن Set دائما تعني تغيير قيمة. و Get تعني الحصول على قيمة.

فمثلا لو أردنا معرفة عرض خط الترند الذي اسمه MyTrend فإننا نستخدم الكود التالي:

Print(ObjectGet("MyTrend", OBJPROP_WIDTH));
// النتيجة ستكون 3
وهي تستخدم نفس الجدول السابق تماما.

الوظيفة ObjectSetText:

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

وهي تقوم بتغيير النص الظاهر عليهما مع تحديد لحجم واسم ولون الخط المستخدم.

وهي تستخدم على الشكل التالي:

bool ObjectSetText( string name, string text, int font_size, string font=NULL, color text_color=CLR_NONE)
وطريقة استخدامها واضحة جدا والمثال التالي يشرح بشكل أفضل:

ObjectSetText("text_object", "Hello world!", 10, "Times New Roman", Green);
مؤشر Waddah Attar Strong Level بنسخته القديمة مثال جيد عن التعامل مع الكائنات الرسومية .

والشرح الخاص بها موجود في نص الكود التالي:

#property copyright "Copyright © 2007, Waddah Attar"
#property link [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
//----
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 Red
#property indicator_color2 Green
#property indicator_color3 Blue
#property indicator_color4 Red
#property indicator_color5 Green
#property indicator_color6 Blue
#property indicator_color7 Orange
#property indicator_color8 Orange
extern bool BackTest=false;
extern bool DrawMonth=true;
extern bool DrawWeek=true;
extern bool DrawDay=true;
extern bool DrawH4=false;
//---- buffers
double P1Buffer[];
double P2Buffer[];
double P3Buffer[];
double P4Buffer[];
double P5Buffer[];
double P6Buffer[];
double P7Buffer[];
double P8Buffer[];
//----
int levelPeriod1 = PERIOD_D1;
int levelPeriod2 = PERIOD_H4;
int levelPeriod3 = PERIOD_W1;
int levelPeriod4 = PERIOD_MN1;
bool FixSunday;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
SetIndexBuffer(0, P1Buffer);
SetIndexBuffer(1, P2Buffer);
SetIndexBuffer(2, P3Buffer);
SetIndexBuffer(3, P4Buffer);
SetIndexBuffer(4, P5Buffer);
SetIndexBuffer(5, P6Buffer);
SetIndexBuffer(6, P7Buffer);
SetIndexBuffer(7, P8Buffer);
//----
SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 1);
SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 3);
SetIndexStyle(3, DRAW_LINE, STYLE_SOLID, 2);
SetIndexStyle(4, DRAW_LINE, STYLE_SOLID, 1);
SetIndexStyle(5, DRAW_LINE, STYLE_SOLID, 3);
SetIndexStyle(6, DRAW_LINE, STYLE_SOLID, 4);
SetIndexStyle(7, DRAW_LINE, STYLE_SOLID, 4);
//----
Comment("Strong Level By eng.Waddah Attar ");
FixSunday=false;
for(int i = 0; i <7; i++)
{
if (TimeDayOfWeek(iTime(Symbol(),PERIOD_D1,i))==0)
{
FixSunday=true;
}
}
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{

// تنظيف الشارت من الكائنات الرسومية التي ولدها هذا المؤشر وهي عملية ضرورية لمؤشر احترافي
// والحذف يكون طبعا فقط للكائنات الخاصة به وليس حذف عام
ObjectDelete("level1");
ObjectDelete("txtlevel1");
ObjectDelete("level2");
ObjectDelete("txtlevel2");
ObjectDelete("level3");
ObjectDelete("txtlevel3");
ObjectDelete("level4");
ObjectDelete("txtlevel4");
ObjectDelete("level5");
ObjectDelete("txtlevel5");
ObjectDelete("level6");
ObjectDelete("txtlevel6");
ObjectDelete("level7");
ObjectDelete("txtlevel7");
ObjectDelete("level8");
ObjectDelete("txtlevel8");
//----
Comment("");
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
if(DrawDay) DrawPeriod1();
if(DrawH4) DrawPeriod2();
if(DrawWeek) DrawPeriod3();
if(DrawMonth) DrawPeriod4();
if (BackTest==false)
{
for(int i=1; i < Bars; i++)
{
P1Buffer[i]=P1Buffer[0];
P2Buffer[i]=P2Buffer[0];
P3Buffer[i]=P3Buffer[0];
P4Buffer[i]=P4Buffer[0];
P5Buffer[i]=P5Buffer[0];
P6Buffer[i]=P6Buffer[0];
P7Buffer[i]=P7Buffer[0];
P8Buffer[i]=P8Buffer[0];
}
}
return(0);
}

int DrawPeriod1()
{
int i, ii, counted_bars = IndicatorCounted();
double c1, c2, dc;
string TrendType;
//---- check for possible errors
if(counted_bars < 0)
return(-1);
//---- last counted bar will be recounted
if(counted_bars > 0)
counted_bars--;
int limit = Bars - counted_bars;
//----
for(i = limit - 1; i >= 0; i--)
{
ii = iBarShift(Symbol(), levelPeriod1, Time[i],true);
if (TimeDayOfWeek(Time[i])==1 && FixSunday==true)
{
ii=ii+1;
}
if(ii != -1)
{
c1 = iClose(Symbol(), levelPeriod1, ii + 1);
c2 = iClose(Symbol(), levelPeriod1, ii + 2);
//----
dc = c1 - c2;
//----
if(dc == 0)
{
c2 = iClose(Symbol(), levelPeriod1, ii + 3);
}
//----
dc = c1 - c2;
//----
if(dc == 0)
{
dc = c1;
}
//----
P1Buffer[i] = c1-dc;
P4Buffer[i] = c1+dc;
if (P1Buffer[i]<P4Buffer[i])
{
TrendType="Day Up ";
}
else
{
TrendType="Day Down ";
}

// عملت وظيفتين تختصر الكثير من كتابة الكود لوضع كائن سعري وكائن نصي
SetPrice("level1", Time[i],P1Buffer[i], Red);
SetText("txtlevel1", TrendType, Time[i], P1Buffer[i], Red);

SetPrice("level4", Time[i],P4Buffer[i], Red);
SetText("txtlevel4", TrendType, Time[i], P4Buffer[i], Red);
//----
}
}
//----
return(0);
}
int DrawPeriod2()
{
int i, ii, counted_bars = IndicatorCounted();
double c1, c2, dc;
string TrendType;
//---- check for possible errors
if(counted_bars < 0)
return(-1);
//---- last counted bar will be recounted
if(counted_bars > 0)
counted_bars--;
int limit = Bars - counted_bars;
//----
for(i = limit - 1; i >= 0; i--)
{
ii = iBarShift(Symbol(), levelPeriod2, Time[i],true);
if(ii != -1)
{
c1 = iClose(Symbol(), levelPeriod2, ii + 1);
c2 = iClose(Symbol(), levelPeriod2, ii + 2);
//----
dc = c1 - c2;
//----
if(dc == 0)
{
c2 = iClose(Symbol(), levelPeriod2, ii + 3);
}
//----
dc = c1 - c2;
//----
if(dc == 0)
{
dc = c1;
}
//----
P2Buffer[i] = c1-dc;
P5Buffer[i] = c1+dc;
if (P2Buffer[i]<P5Buffer[i])
{
TrendType="H4 Up ";
}
else
{
TrendType="H4 Down ";
}
SetPrice("level2", Time[i],P2Buffer[i], Green);
SetText("txtlevel2", TrendType, Time[i], P2Buffer[i], Green);
SetPrice("level5", Time[i],P5Buffer[i], Green);
SetText("txtlevel5", TrendType, Time[i], P5Buffer[i], Green);
//----
}
}
//----
return(0);
}
int DrawPeriod3()
{
int i, ii, counted_bars = IndicatorCounted();
double c1, c2, dc;
string TrendType;
//---- check for possible errors
if(counted_bars < 0)
return(-1);
//---- last counted bar will be recounted
if(counted_bars > 0)
counted_bars--;
int limit = Bars - counted_bars;
//----
for(i = limit - 1; i >= 0; i--)
{
ii = iBarShift(Symbol(), levelPeriod3, Time[i],true);
if(ii != -1)
{
c1 = iClose(Symbol(), levelPeriod3, ii + 1);
c2 = iClose(Symbol(), levelPeriod3, ii + 2);
//----
dc = c1 - c2;
//----
if(dc == 0)
{
c2 = iClose(Symbol(), levelPeriod3, ii + 3);
}
//----
dc = c1 - c2;
//----
if(dc == 0)
{
dc = c1;
}
//----
P3Buffer[i] = c1-dc;
P6Buffer[i] = c1+dc;
if (P3Buffer[i]<P6Buffer[i])
{
TrendType="Week Up ";
}
else
{
TrendType="Week Down ";
}
SetPrice("level3", Time[i],P3Buffer[i], Blue);
SetText("txtlevel3", TrendType, Time[i], P3Buffer[i], Blue);
SetPrice("level6", Time[i],P6Buffer[i], Blue);
SetText("txtlevel6", TrendType, Time[i], P6Buffer[i], Blue);
//----
}
}
//----
return(0);
}
int DrawPeriod4()
{
int i, ii, counted_bars = IndicatorCounted();
double c1, c2, dc;
string TrendType;
//---- check for possible errors
if(counted_bars < 0)
return(-1);
//---- last counted bar will be recounted
if(counted_bars > 0)
counted_bars--;
int limit = Bars - counted_bars;
//----
for(i = limit - 1; i >= 0; i--)
{
ii = iBarShift(Symbol(), levelPeriod4, Time[i],true);
if(ii != -1)
{
c1 = iClose(Symbol(), levelPeriod4, ii + 1);
c2 = iClose(Symbol(), levelPeriod4, ii + 2);
//----
dc = c1 - c2;
//----
if(dc == 0)
{
c2 = iClose(Symbol(), levelPeriod4, ii + 3);
}
//----
dc = c1 - c2;
//----
if(dc == 0)
{
dc = c1;
}
//----
P7Buffer[i] = c1-dc;
P8Buffer[i] = c1+dc;
if (P7Buffer[i]<P8Buffer[i])
{
TrendType="Month Up ";
}
else
{
TrendType="Month Down ";
}
SetPrice("level7", Time[i],P7Buffer[i], Orange);
SetText("txtlevel7", TrendType, Time[i], P7Buffer[i], Orange);
SetPrice("level8", Time[i],P8Buffer[i], Orange);
SetText("txtlevel8", TrendType, Time[i], P8Buffer[i], Orange);
//----
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+

// هذه الوظيفة لوضع كائن سعري
// نعطيها اسم الكائن والزمن والسعر واللون
void SetPrice(string name, datetime Tm, double Prc, color clr)
{
// في حال عدم وجود الكائن فيجب إنشائه للمرة الأولى
if(ObjectFind(name) == -1)
{
ObjectCreate(name, OBJ_ARROW, 0, Tm, Prc);
ObjectSet(name, OBJPROP_COLOR, clr);
ObjectSet(name, OBJPROP_WIDTH, 1);
ObjectSet(name, OBJPROP_ARROWCODE, SYMBOL_RIGHTPRICE);
}
else
{
// أما في حال وجوده سابقا فيجب تعديل مواصفاته فقط
ObjectSet(name, OBJPROP_TIME1, Tm);
ObjectSet(name, OBJPROP_PRICE1, Prc);
ObjectSet(name, OBJPROP_COLOR, clr);
ObjectSet(name, OBJPROP_WIDTH, 1);
ObjectSet(name, OBJPROP_ARROWCODE, SYMBOL_RIGHTPRICE);
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+

// هذه الوظيفة تنشيء كائن نصي باسم محدد ونص محدد وموقع هذا الكائن ولونه
void SetText(string name,string txt,datetime Tm,double Prc,color clr)
{
// في حال عدم وجوده قم بإنشائه بالمواصفات المحدد
if(ObjectFind(name) == -1)
{
ObjectCreate(name, OBJ_TEXT, 0, Tm, Prc);
ObjectSetText(name, txt, 10, "Times New Roman", clr);
ObjectSet(name, OBJPROP_CORNER, 2);
}
else
{
// في حال وجوده غير خصائصه فقط
ObjectSet(name, OBJPROP_TIME1, Tm);
ObjectSet(name, OBJPROP_PRICE1, Prc);
ObjectSetText(name, txt, 10, "Times New Roman", clr);
ObjectSet(name, OBJPROP_CORNER, 2);
}
}
//+------------------------------------------------------------------+
ettahrim
01-31-2012, 03:21 PM
دورة صناعة الاكسبيرتات

مقدمة عن الاكسبيرتات:

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

ونحن نلجأ عادة للاكسبيرتات في حالات معينة مثل:

- عدم القدرة على المتابعة اللصيقة للشاشة.

- عدم القدرة على مجاراة السرعة التي تتطلبها الاستراتيجية.

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

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

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

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

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

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



الشروط الواجب توفرها في الاكسبيرت:

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

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

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

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

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

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

- أن يكون متضمنا فيه معالجة للمخاطرة المطلوبة وأن لا يتجاوزها بأي حال من الأحوال.


الفرق بين المؤشر والاكسبيرت:

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

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

- المؤشر يعمل دائما حتى في حال كان البرنامج غير متصل بالانترنت بينما الاكسبيرت لا يعمل إلا إذا كان البرنامج متصلا بالانترنت.

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

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



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

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

ثانيا يجب فحص الاكسبيرت على أربع مراحل:

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

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

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

-- الرابعة: فحص الاكسبيرت على حساب حقيقي مع مراقبة لصيقة له في البداية.




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

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



لنبدأ على بركة الله


فكرة الاكسبيرت التي سننفذها هي:

مع بداية كل يوم جديد في الساعة 12 ليلا يقوم الاكسبيرت بفتح صفقتين معلقتين بالشروط التالية:

- صفقة شراء فوق سعر الإغلاق لليوم المنتهي بعدد محدد من النقاط وبهدف محدد ووقف محدد.

- صفقة بيع تحت سعر الإغلاق لليوم المنتهي بعدد محدد من النقاط وبهدف محدد ووقف محدد.

- في حال تفعلت صفقة الشراء فإنه يقوم بحذف صفقة البيع المعلقة آليا.

- في حال تفعلت صفقة البيع فإنه يقوم بحذف صفقة الشراء المعلقة آليا.

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


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

مع بداية كل يوم جديد في الساعة 12 ليلا يقوم الاكسبيرت بفتح صفقتين معلقتين بالشروط التالية:

- صفقة شراء فوق سعر الإغلاق لليوم المنتهي بعدد محدد من النقاط وبهدف محدد ووقف محدد.

- صفقة بيع تحت سعر الإغلاق لليوم المنتهي بعدد محدد من النقاط وبهدف محدد ووقف محدد.

- في حال تفعلت صفقة الشراء فإنه يقوم بحذف صفقة البيع المعلقة آليا.

- في حال تفعلت صفقة البيع فإنه يقوم بحذف صفقة الشراء المعلقة آليا.

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


خصائص الاكسبيرت الجديد:

- اسمه هو Buy_Sell_Day

- له خاصية Step وهي عدد النقاط التي تعلو أو تدنو من سعر الإغلاق لليوم السابق.

- له خاصية Takeprofit وهي عدد نقاط الربح.

- له خاصية Stoploss وهي نقاط الوقف.

- له خاصية Lots وهي حجم اللوتات لكل صفقة.



والآن لنحلل طريقة عمل الاكسبيرت بطريقة برمجية تحليلية:

- يفحص الاكسبيرت هل دخل يوم جديد.

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

- يضيف الاكسبيرت الصفقات المعلقة بالشروط المحددة.

- يفحص الآن في كل مرة هل تفعلت إحدى الصفقتين أم لا.

- في حال تفعلت صفقة فيجب حذف الصفقة المعلقة الأخرى.

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


والآن إلى الكود.


نبدأ بالويزارد الخاص بعمل اكسبيرت من برنامج الميتاإيديتور.

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

//+------------------------------------------------------------------+
//| Byu_Sell_Day.mq4 |
//| Copyright © 2007, [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ] |
//| [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ] |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, www.****forex.net"
#property link "http://www.****forex.net"
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
نكتب الخصائص التالية للاكسبيرت مع القيم الافتراضية:

extern int Step=20;
extern int Takeprofit=50;
extern int Stoploss=50;
extern double Lots=1;

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

int Magicnumber=234561;

لا يوجد شيء نعمله في الوظيفية init والوظيفة deinit

عملنا كله سيكون في الوظيفة start وسوف نضيف نحن وظائف خاصة مساعدة.

إن فتح الصفقات يكون دائما في الساعة 0 أي الساعة 12 صباحا ولذلك لن يفتح الاكسبيرت أي صفقة بعد الساعة 12 صباحا.

لذلك فإن كود فتح الصفقات المعلقة سيكون على الشكل التالي:

int start()
{
if(Hour()==0 && Minute()>5 && MyOrdersTotal(Magicnumber)==0)
{
double DayClose=iClose(Symbol(),PERIOD_D1,1);
double BuyPrice=DayClose+Step*Point;
double BuyTP=BuyPrice+Takeprofit*Point;
double BuySL=BuyPrice-Stoploss*Point;

double SellPrice=DayClose-Step*Point;
double SellTP=SellPrice-Takeprofit*Point;
double SellSL=SellPrice+Stoploss*Point;

OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyPrice,3,BuyS L,BuyTP,"",Magicnumber,0,Green);
OrderSend(Symbol(),OP_SELLSTOP,Lots,SellPrice,3,Se llSL,SellTP,"",Magicnumber,0,Green);
}
return(0);
}

في شرط فتح الصفقات المعلقة وضعنا ثلاثة شروط:

الأول أن الساعة 0 وتعني أن 12 ليلا قد دخلت وأن يوما جديدا قد بدأ.

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

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

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

هذه الوظيفة لها الكود التالي:

int MyOrdersTotal(int Magic)
{
int c=0;
int total = OrdersTotal();

for (int cnt = 0 ; cnt < total ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol())
{
c++;
}
}
return(c);
}
وهي تقوم بعد الصفقات المفتوحة المنفذة أو المعلقة وتعود لنا بقيمة تمثل عدد الصفقات الخاصة بالاكسبيرت فقط.


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

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

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

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

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

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

ونحن نريد الشمعة التي قبلها ورقمها واحد وهي تمثل الشمعة اليومية لليوم المنتهي.

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

ثم أرسلنا هذه المعلومات للوظيفة OrderSend.
بسم الله الرحمن الرحيم

نكمل ما بدأنا به مع الاكسبيرت السابق

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

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

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

البيع والشراء الفوري يعني من السعر الحالي ( آخر سعر للزوج )

ويكون الشراء من سعر الطلب Ask والبيع من سعر العرض Bid

الشراء المعلق له نوعان :

الأول شراء محدود Buy Limit ويكون من سعر أدنى من السعر الحالي.

وهو النوع من الصفقات الذي تضعه على دعم تتوقع أن يرتد منه السعر.

الثاني شراء وقف Buy Stop ويكون من سعر أعلى من السعر الحالي.

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

البيع المعلق له نوعان أيضا:

الأول بيع محدود Sell Limit ويكون من سعر أعلى من السعر الحالي.

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

الثاني بيع وقف Sell Stop ويكون من سعر أدنى من السعر الحالي.

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

وهذه الوظيفة لها البارامترات التالية :

int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double
takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)

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

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

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

أو يمكن أن السوق مقفل أو السيرفر مشغول وهكذا.

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

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

وهي متحول نصي نكتب فيه "GBPUSD" مثلا أو نقوم بدلا من ذلك بوضع المتحول Symbol

والذي يحتوي اسم الزوج الذي يعمل عليه الاكسبيرت حاليا وهي الطريقة المتبعة غالبا .

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

البارامتر الثاني هو نوع الصفقة التي نريد اجرائها على الزوج المحدد وهو له هذه القيم :

OP_BUY == 0 ==Buying position. == شراء فوري
OP_SELL == 1 ==Selling position. == بيع فوري
OP_BUYLIMIT == 2 ==Buy limit pending position. == شراء معلق من سعر أدنى من السعر الحالي
OP_SELLLIMIT == 3 ==Sell limit pending position. == بيع معلق من سعر أعلى من السعر الحالي
OP_BUYSTOP == 4 ==Buy stop pending position. == شراء معلق من سعر أعلى من السعر الحالي
OP_SELLSTOP == 5 ==Sell stop pending position. == بيع معلق من سعر أدنى من السعر الحالي
يمكن وضع اسم المتحول OP_BUY أو وضع القيمة المناسبة له وهي صفر والأولى طبعا هو كتابة اسم المتحول لسهولة قراء الكود.

البارامتر الثالث هو حجم العقد أو اللوت لهذه الصفقة ويمثل الرقم 1 لوت واحد أما الرقم 0.1 فيمثل ميني لوت
فلو أردنا شراء ثلاثة عقود كبيرة و ثلاثة عقود ميني فإن الرقم سيكون 3.3 وهكذا

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

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

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

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

فلو فرضنا أننا أردنا الشراء عند السعر 1.9654 بتسامح قدره 3 نقاط فإن مجال الشراء المسموح هو من 1.9654 إلى 1.9657

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

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

فلو فرضنا أن العملية شراء بوقف 50 نقطة فيجب أن يكون سعر الوقف مساويا لسعر الشراء ناقص 50 نقطة والمعادلة ستكون على الشكل التالي:

Ask-Stoploss*Point

حيث المتحول Stoploss يساوي الخمسين وقد تم ضربه بالقيمة Point لتحويله إلى رقم عشري مناسب لسعر الزوج .

مثلا المتحول Ask يساوي 1.9525 فإن وقف الخسارة سيكون 1.9525 - 50 * 0.0001 = 1.9475

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

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

Ask+Takeprofit*Point

وله نفس شرح الوقف سابقا

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

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

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

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

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

وهذا مثال عن تنفيذ صفقة شراء

int ticket;
if(iRSI(NULL,0,14,PRICE_CLOSE,0)<25)
{
ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Ask-25*Point,Ask+25*Point,"My order #2",16384,0,Green);
if(ticket<0)
{
Print("OrderSend failed with error #",GetLastError());
return(0);
}
}
الاكسبيرت الجديد حاليا يقوم بفتح الصفقات المعلقة يوميا.

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

الكود الحالي للوظيفة start هي على الشكل التالي:

int start()
{
if(Hour()==0 && Minute()>5 && MyOrdersTotal(Magicnumber)==0)
{
double DayClose=iClose(Symbol(),PERIOD_D1,1);
double BuyPrice=DayClose+Step*Point;
double BuyTP=BuyPrice+Takeprofit*Point;
double BuySL=BuyPrice-Stoploss*Point;

double SellPrice=DayClose-Step*Point;
double SellTP=SellPrice-Takeprofit*Point;
double SellSL=SellPrice+Stoploss*Point;

OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyPrice,3,BuyS L,BuyTP,"",Magicnumber,0,Green);
OrderSend(Symbol(),OP_SELLSTOP,Lots,SellPrice,3,Se llSL,SellTP,"",Magicnumber,0,Green);
}
return(0);
}

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

وسيكون الحذف بعد دخول الساعة 12 ليلا وخلال الخمس دقائق الأولى من الساعة 12

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

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

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

if(Hour()==0 && Minute()<5 && MyOrdersTotal(Magicnumber)>0)
{
DeletePendingOrders(Magicnumber);
CloseOrders(Magicnumber);
}
وهذا الشرط يتحقق عندما تصبح الساعة 12 ليلا والدقيقة أقل من خمسة وهناك صفقات معلقة أو مفتوحة.

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


الوظيفة المسؤولة عن حذف الأوامر المعلقة هي :

int DeletePendingOrders(int Magic)
{
int total = OrdersTotal()-1;

for (int cnt = total ; cnt > 0 ; cnt--)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && (OrderType()!=OP_BUY || OrderType()!=OP_SELL))
{
OrderDelete(OrderTicket());
}
}
return(0);
}
هذه الوظيفة تقوم بحذف كل الصفقات المعلقة والتي ليست من النوع OP_BUY أو OP_SELL

لأنه لا يمكن حذف الصفقات من هذا النوع.

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

هذه الخطوة ضرورية جدا لأنه بعد حذف أي صفقة تختلف قيم total و cnt ولا بد من تحديث القيم هذه من جديد.

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

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

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

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

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

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

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

وهذا الرقم حصلنا عليه من خلال الوظيفة OrderTicket.

وطبعا لا يمكن استخدام OrderTicket إلا بعد أن نستخدم الوظيفة OrderSelect

وهذا ما فعلناه بالضبط.
أما الوظيفة المسؤولة عن إغلاق الصفقات المنفذة فهي :

int CloseOrders(int Magic)
{
int total = OrdersTotal()-1;

for (int cnt = total ; cnt > 0 ; cnt--)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol())
{
if (OrderType()==OP_BUY)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3);
}

if (OrderType()==OP_SELL)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3);
}
}
}
return(0);
}

هذه الوظيفة بنفس تقنية الوظيفة السابقة ولكنها تبحث فقط عن الوظائف المنفذة وليس المعلقة

في حال وجدت وظيفة شراء فإنها تغلقها على السعر Bid عن طريق الوظيفة OrderClose

وهي تحتاج لرقم التيكيت للوظيفة التي نريد إغلاقها

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

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

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

وهي أيضا تحتاج للسعر الذي نريد إغلاق الصفقة عليه وهو Bid بالنسبة للشراء. وAsk بالنسبة للبيع.

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


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


الآن يصبح الكود النهائي على الشكل التالي وهو جاهز للعمل وبدون مشاكل.

//+------------------------------------------------------------------+
//| Byu_Sell_Day.mq4 |
//| Copyright © 2007, [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ] |
//| [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ] |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, www.****forex.net"
#property link "http://www.****forex.net"

extern int Step=20;
extern int Takeprofit=50;
extern int Stoploss=50;
extern double Lots=1;
int Magicnumber=234561;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if(Hour()==0 && Minute()<5 && MyOrdersTotal(Magicnumber)>0)
{
DeletePendingOrders(Magicnumber);
CloseOrders(Magicnumber);
}
if(Hour()==0 && Minute()>5 && MyOrdersTotal(Magicnumber)==0)
{
double DayClose=iClose(Symbol(),PERIOD_D1,1);
double BuyPrice=DayClose+Step*Point;
double BuyTP=BuyPrice+Takeprofit*Point;
double BuySL=BuyPrice-Stoploss*Point;

double SellPrice=DayClose-Step*Point;
double SellTP=SellPrice-Takeprofit*Point;
double SellSL=SellPrice+Stoploss*Point;

OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyPrice,3,BuyS L,BuyTP,"",Magicnumber,0,Green);
OrderSend(Symbol(),OP_SELLSTOP,Lots,SellPrice,3,Se llSL,SellTP,"",Magicnumber,0,Green);
}
return(0);
}
int MyOrdersTotal(int Magic)
{
int c=0;
int total = OrdersTotal();

for (int cnt = 0 ; cnt < total ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol())
{
c++;
}
}
return(c);
}
int DeletePendingOrders(int Magic)
{
int total = OrdersTotal()-1;

for (int cnt = total ; cnt > 0 ; cnt--)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && (OrderType()!=OP_BUY || OrderType()!=OP_SELL))
{
OrderDelete(OrderTicket());
}
}
return(0);
}
int CloseOrders(int Magic)
{
int total = OrdersTotal()-1;

for (int cnt = total ; cnt > 0 ; cnt--)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol())
{
if (OrderType()==OP_BUY)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3);
}

if (OrderType()==OP_SELL)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3);
}
}
}
return(0);
}
ettahrim
01-31-2012, 03:25 PM
بسم الله الرحمن الرحيم


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

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

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

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


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


مثلا أنا فتحت صفقة شراء من حسابي وأخذت الرقم 20034 وأنت أيضا لك حساب في نفس الشركة وفتحت بعدي مباشرة صفقة بيع من حسابك فهي ستأخذ الرقم 20035 .

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

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

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


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

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

وكيف استطعنا أيضا إغلاق الصفقات المفتوحة أو حذف الصفقات المعلقة .

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

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

لا يمكن بأي حال من الأحوال التعامل مع صفقة قبل اختيارها أولا ويتم اختيارها عن طريق الوظيفة OrderSelect .


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

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

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

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


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

لكل حساب قسمين من الصفقات .

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

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

القسم الثاني : وهو القسم الذي يحوي على الصفقات المغلقة أو الصفقات المعلقة المحذوفة .

وهي الصفقات التي نراها في صفحة History .


في الحقيقة فإن لكل صفقة رقمين :

الأول : رقم التيكيت الذي تحدثنا قبل قليل .

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

ولكل قسم أرقام تسلسلية خاصة به .


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

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

الآن حان وقت شرح الوظيفة OrderSelect

لهذه الوظيفة ثلاث بارامترات :

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


البارامتر الثاني : نوع الرقم هل هو تسلسلي أو تيكيت . ويأخذ قيمتين إما SELECT_BY_POS وهذا يعني أن الرقم نوعه تسلسلي.

أو القيمة SELECT_BY_TICKET وهذا يعني أن الرقم نوعه تيكيت .


البارامتر الثالث : نوع القسم الذي سنختار منه الصفقة هل هو الصفقات الحالية أو الهيستوري . وله قيمتان إما MODE_TRADES وهذا يعني أننا سنعمل على الصفقات الحالية. وهي القيمة الافتراضية .

أو القيمة MODE_HISTORY وهذا يعني أننا سنعمل على الصفقات الهيستوري فقط .


فمثلا الكود التالي يعني أنني أختار الصفقة ذات الرقم التسلسي 3 في الصفقات الحالية:

OrderSelect(3, SELECT_BY_POS,MODE_TRADE);
كما يمكن كتابة نفس السطر بالطريقة المختصرة مع أني لا أحبذها على الشكل التالي :

OrderSelect(3, SELECT_BY_POS);

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

والكود التالي يعني أنني أختار الصفقة ذات رقم التيكيت 25689 في الصفقات الحالية:

OrderSelect(25689, SELECT_BY_TICKET,MODE_TRADE);

والكود التالي يعني أنني أختار الصفقة ذات رقم التيكيت 4567 في صفقات الهيستوري:

OrderSelect(4567, SELECT_BY_TICKET,MODE_HISTORY);
ettahrim
01-31-2012, 03:28 PM
بسم الله الرحمن الرحيم

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

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

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

فكرة الاكسبيرت بسيطة جدا لكنها قوية أيضا في نفس الوقت.

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

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

بمعنى أن الكسر سيكون لهذا الترند عاجلا أم آجلا ولكن السعر الذي سينكسر عند الترند غير معروف.

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

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

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

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

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

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

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

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

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

النسخة الثانية تتعامل مع كسر واختراق الترندات.

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

أولا سنشرح الخصائص الخاصة بالاكسبيرت وهي:

extern string BuyStop_Trend_Info = "_______________________";
extern string BuyStop_TrendName = "buystop";
extern int BuyStop_TakeProfit = 50;
extern int BuyStop_StopLoss = 30;
extern double BuyStop_Lot = 0.1;
extern int BuyStop_StepUpper = 10;
extern int BuyStop_StepLower = 50;
extern string SellStop_Trend_Info = "_______________________";
extern string SellStop_TrendName = "sellstop";
extern int SellStop_TakeProfit = 50;
extern int SellStop_StopLoss = 30;
extern double SellStop_Lot = 0.1;
extern int SellStop_StepUpper = 50;
extern int SellStop_StepLower = 10;
الخاصية BuyStop_Trend_Info هي عبارة عن خط أفقي لفصل الخصائص عن بعضها وليس له أهمية.

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

الخاصية BuyStop_TakeProfit وهي عدد النقاط المطلوبة كهدف من أوردر الشراء.

الخاصية BuyStop_StopLoss وهي عدد نقاط الوقف لعملية الشراء.

الخاصية BuyStop_Lot وهي عدد اللوتات لصفقة الشراء.

الخاصية BuyStop_StepUpper وهي عدد النقاط الفاصلة بين الترند وبين نقطة الدخول.

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

الخصائص الباقية نفس الشرح ولكنها لصفقة البيع.


الكود التالي:

int MagicBuyStop = 1101;
int MagicSellStop = 1102;
int glbOrderType;
int glbOrderTicket;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int init()
{
Comment("TrendMeLeaveMe by Waddah Attar");
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int deinit()
{
Comment("");
return(0);
}
عرفنا أيضا متحولين يضمان رقمين سحريان لكي يستطيع الاكسبيرت الفصل بين صفقة البيع وصفقة الشراء.

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


كما تلاحظون أنه لا يوجد كود في الوظيفتين init و deinit .


المعالجة كلها ستكون في الوظيفة start كما سنرى الآن.

int start()
{
double vH, vL, vM, sl, tp;
if(ObjectFind(BuyStop_TrendName) == 0)
{
SetObject("High" + BuyStop_TrendName,
ObjectGet(BuyStop_TrendName, OBJPROP_TIME1),
ObjectGet(BuyStop_TrendName, OBJPROP_PRICE1) + BuyStop_StepUpper*Point,
ObjectGet(BuyStop_TrendName, OBJPROP_TIME2),
ObjectGet(BuyStop_TrendName, OBJPROP_PRICE2) + BuyStop_StepUpper*Point,
ObjectGet(BuyStop_TrendName, OBJPROP_COLOR));
والآن نفس التقنية نقوم بها مع الترند الصاعد من أجل صفقة البيع وهي لها الكود التالي:

if(ObjectFind(SellStop_TrendName) == 0)
{
SetObject("High" + SellStop_TrendName,
ObjectGet(SellStop_TrendName, OBJPROP_TIME1),
ObjectGet(SellStop_TrendName, OBJPROP_PRICE1) + SellStop_StepUpper*Point,
ObjectGet(SellStop_TrendName, OBJPROP_TIME2),
ObjectGet(SellStop_TrendName, OBJPROP_PRICE2) + SellStop_StepUpper*Point,
ObjectGet(SellStop_TrendName, OBJPROP_COLOR));
SetObject("Low" + SellStop_TrendName, ObjectGet(SellStop_TrendName, OBJPROP_TIME1),
ObjectGet(SellStop_TrendName, OBJPROP_PRICE1) - SellStop_StepLower*Point,
ObjectGet(SellStop_TrendName, OBJPROP_TIME2),
ObjectGet(SellStop_TrendName, OBJPROP_PRICE2) - SellStop_StepLower*Point,
ObjectGet(SellStop_TrendName, OBJPROP_COLOR));
vH = NormalizeDouble(ObjectGetValueByShift("High" + SellStop_TrendName, 0), Digits);
vM = NormalizeDouble(ObjectGetValueByShift(SellStop_Tre ndName, 0), Digits);
vL = NormalizeDouble(ObjectGetValueByShift("Low" +SellStop_TrendName, 0), Digits);
sl = vL + SellStop_StopLoss*Point;
tp = vL - SellStop_TakeProfit*Point;
if(Bid >= vM && Bid <= vH && OrderFind(MagicSellStop) == false)
if(OrderSend(Symbol(), OP_SELLSTOP, SellStop_Lot, vL, 3, sl, tp, "",
MagicSellStop, 0, Red) < 0)
Print("Err (", GetLastError(), ") Open SellStop Price= ", vL, " SL= ", sl,
" TP= ", tp);
if(Bid >= vM && Bid <= vH && OrderFind(MagicSellStop) == true &&
glbOrderType == OP_SELLSTOP)
{
OrderSelect(glbOrderTicket, SELECT_BY_TICKET, MODE_TRADES);
if(vL != OrderOpenPrice())
if(OrderModify(glbOrderTicket, vL, sl, tp, 0, Red) == false)
Print("Err (", GetLastError(), ") Modify Sell Price= ", vL, " SL= ", sl,
" TP= ", tp);
}
}

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

bool OrderFind(int Magic)
{
glbOrderType = -1;
glbOrderTicket = -1;
int total = OrdersTotal();
bool res = false;
for(int cnt = 0 ; cnt < total ; cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
{
glbOrderType = OrderType();
glbOrderTicket = OrderTicket();
res = true;
}
}
return(res);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void SetObject(string name,datetime T1,double P1,datetime T2,double P2,color clr)
{
if(ObjectFind(name) == -1)
{
ObjectCreate(name, OBJ_TREND, 0, T1, P1, T2, P2);
ObjectSet(name, OBJPROP_COLOR, clr);
ObjectSet(name, OBJPROP_STYLE, STYLE_DOT);
}
else
{
ObjectSet(name, OBJPROP_TIME1, T1);
ObjectSet(name, OBJPROP_PRICE1, P1);
ObjectSet(name, OBJPROP_TIME2, T2);
ObjectSet(name, OBJPROP_PRICE2, P2);
ObjectSet(name, OBJPROP_COLOR, clr);
ObjectSet(name, OBJPROP_STYLE, STYLE_DOT);
}
}
ettahrim
01-31-2012, 05:10 PM
المتحولات العامة Global Variable

تحتوي لغة الميتاتريدر على تقنية تسمى Global Variable

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

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

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

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

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

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

هذا مثال بسيط لما يمكن عمله بواسطة هذه التقنية الرائعة .

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

من القائمة Tools اختر Global Variable أو اضغط F3 مباشرة .

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

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

العمل مع المتحولات العامة من خلال البرمجة :

تحتوي لغة MQL4 على كافة الوظائف المناسبة للعمل مع هذه المتحولات .

وهذه الوظائف هي :

bool GlobalVariableCheck( string name)



تقوم بفحص هل يوجد متحول عام له الاسم المحدد ..

تعيد هذه الوظيفة القيمة true في حال وجدت المتحول والقيمة false في حال لم يكن المتحول موجودا .

bool GlobalVariableDel( string name)


تقوم بحذف المتحول ذو الاسم المحدد وتعيد القيمة true في حال نجحت في عملية الحذف والقيمة false في حال لم تنجح لأي سبب من الأسباب .

double GlobalVariableGet( string name)


تقوم بقراءة قيمة المتحول ذو الاسم المحدد .

datetime GlobalVariableSet( string name, double value)



تقوم بوضع قيمة رقمية في المتحول ذو الاسم المحدد وتعيد زمن آخر قراءة تمت على هذا المتحول .

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

int GlobalVariablesDeleteAll( string prefix_name=NULL)


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

تعيد هذه الوظيفة عدد المتحولات التي قامت بحذفها .

int GlobalVariablesTotal( )


تقوم بإعادة عدد المتحولات العامة المتوفرة حاليا .

string GlobalVariableName( int index)


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

أمثلة :

// check variable before use
if(!GlobalVariableCheck("g1"))
GlobalVariableSet("g1",1);


يقوم هذا المثال بفحص هل يوجد متحول اسمه g1 .
في حال لم يجد هذا المتحول فإنه ينشئه ويضع فيه القيمة 1 .

GlobalVariableDel("gvar_1");



يقوم هذا المثال بحذف المتحول ذو الاسم gvar_1 .

double v1=GlobalVariableGet("g1");


يقوم هذا المثال بقراءة قيمة المتحول g1 وتخزينه في المتحول v1 .

int var_total=GlobalVariablesTotal();
string name;
for(int i=0;i<var_total;i++)
{
name=GlobalVariableName;
Print(i,": Global variable name - ",name);
}


يقوم هذا المثال بقراءة وطباعة أسماء جميع المتحولات المتوفرة حاليا

فقط أسمائها وليس قيمها .

بعد التدقيق في الكود وجدت الخطأ

هذا هو الكود الصحيح

//+------------------------------------------------------------------+
//| Amro high low.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ] |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
extern int Step=20;
extern int Takeprofit=50;
extern int Stoploss=50;
extern double Lots=1;
int Magicnumber=234561;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if(Hour()==0 && Minute()<5 && MyOrdersTotal(Magicnumber)>0)
{
DeletePendingOrders(Magicnumber);
CloseOrders(Magicnumber);
}
if(Hour()==0 && Minute()>5 && MyOrdersTotal(Magicnumber)==0)
{
double Dayhigh=iHigh(Symbol(),PERIOD_D1,1);
double Daylow=iLow(Symbol(),PERIOD_D1,1);
double BuyPrice=Dayhigh+Step*Point;
double BuyTP=BuyPrice+Takeprofit*Point;
double BuySL=BuyPrice-Stoploss*Point;

double SellPrice=Daylow-Step*Point;
double SellTP=SellPrice-Takeprofit*Point;
double SellSL=SellPrice+Stoploss*Point;

OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyPrice,3,BuyS L,BuyTP,"",Magicnumber,0,Green);
OrderSend(Symbol(),OP_SELLSTOP,Lots,SellPrice,3,Se llSL,SellTP,"",Magicnumber,0,Red);


}
return(0);
}
int MyOrdersTotal(int Magic)
{
int c=0;
int total = OrdersTotal();

for (int cnt = 0 ; cnt < total ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol())
{
c++;
}
}
return(c);
}

int DeletePendingOrders(int Magic)
{
int total = OrdersTotal()-1;

for (int cnt = total ; cnt >= 0 ; cnt--)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && (OrderType()!=OP_BUY || OrderType()!=OP_SELL))
{
OrderDelete(OrderTicket());
}
}
return(0);
}

int CloseOrders(int Magic)
{
int total = OrdersTotal()-1;

for (int cnt = total ; cnt >= 0 ; cnt--)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol())
{
if (OrderType()==OP_BUY)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3);
}

if (OrderType()==OP_SELL)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3);
}
}
}
return(0);
}

//+------------------------------------------------------------------+

فيما يلي بعض الوظائف الهامة التي أستخدمها بكثرة في الاكسبيرتات التي أصنعها

وأعتقد أنها سوف تنفعكم أيضا


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


الوظيفة الأولى :

MyRealOrdersTotal

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


int MyRealOrdersTotal(int Magic)
{
int c=0;
int total = OrdersTotal();

for (int cnt = 0 ; cnt < total ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && (OrderType()==OP_BUY || OrderType()==OP_SELL))
{
c++;
}
}
return(c);
}
ettahrim
01-31-2012, 05:54 PM
الوظيفة الثانية

MyPendingOrdersTotal

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

int MyPendingOrdersTotal(int Magic)
{
int c=0;
int total = OrdersTotal();

for (int cnt = 0 ; cnt < total ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP))
{
c++;
}
}
return(c);
}

الوظيفة الثالثة :

MyRealBuyOrdersTotal

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

int MyRealBuyOrdersTotal(int Magic)
{
int c=0;
int total = OrdersTotal();

for (int cnt = 0 ; cnt < total ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && OrderType()==OP_BUY)
{
c++;
}
}
return(c);
}

الوظيفة الرابعة :

MyRealSellOrdersTotal

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

int MyRealSellOrdersTotal(int Magic)
{
int c=0;
int total = OrdersTotal();

for (int cnt = 0 ; cnt < total ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && OrderType()==OP_SELL)
{
c++;
}
}
return(c);
}

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


الوظيفة الخامسة :

DeletePendingOrders

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

int DeletePendingOrders(int Magic)
{
int total = OrdersTotal();

for (int cnt = total - 1; cnt >= 0; cnt--)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP))
{
OrderDelete(OrderTicket());
}
}
return(0);
}

الوظيفة السادسة :

MyOrdersProfit

تقوم بحساب ربح الصفقات المفتوحة البيع والشراء وبالدولار وليس بالنقاط .

double MyOrdersProfit(int Magic)
{
double c=0;
int total = OrdersTotal();

for (int cnt = 0 ; cnt < total ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && (OrderType()==OP_BUY || OrderType()==OP_SELL))
{
c=c+OrderProfit();
}
}
return(c);
}

الوظيفة السابعة :

CloseOrders

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

int CloseOrders(int Magic)
{
int total = OrdersTotal();

for (int cnt = total-1 ; cnt >= 0 ; cnt--)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol())
{
if (OrderType()==OP_BUY)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3);
}

if (OrderType()==OP_SELL)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3);
}
}
}
return(0);
}

طريقة إجبار السيرفر على فتح الصفقة

أحيانا لا يستجيب السيرفر لأمر فتح الصفقة نتيجة خلل أو ضغط أو أي سبب آخر

مع ان معلومات الصفقة صحيحة تماما

لذلك نضع حلقة while تجبر السيرفر على التنفيذ والكود كالتالي :

gT=0;
while(gT<=0)
{
Sleep(1000);
gT=OrderSend(Symbol(),OP_SELLSTOP,Lots,sl,3,sl+Sto pLoss*Point,sl-TakeProfit * Point ,"" , Magic , 0 , Green);
Sleep(1000);
}
طالما عادت الوظيفة OrderSend برقم يساوي أو أقل من الصفر فهذا يعني أن الوظيفة لم تنجح بفتح الصفقة .

يتم تكرار هذا الأمر مرة أخرى حتى نضمن نجاح فتح الصفقة .

وضعنا تأخير زمني قبل وبعد تنفيذ الصفقة مقداره ثانية واحدة لنعطي السيرفر مهلة تنفيذ الأمر .
ettahrim
01-31-2012, 06:08 PM
بالتطبيق المباشر تعلم برمجة الإكسبرتات من البدايه حتى الإحتراف
حقيقة لطالما لم يجذبني الكلام النظري الممل وكانت أفضل الطرق التي إتخذتها للتعلم في جميع المجالات هي بالتطبيق المباشر وهذا بإذن الله ما سنلجأ إلى

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

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

فتح محرر الميتاإيديتور
قم بفتح برنامج الميتاتريدر والضغط على F4 أو إضغط على الأيقونه في الصوره التاليه وهي الخاصه بمحرر الميتاإيديتور
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]

ثم نتبع الشرح كما في الصور لإنشاء ورقة عمل جديده
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
سوف نجد عدة خيارات من حيث نوع العمل الذي تريد إنشاءه سواء إكسبرت أو مؤشر أو سكربت أو ملف DLL
في حالتنا هذه سنختار إنشاء إكسبرت

ثم
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ستظهر لنا نافذه جديده وهي التي يمكن من خلالها كتابة إسم الإكسبرت وإسم المؤلف أي حقوق الملكيه ويمكن تغييرها جميعا بعد كتابتها من داخل الإكسبرت
سوف نجد خانة Parameters وهي الخاصه بالمتغيرات الخارجية للإكسبرت أو بمعنى أوضح إعدادات الإكسبرت مثل حجم اللوت وخلافه وحاليا سنتركها بدون تعديل ولن نضيف أي متغيرات خارجيه .
بعد الضغط على Finish سيبدأ سيبدأ برنامج الميتاإيديتور بنقلنا إلى نافذة التحرير والتي سيتم فيها كتابة الأوامر البرمجية التي نريد من الإكسبرت عملها .


وما علينا سوى البدء في كتابة الأسطر البرمجية التي نريد من الإكسبرت تنفيذه

بعد فتح نافذة التحرير سوف تجد أن هناك بعض الأسطر البرمجيه المكتوبة سابقا وهي عباره عن الأسطر الرئيسيه الخاصه بلغة MQL
كما في الصوره التاليه:
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
سوف نجد أن نافذة التحرير مقسمة إلى عدة أقسام بالإضافة إلى قسم المتغيرات الخارجيه (سوف نتكلم عنهم بإختصار في الدروس القادمه)
القسم الأول
الداله

init()
وهذه الدالة يتم إستدعائها مرة واحدة فقط عند بداية عمل الإكسبرت

القسم الثاني
الداله

deinit()
وهذه الدالة يتم إستدعائها مرة واحدة فقط عند نهاية عمل الإكسبرت

القسم الثالث
الداله

start()

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

ويتم كتابة التعليقات بطريقتين
1_ أن يسبق السطر علامة

//

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

/*


في بداية السطر ثم وضع هذه العلامه

*/

في نهاية السطر

مثال :

//this is comment


أو

/*
this is comment
thanks
*/
الآن نأتي للكلمات التي تأخذ ألوان مختلفة وهي تعتبر من الكلمات المحجوزه في لغة MQL
ويتم إستخدامها للتعبير عن شيء محدد ولا يمكن إستخدامها لغير ذلك

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

بالنسبه للكلام السابق لا تهتموا به أو تعتقدوا بصعوبته فلاحقا ستعلمون أن الموضوع أبسط ما يمكن عند التطبيق الحي

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

//+------------------------------------------------------------------+
//| |
//| Copyright, created 16 Apr 2010 |
//| Desinged by MR.dollar |
//| |
//| [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ] |
//+------------------------------------------------------------------+

#property copyright "MR.dollar EA"
#property link "[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]"

extern string MM_Parameters = "---------- Money Management";
extern double Lots = 1;


extern string S5="---------------- Order Management";
extern int StopLoss=50;
extern int TakeProfit=50;
extern int MagicNumber=2533;

int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| FUNCTION DEFINITIONS deinitialization function |
//+------------------------------------------------------------------+

int deinit()
{
//----

//----
return(0);
}


//+------------------------------------------------------------------+
//| FUNCTION DEFINITIONS Start function |
//+------------------------------------------------------------------+

int start()
{
Comment("Programmed by MR.dollar"+"\n"+"منتدى المتداول العربي "+"\n"+"www.************.com/vb");

//////////////////////////////////////////////////

double ma1,ma2,ma11,ma22,rsi1,rsi2,ma3,ma33,ma4,ma44;

ma1=iMA(NULL,0,30,0,MODE_EMA,PRICE_CLOSE,1);
ma11=iMA(NULL,0,30,0,MODE_EMA,PRICE_CLOSE,2);
ma2=iMA(NULL,0,9,0,MODE_EMA,PRICE_CLOSE,1);
ma22=iMA(NULL,0,9,0,MODE_EMA,PRICE_CLOSE,2);

////////////////////////////////////////////////////
double SL,TP;


////////////////////////////////


if (ma22<ma11&&ma2>ma1 ){

if(StopLoss==0){SL=0;}else{SL=Ask-StopLoss*Point;}
if(TakeProfit==0){TP=0;}else{TP=Ask+TakeProfit*Poi nt;}

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,SL,TP,"MR.dol lar EA",MagicNumber,0,Blue);
PlaySound("Alert.wav");

}




/////////////////////

if (ma22>ma11&&ma2<ma1 ){

if(StopLoss==0){SL=0;}else{SL=Bid+StopLoss*Point;}
if(TakeProfit==0){TP=0;}else{TP=Bid-TakeProfit*Point;}

OrderSend(Symbol(),OP_SELL,Lots,Bid,3,SL,TP,"MR.do llar EA",MagicNumber,0,Red);
PlaySound("Alert.wav");


}
}
ettahrim
01-31-2012, 06:13 PM
بسم الله الرحمن الرحيم

الآن لنبدأ في شرح الإكسبرت السابق بالتفصيل الممل

أول جزء في الإكسبرت
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]

//+------------------------------------------------------------------+
//| |
//| Copyright, created 16 Apr 2010 |
//| Desinged by MR.dollar |
//| |
//| [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ] |
//+------------------------------------------------------------------+
وهو الجزء الخاص بحقوق الملكيه ويمكن حذفه ولن يؤثر على أداء الإكسبرت كما سنلاحظ أنه ذو لون باهت أي أنه عباره عن كومنت أو تعليق لذلك يسبق كل سطر علامه //

#property copyright "MR.dollar EA"
#property link "[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]"

ثم يأتي الجزء التابع له وهو أيضا الخاص بحقوق الملكيه وحذفه لن يؤثر على آداء الإكسبرت أيضا

الجزء الثاني

extern string MM_Parameters = "---------- Money Management";
extern double Lots = 1;


extern string S5="---------------- Order Management";
extern int StopLoss=50;
extern int TakeProfit=50;
extern int MagicNumber=2533;

وهو الجزء الخاص بالمتغيرات الخارجية للإكسبرت والتي ستظهر في خصائص الإكسبرت عن تفعيله على الشارت مثل الأستوب لوز أو الهدف

ولكن لنلاحظ شيء الآن

ماذا تعني extern
كما لاحظنا أن هذه الكلمة تتلون عند كتابتها في محرر الميتاإيديتور لذلك فهي من الكلمات المحجوزه وتستخدم لتعريف متغير خارجي ويتم كتابتها قبل نوع المتغير (ولكن ما هي المتغيرات وماذا تعني بنوع المتغير ؟)

المتغيرات
كما قلنا في الدرس السابق هي كلمات قمنا بإستخدامها وأعطيناها دلالة محدده أو قيمة معينه تعبر عنها
فمثلا أنا كتبت المتغير A وقمت بإعطاءه الرقم 1
فيعتبر A هو المتغير والقيمه التي أعطيتها له هي الرقم 1
ولكن هل يمكن أن أكتب في محرر الميتاإيدتور مباشره

A=1

في هذه الحاله سيعطي خطأ لأن الميتاإيديتور لا يعرف ما معنى A أساسا هل هي رقم صحيح هل هي حرف هل هي رقم عشري

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

إذا كيف نقوم بتعريف المتغيرات ؟

وماذا تعني string double int bool

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

int StopLoss=30;
int ahmed=1;
ففي المثال السابق عرفنا المتغير StopLoss على أنه عدد صحيح وأعطيناه القيمه 30
ونفس الشيء عرفنا المتغير ahmed على أنه عدد صحيح وأعطيناه القيمه 1

double
تستخدم هذه الكلمة لتعريف متغير على أنه رقم عشري
مثال:

double Lots = 1.5;

عرفنا المتغير Lots على أنه عدد عشري

string
تستخدم هذه الكلمة المحجوزه لتعريف متغير على أنه سلسلة نصيه أو كلمه ويجب كتابة هذه الكلمة بين علامتي تنصيص " "
مثال:

string MM_Parameters = "---------- Money Management";

فقد عرفنا المتغير MM_Parameters على أنه متغير نصي ويحمل الكلمه أو الجمله
"---------- Money Management"

bool
تستخدم هذه الكلمة المحجوزه لتعريف متغير على أنه متغير منطقي يأخذ قيمتين فقط إما صح (true) أو خطأ (false)
مثال:

bool Buy=false;
bool Sell=true;

فمثلا إذا وضعت شرط في الإكسبرت إذا كانت قيمة Sell=true إفتح صفقة بيع
عندها سيقوم الإكسبرت بإختبار الشرط هل قيمة Sell=true فإذا كان صحيح سيقوم بالبيع

ويجب ملاحظة أن في نهاية كل سطر برمجي نقوم بوضع علامة الفاصله المنقوطه ;
وهي شيء أساسي يجب أن تكون موجوده في نهاية السطر البرمجي في لغة MQL

الجزء الثالث
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]

وهو الداله init

int init()
{
//----

//----
return(0);
}
وكما أخبرنا سابقا فإن هذه الداله يتم إستدعائها مرة واحد عند بداية عمل الإكسبرت أو المؤشر وأحيانا كثيره لا يتم إستخدامها وتترك فارغه وليس بداخلها أية أوامر لذلك سنتركها حاليا

الجزء الرابع

int deinit()
{
//----

//----
return(0);
}

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


وبإذن الله في الدرس القادم سندخل مباشرة في الداله start
ettahrim
01-31-2012, 06:20 PM
الداله start
يتم تنفيذ هذه الداله every tick أو عند كل تحرك للسعر

الشكل العام للداله يكون كالآتي

int start()
{

return(0);
}

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

{
}

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

في البدايه قمنا بوضع هذا السطر

Comment("Programmed by MR.dollar"+"\n"+"منتدى المتداول العربي "+"\n"+"www.************.com/vb");

الأمر Comment
هذا الأمر يقوم بوضع التعليق الذي قمت بتعريفه في أعلى يسار الصفحه كما في الصوره التاليه
وتقوم بكتابة التعريفات التي تريدها بين القوسين ( ) وإذا كانت جمل نصيه يجب كتابتها بين علامتي تنصيص "" بداخل القوسين ويتم الفصل بين كل تعليق أو جمله وآخرى بعلامة ( + ) أو فاصله ( , )

ونلاحظ في نهاية السطر لا ننسى الفاصله المنقوطه دليل على إنتهاء السطر البرمجي ( ; )
ويمكن بالتأكيد حذف هذا السطر دون أن يؤثر على عمل الإكسبرت .
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
نأتي الآن إلى تعريف المؤشرات التي نريد إستخدامها وهي عبارة عن خطي الموفينج

في البداية قمنا بتعريف المتغيرات التي سنستخدمها للدلاله على الموفينج أفريج على أنها متغير من نوع double أو متغير عدد عشري في السطر التالي

double ma1,ma2,ma11,ma22;

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

double ma1;
double ma2;
double ma11;
double ma22;

أو كتابتها بهذه الطريقه

double ma1,
ma2,
ma11,
ma22;
ثم قمنا بإعطاء قيمة لهذه المتغيرات وهي الموفينج أفريج

ma1=iMA(NULL,0,30,0,MODE_EMA,PRICE_CLOSE,1);
ma11=iMA(NULL,0,30,0,MODE_EMA,PRICE_CLOSE,2);
ma2=iMA(NULL,0,9,0,MODE_EMA,PRICE_CLOSE,1);
ma22=iMA(NULL,0,9,0,MODE_EMA,PRICE_CLOSE,2);

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

iMA( string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift) ;

iMA وهي أحد الكلمات المحجوزه لإستدعاء مؤشر الموفينج أفريج
وهي إختصار ل Moving Average
symbol العمله التي سنقوم بحساب قيمة الموفينج أفريج لها إجعلها NULL لعملة الشارت الحالي
timeframe التايم فريم المستخدم
period , ma_shift ,ma_method ,applied_price إعدادات مؤشر الموفينج أفريج

shift وهي رقم الشمعة التي سنحسب عندها قيمة الموفينج افريج
0 تعني الشمعة الحالية , 1 تعني الشمعة السابقه ,2 تعني الشمعة قبل السابقه وهكذا .

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

iADX( string symbol, int timeframe, int period, int applied_price, int mode, int shift);
iATR( string symbol, int timeframe, int period, int shift);
iBands( string symbol, int timeframe, int period, int deviation, int bands_shift, int applied_price, int mode, int shift);
iCCI( string symbol, int timeframe, int period, int applied_price, int shift);
iDeMarker( string symbol, int timeframe, int period, int shift);
iForce( string symbol, int timeframe, int period, int ma_method, int applied_price, int shift);
iIchimoku( string symbol, int timeframe, int tenkan_sen, int kijun_sen, int senkou_span_b, int mode, int shift);
iMomentum( string symbol, int timeframe, int period, int applied_price, int shift);
iMA( string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift);
iOsMA( string symbol, int timeframe, int fast_ema_period, int slow_ema_period, int signal_period, int applied_price, int shift);
iMACD( string symbol, int timeframe, int fast_ema_period, int slow_ema_period, int signal_period, int applied_price, int mode, int shift);
iSAR( string symbol, int timeframe, double step, double maximum, int shift);
iRSI( string symbol, int timeframe, int period, int applied_price, int shift);
iStochastic( string symbol, int timeframe, int Kperiod, int Dperiod, int slowing, int method, int price_field, int mode, int shift);
iWPR( string symbol, int timeframe, int period, int shift);
iStdDev( string symbol, int timeframe, int ma_period, int ma_shift, int ma_method, int applied_price, int shift);

كما يمكنك عن طريق تظليل أي كلمة محجوزه ثم بالضغط على F1 سوف تظهر لك خصائص هذه الداله ومعنى الإعدادات الخاصه بها فعلى سبيل المثال مؤشر Stochastic عند التظليل عليه سوف تظهر لنا خصائصه كما في الصوره التاليه
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]

الآن كيف يتم إستدعاء مؤشر خارجي غير موجود في الميتاتريدر
يتم ذلك بإستخدام الداله iCustom

iCustom( string symbol, int timeframe, string name, ..., int mode, int shift);
حيث
symbol هو إسم العمله إجعلها NULL لكي تكون العمله للشارت المستخدم
timeframe التايم فريم المستخدم إجعله 0 لكي يكون التايم فريم للشارت المستخدم
name إسم المؤشر ويوضع بين علامتي تنصيص ""
ثم تقوم بعد ذلك بكتابة متغيرات المؤشر الخارجيه تباعا أو يمكنك عدم كتابتها في حال أردتها أن تكون الإعدادات الإفتراضيه
mode وهو رقم الإندكس للمؤشر لاحظ الصوره التاليه
shift وهو رقم الشمعة التي سنأخذ عندها قيمة المؤشر

مع ملاحظة أنه يجب أن يتم وضع المؤشر بصيغة ex4 عن طريق عمل Compile له ويوضع في مجلد indicators في برنامج الميتاتريدر حتى يتمكن الإكسبرت من إستدعائه

على سبيل المثال في الصوره التاليه سوف تجد أن السهم ذو اللون الأصفر رقم الإندكس له هو 0 فإذا أردنا إستدعاء السهم الأصفر سنقوم بكتابة 0 في خانة mode وإذا أردنا إستدعاء السهم الأحمر سيكون الإندكس 2
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
01-31-2012, 06:27 PM
بسم الله الرحمن الرحيم

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

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

double ma1,ma2,ma11,ma22,rsi1,rsi2,ma3,ma33,ma4,ma44;

ma1=iMA(NULL,0,30,0,MODE_EMA,PRICE_CLOSE,1);
ma11=iMA(NULL,0,30,0,MODE_EMA,PRICE_CLOSE,2);
ma2=iMA(NULL,0,9,0,MODE_EMA,PRICE_CLOSE,1);
ma22=iMA(NULL,0,9,0,MODE_EMA,PRICE_CLOSE,2);

ولكن بقي الآن أن نعرف كيف نترجم هذا التقاطع إلى كلام يفهمه الإكسبرت

لاحظ في الصورة التاليه
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]

الشمعة رقم 2 هي الشمعة قبل التقاطع والتي قمنا بتعريف الموفينج لها بالمتغير ma11 , ma22
الشمعة رقم 1 هي شمعة التقاطع والتي قمنا بتعريف الموفينج أفريج لها بالمتغير ma1 , ma2

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

العمليات الحسابيه والمقارنه والعطف

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

العمليات الحسابيه
1_ عملية الجمع ( + )

A=3+5;

في المثال السابق فإن المتغير A سيأخذ قيمة ناتج جمع 3+5 فيكون الناتج 8
2_عملية الطرح( - )

A=20-5;

معناه إطرح 5 من 20 والناتج سيعطى للمتغير A
فيكون A=15
3_عملية الضرب ( * )

A=2*3;

معناه أضرب 2 في 3 والناتج يعطى للمتغير A
4_ عملية القسمه ( / )

A=6/2;

معناه إقسم 6 على 2 والناتج يعطى للمتغير A
5_ عملية الزياده ( ++ )

i++

معناه قم بزياد 1 إلى المتغير i فمثلا إذا كان i=5 فإنه سيصبح 6
6_ عملية النقصان ( -- )

i--

معناه قم بطرح 1 من المتغير i فإذا كان i=5 فإنه سيصبح 4
هذه تعتبر أهم العمليات الحسابيه التي سنستخدمها كثيرا أثناء البرمجه
7_ عملية المساواه ( = )

A = 3

معناه أننا سنعطي A القيمه 3

عمليات المقارنه
1_ أكبر من ( < )

A > 3

إذا كان A أكبر من 3 فإن المقارنه صحيحه
2_ أكبر من أو يساوي (=< )

A >= 7


إذا كان A أكبر من أو يساوي 7 فإن عملية المقارنه صحيحه
3_ أصغر من ( > )

A < 0

إذا كان A أصغر من 0 فإن المقارنه صحيحه
4_ أصغر من أو يساوي ( => )

A <= 1

إذا كان A أصغر من أو يساوي 1 فإن عملية المقارنه صحيحه
5_ لا يساوي ( =! )

A != 10

إذا كان A لا يساوي 10 فإن المقارنه صحيحه
6_ عملية التساوي ( == )

A == 4

وتعني هل قيمة A تساوي 4 إذا كانت الإجابه نعم فإن المقارنه صحيحه
وهي تختلف عن العملية الحسابيه ( = )

عمليات العطف
1_ و ( && )

A > 3 && B <7

وتعني إذا كان A أكبر من 3 و B أصغر من 7 فإن عملية المقارنه صحيحه
2_ أو ( || )

A > 3 || B < 7

وتعني إذا كان A أكبر من 3 أو B أصغر من 7 فإن عملية المقارنه صحيحه
3_ لا تتحقق ( ! )

!(A == 7)


وتعني إذا لم يتحقق أن A تساوي 7
ettahrim
01-31-2012, 07:16 PM
[]بسم الله الرحمن الرحيم

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

وصلنا في الإكسبرت إلى السطر البرمجي التالي

if (ma22<ma11&&ma2>ma1 ){

فماذا يعني هذا السطر ومتى نستخدمه ؟
الجمل الشرطيه ( if )
تستخدم الجمل الشرطيه للتحقق من شرط ما فإذا تحقق الشرط يقوم بتنفيذ جسد الشرط وإذا لم يتحقق الشرط لا ينفذه وينتقل إلى السطر الذي يليه
ويتم كتابتها بالشكل التالي

if(------)
{--------;}
يتم كتابة الشروط التي يتحقق منها بين القوسين ( )
ثم يلي ذلك جسد الشرط وهو ما سيتم تنيفذه عند تحقق الشرط ويكتب بين القوسين { } ولا ننسى في نهاية الأمر وضع الفاصله المنقوطه ;

فمثلا لو قلت إذا كان A أكبر من 80 قم بإظهار رساله فسيكون الشرط كالتالي

if( A > 80 )
{ Alert(" A above 80 "); }
ملحوظه :
إذا كان جسد الشرط يتكون من جمله واحد يمكن الإستغناء عن الأقواس { } ويمكن كتابة الشرط بالشكال التالي

if( A > 80 )
Alert(" A above 80 ");
ملحوظه :
يمكن وضع أكثر من أمر في جسد الجمله الشرطيه يتم تنفيذه عند تحقق شرط معين كما في المثال التالي

if( A > 80 )
{
Alert(" A above 80 ");
PlaySound("Alert.wav");
}
في الجمله الشرطيه السابقه فيتم التحقق من الشرط هل A أكبر من 80 فإذا كان الناتج هو ترو ينفذ جسد الشرط ولكن إذا لم يتحقق أن A أكبر من 80 فلن ينفذ شيء ولكن ماذا إذا أردت تنفيذ أمر آخر إذا لم يتحقق أن A أكبر من 80
في هذه الحاله يمكننا إستخدام الجمله الشرطيه if .....else

الجمله الشرطيه if .....else
إذا قلت إذا كان A =50 إطبع A تساوي 50 وإلا إطبع A لا تساوي 50 في هذه الحاله يمكننا إستخدام الجمله الشرطيه if ....... else
وسيتم كتابتها بالشكل التالي

if( A==50){
Print("A = 50");}
else{
Print("A != 50");}

نعود الآن إلى الإكسبرت الذي نعمل على دراسته

if (ma22<ma11&&ma2>ma1 )

ويتم فيها التحقق من شروط الدخول وهو إذا كان ma22 وهو ما قمنا تعريفه سابقا على أنه يأخذ قيمة الموفينج أفريج 9 للشمعة رقم 2 أقل من ma11
و ma2 أكبر من ma1
أي إذا كان موفينج 9 للشمعة قبل السابقه الشمعة رقم 2 أقل من موفينج 30 للشمعة قبل السابقه ثم أصبح موفينج 9 للشمعة السابقه الشمعة رقم 1 أكبر من موفينج 30 للشمعة السابقه
عندها يتأكد التقاطع ثم يتم تنفيذ جسد جملة الشرط وهو ما تم وضعه بين القوسين { }

ثم الجزء الخاص بتعريف الأستوب لوز والهدف

if(StopLoss==0){SL=0;}else{SL=Ask-StopLoss*Point;}
if(TakeProfit==0){TP=0;}else{TP=Ask+TakeProfit*Poi nt;}
واستخدم فيها الجمله الشرطيه if.............else
وهي إذا كان StopLoss يساوي 0 وهو ما نقوم بتحديده من المتغيرات الخارجيه للإكسبرت فاجعل SL =0
وإلا فإنه ينفذ الأمر الآخر وهو
SL=Ask-StopLoss*Point
حيث Ask هو سعر الدخول شراء
StopLoss وهو عدد نقاط الأستوب لوز
فمثلا إذا كان سعر الدخول شراء هو 1.3077 وجعلت الأستوب لوز يساوي 20 نقطة
Point وهي قيمة النقطة للزوج الحالي
فسيكون SL=1.3077-20*Point
فيصبح الأستوب لوز 1.3057
ونفس الشيء بالنسبه للهدف

وبعد ذلك ينفذ الأمر OrderSend

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,SL,TP,"MR.dol lar EA",MagicNumber,0,Blue);

ويقوم بإصدار تنبيه صوتي

PlaySound("Alert.wav");

ثم بعد ذلك نغلق الجمله الشرطيه بإستخدام القوس {

ويتم كتابة الأمر OrderSend بالشكل التالي

OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment, int magic, dat
حيث
symbol هو إسم العمله
cmd وهو نوع الصفقه شراء أو بيع او غير ذلك
volume وهو حجم اللوت
price وهو سعر الدخول بالنسبة للشراء فيكون سعر الدخول هو سعر Ask وبالنسبه للبيع فيكون سعر الدخول هو سعر Bid
إذا كانت الأوامر معلقه فيكون سعر الدخول هو مكان وضع الأمر المعلق
slippage أقصى تغير في السعر يسمح به فمثلا إذا وضعته 3 وكان سعر الدخول 90.15 فسوف يسمح الإكسبرت بتحرك أقصى حد 3 نقاط ويمكن الدخول في الصفقه
stoploss الأستوب لوز
takeprofit الهدف
comment التعليق الذي يتم كتابته بجوار الصفقه
magic الماجيك نمبر
expiration تاريخ إنتهاء الصفقه وهو خاص بالأوامر المعلقه
arrow_color لون السهم الذي سيظهر على الشاشه عند فتح الصفقه

بعد ذلك نضع شروط الدخول بيع

if (ma22>ma11&&ma2<ma1 ){

if(StopLoss==0){SL=0;}else{SL=Bid+StopLoss*Point;}
if(TakeProfit==0){TP=0;}else{TP=Bid-TakeProfit*Point;}

OrderSend(Symbol(),OP_SELL,Lots,Bid,3,SL,TP,"MR.do llar EA",MagicNumber,0,Red);
PlaySound("Alert.wav");


}
وأخيرا نغلق الداله start بإستخدام القوس {
ونكون قد أنهينا بفضل الله تصميم أول إكسبرت لك قد يكون الموضوع صعب في البدايه بسبب كثرة الأوامر والأكواد ولكن مع الإستمرار في التعلم ستجد الأمر بسيط

وفي الدرس القادم سنحاول نضيف بعض الخصائص الإضافيه للإكسبرت مثل أقصى عدد للصفقات ودالة إغلاق الأمر ونصعب الأمر قليلا
ettahrim
01-31-2012, 10:40 PM
بسم الله الرحمن الرحيم

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

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

أولا : الحلقه for

سوف تتضح أكثر بمثال لنرى المثال التالي بالنسبة للحلقه for

for(int i=5;i>0;i--)
{
PlaySound("Alert.wav");
}
في البدايه نقوم بكتابة الحلقه for ثم يتبعها قوسين نقوم بداخلها بكتابة شروط الحلقه وفي الحلقه السابقه قمنا أولا بتعريف المتغير i=5 ثم قمنا بمقارنه هل i أكبر من صفر إذا كانت الإجابه نعم فقم بطرح واحد من قيمة i ولا ننسى وضع الفاصله المنقوطه التي تفصل بين كل جزء والآخر ثم تقوم بتنفيذ جسم الحلقه وهو إعطاء تنبيه ثم تعود الحلقه مره أخرى لمقارنه الشروط بعد أن أصبحت i=4
هل i>0 إذا كانت الإجابه نعم سيطرح واحد من i ثم ينفذ جسم الحلقه وهو إصدار التنبيه
ثم يعود إلى المقارنه مرة أخرى حتى يصل إلى i=0 ثم يقارن هل i>0 فستكون الإجابه فولس بالتالي يتم إنهاء الحلقه وينتقل إلى الأمر التالي

ثانيا : الحلقه while

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

int i;
while(i<20)
{
PlaySound("Alert.wav");i++
}
نقوم مباشرة بالمقارنه هل i أقل من 20 إذا كانت الناتج ترو يقوم بإصدار تنبيه ثم يعود مره أخرى هل i أقل من 20 فإذا كان الناتج ترو سوف يقوم بإصدار تنبيه وغالبا ما تستخدم هذه الحلقه إذا لم نعرف قيمة i أو إذا كانت i قيمه متغيره

ملحوظات :
يمكن إستخدام أكثر من أمر في جسم الحلقه مثلا

for(int i=5;i>0;i--)
{
PlaySound("Alert.wav");
Print("************");
}

يمكننا أيضا تعريف المتغير i خارج الحلقه مثلا

int i;
for(i=0;i<20;i++)
{
PlaySound("Alert.wav");
}
طبعا هذه الحلقات بإختصار ولكن مع التطبيق وعندما ندخل في الإكسبرتات الصعبه سنعرف كيفية إستخدام هذه الحلقات بشكل إحترافي أكثر

الدوال :

كما أخبرنا سابقا أن الدوال الأساسيه الموجوده في المؤشر أو الإكسبرت ثلاثة دوال هم

init() start() deinit(

لنبدأ بمثال مباشر

int orderscnt(){


return(0);
}
كما نلاحظ يتم تعريف الداله تماما كأننا نقوم متغير
فمثلا إذا أردنا أن تعود الداله بقيمة عدد صحيح فسوف نقوم بتعريفها على أنها int أو عدد صحيح
وإذا أردنا أن تعود الداله بقيمة عدد عشري سنقوم بتعريفها بإستخدام الأمر double
وإذا كانت ستعود بقيمة منطقيه ترو أو فولس سنقوم بتعريفها على أنها متغير من نوع bool
ثم بعد ذلك يتبع الداله قوسين ()
بعد ذلك نستخدم الأقواس { } ويوضع بداخلها الأوامر التي ستنفذها الداله عند إستدعائها
ثم تأتي في النهاية الداله return وهي تقوم بإنهاء هذه الداله وتعود بالقيمه التي أخذتها هذه الداله
طبعا في مثالنا السابق الداله سوف تعود بالقيمه 0

لنبدأ بدالة بسيطه تحسب قيمة حاصل جمع متغيرين

int equal(){
int a=5; int b=12;

int c=a+b;

return(c);
}
[]في المثال السابق قمنا بتعريف المتغير a وأخذ القيمه 5 والمتغير b وأخذ القيمه 12
والمتغير c=a+b
ثم قمنا بإنهاء الداله وحفظ الناتج عن طريق الأمر

return(c);

الآن إذا أردت إستخدام هذه الداله بداخل الداله start وأردت على سبيل المثال أن أقوم بعمل مقارنه بسيط إذا كان ناتج الداله أقل من 20 فسوف يقوم بإصدار تنبيه صوتي

سنقوم بكتابة بداخل الداله start

if( equal() < 20 ){PlaySound("Alert.wav");}

طبعا إذا راجعنا ناتج الداله equal فسوف يكون 12+5 بالتالي ستكون عملية المقارنه ترو وسوف يقوم بإصدار تنبيه

الآن ماذا إذا أردت أن أجعل الرقمين 12 و 5 كمتغيرين يتم تحديدهم كل مره عند إستدعاء الداله
في هذه الحاله سنقوم أولا بتعريف الداله بشكل آخر فبدلا من أن نقوم بتعريف المتغيرين a و b بداله الداله نفسها سنقوم بتعريفهم بداخل القوسين ( ) كما في المثال التالي

int equal(int a , int b){

double c=a+b;

return(c);
}
والآن عندما نقوم بإستدعاء الداله بداخل الداله start
ستكون المقارنه كالآتي

if(equal(12, 5)<20){PlaySound("Alert.wav");}

كما ترى قمنا بكتابة 12 و 5 بدلا من a و b التي قمنا بتعريفها بداخل القوسين ويمكن كتابة أي قيمة أخرى بدلا من 12 و 5 وهذا هو سبب تعريفنا لها كمتغيرات في الداله

وفي الدرس القادم سوف نقوم بإنشاء دالة تعود بعدد الصفقات المفتوحه لنستخدمها في الإكسبرت الذي نعمل عليه
ettahrim
01-31-2012, 11:05 PM
السلام عليكم ورحمة الله
أقدم لكم اليوم اكسبيرت أكثر من رائع ، وسوف اشرح طريقة عمله بالتفصيل حتى تطمئن قلوبكم
الاكسبيرت يعتمد على دمج 3 استراتيجيات :
1- الهيدج : Hedge
2-علاقة العملات Correlation
3-الأوامر المعلقة :Grid


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

اولا / ما هو الهيدج Hedge ؟

- الهيدج او بالعربية تسييج او تطويق الحساب الخاص بك يعنى فتح صفقتين على نفس زوج العملة باتجاهات متعاكسة فى توقيت متقارب بنفس قيمة العقد لكليهما ، بمعنى ان تفتح صفقة شراء يورو / دولار بواحد ميكرو لوت اى 1000 وحدة من العملة وبعدها بثوانى تفتح عقد أخر بنفس القيمة "1000" على اليورو / دولار ولكن شورت ولنرى تاثير ذلك على الإكويتى Equity او ما يعرف بالحساب العائم او بعبارة أخرى شكل حسابك هيكون ايه بعد أغلاقك الهيدج .. تابع معى أخى الكريم بعد فتحك صفقة هيدج على زوج من العملة وأنظر الى الاكويتى ستجد انه رقم ثابت لايتحرك بعكس لو فتحت صفقة شورت او لونج فقط فان الاكويتى سيتأرجح حينها سلبا وايجابا بحسب مدى نجاح صفقتك ، اما فى حالة الهيدج فليس هناك مكسب وليس هناك خسارة وانما اجمالى الحساب حينها سيقف عند أخر نقطة بعد فتحك للصفقتين ولن يؤثر فيه مكسب أحداهما او خسارة الاخرى طالما ان الهيدج مغلق ولم تفك الهيدج الذى فتحته .
ويختلف فك الهيدج من متداول إلى آخر .

ثانيا / ماهي نظرية ال Correlation ؟
نظرية correlation بتقول لو تحركة عمله معينه والعلاقه بينها وبين عملة تانيه علاقه طرديه فلازم تمشي بنفس المسار وبنفس الأتجاه يعني لو تحرك البوند مثلا وليس تأكيدا 100 نقطه سوف يقوم اليورو بتحرك ضد الدولارأقل شي 60 او 70 نقطه ( حسب نسبة ال Correlation) ونفس الشي لكل العملات الأخرى ّ ذات العلا قه الطرديه.
وهذا موقع يظهر نسب ال-Correltaion أو نسب العلاقات بين الأزواج .

ثالثا / إستراتيجية الأوامر المعلقة :
وهي أن نقوم بتعليق أوامر شراء أعلى السعر الحالي (مثلا ب 10 نقاط ) واوامر بيع أدنى السعر الحالي
إذا إرتفع السعر يتم تفعيل أوامر الشراء وإذا إنخفض يتم تفعيل أوامر البيع إلخ
وتختلف طرق الإستعمال من متداول إلى آخر ومن استراتجية إلى أخرى .


نأتي الآن إلى استراتجية الاكسبيرت :
عند تفعيل الاكسبيرت يقوم بفتح عقد بيع على العملة الأولى (مثلا GBP/JPY) وعقد شراء على العملة الثانية
(مثلا CHF/JPY )
*عقد البيع يكون أكبر من عقد الشراء بنسبة معينة (حسب قوة ال Correlation)
*العملتان علاقتهما علاقه طرديه بنفس المسار وبنفس الأتجاه .

ثم يقوم الاكسبيرت بإنشاء أوامر شراء معلقة على العملتين بإختلاف عدد معين من النقاط وبحجم أقل من حجم العقود المفتوحة (تقريبا الثلث )

وتكون الصورة كالآتي :
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
سنواجه الآن حالتين :
الحالة الأولى انخفاض السعر ( في العملتين طبعا )
ستكون عملية البيع اجابية وعملية الشراء سلبية
لكن حجم عقد البيع أعلى من حجم عقد الشراء ب-20 % تقريبا
يعني في هذه الحالة النتائج إيجابية إن شاء الله رب البرية
سيقوم الاكسبيرت بغلق جميع الصفقات في الوقت المناسب إذا تراجع السعر أو إذا وصل إلى نسبة الربح المطلوبة
الحالة الثانية ارتفاع السعر ( في العملتين طبعا ) :
ستكون عملية الشراء اجابية وعملية البيع سلبية
وحجم عقد الشراء أقل من حجم عقد البيع ب-20% تقريبا لكن عند أول أمر شراء معلق (30% من العقد المفتوح ) يصبح حجم عقدين الشراء أعلى من حجم عقد البيع ب-10% ،
وإذا تواصل إرتفاع السعر تتواصل عملية تفعيل عقود الشراء المعلقة وتتواصل الأرباح
يعني في هذه الحالة النتائج إيجابية إن شاء الله رب البرية

الزوجين الافتراضين مع الاكسبيرت هما CHF/JPY و-GBP/JPY
علاقتهما جيدة لكني فضلت تجربة الاكسبيرت على اليورو (Symbol2 EUR/USD )
والباوند ( Symbol2 GBP/USD)
وكانت النتيجة رائعة على الديمو (20% أرباح في يوم ) :
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
يجب إختيار الزوجين بعناية بالإستعانة بهذا الموقع

لكن هناك طريقة لإختيار الزوجين ، وهي عن طريق الاكسبيرت
حيث يقوم بتحليل جميع الازواج واستخراج الزوجين الأكثر تطابق
وذلك بتفعيل المتغير UseDynamicPairs
لكن هذا التحليل قد يتطلب بعض الوقت

في النهاية :
*أرجو منكم تجربة الاكسبيرت على الديمو (لا يمكن على الباك تست لأنه يستعمل أكثر من زوج )
*إختبار عدة إعدادات (أنا عن نفسي إستعملت الإعدادات الإفتراضية فقط بتغيير الزوجين )
*مشاركتنا النتائج والآراء
*إقتراحات التطوير
*والدعاء عن ظهر الغيب


وجزاكم الله خيرا
ettahrim
01-31-2012, 11:08 PM
اعمل باك تيست 99% بكل سهولة ومن الالف للياء
بسم الله الرحمن الرحيم

دى اول مشاركة لى فى هذا المنتدى المتميز واتمنى من الله ان تكون مفيدة للجميع
بصراحة انا حاولت اعمل باك تيست 99% كتير واستعنت بمواضيع هنا فى المنتدى ومنتديات اخرى بس بصراحة ماوصلتش لحاجة . فقررت ان اول حاجه اعملها بعد ماتعلمت ان اشرح الطريقة بكل سهولة وهقسمها على خطوات زى ما قلت من الالف للياء .
واى استفسار انا فى الخدمة
نتوكل على الله:
هنقسم الموضوع ل 3 اجزاء
1-اعدادات الجهاز
2-الملفات المطلوبة
3-اجراء الاختبار
1- اعدادات الجهاز(هيكون لمستخدمى ويندوز XP فقط)

أ- تثبيت .NET FRAMWORK 4 ([عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ])
ب-تثبيت C++ RUNTIME([عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ])

وكده نكون خلصنا الجزء الاول


2- الملفات


أ- تحميل الملفات
وده هنعمله عن طريق برنامج DUKASCOPIER الموجود بالمرفقات نقدر نختار زوج العملات والفترة ونعلم على المربع المكتوب بجوارة DOWNLOAD ونترك المربع التانىBUILD CSV فاضى
هياخد وقت طويل علشان التحميل وبعدين هنلاقى فولدر باسم الزوج العملات فى نفس مكان البرنامج
ب-تحويل البيانات
نحول البيانات (الفولدر اللى نزلناه) من فولدر لملف امتدادهCSV يقدر يتعامل معاة الميتا تريدر وده عن طريق نفس البرنامج بس المرة دى نعلم على المربع التانى BUILD CSVونخلى المربع اللى بجوار DOWNLOAD بدون علامة
ولازم يكون الفولدر فى نفس المكان هو والبرنامج

وكده نكون كملنا جزء كبير وباقى التعامل مع الميتا تريدر
ettahrim
02-01-2012, 11:51 AM
بسم الله ماشاء الله

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

هذا اكسبيرت ABHAFX DAILY EXPERT محقق اليوم الثلاثاء 2092 نقطة خلال 20 ساعة

بداية عمل الكسبيرت الساعة 03.00 صباحا بتوقيت مكة

الكسبيرت يعمل على الانتر بنك فقط لا غير

العملات المفضلة هى

GBPJPY

GBPCHF

AUDJPY

EURJPY

USDJPY

نتركم مع الهيسترى--


اسعد بارئكم

المؤشرات سوف اضعها قريبا ان شاء الله
الصور المصغرة للصور المرفقة
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-01-2012, 11:57 AM
بعد وقوعي في مشكل عويص اكتشفت بان برنامج metaeditor الموجود بالميتتريدر
من البرامج المستعصية يعني ادا قمت بالغاء تثبيت برنامج الميتتريدر يبقى
جهاز الكمبيوتر يتعرف على ملفات mp4 اي تبقى باللون الاصفر
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]

و المشكل العويص الدي وقعت فيه هو
اثناء قيامي بالتعديل على احد الاكسبرتات للتعلم و عمل تجارب لانني مبتدء في مجل البرمجة
توجد بعض الاخطاء التي لايكتشفها برنامج metaeditor عند الضغط على Compile
يضهر لك في صفحة الاخطاء 0 error(s), 0 warning(s)
لكن بعد ما تعمل للاكسبيرت باك تست يضهر لك اخطاء في صفحة الجورنال
هنا في هده الحالة انت مضطر الى مراجعة جميع اكواد الاكسبيرت يدويا
وبعد اكتشاف الخطا وتصحيحه تعمل باك تست مرة اخرى فتلاحظ ان الاكسبيرت يعطي اخطاء
في صفحة الجورنال مثل ما وقع معي
لدالك قمت بحدف الاكسبيرت المعدل و وضعت الاكسبيرت الاصلي نفس المشكل يعطي اخطاء
في صفحة الجورنال قمت باعادة تحميل الاكسبيرت من الموقع و تجربته نفس المشكل

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

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

سوف اقوم الان بشرح البرنامج

بعد تثبيت برنامج PerfectUninstaller

نقوم بتفعيل السريال
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]


بعد ما قمنا بتفعيل برنامج PerfectUninstaller

اولا و قبل كل شيء قم بنزع مؤشراتك و اكسبرتاتك الشخصية من برنامج الميتتريدر لكي لا تفقدها

اتبع الخطوات التالية لحدف برنامج الميتتريدر من جدورة بدون ترك اي مخلفات
ومن بين هده المخلفات برنامج metaeditor الدي كان يبفى يتعرف عليه جهاز الكمبيتر حتى ولو قمت بحدف الميتتريدر بالطريقة العادية

سوف نتخلص منه نهائيا هده المرة
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]

في هده العملية يقوم برنامج PerfectUninstaller بالبحث عن مخلفات الميتتريدر
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
سوف تلاحظون في الصورة الموالية ان البرنامج يضهر لنا المخلفات التي وجدها

ملاحظة هامة
قم بتحديد المخلفات الموجودة في ملف C:\Program Files فقط لتجنب المشاكل
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]

هدا مثال اوضح
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ونعمل Next ثم yes

اعد تشغيل جهاز الكمبيوتر سوف تلاحظ ان الكمبيونر لا يتعرف على الاكسبرتات و المؤشرا
التي بصيغة mq4

وهكدا نتخلص نهائيا من برنامج metaeditor و تعود المياه الى مجاريها

رابط تحميل البرنامج PerfectUninstaller.6.3.3.9.30.09.2011

اسالكم الدعاء
ettahrim
02-01-2012, 12:06 PM
حقيقه كنت أريد فتح هذا الموضوع من فترة لكن لكثره الطلبات لم أجد الوقت لذلك لكن بإذن الله ها أنا أضع بين أيديكم واحد من أفضل الإكسبرتات المجانيه والناجحه ورغم ذلك لا يعلم الكثير عنه شيئا

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

وقد إخترت هذا الإكسبرت بالذات لأشرح هذه الآلية التي يمكن إستخدامها لاحقا لزيادة نجاح أي إكسبرت

مبدئيا الإكسبرت يعتمد في الدخول والخروج من الصفقه على الآتي

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

مؤشر Keltner Channel وهو مؤشر شبيه بالبولينجر باند ويعتمد على مؤشر ATR وسوف أقوم بشرحه في موضوع لاحق بالتفصيل وكيفية إستخدام هذا المؤشر
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
الدخول شراء:
_إذا كان الأستوكاستيك الكبير أكبر من 60 ( أو أي قيمة تحددها )
_إذا كان الأستوكاستيك الوسط أكبر من 60 (أو القيمه المحدده سابقا)
_الفرق بين الأستوكاستيك للشمعه الحاليه والشمعه السابقه أكبر من 5
_الفرق بين الأستوكاستيك الكبير والأستوكاستيك الوسط أقل من MaxStochDifference
_موفينج أفريج الشمعة الحاليه أكبر من موفينج أفريج الشمعه السابقه (للدلاله على تأكيد الصعود)
_إغلاق الشمعة الحاليه أقل من الحد العلوي للبولينجر وكذلك هاي الشمعة الحاليه أقل من الحد _العلوي للبولينجر (لتجنب الإرتداد)
_الحد العلوي لمؤشر Keltner Channel أكبر من إغلاق الشمعه الحاليه
_الأستوكاستيك الصغير أقل من ShortStochBuyEntry وهي النقطة التي يتم تحديدها للدخول شراء بعد التشبع
_القيمه الحاليه للأستوكاستيك الكبير+7 أكبر من القيمه السابقه له
_القيمه الحاليه للأستوكاستيك الوسط+10 أكبر من القيمه السابقه له
_الحد السفلي لمؤشر Keltner Channel أكبر من الحد العلوي للبولينجر أو لو الشمعة الحاليه أقل من موفينج أفريج 9 أو قيمة الأستوكاستيك الوسط الحاليه أكبر من قيمته في الشمعة السابقه

إذا تحققت هذه الشروط يتم الدخول شراء والعكس في حالة البيع
مثال لدخول صفقة بيع
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
أما الآلية الأذكى في الخروج من الصفقه هي
إذا كان الخط الأخضر أقل من الخط البني أي عدم وجود إنفجار سعري شراء و
(
الحد السفلي لمؤشر Keltner Channel B أكبر من الحد السفلي للبولينجر باند و
قيمة الأستوكاستيك الأكبر أقل من 80 و
قيمة الأستوكاستيك الأوسط أقل من 50

أو
قيمة الأستوكاستيك الأصغر أكبر من ShortStochBuyExit وهي القيمه التي يتم تحديدها للتشبع شراء
أو
إغلاق الشمعة الحاليه أكبر من الحد العلوي للبولينجر باند و الحد السفلي لمؤشر Keltner Channel أقل من الحد السفلي للبولينجر باند وهي أحد إستخدامات هذا المؤشر للكشف عن التذبذب
والقيمه الحاليه للأستوكاستيك الأكبر أقل من 90
أو
القيمه الحاليه للأستوكاستيك الأوسط + RiskFactor أقل من القيمه السابقه له
أو
القيمه الحاليه للأستوكاستيك +(TwoPeriodExitMultiple*RiskFactor/10) ويتم تحديدهم من المتغيرات الخارجيه للإكسبرت أكبر من الأستوكاستيك الأوسط للشمعه قبل السابقه
)
أو الخروج بإستخدام التريلينج ستوب بناء على معدل الحركه اليومي للعمله

مثال لخروج من صفقة ولاحظ كيف تم الخروج قبل أن يتم خساره أكثر من 5 نقاط
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]

صورة لباك تست على اليورو دولار لمدة عشر سنوات منذ عام 1999
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]

مرفق الإكسبرت وملف الإعدادات لليورو دولار وهي تصلح أيضا الدولار ين ولنحاول جميعا الوصول إلى أفضل الإعدادات لباقي العملات وليختار كل واحد منا عمله ويقوم بعمل optimization لها لنصل إلى أفضل إعداداتها وكذلك منتظر آرائكم لتطوير الإكسبرت وزيادة كفاءته
وأرجو تجربته ديموأولا حتى التأكد من نجاحه
يوجد أربع نسخ مرفقه للإكسبرت أفضلها هو Gods Gift ATR_live_accounts
ettahrim
02-01-2012, 12:21 PM
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]

العملة


: الباوند دولار

الفريم المستخدم : 1 دقيقة
مكونات


النظام

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

. مؤشرالهيكن


اخضراتجاه صاعد
احمراتجاه هابط

.EMA 6
EMA 12.
. SMA 50

. FX Prime filter


شروط


الدخول




الدخول لونج
========

1. ظهور سهم تأكيد تقاطع EMA 6بللون الاخضرمعEMA 12 بللون الاحمر واختراقهم لـSMA 50للاعلى

2. تغيرلون الهيكن للون الاخضر

2. ظهور اللون الاخضرعلىمؤشرfx-prime filter

=============
الدخول شورت العكس
=============


الأهداف و وقف الخسارة
في حال كنت متابع للصفقة لا اضع هدف و لا وقف و يكون الخروج عند تغيير لون مؤشرالهيكن
وفي حال غيرمتابع للصفقةأضع الهدف 50 ووقف الخسارة 30

ملاحظات مهمة
1- ادا حصل التقاطع ولم تظهر اشارة الدخول على مؤشرFxprime filterوظهرت بعد 5 شمعات لاندخل في الصفقة
ولكن هنا سندخل انشاءالله بعقود بسيطة لأنها تعتبراشارة غير قوية
2-


الابتعاد عن المتاجرة قبل الاخباربـ 30 دقيقة وبعد الاخباربـ 30 دقيقة
ettahrim
02-01-2012, 01:04 PM
بسم الله الرحمن الرحيم

اليوم سوف أشرح أبسط أنظمة الفوركس

يمكن ان يكون سر ويمكن لأ

الجميع سيربح انشاء الله
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]

المتطلبات:-

1-شارت ليس الشموع لكن القضبان

2-موفينج افرج 21

4-شارت الأربع ساعات فقط!!!
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]

شروط الدخول تكون قضيب داخلي كما في الأمثله بالأسفل:-
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
-1يتم تعليق امر بيع او شراء حسب الترند بعد 5 نقاط

2-يوضع الوقف كما هو موضح بالأمثله

3- الأهداف ننتظر اغلاق شمعتين اربع ساعت ونغلق عالربح يمكن نضع 50 نقطه كهدف كحد ادنى__حسب حركة العمله


نموذج لدخول خاطيء :
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]

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


المميزات:-

1-سهولة النظام

2-المتابعه كل اربع ساعات فأنت لن تحتاج للركوع امام الشارتات فقط تابع كل اغلاق اربع ساعات

3-نسبة نجاح تصل الى 90%


هذا وكل توفيق فمن الله وكل خطأفمني ومن الشيطان


.......................

مرفق المؤشر المستخدم كما في الشرح
ettahrim
02-01-2012, 04:15 PM
متغيرات الإكسبرت
UseTimeFilter إستخدام فلتر توقيت عمل الإكسبرت
StartHour بداية عمل الإكسبرت
EndHour نهاية عمل الإكسبرت
Golden Finger Settings إعدادات مؤشر Golden Finger

Fisher_m11 Settings إعدادات مؤشر فيشر

HMA_Color_nrp Settings إعدادات مؤشر HMA

Lots حجم اللوت
UseMoneyManagement إستخدام خاصية إدارة المال
RiskPercent نسبة المخاطره
StopLoss الأستوب لوز
TakeProfit الهدف

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

بالنسبة لإشارة الخروج من الصفقه فهي عند ظهور إشارة عكسيه من مؤشر Golden Finger

لنحاول تجربة الإكسبرت وإيجاد أفضل الإعدادات والأزواج للعمل عليه
الملفات المرفقة
ettahrim
02-01-2012, 04:21 PM
قمت ببرمجة إكسبرت للمؤشر بأكثر من فكرة

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

باك تست من بداية عام 2010 حتى اليوم
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
مرفق الإكسبرت وملف الإعدادات

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

باك تست من بداية عام 2010 حتى اليوم
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
مرفق الإكسبرت وملف الإعدادات

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

شرح إعدادات الإكسبرت
UseHourTrade تفعيل أو تعطيل فلتر توقيت عمل الإكسبرت
FromHourTrade بداية عمل الإكسبرت
ToHourTrade نهاية عمل الإكسبرت
CloseOppositeSignal إغلاق الصفقه في حال ظهور إشارة دخول عكسيه
DeletePendingTime حذف الأمر المعلق بعد عدد ساعات محدده في حال لم يتفعل وهي موجود في الإكسبرت الثاني فقط
TopsBottomsNumber , MA_Shift , ApplyTo إعدادات مؤشر الموفينج

Lots حجم اللوت
MM تفعيل خاصية إدارة المال , RiskPercent نسبة المخاطره
UsePartialClose تفعيل أو تعطيل خيار إغلاق جزء من الصفقه
PercentClose1 نسبة إغلاق من حجم اللوت
TakeProfit1 الهدف في حال تفعيل خاصية إغلاق جزء من الصفقه
StopLossAfterPartial وضع الأستوب لوز لحجم اللوت المتبقي على ربح عدد نقاط معينه

StopLoss الأستوب لوز الأساسي
TakeProfit الهدف الأساسي
ettahrim
02-01-2012, 04:25 PM
يعتمد على مؤشرين قويين
تم تجربتهما لأكثر من 6 اشهر
كنت قد وضعت طلبي في احد المواضيع [ورشة متابعة] إكسبرت مؤشر (Volatility.Pivot)
لكن ارتأيت وضعه هنا لتسهل الرؤية
المرجو جعله كالاتي
Lots حجم اللوت
UseMoneyManagement إستخدام خاصية إدارة المال
RiskPercent نسبة المخاطره
StopLoss الأستوب لوز
TakeProfit الهدف
BreakEven البريك إيفن
TrailingStop التريلينج ستوب
MaxOrders أقصى عدد للصفقات المفتوحه في نفس الوقت
CloseOppositeSignal إغلاق الصفقه في حال ظهور إشارة دخول عكسيه
MondayFilter
MondayHourStart
MondayMinuteStart
MondayHourEnd
MondayMinuteEnd
WeekFilter
StartHour
StarMinute
EndHour
EndMinute
FridayFilter
FridayHourStart
FridayMinuteStart
FridayHourEnd
FridayMinuteEnd
GlobalProfit قيمة الربح بـالدولار عند تحقيقها يتوقف عن التداول لذلك اليوم
GlobalLoss قيمة الخسارة بـالدولار عند تحقيقها يتوقف عن التداول لذلك اليوم
المرجو وضع اعدادات المؤشرين في الاكسبيرت
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-01-2012, 05:28 PM
السلام عليكم اخواني الكرام

اتوقع ان شاء الله ان هذه الاستراتيجيه ستكون هي القمه في سنه 2012 وعساها تكون سنه خير على الجميع

والحقيقه هي لا تحتاج شرح كبير لانها واضحه جدا

الفريم 5 دقائق ويفضل العمل بها على عمله اليورو دولار والاسترالي دولار



قمت بالشرح في الصوره المرفقه وان شاء الله ان اكون وفقت في ذلك


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


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


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



تمنياتي للجميع بالتوفيق
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-01-2012, 05:36 PM
السلام عليكم و رحمة الله ..

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

كانت نتاثجها مذهله بعد عدة اختبارات

تم اختبار هذه الاعدادات على دقة تاريخ 99% وانشاءالله سوف يتم اختبارها على ديمو قريبا

ملاحظه هامه جدا !!!! للجميع :

عمل اختبار في جودة90% سوف تختلف نهائي عن جودة 99% اتمنى الجميع اخذ هذا في عين الاعتبار

حتى يعرف ليس كل اكسبرت كان خاسران في الباك تيست يعني انه فاشل ..

و اترك لكم الصوره مع الاكسبرت و الاعدادات

مع تحياتي للجميع بالتوفيق
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-01-2012, 05:48 PM
مؤشر البايفوت فايبو لكل اسبوع
ettahrim
02-01-2012, 05:53 PM
اخواني الكرام



لفت نظري هذا المؤشر لقياس الترند والتذبذب والوقاية منها فارجو منكم تجربتة

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



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

المؤشر اسمة stepchoppy_v1.2

ولكن يوجد فيرجن جديد stepchoppy_v1.3

المؤشر يعتمد علي مؤشرين اخرين لابد من وجودهم معه في فولدر المؤشرات

وهما في المرفق

ارجو منكم الدعاء لي و والدتي بالرحمة والمغفرة والعفو


وارجو من الله ان يفيدكم المؤشر كما افادني
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-01-2012, 08:56 PM
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]


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

على سبيل المثال يبدو الباوند دولار على شارت الساعة قد وصل الى الخط الأزرق وبدأ من بعده رحلة الهبوط والله أعلم .
ettahrim
02-01-2012, 09:06 PM
بسم الله الرحمن الرحيم

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

هذه هي النسخة الجديدة من الاكسبيرت الأساسي TrendMeLeaveMe

أسميناها النسخة الذهبية TrendMeLeaveMe_Gold وفيها الكثير من الميزات الإضافية الهامة ( والموضوع ما زال قابلا للتطوير والتحديث )


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

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

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

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

- عملية شراء buystop تتم عند اختراق السعر لترند ( صاعد أو هابط ) من الجهة السفلية منه إلى الجهة العلوية.

مثال تصويري : شخص قذف كرة للأعلى بقوة شديدة فقامت باختراق السقف للأعلى واستمرت في الصعود.

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

- عملية بيع sellstop تتم عند كسر السعر لترند ( صاعد أو هابط ) من الجهة العلوية منه إلى الجهة السفلية.

مثال تصويري : شخص قذف كرة للأسفل بقوة شديدة فقامت بكسر الأرض للأسفل واستمرت في الهبوط.

على اعتبار أن الأرض هي الترند وحركة الكرة هي حركة السعر وعملية بيعك تمت تحت الأرض ( الترند ).

- عملية شراء buylimit تتم عند ارتداد السعر عن ترند ( صاعد أو هابط ) في الجهة العلوية منه.

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

على اعتبار أن الأرض هي الترند وحركة الكرة هي حركة السعر وعملية شرائك تمت عند نقطة الارتداد عن الأرض ( الترند ).

- عملية بيع selllimit تتم عند ارتداد السعر عن ترند ( صاعد أو هابط ) في الجهة السفلية منه.

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

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

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

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

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

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

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

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

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

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

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

غالبا عند الاختراق فإن أقل قيمة للاختراق لا تقل عن 30 - 40 نقطة ويمكن أكثر حسب قوة الترند.

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

ولكن يمكنك رسم أربعة ترندات بأربعة أنواع على نفس الشارت.

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

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

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

في الشارت الملحق شرح إضافي لعملية buystop.

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

ومن ثم تشغل الاكسبيرت

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

هذه صورة توضيحية لترند sellstop ولم يدخل السعر منطقة التجهيز بعد
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
وهذا نفس الشارت قمنا بتكبير وتعريض منطقة التجهيز ليدخل السعر ضمنها

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


أرجو أن تكون الصورة قد وضحت الآن

وباقي أنواع الترندات بنفس طريقة العمل ولكن عليكم تغيير مسمياتها لتتوافق مع مسميات الاكسبيرت نفسه
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-02-2012, 01:01 AM
أجلب لكم مؤشر Winning Solution System


[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]

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



المؤشر يعطى Signals
لكل من
BUY
SELL
SET STOP LOSSES
TAKE PROFITS

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

وشكرا مرة أخرى و أرجو أن تنال مشاركتى اعجابكم

ملحوظة : المؤشر يعمل على الميتا تريدر
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]

رابط مباشر : [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
أو
على الرابيد شير : [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-02-2012, 12:09 PM
كل يوم هدية ؟!!!

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

مشروع جواز قريب ويمكن اسيبكم

طبعا هابيع الفوركس بس مش هابيعكم ابدا


هارمونيك علي ميوري ماث علي ترند زي الفل

عارفين غسالة LG الديجيتال ؟


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


يلا سلام بأه
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-02-2012, 12:10 PM
السلام عليكم ورحمة الله وبركاته

أدناه الأكسبيرت الذي استغرق تطويره وقت وجهد كبير من قبلي

وهذه هي الاصدارة الاولى

لكن ينقصها بعض الاضافات التي سوف أضيفها تباعا

الأكسبيرت معروض للتجربة , نظرا لمشاكل النت عندي فلم أتمكن من فتح حساب تجريبي للأكسبيرت

أرجو من الاخوة الراغبين بالمتابعة فتح حساب تجريبي للأكسبيرت

ملاحظات مهمة :

1- الأكسبيرت يعمل على الديمو فقط
2- الاكسبيرت غير مفتوح المصدر حاليا
3- الباك تيست لا يعمل لأسباب فنية
4- في حالة نجاح الأكسبيرت فهو مطروح للمشاركة فقط , يعني ليس للبيع , ومستعد للتعاون مع كل من يرغب مشاركتي
5-هناك أضافات خطيرة لم يسعفني الوقت في اضافتها سأضيفها تباعا .

النسخة الحالية لزوج الدولار ياباني فقط والسبريد يجب ان يكون 3 نقاط

اذا كان السبريد اكثر او اقل من 3 نقط غيره من الاعدادات تحت فقرة
SSS=3
غيرها لكي تساوي السبريد
ettahrim
02-02-2012, 12:13 PM
السلام عليكم ورحمة الله وبركاتة

الموضوع تعبت فية كثير لكن من المتابعة كانت النتائج جيدة والله الحمد

عملت المؤشر هذا خصيصا لعملتين مع المونى مانجمنت (حساب مصغر)

وهى الباوند ين / اليورو ين فقط لا غير

نعمل على حساب مصغر ب 3000$

طريقة الشراء

شراء عقد مصغر 0.10 من الخط الاول

شراء عقد مصغر 0.10 من الخط الثانى تعزيزى

الوقف 80 نقطة تحت الخط الثانى

الفارق بين الشراء الاول والثانى 100 نقطة

فى حالة ضرب الاستوب لوز سوف نخسر 260 نقطة للعقدين ما نسبتة -8.60%

النسبة ثابتة لا تتغير فى الوقف.

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

مانسبتة 42.4+ % علما ان النسبة قد تتغير الى اعلى من النسبة الحالية

تعتبر المخاطرة قليلة مقابل مكسب ممتاز .

مثال على ذلك GBPJPY

بتاريخ 22 اكتوبر الاسبوع الماضى

حسب معطيات المؤشر

دخلنا شراء عقد مصغر من الخط الاول 0.10 من سعر 231.88

دخلنا شراء عقد مصغر من الخط الثانى 0.10 من سعر 230.88

الوقف 80 نقطة تحت الخط الثانى

الباوند ين عمل LOW حتى سعر 230.27 ومن ثم ارتد الى اعلى والسعر

الحالى 237.30


هدفنا للعقدين 237.75

اليوم الثلاثاء 30 اكتوبر عمل هاى 237.71

اليورو ين ;

نسبة المخاطرة فى حالة ضرب الاستوب لوز 8.2-% ونسبة المخاطرة ثابتة

وفى حالة المكسب ستكون 30.2+% والنسبة غير ثابتة وقد تزداد بالارتفاع

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

ملاحظة المؤشر معطياتة اسبوعية فقط ولمزيد من المعلومات انظر على يسار التشارت
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-02-2012, 12:16 PM
بالنسبة للتدفقات النقدية فلها عدة مؤشرات

منها

مؤشر التغير السعري Price Rate of Change أو Price ROC
مؤشر ويليامز أو مايرمز له William's % R
مؤشر التدفق النقدي وهو Money Flow Index أو مايرمز له ب MFI

كل مؤشر له طريقته في حساب النقاط

منهم من يعتمد على التغير السعري للمؤشر أو لسهم معين

ومنهم من يعتمد على التغير السعري لسهم معين والاستعانة أيضا بحجم التداول

من المؤشرات المعروفة

مؤشر التغير السعري أو مايسمى ب Price ROCهذا المؤشر له قيم سالبة وموجبة وله مدة يحسب على أساسها النقاط
هذه المدة تبدأمن يوم واحد وتمتد الى 200 يوم أو أكثر
عدد الأيام المتعارف عليها في التعامل مع هذا المؤشر هي 12يوم أو 25 يوم
بالنسبة لتحديد نقاط البيع المفرط ( oversold) أو اشارات الدخول فكلما كانت القيمة سالبة ,كلما كان الشراء نوعا ما آمن
وكلما كانت النقاط موجبة ,كلما كان الشراء غير آمن أو بمعنى آخر اشارة خروج من السهم المعين أو مايسمى بالشراء المفرط (overbought)
ettahrim
02-02-2012, 12:21 PM
السلام عليكم ورحمة الله

هذا أحدث مؤشر لي يعتمد على مؤشرين هامين جدا هما البولنغر و ADX

استخدامه بسيط جدا وعلى جميع الفريمات مع ملاحظة تغيير الأهداف والستوبات

المؤشر اسمه Waddah Attar ADXxBollinger
وقد تم نشره على هذا الرابط
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-02-2012, 12:24 PM
مؤشر من 3 متوسطات وهو في غاية الدقه ويعطي إشارات دخول وخروج مناسبه جدا.. حتى لو أخرجك من السوق عن طريق الخطأ سيرجع ويدخلك السوق مره ثانيه في الوقت المناسب وفي المكان المناسب..
للعلم المتوسطات المتحركه لا تستخدم في كل إتجاهات السوق.. لها إستخدامات في إتجاهات معينه ونتائجها ممتازه جدا إذا أستخدمت الإستخدام الصحيح وفي الوقت المناسب وفي إتجاهات السوق الصحيحه.. ولكن إذا أستخدمت في غير مكانها فخسائرها سيئه جدا..
ettahrim
02-02-2012, 12:26 PM
السلام عليكم
اولا اتقدم بالشكر للاخ نظرة عقلانية على الفكرة وطريقةالمتميزة في شرحها.
اقدم لكم برنامج اكسبيرت يقوم بتنفيذ الفكرة وهي النسخة الاولى وقابلة طبعا للتطوير والتطويع على حسب التعديلات والاقتراحات بعد تجربتها، وكذلك لاي اضافة للاخ نظرة على الاستراتيجية ان شاءالله

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

في مايلي رؤوس اقلام بما يقوم به البرنامج وانا افترض ان الذي يستخدم البرنامج قد قرأ الاستراتيجية ومتابعها:
حساب البار السحري والدخول في الصفقة مباشرة بعد ظهوره
في البار التالية للسحرية يحدد البرنامج الاهداف على مراحلها الثلاث بالحد الادنى (100 - 50 - 25 ) وبالامكان تغييرها من الاعدادات للاكسبيرت
في الحالة الخاصة 3 لايتم الخروج من الصفقة بل يكتفي البرنامج بوضعية الاستوب ويضع هدف الصفقة على سعر الفتح مباشرة للخروج منها اذا سنحت الفرصة
اضفت على الفكرة تحريك الاستوب ويتم حساب الاستوب على اساس البولينجر(20) وبالامكان الغاء هذا الخيار من الاعدادات
ينتظر البرنامج الوصول للهدف ولا يغلق الصفقة الا في حالة واحدة وهي تردد السعر على بعد 75% من الهدف
عند ظهور بار سحري اخر بنفس الاتجاه يقوم البرنامج بفتح صفقة اخرى بنفس الاتجاه ولكن لها استوب وهدف مختلف عن الي قبلها وبنفس سياسة حساب الهدف الاصلية
عند ظهور بار سحري معاكس يقوم باغلاق الصفقة مباشرة والدخول في الاتجاه الجديد
يرسم البرنامج على الشارت (نجمة) عند كل عملية يقوم بتنفيذها على الصفقة وعند المرور فوق النجمة سيظهر لك شرح عن العملية المؤداه من البرنامج
واخيرا اتمنى ان يكون في البرنامج الفائدة وارجو ان اسمع اقتراحاتكم وارائكم لتطويره

وبالتوفيق
ettahrim
02-02-2012, 12:30 PM
بسم الله الرحمن الرحيم

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

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

هذين هما الشارتين والمؤشرين
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-02-2012, 12:35 PM
بسم الله الرحمن الرحيم

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

كل عام وأنتم بخير

هذه مجموعة من المؤشرات الهامة تسمى ملتي فريم.

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


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

على فكرة هذه المؤشرات مجموعة من المنتديات الأجنبية.
ettahrim
02-02-2012, 12:40 PM
بسم الله الرحمن الرحيم

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


هذا المؤشر الجديد ( مجانا هذه المرة ) يعطينا تصور جيد عن وضع الترند الحالي على الفريم المختار.

ولا يعني كونه مجاني أنه غير مفيد بل بالعكس تماما.

هو ببساطة الفرق بين مؤشري RSI بإعدادات مختلفة مما يعطينا وضع الترند الحالي.

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

في حال كانت الخط الأخضر تحت الصفر فهذا يعني ترند هابط.

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


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


يعمل على كل الفريمات مع مراعاة الأهداف لكل فريم ولكل زوج.

هذا المؤشر يمكن أن يكون مساعدا قويا لاتخاذ القرار في الدخول شراء أو بيع
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-02-2012, 01:21 PM
السلام عليكم ورحمة الله وبركاته


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

أصبح للمؤشر الخصائص التالية:

ShowDays وهو رقم يحدد عدد الأيام التي ستظهر فيها معلومات المؤشر.

AlertBuy ينبهك في حال وجود فرصة شراء ( لم تعمل بعد )

AlertSell ينبهك في حال وجود فرصة بيع ( لم تعمل بعد )

ShowBuySellVol لإظهار أو اخفاء الخطين الأخضر والأحمر.

ShowVolTrend لإظهار او إخفاء الخط الأزرق.


المؤشر سيظهر لكم خطي دعم وخطي مقاومة لكل يوم جديد للخط الأزرق.

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

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


يظهر المؤشر أيضا معلومات لخمسة أيام سابقة بدءا من اليوم الحالي ( رقمه صفر )

ولكل يوم يظهر ثلاثة أرقام:

الاول : رقم يمثل المساحة الحجمية المطلقة وهي الفرق بين المساحة الموجبة والمساحة السالبة.

الثاني هو قيمة المساحة الموجبة.

الثالث هو قيمة المساحة السالبة.


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


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


يمكنك الآن العمل بطريقتين مع المؤشر:

الطريقة الاولى هي العمل على المؤشر كما هو مشروح بالموضوع الرئيسي.

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

والطريقة الثانية أقوى بكثير من الطريقة الأولى والأفضل طبعا الدمج بين الطريقتين.

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

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


في المرفقات النسخة الجديدة من المؤشر وهي تنتهي صلاحيتها في 15 / 9 / 2007



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


في الشارت المرفق توضيح بعض الشرح على الخط الأزرق الهام جدا.


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


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


هناك أمر آخر هام جدا

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

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

وسوف نظل نزودكم بآخر التطويرات والدراسات على هذا المؤشر الهام جدا جدا.


والذي أسأل الله سبحانه أن يكون فيه الخير للجميع.
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-02-2012, 01:56 PM
طبعا كل منا يبحث عن استراتيجيات وطرق للمتاجرة فالكثير جرب وجرب وانهكته الخسائر

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

وبصراحة فى الباك تست بتاعه فى الميتا او ال تريد يديك نتائج مهولة

ولكنى جربته لمدة ايام وعينك ماترى الا الخسائر (الحمد الله انها ديمو)

فارجو ان تجربوه معى لكن بطريقة اخرى فالاكسبيرت يدخل الصفقة بربح 40 نقطة واستوب 30 نقطة والحمد الله كلهم ضربوا استوب الا صفقة واحدة

فلنجربه الاسبوع القادم كالتالى

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

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

مرفق الاكسبيرت ونتائج يومين بعد فتح حساب ديمو مخصوص له

واريد ان ارى نتائجكم

تحياتى
ettahrim
02-02-2012, 02:01 PM
مؤشر الويكلي بيفوت باك تيست
ettahrim
02-02-2012, 02:04 PM
بسم الله الرحمن الرحيم

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


هذا المؤشر يرسم لنا مستويات الفيبو الشهرية مع باك تيست على الشارت


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


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


سنفتح ورشة خاصة لمتابعة هذين المؤشرين قريبا جدا إن شاء الله .
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-02-2012, 04:41 PM
مؤشر رائع جربوة
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-02-2012, 04:47 PM
السلام عليكم ورحمة الله وبركاته


أغلبنا طبعا يعلم ميزة التنبيه الصوتي في الميتاتريدر من خلال صفحة Alerts الموجودة أسفل البرنامج


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

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

انظر الصورة التالية:

حيث اخترنا نوع العملية File ثم اخترنا المصدر Source اسم ومسار البرنامج مع بارامتراته إن وجدت

لنفرض أننا نملك برنامج sms.exe يقوم بإرسال رسالة نصية لرقم هاتف على الشكل التالي من خلال سطر الأوامر:

sms.exe /num:5654645 /msg:"Alert buy"


طبعا هذا مثال فقط ولن يعمل

نضع السطر السابق في الحقل source

وسوف يتم تنفيذه في حال تحقق شرط التنبيه


يمكننا أيضا تنفيذ ملفات باتش من الامتداد bat وهي خاصة بنظام الدوس القديم

أو ملفات سكريبت vbs وهي لغة فيجول بيسك خاصة بالويندوز.

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


أحببت أن أفيدكم بهذه الميزة لكي يكون لكم علم بها وتستفيدوا منها في المستقبل
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-02-2012, 07:25 PM
هناك ثلاث وظائف مسبقة التعريف في لغة MQL4 وموجودة في كل برنامج مهما كان نوعه .

الوظيفة الأولى: init

يتم استدعاء هذه الوظيفة عند بداية تهيئة الوحدة النمطية ( المؤشر أو الاكسبيرت أو السكريبت ).

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

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

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

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


الوظيفة الثانية: start

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

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

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

يتم تنفيذ هذه الوظيفة بشكل مختلف قليلا بين أنواع البرامج الثلاثة:

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

في المؤشر يتم تنفيذ هذه الوظيفة مباشرة بعد وضع المؤشر على الشارت بدون شرط حدوث تغير في السعر، ثم تنفذ بعد كل تغير في السعر.

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

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

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

الوظيفة الثالثة: deinit

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

ويتم وضع كافة التعليمات البرمجية التي تقوم بتنظيف الشارت من مخلفات البرنامج.

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

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


يمكن استدعاء هذه الوظائف الثلاثة من أي وظيفة أخرى ولكن لا ينصح أبدا باستدعاء الوظيفة start مثلا من الوظيفة init لأن هذا الأمر قد يسبب مشاكل في التنفيذ.
ettahrim
02-02-2012, 07:27 PM
السلام عليكم ورحمة الله وبركاته
هدا مؤشر الفيشر هديه
تجدونه في المرفقات وهو بعدة اشكال
ettahrim
02-02-2012, 07:33 PM
بسم الله الرحمن الرحيم

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

اخواني:باختصار لكل منا قصة في الجري خلف المؤشرات ..وكنت -ولا أزال-معتقدا بان المؤشرات تتبع السعر( Trend Flowers)...وليس العكس

باختصار وجدت ان هذا المؤشر يتنبأ بانعكاس الترند(trend Reversal ) نسبة جيدة وسأنقل بترجمة سريعة ما قيل عنه :

*ممن قام بعمل(باك تست) عليه قال ان دقته حوالى 70 % وانه اقرب الى ال90 % في الاعتماد عليه.

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

*له سجل حافل في توقع وتحديد نقاط التحول(turning Points ) في الاتجاه.ليس فقط على التشارت اليومي أو الاسبوعي بل على الفريمات الاخرى.

من الأفضل نعرض بعض الامثلةثم نكمل الشرح:

علىالتشارت (مختلف التايم فريم )
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
سنضع الشرح مختصر على شكل جدول حتى تتضح الفكره المبسطه منه ثم بعدها هنالك تفاصيل كثيرة كما انني اطلب من الاخوه واللذين لديهم فكره واضحة عن هذا المؤشر(وما يتبعه) ان يساعدونا بما لديهم حتى نستفيد جميعا

المؤشر له نمطان:

1. TD setup
2. TD countdown



TD setup

المدة 9 شموع

اشارة الشراء اقفال9 شموع متسلسلةتكون
اقل من اقفال ال 4 شموع التي قبلها


الشراء المثالي اللو لأي من الشمعتين 8 أو 9 يجب ان يكون
اقل من اللو لكل من الشمعتين 6 و 7

اشارة البيع اقفال 9 شموع متسلسلة اكبر من اقفال ال 4 شموع
التي قبلها

البيع المثالي الهاي لأيا من الشمعتين 8 أو 9 يجب ان يكون اكبر من
الهاي للشمعتين 6 و 7



TD countdown

المدة(البقاء) غير محدود

اشارة الشراء 13 شمعة بحيث يكون كل اقفال منها أقل-أومساوي-للو
الشمعتين اللتيين قبلها

الشراءالمثالي لو(low ) الشمعة 13 يجب ان يكون اقل من-اومساوي-
اقفال الشمعة 8

اشارة البيع 13 شمعة بحيث يكون اقفال كلا منها اكبر من- او
مساوي-للو(low) الشمعتين اللتان قبلها


البع المثالي هاي الشمعة 13 يجب ان يكون اكبر من-اومساوي-اقفال
الشمعة 8
ettahrim
02-02-2012, 08:20 PM
أحبتي مرفقاً تجدون اكسبيرت Gio2007 الذي يثبت نجاحه يوم بعد يوم والذي


يحصد الأرباح بشكل يومي دون خوف نظراً لعوامل الأمان وخطوط


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



الاكسبيرت يعتمد على خاصية مضاعفة العقود المعروفة لكن بشروط امان


عالية تجعله يحافظ على رأس المال عند حدوث أي تحرك للسعر


باتجاه واحد دون تصحيح كمارأينا قبل أيام لزوج الباوند-دولار حين


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


الصعب في حين قد تفشل بعض الاكسبيرتات التي تعتمد على أفكار


مشابهة من الصمود .




تم تجريب الاكسبيرت من فترة على حسابي ميني بمساعدة الأخ


أسامة (OSESO ) والأخ محمد ( GOODMAN ) ولم تنجح هذه التجربة


بسبب أن العقود ميني ولم يتحمل الرصيد تحرك السعر أكثر من 150


نقطة بجهة واحدة.


لذلك تم تعديل العمل ليصبح على عقود مايكرو على عدة أزواج منها


الباوند-دولار واليورو-دولار والباوند-ين كل بإعدادات تخصه . ومع أن


العقود مايكرو فقد حققهذا الاكسبيرت ربح قدره 40% خلال


أسبوعين كما سترون من الحسابات المتابعة .




هذا الاكسبيرت يعمل الآن 24 ساعة باليوم على حسابات ديمو


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




الأول : باوند-دولار


Login : 1728876


Password : hco4znf


قام بتشغيله الأخ أسامة مشكوراً منذ 23/11/2007 وهو محقق 4196 نقطة لحد الآن




الثاني : باوند – دولار


Login : 1747055

Password : oq2mswp




قام بتشغيله الأخ ********* مشكوراً منذ 6/12/2007 وهو محقق 2113 نقطة لحد الآن




وهناك حساب على زوج باوند-ين قام بتشغيله الأخ وسيم ( Waseem )


مشكوراً منذ 9/12/2007 وهو محقق 154 نقطة لحد الآن وهو يعمل


على مبلغ 3000 $ بإعدادات مأمونة تليق بهذا الزوج وسوف يزودكم


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



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


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


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


مع التحية
ettahrim
02-02-2012, 08:23 PM
1-اولا حمل المؤشر من الرفقات
2-نزله في ملف الانديكيتور
3-اضيفه للشارت مثلا الساعة
4-في Common ضع صح على All DLL Imports
5-في Inputs تجد PeriodMulitplier ضع مثلا 2 اذا اردت شارت الساعتين 8 لشارت الثماني ساعات
6- خلي الشارت بتاعك على Offline ( عن طريق الزر الأيمن على الشارت properties ثم Common ثم Offline chart )
7-روح File ثم Open Offline
8-دور على شارت الساعتين او الثماني واضغط عليه حيفتح
9-الان شيل offline من الشارت الأول واستمتع بالشارت الجديد


ملاحظة : يجب عدم اغلاق الشارت الأول او تغير مدته الزمنية حتى يبقى الشارت الثاني يعمل
ettahrim
02-02-2012, 08:26 PM
السلام عليكم
أحببت أن أشاركم معي بهذا الاكسبيرت و هو مولود جديد عمره لا يتجاوز اليومين
أرجو أن نقوم معا بعمل باك تيست له و بعد ذلك نقرر مدى جدواه
الاكسبيرت مخصص للمجنون و يمكن تجربته على بقية الازواج لمن اراد ذلك
يقوم بتحديد الهدف و الاستوب اليا
هناك خيار لجعل البرنامج يتولى مهمة تحديد حجم اللوت حسب رأس المال المتوفر
أرجو التجربة على رأس مال لا يتجاوز الالف دولار للحسابات الميني و مئة دولار للحسابات الميكرو و عشرة الاف للحسابات الستاندر

لن نخوض بالتفاصيل حتى نرى نتيجة التجربة
سأرفق صورة توضيحية للاعد
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-02-2012, 08:30 PM
بسم الله الرحمن الرحيم

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

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

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

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

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

وعمل في حوالي شهرين ونصف 35000 ربح صافي من رصيد 10000 وبلوت واحد فقط .


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

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

مرفق الاكسبيرت مع الباك تيست .
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-02-2012, 08:33 PM
السلام عليكم ورحمة الله وبركاته
+

أثناء إحدى جولاتي التسكعية المعتادة وجدت مؤشر اسمه ultra trend
يعطيك إتجاه العملة، يمكننا الإستفادة منه في تحديد منطقة التذبذب بالخطوات الآتية:

بعد إضافته الى البرنامج ووضعه على الشارت قوموا بإضافة الليفلز "levels " الآتية: 10 و 20
إذا كان المؤشر محصور بين المنطقتين فهذا يعكس منطقة تذبذب وخرجوه يعني بداية رالي

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



مودتي
الصور المصغرة للصور المرفقة[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-02-2012, 10:06 PM
في المرفقات المؤشرماكس برو وهو أخر مؤشراتي.

المؤشر في طور التطوير , لذا ارجو من الاخوة الاعزاء التطوع لتجربته على اكثر من زوج .

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

ضبط الاعدادات على الفريمات المختلفة

المؤشر مصمم للعمل على فريم الاربع ساعات لكن لا بئس بتجريبه على فريم الساعة ايضا .


للعمل على فريم الساعة اكتب 60 في حقل TimeFrame .

للعمل على شارت الاربع ساعات اكتب 240 TimeFrame .


اشارات الدخول

يمكن الاستفادة من نوعين من الاشارات وكالاتي :

اولا : تقاطع المؤشر مع خط الصفر .
1- شراء: عندما يقطع المؤشر خط الصفر صعودا .
2- بيع: عندما يقطع المؤشر خط الصفر نزولا .

ثانيا : الدايفرجنس.
يكون الدايفرجنس مختلفا مع مؤشرنا , فكما هو معروف ان الدايفرجنس هو الاختلاف او التغاير او التباعد بين حركة السعر وحركة المؤشر .
بالنسبة لمؤشرنا سوف يكون الدايفرجنس كالاتي ,عندما تكون شمعة السعر مختلفة عن الشمعة الصفراء للمؤشر وكما يلي:
1- شراء: عندما تكون شمعة السعر هابطة بينما تكون شمعة المؤشر الصفراء صاعدة (موجبة) (فوق مستوى الصفر) أي نتبع شمعة المؤشر دائما.
2- بيع عندما تكون شمعة السعر صاعدة بينما تكون شمعة المؤشر الصفراء هابطة (سالبة) (تحت مستوى الصفر) أي نتبع شمعة المؤشر دائما ,طبعا كلما كان التغاير اكبر كلما كانت المصداقية اكبر .
ettahrim
02-02-2012, 10:09 PM
الاكسبيرت TrailingStop
ettahrim
02-02-2012, 10:11 PM
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-02-2012, 10:14 PM
void start()
{
double adxbuy = iCustom(Symbol(),0,"ADX Crossing",0,1);
double adxsell = iCustom(Symbol(),0,"ADX Crossing",1,1);
if(adxbuy>0 && adxbuy<10)
Comment("\n\n\nBUY");
else
if(adxsell>0 && adxsell<10)
Comment("\n\n\nSELL");
}
وللتأكد من دقته يجب عمل التالي
1. فتح شارت لزوج ما
2. اضافة المؤشر الى الشارت
3. عمل الاكسبيرت باسم ADX
4. ارفاق الاكسبيرت في الشارت
5. حفظ التيملبيت باسم ADX ايضاً
6. عمل باك تست للاكسبيرت، ثم دقق في الاشارات.

عسى يكون الكود يلبي طلبك

بالتوفيق باذن الله

نموذج الاكسبيرت يعمل جيداً ولكن عليك اتباع الخطوات المذكورة لتتأكد

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


double b4plusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_PLUS DI,shift-1);
double nowplusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_PLU SDI,shift);
double b4minusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_MIN USDI,shift-1);
double nowminusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_MI NUSDI,shift);

if (b4plusdi>b4minusdi && nowplusdi<nowminusdi)
{PLACE BUY ORDER}

if (b4plusdi<b4minusdi && nowplusdi>nowminusdi)
{PLACE SELL ORDER}
ونصيحتي لك هذا المؤشر لا يمكن الاعتماد بشكل منفرد.. حيث ان من استخداماته كثيرا ما تكون لدعم قرار بالدخول في صفقة ما.

اتمنى لك التوفيق
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-02-2012, 10:18 PM
أرجو المساعدة في فك طلاسم هذا الأكسبيرت الذي حقق 11670% في 6 أشهر

مرفق الأكسبيرت و التقرير الخاص به

للتركيب
Save the MTSignalRetrieval.dl to C:\Program Files\Interbank FX Trader 4\experts\libraries

Save the Destiny1.99ServerS2.ex4 file to the experts folder of your Metatrader 4.
اسامة
02-02-2012, 11:03 PM
مجهود رائع وطرح مميز
يسلمووووو
ettahrim
02-02-2012, 11:30 PM
الله*يحفضك
ettahrim
02-03-2012, 12:28 PM
بسم الله الرحمن الرحيم

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

يمكنك طبعا إخفائهما لو أردت

كما يمكنك التحكم بفترة كل منهما


أرجو لكم معه الفائدة
ettahrim
02-03-2012, 12:31 PM
هذا المؤشر للميتا تريد
انا مجربه على برامج للاسهم وهو مؤشر قوي فعلا
ويتكون من AROON UP & AROON DOWN
ويتميز هذا المؤشر بالتأكيد لموجه صاعده او هابطه
وايضا للنماذج عند الاختراقات .
ettahrim
02-03-2012, 12:34 PM
< الســلام عليكم ورحمة الله وبركاته >
بدون مقدمات تفضل مؤشر جميل ومريح جداَ
كل ما هو عليك تشغيل المؤشر على الشارت ليعطيك
خط ترند كأي خط ترند عادي لكن ميزة المؤشر فهو يعطي
تنبيه صوتي قبل وصول السعر ب 10 نقاط .
لا تنسونا من صالح الدعاء
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-03-2012, 12:48 PM
هذا اكسبيرت لطريقة سوبلكس بالمواصفات التالية
الدخول الاول بناء على تقاطع الموفنج باستوب محدد و بدون هدف انما بتريلنج استوب
ان اغلق العقد الاول على ربح بضرب التريلنج استوب نبدأ من جديد
ان ضرب الاستوب على خسارة ندخل عقد مضاعف و عقد اخر معاكس كعقد هيدج
عند ضرب الاستوب نغلق عقد الهيدج على ما به من ربح
و عند الوصول للهدف أيضا نغلق عقد الهيدج على ما به من خسارة لكي لا ندخل بمتاهة مضاعفته و تلك الطريقة درسناها ووجدنا أنها لا تنفع
أرجو تجربة البرنامج على الديمو و ابداء الملاحظات
ettahrim
02-03-2012, 12:51 PM
السلام عليكم ورحمة الله وبركاته
لقد اوجدنا اكسبرت جديد بعد عمل استغرق اكتر من 6 شهور باستخدام انديكيترس لانظمه تعامل رابحه جدا
الموضوع بالكامل يوجد على
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
انا هنا ساقوم فقط بانزال الاكسبرت والانديكيترز لعلها ترجع بالخير على الاخوان العرب
الان نحن بصدد تجريب الاكسبرت وخلال اقل من يوم راس المال 10000 والربح كان 2100
علملا بان هذه النيجه كانت بتشغيل الاكسبرت على اكتر من زوج
وللعلم لا تفتح اي تريد او تغلق الا بعد موافقتها لعدة شروط صارمه
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-03-2012, 12:56 PM
السلام عليكم ورحمة الله وبركاته


لا تتفاجؤوا من إسم الموضوع الكيبورد ما علق

" أتشيموكو" و "هيكن أشي" هما إسما مؤشرين موجودين في الميتا تريدر Ichimoku & Heiken Ashi
وأحببت سرد موضوع لهما نظراً لقلة الحديث عنهما و لوقوع يدي على مراجع مهمة الفترة الماضية
فأحببت أن تشاركوني قرائتي للكتب لعل بها إفادة لكم ولي
الموضوع إهداء لجميع الأعضاء
ettahrim
02-03-2012, 12:59 PM
مؤشر ABHA BLUESKY LINE DAILY

اتمنى من الله العلى القدير ان ينفعكم هذا المؤشر

ميزتة ان سهل جدا

تجد على يمين التشارت جميع المعلومات

معلومات البيع والوقف والهدف

معلومات الشراء والوقف والهدف

شراء بريك اوت

بيع بريك اوت

المؤشر يعمل على اليومى
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-03-2012, 02:45 PM
السلام عليكم
ارفق اليكم اكسبرت سيبيريا للتجربه
قرات عنه بانه يعتمد على الاحتمالات وانا اجربه
فهل احد جربه او سيجربه فارجو وضع النتائج للاستفاده
ettahrim
02-03-2012, 03:51 PM
السلام عليكم

عندى هذا المؤشر يعمل على التريد وهو عبارة عن الزجزاج و معة خطوط الفيبو

المشكلة ان نسب الفيبو مختلفة عن النسب المعروفة
يعنى 23 % عاملها 25% و هكذا....
ولم يضع خط ال 50% فيبو
هل ممكن ارجاعها للنسب الاصلية
وتغير لون الخطوط الى لون طوبى محمر ليمشى مع الخلفية البيضء و السوداء على السواء
هل من الممكن عمل تنبية صوتى عند وصول السعر ل خطوط الفيبو

الالوان الاصلية صفراء لاتنفع فى الخلفية البيضاء
ولكم جزيل الشكر
ettahrim
02-03-2012, 03:55 PM
السلام عليكم ورحمة الله وبركاته


اقدم لكم الاكسبيرت الذي يعتمد على مؤشر wajdyss forecast للتنبؤ بشمعة المستقبل

والموجود على هذا الرابط

مؤشر wajdyss forecast للتنبؤ بشمعة المستقبل


وانصح بالعمل به على الشارت اليومي لثلاث أزواج

(المجنون ، الباوند دولار ، اليورو ين)

المجنون: استوب 100
الباوند دولار واليورو ين: استوب 50

والهدف للجميع: مفتوح ويتم اغلاق الصفقة نهاية اليوم مهما كانت النتيجة

ملاحظة مهمة جداً: هناك قيمتين لكل زوج يجب ان تكتبها في مدخلات الاكسبيرت لكي يعمل بنفس اشارات المؤشر

وللحديث بقية

الاكسبيرت في المرفقات
نتابع شرح الاكسبيرت

من أهم مدخلات الاكسبيرت
w , ww

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

وهذا شكل المؤشر الجديد ونلاحظ به قيمة w وقيمة ww وهما موجودتين في اسفل الملاحظات (في اليسار)
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]

وهاتين القيمتين متغيريتين حسب الزوج والشارت

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

(المؤشر في المرفقات)

بالتوفيق

يكفي ان يعمل الاكسبيرت من الساعة 23:30 حتى 00:30 (مدة ساعة واحدة يومياً)

ويتم اغلاق الصفقة يدوياً يوم الجمعة من كل اسبوع قبل الاغلاق ، وكذلك في الاجازات الاخرى (أعياد الميلاد وما شابه) تجنباً للجاب

تحياتي
ettahrim
02-03-2012, 05:45 PM
في هذا الموضوع شرح كامل لعملية تصنيع اكسبيرت عن طريق نموذج لأحد الكسبيرتات
يكفي فقط ان تضع طريقتك على هيئة معادلات وبعدين تغذي بها النموذج وتبدأ متاجرتك الألية

ارجو التركيز من فضلكم

نبدأ على بركة الله

* التعرف على نموذج الكسبيرت

+------------------------------------------------------------------+


//| My Own Expert |
//| Copyright, created 20 may 2006 |
//| [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ] |
//| Desined by Dr. Waleed |
//| [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ] |
//+------------------------------------------------------------------+

#property copyright "My Own Expert"
#property link "www.forex.com.sa"

extern int MaxTrades = 1;
extern int stoploss = 25;
extern int takeprofit = 50;
extern double TrailingStop =10;
extern bool UseHourTrade = true;
extern int FromHourTrade = 7;
extern int ToHourTrade = 17;
extern string MM_Parameters = "---------- Money Management";
extern double Lots = 1;
extern bool MM = true,
AccountIsMicro = false;
extern int Risk = 10;

int ID=148;

//+------------------------------------------------------------------+
//| FUNCTION DEFINITIONS deinitialization function |
//+------------------------------------------------------------------+

void deinit() {
Comment("");
}

int orderscnt(){
int cnt=0;
for(int i =0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol() && ID==OrderMagicNumber()){
cnt++;
}
}
}
return(cnt);
}

//+------------------------------------------------------------------+
//| FUNCTION DEFINITIONS Start function |
//+------------------------------------------------------------------+

int start()
{
if (UseHourTrade){
if(!(Hour()>=FromHourTrade&&Hour()<=ToHourTrade)){
Comment("Non-Trading Hours!");
return(0);
}
}

double EMA5cr, EMA5pr, EMA8cr, EMA8pr;

EMA5cr=iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_CLOSE,0);
EMA5pr=iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_CLOSE,1);
EMA8cr=iMA(NULL, 0, 8, 0, MODE_EMA, PRICE_CLOSE,0);
EMA8pr=iMA(NULL, 0, 8, 0, MODE_EMA, PRICE_CLOSE,1);

double sl,tp;

if(MM) Lots = subLotSize();


if (EMA5cr>EMA8cr && EMA5pr<EMA8pr){
if(orderscnt()<MaxTrades){
if(stoploss==0){sl=0;}else{sl=Ask-stoploss*Point;}
if(takeprofit==0){tp=0;}else{tp=Ask+takeprofit*Poi nt;}
OrderSend(Symbol(),OP_BUY,Lots,Ask,2,sl,tp,"My Own Expert",ID,0,Blue);
PlaySound("Alert.wav");
}
}
if (EMA5cr<EMA8cr && EMA5pr>EMA8pr){
if(orderscnt()<MaxTrades){
if(stoploss==0){sl=0;}else{sl=Bid+stoploss*Point;}
if(takeprofit==0){tp=0;}else{tp=Bid-takeprofit*Point;}
OrderSend(Symbol(),OP_SELL,Lots,Bid,2,sl,tp,"My Own Expert",ID,0,Red);
PlaySound("Alert.wav");
}
}

//+------------------------------------------------------------------+
//| FUNCTION DEFINITIONS TrailingStop |
//+------------------------------------------------------------------+

if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,
OrderTakeProfit(),0,Green);
return(0);
}
}
}
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Poi nt*TrailingStop,
OrderTakeProfit(),0,Red);
return(0);
}
}
}

return(0);
}

//+------------------------------------------------------------------+
//| FUNCTION DEFINITIONS Money Managment |
//+------------------------------------------------------------------+

double subLotSize()
{
double lotMM = MathCeil(AccountFreeMargin() * Risk / 1000) / 100;

if(AccountIsMicro==false)
{
if(lotMM < 0.1) lotMM = Lots;
if((lotMM > 0.5) && (lotMM < 1)) lotMM = 0.5;
if(lotMM > 1.0) lotMM = MathCeil(lotMM);
if(lotMM > 100) lotMM = 100;
}
else
{
if(lotMM < 0.01) lotMM = Lots;
if(lotMM > 1.0) lotMM = MathCeil(lotMM);
if(lotMM > 100) lotMM = 100;
}

return (lotMM);
}

//+---------------------------------------------------------------------------------+
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*



//+------------------------------------------------------------------+
//| My Own Expert |
//| Copyright, created 20 may 2006 |
//| [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ] |
//| Desined by Dr. Waleed |
//| [عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ] |
//+------------------------------------------------------------------+

#property copyright "My Own Expert"
#property link "www.forex.com.sa"




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


ثاني جزء من الكسبيرت


extern int MaxTrades = 1; // ------------------ 1


extern int stoploss = 25; // ---------------- 2
extern int takeprofit = 50; // --------------- 3
extern double TrailingStop =10; // -------------- 4
extern bool UseHourTrade = true; // ----------- 5
extern int FromHourTrade = 7; // ------------- 6
extern int ToHourTrade = 17; //------------- 7
extern string MM_Parameters = "---------- Money Management";
extern double Lots = 1;
extern bool MM = true, // ------------ 8
AccountIsMicro = false;
extern int Risk = 10; // ------------- 9

int ID=148; //--------------------- 10



حسنا , الأن هذه اعدادات الكسبيرت يمكنك تغير ما تشاء منها حسب القواعد التالية


رقم 1 هو عدد الصفقات التي سيفتحها الكسبيرت في نفس الوقت لنفس العملة ولو هناك صفقة مفتوحة للعملة التي يعمل عليها الكسبيرت لن يفتح أخرى ويمكن تغييرها ل 2 او 3 او اي عدد يعجبك



رقم 2 هو وقف الخسارة بالنقط



رقم 3 هو الهدف بالنقط



رقم 4 الوقف المتحرك



رقم 5 هنا يمكنك كتابة قيمتين اما "true" او "false" ومعناها هل تريد ان تشغل خاصية الفلتر الزمني- بمعنى ان تتم المضاربة في ساعات محددة من اليوم - فأن جعلتها "true" انزل للخطوات رقم 6 ورقم 7 لتكتب من الساعة للساعة كم يتاجر هذا الكسبيرت ,

وان جعلتها "false" فأنت الغيت الخاصية ولا تكتب شيء في الخطوات رقم 6 و رقم 7 .





رقم 8 نفس القيمتين اما "true" او "false" وهي الخاصية التي تقوم بتشغيل ادارة راس المال اي زيادة عدد العقود اتوماتيكيا حسب راس المال الموجود في الصفقة الواحدة ( انصح بجعلها "true" كما هي)



رقم 9 خاصة بأدارة المخاطر وهي لن تعمل الا اذا كان رقم 8 "true" وهي تقوم على نسبة كمية زيادة عدد العقود حسب راس المال المستخدم , فأنت انت شغلت خاصية ادارة راس المال في الخطوة رقم 8 سيتم فتح عقود في الصفقة الواحدة حسب ادارة المخاطر في الخطوة رقم 9 ( نصيحة لا تزيد عن رقم 15) .



رقم 10 وهو خاص برقم الكسبيرت حتى يميز اكسبيرتك عن اي اكسبيرت اخر (optional)



*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

ثالث جزء من الكسبيرت


+------------------------------------------------------------------+



//| FUNCTION DEFINITIONS deinitialization function |
//+------------------------------------------------------------------+

void deinit() {
Comment("");
}

int orderscnt(){
int cnt=0;
for(int i =0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol() && ID==OrderMagicNumber()){
cnt++;
}
}
}
return(cnt);
}

لا يتم تغيير شئ فيه بتاتا

وهو الجزء الخاص بتعريف الميتا عملية البيع والشراء


لن نتدخل في هذا الجزء

*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

رابع جزء من الكسبيرت ( ارجو التركيز)


+------------------------------------------------------------------+


//| FUNCTION DEFINITIONS Start function |
//+------------------------------------------------------------------+

int start()
{
if (UseHourTrade){
if(!(Hour()>=FromHourTrade&&Hour()<=ToHourTrade)){
Comment("Non-Trading Hours!");
return(0);
}
}

double EMA5cr, EMA5pr, EMA8cr, EMA8pr; // --------------- 11

EMA5cr=iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_CLOSE,0); // ----- 12
EMA5pr=iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_CLOSE,1); // ----- 13
EMA8cr=iMA(NULL, 0, 8, 0, MODE_EMA, PRICE_CLOSE,0); // ----- 14
EMA8pr=iMA(NULL, 0, 8, 0, MODE_EMA, PRICE_CLOSE,1); // ----- 15


هنا في هذا الجزء من الكسبيرت سيتم تعريف الميتا بالمؤشرات التي سيقوم عليها عمل الكسبيرت

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



سأعطي مثالا كما هو موضح في هذا الجزء



انا الأن اريد ان استخدم المتوسطان 5 اكسبوشنال و 8 اكسيبوشنال فقط في هذا الكسبيرت وعمله سيكون قائما على تقاطعهما فقط



ساتي للخطوة رقم 11 الموجودة في الكود اعلاه واكتب اسماء من تأليفي امام كلمة double لكل ما سأستخدمه من متوسطات وارجو الألتزام بالفواصل كما هي :



EMA5cr خاص بالمتوسط المتحرك 5 للشمعة الحالية
EMA5pr خاص بالمتوسط المتحرك 5 للشمعة السابقة
EMA8cr خاص بالمتوسط المتحرك 8 للشمعة الحالية
EMA8pr خاص بالمتوسط المتحرك للشمعة السابقة



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



ارجو ملاحظة ان الأسماء السبقة لي حرية اختيارها وهي يمكن تغييرها المهم اني التزم بها فيما سيلي ,



الأن وبعد ان سميت المتوسطات بأسمائها امام كلمة double سأترجمها للميتا تريدر كي يعرف اي متوسطات انا استخدمها



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



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



سأذكر مثالا على التغيير في اعدادات المتوسط 5 اكسيبوشنال, كلوز للشمعة الحالية والشمعة السابقة :



انظر للخطوة رقم 12 في الكود




EMA5cr=iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_CLOSE,0); ----- 12



EMA5cr الأسم الذي سميته له في الخطوة رقم 11



= هذه الأشارة معناها انها تقول للميتا ان هذا الأسم الذي اخترته يختص بالمؤشر المخزن في ذاكرتك واعداداته كما في التالي



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



NULL نتركها كما هي



0,5,0 رقم المتوسط المتحرك 5 , ان اردت استخدام المتوسط 200 مثلا يمكنك تغيير رقم 5 هنا ل 200 وهكذا سيعرف الكسبيرت انك استخدمت المتوسط 200 (ارجو ان يكون الشرح واضح)



MODE_EMA وهو خاص بأعدادات المتوسط من ناحية simple او exponential طبعا EMA معناها اكسيبونينشيال و SMA معناها سيمبل وهكذا



PRICE_CLOSE وهي تتعلق بأعدادات المؤشر من ناحية ان يحسب الهاي او اللو او الأوبن او الكلوز



0 الصفر الأخير في كل المؤشرات اهم شئ في اعدادات كل المؤشرات ومعناه انه يعرف الكسبيرت ان تستخدم هذا المؤشر بقيمة الشمعة الحالية , واذا غيرنا الصفر لواحد فمعناها اننا نقصد ان قيمة المؤشر نريدها للشمعة السابقة , وقيمة 2 معناها الشمعة قبل السابقة وهكذا




EMA5pr=iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_CLOSE,1); ----- 13



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



ملاحظة مهمة قبل الأنتقال للخطوات القادمة , اذا اردنا ان نضيف اغلاق الشمعة او سعر فتحها او الهاي او اللو لها فهؤلاء لهم استثاء صغير
يكفي فقط ان نضع في المعادلات في الجزء القادم من الكسبيرت كلمة Close او Open او High او Low دون تعريفها في هذا الجزء مثل بقية المؤشرات فالميتا يعرفهم بمفرده فلا حاجة لتسميتها او تعريفها من قبلنا بل توضع في المعادلات كما هي ونغير فقط في اعداداتها كما في هذا الكود

High[0] // ----- 18



Open[2] // ----- 19
Close[1] //----- 20
Low[1] // ----- 21


في رقم 18 نقصد الهاي للشمعة الحالية

في الرقم 19 نقصد الأوبن للشمعة ما قبل السابقة
في الرقم 20 نقصد كلوز الشمعة السابقة
في الرقم 21 نقصد اقل سعر للشمعة السابقة ... وهكذا تكتب في المعادلات مباشرة دون تعريف وسيأتي ذكرها في الجزء القادم ان شاء الله



الأن لنعود لهذا القسم من جديد بعد شرح اعدادات المؤشرات وكما لاحظتم في الخطوات من رقم 12 ل رقم 15 اني اريد من الكسبيرت استخدام الموفنج افرج 5 اكسبونينشال كلوز للشمعة الحالية وقيمته ايضا للشمعة السابقة و8 اكسبونينشال للشمعة الحالية وايضا السابقة



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



لم يبقى سوى كيف يستخدمها في عملية البيع والشراء ؟



وهو ما سيتم شرحه في الجزء التالي



*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

خامس جزء من الكسبيرت ( ارجو التركيز أكثر)


double sl,tp;




if(MM) Lots = subLotSize();


if (EMA5cr>EMA8cr && EMA5pr<EMA8pr){ // ------------------------- 22
if(orderscnt()<MaxTrades){
if(stoploss==0){sl=0;}else{sl=Ask-stoploss*Point;}
if(takeprofit==0){tp=0;}else{tp=Ask+takeprofit*Poi nt;}
OrderSend(Symbol(),OP_BUY,Lots,Ask,2,sl,tp,"My Own Expert",ID,0,Blue);
PlaySound("Alert.wav");
}
}
if (EMA5cr<EMA8cr && EMA5pr>EMA8pr){ // ------------------------ 23
if(orderscnt()<MaxTrades){
if(stoploss==0){sl=0;}else{sl=Bid+stoploss*Point;}
if(takeprofit==0){tp=0;}else{tp=Bid-takeprofit*Point;}
OrderSend(Symbol(),OP_SELL,Lots,Bid,2,sl,tp,"My Own Expert",ID,0,Red);
PlaySound("Alert.wav");
}
}



لن نتدخل هنا الا في السطرين رقم 22 (معادلة الشراء) ورقم 23 ( معادلة البيع)فقط .

عملنا كله في هذا القسم سيكون في المعادلات بين القوسين ( ) بعد كلمة if



الأن دعونا نفكر قليلا , الأن الكسبيرت عرف المؤشرات التي سيستخدمها وباقي عليه انه يعرف كيف سيستخدمها , ماذا نفعل لكي نفهمه ان يشتري او يبيع عند التقاطع ؟



لكي نشرح للكسبيرت عملية التقاطع يلزمنا معادلات لهذا , سنشرحها بالعربي اولا وبعدها نحولها لكود



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



بعد تحويلها لمعادلات بتكون كدا


EMA5cr>EMA8cr && EMA5pr<EMA8pr


وعلامة && معناها بلغة الميتا " و " يعني لازم تحقق الشرطين اعلاه مع بعضهما , وعلامة || معناها بلغة الميتا " أو " يعني يمكن تحقق اي الشرطين



الأن لاحظوا معي EMA5pr<EMA8pr اي ان المتوسط 5 كان في الشمعة السابقة اصغر من المتوسط 8 ,,, EMA5cr>EMA8cr اصبح المتوسط 5 حاليا اكبر من المتوسط 8



وكتبناهم في السطر 22 اي مكان معادلات الشراء ,



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



ونفس الكلام في معادلة البيع



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



حسنا ما ذا لو اردنا مثلا ان يشتري الكسبيرت عند صعود الRSI مثلا

RSI1 = iRSI(NULL, 0, 14, PRICE_CLOSE,0);



RSI2 = iRSI(NULL, 0, 14, PRICE_CLOSE,1);


ونكتبها في الجزء الربع من الكسبيرت ولا ننسى ان نعرف RSI1 و RSI2 امام كلمة double في السطر رقم 11


وبعد ذلك نفكر , كيف نترجم عملية صعود ال ار اس اي للكسبيرت ,

سهلة , لما تكون قيمته الحالية اعلى من قيمته السابقة بيكون اكيد صاعد وما علينا الا ان نكتب المعادلة دي في السطر رقم 22 في معادلة الشراء
كود PHP:

(RSI1>RSI2)


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

if (EMA5cr>EMA8cr && EMA5pr<EMA8pr && RSI1>RSI2) // ------ 22


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




الحل

Open[1]>Close[1]


ولا يتم تعريفهم لأنهم استثنائيون في الجزء الرابع من الكسبيرت بل نكتفي بوضعها فقط داخل معادلة الشراء في السطر رقم 22 كما هو مبين :

if (Open[1]>Close[1]){ // ---------- 22
ettahrim
02-03-2012, 05:49 PM
بسم الله الرحمن الرحيم
نظرأ لاعجابي التام بهذا المنتدى واعجابي الاكثر برواد هذا المنتدى
احببت ان اقدم هدية متواضعة وهيه اكسبريت المتداول
الاكسبريت يعمل على زوج gbp/jpyوعلى اي فيرم تايم
وبما ان الاكسبريت لا يزال تحت التجربة ادعو الجميع مبرمجين ومضاربين
لتجربته ديمو على حساب ميني لكي نرتقي به إلى مستوى هذا المنتدى الغالي
الاكسبريت يعتمد على نقاط الدعم والمقاومة اليومية
وفي الختام ارجو ان ينال إعجابكم
الاكسبريت في المرفقات
ettahrim
02-03-2012, 05:51 PM
تحية طيبة ،،،،،،،
المؤشر المرفق يتكلم عن نفسه ولا يحتاج إلى شرح .
بالتوفيق للجميع
ettahrim
02-03-2012, 05:55 PM
بسم الله الرحمن الرحيم

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


هذا الاكسبيرت الجديد آخر ما توصل إليه العلم الحديث

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

لا يفتح إلا عقد واحد فقط باستوب وهدف محددين .

الستوب أكبر من الهدف بمعدل 2:3 .


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

وهي غالبا تكون آخر رقم للخسارة .

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


نحتاج لمتبرع يرفعه على سيرفر 24 ساعة ونكون له من الشاكرين

ويجب وضعه على فريم ربع ساعة بالإعدادات الافتراضية .


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

ولكنه مفتوح الصلاحية ويعمل على الحقيقي والديمو

ولكني لا أنصح بتجربته على الحقيقي الآن إلا بعد شهر تقريبا .

بالتوفيق إن شاء الله .
ettahrim
02-03-2012, 07:33 PM
بسم الله الرحمن الرحيم

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




شرح طريقة سوبابلكس باختصار :

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

- إذا ربحت الصفقة مقدارا محددا من النقاط وليكن 80 نقطة ( أيضا يتم تحديدها من قبل المتاجر نفسه ) فخير وبركة .

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

- في حال ربحت الصفقة الثانية فإن الاكسبيرت يغلق الصفقة الرابحة ويكون محصلة ربحها يغطي خسارة الأولى زائدا ربح صافي 80 نقطة بمقدار اللوت الابتدائي .

- في حال خسرت الصفقة الثانية فإن الاكسبيرت يغلق الصفقة الخاسرة الثانية ويفتح صفقة معاكسة للثانية بضعف عدد لوتات الصفقة الثانية .

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


الاكسبيرت حاليا يقوم بالضبط كما شرحت سابقا .

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

هذه التقنيات هي :

- عند فتح صفقة معاكسة بضعف عدد اللوتات يكون الهدف لنصفها هو 80 نقطة . والهدف للنصف الآخر هو 160 .

- في حال حقق النصف الهدف وحقق النصف الآخر هدفه أيضا فهذا يكون شيء جميل للغاية .

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

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

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


فيما يلي الاكسبيرت الحالي مع الشرح البرمجي .

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

جزى الله خيرا صاحب الاستراتيجية الذي يشترط على من ربح من طريقته هذه أن يتصدق بنسبة معينة من ربحه ( نسيتها صراحة ) .

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

الكود الحالي مع الشرح بشكل بسيط :

#property copyright "Idea by Supaplex Programing by waddah attar"
#property link "[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]"

//خصائص الاكسبيرت
extern int TakeProfit=80;
extern int StopLoss=80;
extern double FirstLots=0.1;
extern bool OpenBuy=true;
extern int LotsDouble=2;
extern int MagicNumber = 2008;
int Ticket1,Ticket2;
int t1,t2,gT1,gT2;
int handle;
int init()
{
Comment("Waddah Attar Supaplex");
return(0);
}
int deinit()
{
Comment("");
return(0);
}
int start()
{
Procces_1();
return(0);
}
//************************************************** ************************************************** ************
// الوظيفة الخاصة بفتح عقد الشراء مع مضاعفة إن اقتضى الأمر
void OpenBUYOrder(double Lots,int Magic)
{
double sl,tp;

sl=Ask-StopLoss*Point;
tp=Ask+TakeProfit*Point;

if (Lots==FirstLots)
{
Ticket1=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,sl,tp ,"",Magic,0,Green);
if(Ticket1>0)
{
gT1=OrderSend(Symbol(),OP_SELLSTOP,Lots,sl,3,sl+St opLoss*Point,sl-TakeProfit*Point,"",Magic,0,Green);
gT2=OrderSend(Symbol(),OP_SELLSTOP,Lots,sl,3,sl+St opLoss*Point,sl-(TakeProfit*Point),"",Magic,0,Green);
}
else
{
Alert("خطأ شراء "," Err = ",GetLastError()," Price = ",Ask," Lots = ",Lots);
}
}
}
// الوظيفة الخاصة بفتح عقد البيع مع مضاعفة إن اقتضى الأمر
void OpenSELLOrder(double Lots,int Magic)
{
double sl,tp;

sl=Bid+StopLoss*Point;
tp=Bid-TakeProfit*Point;
if (Lots==FirstLots)
{
Ticket1=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,sl,t p,"",Magic,0,Red);
if(Ticket1>0)
{
gT1=OrderSend(Symbol(),OP_BUYSTOP,Lots,sl,3,sl-StopLoss*Point,sl+TakeProfit*Point,"",Magic,0,Gree n);
gT2=OrderSend(Symbol(),OP_BUYSTOP,Lots,sl,3,sl-StopLoss*Point,sl+(TakeProfit*Point),"",Magic,0,Gr een);
}
else
{
Alert("خطأ بيع "," Err = ",GetLastError()," Price = ",Bid," Lots = ",Lots);
}
}
}
// الوظيفة الرئيسية
int Procces_1()
{
double slot,ssl,stp,bw;
// في حال لا يوجد صفقات حالية وكان هناك صفقات معلقة فاحذفها لأنه لا داعي لها
if (MyRealOrdersTotal(MagicNumber)==0 && MyPendingOrdersTotal(MagicNumber)==2)
{
DeletePendingOrders(MagicNumber);
return(0);
}
// في حال لا يوجد صفقات حالية أو صفقات معلقة فقم بفتح صفقة بيع أو صفقة شراء حسب رغبة المستخدم
if (MyRealOrdersTotal(MagicNumber)==0 && MyPendingOrdersTotal(MagicNumber)==0)
{
if (OpenBuy)
{
OpenBUYOrder(FirstLots,MagicNumber);
}
else
{
OpenSELLOrder(FirstLots,MagicNumber);
}
return(0);
}
// في حال تم فتح صفقة بيع أو شراء يجب وضع صفقات معلقة معاكسة لها نوعا واتجاها
if (MyRealOrdersTotal(MagicNumber)==2 && MyPendingOrdersTotal(MagicNumber)==0)
{
OrderSelect(t1,SELECT_BY_TICKET,MODE_TRADES);
slot=OrderLots()*LotsDouble;
ssl=OrderStopLoss();
stp=OrderTakeProfit();

if (OrderType()==OP_BUY)
{
gT1=OrderSend(Symbol(),OP_SELLSTOP,slot,ssl,3,ssl+ StopLoss*Point,ssl-TakeProfit*Point,"",MagicNumber,0,Green);
gT2=OrderSend(Symbol(),OP_SELLSTOP,slot,ssl,3,ssl+ StopLoss*Point,ssl-(TakeProfit*Point),"",MagicNumber,0,Green);
}
if (OrderType()==OP_SELL)
{
gT1=OrderSend(Symbol(),OP_BUYSTOP,slot,ssl,3,ssl-StopLoss*Point,ssl+TakeProfit*Point,"",MagicNumber ,0,Green);
gT2=OrderSend(Symbol(),OP_BUYSTOP,slot,ssl,3,ssl-StopLoss*Point,ssl+(TakeProfit*Point),"",MagicNumb er,0,Green);
}

}
return(0);
}
// وظيفة لحساب عدد الصفقات الحالية
int MyRealOrdersTotal(int Magic)
{
int c=0;
int total = OrdersTotal();
t1=-1;
t2=-1;

for (int cnt = 0 ; cnt < total ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && (OrderType()==OP_BUY || OrderType()==OP_SELL))
{
if (t1==-1)
{
t1=OrderTicket();
}
else
{
if (t2==-1)
{
t2=OrderTicket();
}
}
c++;
}
}
return(c);
}
// وظيفة لحساب عدد الصفقات المعلقة فقط
int MyPendingOrdersTotal(int Magic)
{
int c=0;
int total = OrdersTotal();

for (int cnt = 0 ; cnt < total ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP))
{
c++;
}
}
return(c);
}
// وظيفة لحذف الصفقات المعلقة
int DeletePendingOrders(int Magic)
{
int total = OrdersTotal();

for (int cnt = total - 1; cnt >= 0; cnt--)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP))
{
OrderDelete(OrderTicket());
}
}
return(0);
}
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
ettahrim
02-03-2012, 10:33 PM
السلام عليكم ورحمة الله وبركاته

رد جميل لهذا المنتدى المعطاء والاساتذه الذين تعلمت منهم الكثير

اقدم لكم هذا المؤشرين

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

الموضحه في الشارت المرفق

كما ارجوا منكم اطائي العذر في عدم التواصل سابقا

وذالك لضروفي العمليه التي لاتجعلني اتواصل بشكل دائم

وسوف تأثر علي بالتواصل لاحقا

هذه الاستراتيجيه يوميا اقل تقدير اطلع منها 50 نقطه

ومن زوجين فقط (( الاسترليني / الدولار)) و (( اليورو / دولار))

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

وعند ملا ئمتها لكم وانشاء الله يكون بها الخير سوف اضعها كامله ولا ارغب سوى دعواتكم

لوالدي بالمغفره والرحمه وللحي منهم بحسن الخاتمه ولاولادي بالصلاح

هذا هو كسبي المادي منها

الشارت والمؤشرين بالمرفقات اتمنى لكم الخير والكسب الوفير

همسه: امانه من يستخدمها ويجيد التعامل بها ان لابخل على الاخوه هنا بما وجد وما اكتشف فيها غير اللذي ذكرته .
ودمتم بود
[عذراً, فقط الأعضاء يمكنهم مشاهدة الروابط ]
Powered by vBulletin® Version 4.2.2 Copyright © 2015 vBulletin Solutions, Inc. All rights reserved, TranZ by Almuhajir
m_nasseem1 غير متواجد حالياً  
رد مع اقتباس
الصورة الرمزية سمير محمد ارمان
مشرف سابق
الصورة الرمزية سمير محمد ارمان
 
تاريخ التسجيل: Nov 2009
المشاركات: 33,660
معدل تقييم المستوى: 48
سمير محمد ارمان will become famous soon enough
افتراضي رد: للتثبيت :- مشروع نخريج 5000 مبرمج عربي باكاديمية لورصات
3#
11 - 11 - 2015, 02:04 PM
ماشاء الله
موضوع ممتاز جدا
لك الشكر والتقدير لك والى الاستاذ الكبير وضاح العطار
ارجو الاستمرار فى الموضوع
حتى يتم تثبيت الموضوع
لك الشكر والعرفان
متابع معك ان شاء الله
سمير محمد ارمان غير متواجد حالياً  
رد مع اقتباس
عضو جديد
 
تاريخ التسجيل: Oct 2015
المشاركات: 116
معدل تقييم المستوى: 9
m_nasseem1 is on a distinguished road
افتراضي رد: للتثبيت :- مشروع نخريج 5000 مبرمج عربي باكاديمية لورصات
4#
12 - 11 - 2015, 01:44 AM
اقتباس:
المشاركة الأصلية كتبت بواسطة سمير محمد ارمان مشاهدة المشاركة
ماشاء الله
موضوع ممتاز جدا
لك الشكر والتقدير لك والى الاستاذ الكبير وضاح العطار
ارجو الاستمرار فى الموضوع
حتى يتم تثبيت الموضوع
لك الشكر والعرفان
متابع معك ان شاء الله
ان شاء الله الادارة تنتبه ليه ويلاقي الاستحسان ويتم تثبيته ولو انه ها يحتاج منك مجهود جبار فوق ما هو مللقي علي عاتقك
لاتنسي فكرة الاكسبيرت اللي طرخته في القسم سيكون قنبلة المنتدي

التعديل الأخير تم بواسطة سمير محمد ارمان ; 12 - 11 - 2015 الساعة 08:04 AM
m_nasseem1 غير متواجد حالياً  
رد مع اقتباس
عضو جديد
 
تاريخ التسجيل: Nov 2014
المشاركات: 49
معدل تقييم المستوى: 0
ciccio18 is on a distinguished road
افتراضي رد: للتثبيت :- مشروع نخريج 5000 مبرمج عربي باكاديمية لورصات
5#
12 - 11 - 2015, 04:58 AM
و عليكم سلام اخي و جزاك الله خير.

موضوع ممتاز جدا بس لو في امكنيه ان الشرح علي فيدو يكون افضل .اني ما عمري اتعملت لغت C ولا MQL اول مره لي في البرمجه و كتابه فهمت بعض الشي و لم افهم كل لو امكن فيدو يكون افضل و جزاك الله كل خير
ciccio18 غير متواجد حالياً  
رد مع اقتباس
الصورة الرمزية سمير محمد ارمان
مشرف سابق
الصورة الرمزية سمير محمد ارمان
 
تاريخ التسجيل: Nov 2009
المشاركات: 33,660
معدل تقييم المستوى: 48
سمير محمد ارمان will become famous soon enough
افتراضي رد: للتثبيت :- مشروع نخريج 5000 مبرمج عربي باكاديمية لورصات
6#
12 - 11 - 2015, 08:06 AM
اقتباس:
المشاركة الأصلية كتبت بواسطة m_nasseem1 مشاهدة المشاركة
ان شاء الله الادارة تنتبه ليه ويلاقي الاستحسان ويتم تثبيته ولو انه ها يحتاج منك مجهود جبار فوق ما هو مللقي علي عاتقك
لاتنسي فكرة الاكسبيرت اللي طرخته في القسم سيكون قنبلة المنتدي
السلام عليكم
ارجو يكون طرح وعرض طريقة عمل الاكسبيرت
فى موضوع مستقل
تحياتى لك
سمير محمد ارمان غير متواجد حالياً  
رد مع اقتباس
عضو جديد
 
تاريخ التسجيل: Oct 2015
المشاركات: 116
معدل تقييم المستوى: 9
m_nasseem1 is on a distinguished road
افتراضي رد: للتثبيت :- مشروع نخريج 5000 مبرمج عربي باكاديمية لورصات
7#
12 - 11 - 2015, 08:50 PM
اقتباس:
المشاركة الأصلية كتبت بواسطة سمير محمد ارمان مشاهدة المشاركة
السلام عليكم
ارجو يكون طرح وعرض طريقة عمل الاكسبيرت
فى موضوع مستقل
تحياتى لك
علم وجري التنفيذ يا غالي
m_nasseem1 غير متواجد حالياً  
رد مع اقتباس


إضافة رد



جديد مواضيع منتدى المؤشرات و الاكسبرتات


09:35 PM