بالفعل اخىى الكريم كلامك صحيح
ولاكن يبدوا اننى كنت غير مركز قليلا ونسيت اننى من الممكن ان استدعىيها مباشرة من غير دوال
وبالى راح الى اننى لا بد ان اعمل داله لها
شكرا جزيلا لك وعلى اهتمامك وبارك الله فيك
Printable View
سؤال تانى متأسف على الاطاله
هذه الداله على ما اظن انها صحيحه 100% ولاكن لا تشتغل فى كل الحالات
وهى داله لمعرفة نقاط الربح الحاليه
كود PHP:
double pips4profit(){
for(int i=OrdersTotal();i>=0;i--){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==magicnumber){
double p=OrderOpenPrice();
if(OrderType()==OP_BUY){
return((Ask-p)/Point);
}
if(OrderType()==OP_SELL){
return((p-Bid)/Point);
}
}
}
return(0);
}
جزاك الله خيرا ، وأنا وضعت دالة إغلاق الصفقات داخل حلقة حتى أتأكد من إغلاق كل الصفقات إذا لم يتم إغلاقها من المرة الأولى ، ولكن استخدمت الحلقة أكثر من مرة ، فهل سيؤثر ذلك على عمل الاكسيبرت (يسبب بطئ للاكسيبرت) .
كود PHP:
if(Use_USD_Profit_Global==true){//Close Total profit for all pairs >>> ACCount profit ||Close Total profit for one pair >>> profit2(OP_BUY)+profit2(OP_SELL)||***ADD Code to CloseOrders() Function
if(IsTradeContextBusy()){Sleep(1000);}
if(AccountProfit()>=USD_Profit && Use_USD_Profit==true){
signalbuy1=false;signalbuy2=false;signalsell1=false;signalsell2=false;
for(int i=OrdersTotal();i>0;i--){
CloseOrders();}
}
if(AccountProfit()<=-USD_Loss&&Use_USD_Loss==true){
signalbuy1=false;signalbuy2=false;signalsell1=false;signalsell2=false;
for(i=OrdersTotal();i>0;i--){
CloseOrders();}
}
if(AccountProfit()<=-(lossratio*AccountBalance()/100)&&LossRatio==true){
signalbuy1=false;signalbuy2=false;signalsell1=false;signalsell2=false;
for(i=OrdersTotal();i>0;i--){
CloseOrders();}
}
if(AccountProfit()>=(profitratio*AccountBalance()/100)&&ProfitRatio==true){
signalbuy1=false;signalbuy2=false;signalsell1=false;signalsell2=false;
for(i=OrdersTotal();i>0;i--){
CloseOrders();}
}
if(DayOfWeek()==5&&Hour()==CloseHour&&Closeby_EndofWeek==true){
signalbuy1=false;signalbuy2=false;signalsell1=false;signalsell2=false;
for(i=OrdersTotal();i>0;i--){
CloseOrders();}
}
}
هذه الداله ستعود بقيمة الربح بالنقاط لآخر صفقه فقط وليس لمجموع الصفقات المفتوحه
التعديل
كود PHP:
double pips4profit(){
double profit;
for(int i=OrdersTotal();i>=0;i--){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==magicnumber){
double p=OrderOpenPrice();
if(OrderType()==OP_BUY){
profit+=(Ask-p)/point;
}
if(OrderType()==OP_SELL){
profit+=(p-Bid)/point;
}
}
}
return(profit);
}
نعم قد تزيد بطئ الإكسبرت خصوصا إذا كان عدد الصفقات المفتوحه كبير لكن غالبا لن يكون هذا البطئ ملحوظ
أنت إستخدمت الحلقه
ولست بحاجة لإستخدامها لأن الداله CloseOrders بها الحلقه بداخلها للبحث عن الصفقات وقد يتم إغلاق كل الصفقات من أول مره بالتالي لن تحتاج إلى إستخدام الحلقه الخارجيهكود PHP:
for(i=OrdersTotal();i>0;i--){
CloseOrders();}
السلام عليكم ورحمة الله وبركاته
هل يمكن ارجاع اكثر من قيمة من الدالة ام هي قيمة واحدة فقط
مثلا اريد معرفة الربح والخسارة بالنقاط والربح الخسارة بالدولار
فهل يجب علي عمل دالة لمعرفة الربح بالنقاط ودالة اخرى لمعرفة الربح بالدولار واخرى لمعرفة الخسارة
ام هناك طريقة لارجاع هذه القيم كلها من خلال دالة واحدة فقط
وعليكم السلام ورحمة الله وبركاته
الداله يمكنها أن تعود بقيمة واحده لكن يمكن عملها لكن بطرق أخرى بإستخدام نفس الداله
مثلا
بالتالي سيكون إستدعاء الداله للربح بالدولاركود PHP:
double Orders_Info(int index){
double profit;
for(int i=0;i<OrdersTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber){
if(index==0)profit+=OrderProfit();
if(index==1){
if(OrderType()==OP_BUY)profit+=(Bid-OrderOpenPrice())/Point;
if(OrderType()==OP_SELL)profit+=(OrderOpenPrice()-Ask)/Point;
}
}
}
return(profit);
}
وإستدعاء الداله للربح النقاطكود PHP:
Orders_Info(0);
-----------كود PHP:
Orders_Info(1);
أو بطريقة أخرى يمكنك إستخدام المتغيرات الثابته static variables وما يميزها أن قيم هذه المتغيرات لا تتغير عند الخروج من الداله
مثال
ثم عندما تقوم بإستدعاء المتغيرات في أي مكان في أي دالة أخرى ستظل قيمهم محفوظهكود PHP:
static double profitdolar;
static double profitpips;
void Orders_Info(){
profitdollar=0;
profitpips=0;
for(int i=0;i<OrdersTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber){
if(index==0)profitdolar+=OrderProfit();
if(index==1){
if(OrderType()==OP_BUY)profitpips+=(Bid-OrderOpenPrice())/Point;
if(OrderType()==OP_SELL)profitpips+=(OrderOpenPrice()-Ask)/Point;
}
}
}
}
ماشاء الله تبارك الله حلول وطرق ممتازة بارك الله فيك اخي الحبيب اسامة
السلام عليكم ورحمة الله وبركاته
استفسار بسيط بعد اذنك مستر دولار
انا عملت اكسبرت التارجت فيه قد الأستوب مرتين فكنت عايز بمجرد انى السعر يحقق مكسب قد الأستوب يتم تحريك الأستوب على نقطة الدخول
فأيه الكود اللى يخلينى احقق دة مع العلم انى الأستوب هو لو شمعة الواحد فى حالة
الشراء وهاى شمعة الواحد فى حالة البيع
ولكم جزيل الشكر
بعد إذن أستاذ أسامة
يمكنك يا أخ محمد وضع الحلقة دي في دالة إستارت
كود PHP:
for(int i =0;i<OrdersTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && MagicNumber==OrderMagicNumber()){
if(OrderType()==OP_BUY && Bid-OrderOpenPrice()>=OrderOpenPrice()-OrderStopLoss()){
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,LawnGreen);}
if(OrderType()==OP_SELL && OrderOpenPrice()-Ask>=OrderStopLoss()-OrderOpenPrice()){
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,OrangeRed);}
}
}