عرض مشاركة واحدة
قديم 17-02-2008, 11:07 PM   #11 (permalink)
معلومات العضو
وضاح عطار
مشرف الإكسبيرتات والمؤشرات
 
الصورة الرمزية وضاح عطار

إحصائية العضو
افتراضي رد: دورة صناعة الاكسبيرتات

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

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


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

كود PHP:
int start()
{
  if(
Hour()==&& Minute()>&& 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);


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

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


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

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

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

كود PHP:
if(Hour()==&& Minute()<&& MyOrdersTotal(Magicnumber)>0)
{
DeletePendingOrders(Magicnumber);
CloseOrders(Magicnumber);

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

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



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


كود PHP:
int DeletePendingOrders(int Magic)
{
  
int total  OrdersTotal()-1;
 
  for (
int cnt total  cnt 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

وهذا ما فعلناه بالضبط.

التوقيع

________________
لا إله إلا الله محمد رسول الله
________________

وضاح عطار متواجد حالياً   رد باقتباس