بسم الله الرحمن الرحيم
(موضوع منقول للاخ الدكتور وليد سليمان نقلته لفائدة الاعضاء )
في هذا الموضوع شرح كامل لعملية تصنيع اكسبيرت عن طريق نموذج لأحد الكسبيرتات
يكفي فقط ان تضع طريقتك على هيئة معادلات وبعدين تغذي بها النموذج وتبدأ متاجرتك الألية
ارجو التركيز من فضلكم
نبدأ على بركة الله
* التعرف على نموذج الكسبيرت
// كود PHP:
+------------------------------------------------------------------+
كود PHP:
[center] //| My Own Expert |
//| Copyright, created 20 may 2006 |
//| www.forex.com.sa |
//| Desined by Dr. Waleed |
//| [email protected] |
//+------------------------------------------------------------------+
#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*Point;}
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+Point*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);
}
//+---------------------------------------------------------------------------------+
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*[/center]
كود PHP:
[center]
//+------------------------------------------------------------------+
//| My Own Expert |
//| Copyright, created 20 may 2006 |
//| www.forex.com.sa |
//| Desined by Dr. Waleed |
//| [email protected] |
//+------------------------------------------------------------------+
#property copyright "My Own Expert"
#property link "www.forex.com.sa"
[/center]
هذا الجزء بأكمله تعريف لصانع الكسبيرت وحقوقه ,, يمكنك كتابة اي بيانات هنا مثلي ولا يؤثر على عمل الكسبيرت ,, هذا الجزء خاص بك وحدك اكتب ما تشاء
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
ثاني جزء من الكسبيرت
كود PHP:
extern int MaxTrades = 1; // ------------------ 1
كود PHP:
[center] 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
[/center]
حسنا , الأن هذه اعدادات الكسبيرت يمكنك تغير ما تشاء منها حسب القواعد التالية
رقم 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)
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
ثالث جزء من الكسبيرت
// كود PHP:
+------------------------------------------------------------------+
كود PHP:
[center] //| 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);
}
[/center]
لا يتم تغيير شئ فيه بتاتا
وهو الجزء الخاص بتعريف الميتا عملية البيع والشراء
لن نتدخل في هذا الجزء
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
رابع جزء من الكسبيرت ( ارجو التركيز)
// كود PHP:
+------------------------------------------------------------------+
كود PHP:
[center] //| 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
[/center]
هنا في هذا الجزء من الكسبيرت سيتم تعريف الميتا بالمؤشرات التي سيقوم عليها عمل الكسبيرت
فأنت قبل ان تنشئ اكسبيرتك الخاص يجب عليك قبل البدء , تحديد المؤشرات الخاصة بك وتسميتها بأسماء لكي يميزها الكسبيرت
سأعطي مثالا كما هو موضح في هذا الجزء
انا الأن اريد ان استخدم المتوسطان 5 اكسبوشنال و 8 اكسيبوشنال فقط في هذا الكسبيرت وعمله سيكون قائما على تقاطعهما فقط
ساتي للخطوة رقم 11 الموجودة في الكود اعلاه واكتب اسماء من تأليفي امام كلمة double لكل ما سأستخدمه من متوسطات وارجو الألتزام بالفواصل كما هي :
EMA5cr خاص بالمتوسط المتحرك 5 للشمعة الحالية
EMA5pr خاص بالمتوسط المتحرك 5 للشمعة السابقة
EMA8cr خاص بالمتوسط المتحرك 8 للشمعة الحالية
EMA8pr خاص بالمتوسط المتحرك للشمعة السابقة
سيسألني سائل : لماذا يا وليد وضعت اسم المتوسطات للشموع السابقة؟ والجواب سيأتي ذكره في الجزء التالي من الكسبيرت(المعادلات) فلا تستعجلون الأن.
ارجو ملاحظة ان الأسماء السبقة لي حرية اختيارها وهي يمكن تغييرها المهم اني التزم بها فيما سيلي ,
الأن وبعد ان سميت المتوسطات بأسمائها امام كلمة double سأترجمها للميتا تريدر كي يعرف اي متوسطات انا استخدمها
في الخطوات من
رقم12 ل
رقم 15 تعريف لكل اسم انا اخترته وبجانبه اشارة =
هذا التعريف هو اسم مؤشرات المتوسطات كما يعرفها الميتاتريدر واعداداتها
وهناك مكتبة لأغلب المؤشرات الموجودة في الميتا ويجب الألتزام بها كما هي والتغيير يكون في الأعدادات فقط كما سأذكره لاحقا وهي بالمرفقات باسم "مكتبة المؤشرات"
سأذكر مثالا على التغيير في اعدادات المتوسط 5 اكسيبوشنال, كلوز للشمعة الحالية والشمعة السابقة :
انظر للخطوة رقم 12 في الكود
كود PHP:
[center][center]
EMA5cr=iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_CLOSE,0); ----- 12
[/center][/center]
EMA5cr الأسم الذي سميته له في الخطوة رقم 11
= هذه الأشارة معناها انها تقول للميتا ان هذا الأسم الذي اخترته يختص بالمؤشر المخزن في ذاكرتك واعداداته كما في التالي
iMA كود المتوسط المتحرك في الميتا تريدر وهو مخزن بها وستجده في مكتبة المؤشرات في المرفقات
NULL نتركها كما هي
0,5,0 رقم المتوسط المتحرك 5 , ان اردت استخدام المتوسط 200 مثلا يمكنك تغيير رقم 5 هنا ل 200 وهكذا سيعرف الكسبيرت انك استخدمت المتوسط 200 (ارجو ان يكون الشرح واضح)
MODE_EMA وهو خاص بأعدادات المتوسط من ناحية simple او exponential طبعا EMA معناها اكسيبونينشيال و SMA معناها سيمبل وهكذا
PRICE_CLOSE وهي تتعلق بأعدادات المؤشر من ناحية ان يحسب الهاي او اللو او الأوبن او الكلوز
0 الصفر الأخير في كل المؤشرات اهم شئ في اعدادات كل المؤشرات ومعناه انه يعرف الكسبيرت ان تستخدم هذا المؤشر بقيمة الشمعة الحالية , واذا غيرنا الصفر لواحد فمعناها اننا نقصد ان قيمة المؤشر نريدها للشمعة السابقة , وقيمة 2 معناها الشمعة قبل السابقة وهكذا
كود PHP:
[center][center]
EMA5pr=iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_CLOSE,1); ----- 13
[/center][/center]
هنا المتوسط قيمته عند الشمعة السابقة للسعر الحالي
كلما زاد الرقم كلما بعدنا عن الشمعة الحالية وهكذا ( ارجو ان يكون الشرح واضح ومفهوم)
ملاحظة مهمة قبل الأنتقال للخطوات القادمة , اذا اردنا ان نضيف اغلاق الشمعة او سعر فتحها او الهاي او اللو لها فهؤلاء لهم استثاء صغير
يكفي فقط ان نضع في المعادلات في الجزء القادم من الكسبيرت كلمة Close او Open او High او Low دون تعريفها في هذا الجزء مثل بقية المؤشرات فالميتا يعرفهم بمفرده فلا حاجة لتسميتها او تعريفها من قبلنا بل توضع في المعادلات كما هي ونغير فقط في اعداداتها كما في هذا الكود
كود PHP:
كود PHP:
High[0] // ----- 18
كود PHP:
[center]Open[2] // ----- 19
Close[1] //----- 20
Low[1] // ----- 21
[/center]
في
رقم 18 نقصد الهاي للشمعة الحالية
في
الرقم 19 نقصد الأوبن للشمعة ما قبل السابقة
في الرقم 20 نقصد كلوز الشمعة السابقة
في الرقم 21 نقصد اقل سعر للشمعة السابقة ... وهكذا تكتب في المعادلات مباشرة دون تعريف وسيأتي ذكرها في الجزء القادم ان شاء الله
الأن لنعود لهذا القسم من جديد بعد شرح اعدادات المؤشرات وكما لاحظتم في الخطوات من رقم 12 ل رقم 15 اني اريد من الكسبيرت استخدام الموفنج افرج 5 اكسبونينشال كلوز للشمعة الحالية وقيمته ايضا للشمعة السابقة و8 اكسبونينشال للشمعة الحالية وايضا السابقة
الأن عرف الكسبيرت ماذا اريد ان استخدم وما هي الأدوات التي اريده فقط ان يستخدمها
لم يبقى سوى كيف يستخدمها في عملية البيع والشراء ؟
وهو ما سيتم شرحه في الجزء التالي
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
خامس جزء من الكسبيرت ( ارجو التركيز أكثر)
كود PHP:
[center]
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*Point;}
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");
}
}
[/center]
لن نتدخل هنا الا في السطرين رقم 22 (معادلة الشراء) ورقم 23 ( معادلة البيع)فقط .
عملنا كله في هذا القسم سيكون في المعادلات بين القوسين ( ) بعد كلمة if
الأن دعونا نفكر قليلا , الأن الكسبيرت عرف المؤشرات التي سيستخدمها وباقي عليه انه يعرف كيف سيستخدمها , ماذا نفعل لكي نفهمه ان يشتري او يبيع عند التقاطع ؟
لكي نشرح للكسبيرت عملية التقاطع يلزمنا معادلات لهذا , سنشرحها بالعربي اولا وبعدها نحولها لكود
عملية التقاطع لأعلى ( شراء) معناها ان متوسط 5 يقطع متوسط 8 لأعلى
بمعنى أكثر دقة ان قيمة المتوسط 5 في الشمعة السابقة اقل من قيمة المتوسط 8 وبعد لحظة التقاطع انقلب الوضع وصار المتوسط خمسة حاليا اعلى من المتوسط 8 حاليا ... (وليد صار يخرف)
بعد تحويلها لمعادلات بتكون كدا
كود PHP:
EMA5cr>EMA8cr && EMA5pr<EMA8pr
وعلامة && معناها بلغة الميتا " و " يعني لازم تحقق الشرطين اعلاه مع بعضهما , وعلامة || معناها بلغة الميتا " أو " يعني يمكن تحقق اي الشرطين
الأن لاحظوا معي EMA5pr<EMA8pr اي ان المتوسط 5 كان في الشمعة السابقة اصغر من المتوسط 8 ,,, EMA5cr>EMA8cr اصبح المتوسط 5 حاليا اكبر من المتوسط 8
وكتبناهم في السطر 22 اي مكان معادلات الشراء ,
هنا عند تحقق الشروط وحدوث التقاطع سيفهم الكسبيرت انه عليه الأن فتح صفقة شراء تيجة لهذه المعطيات .
ونفس الكلام في معادلة البيع
لاحظو اننا فكرنا اولا كيف نترجم عملية التقاطع للغة الميتا ,, اي ان كل شئ بدأ بالتفكير وهو ما اطلبه منكم عند التدريب على هذا النموذج
حسنا ما ذا لو اردنا مثلا ان يشتري الكسبيرت عند صعود الRSI مثلا
الحل هنا كود PHP:
RSI1 = iRSI(NULL, 0, 14, PRICE_CLOSE,0);
كود PHP:
[center]RSI2 = iRSI(NULL, 0, 14, PRICE_CLOSE,1);
[/center]
ونكتبها في الجزء الربع من الكسبيرت ولا ننسى ان نعرف RSI1 و RSI2 امام كلمة double في السطر رقم 11
وبعد ذلك نفكر , كيف نترجم عملية صعود ال ار اس اي للكسبيرت ,
سهلة , لما تكون قيمته الحالية اعلى من قيمته السابقة بيكون اكيد صاعد وما علينا الا ان نكتب المعادلة دي في السطر رقم 22 في معادلة الشراء
كود PHP:
او ممكن ندمجها في نفس نموذج الكسبيرت المرفق مثلا على النحو التالي
كود PHP:
if (EMA5cr>EMA8cr && EMA5pr<EMA8pr && RSI1>RSI2) // ------ 22
طيب ماذا لو اردنا ان نشتري مثلا عندما يكون سعر افتتاح الشمعة السابقة اعلى من سعر اغلاقها
الحل
كود PHP:
Open[1]>Close[1]
ولا يتم تعريفهم لأنهم استثنائيون في الجزء الرابع من الكسبيرت بل نكتفي بوضعها فقط داخل معادلة الشراء في السطر
رقم 22 كما هو مبين :
كود PHP:
if (Open[1]>Close[1]){ // ---------- 22