النتائج 1 إلى 15 من 37
- 16-04-2014, 01:39 AM #1
موضوع تعليمي : التعامل مع الكائنات على الشارت وإستخدام الداله OnChartEvent
سابقا عندما كنا نريد التعامل مع الكائنات على الشارت ( معرفة هل تم الضغط على زر على الشارت - هل تم رسم كائن جديد - هل تم حذف كائن - تحرك الماوس على الشارت .... ) كنا نستخدم مكتبات
خارجيه لكن الآن يمكننا مباشرة بتنفيذ جميع الأوامر المتعلقه بالشارت بلغة MQL4 مباشرة
في هذا الموضوع سوف نتكلم بتفصيل أكثر عن الداله OnChartEvent وهي أحد الدوال التي تم إضافتها جديدا بعد التحديث الجديد للغة MQL4 وسوف نقوم بعمل إكسبرت يرسم أزرار على الشارت تمكنك من تنفيذ أوامر البيع و الشراء بضغطة زر
سنقوم بكتابة الداله في كود المؤشر
وهي تأخذ أربعة قيمكود PHP:void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
id تحفظ نوع الحدث الذي تم ( تحرك الماوس - ضغط على الشارت - تحريك كائن - ضغط على زر في الكيبورد ... )
وأنواعها هي
حدث الضغط على زر على الكيبوردكود PHP:CHARTEVENT_KEYDOWN
تحرك الماوس على الشارتكود PHP:CHARTEVENT_MOUSE_MOVE
رسم كائن جديد على الشارتكود PHP:CHARTEVENT_OBJECT_CREATE
تغيير قيم كائنكود PHP:CHARTEVENT_OBJECT_CHANGE
حذف كائنكود PHP:CHARTEVENT_OBJECT_DELETE
كليك على الشارتكود PHP:CHARTEVENT_CLICK
كليك على كائنكود PHP:CHARTEVENT_OBJECT_CLICK
إضافة كائن على الشارتكود PHP:CHARTEVENT_OBJECT_DRAG
الإنتهاء من تعديل نص في الكائنكود PHP:CHARTEVENT_OBJECT_ENDEDIT
تعديل قيم الشارتكود PHP:CHARTEVENT_CHART_CHANGE
عمل كائن فرعي محددكود PHP:CHARTEVENT_CUSTOM+N
المتغيرات الثلاث الأخرى تحفظ قيمة معينه حسب نوع الحدث
فمثلا بالنسبه للحدث CHARTEVENT_OBJECT_CREATE
sparam تحفظ إسم الكائن الذي تم رسمه
مثلا CHARTEVENT_OBJECT_CLICK
lparam تحفظ قيمة الإحداثي الأفقي
dparam تحفظ قيمة الإحداثي الراسي
sparam تحفظ إسم الكائن الذي تم الضغط عليه
هذه قائمة بكل حدث و تعريف له

نعود الآن بالنسبه للإكسبرت الذي سنقوم بعمله
قمت بعمل دالة لرسم الأزرار على الشارت
بداخل الدالة OnInit قمت برسم الأزرار الخاصة بالشراء و البيع و إغلاق و حذف الأوامكود PHP:void CreatePanel(string name,ENUM_OBJECT Type,string text,int XDistance,int YDistance,int Width,int Hight,
color Color_,color TextColor,color boarderColor,int fontsize)
{
ObjectCreate(0,name,Type,0,0,0);
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,XDistance);
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,YDistance);
ObjectSetInteger(0,name,OBJPROP_XSIZE,Width);
ObjectSetInteger(0,name,OBJPROP_YSIZE,Hight);
ObjectSetString(0,name,OBJPROP_TEXT,text);
ObjectSetString(0,name,OBJPROP_FONT,"Arial Bold");
ObjectSetInteger(0,name,OBJPROP_FONTSIZE,fontsize);
ObjectSetInteger(0,name,OBJPROP_CORNER,Panel_Corner);
ObjectSetInteger(0,name,OBJPROP_COLOR,TextColor);
ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,boarderColor);
ObjectSetInteger(0,name,OBJPROP_BGCOLOR,Color_);
if(Type==OBJ_EDIT)ObjectSetInteger(0,name,OBJPROP_ALIGN,ALIGN_CENTER);
}
الآن نعود مرة أخرى للداله OnChartEventكود PHP:CreatePanel("Panel_Buy",OBJ_BUTTON,"BUY", 10, 45,60,30,DodgerBlue,White,Blue,12);
CreatePanel("Panel_Lot",OBJ_EDIT,"0.1", 70, 50,30,20,White,Black,Black,9);
CreatePanel("Panel_+",OBJ_BUTTON,"+", 75, 38,20,10,Lime,Black,Lime,9);
CreatePanel("Panel_-",OBJ_BUTTON,"-", 75, 72,20,10,Red,Black,Red,9);
CreatePanel("Panel_Sell",OBJ_BUTTON,"SELL",100,45,60,30,OrangeRed,White,Red,12);
CreatePanel("Panel_TP",OBJ_BUTTON,"TP", 10, 80,20,20,Blue,White,Blue,10);
CreatePanel("Panel_SL",OBJ_BUTTON,"SL", 140,80,20,20,Blue,White,Blue,10);
CreatePanel("Panel_TP_text",OBJ_EDIT,"0",30, 80,40,20,White,Black,Red,9);
CreatePanel("Panel_SL_text",OBJ_EDIT,"0",100,80,40,20,White,Black,Red,9);
if(Enable_CloseAll)CreatePanel("Panel_CloseAll",OBJ_BUTTON,
"CLOSE ALL",10, 105,70,20,Red,White,Red,8);
if(Enable_DeleteAll)CreatePanel("Panel_DeleteAll",OBJ_BUTTON,
"DELETE ALL",90, 105,70,20,Red,White,Red,8);
في البداية سأقوم بإضافة شرط لمعرفة إذا ما تم الضغط على أي زر على الشارت بإستدعاء إسمه
بقي فقط أن نضيف الأوامر كما هي محدده في الكومنتات لكن قبل ذلك يجب أن نقوم بمعرفة قيم حجم اللوت و الهدف و الاستوب لذلك اضفت الكودكود PHP:if(id==CHARTEVENT_OBJECT_CLICK)
{
string Object_Name=ObjectGetString(0,sparam,OBJPROP_NAME);
if(Object_Name=="Panel_Buy")
{
// open buy
}
if(Object_Name=="Panel_Sell")
{
// open sell
}
if(Object_Name=="Panel_CloseAll")
{
// close all
}
if(Object_Name=="Panel_DeleteAll")
{
// delete all
}
}
أيضا سأضيف كود آخر بحيث بعد الضغط على الأزار تعود إلى طبيعتها مره أخرىكود PHP:double Lots=StringToDouble(ObjectDescription("Panel_Lot")); StopLoss=StringToDouble(ObjectDescription("Panel_SL_text")); TakeProfit=StringToDouble(ObjectDescription("Panel_TP_text"));
وسيكون الكود في النهاية بشكل كاملكود PHP:ObjectSetInteger(0,Object_Name,OBJPROP_SELECTED,false); ObjectSetInteger(0,Object_Name,OBJPROP_STATE,false);
بقي الآن أن أضيف كود لزيادة أوتقليل حجم اللوت عندما يتم الضغط على زر + أو -كود PHP:if(id==CHARTEVENT_OBJECT_CLICK)
{
double StopLoss,TakeProfit;
double Lots=StringToDouble(ObjectDescription("Panel_Lot"));
StopLoss=StringToDouble(ObjectDescription("Panel_SL_text"));
TakeProfit=StringToDouble(ObjectDescription("Panel_TP_text"));
double SL,TP;
int ticket;
string Object_Name=ObjectGetString(0,sparam,OBJPROP_NAME);
if(Object_Name=="Panel_Buy")
{
if(StopLoss==0)SL=0;else SL=Ask-StopLoss*point;
if(TakeProfit==0)TP=0;else TP=Ask+TakeProfit*point;
ticket=OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),3*P,SL,TP,"Panel EA",0,0,Blue);
ObjectSetInteger(0,Object_Name,OBJPROP_SELECTED,false);
ObjectSetInteger(0,Object_Name,OBJPROP_STATE,false);
}
if(Object_Name=="Panel_Sell")
{
if(StopLoss==0)SL=0;else SL=Bid+StopLoss*point;
if(TakeProfit==0)TP=0;else TP=Bid-TakeProfit*point;
ticket=OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),3*P,SL,TP,"Panel EA",0,0,Blue);
ObjectSetInteger(0,Object_Name,OBJPROP_SELECTED,false);
ObjectSetInteger(0,Object_Name,OBJPROP_STATE,false);
}
if(Object_Name=="Panel_CloseAll")
{
CloseOrders(OP_BUY);
CloseOrders(OP_SELL);
ObjectSetInteger(0,Object_Name,OBJPROP_SELECTED,false);
ObjectSetInteger(0,Object_Name,OBJPROP_STATE,false);
}
if(Object_Name=="Panel_DeleteAll")
{
CloseOrders(OP_BUYLIMIT);
CloseOrders(OP_SELLLIMIT);
CloseOrders(OP_BUYSTOP);
CloseOrders(OP_SELLSTOP);
ObjectSetInteger(0,Object_Name,OBJPROP_SELECTED,false);
ObjectSetInteger(0,Object_Name,OBJPROP_STATE,false);
}
}
ولا ننسى الجزء البسيط وهو دالة إغلاق الصفقاتكود PHP:if(Object_Name=="Panel_+")
{
ObjectSetString(0,"Panel_Lot",OBJPROP_TEXT,DoubleToStr(Lots+MarketInfo(Symbol(),MODE_MINLOT),2));
}
if(Object_Name=="Panel_-")
{
Lots=MathMax(Lots-MarketInfo(Symbol(),MODE_MINLOT),MarketInfo(Symbol(),MODE_MINLOT));
ObjectSetString(0,"Panel_Lot",OBJPROP_TEXT,DoubleToStr(Lots,2));
}
وبذلك يكون الإكسبرت جاهز للتجربه و العملكود PHP:void CloseOrders(int type)
{
for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
bool select=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
int ticket=OrderTicket();
double lots=OrderLots();
int Otype=OrderType();
if(OrderSymbol()==Symbol()&&Otype==type)
{
if(Otype==OP_BUY)
{
bool close= OrderClose(ticket,lots,NormalizeDouble(Bid,Digits),3*P);
}
if(Otype==OP_SELL)
{
close= OrderClose(ticket,lots,NormalizeDouble(Ask,Digits),3*P);
}
if(Otype>OP_SELL)
{
OrderDelete(ticket);
}
}
}
}

مرفق الإكسبرتآخر تعديل بواسطة MR.dollar ، 16-04-2014 الساعة 02:02 AM
- 16-04-2014, 02:29 AM #2
رائع أستاذنا الغالي، سلمت يداك على الموضوع الأكثر من رائع
جزاك الله خيرا
- 16-04-2014, 02:44 AM #3
بارك الله تعالى فيك استاذى الكريم اسامه
- 16-04-2014, 03:42 AM #4
- 16-04-2014, 06:55 AM #5
أخي الفاضل المهندس أسامة أولا نشكرك على جهدك المستمر في العطاء ونشكرك على مواضيعك الرائعة فجزاك الله خير...
همسة:
لما لم تكمل الموضوع التعليمي الخاص بالبرمجة كنا جدا متحمسين؛ فهل هناك ما يمنعك من إكمال الموضوع؟
تقبل خالص شكري وتقديري
- 16-04-2014, 08:17 AM #6
بارك الله فيك ..
موضوع أكثر من رائع.
- 16-04-2014, 09:26 AM #7
- 16-04-2014, 12:22 PM #8
بسم الله ماشاء الله ، ابداع استاذي الفاضل أسامة ، كل يوم اتعلم منك جديد ، بارك الله لك في ماتحب ويرضاه .
- 16-04-2014, 07:12 PM #9
- 16-04-2014, 07:52 PM #10
كعادتك مبدع دائماً
- 16-04-2014, 09:29 PM #11
رائع .. بارك الله فيك
- 17-04-2014, 02:16 AM #12
شكرا أستاذنا العزيز
- 17-04-2014, 03:03 AM #13
بارك الله فيك أستاذ و زادك علما
- 17-04-2014, 02:15 PM #14
ممتاز استاذى
منتظر باقى الابداعات
تحياتى لك
- 17-04-2014, 05:36 PM #15
السلام عليكم استاذى الكريم
مستر دولار
جزاك الله خير
على كل ماتقدمه لنا
تحياتى لك وتقديرى لك
............
تم عمل الاكسبيرت بطريقة التلميذ
ارجو ان يكون تمام
شكرا لك استاذى
تحياتى لك
الأكثر زيارة
رد مع اقتباس