المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : أهم الدوال البرمجية وتطبيقات لغة mql4



kira-h
18-04-2017, 11:28 PM
السلام عليكم ورحمة الله وبركاته
سنخصص هذا الموضوع لأهم الدوال والتطبيقات بلغة الـ mql4 التي حتما سيحتاجها المبرمج
والله الموفق

kira-h
19-04-2017, 07:50 PM
أهم مكونات كود الاكسبيرت الضرورية مثل الدوال الرئيسية وقيمة النقطة والكومنت

أول جزء في الإكسبرت


//+------------------------------------------------------------------+
//| hassan.mb@hotmail.com |
//| Kira-h |
//+-------------------DO NOT REMOVE THIS HEADER----------------------+

وهو الجزء الخاص بحقوق الملكيه ويمكن حذفه ولن يؤثر على أداء الإكسبرت كما سنلاحظ أنه ذو لون باهت أي أنه عباره عن كومنت أو تعليق لذلك يسبق كل سطر علامه //



#property copyright "Copyright ©2017, Programmed by Kira-h"
#property link "hassan.mb@hotmail.com"
#property version "1.00"

ثم يأتي الجزء التابع له وهو أيضا الخاص بحقوق الملكيه وحذفه لن يؤثر على آداء الإكسبرت أيضا.

ثم يليه الجزء الخاص بالمتغيرات الخارجية للإكسبرت والتي ستظهر في خصائص الإكسبرت عن تفعيله على الشارت مثل الأستوب لوز أو الهدف
مثال :


input string var1="_______________Order Management";
input int MaxOrders=2;
input double Lots_2=0.02,
Takeprofit=0,
Stoploss=0,
HideTakeprofit=0,
HideStoploss=0,
USD_Profit=0,
USD_Loss=0;

ماذا تعني input
كما لاحظنا أن هذه الكلمة تتلون عند كتابتها في محرر الميتاإيديتور لذلك فهي من الكلمات المحجوزه وتستخدم لتعريف متغير خارجي ويتم كتابتها قبل نوع المتغير.

الجزء : الدالة OnInit


double point;
int Q,Lot_Decimal;

int OnInit()
{
Comment("Programmed by Kira-h\nhassan.mb@hotmail.com\nwww.forexprog.com\nCopyr ight ©2017\n");
if(MarketInfo(Symbol(),MODE_MINLOT)<0.1)Lot_Decimal=2;else Lot_Decimal=1;
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<4)point=0.01;else point=0.0001;
if(!IsExpertEnabled())Alert("Must Enable AutoTrading");
if(!IsTradeAllowed())Alert("Must Enable ALLOW LIVE TRADING");
return(INIT_SUCCEEDED);
}


هذه الداله يتم إستدعائها مرة واحد عند بداية العمل، وبهذا سنقوم فقط بوضع كومنت للحقوق البرمجية وتعريف قيمة النقطة والديجيت، وبرسالة نصية بوجوب تفعيل المتاجرة الآلية في حال عدم تفعيلها

الجزء : الدالة OnDeinit


void OnDeinit(const int reason)
{
Comment("");
}

ويتم إستدعائها مرة واحد عند نهاية العمل وحذفه من الشارت، نضيف شرط كومنت فارغ ليتم حذف كومنت الحقوق الذي وضعناه بالدالة OnInit

الجزء الخامس : الدالة الرئيسية OnTick


void OnTick()
{

}

يتم تنفيذ ما بداخل هذه الداله عند كل تحرك للسعر

kira-h
19-04-2017, 08:05 PM
دالة الأيام

المتغيرات الخارجية للايام ستكون من نوع منطقي bool حتى تكون اختيارية إما true او false كالتالي :


input string Var="_______________Day Filter";
input bool Sunday=true,
Monday=true,
Tuesday=true,
Wednesday=true,
Thursday=true,
Friday=true;


ثم الشروط عند بداية الدالة الرئيسية OnTick كالتالي :


void OnTick()
{
if((!Sunday&&DayOfWeek()==0)||(!Monday&&DayOfWeek()==1)||(!Tuesday&&DayOfWeek()==2)||
(!Wednesday&&DayOfWeek()==3)||(!Thursday&&DayOfWeek()==4)||(!Friday&&DayOfWeek()==5))return;
//-----
}

kira-h
19-04-2017, 08:13 PM
دالة التوقيت

المتغيرات الخارجية كالتالي :


input string Var="_______________Time Filter";
input bool EnableTimeFilter=false;
input string Start_Hour="00:00";
input string End_Hour="23:00";


دالة فرعية خارج الدوال الرئيسية للتوقيت كالتالي :


bool TimeFilter(string StartH,string EndH)
{
datetime Start=StrToTime(TimeToStr(TimeCurrent(),TIME_DATE) + " " + StartH);
datetime End=StrToTime(TimeToStr(TimeCurrent(),TIME_DATE) + " " + EndH);
if((Start<End&&(TimeCurrent()<Start||TimeCurrent()>End))
||(Start>End&&TimeCurrent()<Start&&TimeCurrent()>End))
{
return(false);
}
return(true);
}

ثم الشروط قبل دالة او شروط فتح الصفقات كالتالي:


void OnTick()
{
if(EnableTimeFilter&&TimeFilter(Start_Hour,End_Hour)==false)return;
//-----
}

kira-h
19-04-2017, 08:19 PM
دالة حساب عدد الصفقات حسب النوع أو بدونها

ستكون عبارة عن دالة فرعية خارج الدوال الرئيسية كالتالي :


int Orderscnt(int type=-1)
{
int cnt=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo)
{
if(OrderType()==type||type==-1)
{
cnt++;
}
}
}
}
return(cnt);
}


مثال لشرط عدم وجود أي صفقة مفعلة :


if(Orderscnt()==0)//نفذ الشرط


مثال لشرط عدم وجود صفقة شراء مفعلة :


if(Orderscnt(OP_BUY)==0)//نفذ الشرط

kira-h
19-04-2017, 09:07 PM
دالة تستخرج تفاصيل آخر صفقة مغلقة من ربح، نوع، سعر، هدف، وقف، زمن ... بدلالة شرط معين عبارة عن كومنت

ستكون عبارة عن دالة فرعية خارج الدوال الرئيسية كالتالي :


double LastOrder(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
pt=OrderProfit(),
tp=OrderTakeProfit(),
sl=OrderStopLoss();
datetime om=OrderOpenTime(),
cm=OrderCloseTime();

if(sy==Symbol()&&mn==MagicNo)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="TP")return(tp);
else if(info=="SL")return(sl);
else if(info=="OpenTime")return(om);
else if(info=="CloseTime")return(cm);
else if(info=="Comment")return(mm);
}
}
}
return(0);
}


مثال لمعرفة ربح آخر صفقة مغلقة كيفما كان نوعها كالتالي :

LastOrder("Profit")

مثال لمعرفة سعر آخر صفقة بيع مغلقة كالتالي :

LastOrder("OpenPrice",OP_SELL)

kira-h
19-04-2017, 09:16 PM
دالة تستخرج تفاصيل آخر صفقة مفعلة من ربح، نوع، سعر، هدف، وقف، زمن ... بدلالة شرط معين عبارة عن كومنت



double LastOrderCurrent(string info,int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
op=OrderOpenPrice(),
pt=OrderProfit(),
tp=OrderTakeProfit(),
sl=OrderStopLoss();
datetime om=OrderOpenTime();

if(sy==Symbol()&&mn==MagicNo)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="OpenPrice")return(op);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="TP")return(tp);
else if(info=="SL")return(sl);
else if(info=="OpenTime")return(om);
else if(info=="Comment")return(mm);
}
}
}
return(0);
}


مثال لمعرفة ربح آخر صفقة مفعلة كيفما كان نوعها كالتالي :

LastOrderCurrent("Profit")

مثال لمعرفة سعر آخر صفقة شراء مفعلة كالتالي :

LastOrderCurrent("OpenPrice",OP_BUY)

kira-h
19-04-2017, 09:21 PM
أشهر دوال إستدعاء المؤشرات المستخدمة في الميتاتريدر 4



iADX( string symbol, int timeframe, int period, int applied_price, int mode, int shift);
iATR( string symbol, int timeframe, int period, int shift);
iBands( string symbol, int timeframe, int period, int deviation, int bands_shift, int applied_price, int mode, int shift);
iCCI( string symbol, int timeframe, int period, int applied_price, int shift);
iDeMarker( string symbol, int timeframe, int period, int shift);
iForce( string symbol, int timeframe, int period, int ma_method, int applied_price, int shift);
iIchimoku( string symbol, int timeframe, int tenkan_sen, int kijun_sen, int senkou_span_b, int mode, int shift);
iMomentum( string symbol, int timeframe, int period, int applied_price, int shift);
iMA( string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift);
iOsMA( string symbol, int timeframe, int fast_ema_period, int slow_ema_period, int signal_period, int applied_price, int shift);
iMACD( string symbol, int timeframe, int fast_ema_period, int slow_ema_period, int signal_period, int applied_price, int mode, int shift);
iSAR( string symbol, int timeframe, double step, double maximum, int shift);
iRSI( string symbol, int timeframe, int period, int applied_price, int shift);
iStochastic( string symbol, int timeframe, int Kperiod, int Dperiod, int slowing, int method, int price_field, int mode, int shift);
iWPR( string symbol, int timeframe, int period, int shift);
iStdDev( string symbol, int timeframe, int ma_period, int ma_shift, int ma_method, int applied_price, int shift);


كما يمكنك عن طريق تظليل أي كلمة محجوزه ثم بالضغط على F1 سوف تظهر لك خصائص هذه الداله ومعنى الإعدادات الخاصه بها فعلى سبيل المثال مؤشر الموفينج عند التظليل عليه سوف تظهر لنا خصائصه كما في الصوره التاليه
http://www.fxprg.com/vb/attachment.php?attachmentid=112&stc=1&d=1492626395

kira-h
19-04-2017, 09:48 PM
دالة البيع



void SellOrder()
{
double TP=0,SL=0;
int tk=0;
if(Stoploss>0){SL=NormalizeDouble(Bid+Stoploss*point,Digits);}
if(Takeprofit>0){TP=NormalizeDouble(Bid-Takeprofit*point,Digits);}
tk=OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble (Bid,Digits),5*Q,SL,TP,"Kira-h",MagicNo,0,Red);
}



دالة الشراء



void BuyOrder()
{
double TP=0,SL=0;
int tk=0;
if(Stoploss>0){SL=NormalizeDouble(Ask-Stoploss*point,Digits);}
if(Takeprofit>0){TP=NormalizeDouble(Ask+Takeprofit*point,Digits) ;}
tk=OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble( Ask,Digits),5*Q,SL,TP,"Kira-h",MagicNo,0,Blue);
}

بحيث المتغيرات الخارجية كالتالي :


input double Lots=0.01,
Takeprofit=0,
Stoploss=0;
input int MagicNo=2017;

kira-h
19-04-2017, 09:53 PM
دالة "الموديفاي" لتعديل الهدف او الوقف

مثلا لتعديل أي صفقة بدون وقف او بدون هدف سنقوم بعمل الدالة التالية ونستدعيها بالدالة الرئيسية OnTick


void OrdersModify()
{
bool s,m;
double SL=0,TP=0;
for(int cnt=0;cnt<OrdersTotal();cnt++)
{
s=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
double op=OrderOpenPrice(),
sl=OrderStopLoss(),
tp=OrderTakeProfit();
int tk=OrderTicket(),
ty=OrderType(),
mn=OrderMagicNumber() ;

if(sy==Symbol()&&mn==MagicNo)
{
if(ty==OP_SELL)
{
if(Stoploss>0)SL=op+Stoploss*point;
if(Takeprofit>0)TP=op-Takeprofit*point;
if((NormalizeDouble(sl,Digits)!=NormalizeDouble(SL ,Digits))||(NormalizeDouble(tp,Digits)!=NormalizeD ouble(TP,Digits)))
{
m=OrderModify(tk,op,SL,TP,0,Red);
}
}
if(ty==OP_BUY)
{
if(Stoploss>0)SL=op-Stoploss*point;
if(Takeprofit>0)TP=op+Takeprofit*point;
if((NormalizeDouble(sl,Digits)!=NormalizeDouble(SL ,Digits))||(NormalizeDouble(tp,Digits)!=NormalizeD ouble(TP,Digits)))
{
m=OrderModify(tk,op,SL,TP,0,Blue);
}
}
}
}
}




void OnTick()
{
OrdersModify();
}

kira-h
19-04-2017, 09:59 PM
دالة الهدف المخفي


void CloseOrdersHiddenTP()
{
bool close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int tk=OrderTicket(),
ot=OrderType(),
mn=OrderMagicNumber();
double op=OrderOpenPrice(),
lo=OrderLots();

if(sy==Symbol()&&mn==MagicNo)
{
if(ot==OP_BUY)
{
if(Bid>=op+HideTakeprofit*point)
{
close=OrderClose(tk,lo,NormalizeDouble(Bid,Digits) ,5*Q);
}
}
if(ot==OP_SELL)
{
if(Ask<=op-HideTakeprofit*point)
{
close=OrderClose(tk,lo,NormalizeDouble(Ask,Digits) ,5*Q);
}
}
}
}
}


دالة الوقف المخفي


void CloseOrdersHiddenSL()
{
bool close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int tk=OrderTicket(),
ot=OrderType(),
mn=OrderMagicNumber();
double op=OrderOpenPrice(),
lo=OrderLots();

if(sy==Symbol()&&mn==MagicNo)
{
if(ot==OP_BUY)
{
if(Bid<=op-HideStoploss*point)
{
close=OrderClose(tk,lo,NormalizeDouble(Bid,Digits) ,5*Q);
}
}
if(ot==OP_SELL)
{
if(Ask>=op+HideStoploss*point)
{
close=OrderClose(tk,lo,NormalizeDouble(Ask,Digits) ,5*Q);
}
}
}
}
}


ثم نقوم باستدعائهما بالدالة الرئيسية OnTick كالتالي :


void OnTick()
{
if(HideTakeprofit>0)CloseOrdersHiddenTP();
if(HideStoploss>0)CloseOrdersHiddenSL();
//-----
}

بحيث المتغيرات الخارجية كالتالي :


input double HideTakeprofit=0,
HideStoploss=0;

kira-h
20-04-2017, 07:40 PM
دالة إغلاق الصفقات بدلالة النوع أو بدونها



void CloseOrders(int type=-1)
{
bool select,clos;
if(_Digits==5||_Digits==3)int Q=10;else Q=1;
for(int i=OrdersTotal()-1; i>=0; i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int tt=OrdersTotal(),
tk=OrderTicket(),
ty=OrderType(),
mn=OrderMagicNumber();
double lo=OrderLots();
if(tt>0&&sy==Symbol()&&mn==MagicNo)
{
if(ty==type||type==-1)
{
if(ty==OP_BUY)
clos=OrderClose(tk,lo,Bid,5*Q);
if(ty==OP_SELL)
clos=OrderClose(tk,lo,Ask,5*Q);
if(ty>OP_SELL)
clos=OrderDelete(tk,Red);
}
}
}
}

kira-h
20-04-2017, 07:42 PM
دالة إغلاق الصفقة عند إغلاق شمعة جديدة



void CloseAtNextBar()
{
if(Time[0]!=Time[1])
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo)
{
if(OrderType()<=OP_SELL)
{
if(OrderOpenTime()<Time[0])
{
bool close=OrderClose(OrderTicket(),OrderLots(),OrderOp enPrice(),5*Q,Red);
}
}
}
}
}
}

kira-h
20-04-2017, 07:44 PM
دالة الاغلاق "بواسطة" CloseBy



void CloseBy()
{
int t1=0,t2=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo)
{
if(OrderType()==OP_BUY&&t1==0)
{
t1=OrderTicket();
}
if(OrderType()==OP_SELL&&t2==0)
{
t2=OrderTicket();
}
}
}
if(t1>0&&t2>0)
{
bool r=OrderCloseBy(t1,t2);
}
}
}

kira-h
20-04-2017, 07:55 PM
دالة إدارة المال التناسبية

نقوم بعمل المتغيرات الخارجية التالية :


input double Lots=0.01,
RiskPercent=1;


نقوم بعمل دالة فرعية لادارة المال التناسبية كالتالي :


double LotManage()
{
double lot=MathFloor(AccountBalance()*RiskPercent/1000)/100;
if(lot<MarketInfo(Symbol(),MODE_MINLOT))lot=MarketInfo(Sy mbol(),MODE_MINLOT);
if(lot>MarketInfo(Symbol(),MODE_MAXLOT))lot=MarketInfo(Sy mbol(),MODE_MAXLOT);
return(NormalizeDouble(lot,Lot_Decimal));
}

ثم نقوم بتعريف عدد الأعشار التي تقبلها المنصة بحجم العقود كالتالي :


int Lot_Decimal;

int OnInit()
{
if(MarketInfo(Symbol(),MODE_MINLOT)<0.1)Lot_Decimal=2;else Lot_Decimal=1;
return(INIT_SUCCEEDED);
}


ثم نقوم بإضافة شروط إدارة المال التناسبية بدالتي الشراء والبيع كالتالي :


void BuyOrder()
{
double NewLots,TP,SL;
if(RiskPercent>0))NewLots=NormalizeDouble(LotManage(),Lot_Decimal );
else NewLots=Lots;
if(Stoploss!=0){SL=Ask-Stoploss*point;}else SL=0;
if(Takeprofit!=0){TP=Ask+Takeprofit*point;}else TP=0;
tk=OrderSend(Symbol(),OP_BUY,NewLots,NormalizeDoub le(Ask,Digits),5*Q,SL,TP,"Kira-h",MagicNo,0,Blue);
}

void SellOrder()
{
double NewLots,TP,SL;
if(RiskPercent>0))NewLots=NormalizeDouble(LotManage(),Lot_Decimal );
else NewLots=Lots;
if(Stoploss!=0){SL=Bid+Stoploss*point;}else SL=0;
if(Takeprofit!=0){TP=Bid-Takeprofit*point;}else TP=0;
tk=OrderSend(Symbol(),OP_SELL,NewLots,NormalizeDou ble(Bid,Digits),5*Q,SL,TP,"Kira-h",MagicNo,0,Red);
}

kira-h
20-04-2017, 08:04 PM
دالة مضاعفات الضرب

نقوم بعمل المتغيرات الخارجية التالية :


input double Lots=0.01,
Multiply=2,
MaxLots=5;


نقوم بعمل دالة فرعية لمعرفة تفاصيل آخر صفقة مغلقة كالتالي :


double Current(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
op=OrderOpenPrice(),
pt=OrderProfit(),
tp=OrderTakeProfit(),
sl=OrderStopLoss();

if(sy==Symbol()&&mn==MagicNo)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="OpenPrice")return(op);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="TP")return(tp);
else if(info=="SL")return(sl);
}
}
}
return(0);
}


ثم نقوم بإضافة شروط مضاعفات الضرب بدالتي الشراء والبيع كالتالي :


void SellOrder()
{
double NewLots=Lots,TP=0,SL=0;
int tk=0;
if(Multiply>0&&Current("Profit")<0)
{
NewLots=MathMin(NormalizeDouble(Current("Lots")*Multiply,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
if(Stoploss>0)SL=NormalizeDouble(Bid+Stoploss*point,Digits);
if(Takeprofit>0)TP=NormalizeDouble(Bid-Takeprofit*point,Digits);
tk=OrderSend(Symbol(),OP_SELL,NewLots,NormalizeDou ble(Bid,Digits),5*Q,SL,TP,"Kira-h",MagicNo,0,Red);
}

void BuyOrder()
{
double NewLots=Lots,TP=0,SL=0;
int tk=0;
if(Multiply>0&&Current("Profit")<0)
{
NewLots=MathMin(NormalizeDouble(Current("Lots")*Multiply,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
if(Stoploss>0)SL=NormalizeDouble(Ask-Stoploss*point,Digits);
if(Takeprofit>0)TP=NormalizeDouble(Ask+Takeprofit*point,Digits);
tk=OrderSend(Symbol(),OP_BUY,NewLots,NormalizeDoub le(Ask,Digits),5*Q,SL,TP,"Kira-h",MagicNo,0,Blue);
}

kira-h
20-04-2017, 08:08 PM
دالة مضاعفات الجمع

نقوم بعمل المتغيرات الخارجية التالية :


input double Lots=0.01,
Increase=0.01,
MaxLots=5;


نقوم بعمل دالة فرعية لمعرفة تفاصيل آخر صفقة مغلقة كالتالي :


double Current(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
op=OrderOpenPrice(),
pt=OrderProfit(),
tp=OrderTakeProfit(),
sl=OrderStopLoss();

if(sy==Symbol()&&mn==MagicNo)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="OpenPrice")return(op);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="TP")return(tp);
else if(info=="SL")return(sl);
}
}
}
return(0);
}


ثم نقوم بإضافة شروط مضاعفات الجمع بدالتي الشراء والبيع كالتالي :


void SellOrder()
{
double NewLots=Lots,TP=0,SL=0;
int tk=0;
if(Increase>0&&Current("Profit")<0)
{
NewLots=Current("Lots")+Increase;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
if(Stoploss>0)SL=NormalizeDouble(Bid+Stoploss*point,Digits);
if(Takeprofit>0)TP=NormalizeDouble(Bid-Takeprofit*point,Digits);
tk=OrderSend(Symbol(),OP_SELL,NewLots,NormalizeDou ble(Bid,Digits),5*Q,SL,TP,"Kira-h",MagicNo,0,Red);
}

void BuyOrder()
{
double NewLots=Lots,TP=0,SL=0;
int tk=0;
if(Increase>0&&Current("Profit")<0)
{
NewLots=Current("Lots")+Increase;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
if(Stoploss>0)SL=NormalizeDouble(Ask-Stoploss*point,Digits);
if(Takeprofit>0)TP=NormalizeDouble(Ask+Takeprofit*point,Digits);
tk=OrderSend(Symbol(),OP_BUY,NewLots,NormalizeDoub le(Ask,Digits),5*Q,SL,TP,"Kira-h",MagicNo,0,Blue);
}

kira-h
20-04-2017, 08:29 PM
دالة مضاعفات الفيبو
نقوم بعمل المتغيرات الخارجية التالية :


input double Lots=0.01;
input bool FiboLots=true;
input double MaxLots=5;

نقوم بعمل دالة فرعية لمضاعفات الفيبو كالتالي :


double FiboLotsManage(int q)
{
int d;
for(int i=OrdersTotal();i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
double L=OrderLots();
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo)
{
d++;
if(d==q)return(L);
}
}
}


نقوم بعمل دالة فرعية لمعرفة تفاصيل آخر صفقة مغلقة كالتالي :


double Current(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
op=OrderOpenPrice(),
pt=OrderProfit(),
tp=OrderTakeProfit(),
sl=OrderStopLoss();

if(sy==Symbol()&&mn==MagicNo)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="OpenPrice")return(op);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="TP")return(tp);
else if(info=="SL")return(sl);
}
}
}
return(0);
}


ثم نقوم بإضافة شروط مضاعفات الفيبو بدالتي الشراء والبيع كالتالي :


void SellOrder()
{
double NewLots=Lots,TP=0,SL=0;
int tk=0;
if(FiboLots&&Current("Profit")<0)
{
NewLots=FiboLotsManage(1)+FiboLotsManage(2);
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
if(Stoploss>0)SL=NormalizeDouble(Bid+Stoploss*point,Digits);
if(Takeprofit>0)TP=NormalizeDouble(Bid-Takeprofit*point,Digits);
tk=OrderSend(Symbol(),OP_SELL,NewLots,NormalizeDou ble(Bid,Digits),5*Q,SL,TP,"Kira-h",MagicNo,0,Red);
}

void BuyOrder()
{
double NewLots=Lots,TP=0,SL=0;
int tk=0;
if(FiboLots&&Current("Profit")<0)
{
NewLots=FiboLotsManage(1)+FiboLotsManage(2);
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
if(Stoploss>0)SL=NormalizeDouble(Ask-Stoploss*point,Digits);
if(Takeprofit>0)TP=NormalizeDouble(Ask+Takeprofit*point,Digits);
tk=OrderSend(Symbol(),OP_BUY,NewLots,NormalizeDoub le(Ask,Digits),5*Q,SL,TP,"Kira-h",MagicNo,0,Blue);
}

kira-h
20-04-2017, 09:03 PM
دالة مضاعفات اختيارية بناء على المصفوفة

نقوم بعمل المتغيرات الخارجية كالتالي :


input double Lots =0.05,
Lots_1=0.1,
Lots_2=0.14,
Lots_3=0.18,
Lots_4=0.22,
Lots_5=0.26,
Lots_6=0.33,
Lots_7=0.44,
Lots_8=0.58,
Lots_9=0.78,
Lots_10=1.04,
Lots_11=1.38,
Lots_12=1.45,
Lots_13=1.53,
Lots_14=1.64,
Lots_15=1.78,
Lots_16=2.04,
Lots_17=2.38,
Lots_18=2.45,
Lots_19=2.53,
Lots_20=2.64;


ثم تعريف المصفوفة خارج الدوال كالتالي :


double chain[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, 20};


ثم دالة فرعية لمعرفة كومنت آخر صفقة مغلقة وتحويله إلى عدد صحيح int كالتالي :


int LEVEL()
{
int c;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
comment=OrderComment();
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo)
{
StringReplace(comment,"[sl]","");
c=StrToInteger(comment);
return(c);
}
}
return(c);
}


ثم الشروط بدالتي البيع والشراء كالتالي :


void SellOrder()
{
chain[1]=Lots_1;
chain[2]=Lots_2;
chain[3]=Lots_3;
chain[4]=Lots_4;
chain[5]=Lots_5;
chain[6]=Lots_6;
chain[7]=Lots_7;
chain[8]=Lots_8;
chain[9]=Lots_9;
chain[10]=Lots_10;
chain[11]=Lots_11;
chain[12]=Lots_12;
chain[13]=Lots_13;
chain[14]=Lots_14;
chain[15]=Lots_15;
chain[16]=Lots_16;
chain[17]=Lots_17;
chain[18]=Lots_18;
chain[19]=Lots_19;
chain[20]=Lots_20;
double NewLots,TP,SL;
string comment;

if(LastOrder("Profit")<0)
{
NewLots=chain[LEVEL()+1];
comment=DoubleToStr(LEVEL()+1,0);
}
if(LastOrder("Profit")>=0){NewLots=Lots;comment="0";}
if(Stoploss!=0){SL=Bid+Stoploss*point;}else SL=0;
if(Takeprofit!=0){TP=Bid-Takeprofit*point;}else TP=0;
tk=OrderSend(Symbol(),OP_SELL,NewLots,NormalizeDou ble(Bid,Digits),5*Q,SL,TP,comment,MagicNo,0,Red);
}

void BuyOrder()
{
chain[1]=Lots_1;
chain[2]=Lots_2;
chain[3]=Lots_3;
chain[4]=Lots_4;
chain[5]=Lots_5;
chain[6]=Lots_6;
chain[7]=Lots_7;
chain[8]=Lots_8;
chain[9]=Lots_9;
chain[10]=Lots_10;
chain[11]=Lots_11;
chain[12]=Lots_12;
chain[13]=Lots_13;
chain[14]=Lots_14;
chain[15]=Lots_15;
chain[16]=Lots_16;
chain[17]=Lots_17;
chain[18]=Lots_18;
chain[19]=Lots_19;
chain[20]=Lots_20;
double NewLots,TP,SL;
string comment;

if(LastOrder("Profit")<0)
{
NewLots=chain[LEVEL()+1];
comment=DoubleToStr(LEVEL()+1,0);
}
if(LastOrder("Profit")>=0){NewLots=Lots;comment="0";}
if(Stoploss!=0){SL=Ask-Stoploss*point;}else SL=0;
if(Takeprofit!=0){TP=Ask+Takeprofit*point;}else TP=0;
tk=OrderSend(Symbol(),OP_BUY,NewLots,NormalizeDoub le(Ask,Digits),5*Q,SL,TP,comment,MagicNo,0,Blue);
}

kira-h
20-04-2017, 09:12 PM
دالة التريلينغ

المتغيرات الخارجية كالتالي :


input double TrailingStop=0,
TrailingStep=0;


ثم دالة التريلينغ خارج الدوال الرئيسية كالتالي :


void MoveTrailingStop()
{
bool s,mod;
for(int cnt=0;cnt<OrdersTotal();cnt++)
{
s=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int tk=OrderTicket(),
ot=OrderType(),
mn=OrderMagicNumber();
double op=OrderOpenPrice(),
sl=OrderStopLoss(),
tp=OrderTakeProfit();
if(sy==Symbol()&&mn==MagicNo&&ot<=OP_SELL)
{
if(ot==OP_BUY)
{
if(TrailingStop>0&&NormalizeDouble(Ask-(TrailingStep*point),Digits)>NormalizeDouble((op+(TrailingStop*point)),Digits))
{
if((NormalizeDouble(sl,Digits)<NormalizeDouble(Bid-(TrailingStop*point),Digits))||(sl==0))
{
mod=OrderModify(tk,op,NormalizeDouble(Bid-(TrailingStop*point),Digits),tp,0,Blue);
}
}
}
else
{
if(TrailingStop>0&&NormalizeDouble(Bid+(TrailingStep*point),Digits)<NormalizeDouble((op-(TrailingStop*point)),Digits))
{
if((NormalizeDouble(sl,Digits)>(NormalizeDouble(Ask+(TrailingStop*point),Digits)) )||(sl==0))
{
mod=OrderModify(tk,op,NormalizeDouble(Ask+(Trailin gStop*point),Digits),tp,0,Red);
}
}
}
}
}
}


ثم الشروط بالدالة الرئيسية OnTick كالتالي :


void OnTick()
{
if(TrailingStop>0)MoveTrailingStop();
}



إذا كان مثلا TrailingStop=20 فبعد ربح 20 نقطه يتم نقل الوقف إلى نقطه الدخول ثم كل ربح نقطه يتم رفع الوقف بمقدار +1

الان مثلا عملت 20=TrailingStop و 10=TrailingStep فبعد ربح 30 نقطة (اجمالي 20+10) سيضع الإكسبريت الوقف بعد نقطة الدخول ب 10 نقاط و سيطارد السعر بفارق 20 نقطة

kira-h
20-04-2017, 09:14 PM
دالة البريك ايفن

المتغيرات الخارجية كالتالي :


input double BreakEven=0,
BreakEvenPips=0;


ثم دالة البريك ايفن خارج الدوال الرئيسية كالتالي :


void MoveBreakEven()
{
bool s,mod;
for(int cnt=0;cnt<OrdersTotal();cnt++)
{
s=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int tk=OrderTicket(),
ot=OrderType(),
mn=OrderMagicNumber();
double op=OrderOpenPrice(),
sl=OrderStopLoss(),
tp=OrderTakeProfit();

if(sy==Symbol()&&mn==MagicNo&&ot<=OP_SELL)
{
if(ot==OP_BUY)
{
if(BreakEven>0)
{
if(NormalizeDouble((Bid-op),Digits)>BreakEven*point)
{
if((NormalizeDouble((sl-op),Digits)<0)||(sl==0))
{
mod=OrderModify(tk,op,NormalizeDouble(op+BreakEven Pips*point,Digits),tp,0,Blue);
}
}
}
}
else
{
if(BreakEven>0)
{
if(NormalizeDouble((op-Ask),Digits)>BreakEven*point)
{
if((NormalizeDouble((op-sl),Digits)<0)||(sl==0))
{
mod=OrderModify(tk,op,NormalizeDouble(op-BreakEvenPips*point,Digits),tp,0,Red);
}
}
}
}
}
}
}



ثم الشروط بالدالة الرئيسية OnTick كالتالي :


void OnTick()
{
if(BreakEven>0)MoveBreakEven();
}



مثلا إذا كنت تريد نقل الوقف إلى نقطة الدخول بعد ربح 10 نقاط سوف تجعل BreakEven=10 و BreakEvenPips=0

الان تريد بعد ربح 10 نقاط نقل الوقف ليس إلى نقطة الدخول لكن إلى ربح نقطتين مثلا في هذه الحاله سوف تجعل BreakEven=10 و BreakEvenPips=2
أي أن المتغير BreakEvenPips هو عدد نقاط الربح التي يتم نقل الوقف عندها

kira-h
20-04-2017, 09:25 PM
دالة الربح الاجمالي بالدولار

المتغيرات الخاجية كالتالي:


input double USD_Profit=0,
USD_Loss=0;


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


double Profit_By_USD(int type=-1)
{
double pts=0;
for(int i=0;i<OrdersTotal();i++)
{
bool s=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int mn=OrderMagicNumber(),
ot=OrderType();
double pt=OrderProfit(),
sw=OrderSwap(),
cm=OrderCommission();
if(sy==Symbol()&&mn==MagicNo)
{
if(ot==type||type==-1)
{
pts+=pt+sw+cm;
}
}
}
return(pts);
}


ثم الشروط بالدالة الرئيسية OnTick كالتالي :


void OnTick()
{
if((USD_Profit>0&&Profit_By_USD()>=USD_Profit)
||(USD_Loss>0&&Profit_By_USD()<=-USD_Loss)){CloseOrders();}
}


و دالة الاغلاق كالتالي :


void CloseOrders(int type=-1)
{
bool select,clos;
if(_Digits==5||_Digits==3)int Q=10;else Q=1;
for(int i=OrdersTotal()-1; i>=0; i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int tt=OrdersTotal(),
tk=OrderTicket(),
ty=OrderType(),
mn=OrderMagicNumber();
double lo=OrderLots();
if(tt>0&&sy==Symbol()&&mn==MagicNo)
{
if(ty==type||type==-1)
{
if(ty==OP_BUY)
clos=OrderClose(tk,lo,Bid,5*Q);
if(ty==OP_SELL)
clos=OrderClose(tk,lo,Ask,5*Q);
if(ty>OP_SELL)
clos=OrderDelete(tk,Red);
}
}
}
}

kira-h
20-04-2017, 09:29 PM
دالة الربح الاجمالي بالنقاط

المتغيرات الخاجية كالتالي:


input double PIPS_Profit=0,
PIPS_Loss=0;


دالة فرعية لحساب إجمالي الربح بالنقاط بالصفقات المفعلة كالتالي :


double Profit_By_PIPS()
{
double pips,pipsB,pipsS;
for(int i=0;i<OrdersTotal();i++)
{
bool c=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int mn=OrderMagicNumber(),
ot=OrderType();
double op=OrderOpenPrice();

if(sy==Symbol()&&mn==MagicNo)
{
if(ot==OP_BUY){pipsB+=(Bid-op)/point;}
else if(ot==OP_SELL){pipsS+=(op-Ask)/point;}
pips=pipsB+pipsS;
}
}
return(pips);
}

ثم الشروط بالدالة الرئيسية OnTick كالتالي :


void OnTick()
{
if((PIPS_Profit!=0&&Profit_By_PIPS()>=PIPS_Profit)
||(PIPS_Loss!=0&&Profit_By_PIPS()<=-PIPS_Loss)){CloseOrders();}
}

و دالة الاغلاق كالتالي :


void CloseOrders(int type=-1)
{
bool select,clos;
if(_Digits==5||_Digits==3)int Q=10;else Q=1;
for(int i=OrdersTotal()-1; i>=0; i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int tt=OrdersTotal(),
tk=OrderTicket(),
ty=OrderType(),
mn=OrderMagicNumber();
double lo=OrderLots();
if(tt>0&&sy==Symbol()&&mn==MagicNo)
{
if(ty==type||type==-1)
{
if(ty==OP_BUY)
clos=OrderClose(tk,lo,Bid,5*Q);
if(ty==OP_SELL)
clos=OrderClose(tk,lo,Ask,5*Q);
if(ty>OP_SELL)
clos=OrderDelete(tk,Red);
}
}
}
}

kira-h
20-04-2017, 09:35 PM
معلومات الحساب

نقوم بعمل دالة فرعية لمعلومات الحساب بالكومنت كالتالي :


void PrintInfoToChart()
{
string temp="Coded by Kira-h\nhassan.mb@hotmail.com\nwww.forexprog.com/\nCopyright ©2017\n"
+ "------------------------------------------------\n"
+ "ACCOUNT INFORMATION:\n"
+ "------------------------------------------------\n"
+ "Company: " + AccountCompany()+ "\n"
+ "Account Currency: " + AccountCurrency()+ "\n"
+ "Free Margin: " + DoubleToStr(AccountFreeMargin(), 2)+ "\n"
+ "Used Margin: " + DoubleToStr(AccountMargin(), 2)+ "\n"
+ "Equity: " + DoubleToStr(AccountEquity(), 2)+ "\n"
+ "Balance: " + DoubleToStr(AccountBalance(), 2)+ "\n"
+ "Leverage: " + DoubleToStr(AccountLeverage(), 2)+ "\n"
+"------------------------------------------------\n";
Comment(temp);
}


ثم الشروط بالدالة الرئيسية OnTick كالتالي :


void OnTick()
{
PrintInfoToChart();
}

kira-h
20-04-2017, 09:37 PM
السلام عليكم
OnChartEvent أحد الدوال التي تم إضافتها بالتحديث الجديد للغة MQL4 لرسم أزرار على الشارت، تمكنك من التنفيذ بضغطة زر مثل تنفيذ البيع او الشراء او الاغلاق...
تعريفها لغويا كالتالي:


void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{

}


بحيث :
id تحفظ نوع الحدث الذي تم ( تحرك الماوس - ضغط على الشارت - تحريك كائن - ضغط على زر في الكيبورد ... )
وأنواعها :

CHARTEVENT_KEYDOWN
للضغط على زر على الكيبورد


CHARTEVENT_MOUSE_MOVE
تحرك الماوس على الشارت


CHARTEVENT_OBJECT_CREATE
رسم كائن جديد على الشارت


CHARTEVENT_OBJECT_CHANGE
تغيير قيم كائن


CHARTEVENT_OBJECT_DELETE
حذف كائن


CHARTEVENT_CLICK
كليك على الشارت


CHARTEVENT_OBJECT_CLICK
إضافة كائن على الشارت


CHARTEVENT_OBJECT_ENDEDIT
الإنتهاء من تعديل نص في الكائن


CHARTEVENT_CHART_CHANGE
تعديل قيم الشارت


CHARTEVENT_CUSTOM+N
عمل كائن فرعي محدد


المتغيرات الثلاث الأخرى تحفظ قيمة معينه حسب نوع الحدث
فمثلا بالنسبه للحدث CHARTEVENT_OBJECT_CREATE
sparam تحفظ إسم الكائن الذي تم رسمه

مثلا CHARTEVENT_OBJECT_CLICK

lparam تحفظ قيمة الإحداثي الأفقي
dparam تحفظ قيمة الإحداثي الراسي
sparam تحفظ إسم الكائن الذي تم الضغط عليه

مثال لعمل اكسبيرت يقوم برسم أزرار على الشارت البيع، الشراء والاغلاق...

دالة لرسم الأزرار على الشارت كالتالي:


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,XDistanc e);
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,YDistanc e);
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_Corne r);
ObjectSetInteger(0,name,OBJPROP_COLOR,TextColor);
ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,board erColor);
ObjectSetInteger(0,name,OBJPROP_BGCOLOR,Color_);
if(Type==OBJ_EDIT)ObjectSetInteger(0,name,OBJPROP_ ALIGN,ALIGN_CENTER);
}


ثم بداخل الدالة OnInit نكتب الدوال التالية:


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);


الآن نعود مرة أخرى للداله OnChartEvent
في البداية نقوم بإضافة شرط لمعرفة إذا ما تم الضغط على أي زر على الشارت بإستدعاء إسمه


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
}

}

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



double Lots=StringToDouble(ObjectDescription("Panel_Lot")); StopLoss=StringToDouble(ObjectDescription("Panel_SL_text")); TakeProfit=StringToDouble(ObjectDescription("Panel_TP_text"));


أيضا سنضيف كود آخر بحيث بعد الضغط على الأزار تعود إلى طبيعتها مره أخرى

ObjectSetInteger(0,Object_Name,OBJPROP_SELECTED,fa lse); ObjectSetInteger(0,Object_Name,OBJPROP_STATE,false );

وسيكون الكود في النهاية بشكل كامل :


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,NormalizeDou ble(Ask,Digits),3*P,SL,TP,"Panel EA",0,0,Blue);
ObjectSetInteger(0,Object_Name,OBJPROP_SELECTED,fa lse);
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,NormalizeDo uble(Bid,Digits),3*P,SL,TP,"Panel EA",0,0,Blue);
ObjectSetInteger(0,Object_Name,OBJPROP_SELECTED,fa lse);
ObjectSetInteger(0,Object_Name,OBJPROP_STATE,false );
}
if(Object_Name=="Panel_CloseAll")
{
CloseOrders(OP_BUY);
CloseOrders(OP_SELL);
ObjectSetInteger(0,Object_Name,OBJPROP_SELECTED,fa lse);
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,fa lse);
ObjectSetInteger(0,Object_Name,OBJPROP_STATE,false );
}
}


بقي الآن أن نضيف كود لزيادة أو تقليل حجم اللوت عندما يتم الضغط على زر + أو -


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));
}


ولا ننسى الجزء البسيط وهو دالة إغلاق الصفقات


void CloseOrders(int type=-1)
{
bool select,clos;
if(_Digits==5||_Digits==3)int Q=10;else Q=1;
for(int i=OrdersTotal()-1; i>=0; i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int tt=OrdersTotal(),
tk=OrderTicket(),
ty=OrderType(),
mn=OrderMagicNumber();
double lo=OrderLots();
if(tt>0&&sy==Symbol()&&mn==MagicNo)
{
if(ty==type||type==-1)
{
if(ty==OP_BUY)
clos=OrderClose(tk,lo,Bid,5*Q);
if(ty==OP_SELL)
clos=OrderClose(tk,lo,Ask,5*Q);
if(ty>OP_SELL)
clos=OrderDelete(tk,Red);
}
}
}
}


وبذلك يكون الإكسبرت جاهز للتجربه و العمل
839
مرفق الإكسبرت
(منقول)
//----
وللمزيد من الملعومات راجع الصفحة التالي:
OnChartEvent (https://docs.mql4.com/basis/function/events)

kira-h
20-04-2017, 09:38 PM
لعمل قائمة منسدلة ستستخدم متغير من نوع enum والتي يكون مكانها قبل المتغيرات الخارجية

نستخدم enum ثم كتابة إسم المتغير الذي نريده وبداخل الأقواس نضع أسماء القيم التي نريدها وبينها فاصل وفي نهاية الكود نضع ;
مثال :


#property link ""

enum typ
{
BUY=0,
SELL=1,
BUY_SELL=2,
};

input typ Order_Type=BUY_SELL;


مثال لشرط فتح صفقة شراء فقط :

if(Order_Type==BUY||Order_Type==BUY_SELL)//open buy...

او تختصرها بدلالة قيم المتغيرات كالتالي:

if(Order_Type==0||Order_Type==2)//open buy...

مثال لشرط فتح صفقة بيع فقط :

if(Order_Type>=SELL)//open sell...

او تختصرها بدلالة قيم المتغيرات كالتالي:

if(Order_Type>=1)//open sell...

kira-h
21-08-2017, 05:39 PM
مثال تطبيقي لعمل مؤشر اسهم وتنبيه لتقاطع موفينجين
المؤشر بالمرفقات مع شرح كل أجزائه


// هذه العلامة للتعليقات ولا يقرأها البرنامج //

//حقوق المبرمج كتعليق
//+------------------------------------------------------------------+
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+

//حقوق المبرمج الرسمية
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.forexprog.com"
#property version "1.00"

#property indicator_chart_window//الاشارات ستكون في نافذة الشارت
//ويوجد كذلك
//#property indicator_separate_window//الاشارات ستكون بنافذة منفصلة مثل الماكد

#property indicator_buffers 2//عدد الاشارات
#property indicator_color1 Lime//لون الاشارة الأولى
#property indicator_color2 Red//لون الاشارة الثانية
#property indicator_width1 1//حجم الاشارة الأولى
#property indicator_width2 1//حجم الاشارة الثانية

//المتغيرات الخارجية
extern int BarsBack=200;
extern double Distance=5;
extern bool AlertON=true;

extern string var1="_______Slow MA";//إعدادات الموفينج البطيء
extern int period_1=20;
extern double shift_1=0;
extern ENUM_MA_METHOD method_1=1;
extern ENUM_APPLIED_PRICE AppliedPrice_1=0;

extern string var2="_______Fast MA";//إعدادات الموفينج السريع
extern int period_2=10;
extern double shift_2=0;
extern ENUM_MA_METHOD method_2=1;
extern ENUM_APPLIED_PRICE AppliedPrice_2=0;

//المتغيرات الداخلية
double CrossUp[];//المصفوفة المسؤولة عن رسم الاشارة 1
double CrossDown[];//المصفوفة المسؤولة عن رسم الاشارة 2
double val1[],val2[];//مصفوفة خاصة بشروط عدد الشموع
datetime Time0;//متغير زمني
double point;//متغير عشري

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()//هذه الدالة تعمل مرة واحدة بمجرد التفعيل
{
Comment("Programmed by Kira-h");//تفعيل كومنت على الشارت
//----
if(_Digits<4)point=0.01;else point=0.0001;//شروط قيمة النقطة حسب عدد الأرقام بعد الفاصلة
//----
//---- العد للاشارات يبدأ من الصفر
//----
SetIndexBuffer(0,CrossUp);//قيمة الاشارة0
SetIndexStyle(0,DRAW_ARROW);//نوع الاشارة0
SetIndexArrow(0,233);//شكل الاشارة0
SetIndexEmptyValue(0,1.0);//رمز الاشارة0
SetIndexLabel(0,"UP");//اسم الاشارة0

//نفس الشيء بالاشارة 1
SetIndexBuffer(1,CrossDown);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,234);
SetIndexEmptyValue(1,1.0);
SetIndexLabel(1,"DN");
//----
return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()//هذه الدالة تعمل مرة واحدة بمجرد الغاء المؤشر
{
Comment("");//إلغاء الكومنت الذيعلى الشارت
return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
//هذه السطور البرمجية عامة وهي لرصد عدد الشموع الموجودة بالشارت
//--------------------------------------------------------
if(BarsBack>=Bars)BarsBack=Bars;
SetIndexDrawBegin(0,Bars-BarsBack);
SetIndexDrawBegin(1,Bars-BarsBack);
int i,j,counted_bars=IndicatorCounted();
//---- check for possible errors
if(counted_bars<0)return(-1);
//---- initial zero
if(counted_bars<1)
{
for(j=1;j<=BarsBack;j++)val1[BarsBack-j]=0.0;
for(j=1;j<=BarsBack;j++)val2[BarsBack-j]=0.0;
}
//--------------------------------------------------------

for(i=BarsBack-1;i>0;i--)//معالجة شروط الاشارات ضمن مجال شموع محدد
{
double SlowMa1=iMA(Symbol(),0,period_1,shift_1,method_1,A ppliedPrice_1,i),//قيمة الموفينج البطئ عند الشمعة 1
SlowMa2=iMA(Symbol(),0,period_1,shift_1,method_1,A ppliedPrice_1,i+1),//قيمة الموفينج البطئ عند الشمعة 2
FastMa1=iMA(Symbol(),0,period_2,shift_2,method_2,A ppliedPrice_2,i),//قيمة الموفينج السريع عند الشمعة 1
FastMa2=iMA(Symbol(),0,period_2,shift_2,method_2,A ppliedPrice_2,i+1);//قيمة الموفينج السريع عند الشمعة 2


CrossUp[i]=0; //نعطي قيمة محدد للاشارة 1 ويفضل 0 للتمييز
CrossDown[i]=0; //نعطي قيمة محدد للاشارة 2 ويفضل 0 للتمييز

if(FastMa1>SlowMa1&&FastMa2<=SlowMa2)//شروط التقاطع وهي الموفينج السريع فوق البطيء عند الشمعة 1 والسريع اسفل البطيء بالشمعة 2
{
CrossUp[i]=Low[i]-Distance*point;//نعطي قيمة الاشارة صعود اسفل اللو بعدد نقاط معين
if(AlertON&&i==1&&Time0!=Time[0])//شروط التنبيه إذا ظهرت الاشارة بالشمعة الاخيرة المغلقة
{
Time0=Time[0];//شرط زمني حتى لا يتكرر التنبيه بنفس الشمعة
Print("UP signal");//طباعة التنبيه بالجورنال
PlaySound("alert2.wav");//اصدار صوت بالتنبيه
Alert("UP on ",Symbol()," at ",Bid," // Period=",Period());//رسالة نصية على الشارت
SendMail("UP signal","UP signal at Price= "+DoubleToStr(Bid,4)+"On Symbol="+Symbol());//رسالة عبر الايميل
SendNotification("UP signal at Price: "+DoubleToStr(Bid,4)+"On Symbol: "+Symbol());//رسالة عبر الموبايل
}
}

//نفس الشروط بالاشارة العكسية
if(FastMa1<SlowMa1&&FastMa2>=SlowMa2)
{
CrossDown[i]=High[i]+Distance*point;
if(AlertON&&i==1&&Time0!=Time[0])
{
Time0=Time[0];
Print("Down signal");
PlaySound("alert2.wav");
Alert("Down on ",Symbol()," at ",Bid," // Period=",Period());
SendMail("Down signal","Down signal at Price= "+DoubleToStr(Bid,4)+"On Symbol="+Symbol());
SendNotification("Down signal at Price: "+DoubleToStr(Bid,4)+"On Symbol: "+Symbol());
}
}
}
return(0);
}
//+------------------------------------------------------------------+

kira-h
06-11-2017, 04:00 PM
السلام عليكم
الشرح بالعربية ضمن كود الاكسبيرت كالتالي :


//+------------------------------------------------------------------+
//| hassan.mb@hotmail.com |
//| Kira-h |
//+-------------------DO NOT REMOVE THIS HEADER----------------------+
#property copyright "Copyright ©2017, Programmed by Kira-h"
#property link "hassan.mb@hotmail.com"
#property version "1.00"

//+------------------------------------------------------------------+
//| Exported variables |
//+------------------------------------------------------------------+
input int Step=20;//المسافة بين الصفقات
input int TakeProfit=20;//الهدف بالنقاط
input double LotsMP=2;//حجم المضاعف
input double Lots=0.1;//اللوت الأساسي
input int MagicNo=2017;//الماجك نمبر

//+------------------------------------------------------------------+
//| Local variables |
//+------------------------------------------------------------------+
double point;
int Q;

//+------------------------------------------------------------------+
//| Expert init |
//+------------------------------------------------------------------+
int OnInit()
{
Comment("Programmed by Kira-h");
if(Digits==5||Digits==3)Q=10;else Q=1;
if(Digits<4)point=0.01;else point=0.0001;
return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinit |
//+------------------------------------------------------------------+

void OnDeinit(const int reason){Comment("");}

//+------------------------------------------------------------------+
//| Expert fonctions |
//+------------------------------------------------------------------+
int orderscnt(int type=-1)//دالة لمعرفة عدد الصفقات بدلالة النوع
{
int cnt=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && MagicNo==OrderMagicNumber() && (OrderType()==type || type==-1))
{
cnt++;
}
}
}
return(cnt);
}

double LastClosed(string info,int type=-1)//دالة لمعرفة كل تفاصيل الصفقة المغلقة بدلالة النوع
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo&&(OrderType()==type||type==-1))
{
if(info=="Type")return(OrderType());
else if(info=="Lots")return(OrderLots());
else if(info=="Price")return(OrderOpenPrice());
else if(info=="TP")return(OrderTakeProfit());
else if(info=="SL")return(OrderStopLoss());
else if(info=="Profit")return(OrderProfit());
else if(info=="Time")return(OrderCloseTime());
}
}
return(0);
}

double LastCurrent(string info,int type=-1)//دالة لمعرفة كل تفاصيل الصفقة المفعلة بدلالة النوع
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo&&(OrderType()==type||type==-1))
{
if(info=="Type")return(OrderType());
else if(info=="Lots")return(OrderLots());
else if(info=="Price")return(OrderOpenPrice());
else if(info=="TP")return(OrderTakeProfit());
else if(info=="SL")return(OrderStopLoss());
else if(info=="Profit")return(OrderProfit());
else if(info=="Time")return(OrderOpenTime());
}
}
return(0);
}

string LastComment(int type=-1)//لمعرفة كومنت الصفقة بدلالة النوع
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo&&(OrderType()==type||type==-1))
{
return(OrderComment());
}
}
return(0);
}

void CloseAll(int type=-1)//دالة الاغلاق بدلالة نوع الصفقة
{
bool close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo&&(OrderType()==type||type==-1))
{
if(OrderType()==OP_BUY)close=OrderClose(OrderTicke t(),OrderLots(),Bid,3*Q);
else if(OrderType()==OP_SELL)close=OrderClose(OrderTick et(),OrderLots(),Ask,3*Q);
else if(OrderType()>OP_SELL)close=OrderDelete(OrderTicket());
}
}
}

//+------------------------------------------------------------------+
//| Expert start |
//+------------------------------------------------------------------+
void OnTick()//نضع كل الشروط بالدالةالرئيسية والتي تعمل كل تكة للسعر
{
if(orderscnt(OP_BUYSTOP)>0&&orderscnt()==1)CloseAll(OP_BUYSTOP);//إذا في صفقة شراء معلقة ولا يوجد أي صفقة مفعلة يتم حذف الشراء المعلق
if(orderscnt(OP_SELLSTOP)>0&&orderscnt()==1)CloseAll(OP_SELLSTOP);//إذا في صفقة بيع معلق ولا يوجد أي صفقة مفعلة يتم حذف البيع المعلق
//-----
if(orderscnt(OP_BUY)==1&&LastComment(OP_SELLSTOP)=="1")CloseAll(OP_SELLSTOP);//إذا تفعل الشراء الأول يتم حذف البيع المعلق الأول
if(orderscnt(OP_SELL)==1&&LastComment(OP_BUYSTOP)=="1")CloseAll(OP_BUYSTOP);//إذا تفعل البيع الأول يتم حذف الشراء المعلق الأول
//-----
if(orderscnt(OP_BUY)>0&&orderscnt(OP_SELL)==0)//إذا في صفقة شراء ولا يوجد بيع
{
if(LastClosed("Time",OP_SELL)>LastCurrent("Time"))//بحيث توقيت آخر صفقة بيع مغلقة آكبر من توقيت آخر صفقة مفعلة
{
CloseAll();//يتم حذف وإغلاق كل الصفقات
//بمعنى أنه تم إغلاق صفقة على الهدف بيتم بعدها إغلاق الكل
}
}

if(orderscnt(OP_SELL)>0&&orderscnt(OP_BUY)==0)//إذا في بيع مفعل ولا يوجد شراء
{
if(LastClosed("Time",OP_BUY)>LastCurrent("Time"))//بحيث توقيت آخر شراء مغلق أكبر من توقيت آخر صفقة
{
CloseAll();//يتم حذف وإغلاق كل الصفقات
//بمعنى أنه تم إغلاق صفقة على الهدف بيتم بعدها إغلاق الكل
}
}

//----- تعريف المتغيرات
double p,NewLots,TP,price;
int tk;

//---------شروط صفقات المضاعفات
if(orderscnt()>0)//إذا يوجد صفقة على الشارت
{

if(LastCurrent("Type")==OP_BUY&&orderscnt(OP_SELLSTOP)==0)//إذا آخر صفقة مفعلة من نوع شراء ولا يوجد بيع ستوب
{
price=LastCurrent("Price")-Step*point;//سعر الشراء المضاعف
if(TakeProfit!=0)TP=price-TakeProfit*point;//هدف الشراء
NewLots=LastCurrent("Lots",OP_BUY)*LotsMP;//حجم العقد الجديد المضاعف
tk=OrderSend(Symbol(),OP_SELLSTOP,NewLots,Normaliz eDouble(price,Digits),3*Q,0,TP,"2",MagicNo,0,Magenta);//دالة البيع ستوب
}

if(LastCurrent("Type")==OP_SELL&&orderscnt(OP_BUYSTOP)==0)//إذا آخر صفقة من نوع بيع ولا يوجد شراء ستوب
{
price=LastCurrent("Price")+Step*point;//سعر البيع المضاعف
if(TakeProfit!=0)TP=price+TakeProfit*point;//هدف البيع
NewLots=LastCurrent("Lots",OP_SELL)*LotsMP;//حجم العقد الجديد المضاعف
tk=OrderSend(Symbol(),OP_BUYSTOP,NewLots,Normalize Double(price,Digits),3*Q,0,TP,"2",MagicNo,0,Green);//دالة الشراء ستوب
}
}

//-----------شروط أول صفقتين
if(orderscnt()==0)
{
p=Ask+Step/2*point;//سعر الشراء
if(TakeProfit==0){TP=0;}else{TP=p+TakeProfit*point ;}//هدف الشراء
tk=OrderSend(Symbol(),OP_BUYSTOP,Lots,NormalizeDou ble(p,Digits),3*Q,0,TP,"1",MagicNo,0,Blue);//دالة الشراء

p=Bid-Step/2*point;//سعر البيع
if(TakeProfit==0){TP=0;}else{TP=p-TakeProfit*point;}//هدف البيع
tk=OrderSend(Symbol(),OP_SELLSTOP,Lots,NormalizeDo uble(p,Digits),3*Q,0,TP,"1",MagicNo,0,Red);//دالةالبيع
}
}

الاكسبيرت بالمرفقات

والله الموفق

kira-h
26-11-2017, 05:13 PM
- دالة رسم خط عمودي كالتالي :

void Vline(string name,datetime timee,color Color,int style)
{
if(ObjectFind(name)!=0)
{
ObjectCreate(name,OBJ_VLINE,0,timee,0);
ObjectSet(name,OBJPROP_COLOR,Color);
ObjectSet(name,OBJPROP_STYLE,style);
}
else
{
if(ObjectGet(name,OBJPROP_TIME1)!=timee)
{
ObjectDelete(name);
}
}
}
//---------------
- دالة رسم خط أفقي كالتالي :

void Hline(string name,double pr1,color ِColor,int style)
{
if(ObjectFind(name)!=0)
{
ObjectCreate(name,OBJ_HLINE,0,0,pr1);
ObjectSet(name,OBJPROP_COLOR,Color);
ObjectSet(name,OBJPROP_STYLE,style);
}
else
{
if(ObjectGet(name,OBJPROP_PRICE1)!=pr1)
{
ObjectDelete(name);
}
}
}
//---------------
- دالة رسم الترند كالتالي :

void Draw_Trend(string name,double Price,datetime Time1,datetime Time2,color Color)
{
if(ObjectFind(name)==-1)
{
ObjectCreate(name,OBJ_TREND,0,Time1,Price,Time2,Pr ice);
ObjectSet(name,OBJPROP_WIDTH,2);
ObjectSet(name,OBJPROP_COLOR, Color);
ObjectSet(name,OBJPROP_RAY,false);
}
else if(ObjectGet(name,OBJPROP_PRICE1)!=Price)
{
ObjectDelete(name);
Draw_Trend(name,Price,Time1,Time2,Color);
}
}
//---------------
- دالة رسم اسهم كالتالي :

void Draw_Arrow(string name,double Price,datetime Time1,color Color)
{
if(ObjectFind(name)==-1)
{
ObjectCreate(name,OBJ_ARROW_UP,0,Time1,Price);
ObjectSet(name,OBJPROP_WIDTH,1);
ObjectSet(name,OBJPROP_COLOR, Color);
}
else if(ObjectGet(name,OBJPROP_PRICE1)!=Price)
{
ObjectDelete(name);
Draw_Arrow(name,Price,Time1,Color);
}
}
//---------------
- دالة رسم الفيبوناتشي كالتالي:

void draw_fibo(string name,datetime time1,double price1,datetime time2,double price2)
{
if(ObjectFind(name)==-1)
{
ObjectCreate(name,OBJ_FIBO,0,time1,price1,time2,pr ice2);

ObjectSet(name,OBJPROP_FIBOLEVELS,6);//تحدد عدد المستويات بهذا السطر

ObjectSet(name,OBJPROP_FIRSTLEVEL,0);
ObjectSetFiboDescription(name,0,"0.0 %$");

ObjectSet(name,OBJPROP_FIRSTLEVEL+1,0.236);
ObjectSetFiboDescription(name,1,"23.6 %$");

ObjectSet(name,OBJPROP_FIRSTLEVEL+2,0.382);
ObjectSetFiboDescription(name,2,"38.2 %$");

ObjectSet(name,OBJPROP_FIRSTLEVEL+3,0.50);
ObjectSetFiboDescription(name,3,"50.0 %$");

ObjectSet(name,OBJPROP_FIRSTLEVEL+4,0.618);
ObjectSetFiboDescription(name,4,"61.8 %$");

ObjectSet(name,OBJPROP_FIRSTLEVEL+5,1.00);
ObjectSetFiboDescription(name,5,"100.0 %$");

//يمكن إضافة مستويات أخرى

ObjectSet(name,OBJPROP_LEVELCOLOR,Yellow) ;//لون خطوط الفيبو
}
else if(ObjectGet(name,OBJPROP_PRICE1)!=price1||ObjectG et(name,OBJPROP_PRICE2)!=price2)
{
ObjectDelete(name);
draw_fibo(name,time1,price1,time2,price2);
}
}
//---------------
- دالة كتابة كومنت على الشارت كالتالي:

void Info(string n,string text,int fontsize,color Color,double c,double X,double Y,string font)
{
ObjectCreate(n, OBJ_LABEL, 0, 0, 0);
ObjectSetText(n,text,fontsize,font,Color);
ObjectSet(n, OBJPROP_CORNER,1);
ObjectSet(n, OBJPROP_XDISTANCE,X);
ObjectSet(n, OBJPROP_YDISTANCE,Y);
}

shivaa
25-06-2021, 09:52 AM
رسم قناه سعريه متساويه الابعاد

bool ChannelCreate(const long chart_ID=0, // chart's ID
const string name="Channel", // channel name
const int sub_window=0, // subwindow index
datetime time1=0, // first point time
double price1=0, // first point price
datetime time2=0, // second point time
double price2=0, // second point price
datetime time3=0, // third point time
double price3=0, // third point price
const color clr=clrRed, // channel color
const ENUM_LINE_STYLE style=STYLE_SOLID, // style of channel lines
const int width=1, // width of channel lines
const bool fill=false, // filling the channel with color
const bool back=false, // in the background
const bool selection=true, // highlight to move
const bool ray_right=false, // channel's continuation to the right
const bool hidden=true, // hidden in the object list
const long z_order=0) // priority for mouse click
{
//--- set anchor points' coordinates if they are not set
ChangeChannelEmptyPoints(time1,price1,time2,price2 ,time3,price3);
//--- reset the error value
ResetLastError();
//--- create a channel by the given coordinates
if(!ObjectCreate(chart_ID,name,OBJ_CHANNEL,sub_win dow,time1,price1,time2,price2,time3,price3))
{
Print(__FUNCTION__,
": failed to create an equidistant channel! Error code = ",GetLastError());
return(false);
}
//--- set channel color
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- set style of the channel lines
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style );
//--- set width of the channel lines
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width );
//--- display in the foreground (false) or background (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- enable (true) or disable (false) the mode of highlighting the channel for moving
//--- when creating a graphical object using ObjectCreate function, the object cannot be
//--- highlighted and moved by default. Inside this method, selection parameter
//--- is true by default making it possible to highlight and move the object
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE, selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,se lection);
//--- enable (true) or disable (false) the mode of continuation of the channel's display to the right
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,r ay_right);
//--- hide (true) or display (false) graphical object name in the object list
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidd en);
//--- set the priority for receiving the event of a mouse click in the chart
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_or der);
//--- successful execution
return(true);
}

kira-h
27-02-2022, 07:57 AM
ما شاء الله تبارك الله
زادك الله علما اخي حسن وجعله في ميزان حسناتك
بارك الله فيك أخي الكريم والله الموفق



يعطيك العافية تشكر جهودك اخي
لو سمحت اريد كود معرفة سعر اخر صفقة مفتوحة و امري فتح صفقة ببع و شراء بناء على هذا السعر مع الشكر

العفو
راجع المشاركة التالية :
دالة تستخرج تفاصيل آخر صفقة مفعلة (https://www.fxprg.com/vb/showthread.php?t=31456&p=844553&viewfull=1#post844553)

والمشاركة التالية :
دالة البيع ودالة الشراء (https://www.fxprg.com/vb/showthread.php?t=31456&p=844555&viewfull=1#post844555)

أي أسئلة برمجية أخرى المرجو مراجعة فهرس الموضوع أو طرحها بالموضوع الموضوع المخصص للأسئلة البرمجية (https://www.fxprg.com/vb/showthread.php?t=31457)





يعطيك العافيه استاذ حسن
ويعافيك أخي، والله الموفق


بارك الله فيك وجزاك الله خيرا
وإياكم أخي والله الموفق


الله أكبر ما شاء الله عليك يا أخي
شكرا جزيلا لك وجزاك الله خيرا
على هذا المجهود
بارك الله فيك وبالتوفيق إن شاء الله


مثال تطبيقي لعمل مؤشر اسهم وتنبيه لتقاطع موفينجين
المؤشر بالمرفقات مع شرح كل أجزائه


// هذه العلامة للتعليقات ولا يقرأها البرنامج //

//حقوق المبرمج كتعليق
//+------------------------------------------------------------------+
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+

//حقوق المبرمج الرسمية
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.forexprog.com"
#property version "1.00"

#property indicator_chart_window//الاشارات ستكون في نافذة الشارت
//ويوجد كذلك
//#property indicator_separate_window//الاشارات ستكون بنافذة منفصلة مثل الماكد

#property indicator_buffers 2//عدد الاشارات
#property indicator_color1 Lime//لون الاشارة الأولى
#property indicator_color2 Red//لون الاشارة الثانية
#property indicator_width1 1//حجم الاشارة الأولى
#property indicator_width2 1//حجم الاشارة الثانية

//المتغيرات الخارجية
extern int BarsBack=200;
extern double Distance=5;
extern bool AlertON=true;

extern string var1="_______Slow MA";//إعدادات الموفينج البطيء
extern int period_1=20;
extern double shift_1=0;
extern ENUM_MA_METHOD method_1=1;
extern ENUM_APPLIED_PRICE AppliedPrice_1=0;

extern string var2="_______Fast MA";//إعدادات الموفينج السريع
extern int period_2=10;
extern double shift_2=0;
extern ENUM_MA_METHOD method_2=1;
extern ENUM_APPLIED_PRICE AppliedPrice_2=0;

//المتغيرات الداخلية
double CrossUp[];//المصفوفة المسؤولة عن رسم الاشارة 1
double CrossDown[];//المصفوفة المسؤولة عن رسم الاشارة 2
double val1[],val2[];//مصفوفة خاصة بشروط عدد الشموع
datetime Time0;//متغير زمني
double point;//متغير عشري

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()//هذه الدالة تعمل مرة واحدة بمجرد التفعيل
{
Comment("Programmed by Kira-h");//تفعيل كومنت على الشارت
//----
if(_Digits<4)point=0.01;else point=0.0001;//شروط قيمة النقطة حسب عدد الأرقام بعد الفاصلة
//----
//---- العد للاشارات يبدأ من الصفر
//----
SetIndexBuffer(0,CrossUp);//قيمة الاشارة0
SetIndexStyle(0,DRAW_ARROW);//نوع الاشارة0
SetIndexArrow(0,233);//شكل الاشارة0
SetIndexEmptyValue(0,1.0);//رمز الاشارة0
SetIndexLabel(0,"UP");//اسم الاشارة0

//نفس الشيء بالاشارة 1
SetIndexBuffer(1,CrossDown);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,234);
SetIndexEmptyValue(1,1.0);
SetIndexLabel(1,"DN");
//----
return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()//هذه الدالة تعمل مرة واحدة بمجرد الغاء المؤشر
{
Comment("");//إلغاء الكومنت الذيعلى الشارت
return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
//هذه السطور البرمجية عامة وهي لرصد عدد الشموع الموجودة بالشارت
//--------------------------------------------------------
if(BarsBack>=Bars)BarsBack=Bars;
SetIndexDrawBegin(0,Bars-BarsBack);
SetIndexDrawBegin(1,Bars-BarsBack);
int i,j,counted_bars=IndicatorCounted();
//---- check for possible errors
if(counted_bars<0)return(-1);
//---- initial zero
if(counted_bars<1)
{
for(j=1;j<=BarsBack;j++)val1[BarsBack-j]=0.0;
for(j=1;j<=BarsBack;j++)val2[BarsBack-j]=0.0;
}
//--------------------------------------------------------

for(i=BarsBack-1;i>0;i--)//معالجة شروط الاشارات ضمن مجال شموع محدد
{
double SlowMa1=iMA(Symbol(),0,period_1,shift_1,method_1,A ppliedPrice_1,i),//قيمة الموفينج البطئ عند الشمعة 1
SlowMa2=iMA(Symbol(),0,period_1,shift_1,method_1,A ppliedPrice_1,i+1),//قيمة الموفينج البطئ عند الشمعة 2
FastMa1=iMA(Symbol(),0,period_2,shift_2,method_2,A ppliedPrice_2,i),//قيمة الموفينج السريع عند الشمعة 1
FastMa2=iMA(Symbol(),0,period_2,shift_2,method_2,A ppliedPrice_2,i+1);//قيمة الموفينج السريع عند الشمعة 2


CrossUp[i]=0; //نعطي قيمة محدد للاشارة 1 ويفضل 0 للتمييز
CrossDown[i]=0; //نعطي قيمة محدد للاشارة 2 ويفضل 0 للتمييز

if(FastMa1>SlowMa1&&FastMa2<=SlowMa2)//شروط التقاطع وهي الموفينج السريع فوق البطيء عند الشمعة 1 والسريع اسفل البطيء بالشمعة 2
{
CrossUp[i]=Low[i]-Distance*point;//نعطي قيمة الاشارة صعود اسفل اللو بعدد نقاط معين
if(AlertON&&i==1&&Time0!=Time[0])//شروط التنبيه إذا ظهرت الاشارة بالشمعة الاخيرة المغلقة
{
Time0=Time[0];//شرط زمني حتى لا يتكرر التنبيه بنفس الشمعة
Print("UP signal");//طباعة التنبيه بالجورنال
PlaySound("alert2.wav");//اصدار صوت بالتنبيه
Alert("UP on ",Symbol()," at ",Bid," // Period=",Period());//رسالة نصية على الشارت
SendMail("UP signal","UP signal at Price= "+DoubleToStr(Bid,4)+"On Symbol="+Symbol());//رسالة عبر الايميل
SendNotification("UP signal at Price: "+DoubleToStr(Bid,4)+"On Symbol: "+Symbol());//رسالة عبر الموبايل
}
}

//نفس الشروط بالاشارة العكسية
if(FastMa1<SlowMa1&&FastMa2>=SlowMa2)
{
CrossDown[i]=High[i]+Distance*point;
if(AlertON&&i==1&&Time0!=Time[0])
{
Time0=Time[0];
Print("Down signal");
PlaySound("alert2.wav");
Alert("Down on ",Symbol()," at ",Bid," // Period=",Period());
SendMail("Down signal","Down signal at Price= "+DoubleToStr(Bid,4)+"On Symbol="+Symbol());
SendNotification("Down signal at Price: "+DoubleToStr(Bid,4)+"On Symbol: "+Symbol());
}
}
}
return(0);
}
//+------------------------------------------------------------------+





بارك الله فيك اخى حسن

هو ده ما اقصد بالظبط بالشرح العملى .. متضمنا شرح نظرى بسيط لكل شئ داخل المؤشر

حروح اعمل كوبايه شاى وامسك الورقة والقلم وأقعد نقطع المؤشر حته حته

ولى عودة باذن الله تعالى بعدها

لك ودى وتقديرى

بالتوفيق إن شاء الله

السلام عليكم
الكود بالمرفق لمثال تطبيقي لعمل اكسبيرت لتقاطع موفينجين مع الستوكاستيك مع الشرح


//+------------------------------------------------------------------+
//| hassan.mb@hotmail.com |
//| Kira-h |
//+-------------------DO NOT REMOVE THIS HEADER----------------------+
#property copyright "Copyright ©2017, Programmed by Kira-h"
#property link "hassan.mb@hotmail.com"
#property version "1.00"

//+------------------------------------------------------------------+
//| Exported variables |
//+------------------------------------------------------------------+
input string var1="_______________Order Management";
input bool CloseAtNext=true;
input double Lots=0.01,
Takeprofit=0,
Stoploss=0,
TrailingStop=0,
TrailingStep=0,
BreakEven=0,
BreakEvenPips=0;
input int MagicNo=2017;

input string var2="_______________MA Settings";

input string vr1="__Fast MA__";
input int ma_period_1=10;
input double ma_shift_1=0;
input ENUM_MA_METHOD ma_method_1=0;
input ENUM_APPLIED_PRICE ma_price_1=0;

input string vr2="__Slow MA__";
input int ma_period_2=20;
input double ma_shift_2=0;
input ENUM_MA_METHOD ma_method_2=0;
input ENUM_APPLIED_PRICE ma_price_2=0;

input string var3="_______________Stochastic Settings";
input int k_period=5,
d_period=3,
slowing=3;
input ENUM_MA_METHOD sto_method=0;
input ENUM_STO_PRICE sto_price=0;

//+------------------------------------------------------------------+
//| Local variables |
//+------------------------------------------------------------------+
datetime BarTime;
double point;
int Q;

//+------------------------------------------------------------------+
//| Expert init |
//+------------------------------------------------------------------+
int OnInit()//دالة رئيسية تعمل فقط ببداية عمل الاكسبيرت
{
PrintInfoToChart();//كومنت الحقوق البرمجية

//---- شروط لمعرفة قيمة النقطة تلقائيا حسب الزوج المفعل عليه الاكسبيرت
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<=2)point=0.1;
else if(_Digits==3)point=0.01;
else if(_Digits>=4)point=0.0001;

return(INIT_SUCCEEDED);
}

//+------------------Info Chart--------------------------------------+
void PrintInfoToChart()//دالة الحقوق
{
string temp="Programmed by Kira-h\nhassan.mb@hotmail.com\nforexprog.com\nCopyright ©2017\n"
+"------------------------------------------------\n";
Comment(temp);
}

//+------------------------------------------------------------------+
//| Expert deinit |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)//دالة رئيسية تعمل فقط عند الغاء عمل الاكسبيرت
{
Comment("");//الغاء الكومنت
}

//+------------------------------------------------------------------+
//| Expert start |
//+------------------------------------------------------------------+
void OnTick()
{
//----- تعريف المتغيرات الداخلية
int tk;
double TP,SL,
sm1=iStochastic(Symbol(),0,k_period,d_period,slowi ng,sto_method,sto_price,MODE_MAIN,1),//قيمة الستوك الأزرق بالشمعة 1
ss1=iStochastic(Symbol(),0,k_period,d_period,slowi ng,sto_method,sto_price,MODE_SIGNAL,1),//قيمة الستوك الأحمر بالشمعة 1
sm2=iStochastic(Symbol(),0,k_period,d_period,slowi ng,sto_method,sto_price,MODE_MAIN,2),//قيمة الستوك الأزرق بالشمعة 2
ss2=iStochastic(Symbol(),0,k_period,d_period,slowi ng,sto_method,sto_price,MODE_SIGNAL,2),//قيمة الستوك الأحمر بالشمعة 2
FastMA=iMA(Symbol(),0,ma_period_1,ma_shift_1,ma_me thod_1,ma_price_1,1),//قيمة الموفينج بالشمعة 1
SlowMA=iMA(Symbol(),0,ma_period_2,ma_shift_2,ma_me thod_2,ma_price_2,1);//قيمة الموفينج بالشمعة 2
//-----
if(TrailingStop>0)MoveTrailingStop();//شروط تفعيل التريلنغ
if(BreakEven>0)MoveBreakEven();//شروط تفعيل البريك ايفن
//-----

//-----شروط الشراء
if(FastMA > SlowMA && sm1 > ss1 && sm2 <= ss2)
{

if(CloseAtNext)CloseDeleteOrders(OP_SELL);//تفعيل الاغلاق العكسي

if(Orderscnt()==0&&BarTime!=Time[0])//تنفيذ صفقة عند عدم وجود أي صفقة مفعلة وبشمعة واحدة
{
if(Stoploss!=0)SL=Ask-Stoploss*point;else SL=0;//شروط تفعيل الوقف بالنقاط
if(Takeprofit!=0)TP=Ask+Takeprofit*point;else TP=0;//شروط تفعيل الهدف بالنقاط
tk=OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble( Ask,Digits),5*Q,SL,TP,"Kira-h",MagicNo,0,Blue);//دالة الشراء
BarTime=Time[0];//هذا الشرط لكي لا يتكرر فتح الصفقة بنفس الشمعة
}
}

//-----شروط البيع
if(FastMA < SlowMA && sm1 < ss1 && sm2 >= ss2)
{
if(CloseAtNext)CloseDeleteOrders(OP_BUY);//تفعيل الاغلاق العكسي

if(Orderscnt()==0&&BarTime!=Time[0])//تنفيذ صفقة عند عدم وجود أي صفقة مفعلة وبشمعة واحدة
{
if(Stoploss!=0)SL=Bid+Stoploss*point;else SL=0;//شروط تفعيل الوقف بالنقاط
if(Takeprofit!=0)TP=Bid-Takeprofit*point;else TP=0;//شروط تفعيل الهدف بالنقاط
tk=OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble (Bid,Digits),5*Q,SL,TP,"Kira-h",MagicNo,0,Red);//دالة البيع
BarTime=Time[0];//هذا الشرط لكي لا يتكرر فتح الصفقة بنفس الشمعة
}
}
}

//+------------------------------------------------------------------+
//| Expert fonctions |
//+------------------------------------------------------------------+

//-----------Total Orders fonction
int Orderscnt()//دالة عدد الصفقات المفتوحة
{
int cnt=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo)
{
cnt++;//عد الصفقات
}
}
}
return(cnt);
}

//-----------Close Delete Orders fonctions
void CloseDeleteOrders(int type)//دالة الاغلاق حسب نوع الصفقة
{
bool select,close;
for(int i=OrdersTotal()-1;i>=0;i--)//عملية البحث بالصفقت بداية من آخر صفقة
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);//البحث بالصفقات المفعلة على الشارت
if(OrdersTotal()>0&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo)//شروط الاغلاق مبنية على وجود صفقات مفعلة على الزوج اللي عليه الاكسبيرت وبماجك نمبر محدد
{
if(OrderType()==type)//شرط تحديد نوع الصفقة للاغلاق
{
if(OrderType()==OP_BUY)//إذا كانت الصفقة شراء
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Bid,Digits),5*Q);//دالة اغلاق الشراء
}
if(OrderType()==OP_SELL)//إذا كانت الصفقة بيع
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Ask,Digits),5*Q);//دالة اغلاق البيع
}
if(OrderType()>OP_SELL)//إذا كانت الصفقة تخالف البيع والشراء يعني أوامر معلقة
{
close=OrderDelete(OrderTicket());//دالة حذف الأوامر المعلقة
}
}
}
}
}

//-----------Trailing Stop fonction
void MoveTrailingStop()//دالة التريلينغ
{
bool s;
for(int cnt=0;cnt<OrdersTotal();cnt++)
{
s=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo&&OrderType()<=OP_SELL)
{
if(OrderType()==OP_BUY)
{
if(TrailingStop>0&&NormalizeDouble(Ask-(TrailingStep*point),Digits)>NormalizeDouble((OrderOpenPrice()+(TrailingStop*po int)),Digits))
{
if((NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid-(TrailingStop*point),Digits))||(OrderStopLoss()==0 ))
{
s=OrderModify(OrderTicket(),OrderOpenPrice(),Norma lizeDouble(Bid-(TrailingStop*point),Digits),OrderTakeProfit(),0,B lue);//دالة تعديل الوقف عند تحقق شروط الترلينغ
}
}
}
else
{
if(TrailingStop>0&&NormalizeDouble(Bid+(TrailingStep*point),Digits)<NormalizeDouble((OrderOpenPrice()-(TrailingStop*point)),Digits))
{
if((NormalizeDouble(OrderStopLoss(),Digits)>(NormalizeDouble(Ask+(TrailingStop*point),Digits)) )||(OrderStopLoss()==0))
{
s=OrderModify(OrderTicket(),OrderOpenPrice(),Norma lizeDouble(Ask+(TrailingStop*point),Digits),OrderT akeProfit(),0,Red);//دالة تعديل الوقف عند تحقق شروط الترلينغ
}
}
}
}
}
}

//-----------Break Even fonction
void MoveBreakEven()//دالة البريك ايفن
{
bool s;
for(int cnt=0;cnt<OrdersTotal();cnt++)
{
s=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo&&OrderType()<=OP_SELL)
{
if(OrderType()==OP_BUY)
{
if(BreakEven>0)
{
if(NormalizeDouble((Bid-OrderOpenPrice()),Digits)>BreakEven*point)
{
if((NormalizeDouble((OrderStopLoss()-OrderOpenPrice()),Digits)<0)||(OrderStopLoss()==0))
{
s=OrderModify(OrderTicket(),OrderOpenPrice(),Norma lizeDouble(OrderOpenPrice()+BreakEvenPips*point,Di gits),OrderTakeProfit(),0,Blue);//دالة تعديل الصفقة بتعديل الوقف عند تحقق شروط البريك ايفن
}
}
}
}
else
{
if(BreakEven>0)
{
if(NormalizeDouble((OrderOpenPrice()-Ask),Digits)>BreakEven*point)
{
if((NormalizeDouble((OrderOpenPrice()-OrderStopLoss()),Digits)<0)||(OrderStopLoss()==0))
{
s=OrderModify(OrderTicket(),OrderOpenPrice(),Norma lizeDouble(OrderOpenPrice()-BreakEvenPips*point,Digits),OrderTakeProfit(),0,Re d);//دالة تعديل الصفقة بتعديل الوقف عند تحقق شروط البريك ايفن
}
}
}
}
}
}
}





السلام عليكم ورحمة الله
استاذ حسن لو تكرمت انا بتعلم برمجه وقمت ببرمجة اكسبيريت يضع اوامر بيع وشراء معلقة بهدف واستوب ولوت لكل صفقة
ارغب في اضافة داله تقوم باعادة وضع اوامر معلقة للصفقات التي تحقق الهدف واغلقت وبنفس مكان سعر التي اغلقت واللوت والهدف والاستوب لوز

تم الرد بالموضوع المخصص للأسئلة البرمجية
https://www.fxprg.com/vb/showthread.php?t=31457&page=15&p=872671&viewfull=1#post872671


بسم الله الرحمن الرحيم

بارك الله فيك اخى حسن .. وربنا يزيدك من علمه وفضله ..

الف شكر لحضرتك ..

جارى الاطلاع والعودة لحضرتك

وتكملة مسيرة التعلم باذن الله تعالى

لك ودى وتقديرى

بالتوفيق إن شاء الله



السلام عليكم

ماهو برايك القواعد البرمجية التي يجب ان نتعلمها لنفهم كيف نبرمج

وعليكم السلام
راجع الموضوع التالي:
المرجع الكامل في تعليم لغة mql4 (https://www.fxprg.com/vb/showthread.php?t=31458)


سلام عليكم حسن
سوال هل يوجد دالة اخفاء ترينغ ستوب لكي يكون اسرع في انتقل
وشكرا

وعليكم السلام
تم الرد بالموضوع المخصص للأسئلة البرمجية


وفقك الله حسون الغالي

جزاك الله خيرا أخي الكريم


ياريت كمان دوال المؤشر لو سمحت يا بشمهندس
رسم الترند
رسم اسهم
رسم خطوط دعم او مقاومة
..... الخ

تم الرد بالمشاركة السابقة



مرحبا سيدي ما المقصود بعمل دالة فرعية
بمعنى هل أقوم بوضع الكود في خانة init او dinit او ontick
شكرا لك

دالة فرعية مقصود بها دالة خارج الدوال الرئيسية

السلام عليكم
الكود بالمرفق لمثال تطبيقي لعمل اكسبيرت لتقاطع موفينجين مع الستوكاستيك مع الشرح


//+------------------------------------------------------------------+
//| hassan.mb@hotmail.com |
//| Kira-h |
//+-------------------DO NOT REMOVE THIS HEADER----------------------+
#property copyright "Copyright ©2017, Programmed by Kira-h"
#property link "hassan.mb@hotmail.com"
#property version "1.00"

//+------------------------------------------------------------------+
//| Exported variables |
//+------------------------------------------------------------------+
input string var1="_______________Order Management";
input bool CloseAtNext=true;
input double Lots=0.01,
Takeprofit=0,
Stoploss=0,
TrailingStop=0,
TrailingStep=0,
BreakEven=0,
BreakEvenPips=0;
input int MagicNo=2017;

input string var2="_______________MA Settings";

input string vr1="__Fast MA__";
input int ma_period_1=10;
input double ma_shift_1=0;
input ENUM_MA_METHOD ma_method_1=0;
input ENUM_APPLIED_PRICE ma_price_1=0;

input string vr2="__Slow MA__";
input int ma_period_2=20;
input double ma_shift_2=0;
input ENUM_MA_METHOD ma_method_2=0;
input ENUM_APPLIED_PRICE ma_price_2=0;

input string var3="_______________Stochastic Settings";
input int k_period=5,
d_period=3,
slowing=3;
input ENUM_MA_METHOD sto_method=0;
input ENUM_STO_PRICE sto_price=0;

//+------------------------------------------------------------------+
//| Local variables |
//+------------------------------------------------------------------+
datetime BarTime;
double point;
int Q;

//+------------------------------------------------------------------+
//| Expert init |
//+------------------------------------------------------------------+
int OnInit()//دالة رئيسية تعمل فقط ببداية عمل الاكسبيرت
{
PrintInfoToChart();//كومنت الحقوق البرمجية

//---- شروط لمعرفة قيمة النقطة تلقائيا حسب الزوج المفعل عليه الاكسبيرت
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<=2)point=0.1;
else if(_Digits==3)point=0.01;
else if(_Digits>=4)point=0.0001;

return(INIT_SUCCEEDED);
}

//+------------------Info Chart--------------------------------------+
void PrintInfoToChart()//دالة الحقوق
{
string temp="Programmed by Kira-h\nhassan.mb@hotmail.com\nforexprog.com\nCopyright ©2017\n"
+"------------------------------------------------\n";
Comment(temp);
}

//+------------------------------------------------------------------+
//| Expert deinit |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)//دالة رئيسية تعمل فقط عند الغاء عمل الاكسبيرت
{
Comment("");//الغاء الكومنت
}

//+------------------------------------------------------------------+
//| Expert start |
//+------------------------------------------------------------------+
void OnTick()
{
//----- تعريف المتغيرات الداخلية
int tk;
double TP,SL,
sm1=iStochastic(Symbol(),0,k_period,d_period,slowi ng,sto_method,sto_price,MODE_MAIN,1),//قيمة الستوك الأزرق بالشمعة 1
ss1=iStochastic(Symbol(),0,k_period,d_period,slowi ng,sto_method,sto_price,MODE_SIGNAL,1),//قيمة الستوك الأحمر بالشمعة 1
sm2=iStochastic(Symbol(),0,k_period,d_period,slowi ng,sto_method,sto_price,MODE_MAIN,2),//قيمة الستوك الأزرق بالشمعة 2
ss2=iStochastic(Symbol(),0,k_period,d_period,slowi ng,sto_method,sto_price,MODE_SIGNAL,2),//قيمة الستوك الأحمر بالشمعة 2
FastMA=iMA(Symbol(),0,ma_period_1,ma_shift_1,ma_me thod_1,ma_price_1,1),//قيمة الموفينج بالشمعة 1
SlowMA=iMA(Symbol(),0,ma_period_2,ma_shift_2,ma_me thod_2,ma_price_2,1);//قيمة الموفينج بالشمعة 2
//-----
if(TrailingStop>0)MoveTrailingStop();//شروط تفعيل التريلنغ
if(BreakEven>0)MoveBreakEven();//شروط تفعيل البريك ايفن
//-----

//-----شروط الشراء
if(FastMA > SlowMA && sm1 > ss1 && sm2 <= ss2)
{

if(CloseAtNext)CloseDeleteOrders(OP_SELL);//تفعيل الاغلاق العكسي

if(Orderscnt()==0&&BarTime!=Time[0])//تنفيذ صفقة عند عدم وجود أي صفقة مفعلة وبشمعة واحدة
{
if(Stoploss!=0)SL=Ask-Stoploss*point;else SL=0;//شروط تفعيل الوقف بالنقاط
if(Takeprofit!=0)TP=Ask+Takeprofit*point;else TP=0;//شروط تفعيل الهدف بالنقاط
tk=OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble( Ask,Digits),5*Q,SL,TP,"Kira-h",MagicNo,0,Blue);//دالة الشراء
BarTime=Time[0];//هذا الشرط لكي لا يتكرر فتح الصفقة بنفس الشمعة
}
}

//-----شروط البيع
if(FastMA < SlowMA && sm1 < ss1 && sm2 >= ss2)
{
if(CloseAtNext)CloseDeleteOrders(OP_BUY);//تفعيل الاغلاق العكسي

if(Orderscnt()==0&&BarTime!=Time[0])//تنفيذ صفقة عند عدم وجود أي صفقة مفعلة وبشمعة واحدة
{
if(Stoploss!=0)SL=Bid+Stoploss*point;else SL=0;//شروط تفعيل الوقف بالنقاط
if(Takeprofit!=0)TP=Bid-Takeprofit*point;else TP=0;//شروط تفعيل الهدف بالنقاط
tk=OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble (Bid,Digits),5*Q,SL,TP,"Kira-h",MagicNo,0,Red);//دالة البيع
BarTime=Time[0];//هذا الشرط لكي لا يتكرر فتح الصفقة بنفس الشمعة
}
}
}

//+------------------------------------------------------------------+
//| Expert fonctions |
//+------------------------------------------------------------------+

//-----------Total Orders fonction
int Orderscnt()//دالة عدد الصفقات المفتوحة
{
int cnt=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo)
{
cnt++;//عد الصفقات
}
}
}
return(cnt);
}

//-----------Close Delete Orders fonctions
void CloseDeleteOrders(int type)//دالة الاغلاق حسب نوع الصفقة
{
bool select,close;
for(int i=OrdersTotal()-1;i>=0;i--)//عملية البحث بالصفقت بداية من آخر صفقة
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);//البحث بالصفقات المفعلة على الشارت
if(OrdersTotal()>0&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo)//شروط الاغلاق مبنية على وجود صفقات مفعلة على الزوج اللي عليه الاكسبيرت وبماجك نمبر محدد
{
if(OrderType()==type)//شرط تحديد نوع الصفقة للاغلاق
{
if(OrderType()==OP_BUY)//إذا كانت الصفقة شراء
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Bid,Digits),5*Q);//دالة اغلاق الشراء
}
if(OrderType()==OP_SELL)//إذا كانت الصفقة بيع
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Ask,Digits),5*Q);//دالة اغلاق البيع
}
if(OrderType()>OP_SELL)//إذا كانت الصفقة تخالف البيع والشراء يعني أوامر معلقة
{
close=OrderDelete(OrderTicket());//دالة حذف الأوامر المعلقة
}
}
}
}
}

//-----------Trailing Stop fonction
void MoveTrailingStop()//دالة التريلينغ
{
bool s;
for(int cnt=0;cnt<OrdersTotal();cnt++)
{
s=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo&&OrderType()<=OP_SELL)
{
if(OrderType()==OP_BUY)
{
if(TrailingStop>0&&NormalizeDouble(Ask-(TrailingStep*point),Digits)>NormalizeDouble((OrderOpenPrice()+(TrailingStop*po int)),Digits))
{
if((NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid-(TrailingStop*point),Digits))||(OrderStopLoss()==0 ))
{
s=OrderModify(OrderTicket(),OrderOpenPrice(),Norma lizeDouble(Bid-(TrailingStop*point),Digits),OrderTakeProfit(),0,B lue);//دالة تعديل الوقف عند تحقق شروط الترلينغ
}
}
}
else
{
if(TrailingStop>0&&NormalizeDouble(Bid+(TrailingStep*point),Digits)<NormalizeDouble((OrderOpenPrice()-(TrailingStop*point)),Digits))
{
if((NormalizeDouble(OrderStopLoss(),Digits)>(NormalizeDouble(Ask+(TrailingStop*point),Digits)) )||(OrderStopLoss()==0))
{
s=OrderModify(OrderTicket(),OrderOpenPrice(),Norma lizeDouble(Ask+(TrailingStop*point),Digits),OrderT akeProfit(),0,Red);//دالة تعديل الوقف عند تحقق شروط الترلينغ
}
}
}
}
}
}

//-----------Break Even fonction
void MoveBreakEven()//دالة البريك ايفن
{
bool s;
for(int cnt=0;cnt<OrdersTotal();cnt++)
{
s=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo&&OrderType()<=OP_SELL)
{
if(OrderType()==OP_BUY)
{
if(BreakEven>0)
{
if(NormalizeDouble((Bid-OrderOpenPrice()),Digits)>BreakEven*point)
{
if((NormalizeDouble((OrderStopLoss()-OrderOpenPrice()),Digits)<0)||(OrderStopLoss()==0))
{
s=OrderModify(OrderTicket(),OrderOpenPrice(),Norma lizeDouble(OrderOpenPrice()+BreakEvenPips*point,Di gits),OrderTakeProfit(),0,Blue);//دالة تعديل الصفقة بتعديل الوقف عند تحقق شروط البريك ايفن
}
}
}
}
else
{
if(BreakEven>0)
{
if(NormalizeDouble((OrderOpenPrice()-Ask),Digits)>BreakEven*point)
{
if((NormalizeDouble((OrderOpenPrice()-OrderStopLoss()),Digits)<0)||(OrderStopLoss()==0))
{
s=OrderModify(OrderTicket(),OrderOpenPrice(),Norma lizeDouble(OrderOpenPrice()-BreakEvenPips*point,Digits),OrderTakeProfit(),0,Re d);//دالة تعديل الصفقة بتعديل الوقف عند تحقق شروط البريك ايفن
}
}
}
}
}
}
}




جزاك الله خيرا يا غالي

وإياك اخي الكريم



عمل رااااااااااااااااااااااااائع صراحة كنت ابحث عن نفس هذه الفكرة منذ زمن
الله يوفقك يارب وفرت علينا مجهود :biggrin:

بالتوفيق إن شاء الله
دالة تستخرج تفاصيل آخر صفقة مفعلة من ربح، نوع، سعر، هدف، وقف، زمن ... بدلالة شرط معين عبارة عن كومنت



double LastOrderCurrent(string info,int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
op=OrderOpenPrice(),
pt=OrderProfit(),
tp=OrderTakeProfit(),
sl=OrderStopLoss();
datetime om=OrderOpenTime();

if(sy==Symbol()&&mn==MagicNo)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="OpenPrice")return(op);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="TP")return(tp);
else if(info=="SL")return(sl);
else if(info=="OpenTime")return(om);
else if(info=="Comment")return(mm);
}
}
}
return(0);
}


مثال لمعرفة ربح آخر صفقة مفعلة كيفما كان نوعها كالتالي :

LastOrderCurrent("Profit")

مثال لمعرفة سعر آخر صفقة شراء مفعلة كالتالي :

LastOrderCurrent("OpenPrice",OP_BUY)




عايز اقول للاكسبرت لا تفتح بيع الا لما تكون اخر صفقة اتفعلت شراء
ولا تفتح شراء الا لما تكون اخر صفقة اتفعلت بيع

انا استخدمت الدالة دي ولم تنفع معي
LastOrderCurrent("Type")==OP_SELL
الشرط سليم إذا كانت الصفقة السابقة لازالت مفعلة أي لم تغلق



if((!Sunday&&DayOfWeek()==1)

بالنسبة لشرط التوقيت
احنا بنعمل " ! " ليه واحنا عاوزين نحدد الشرط لو الاثين ثرو و اليوم الاثنين فعل الشرط

اعتقد ! تعنى لو لم يتحقق ولا ايه
! تعني false
يعني الشرط
!Sunday
هو نفس الشرط
Sunday==false

حبيبي
void CloseOrders(int type=-1)
if(OrderType()==type||type==-1)
ليه هنا حددنا -1 للنوع ماذا تعنى عندما نحددها -1

وهل ​OP_SELL ليها عدد يعنى لما نقول اكبر منها يبقى اوامر معلقة بالتالى سنقوم بحذفها وليس اغلاقها

if(OrderType()>OP_SELL){del=OrderDelete(OrderTicket());}



حبيبي
void closeorders(int type=-1)
if(ordertype()==type||type==-1)
ليه هنا حددنا -1 للنوع ماذا تعنى عندما نحددها -1

وهل op_sell ليها عدد يعنى لما نقول اكبر منها يبقى اوامر معلقة بالتالى سنقوم بحذفها وليس اغلاقها

if(ordertype()>op_sell){del=orderdelete(orderticket());}


ترتيب نوع الاوامر كالتالي
op_buy = 0,
op_sell = 1,
op_buylimit = 2,
op_buystop = 3,
op_selllimit = 4,
op_sellstop = 5.
وبالتالي الشرط نوع الامر اكبر قطعا من 1 يعني اذا كان الامر معلق
أما 1- حتى نتعامل مع الدالة دون شرط نوع الامر وكأنه غير موجود


مثال تطبيقي لعمل مؤشر اسهم وتنبيه لتقاطع موفينجين
المؤشر بالمرفقات مع شرح كل أجزائه


// هذه العلامة للتعليقات ولا يقرأها البرنامج //

//حقوق المبرمج كتعليق
//+------------------------------------------------------------------+
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+

//حقوق المبرمج الرسمية
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.forexprog.com"
#property version "1.00"

#property indicator_chart_window//الاشارات ستكون في نافذة الشارت
//ويوجد كذلك
//#property indicator_separate_window//الاشارات ستكون بنافذة منفصلة مثل الماكد

#property indicator_buffers 2//عدد الاشارات
#property indicator_color1 Lime//لون الاشارة الأولى
#property indicator_color2 Red//لون الاشارة الثانية
#property indicator_width1 1//حجم الاشارة الأولى
#property indicator_width2 1//حجم الاشارة الثانية

//المتغيرات الخارجية
extern int BarsBack=200;
extern double Distance=5;
extern bool AlertON=true;

extern string var1="_______Slow MA";//إعدادات الموفينج البطيء
extern int period_1=20;
extern double shift_1=0;
extern ENUM_MA_METHOD method_1=1;
extern ENUM_APPLIED_PRICE AppliedPrice_1=0;

extern string var2="_______Fast MA";//إعدادات الموفينج السريع
extern int period_2=10;
extern double shift_2=0;
extern ENUM_MA_METHOD method_2=1;
extern ENUM_APPLIED_PRICE AppliedPrice_2=0;

//المتغيرات الداخلية
double CrossUp[];//المصفوفة المسؤولة عن رسم الاشارة 1
double CrossDown[];//المصفوفة المسؤولة عن رسم الاشارة 2
double val1[],val2[];//مصفوفة خاصة بشروط عدد الشموع
datetime Time0;//متغير زمني
double point;//متغير عشري

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()//هذه الدالة تعمل مرة واحدة بمجرد التفعيل
{
Comment("Programmed by Kira-h");//تفعيل كومنت على الشارت
//----
if(_Digits<4)point=0.01;else point=0.0001;//شروط قيمة النقطة حسب عدد الأرقام بعد الفاصلة
//----
//---- العد للاشارات يبدأ من الصفر
//----
SetIndexBuffer(0,CrossUp);//قيمة الاشارة0
SetIndexStyle(0,DRAW_ARROW);//نوع الاشارة0
SetIndexArrow(0,233);//شكل الاشارة0
SetIndexEmptyValue(0,1.0);//رمز الاشارة0
SetIndexLabel(0,"UP");//اسم الاشارة0

//نفس الشيء بالاشارة 1
SetIndexBuffer(1,CrossDown);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,234);
SetIndexEmptyValue(1,1.0);
SetIndexLabel(1,"DN");
//----
return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()//هذه الدالة تعمل مرة واحدة بمجرد الغاء المؤشر
{
Comment("");//إلغاء الكومنت الذيعلى الشارت
return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
//هذه السطور البرمجية عامة وهي لرصد عدد الشموع الموجودة بالشارت
//--------------------------------------------------------
if(BarsBack>=Bars)BarsBack=Bars;
SetIndexDrawBegin(0,Bars-BarsBack);
SetIndexDrawBegin(1,Bars-BarsBack);
int i,j,counted_bars=IndicatorCounted();
//---- check for possible errors
if(counted_bars<0)return(-1);
//---- initial zero
if(counted_bars<1)
{
for(j=1;j<=BarsBack;j++)val1[BarsBack-j]=0.0;
for(j=1;j<=BarsBack;j++)val2[BarsBack-j]=0.0;
}
//--------------------------------------------------------

for(i=BarsBack-1;i>0;i--)//معالجة شروط الاشارات ضمن مجال شموع محدد
{
double SlowMa1=iMA(Symbol(),0,period_1,shift_1,method_1,A ppliedPrice_1,i),//قيمة الموفينج البطئ عند الشمعة 1
SlowMa2=iMA(Symbol(),0,period_1,shift_1,method_1,A ppliedPrice_1,i+1),//قيمة الموفينج البطئ عند الشمعة 2
FastMa1=iMA(Symbol(),0,period_2,shift_2,method_2,A ppliedPrice_2,i),//قيمة الموفينج السريع عند الشمعة 1
FastMa2=iMA(Symbol(),0,period_2,shift_2,method_2,A ppliedPrice_2,i+1);//قيمة الموفينج السريع عند الشمعة 2


CrossUp[i]=0; //نعطي قيمة محدد للاشارة 1 ويفضل 0 للتمييز
CrossDown[i]=0; //نعطي قيمة محدد للاشارة 2 ويفضل 0 للتمييز

if(FastMa1>SlowMa1&&FastMa2<=SlowMa2)//شروط التقاطع وهي الموفينج السريع فوق البطيء عند الشمعة 1 والسريع اسفل البطيء بالشمعة 2
{
CrossUp[i]=Low[i]-Distance*point;//نعطي قيمة الاشارة صعود اسفل اللو بعدد نقاط معين
if(AlertON&&i==1&&Time0!=Time[0])//شروط التنبيه إذا ظهرت الاشارة بالشمعة الاخيرة المغلقة
{
Time0=Time[0];//شرط زمني حتى لا يتكرر التنبيه بنفس الشمعة
Print("UP signal");//طباعة التنبيه بالجورنال
PlaySound("alert2.wav");//اصدار صوت بالتنبيه
Alert("UP on ",Symbol()," at ",Bid," // Period=",Period());//رسالة نصية على الشارت
SendMail("UP signal","UP signal at Price= "+DoubleToStr(Bid,4)+"On Symbol="+Symbol());//رسالة عبر الايميل
SendNotification("UP signal at Price: "+DoubleToStr(Bid,4)+"On Symbol: "+Symbol());//رسالة عبر الموبايل
}
}

//نفس الشروط بالاشارة العكسية
if(FastMa1<SlowMa1&&FastMa2>=SlowMa2)
{
CrossDown[i]=High[i]+Distance*point;
if(AlertON&&i==1&&Time0!=Time[0])
{
Time0=Time[0];
Print("Down signal");
PlaySound("alert2.wav");
Alert("Down on ",Symbol()," at ",Bid," // Period=",Period());
SendMail("Down signal","Down signal at Price= "+DoubleToStr(Bid,4)+"On Symbol="+Symbol());
SendNotification("Down signal at Price: "+DoubleToStr(Bid,4)+"On Symbol: "+Symbol());
}
}
}
return(0);
}
//+------------------------------------------------------------------+




بارك الله فيك اخي حسن على هذا الشرح التفصيلي الجميل
ونحتاج تعلم شيئين اضافيين لهذا المؤشر
الاول : عمل متغير خارجي لتحديد حجم السهم الذي يظهر عند التقاطع
الثاني : عمل متغير خارجي لتغير شكل السهم الذي يظهر عند التقاطع فمثلا اختيار سهم او دائرة او كفة يد
بارك الله فيك ورزقك من حيث لا تحتسب
وإياك أخي الكريم
تم اضافة كود شكل المؤشر :
UP_Code=233,
DN_Code=234
وهذه صورة بها كل أشكال الاشارة، كل اشارة لها كود خاص بها
7305

أما لون وحجم الاشارة يمكنك التحكم بها من الاعدادات
7306



// هذه العلامة للتعليقات ولا يقرأها البرنامج //


//حقوق المبرمج كتعليق
//+------------------------------------------------------------------+
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+


//حقوق المبرمج الرسمية
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.forexprog.com"
#property version "1.00"


#property indicator_chart_window//الاشارات ستكون في نافذة الشارت
//ويوجد كذلك
//#property indicator_separate_window//الاشارات ستكون بنافذة منفصلة مثل الماكد


#property indicator_buffers 2//عدد الاشارات
#property indicator_color1 Lime//لون الاشارة الأولى
#property indicator_color2 Red//لون الاشارة الثانية
#property indicator_width1 1//حجم الاشارة الأولى
#property indicator_width2 1//حجم الاشارة الثانية


//المتغيرات الخارجية
extern int BarsBack=200;
extern double Distance=5;
extern int UP_Code=233,
DN_Code=234;
extern bool AlertON=true;


extern string var1="_______Slow MA";//إعدادات الموفينج البطيء
extern int period_1=20;
extern double shift_1=0;
extern ENUM_MA_METHOD method_1=1;
extern ENUM_APPLIED_PRICE AppliedPrice_1=0;


extern string var2="_______Fast MA";//إعدادات الموفينج السريع
extern int period_2=10;
extern double shift_2=0;
extern ENUM_MA_METHOD method_2=1;
extern ENUM_APPLIED_PRICE AppliedPrice_2=0;


//المتغيرات الداخلية
double CrossUp[];//المصفوفة المسؤولة عن رسم الاشارة 1
double CrossDown[];//المصفوفة المسؤولة عن رسم الاشارة 2
double val1[],val2[];//مصفوفة خاصة بشروط عدد الشموع
datetime Time0;//متغير زمني
double point;//متغير عشري


//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()//هذه الدالة تعمل مرة واحدة بمجرد التفعيل
{
Comment("Programmed by Kira-h");//تفعيل كومنت على الشارت
//----
if(_Digits<4)point=0.01;else point=0.0001;//شروط قيمة النقطة حسب عدد الأرقام بعد الفاصلة
//----
//---- العد للاشارات يبدأ من الصفر
//----
SetIndexBuffer(0,CrossUp);//قيمة الاشارة0
SetIndexStyle(0,DRAW_ARROW);//نوع الاشارة0
SetIndexArrow(0,UP_Code);//شكل الاشارة0
SetIndexEmptyValue(0,1.0);//رمز الاشارة0
SetIndexLabel(0,"UP");//اسم الاشارة0

//نفس الشيء بالاشارة 1
SetIndexBuffer(1,CrossDown);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,DN_Code);
SetIndexEmptyValue(1,1.0);
SetIndexLabel(1,"DN");
//----
return(0);
}


//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()//هذه الدالة تعمل مرة واحدة بمجرد الغاء المؤشر
{
Comment("");//إلغاء الكومنت الذيعلى الشارت
return(0);
}


//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
//هذه السطور البرمجية عامة وهي لرصد عدد الشموع الموجودة بالشارت
//--------------------------------------------------------
if(BarsBack>=Bars)BarsBack=Bars;
SetIndexDrawBegin(0,Bars-BarsBack);
SetIndexDrawBegin(1,Bars-BarsBack);
int i,j,counted_bars=IndicatorCounted();
//---- check for possible errors
if(counted_bars<0)return(-1);
//---- initial zero
if(counted_bars<1)
{
for(j=1;j<=BarsBack;j++)val1=0.0;
for(j=1;j<=BarsBack;j++)val2[BarsBack-j]=0.0;
}
//--------------------------------------------------------

for(i=BarsBack-1;i>0;i--)//معالجة شروط الاشارات ضمن مجال شموع محدد
{
double SlowMa1=iMA(Symbol(),0,period_1,shift_1,method_1,A ppliedPrice_1,i),//قيمة الموفينج البطئ عند الشمعة 1
SlowMa2=iMA(Symbol(),0,period_1,shift_1,method_1,A ppliedPrice_1,i+1),//قيمة الموفينج البطئ عند الشمعة 2
FastMa1=iMA(Symbol(),0,period_2,shift_2,method_2,A ppliedPrice_2,i),//قيمة الموفينج السريع عند الشمعة 1
FastMa2=iMA(Symbol(),0,period_2,shift_2,method_2,A ppliedPrice_2,i+1);//قيمة الموفينج السريع عند الشمعة 2


CrossUp[i]=0; //نعطي قيمة محدد للاشارة 1 ويفضل 0 للتمييز
CrossDown[i]=0; //نعطي قيمة محدد للاشارة 2 ويفضل 0 للتمييز

if(FastMa1>SlowMa1&&FastMa2<=SlowMa2)//شروط التقاطع وهي الموفينج السريع فوق البطيء عند الشمعة 1 والسريع اسفل البطيء بالشمعة 2
{
CrossUp[i]=Low[i]-Distance*point;//نعطي قيمة الاشارة صعود اسفل اللو بعدد نقاط معين
if(AlertON&&i==1&&Time0!=Time[0])//شروط التنبيه إذا ظهرت الاشارة بالشمعة الاخيرة المغلقة
{
Time0=Time[0];//شرط زمني حتى لا يتكرر التنبيه بنفس الشمعة
Print("UP signal");//طباعة التنبيه بالجورنال
PlaySound("alert2.wav");//اصدار صوت بالتنبيه
Alert("UP on ",Symbol()," at ",Bid," // Period=",Period());//رسالة نصية على الشارت
SendMail("UP signal","UP signal at Price= "+DoubleToStr(Bid,4)+"On Symbol="+Symbol());//رسالة عبر الايميل
SendNotification("UP signal at Price: "+DoubleToStr(Bid,4)+"On Symbol: "+Symbol());//رسالة عبر الموبايل
}
}

//نفس الشروط بالاشارة العكسية
if(FastMa1<SlowMa1&&FastMa2>=SlowMa2)
{
CrossDown[i]=High[i]+Distance*point;
if(AlertON&&i==1&&Time0!=Time[0])
{
Time0=Time[0];
Print("Down signal");
PlaySound("alert2.wav");
Alert("Down on ",Symbol()," at ",Bid," // Period=",Period());
SendMail("Down signal","Down signal at Price= "+DoubleToStr(Bid,4)+"On Symbol="+Symbol());
SendNotification("Down signal at Price: "+DoubleToStr(Bid,4)+"On Symbol: "+Symbol());
}
}
}
return(0);
}
//+------------------------------------------------------------------+



وإياك أخي الكريم
تم اضافة كود شكل المؤشر :
UP_Code=233,
DN_Code=234
وهذه صورة بها كل أشكال الاشارة، كل اشارة لها كود خاص بها
7305

أما لون وحجم الاشارة يمكنك التحكم بها من الاعدادات
7306



// هذه العلامة للتعليقات ولا يقرأها البرنامج //


//حقوق المبرمج كتعليق
//+------------------------------------------------------------------+
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+


//حقوق المبرمج الرسمية
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.forexprog.com"
#property version "1.00"


#property indicator_chart_window//الاشارات ستكون في نافذة الشارت
//ويوجد كذلك
//#property indicator_separate_window//الاشارات ستكون بنافذة منفصلة مثل الماكد


#property indicator_buffers 2//عدد الاشارات
#property indicator_color1 Lime//لون الاشارة الأولى
#property indicator_color2 Red//لون الاشارة الثانية
#property indicator_width1 1//حجم الاشارة الأولى
#property indicator_width2 1//حجم الاشارة الثانية


//المتغيرات الخارجية
extern int BarsBack=200;
extern double Distance=5;
extern int UP_Code=233,
DN_Code=234;
extern bool AlertON=true;


extern string var1="_______Slow MA";//إعدادات الموفينج البطيء
extern int period_1=20;
extern double shift_1=0;
extern ENUM_MA_METHOD method_1=1;
extern ENUM_APPLIED_PRICE AppliedPrice_1=0;


extern string var2="_______Fast MA";//إعدادات الموفينج السريع
extern int period_2=10;
extern double shift_2=0;
extern ENUM_MA_METHOD method_2=1;
extern ENUM_APPLIED_PRICE AppliedPrice_2=0;


//المتغيرات الداخلية
double CrossUp[];//المصفوفة المسؤولة عن رسم الاشارة 1
double CrossDown[];//المصفوفة المسؤولة عن رسم الاشارة 2
double val1[],val2[];//مصفوفة خاصة بشروط عدد الشموع
datetime Time0;//متغير زمني
double point;//متغير عشري


//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()//هذه الدالة تعمل مرة واحدة بمجرد التفعيل
{
Comment("Programmed by Kira-h");//تفعيل كومنت على الشارت
//----
if(_Digits<4)point=0.01;else point=0.0001;//شروط قيمة النقطة حسب عدد الأرقام بعد الفاصلة
//----
//---- العد للاشارات يبدأ من الصفر
//----
SetIndexBuffer(0,CrossUp);//قيمة الاشارة0
SetIndexStyle(0,DRAW_ARROW);//نوع الاشارة0
SetIndexArrow(0,UP_Code);//شكل الاشارة0
SetIndexEmptyValue(0,1.0);//رمز الاشارة0
SetIndexLabel(0,"UP");//اسم الاشارة0

//نفس الشيء بالاشارة 1
SetIndexBuffer(1,CrossDown);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,DN_Code);
SetIndexEmptyValue(1,1.0);
SetIndexLabel(1,"DN");
//----
return(0);
}


//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()//هذه الدالة تعمل مرة واحدة بمجرد الغاء المؤشر
{
Comment("");//إلغاء الكومنت الذيعلى الشارت
return(0);
}


//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
//هذه السطور البرمجية عامة وهي لرصد عدد الشموع الموجودة بالشارت
//--------------------------------------------------------
if(BarsBack>=Bars)BarsBack=Bars;
SetIndexDrawBegin(0,Bars-BarsBack);
SetIndexDrawBegin(1,Bars-BarsBack);
int i,j,counted_bars=IndicatorCounted();
//---- check for possible errors
if(counted_bars<0)return(-1);
//---- initial zero
if(counted_bars<1)
{
for(j=1;j<=BarsBack;j++)val1[BarsBack-j]=0.0;
for(j=1;j<=BarsBack;j++)val2[BarsBack-j]=0.0;
}
//--------------------------------------------------------

for(i=BarsBack-1;i>0;i--)//معالجة شروط الاشارات ضمن مجال شموع محدد
{
double SlowMa1=iMA(Symbol(),0,period_1,shift_1,method_1,A ppliedPrice_1,i),//قيمة الموفينج البطئ عند الشمعة 1
SlowMa2=iMA(Symbol(),0,period_1,shift_1,method_1,A ppliedPrice_1,i+1),//قيمة الموفينج البطئ عند الشمعة 2
FastMa1=iMA(Symbol(),0,period_2,shift_2,method_2,A ppliedPrice_2,i),//قيمة الموفينج السريع عند الشمعة 1
FastMa2=iMA(Symbol(),0,period_2,shift_2,method_2,A ppliedPrice_2,i+1);//قيمة الموفينج السريع عند الشمعة 2


CrossUp[i]=0; //نعطي قيمة محدد للاشارة 1 ويفضل 0 للتمييز
CrossDown[i]=0; //نعطي قيمة محدد للاشارة 2 ويفضل 0 للتمييز

if(FastMa1>SlowMa1&&FastMa2<=SlowMa2)//شروط التقاطع وهي الموفينج السريع فوق البطيء عند الشمعة 1 والسريع اسفل البطيء بالشمعة 2
{
CrossUp[i]=Low[i]-Distance*point;//نعطي قيمة الاشارة صعود اسفل اللو بعدد نقاط معين
if(AlertON&&i==1&&Time0!=Time[0])//شروط التنبيه إذا ظهرت الاشارة بالشمعة الاخيرة المغلقة
{
Time0=Time[0];//شرط زمني حتى لا يتكرر التنبيه بنفس الشمعة
Print("UP signal");//طباعة التنبيه بالجورنال
PlaySound("alert2.wav");//اصدار صوت بالتنبيه
Alert("UP on ",Symbol()," at ",Bid," // Period=",Period());//رسالة نصية على الشارت
SendMail("UP signal","UP signal at Price= "+DoubleToStr(Bid,4)+"On Symbol="+Symbol());//رسالة عبر الايميل
SendNotification("UP signal at Price: "+DoubleToStr(Bid,4)+"On Symbol: "+Symbol());//رسالة عبر الموبايل
}
}

//نفس الشروط بالاشارة العكسية
if(FastMa1<SlowMa1&&FastMa2>=SlowMa2)
{
CrossDown[i]=High[i]+Distance*point;
if(AlertON&&i==1&&Time0!=Time[0])
{
Time0=Time[0];
Print("Down signal");
PlaySound("alert2.wav");
Alert("Down on ",Symbol()," at ",Bid," // Period=",Period());
SendMail("Down signal","Down signal at Price= "+DoubleToStr(Bid,4)+"On Symbol="+Symbol());
SendNotification("Down signal at Price: "+DoubleToStr(Bid,4)+"On Symbol: "+Symbol());
}
}
}
return(0);
}
//+------------------------------------------------------------------+




بارك الله فيك اخي حسن ومبروك عليك الشهر الكريم
وإياك أخي، وكل عام وأنتم بخير


[B]- دالة رسم خط عمودي كالتالي :

void Vline(string name,datetime timee,color Color,int style)
{
if(ObjectFind(name)!=0)
{
ObjectCreate(name,OBJ_VLINE,0,timee,0);
ObjectSet(name,OBJPROP_COLOR,Color);
ObjectSet(name,OBJPROP_STYLE,style);
}
else
{
if(ObjectGet(name,OBJPROP_TIME1)!=timee)
{
ObjectDelete(name);
}
}
}
//---------------
- دالة رسم خط أفقي كالتالي :

void Hline(string name,double pr1,color ِColor,int style)
{
if(ObjectFind(name)!=0)
{
ObjectCreate(name,OBJ_HLINE,0,0,pr1);
ObjectSet(name,OBJPROP_COLOR,Color);
ObjectSet(name,OBJPROP_STYLE,style);
}
else
{
if(ObjectGet(name,OBJPROP_PRICE1)!=pr1)
{
ObjectDelete(name);
}
}
}
//---------------
- دالة رسم الترند كالتالي :

void Draw_Trend(string name,double Price,datetime Time1,datetime Time2,color Color)
{
if(ObjectFind(name)==-1)
{
ObjectCreate(name,OBJ_TREND,0,Time1,Price,Time2,Pr ice);
ObjectSet(name,OBJPROP_WIDTH,2);
ObjectSet(name,OBJPROP_COLOR, Color);
ObjectSet(name,OBJPROP_RAY,false);
}
else if(ObjectGet(name,OBJPROP_PRICE1)!=Price)
{
ObjectDelete(name);
Draw_Trend(name,Price,Time1,Time2,Color);
}
}
//---------------
- دالة رسم اسهم كالتالي :

void Draw_Arrow(string name,double Price,datetime Time1,color Color)
{
if(ObjectFind(name)==-1)
{
ObjectCreate(name,OBJ_ARROW_UP,0,Time1,Price);
ObjectSet(name,OBJPROP_WIDTH,1);
ObjectSet(name,OBJPROP_COLOR, Color);
}
else if(ObjectGet(name,OBJPROP_PRICE1)!=Price)
{
ObjectDelete(name);
Draw_Arrow(name,Price,Time1,Color);
}
}
//---------------
- دالة رسم الفيبوناتشي كالتالي:

void draw_fibo(string name,datetime time1,double price1,datetime time2,double price2)
{
if(ObjectFind(name)==-1)
{
ObjectCreate(name,OBJ_FIBO,0,time1,price1,time2,pr ice2);

ObjectSet(name,OBJPROP_FIBOLEVELS,6);//تحدد عدد المستويات بهذا السطر

ObjectSet(name,OBJPROP_FIRSTLEVEL,0);
ObjectSetFiboDescription(name,0,"0.0 %$");

ObjectSet(name,OBJPROP_FIRSTLEVEL+1,0.236);
ObjectSetFiboDescription(name,1,"23.6 %$");

ObjectSet(name,OBJPROP_FIRSTLEVEL+2,0.382);
ObjectSetFiboDescription(name,2,"38.2 %$");

ObjectSet(name,OBJPROP_FIRSTLEVEL+3,0.50);
ObjectSetFiboDescription(name,3,"50.0 %$");

ObjectSet(name,OBJPROP_FIRSTLEVEL+4,0.618);
ObjectSetFiboDescription(name,4,"61.8 %$");

ObjectSet(name,OBJPROP_FIRSTLEVEL+5,1.00);
ObjectSetFiboDescription(name,5,"100.0 %$");

//يمكن إضافة مستويات أخرى

ObjectSet(name,OBJPROP_LEVELCOLOR,Yellow) ;//لون خطوط الفيبو
}
else if(ObjectGet(name,OBJPROP_PRICE1)!=price1||ObjectG et(name,OBJPROP_PRICE2)!=price2)
{
ObjectDelete(name);
draw_fibo(name,time1,price1,time2,price2);
}
}
//---------------
- دالة كتابة كومنت على الشارت كالتالي:

void Info(string n,string text,int fontsize,color Color,double c,double X,double Y,string font)
{
ObjectCreate(n, OBJ_LABEL, 0, 0, 0);
ObjectSetText(n,text,fontsize,font,Color);
ObjectSet(n, OBJPROP_CORNER,1);
ObjectSet(n, OBJPROP_XDISTANCE,X);
ObjectSet(n, OBJPROP_YDISTANCE,Y);
}



من فضلك اخي حسن
عايز دالة رسم نقطة فوق الشمعة عند تحقق شروط معينة



رسم قناه سعريه متساويه الابعاد

bool ChannelCreate(const long chart_ID=0, // chart's ID
const string name="Channel", // channel name
const int sub_window=0, // subwindow index
datetime time1=0, // first point time
double price1=0, // first point price
datetime time2=0, // second point time
double price2=0, // second point price
datetime time3=0, // third point time
double price3=0, // third point price
const color clr=clrRed, // channel color
const ENUM_LINE_STYLE style=STYLE_SOLID, // style of channel lines
const int width=1, // width of channel lines
const bool fill=false, // filling the channel with color
const bool back=false, // in the background
const bool selection=true, // highlight to move
const bool ray_right=false, // channel's continuation to the right
const bool hidden=true, // hidden in the object list
const long z_order=0) // priority for mouse click
{
//--- set anchor points' coordinates if they are not set
ChangeChannelEmptyPoints(time1,price1,time2,price2 ,time3,price3);
//--- reset the error value
ResetLastError();
//--- create a channel by the given coordinates
if(!ObjectCreate(chart_ID,name,OBJ_CHANNEL,sub_win dow,time1,price1,time2,price2,time3,price3))
{
Print(__FUNCTION__,
": failed to create an equidistant channel! Error code = ",GetLastError());
return(false);
}
//--- set channel color
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- set style of the channel lines
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style );
//--- set width of the channel lines
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width );
//--- display in the foreground (false) or background (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- enable (true) or disable (false) the mode of highlighting the channel for moving
//--- when creating a graphical object using ObjectCreate function, the object cannot be
//--- highlighted and moved by default. Inside this method, selection parameter
//--- is true by default making it possible to highlight and move the object
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE, selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,se lection);
//--- enable (true) or disable (false) the mode of continuation of the channel's display to the right
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,r ay_right);
//--- hide (true) or display (false) graphical object name in the object list
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidd en);
//--- set the priority for receiving the event of a mouse click in the chart
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_or der);
//--- successful execution
return(true);
}

جزاك الله خيرا اخي الكريم


السلام عليكم
اخوتي هل هذه الداله صحيحه لحساب مجموع الصفقات الرابحه في خلال يوم واحد



double Totalwinpos(int type=-1)
{
double wins=0;
datetime var1,var2;
var1=StrToTime("00:00");
var2=StrToTime("23:00");
for(int i=0; i<OrdersHistoryTotal(); i++)
{
bool s=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol();
double pt=OrderProfit(),
sw=OrderSwap(),
mn=OrderMagicNumber(),
cm=OrderCommission();
datetime tm=OrderCloseTime();
if(sy==Symbol()&&tm>var1&&tm<var2&&mn==MagicNo&&pt>=TargetD)
{
if(OrderType()==type||type==-1)
{
wins++;
}
}
return(wins);
}
}

وعليكم السلام
تم الرد بالموضوع المخصص للأسئلة البرمجية #3597 (https://www.fxprg.com/vb/showthread.php?t=31457&p=931595&viewfull=1#post931595)

hre007
14-07-2023, 01:00 AM
السلام عليكم
الاحظ اختفاء جميع الاكواد البرجية الخاصة بالموضوع
برجاء عمل باكب وارجاء الاكواد لاهميتها
ودمتم بخير

ابو عمر
14-07-2023, 11:39 PM
سيتم اصلاح المشكلة بإذن الله

forexfighters
24-12-2023, 11:36 PM
السلام عليكم - الى الان لم يتم استعادة الاكواد للاسف - كان موضوع جيد جدا و مرجع للكثير من المبرمجين - هل هناك امل ؟؟

ابو عمر
25-12-2023, 10:13 AM
وعليكم السلام ورحمة الله وبركاته
نعم اخي هناك امل