النتائج 1 إلى 10 من 10
الموضوع: استفسار برمجي حول دالة اوردر موديفاي
- 13-05-2011, 12:51 PM #1
استفسار برمجي حول دالة اوردر موديفاي
سلام عليكم اخي و استاذي العزيز اسامه
حول خاصية موديفاي الهدف و الاستوب للصفقات المفتوحه و كما نعلم هذه الخاصية بلنسبة للشركات التي تسخدم منصات 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);
}
و شكراآخر تعديل بواسطة amazing ، 13-05-2011 الساعة 01:05 PM
- 14-05-2011, 09:04 PM #2
وعليكم السلام ورحمة الله وبركاته
أولا لحل مشكلة قرب الهدف أو الأستوب لوز من السعر بحيث لا يسمح البروكر بوضع الأستوب أو الهدف لصغره
سوف نستخدم الداله MarketInfo لمعرفة أقل هدف أو ستوب لوز يسمح الإكسبرت بوضعه
كود PHP:MathMax( ai_0,MarketInfo(Symbol(),MODE_STOPLEVEL))
لحل مشكلة عدم عمل مودفاي للأمر ربما بسبب إنشغال السيرفر أو حودث مشاكل أخرى يمكننا أن نجعل الإكسبرت يقوم بالمحاوله مره أخرى حتى ينجح
كود PHP:if(!Mod&&V<10){V++;OrderModify(l_ticket_28, OrderOpenPrice(), l_price_40, l_price_48, 0, CLR_NONE);}
بالتالي في كل مره سوف تظل هذه الداله تعمل سوف تبحث عن الصفقات التي لم يتم تعديلها وإعادة تعديلها في أي وقت آخر
الإكسبرت في المرفقات بالتعديلات التي ذكرتها
- 16-05-2011, 02:06 PM #3
جزالك الله خيرا استاذي العزيز اسامه
جربته و لكن حصل مشكله في موديفاي الصفقات الشراء و توقف عمل موديفاي هذه الصفقات انا نظرت الى الكد و رايت حضرتك واضع لكلا القسمين Bid , Bid يعني تحت دالة :
int l_ticket_28 = OrderSend(Symbol(), OP_BUY
.
.
l_price_40 = Bid +MathMax( ai_0,MarketInfo(Symbol(),MODE_STOPLEVEL)) * Point;
l_price_48 = Bid -MathMax( ai_4,MarketInfo(Symbol(),MODE_STOPLEVEL)) * Point;
و ايضا تحت دالة البيع نفس الشيء:
int l_ticket_28 = OrderSend(Symbol(), OP_SELL
..
l_price_40 = Bid +MathMax( ai_0,MarketInfo(Symbol(),MODE_STOPLEVEL)) * Point;
l_price_48 = Bid -MathMax( ai_4,MarketInfo(Symbol(),MODE_STOPLEVEL)) * Point;
فهل هناك خطاء لماذا لم يتم وضع لدالة الشراء Ask :
l_price_40 = ِAsk +MathMax( ai_0,MarketInfo(Symbol(),MODE_STOPLEVEL)) * Point;
l_price_48 = Ask -MathMax( ai_4,MarketInfo(Symbol(),MODE_STOPLEVEL)) * Point;
و اظن هنا اربع دالات كانت موجوده من الاساس و تم تغيير اثنين منهما فقط حسب الداله الجديده و هم:
double l_price_40 = Ask - ai_0 * Point;
double l_price_48 = Ask + ai_4 * Point;
double l_price_40 = Bid + ai_0 * Point;
double l_price_48 = Bid - ai_4 * Point;
l_price_40 = Bid + ai_0 * Point;
l_price_48 = Bid - ai_4 * Point;
l_price_40 = Ask - ai_0 * Point;
l_price_48 = Ask + ai_4 * Point;
اذا امكن استاذي حسب كلامك يمكن تضيف للاكسبيرت دالة مستقله للبحث عن الصفقات التي بدون هدف أو ستوب لوز ثم تحديد ووضع هدف وستوب لوز
بالتالي في كل مره سوف تظل هذه الداله تعمل سوف تبحث عن الصفقات التي لم يتم تعديلها وإعادة تعديلها في أي وقت آخر
و شكراآخر تعديل بواسطة amazing ، 16-05-2011 الساعة 02:11 PM
- 18-05-2011, 05:39 PM #4
أنا حاولت فقط أن أوضح لك بعض التعديلات لكن بنفس الطريقه سوف تستخدم نفس الأكواد
هذا مثال لدالة سوف تقوم بالبحث عن الصفقات التي بدون هدف أو ستوب لوز ثم تقوم بعمل مودفاي
كود PHP:void ModifyOrders(){
double SL,TP;
for(int i=0;i<=OrdersTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderStopLoss()==0||OrderTakeProfit()==0){
if(OrderType()==OP_BUY){
if(StopLoss==0)SL=0;else SL=OrderOpenPrice()-StopLoss*Point;
if(TakeProfit==0)TP=0;else TP=OrderOpenPrice()+TakeProfit*Point;
OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0);
}
if(OrderType()==OP_SELL){
if(StopLoss==0)SL=0;else SL=OrderOpenPrice()+StopLoss*Point;
if(TakeProfit==0)TP=0;else TP=OrderOpenPrice()-TakeProfit*Point;
OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0);
}
}
}
}
ثم بعد ذلك تقوم بإستدعائها داخل الداله start
كود PHP:ModifyOrders()
- 18-05-2011, 11:50 PM #5
الف شكر اخي اسامه على تعبك و لكن حاولت عدة مرات و اضفت الكد و لكن بتظهر عندي بعض الاخطاء البرمجيه
ياريت اخي اسامه تقوم باضافة الكد الجاهز و التغييرات الممكنه اكيد بخبرتك العاليه لن ياخذ من وقتك كثيرا
و الله البرمجه تشيب واحد يحتاج خبير عقبري مثل حضرتك
خلاص ما اتعبك اكثر
و شكرا
- 19-05-2011, 04:08 PM #6
- 19-05-2011, 04:22 PM #7
- 22-05-2011, 02:35 PM #8
جزاك الله خيرا اخي اسامه
ممكن طلب اخير و هو اضافة خاصية reverse او معاكسة الصفقات
ايضا مجرد استفسار هل يمكن تحديد للكد بحيث يتم فتح الصفقات من استيب الذي نحن نحدده و شكرا
- 26-05-2011, 03:06 PM #9
اخي اسامه انا قمت بتغيير OP_SELL الى OP_BUY و Bid الى Ask و بلعكس و بعد التغيير جربت الكد و لكن ظهرت مشكله في اغلاق الصفقات بحيث الاكسبيرت قام بفتح صفقه و لم يغلقها و بقيت الصفقه بدون هدف و استوب
ياريت استاذ اسامه تساعدني في استبدال الشروط و عمل عكس الصفقات له
لاني ماني عارف ما هو السبب في حصول الخطاء فيه
و شكرا
- 29-05-2011, 12:50 AM #10