بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته أشكر الإخوة الكرام الذين سوف يشاركونني هذه الدورة وأرجو لهم كل التوفيق والنجاح . سوف نكتب فكرة الاكسبيرت الذي نريد صناعته مرة أخرى لنتذكرها ونمشي عليها: مع بداية كل يوم جديد في الساعة 12 ليلا يقوم الاكسبيرت بفتح صفقتين معلقتين بالشروط التالية:
- صفقة شراء فوق سعر الإغلاق لليوم المنتهي بعدد محدد من النقاط وبهدف محدد ووقف محدد. - صفقة بيع تحت سعر الإغلاق لليوم المنتهي بعدد محدد من النقاط وبهدف محدد ووقف محدد. - في حال تفعلت صفقة الشراء فإنه يقوم بحذف صفقة البيع المعلقة آليا. - في حال تفعلت صفقة البيع فإنه يقوم بحذف صفقة الشراء المعلقة آليا. - في حال انتهى اليوم ولم تتفعل أي صفقة فإنه يحذف الصفقتين ويبدأ من جديد. خصائص الاكسبيرت الجديد: - اسمه هو Buy_Sell_Day - له خاصية Step وهي عدد النقاط التي تعلو أو تدنو من سعر الإغلاق لليوم السابق. - له خاصية Takeprofit وهي عدد نقاط الربح. - له خاصية Stoploss وهي نقاط الوقف. - له خاصية Lots وهي حجم اللوتات لكل صفقة. والآن لنحلل طريقة عمل الاكسبيرت بطريقة برمجية تحليلية: - يفحص الاكسبيرت هل دخل يوم جديد. - يفحص الاكسبيرت هل قام بإضافة الصفقات المعلقة أم لا. فإذا كان قد أضافها فليخرج. وإلا فليقم بإضافتها الآن. - يضيف الاكسبيرت الصفقات المعلقة بالشروط المحددة. - يفحص الآن في كل مرة هل تفعلت إحدى الصفقتين أم لا. - في حال تفعلت صفقة فيجب حذف الصفقة المعلقة الأخرى. - في حال إغلاق الصفقة بربح أو خسارة فإنه ينتظر بدء يوم جديد ليعيد العملية مرة أخرى. والآن إلى الكود. نبدأ بالويزارد الخاص بعمل اكسبيرت من برنامج الميتاإيديتور. وعندما ننتهي سيكون قالب كود الاكسبيرت الأولي على الشكل التالي: كود PHP:
//+------------------------------------------------------------------+
//| Byu_Sell_Day.mq4 |
//| Copyright © 2007, www.****forex.net |
//| http://www.****forex.net |
//+------------------------------------------------------------------+
#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);
}
//+------------------------------------------------------------------+
نكتب الخصائص التالية للاكسبيرت مع القيم الافتراضية: كود PHP:
extern int Step=20;
extern int Takeprofit=50;
extern int Stoploss=50;
extern double Lots=1;
سوف نضيف متحولا داخليا باسم Magicnumber ونعطيه قيمة عشوائية ثابتة وذلك لكي يستطيع الاكسبيرت التعامل فقط مع صفقاته. كود PHP:
int Magicnumber=234561;
لا يوجد شيء نعمله في الوظيفية init والوظيفة deinit
عملنا كله سيكون في الوظيفة start وسوف نضيف نحن وظائف خاصة مساعدة. إن فتح الصفقات يكون دائما في الساعة 0 أي الساعة 12 صباحا ولذلك لن يفتح الاكسبيرت أي صفقة بعد الساعة 12 صباحا. لذلك فإن كود فتح الصفقات المعلقة سيكون على الشكل التالي: كود PHP:
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,BuySL,BuyTP,"",Magicnumber,0,Green);
OrderSend(Symbol(),OP_SELLSTOP,Lots,SellPrice,3,SellSL,SellTP,"",Magicnumber,0,Green);
}
return(0);
}
في شرط فتح الصفقات المعلقة وضعنا ثلاثة شروط:
الأول أن الساعة 0 وتعني أن 12 ليلا قد دخلت وأن يوما جديدا قد بدأ. الثاني أن الدقيقة أكبر من 10 وذلك لكي نعطي وقتا قليلا 10 دقائق بعد بداية اليوم لكي نتأكد أن البيانات صحيحة في الهيستوري وأن شمعة جديدة يومية قد تكونت. الثالث أن عدد الصفقات الحالية الخاصة باكسبيرتنا هو الصفر أي أنه لا توجد صفقات مفتوحة حاليا. واستخدمنا لذلك وظيفة خاصة من صنعنا هي MyOrdersTotal وأدخلنا فيها الرقم السحري الذي يميز صفقات الاكسبيرت عن غيره. هذه الوظيفة لها الكود التالي: كود PHP:
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.