سلام عليكم اخي و استاذي العزيز اسامه
حول خاصية موديفاي الهدف و الاستوب للصفقات المفتوحه و كما نعلم هذه الخاصية بلنسبة للشركات التي تسخدم منصات ECN شيء ضروري و حياتي حتى يستطيع الاكسبيرت يضيف الهدف و الاستوب للصفقات بعد فتحها
و لكن واجهت مشكله انه في حساب لايف بعض الصفقات لم تجرى عليها هذه الخاصية و هي موديفاي الصفقات
و السبب ممكن راجع لتحرك السريع للسعر و الاكسبيرت لم يستطيع يعمل موديفاي لها اوصغر الاستوب و الهدف و قربه من سعر الحالي و عدم تقبلهما من السريفر و هناك اسباب اخرى تمنع من عمل هذه الخاصية بشكل سليم فتبقى الصفقات بدون هدف و استوب كما في الامر الصادر في المثال التالي و لم يظهر سبب الخطاء في الجورنال:
instant order buy 1.60 EURCHF at 1.2646 sl: 0.0000 tp: 0.0000
request was accepted by server
طبعا وجدت هناك حلول لهذه المشكله :
1- استخدام HIde TP ST للصفقات التي ليس لها هدف او استوب و بلتالي يتم الاغلاق فورا عند وصول السعر لهما (الهدف او الاستوب )
2-الاكسبيرت يقوم بعدة محاولات لتشييك اقرب هدف و استوب ممكن ان يضعه في تلك الحظه للصفقه المفتوحه 3- اغلاق الصفقه فورا واعادة فتحها باستوب و هدف مره ثانيه و هذه يسبب خصارة الاسبيرد
4- استخدام الدالة التاليه :
ticket=OrderSend(Symbol(),OP_BUY,Lo ts,askprice,Slippage,0,0,"Test EA",16384,0,Green);
OrderModify(ticket,0,OrderOpenPrice ()-Point*StopLoss,OrderOpenPrice()+Poi nt*TakeP rofit ,0,CLR_NONE);
او :
OrderModify(ticket,0,NormalizeDoubl e(OrderOpenPrice()+(StopLoss*Point) ,Digits),0,0,CLR_NONE); Also unless you used OrderSelect() the OrderOpenPrice() has NO Value... - You can do askprice=Ask; THEN do your OrderSend and OrderModify using the Variable askprice.
بدل الكد الموجود في الاكسبيرت او غيرها
الكد التالي:
كود PHP:
if (ai_4 <= 0) l_price_48 = 0;
l_ticket_28 = OrderSend(Symbol(), OP_SELL, a_lots_8, NormalizeDouble(Bid, Digits), 3, 0, 0, a_comment_20, a_magic_16, 0, Blue);
if (l_ticket_28 > 0) break;
}
if (l_ticket_28 < 1) {
Alert("Could not put on order! Haulting Trading...");
return (-2);
}
}
OrderModify(l_ticket_28, OrderOpenPrice(), l_price_40, l_price_48, 0, CLR_NONE);
return (l_ticket_28);
}
int safeLongOrder(int ai_0, int ai_4, double a_lots_8, int a_magic_16, string a_comment_20) {
int l_error_32 = -1;
int l_count_36 = 0;
double l_price_40 = Ask - ai_0 * Point;
double l_price_48 = Ask + ai_4 * Point;
if (ai_0 <= 0) l_price_40 = 0;
if (ai_4 <= 0) l_price_48 = 0;
Print("Stop Loss -- ", l_price_40);
Print("Take Profit --", l_price_48);
int l_ticket_28 = OrderSend(Symbol(), OP_BUY, a_lots_8, NormalizeDouble(Ask, Digits), 3, 0, 0, a_comment_20, a_magic_16, 0, Blue);
if (l_ticket_28 < 1) {
for (l_count_36 = 0; l_count_36 < 10; l_count_36++) {
l_error_32 = GetLastError();
Print("Error in putting on order!! -- ", l_error_32);
if (handleError(l_error_32) == 3) {
Alert("Fatal Error -- Can Not Put On Order! Haulting Trading...");
return (-2);
}
Print("Saveable error..trying again..(#" + l_count_36 + " of 10");
Sleep(2000);
RefreshRates();
l_price_40 = Ask - ai_0 * Point;
l_price_48 = Ask + ai_4 * Point;
if (ai_0 <= 0) l_price_40 = 0;
if (ai_4 <= 0) l_price_48 = 0;
l_ticket_28 = OrderSend(Symbol(), OP_BUY, a_lots_8, NormalizeDouble(Ask, Digits), 3, 0, 0, a_comment_20, a_magic_16, 0, Blue);
if (l_ticket_28 > 0) break;
}
if (l_ticket_28 < 1) {
Alert("Could not put on order! Haulting Trading...");
return (-2);
}
}
OrderModify(l_ticket_28, OrderOpenPrice(), l_price_40, l_price_48, 0, CLR_NONE);
return (l_ticket_28);
}
int totalOrders(string a_symbol_0, int a_magic_8) {
int l_count_12 = 0;
for (int l_pos_16 = 0; l_pos_16 < OrdersTotal(); l_pos_16++) {
OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == a_symbol_0 && OrderMagicNumber() == a_magic_8) l_count_12++;
}
return (l_count_12);
}
و لكد الكامل موجود على الرابط التالي ارجوا اخي اسامه انتساعدني بتعديله بافضل الطرق التي ترها حضرتك لاني حقيقتا لا ادري مدى صحة الكد الموجود في طريق الرابع
و شكرا