مشاكل برمجة عويصة فيما يخص الاكسبرتات
كود:
int MyPendingOrdersTotal(int Magic)
{
int c=0;
int total = OrdersTotal();
for (int cnt = 0 ; cnt < total ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && OrderType()>OP_SELL)
{
c++;
}
}
return(c);
}
اريد استخدام الدالة MyPendingOrdersTotal (الخاصة بالاستاذ وضاح العطار في اكسبرت الشهباء)
ولكن المشكلة عند نسخها في اى اكسبرت آخر نظهر رسالة خطأ التالية
'(' - function definition unexpected H:\AL Trade 4\experts\TestExpert.mq4 (153, 25)
معترض على الاقواس !
'c' - variable not defined H:\AL Trade 4\experts\TestExpert.mq4 (163, 7)
معترض على المتغير C رغم انه معرف ف بداية الدالة على انه متغير من نوع Int
'}' - unbalanced parentheses H:\AL Trade 4\experts\TestExpert.mq4 (168, 1)
وآخيرا وليس آخرا معترض على القوس } رغم ان عدد الاقواس المفتوحة = عدد الاقواس المغلقة
جربت وضع الدالة في اكسبرت آخر ظهر لدى هذة الرسالة
Function "MyPendingOrdersTotal" is not referenced and will be removed from exp-file
مش عاجبه الدالة كلها وعاوز يحذفها كلها المرادى !
وايضا باستخدام دالة الاستاذ مستر دولار DeletePendingOrders نفس رسائل الخطأ السابقة تماماً
هذا كود الاكسبرت الكلى
كود:
//+------------------------------------------------------------------+
//| My_First_EA.mq4 |
//| Coders Guru |
//| http://www.forex-tsd.com |
//+------------------------------------------------------------------+
#property copyright "Coders Guru"
#property link "http://www.forex-tsd.com"
//---- input parameters
extern double TakeProfit=250.0;
extern double Lots=0.1;
extern double TrailingStop=35.0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
int Crossed (double line1 , double line2)
{
static int last_direction = 0;
static int current_dirction = 0;
if(line1>line2)current_dirction = 1; //up
if(line1<line2)current_dirction = 2; //down
if(current_dirction != last_direction) //changed
{
last_direction = current_dirction;
return (last_direction);
}
else
{
return (0);
}
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
int cnt, ticket, total;
double shortEma, longEma;
if(Bars<100)
{
Print("bars less than 100");
return(0);
}
if(TakeProfit<10)
{
Print("TakeProfit less than 10");
return(0); // check TakeProfit
}
shortEma = iMA(NULL,0,8,0,MODE_EMA,PRICE_CLOSE,0);
longEma = iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0);
int isCrossed = Crossed (shortEma,longEma);
total = OrdersTotal();
if(total < 1)
{
if(isCrossed == 1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"My EA",12345,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}
if(isCrossed == 2)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"My EA",12345,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Error opening SELL order : ",GetLastError());
return(0);
}
return(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // long position is opened
{
// should it be closed?
if(isCrossed == 2)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
return(0); // exit
}
// check for trailing stop
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
else // go to short position
{
// should it be closed?
if(isCrossed == 1)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
return(0); // exit
}
// check for trailing stop
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
int DeletePendingOrders()
{
int total = OrdersTotal();
for (int cnt = total-1 ; cnt >= 0 ; cnt--)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol() && (OrderType()>OP_SELL))
{
OrderDelete(OrderTicket());
}
}
return(0);
}
return(0);
}
//+------------------------------------------------------------------+
ما مشكلة هذة اللغة المعترضة دائماً !!
رد: مشاكل برمجة عويصة فيما يخص الاكسبرتات
اقتباس:
المشاركة الأصلية كتبت بواسطة EgyptionPro
كود:
int MyPendingOrdersTotal(int Magic)
{
int c=0;
int total = OrdersTotal();
for (int cnt = 0 ; cnt < total ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && OrderType()>OP_SELL)
{
c++;
}
}
return(c);
}
اريد استخدام الدالة MyPendingOrdersTotal (الخاصة بالاستاذ وضاح العطار في اكسبرت الشهباء)
ولكن المشكلة عند نسخها في اى اكسبرت آخر نظهر رسالة خطأ التالية
'(' - function definition unexpected H:\AL Trade 4\experts\TestExpert.mq4 (153, 25)
معترض على الاقواس !
'c' - variable not defined H:\AL Trade 4\experts\TestExpert.mq4 (163, 7)
معترض على المتغير C رغم انه معرف ف بداية الدالة على انه متغير من نوع Int
'}' - unbalanced parentheses H:\AL Trade 4\experts\TestExpert.mq4 (168, 1)
وآخيرا وليس آخرا معترض على القوس } رغم ان عدد الاقواس المفتوحة = عدد الاقواس المغلقة
جربت وضع الدالة في اكسبرت آخر ظهر لدى هذة الرسالة
Function "MyPendingOrdersTotal" is not referenced and will be removed from exp-file
مش عاجبه الدالة كلها وعاوز يحذفها كلها المرادى !
وايضا باستخدام دالة الاستاذ مستر دولار
DeletePendingOrders نفس رسائل الخطأ السابقة تماماً
هذا كود الاكسبرت الكلى
كود:
//+------------------------------------------------------------------+
//| My_First_EA.mq4 |
//| Coders Guru |
//| http://www.forex-tsd.com |
//+------------------------------------------------------------------+
#property copyright "Coders Guru"
#property link "http://www.forex-tsd.com"
//---- input parameters
extern double TakeProfit=250.0;
extern double Lots=0.1;
extern double TrailingStop=35.0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
int Crossed (double line1 , double line2)
{
static int last_direction = 0;
static int current_dirction = 0;
if(line1>line2)current_dirction = 1; //up
if(line1<line2)current_dirction = 2; //down
if(current_dirction != last_direction) //changed
{
last_direction = current_dirction;
return (last_direction);
}
else
{
return (0);
}
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
int cnt, ticket, total;
double shortEma, longEma;
if(Bars<100)
{
Print("bars less than 100");
return(0);
}
if(TakeProfit<10)
{
Print("TakeProfit less than 10");
return(0); // check TakeProfit
}
shortEma = iMA(NULL,0,8,0,MODE_EMA,PRICE_CLOSE,0);
longEma = iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0);
int isCrossed = Crossed (shortEma,longEma);
total = OrdersTotal();
if(total < 1)
{
if(isCrossed == 1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"My EA",12345,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}
if(isCrossed == 2)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"My EA",12345,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Error opening SELL order : ",GetLastError());
return(0);
}
return(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // long position is opened
{
// should it be closed?
if(isCrossed == 2)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
return(0); // exit
}
// check for trailing stop
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
else // go to short position
{
// should it be closed?
if(isCrossed == 1)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
return(0); // exit
}
// check for trailing stop
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
int DeletePendingOrders()
{
int total = OrdersTotal();
for (int cnt = total-1 ; cnt >= 0 ; cnt--)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol() && (OrderType()>OP_SELL))
{
OrderDelete(OrderTicket());
}
}
return(0);
}
return(0);
}
//+------------------------------------------------------------------+
ما مشكلة هذة اللغة المعترضة دائماً !!
عند تعريف داله يجب أن تقوم بتعريفها خارج الداله start ثم بعد ذلك تقوم بإستدعائها داخل الداله start لتؤدي عملها وهذا سبب الخطأ عندك يجب أن تقوم بتعريف الداله DeletePendingOrders خارج الداله start على إعتبار أنها داله لوحدها
رد: مشاكل برمجة عويصة فيما يخص الاكسبرتات
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
عند تعريف داله يجب أن تقوم بتعريفها خارج الداله start ثم بعد ذلك تقوم بإستدعائها داخل الداله start لتؤدي عملها وهذا سبب الخطأ عندك يجب أن تقوم بتعريف الداله DeletePendingOrders خارج الداله start على إعتبار أنها داله لوحدها
ربنا يبارك فيك دائما سريع الخدمة
رد: مشاكل برمجة عويصة فيما يخص الاكسبرتات
اخى الفاضل اين نعرف الدالة DeletePendingOrders هل نعرفها بداخل الدالة init ام قبل او بعد الدالة Start ولا في بداية الاكسبرت ؟
وهل نعرفها بInt ام لها كلمة محجوزة آخرى لتعريف الدالة
رد: مشاكل برمجة عويصة فيما يخص الاكسبرتات
اقتباس:
المشاركة الأصلية كتبت بواسطة EgyptionPro
اخى الفاضل اين نعرف الدالة DeletePendingOrders هل نعرفها بداخل الدالة init ام قبل او بعد الدالة Start ولا في بداية الاكسبرت ؟
وهل نعرفها بInt ام لها كلمة محجوزة آخرى لتعريف الدالة
في لغة MQL4 يوجد ثلاث دوال أساسيه هي
init و deinit و start
إذا أردت عمل أي داله أخرى مثل دالة إغلاق الصفقات أو داله حساب مجموع الصفقات فيجب أن تقوم ببرمجتها كداله مستقله اي خارج هذه الدوال ويمكنك كتابتها في أي مكان بعد الداله ستارت أو قبلها أو قبل الداله اينيت المهم أن تقوم بكتابتها خارج هذه الدوال فلا يمكن تعريف داله بداخل داله أخرى
بعد ذلك تقوم بإستدعاء هذه الداله التي قمت بتصميمها بداخل أي داله من الدوال الثلاث الأساسيه
حسب الكود الذي تريده
رد: مشاكل برمجة عويصة فيما يخص الاكسبرتات
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
في لغة MQL4 يوجد ثلاث دوال أساسيه هي
init و deinit و start
إذا أردت عمل أي داله أخرى مثل دالة إغلاق الصفقات أو داله حساب مجموع الصفقات فيجب أن تقوم ببرمجتها كداله مستقله اي خارج هذه الدوال ويمكنك كتابتها في أي مكان بعد الداله ستارت أو قبلها أو قبل الداله اينيت المهم أن تقوم بكتابتها خارج هذه الدوال فلا يمكن تعريف داله بداخل داله أخرى
بعد ذلك تقوم بإستدعاء هذه الداله التي قمت بتصميمها بداخل أي داله من الدوال الثلاث الأساسيه
حسب الكود الذي تريده
الله ينور عليك كدة الصورة وضحت