النتائج 1 إلى 15 من 175
الموضوع: دورة صناعة الاكسبيرتات
- 13-02-2008, 10:40 PM #1
دورة صناعة الاكسبيرتات
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
كما وعدتكم سنبدأ من الآن إن شاء الله بدورة خاصة للاكسبيرتات .
مقدمة عن الاكسبيرتات:
يجب التفكير في الاكسبيرتات على أنها استراتيجية مؤتمتة آليا. أي لا بد للاكسبيرت أن يعتمد على استراتيجية معينة تكون في الأساس ناجحة.
ونحن نلجأ عادة للاكسبيرتات في حالات معينة مثل:
- عدم القدرة على المتابعة اللصيقة للشاشة.
- عدم القدرة على مجاراة السرعة التي تتطلبها الاستراتيجية.
- تطبيق الاستراتيجية سيكون على أكثر من زوج واحد بحيث يكون من المستحيل أن يقوم بها المتاجر نفسه.
- قد تكون شروط الاستراتيجية صعبة جدا بحيث لا يتمكن المتاجر من اتخاذ القرار السريع.
- قد تكون الاستراتيجية مستحيلة التطبيق يدويا لأنها تتضمن حسابات كثيرة ومعقدة جدا.
- الهروب من الخوف المصاحب للمتاجر عند تطبيق استراتيجية ما يدويا وجعل الاكسبيرت يقوم بهذه المهمة والتي يطبقها دون مشاعر مطلقا.
هناك الكثير من الأمور الأخرى التي تجعلنا نلجأ إلى الاكسبيرتات وطبعا هناك سبب مادي بحت.
فالوصول إلى اكسبيرت ناجح يعني كنز بالنسبة لصاحبه أو لمن يستخدمه.
الشروط الواجب توفرها في الاكسبيرت:
وهذه الشروط مهمة جدا ويجب أخذها بعين الاعتبار عند تصميم أي اكسبيرت احترافي.
- أن لا يتعامل الاكسبيرت إلا مع صفقاته التي فتحها بنفسه دون أن يتدخل في الصفقات الأخرى سواء كانت موجودة أو لا.
- يجب على الاكسبيرت أن يتعامل مع الأخطاء التي قد تحصل أثناء فتح الصفقات بحذر شديد.
- أن يكون للاكسبيرت القدرة على معرفة الحالة واتحاذ القرار الصحيح دائما حتى ولو انقطع الاكسبيرت عن الاتصال بالنت ثم عاد له مرة أخرى.
- أن يكون الاكسبيرت مرنا جدا من حيث الاستخدام والخصائص المتوفرة تكون واضحة.
- أن يعالج جميع حالات الاستراتيجية التي يتبعها وأن يكون عنده الحلول المناسبة لأي احتمال.
- أن يكون متضمنا فيه معالجة للمخاطرة المطلوبة وأن لا يتجاوزها بأي حال من الأحوال.
الفرق بين المؤشر والاكسبيرت:
- المؤشر له القدرة على إظهار رسوم على الشارت بينما الاكسبيرت لا يستطيع ذلك.
- المؤشر لا يستطيع فتح أو إغلاق الصفقات ولكن الاكسبيرت يستطيع ذلك.
- المؤشر يعمل دائما حتى في حال كان البرنامج غير متصل بالانترنت بينما الاكسبيرت لا يعمل إلا إذا كان البرنامج متصلا بالانترنت.
- المؤشر يعمل على بيانات الأسعار الحديثة والقديمة بينما الاكسبيرت لا يعمل إلا على آخر سعر فقط.
- باقي الأوامر البرمجية هي نفسها تماما وما تعلمناه في المؤشرات سنستخدمه وبنفس الطريقة تماما مع الاكسبيرتات.
بما أنه أصبح لدينا خبرة بالأوامر البرمجية سنبدأ مباشرة في صناعة اكسبيرت وبنفس مباديء برمجة المؤشر والتي عرضناها في الدروس الأولى.
أولا يجب أن تكون فكرة الاكسبيرت وشروطه واحتمالاته كلها معروفة لنا ومدروسة بشكل محكم وكامل لأن أي خطأ يعني خسارات لا سمح الله.
ثانيا يجب فحص الاكسبيرت على أربع مراحل:
-- الأولى: الفحص الذي يكون مع البرمجة بحيث نتأكد أن الاكسبيرت يعمل كما هو مخطط له وذلك باستخدام تقنية إظهار المعلومات أثناء عمل الاكسبيرت لنتأكد أن الاكسبيرت يسير برمجيا ضمن المخطط له.
-- الثانية: فحص الاكسبيرت من خلال برنامج التداول نفسه ولفترات مختلفة على الباك تيست وإيجاد أفضل الشروط لعمله بشكل صحيح.
-- الثالثة: فحص الاكسبيرت لمدة لا تقل عن الشهر على حساب ديمو.
-- الرابعة: فحص الاكسبيرت على حساب حقيقي مع مراقبة لصيقة له في البداية.
حسب خبرتي المتواضعة فإن الاكسبيرت الناجح هو الاكسبيرت المصمم لزوج محدد فقط.
لأن لكل زوج طريقة حركة معينة وأهداف وستوبات مختلفة عن أي زوج آخر.
لنبدأ على بركة الله
فكرة الاكسبيرت التي سننفذها هي:
مع بداية كل يوم جديد في الساعة 12 ليلا يقوم الاكسبيرت بفتح صفقتين معلقتين بالشروط التالية:
- صفقة شراء فوق سعر الإغلاق لليوم المنتهي بعدد محدد من النقاط وبهدف محدد ووقف محدد.
- صفقة بيع تحت سعر الإغلاق لليوم المنتهي بعدد محدد من النقاط وبهدف محدد ووقف محدد.
- في حال تفعلت صفقة الشراء فإنه يقوم بحذف صفقة البيع المعلقة آليا.
- في حال تفعلت صفقة البيع فإنه يقوم بحذف صفقة الشراء المعلقة آليا.
- في حال انتهى اليوم ولم تتفعل أي صفقة فإنه يحذف الصفقتين ويبدأ من جديد.
- 14-02-2008, 12:46 AM #2
رد: دورة صناعة الاكسبيرتات
متابعينك .. وفقك الله.
- 14-02-2008, 02:54 AM #3
رد: دورة صناعة الاكسبيرتات
الله عليك استاذ وضاح
موضوع جميل جدا
متابعين معك ان شاء الله
- 14-02-2008, 08:58 AM #4
رد: دورة صناعة الاكسبيرتات
بالتوفيق أخ وضاح
معك بالصف الاول
- 14-02-2008, 04:40 PM #5
رد: دورة صناعة الاكسبيرتات
جزاك الله كل خير
- 15-02-2008, 02:54 PM #6
رد: دورة صناعة الاكسبيرتات
بالتوفيق ومعاكككككككككككككككك على الخط
- 16-02-2008, 02:58 PM #7
رد: دورة صناعة الاكسبيرتات
مشكور والله يوفقك
- 16-02-2008, 03:29 PM #8
رد: دورة صناعة الاكسبيرتات
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
أشكر الإخوة الكرام الذين سوف يشاركونني هذه الدورة وأرجو لهم كل التوفيق والنجاح .
سوف نكتب فكرة الاكسبيرت الذي نريد صناعته مرة أخرى لنتذكرها ونمشي عليها:
مع بداية كل يوم جديد في الساعة 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;
كود PHP:int Magicnumber=234561;
عملنا كله سيكون في الوظيفة 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.
- 17-02-2008, 10:59 PM #9
رد: دورة صناعة الاكسبيرتات
بسم الله الرحمن الرحيم
نكمل ما بدأنا به مع الاكسبيرت السابق
ولكن قبل ذلك سأشرح بالتفصيل الوظيفة OrderSend أهم وظيفة على الإطلاق بالنسبة لبرمجة الاكسبيرتات.
كما أنها تعتبر من الوظائف الخاصة بالاكسبيرتات فقط والتي لا يستطيع المؤشر بأي شكل من الأشكال أن ينفذها.
مهمتها ببساطة إجراء عملية بيع أو شراء فوري بسعر السوق أو عمليات بيع أو شراء معلقة بسعر أعلى أو أدنى من سعر السوق الحالي .
البيع والشراء الفوري يعني من السعر الحالي ( آخر سعر للزوج )
ويكون الشراء من سعر الطلب Ask والبيع من سعر العرض Bid
الشراء المعلق له نوعان :
الأول شراء محدود Buy Limit ويكون من سعر أدنى من السعر الحالي.
وهو النوع من الصفقات الذي تضعه على دعم تتوقع أن يرتد منه السعر.
الثاني شراء وقف Buy Stop ويكون من سعر أعلى من السعر الحالي.
وهو النوع من الصفقات الذي تضعه على مقاومة تتوقع أن يكسرها السعر.
البيع المعلق له نوعان أيضا:
الأول بيع محدود Sell Limit ويكون من سعر أعلى من السعر الحالي.
وهو النوع من الصفقات الذي تضعه على مقاومة تتوقع أن يرتد عنها السعر.
الثاني بيع وقف Sell Stop ويكون من سعر أدنى من السعر الحالي.
وهو النوع من الصفقات الذي تضعه على دعم تتوقع أن يخترقها السعر.
وهذه الوظيفة لها البارامترات التالية :
كود PHP: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
والذي يحتوي اسم الزوج الذي يعمل عليه الاكسبيرت حاليا وهي الطريقة المتبعة غالبا .
ولكن أحيانا فإننا قد نحتاج أن نجري صفقة على زوج آخر ولذلك فقد نضطر لكتابة اسم الزوج يدويا .
البارامتر الثاني هو نوع الصفقة التي نريد اجرائها على الزوج المحدد وهو له هذه القيم :
كود PHP: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 بالنسبة لعملية البيع الفوري
لأن البروكر لن يقبل أسعارا غير متوافقة مع سعر السوق الحالي وسوف تفشل الصفقة الفورية .
أما بالنسبة للعمليات المعلقة الأخرى فالسعر يجب أن يكون أعلى أو أدنى من السعر الحالي وفق نوع الصفقة كما هو محدد في الأعلى وبفارق يقبله البروكر نفسه
فقد لا يقبل البروكر عملية شراء معلقة لا تبعد عن السعر الحالي بأكثر من عشرة نقاط وسوف تفشل الوظيفة أيضا .
- 17-02-2008, 11:03 PM #10
رد: دورة صناعة الاكسبيرتات
البارامتر الخامس هو عبارة عن نقاط التسامح والتي تعني مجال التسامح في السعر المحدد للصفقة
فلو فرضنا أننا أردنا الشراء عند السعر 1.9654 بتسامح قدره 3 نقاط فإن مجال الشراء المسموح هو من 1.9654 إلى 1.9657
طبعا هذا الرقم يكون لصالح البروكر نفسه ولن يكون غالبا لمصلحة المتاجر لذلك يفضل جعله 3 نقاط أو أقل حتما .
البارامتر السادس هو وقف الخسارة وهو السعر الذي ستتوقف خسارة صفقتك عنده ويتم احتسابه بناء على سعر الدخول زائد أو ناقص عدد معين من النقاط بناء على نوع الصفقة
فلو فرضنا أن العملية شراء بوقف 50 نقطة فيجب أن يكون سعر الوقف مساويا لسعر الشراء ناقص 50 نقطة والمعادلة ستكون على الشكل التالي:
كود PHP:Ask-Stoploss*Point
حيث المتحول Stoploss يساوي الخمسين وقد تم ضربه بالقيمة Point لتحويله إلى رقم عشري مناسب لسعر الزوج .
مثلا المتحول Ask يساوي 1.9525 فإن وقف الخسارة سيكون 1.9525 - 50 * 0.0001 = 1.9475
البارامتر السابع هو الهدف أو سعر أخذ الربح وهو مشابه لسعر وقف الخسارة ولكن بالاتجاه الصحيح لصفقتك
فمثلا في صفقة الشراء فإن سعر الهدف يجب أن يكون أعلى من سعر الدخول بعدد معين من النقاط ويحتسب على الشكل التالي :
كود PHP:Ask+Takeprofit*Point
البارامتر الثامن هو عبارة عن نص يمكنك وضع ملاحظة معينة تخزن مع معلومات صفقتك نفسها يمكنك قرائتها فيما بعد .
البارامتر التاسع هو عبارة عن الرقم السحري والذي تحدده أنت في الاكسبيرت نفسه ووظيفته فصل الصفقات وتصنيفها بحيث يستطيع كل اكسبيرت
معرفة صفقاته من صفقات غيره . فيقوم بمعالجة صفقاته فقط دون أن يمس الصفقات الأخرى .
البارامتر العاشر هو تاريخ انتهاء الصلاحية وهو فقط للصفقات المعلقة بحيث تستطيع تحديد تاريخ معين يتم فيه حذف هذه الصفقة المعلقة في حال لم يصل السعر السوقي للسعر المحدد فيها .
البارامتر الأخير هو اللون المميز لهذه الصفقة على الشارت
البارامترات الأربعة الأخيرة هي بارامترات اختيارية أي يمكنك عدم وضع قيمة فيها لتأخذ حينها القيم الافتراضية المعرفة مسبقا
وهذا مثال عن تنفيذ صفقة شراء
كود PHP: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);
}
}
- 17-02-2008, 11:07 PM #11
رد: دورة صناعة الاكسبيرتات
الاكسبيرت الجديد حاليا يقوم بفتح الصفقات المعلقة يوميا.
ولكنه بحاجة إلى تطوير وتحديث وهو أن يقوم بحذف الصفقات المعلقة والتي لم تنفذ من اليوم السابق.
الكود الحالي للوظيفة start هي على الشكل التالي:
كود 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);
}
سنضع الآن شرطا في حال وجد صفقات معلقة من اليوم السابق أن يقوم بحذفها
وسيكون الحذف بعد دخول الساعة 12 ليلا وخلال الخمس دقائق الأولى من الساعة 12
سنستخدم وظيفتين إحداهما لحذف الصفقات المعلقة التي لم تنفذ والوظيفة الثانية هي إغلاق الصفقات المنفذة مهما كانت النتيجة.
هاتين الوظيفتين هما من مكتبة أكوادي الخاصة وسنشرح كيف تعمل كل وظيفة.
يصبح الشرط على الشكل التالي :
كود PHP:if(Hour()==0 && Minute()<5 && MyOrdersTotal(Magicnumber)>0)
{
DeletePendingOrders(Magicnumber);
CloseOrders(Magicnumber);
}
في حال تحققت الشروط السابقة يقوم الاكسبيرت بحذف الصفقات المعلقة وإغلاق الصفقات المفتوحة.
الوظيفة المسؤولة عن حذف الأوامر المعلقة هي :
كود PHP: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);
}
لأنه لا يمكن حذف الصفقات من هذا النوع.
في حال تم حذف صفقة معلقة فإنه يقوم بإعادة العداد cnt إلى الصفر مرة أخرى ويقوم بعد الصفقات كلها من جديد في التحول total .
هذه الخطوة ضرورية جدا لأنه بعد حذف أي صفقة تختلف قيم total و cnt ولا بد من تحديث القيم هذه من جديد.
تقنية الحذف هي عن طريق اختيار وتحديد الصفقة بواسطة الوظيفة OrderSelect والتي لها ثلاثة بارامترات.
الأول هو رقم الصفقة التي نريد تحديدها.
الثاني هو نوع رقم الصفقة هل هو رقم تسلسلي أو رقم التيكيت.
الثالث هو لتحديد خزان الصفقات التي نريد الاختيار منها هل هو الصفقات الحالية أو الصفقات الهيستوري.
وكما تلاحظون بأننا استخدمنا تحديد الصفقات عن طريق رقمها التسلسلي والموجودة في خزان الصفقات الحالية.
التقنية كالتالي وهي أن نعمل حلقة على كل الصفقات الحالية وفي حال وجدنا صفقة تحقق الشرط أنها تابعة للاكسبيرت ولنفس الزوج المحدد وأنها ليست صفقة بيع أو شراء منفذة فإننا نحذفها عن طريق الوظيفة OrderDelete.
هذه الوظيفة تحذف لنا أي صفقة يمكن حذفها من خلال رقمها التيكيت.
وهذا الرقم حصلنا عليه من خلال الوظيفة OrderTicket.
وطبعا لا يمكن استخدام OrderTicket إلا بعد أن نستخدم الوظيفة OrderSelect
وهذا ما فعلناه بالضبط.
- 17-02-2008, 11:10 PM #12
رد: دورة صناعة الاكسبيرتات
أما الوظيفة المسؤولة عن إغلاق الصفقات المنفذة فهي :
كود PHP: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 بالنسبة للبيع.
بعد إغلاق كل صفقة نحتاج لتحديث العدادات كما شرحنا سابقا.
هاتين الوظيفتين هامتين جدا لنا في المستقبل لحذف الصفقات أو أغلاقها.
الآن يصبح الكود النهائي على الشكل التالي وهو جاهز للعمل وبدون مشاكل.
كود 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"
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,BuySL,BuyTP,"",Magicnumber,0,Green);
OrderSend(Symbol(),OP_SELLSTOP,Lots,SellPrice,3,SellSL,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);
}
- 18-02-2008, 12:28 AM #13
رد: دورة صناعة الاكسبيرتات
جزاك الله كل خير
- 19-02-2008, 09:20 AM #14
رد: دورة صناعة الاكسبيرتات
الله يعطيك ألف عافيه استاذ وضاح
لدي بعض الاستفسارات لو تكرمت..
1 ) لو أردت ان يقوم الاكسبيرت بالاحتفاظ في الصفقه المعاكسه
فمثلاً تفعل أمر الشراء.. ولم يتفعل امر البيع بعد
هنا سيقوم الاكسبيرت بحذف امر البيع !!
أريده ان يقوم بحذف امر الشراء فقط بحيث لا يشتري مره اخرى ولكن يمكنه البيع فقط
وعند نهاية اليوم يقوم بحذف الأوامر التي لم تتفعل بعد
2) أريد ان يقوم الاكسبيرت بعمل امر شراء ليمت ايضاً في حال كان السعر أعلى من مستوى الدخول المحدد
فمثلاً..
أريد أن يقوم الاكسبيرت بالشراء عند مستوى المقاومة الأولى R1
ففي حال كان السعر أعلى من R1 يقوم بوضع شراء ليمت
وفي حال كان السعر أدنى من R1 يقوم بوضع أمر شراء ستوب
3) تعلم ان بعض الشركات لا تسمح بعمل أوامر معلقه عند سعر قريب من السعر الحالي بـ 10 نقاط
فكيف يمكن لنا ان نقول للاكسبيرت ان يتابع حركة السعر بحيث اذا لم يستطع وضع امر الشراء فسيقوم بمتابعة السعر الحالي والتنفيذ مباشره في حالة ملامسة سعر الشراء المطلوب
أتمنى أن لا اكون قد استبقت الدروس القادمه
وفي انتظار ردك استاذي
تحياتي لك
أخوك عادل الماجد
- 19-02-2008, 03:23 PM #15
رد: دورة صناعة الاكسبيرتات
كنت أنتظر الموضوع هذا منك
شرحك رااااااااائع ماشاء الله تبارك الله ، مافي أسهل من وصول المعلومة والفكرة
المواضيع المتشابهه
-
طلب صناعة إكسبرت RSI
By FOREX_WAR in forum برمجة المؤشرات واكسبرتات التداول - Experts Advisor EAمشاركات: 22آخر مشاركة: 29-04-2017, 10:58 PM -
طلب = صناعة سكربت
By cobra100 in forum برمجة المؤشرات واكسبرتات التداول - Experts Advisor EAمشاركات: 6آخر مشاركة: 28-10-2008, 02:41 PM -
طريقة صناعة الاكسبيرتات الاليه
By ماجد كو in forum برمجة المؤشرات واكسبرتات التداول - Experts Advisor EAمشاركات: 24آخر مشاركة: 05-05-2008, 03:02 PM