رد:موضوع مخصص للأسئلة البرمجية
رجاءا اخي مستر دولار الرد على هذه المشاركة فانا لا اريد ان اتعبك حتى تعملي الكود الكامل لمربع التسعة ولكن كان تساؤلي (لماذا بقيت قيم المصفوفة تساوي الصفر)
https://forum.arabictrader.com/showt...=1#post2491917
1 مرفق
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة dentist_hussein
السلام عليكم أخي أسامه ...
قمت بإستخدام هذه الأكواد لفتح أوامر معلقة سيل ستوب و باي ستوب و أحدد عدد الأوامر من الخارج و الفرق بين الأوامر :
كود PHP:
//////////// 1- put the buy sop///////////
if(Hour()==HourStarting){
for(i=1;i<=NumberOfOrders;i++)
{
double bs=Ask+(i*Step*point);
if(TakeProfit==0){TP=0;}else{TP=bs+TakeProfit*point;}
if(StopLoss==0){SL=0;}else{SL=bs-StopLoss*point;}
OrderSend(Symbol(),OP_BUYSTOP,Lots,bs,3,SL,TP,"Expert EA",MagicNumber,0,Red);
}
}
///////////////////////////////////////////////////////////////////////////////////////////
///////////////2- put the sell stop//////////////
if(Hour()==HourStarting){
for(i=1;i<=NumberOfOrders;i++)
{
double ss=Bid-(i*Step*point);
if(TakeProfit==0){TP=0;}else{TP=ss-TakeProfit*point;}
if(StopLoss==0){SL=0;}else{SL=ss+StopLoss*point;}
OrderSend(Symbol(),OP_SELLSTOP,Lots,ss,3,SL,TP,"Expert EA",MagicNumber,0,Red);
}
}
أريد أن أجعل الإكسبيرت يفعل شيئين :
- إذا أغلقت الصفقة على ربح يتم إعادة وضع أمر معلق من نفس النقطة و لكنها بالطبع سوف تكون ليميت .
- إذا أغلقت على خسارة يتم فتح مضاعفات حتى الإغلاق على ربح ثم وضع أمر معلق أيضا من نفس النقطة قبل ان تغلق الصفقة على خسارة وتبدأ في المضاعفات وسيكون ليميت أيضا ... ولكن يؤخذ بالحسبان أنه قد يتفعل أحد الأوامر المعلقه أثناء المضاعفات وقد تصل للهدف أو تبدأ بالمضاعفات هي الأخرى .
يالنسبه لوضع أمر معلق بعد الإغلاق على ربح هل من الممكن أن أستدعي سعر إفتتاح آخر صفقه و أجعله سعر الليميت ؟؟
و بالنسبه للمضاعفات هل أجعل الشرط إذا أغلقت آخر صفقة على خسارة وكانت شراء مثلا يتم فتح شراء بلوت تكون قيمته آخر لوت مضروب في قيمة المضاعفة ؟؟
و أستخدم هذه الداله ؟؟ :
كود PHP:
string last;
for(int i=OrdersHistoryTotal();i>=0;i--)
{
OrderSelect(i, SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
double Last_lots,Last_SL,Last_openprice;
//for buy order
if(OrderType()==OP_BUY && OrderClosePrice()>=OrderOpenPrice()) last="profit";
if(OrderType()==OP_BUY && OrderClosePrice()<=OrderOpenPrice()) last="loss";
Last_lots=OrderLots();
Last_SL=OrderStopLoss();
Last_openprice=OrderOpenPrice();
//for SELL order
if(OrderType()==OP_SELL && OrderClosePrice()<=OrderOpenPrice()) last="profit";
if(OrderType()==OP_SELL && OrderClosePrice()>=OrderOpenPrice()) last="loss";
Last_lots=OrderLots();
Last_SL=OrderStopLoss();
Last_openprice=OrderOpenPrice();
break;
}
}
if( X_Multiplier && last=="loss" )
{newLot=Multiplier*Last_lots;}
مرفق الإكسبيرت
أليس من الممكن أستاذ أسامه أن أعطي للصفقات التي تفتح عن طريق الأوامر المعلقه ماجيك نمبر يختلف عن الصفقات التي تفتح ماركت وتدخل في المضاعفات و أستخدم دوال لكل منهما وكل بالماجيك نمبر الخاص به
مثلا إستخدام دالتين خاصه بماجيك نمبر الأوامر المعلقه و دالتين لأوامر الماركت للبحث في التاريخ عن آخر و أول صفقات :
كود PHP:
////// HISTORICAL LAST ONES FOR PENDING ORDERS BY MAGIC ///
string lastP;
for(int i=OrdersHistoryTotal();i>=0;i--)
{
OrderSelect(i, SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumberP)
{
double LastP_lots,LastP_SL,LastP_openprice, LastP_ordertype;
//for buy order
if(OrderType()==OP_BUY && OrderClosePrice()>=OrderOpenPrice()) lastP="profit";
if(OrderType()==OP_BUY && OrderClosePrice()<=OrderOpenPrice()) lastP="loss";
LastP_lots=OrderLots();
LastP_SL=OrderStopLoss();
LastP_openprice=OrderOpenPrice();
LastP_ordertype=OrderType() ;
//for SELL order
if(OrderType()==OP_SELL && OrderClosePrice()<=OrderOpenPrice()) lastP="profit";
if(OrderType()==OP_SELL && OrderClosePrice()>=OrderOpenPrice()) lastP="loss";
LastP_lots=OrderLots();
LastP_SL=OrderStopLoss();
LastP_openprice=OrderOpenPrice();
LastP_ordertype=OrderType() ;
break;
}
}
//============================
////// HISTORICAL LAST ONES FOR MARKET ORDERS BY MAGIC ///
string lastM;
for(int ii=OrdersHistoryTotal();ii>=0;ii--)
{
OrderSelect(ii, SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
double LastM_lots,LastM_SL,LastM_openprice, LastM_ordertype;
//for buy order
if(OrderType()==OP_BUY && OrderClosePrice()>=OrderOpenPrice()) lastM="profit";
if(OrderType()==OP_BUY && OrderClosePrice()<=OrderOpenPrice()) lastM="loss";
LastM_lots=OrderLots();
LastM_SL=OrderStopLoss();
LastM_openprice=OrderOpenPrice();
LastM_ordertype=OrderType() ;
//for SELL order
if(OrderType()==OP_SELL && OrderClosePrice()<=OrderOpenPrice()) lastM="profit";
if(OrderType()==OP_SELL && OrderClosePrice()>=OrderOpenPrice()) lastM="loss";
LastM_lots=OrderLots();
LastM_SL=OrderStopLoss();
LastM_openprice=OrderOpenPrice();
LastM_ordertype=OrderType() ;
break;
}
}
//========================
////// HISTORICAL FIRST ONES FOR MARKET ORDERS BY MAGIC ///
string firstM ;
for(int iii=OrdersHistoryTotal();iii<=1;iii--)
{
OrderSelect(iii, SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
double firstM_lots,firstM_SL,firstM_openprice, firstM_ordertype;
//for buy order
if(OrderType()==OP_BUY && OrderClosePrice()>=OrderOpenPrice()) firstM="profit";
if(OrderType()==OP_BUY && OrderClosePrice()<=OrderOpenPrice()) firstM="loss";
firstM_lots=OrderLots();
firstM_SL=OrderStopLoss();
firstM_openprice=OrderOpenPrice();
firstM_ordertype=OrderType() ;
//for SELL order
if(OrderType()==OP_SELL && OrderClosePrice()<=OrderOpenPrice()) firstM="profit";
if(OrderType()==OP_SELL && OrderClosePrice()>=OrderOpenPrice()) firstM="loss";
firstM_lots=OrderLots();
firstM_SL=OrderStopLoss();
firstM_openprice=OrderOpenPrice();
firstM_ordertype=OrderType() ;
break;
}
}
//===========================
////// HISTORICAL FIRST ONES FOR PENDING ORDERS BY MAGIC ///
string firstP ;
for(int iiii=OrdersHistoryTotal();iiii<=1;iiii--)
{
OrderSelect(iiii, SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumberP)
{
double firstP_lots,firstP_SL,firstP_openprice, firstP_ordertype;
//for buy order
if(OrderType()==OP_BUY && OrderClosePrice()>=OrderOpenPrice()) firstP="profit";
if(OrderType()==OP_BUY && OrderClosePrice()<=OrderOpenPrice()) firstP="loss";
firstP_lots=OrderLots();
firstP_SL=OrderStopLoss();
firstP_openprice=OrderOpenPrice();
firstP_ordertype=OrderType() ;
//for SELL order
if(OrderType()==OP_SELL && OrderClosePrice()<=OrderOpenPrice()) firstP="profit";
if(OrderType()==OP_SELL && OrderClosePrice()>=OrderOpenPrice()) firstP="loss";
firstP_lots=OrderLots();
firstP_SL=OrderStopLoss();
firstP_openprice=OrderOpenPrice();
firstP_ordertype=OrderType() ;
break;
}
}
و أقوم بعمل داله تعود بنوع آخر أمر معلق بالماجيك أيضا :
كود PHP:
double LastPend(){
for(int i=0;i<OrdersHistoryTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol() && MagicNumberP==OrderMagicNumber()&& (OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT)){
double LastPend=OrderType();
}
}
return(LastPend);
}
ثم تكون الشروط لإعادة وضع الأوامر المعلقة الشراء و البيع من نفس النقطة بعد الوصول للهدف تكون كالتالي :
كود PHP:
///////////////////4-RE PUT BUY PENDING////////////
if( lastP=="profit" && LastPend()==OP_BUYSTOP )
double bl=LastP_openprice ;
{
OrderSend(Symbol(),OP_BUYLIMIT,Lots,bl,3,SL,TP,"Expert EA",MagicNumberP,0,Red);
}
if( lastP=="profit" && LastPend()==OP_BUYLIMIT )
double bss=LastP_openprice ;
{
OrderSend(Symbol(),OP_BUYSTOP,Lots,bss,3,SL,TP,"Expert EA",MagicNumberP,0,Red);
}
//======================
///////////////////3-RE PUT SELL PENDING////////////
if( lastP=="profit" && LastPend()==OP_SELLSTOP )
double sll=LastP_openprice ;
{
OrderSend(Symbol(),OP_SELLLIMIT,Lots,sll,3,SL,TP,"Expert EA",MagicNumberP,0,Red);
}
if( lastP=="profit" && LastPend()==OP_SELLLIMIT )
double sss=LastP_openprice ;
{
OrderSend(Symbol(),OP_SELLSTOP,Lots,sss,3,SL,TP,"Expert EA",MagicNumberP,0,Red);
}
//=======================
و تكون شروط مضاعفة العقود الخاسرة هكذا :
كود PHP:
////////////////////////6-MULTIPLIERS FOR LOSS BUY//////////////////////
if( X_Multiplier && lastP=="loss" && LastPend()==OP_BUYSTOP||LastPend()==OP_BUYLIMIT )
double newLot1=Multiplier*LastP_lots;
{
if(StopLoss==0||HideSL){SL=0;}else{SL=Ask-StopLoss*point;}
if(TakeProfit==0||HideTP){TP=0;}else{TP=Ask+TakeProfit*point;}
OrderSend(Symbol(),OP_BUY,newLot1,Ask,3*Q,SL,TP,"Expert EA",MagicNumber,0,Blue);
PlaySound("Alert.wav");
Time0=Time[0];
}
/////////
if( X_Multiplier && lastM=="loss" && LastM_ordertype==OP_BUY )
double newLot2=Multiplier*LastM_lots;
{
if(StopLoss==0||HideSL){SL=0;}else{SL=Ask-StopLoss*point;}
if(TakeProfit==0||HideTP){TP=0;}else{TP=Ask+TakeProfit*point;}
OrderSend(Symbol(),OP_BUY,newLot2,Ask,3*Q,SL,TP,"Expert EA",MagicNumber,0,Blue);
PlaySound("Alert.wav");
Time0=Time[0];
}
////////////////////////5-MULTIPLIERS FOR LOSS SELLS//////////////////////
if( X_Multiplier && lastP=="loss" && LastPend()==OP_SELLSTOP||LastPend()==OP_SELLLIMIT )
double newLot3=Multiplier*LastP_lots;
{
if(StopLoss==0||HideSL){SL=0;}else{SL=Bid+StopLoss*point;}
if(TakeProfit==0||HideTP){TP=0;}else{TP=Bid-TakeProfit*point;}
OrderSend(Symbol(),OP_SELL,newLot3,Bid,3*Q,SL,TP,"Dentist_Hussein EA",MagicNumber,0,Red);
PlaySound("Alert.wav");
Time0=Time[0];
}
/////////
if( X_Multiplier && lastM=="loss" && LastM_ordertype==OP_SELL )
double newLot4=Multiplier*LastM_lots;
{
if(StopLoss==0||HideSL){SL=0;}else{SL=Bid+StopLoss*point;}
if(TakeProfit==0||HideTP){TP=0;}else{TP=Bid-TakeProfit*point;}
OrderSend(Symbol(),OP_SELL,newLot4,Bid,3*Q,SL,TP,"Dentist_Hussein EA",MagicNumber,0,Red);
PlaySound("Alert.wav");
Time0=Time[0];
}
//================================
و تكون شروط وضع أمر معلق مره أخرى بعد إصابة المضاعفات الهدف و توضع الأوامر من نفس نقطة آخر أمر تم مضاعفته :
كود PHP:
//////////////////8- PUT BUY PENDING AFTER PROFIT /////////////
if( lastM=="profit" && LastM_ordertype==OP_BUY )
double bsss=firstP_openprice ;
{
OrderSend(Symbol(),OP_BUYSTOP,Lots,bsss,3,SL,TP,"Expert EA",MagicNumberP,0,Red);
}
//////////////////7- PUT BUY PENDING AFTER PROFIT /////////////
if( lastM=="profit" && LastM_ordertype==OP_SELL )
double ssss=firstP_openprice ;
{
OrderSend(Symbol(),OP_SELLSTOP,Lots,ssss,3,SL,TP,"Expert EA",MagicNumberP,0,Red);
}
//====================
معلشي هتعبك معايا أخي أسامه .. رجاء مراجعة أكواد الدوال و الشروط
و جزاك الله كل خير .
[/PHP]profit
1 مرفق
رد:موضوع مخصص للأسئلة البرمجية
استاذي مستر دولار عندي مشكلة في دالة ايقاف الأكسبيرت لباقي اليوم بعد تحقيق الربح ، على ان يعاود العمل في اليوم التالي دون تدخل يدوي لتشغيله ، برجاء تجربته والتعديل وشكرا
مرفق الأكسبيرت
رد:موضوع مخصص للأسئلة البرمجية
استاذ اسامة ، انا وضعت شرط يسمح بإضافة لوت جديد إلى اللوت الإبتدائي عند الوصول للربح المحدد
داخل ستارت
كود PHP:
if(AutoLot==true){
if(AccountEquity()>=Money_Account){
Lots=Firstlot+Add_Lot;}
else{Lots=Firstlot;}
والمتغيرات الخارجية
كود PHP:
extern bool AutoLot = true;
extern double Add_Lot = 1;
extern double Money_Account = 500;
و الـ Firstlot داخل دالة init
الشروط السابقة تعمل بشكل صحيح ، ولكن أنا أريد إضافة كود يسمح بزيادة حجم اللوت الجديد(Add_Lot) اذا كان الربح أكبر من الربح المحدد (Money_Account) ، زيادة اللوت مع زيادة الربح .
حاولت وضع الحلقة التالية داخل ستارت
كود PHP:
if(AutoLot==true){
for(int ii=0;ii<Money_Account;ii++){
if(AccountEquity()>=ii*Money_Account){
Lots=Firstlot+ii*Add_Lot;}
else{Lots=Firstlot;}
}
}
ولكنها لم تعمل !!
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
قد يحدث خطأ أن السيرفر مشغول نظرا لتنفيذ إكسبرت أمر آخر ولذلك يمكنك إستخدام الداله للتأكد
كود PHP:
IsTradeContextBusy()
أو
كود PHP:
IsTradeAllowed()
أيضا بالنسبه للإكسبرتات التي تعتمد على إغلاق أكثر من صفقة أو أكثر من عمله فأنا أستخدم المحاولة أكثر من مره حتى أتأكد من إغلاق الإكسبرت تماما
مثال
كود PHP:
int Tried;
if(OrdersTotal()>0&&Tried<20){
//close Orders
Tried++;
}
استخدمت دالة IsTradeContextBusy مع الأمر Sleep
ووضع كود لعدد المحاولات ..
كود 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
int triednumber2;
if(OrdersTotal()>0&&triednumber2<20){
while(true)
{
if(IsTradeContextBusy()){Sleep(1000);}
else {
if(AccountProfit()>=USD_Profit && Use_USD_Profit==true){
signalbuy1=false;signalbuy2=false;signalsell1=false;signalsell2=false;
CloseOrders();}
if(AccountProfit()<=-USD_Loss&&Use_USD_Loss==true){
signalbuy1=false;signalbuy2=false;signalsell1=false;signalsell2=false;
CloseOrders();}
if(AccountProfit()<=-(lossratio*AccountBalance()/100)&&LossRatio==true){
signalbuy1=false;signalbuy2=false;signalsell1=false;signalsell2=false;
CloseOrders();}
if(AccountProfit()>=(profitratio*AccountBalance()/100)&&ProfitRatio==true){
signalbuy1=false;signalbuy2=false;signalsell1=false;signalsell2=false;
CloseOrders();}
if(DayOfWeek()==5&&Hour()==CloseHour&&Closeby_EndofWeek==true){
signalbuy1=false;signalbuy2=false;signalsell1=false;signalsell2=false;
CloseOrders();}
}
}
triednumber2++;
}
}
هل التعديل صحيح ، ولي سؤال دالة OrdersTotal() هنا تعود بعدد الصفقات التي فتحها اكسيبرت محدد أم عدد الصفقات الكلية التي تم فتحها على المنصة(سواء عن طريق اكسيبرت أو يدوي) !!