تفضل المشكله فقط في دالة البحث عن الشموع
Printable View
سوف تقوم بعمل دالة لمعرفة نوع آخر صفقه أغلقت والهدف والأستوب لها
ثم سيكون شرط الدخول في الصفقهكود PHP:double LastClosedOrderInfo(string info)
{
for(int i=0;i<OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
if(info=="Type")return(OrderType());
else if(info=="Lot")return(OrderLots());
else if(info=="TP")return(OrderTakeProfit());
else if(info=="SL")return(OrderStopLoss());
}
}
return(-1);
}
لكن سيبقى مشكله في الشروط السابقه سوف يقوم الإكسبرت بفتح عدد صفقات بشكل دائم لذلك يجب أن تضع شرط آخر بأنك تريد فتح صفقة واحده عكسيه للصفقه الأساسيهكود PHP:if(LastClosedOrderInfo("Type")==OP_BUY)
{
if(LastClosedOrderInfo("Close")==LastClosedOrderInfo("SL"))
{
double TP=Bid-MathAbs(LastClosedOrderInfo("Open")-LastClosedOrderInfo("SL"))*2;
double SL=LastClosedOrderInfo("Open");
int ticket=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),3*P,SL,TP,"EA",MagicNumber+1,0,Red);
}
}
فيجب أن نقوم بتمييز الصفقه العكسيه بماجيك نمبر آخر حتى لا يعتمدها في البحث وأيضا أن نضع دالة للبحث هل تم فتح صفقة عكسيه للصفقه الأساسيه أم لا
سوف أقوم بعمل دالة للبحث عن عدد الصفقات المفتوحه بالماجيك نمبر الجديد
ثم سأضعه في شروط الدخولكود PHP:int TotalOrders(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()==MagicNumber+1&&(OrderType()==type||type==-1)){
cnt++;
}
}
}
return(cnt);
}
وايضا في دالة البحث عن الصفقات المفتوحه إذا وجد أن آخر صفقه مفتوحه لها الماجيك نمبر الجديد فسوف يتوقف عن البحثكود PHP:if(LastClosedOrderInfo("Type")==OP_BUY&&TotalOrders(OP_SELL)==0)
مثال
كود PHP:double LastClosedOrderInfo(string info)
{
for(int i=0;i<OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber+1)break;
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
if(info=="Type")return(OrderType());
else if(info=="Lot")return(OrderLots());
else if(info=="TP")return(OrderTakeProfit());
else if(info=="SL")return(OrderStopLoss());
else if(info=="Close")return(OrderClosePrice());
else if(info=="Open")return(OrderOpenPrice());
}
}
return(-1);
}
السلام عليكم
شكرا اخي الكريم على ردك واهتمامك
انا ضفت الكود وطلعلي كام error للمتغيرات التي لم يتم تعريفها وعرفتها
وحاليا فيه 4 errors في دالة for لا اعرف كيف احلهم
هذا هو الكود ومرفق ملف Mql4
كود PHP:
int MagicNumber = 0;
double LastClosedOrderInfo(string info)
{
for(int i=0;i<OrdersHistoryTotal()-1;i>=0;i--)
//expression has no effect
//';' - unexpected token
//'i' - undeclared identifier
//')' - unexpected token
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber+1)break; //';' - 'break' must be used within some loop or switch statement
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
if(info=="Type")return(OrderType());
else if(info=="Lot")return(OrderLots());
else if(info=="TP")return(OrderTakeProfit());
else if(info=="SL")return(OrderStopLoss());
else if(info=="Close")return(OrderClosePrice());
else if(info=="Open")return(OrderOpenPrice());
}
}
return(-1);
}
int TotalOrders(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()==MagicNumber+1&&(OrderType()==type||type==-1)){
cnt++;
}
}
}
return(cnt);
}
datetime Time0 = 0;
void OnTick()
{
//---
if (Time0 != Time[0])
{
if(LastClosedOrderInfo("Type")==OP_BUY&&TotalOrders(OP_SELL)==0)
{
if(LastClosedOrderInfo("Close")==LastClosedOrderInfo("SL"))
{
double TP=Bid-MathAbs(LastClosedOrderInfo("Open")-LastClosedOrderInfo("SL"))*2;
double SL=LastClosedOrderInfo("Open");
int ticket=OrderSend(Symbol(),OP_SELL,(AccountBalance()/100)/(1000*((MathAbs(LastClosedOrderInfo("Open")-LastClosedOrderInfo("SL"))))),NormalizeDouble(Bid,Digits),30,SL,TP,"EA",MagicNumber+1,0,Red);
}
}
if(LastClosedOrderInfo("Type")==OP_SELL&&TotalOrders(OP_BUY)==0)
{
if(LastClosedOrderInfo("Close")==LastClosedOrderInfo("SL"))
{
double TP=Ask+MathAbs(LastClosedOrderInfo("SL")-LastClosedOrderInfo("Open"))*2;
double SL=LastClosedOrderInfo("Open");
int ticket=OrderSend(Symbol(),OP_BUY,(AccountBalance()/100)/(1000*((MathAbs(LastClosedOrderInfo("SL")-LastClosedOrderInfo("Open"))))),NormalizeDouble(Ask,Digits),30,SL,TP,"EA",MagicNumber+1,0,Blue);
}
}
double cc = iCCI(NULL,0,14,PRICE_TYPICAL,1);
//buy
if(cc < -100 &&
Close[1] > Open[2] &&
Close[1] > Open[1] &&
Close[2] < Open[2]
){
OrderSend(NULL,OP_BUY,(AccountBalance()/100)/(100000*((Close[1]-Low[1])*1)),Ask,3,Low[1],Close[1]+((Close[1]-Low[1])*2),NULL);
}
//sell
if(cc > 100 &&
Close[1] < Open[2] &&
Close[1] < Open[1] &&
Close[2] > Open[2]
){
OrderSend(NULL,OP_SELL,(AccountBalance()/100)/(100000*((High[1]-Close[1])*1)),Bid,3,High[1],Close[1]-((High[1]-Close[1])*2),NULL);
}
Time0 = Time[0];
}
}
//+------------------------------------------------------------------+
السلام عليكم ورحمة الله وبركاته
استفسار استاذ اسامه
كيف نقوم بالتبريد وفقا لاجمالى الخساره بالنقاط وليس انعكاس عدد من النقاط
بحيث يكون التبريد لاجمالى الخساره متزايد كل مره
مثال
لدينا 3 صفقات بيع اجمالى خسارة الثلاث صفقات 70 نقطه
وقمنات بتحديد الخساره 100 نقطه
فاذا وصلت اجمالى الخساره 100 نقطه ندخل بيع
واذا وصلت اجمالى الخساره 200 نقطه ندخل بيع مره اخرى
واذا وصلت اجمالى الخساره 300 نقطه ندخل بيع مره اخرى
وهكذا كل دخول نضيف ال 100 نقطه للخساره السابقه
وعليكم السلام ورحمة الله وبركاته
قم بعمل دالة تحسب مجموع الخساره بالنقاط لجميع الصفقات
مثال
ثم ستستخدم هذه الداله بدلا من عدد نقاط الإستيب كما هو في التبريد العاديكود PHP:double TotalLossPips(int type)
{
double pips;
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()==type)
{
if(OrderType()==OP_BUY)
{
pips+=(Bid-OrderOpenPrice());
}
else if(OrderType()==OP_SELL)
{
pips+=(OrderOpenPrice()-Ask);
}
}
}
return(pips/Point);
}
جزاك الله كل خير اخي على مساعدتك
الحمد لله الكود يعمل الآن
ولكن لاحظت شئ
الصفقة العكسية لا تفتح وقت اغلاق الصفقة الاولى وانما بعد اغلاق الشمعة التي حدث فيها اغلاق الامر
مما يؤدي لتقليل الارباح هل هناك حل لهذة المشكلة ؟ بان يفتح الفقة العكسية لحظة اغلاق الصفقة الاخرى ؟
وكل عام وانت بخير
السلام عليكم
استاذي مستر دولار
اريد وضيفه او داله تمنع الاكسبيرت من ارسال امر معلق اذا تم فتح صفقه بنفس السعر او قريب منها مثلا بمدى نقطتين خلال 24 ساعه
وتعود بقيمه لكي ادرجها بشروط ارسال الامر
مثلا
كود PHP:int openbefore;
if (openbefore !=0&& الشرووط الاخرى) OrderSend(Symbol(),OP_BUYSTOP,NewLot,Ask,3*P,SL,TP,"EA",MagicNumber,0,Blue);
بارك الله فيك استاذنا
تم عمل الداله وتعمل بنجاح
استفسار تعليمى عن المؤشرات
هذا الكود يبحث عن كل شمعتين متتاليتين فى نفس الاتجاه
ويتم رسم خط على الهاى وخط على اللو
المطلوب عدم تداخل الخطوط لكل الفرص
بمعنى تكون نهاية الترند لاين عند بداية الفرصه التاليه له
ويكون ترند اخر فرصه فقط هو الممتد
هذا هو الكود
ارجو التعديل وفقا للمطلوبكود:int cnt=0;
//----
for(int i=1;i<=Bar_History;i++)
{
if(High[i+1]>High[i+2]&&Low[i+1]>Low[i+2])
{
cnt++;
double high =High[i+1],low=Low[i+2];
datetime T1=Time[i+2],T2=Time[i+1],T3=Time[0]+24*60*60;
string x=IntegerToString(i);
line("Egy_Buy "+x,T1,high,T3,Blue);
line("Egy_Sell"+x,T1,low,T3,Red);
if(cnt>=Bar_Back)break;
}
مرفق صوره توضح تداخل المستويات
السلام عليكم
ما هما هذين الأمرين Orderprint و OrderComment وما الفرق بينهما
مرحبا أ. أسامة
كيف أقرا قيم من مؤشر لا يخزن قيمه في Buffers
مرفق مؤشر لحساب نقاط البايفوت، أريد منه القيم التالية
DM1,DM2,DM3,DM4,DM5,DM6,Pivot,S1,S2,S3,R1,R2,R3
لاستخدمها في اكسبرت
ممنونة لك :icon26:
لدي سؤال من فضلك
أريد أن أقول للإكسبيرت إذا تم ضرب ستوب لوز لعملية Buy قم بوضع أمر معلق في نقطة X
كيف يمكنني كتابة هذا الكود
شكرا لك ولمجهودك سيدي