جرب الاكسيبرت بالمرفقات أستاذ جميل ، والمشكل كان فـ دالة
انت وضعت اسم الدالة فقط ولم تضع شروط للدالة أو حتى الأقواس الخاصة بها .كود PHP:
void CheckTodayProfit()
ونفس الخطـأ بالاكسيبرت الآخر مع إختلاف اسم الدالة
Printable View
السلام عليكم أستاذ أسامه .. أنا في إنتظار الرد على هذه المشاركه بارك الله فيك
https://forum.arabictrader.com/t37612-181.html#2704
استاذ جميل أعتقد انك تريد تعريف دالة بداخل دالة أخرى وهذا غير صحيح لأن الاكسيبرت لن يقوم بإستدعاء هذه الدلة إلا بإستدعاء الدالة الخارجية أولا ولذلك يجب عدم تعريف دالة داخل دالة أخرى .
الخطـأ بالدالة التالية
وبالنسبة لتوقف الأكسبيرت لباقي اليوم اذا المحصلة ربح لا أعلم أين المشكلة ، استاذ اسامة سوف يفيدك أكثر مني لمراجعة الدالةكود PHP:
void CustomCode10()
{
double dayProfit(){
double pips,pipsb,pipss;
for(int i=OrdersHistoryTotal();i>=0;i--){
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(iTime(Symbol(),1440,0)<OrderOpenTime()&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber){
if(OrderType()==OP_BUY)pipsb+=(OrderClosePrice()-OrderOpenPrice());
if(OrderType()==OP_SELL)pipss+=(OrderOpenPrice()-OrderClosePrice());
pips=pipsb+pipss;
}
}
return(pips);
}
يا أخ جميل الدالة كما وضحها أستاذ أسامة ( وخد بالك إنك بعد ما تطرح سعر إغلاق الصفقة من سعر الإفتتاح لازم تقسم ÷ point ) عشان ينتج لك فرق النقاط لتستطيع مقارنته مع DailyTp
وكما قال لك أخونا إسبايدر ما ينفعش تعرف دالة داخل دالة يعني ما ينفعش الشكل ده
يعني المفروض الدالة تكون بالشكل دهكود PHP:
void CustomCode10()
{
double dayProfit(){
وبالنسبة لسؤالك إنك محتاج دالة void CustomCode10() عشان بتستدعيها في دالة إستارتكود PHP:
double dayProfit(){
double profit;
for(int i=OrdersHistoryTotal();i>=0;i--){
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderOpenTime()>=iTime(Symbol(),1440,0)){
if(OrderType()==OP_BUY)profit+=(OrderClosePrice()-OrderOpenPrice())/Point;
if(OrderType()==OP_SELL)profit+=(OrderOpenPrice()-OrderClosePrice())/Point;
}
}
return(profit);
}
دي بسيطة ما تستديعهاش :) وإستدعي بدل منها dayProfit()
بالشكل ده بدل من إسم الدالة المحذوفة
وعلى فكرة إنت أصلا مش محتاج تستعي دالة dayProfit() في دالة void OnEveryTick7كود PHP:
void OnEveryTick7()
{
if (true == false && false) PipValue = 10;
if (true && (NDigits == 3 || NDigits == 5)) PipValue = 10;
dayProfit();
TechnicalAnalysis2x15();
TechnicalAnalysis2x16();
}
لإنك إستدخمتها في دالة إستارت بالشكل ده
وبالتالي لن تحتاج لإستدعائها مرة أخرىكود PHP:
if (dayProfit()>=(DailyTP-1)*Point&&UseDialyTP==true)return(0);
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
وده هيكون الكود من أول دالة إستارت حتى دالة حساب النقاط
لغاية كده الكود إللي فوق ده تمام . بس في ملحوظة بسيطةكود PHP:
int start()
{
if (Bars < 10)
{
Comment("Not enough bars");
return (0);
}
if (Terminated == true)
{
Comment("EA Terminated.");
return (0);
}
if (dayProfit()>=(DailyTP-1)*Point&&UseDialyTP==true)return(0);
OnEveryTick7();
}
void OnEveryTick7()
{
if (true == false && false) PipValue = 10;
if (true && (NDigits == 3 || NDigits == 5)) PipValue = 10;
dayProfit();
TechnicalAnalysis2x15();
TechnicalAnalysis2x16();
}
///////////////////////////////////////////////Void//////////////////Void//////////////////Void//////////////////Void/////////
double dayProfit(){
double profit;
for(int i=OrdersHistoryTotal();i>=0;i--){
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderOpenTime()>=iTime(Symbol(),1440,0)){
if(OrderType()==OP_BUY)profit+=(OrderClosePrice()-OrderOpenPrice())/Point;
if(OrderType()==OP_SELL)profit+=(OrderOpenPrice()-OrderClosePrice())/Point;
}
}
return(profit);
}
لما تيجي تعمل دالة بتعرفها حسب نوع الرقم الناتج منها
يعني لو الدالة ستعود بناتج صحيح يبقى تعرفهالو هتعود برقم عشري يبقى تعرفهاكود PHP:
int dayProfit(){
ولو مش هتعود بأي رقم يبقى تعرفهاكود PHP:
double dayProfit(){
يعني ما ينفعش تعرف الدالة كده void CustomCode10() وتضع في الأخر return(pips);كود PHP:
void dayProfit(){
وأسف على الإطالة :)
شكرا اخي سبايدر و شكرا استاذ يوسف على التفاعل الرائع والفكرة وصلت وخاصة تسمية الدوال int or double ولي عودة في موضوع تجميد عمل الأكسبيرت بعد الوصول لأهدافه اليومية . تحياتي
في البداية دالة حفظ بيانات آخر صفقه لا تحتاج إلى كتابة حجم اللوت وسعر الإفتتاح أكثر من مره
أما بالنسبه للخطأ لديك فهو شرط وضع الأوامر المعلقهكود PHP:
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";
//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;
}
}
بهذه الطريقة أنت لم تضع الأوامر إعتمادا على الشروط الصحيحكود PHP:
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);
}
باقي الأكواد صحيحهكود PHP:
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:
if( lastP=="profit" && LastPend()==OP_SELLSTOP )
double sll=LastP_openprice ;
فهذا الأمر لن يكون مرتبط بالجمله الشرطيه السابقه والتعديل الذي قمت بوضعه جعلت الأقواس تابعه للجمله الشرطيهكود PHP:
{
OrderSend(Symbol(),OP_SELLLIMIT,Lots,sll,3,SL,TP,"Expert EA",MagicNumberP,0,Red);
}
حتى ينفذ الأمرين بداخلهاكود PHP:
if( lastP=="profit" && LastPend()==OP_SELLSTOP )
{
double sll=LastP_openprice ;
OrderSend(Symbol(),OP_SELLLIMIT,Lots,sll,3,SL,TP,"Expert EA",MagicNumberP,0,Red);
}