وعليكم السلام ورحمة الله وبركاته
لا يوجد كود لكن يجب أن ترفع الإكسبرت على موقع MQL5 في الماركت وعندما يقوم المستخدم بتنزيل نسخه ديمو فسوف تعمل بهذه الطريقه
Printable View
UP
بانتظار التصحيح أستاذ أسامة بارك الله فيك
وسؤال اخر هل توجد دالة نقطة البريك ايفن للبيع والشراء معا ؟ يعني يكون عندنا هدف وحيد لكل الصفقات بعد نقطة التعادل 0 نقطة
السلام عليكم ورحمة الله وبركاته ..
استاذ اسامه ارجو المساعده في ايجاد حل برمجي ..
ارغب بجعل الاكسبيرت يستمر في فتح الصفقات وتكون مجموعات من الصفقات
حاليا الاكسبيرت يفتح مجموعة واحدة وينتظر حتى يتم اغلاقها
ارجوا المساعدة واعطاء الدوال التي احتاجها
وشكرا
الملف المرفق 454347
نعم الطريقة صحيحه تماما ولا غبار عليها
يمكنك أيضا بدلا من إستخدام المصفوفات يمكنك المقارنة مباشرة بين الصفقات بحيث تحفظ ربح كل صفقة بالتي تليها
مثال
بالنسبه للسؤال الثاني راجع كود المؤشر المرفق يمكنك إستخدام نفس الطريقهكود PHP:double profit1,profit2;
for(int i=OrdersTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
int ticket=OrderTicket();
int type=OrderType();
double lots=OrderLots();
if(OrderSymbol()==Symbol()&&OrderType()<=OP_SELL)
{
if(OrderType()==OP_BUY)profit1=(Bid-OrderOpenPrice())/Point;
else profit1=(OrderOpenPrice()-Ask)/Point;
profit1=OrderProfit();
for(int j=i-1;j>=0;j--)
{
OrderSelect(j,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderType()<=OP_SELL)
{
if(OrderType()==OP_BUY)profit2=(Bid-OrderOpenPrice())/Point;
else profit2=(OrderOpenPrice()-Ask)/Point;
if(profit2+profit1>45)
{
if(OrderType()==OP_BUY)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3);
}
else
{
OrderClose(OrderTicket(),OrderLots(),Ask,3);
}
if(type==OP_BUY)
{
OrderClose(ticket,lots,Bid,3);
}
else
{
OrderClose(ticket,lots,Ask,3);
}
}
}
}
}
}
الله يعطيك العافية وصلت الفكرة , استاذ اسامة ..
لكن واجهت مشكلة ..
كنت استخدم دالة LastOrderPrice
لاستخراج قيمة اول صفقة بيع واول صفقة شراء من المجموعةكود PHP:double LastOrderPrice(int type){ for(int i =0;i<OrdersTotal();i++) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()==Symbol()&&OrderType()==type) { return(OrderOpenPrice()); } } return(0);}
الان بوجود عدة مجموعات , بعد وضع رقم تيكيت الصفقة الرئيسية في الصفقات الهيدج او التبريد
كيف اقدر اعمل المقارنة او البحث لاستخراج , قيمة افتتاح اول صفقتين من كل مجموعة
وشكرا جزيلا
كود PHP:double Su[5];
Su[0]=1+2;
Su[1]=1+3;
Su[2]=1+4;
Su[3]=1+5;
Su[4]=1+6;
استاذ اسامه .. عندي استفسار اخركود PHP:for(int i=0;i<5;i++)
{
if( Close[1]>Su[i]&& Su[i]>=Close[0] )
{
}
}
استخدم المستويات على شكل مصفوفه
اريد حين يتم تنفيذ على احد المستويات يتم كتابة اسم المستوى في كومينت الصفقة مثل Su[2]
حاولة استخدام Su[i] لكن يكتب لي قيمة المستوى ,
وشكرا جزيلا
استسمح الدكتور اسامة في الجواب
انظر اسفله اخي الكريم ستكون دالة الشراء الاساسية هكذا
لاحظ اننا حولنا المتغير ticketb من تايب انتيجر الى سترينج لان الباراميتر comment في الدالة OrderSend يجب ان يكون من نوع سترينجكود PHP:int ticketb = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,sl,tp, IntegerToString(ticketb),Magic,0,Green);
بعد ذلك للبحث عن الصفقات والتحكم فيها من خلال الكومنت الذي احتفظنا بها بهذا الشكل
قد لا تحتاج لدالة يمكنك وضع المقارنة مباشرة ولكن وضعت لك الدالة لتقريب المعنىكود PHP:void OrderByTicket(){
int Myticket ;
for (int cnt=0; cnt<OrdersTotal(); cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol() && OrderMagicNumber()== MagicNumber)
Myticket==StringToInteger(OrderComment());
{
If(Myticket== OrderTicket());
//Do some thing …..
}
}
}
اتبع نفس منطق الدالة التي كتبتها انت ولكن بدل الاحتفاظ بقيمة OpenPrice نحتفظ بالكومنت
هذا بالنسبة للسؤال الاول اما السؤال الثاني فستحتاج اللى دالة
هذا ما اعرف والله تعالى اعلمكود PHP:ObjectName();
تحياتي للجميع
يجب ان تعكس اللوب وتبدأ من OrderTotal -1 الى الصفر لان الصفقة الرئيسية هي الصفقة الاولى
بارك الله فيك أستاذي
لم أفهم طريقة عمل المؤشر ولكن بعد التجربة لاحظت تغير قيمة البريك ايفن عند كل حركة للسعر صعودا وهبوطا
ما أريده هو عمل هدف إجمالي بعد نقطة التعادل 0 نقطة لصفقات الشراء والبيع معا
يعني مثل هذه الدالة التي تعمل على الشراء منفصل عن البيع أريدها على جميع الصفقات كيف ذلك
لكن بعد عدة محاولات أظن انه غير ممكن فقد وجدت أخطاء في الهدف والستوب الاجمالي حيث يعطي 130 وما شابهكود PHP:double Av_Prices(int type) { double Price;double lots; for(int i=0;i<=OrdersTotal();i++) { bool s=OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo&&OrderType()==type) { Price+=OrderOpenPrice()*OrderLots(); lots+=OrderLots(); } } if(lots!=0)return(Price/lots); else return(0); } void AvBreakEven() { double ProfitS=Av_Prices(OP_SELL)-(Takeprofit*point); double ProfitB=Av_Prices(OP_BUY)+(Takeprofit*point); for(int cnt=0;cnt<OrdersTotal();cnt++) { bool s=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); double orderstop=OrderStopLoss(); double openprice=OrderOpenPrice(); int ticket=OrderTicket(); if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo) { if(OrderType()==OP_SELL) { bool m1=OrderModify(ticket,openprice,orderstop,ProfitS,0,Blue); } if(OrderType()==OP_BUY) { bool m2=OrderModify(ticket,openprice,orderstop,ProfitB,0,Red); } } } }
لكن أظن يمكن عمله كهدف مخفي أو بمقارنة عدد العقود لا أعلم كيف أرجو المساعدةكود PHP:double All_Av_Prices() { double Price;double lots; for(int i=0;i<=OrdersTotal();i++) { bool s=OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()<=OP_SELL){ Price+=OrderOpenPrice()*OrderLots(); lots+=OrderLots(); } } if(lots!=0)return(Price/lots); else return(0); } void All_AvBreakEven() { double ProfitS=Av_Prices(OP_SELL)-MainProfit*point; double ProfitB=Av_Prices(OP_BUY)+MainProfit*point; double LossS=Av_Prices(OP_SELL)+MainProfit*point; double LossB=Av_Prices(OP_BUY)-MainProfit*point; for(int cnt=0;cnt<OrdersTotal();cnt++){ bool s=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); double orderstop=OrderStopLoss(); double openprice=OrderOpenPrice(); int ticket=OrderTicket(); if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber){ bool m1=OrderModify(ticket,openprice,LossS,ProfitS,0,Blue); bool m2=OrderModify(ticket,openprice,LossB,ProfitB,0,Red); } } }
كل ما أريده هدف إجمالي بعد نقطة التعادل لكل الصفقات
الله يعطيك العافية اخووي goldfile .. ما قصرت
صار لي عدة شهور احاول برمجة الفكرة الى اكسبيرت , ومن الاسبوع السابق تفرغت للفكرة واحاول اجد حلول لجميع الخطوات
ومن كثر التفكير , الاستفسار السابق لم اعرف اصيغه صح << المعذره
وبسبب كثرة التفكير احس اني بعقد المسألة ,
لذلك سوف اشرح لك فكرة الاكسبيرت وارجو المساعدة في ايجاد الحلول , واعطاء الاكواد لكل حل
الملف المرفق 454420
الملف المرفق 454421
في كل مجموعة الصفقة تتفعل من كل مستوى مرة واحدة فقط
بعد فتح عدة صفقات ( هدف المجموعة , مجمل ناتج قيمة الصفقات تكون بالموجب )
المستويات ليست مؤشر بل معادلة حسابية
تتغير قيمة المستويات مع كل شمعة ( لذلك لا استطيع استخدام مسافة ثابتة )
واستخدم في تعريف المستويات هذا الكود
كود PHP:double Su[5];
Su[0]=1+2;
Su[1]=1+3;
Su[2]=1+4;
Su[3]=1+5;
Su[4]=1+6;
ارجوا ان وصلت لك الفكرة بالطريقة الصحيحة
وشكر جزيلا
السلام عليكم
شوف اخي الكريم المؤشر الذي ارفقه الدكتور اسامة من اروع ما رأيت في البريك ايفن يمكنك استخدامه بكامل السهولة مع اي اكسبريت تريد ولذلك
ارفقه الاخ اسامة وهو مفتوح المصدر , لا حظ بمجرد وضعه على الشارت يعطيك على اليمين سعر البريك ايفن وعلى يساره الربح بالدولار انظر الصورة
الملف المرفق 454494
من داخل المؤشر احفظ قيمة BreakEven وكذلك Equity باستخدام الدالتين الظريفتن
ثم تسترجع القيم من اجعل عمل شرط تحرك البريك ايفن مثال من داخل المؤشركود PHP:GlobalVariableSet() ;
GlobalVariableGet() ;
sum هي قيمة Equity و level0 هي قيمة البريك ايفنكود PHP:GlobalVariableSet("BreakEven_Equity"+Symbol()+AccountName(),sum) ;
GlobalVariableSet("BreakEven_Level"+Symbol()+AccountName(),level0) ;
ثم من داخل الاكسبريت اعمل الاتي لاسترجاع القيم هكذا بكل يسر
مع تعرف المتغيرين iEquity و BreakLevel كمتغيرين عامينكود PHP:iEquity = GlobalVariableGet("BreakEven_Equity"+Symbol()+AccountName()) ;
BreakLevel = GlobalVariableGet("BreakEven_Level"+Symbol()+AccountName()) ;
ثم بعد ذالك دالة الموديفاي وانا اكتبها في الغالب بهذا الشكل
ثم اخر مرحلة كتابة شرط تحريك الستوب لوز مع استدعاء الدالة ModifyStopLossكود PHP:void ModifyStopLoss(double stoploss) {
bool ret;
ret = OrderModify(OrderTicket(),OrderOpenPrice(),stoploss,OrderTakeProfit(),0,CLR_NONE);
if (ret == false)
Print("OrderSend() error - ", ErrorDescription(GetLastError()));
}
اظن ان الامور واضحة هذا ما استطيع فعله اخي الكريم وتقبل خالص وديكود PHP:void BreakEven()
{
double price = BreakLevel ;
for (int i=OrdersTotal()-1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(Ask > OrderOpenPrice() && iEquity >=0 && OrderStopLoss()< OrderOpenPrice() )
if(OrderType()==OP_BUY)
ModifyStopLoss(BreakLevel) ;
if(OrderType()==OP_SELL)
if(Bid < OrderOpenPrice() && iEquity >=0 && OrderStopLoss()> OrderOpenPrice() )
ModifyStopLoss(BreakLevel) ;
}
}
السلام عليكم
اخي الكريم Profit Box بهذا الشكل انت تريد عمل اكسبريت كامل وانا لااستطيع ذلك يمكن الدكتور اسامة او احد الاخوة , اما اذا كنت بدأت العمل على الاكسبريت و تحتاج مساعدة في جزء معين منه او الاستفسار بخصوص
مشكلة اعترضتك فيمكنني مساعدتك الامر ليس صعب ولكن توكل على الله واعمل الخطوات الاولى وستجد المساعدة والدعم في منتدانا الغالي حتى تحصل على ما تريد
تقبل خالص تحياتي واعتذاري ايضا
اخي للكريم
الله يعطيك العافية .. ما قصرت
الحمدالله انا انتهيت من الاكسبيرت بس ينفذ مجموعة وحده , وحطيته على سيرفر وبتابع النتائج ..
حاليا بحاول اطوره انه ينفذ عدة مجموعات في نفس الوقت وواجهتني مشكلة وارجوا المساعدة
اريد ربط الصفقات عبر النمبر ماجيك
للصفقات الرئيسية في خانة النمبر ماجيك وضعت رقم التكيت لاعطاء كل صفقة رئيسية نمبر ماجيك خاص ( ارجوا التصحيح ان أخطأت )
كيف اقدر انقل للصفقات الفرعية النمبر ماجيك الصفقات الرئيسية ( ارجوا التوضيح )كود PHP:OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),3*Q,0,0,"EA",OrderTicket(),0,Red);
واريد استخدم دالة البحث عن عدة الصفقات المفتوحة لكل مجموعة
الحين لكل مجموعة نمبر ماجيك خاص ( الي هو رقم التكتيت للصفقة الرئيسية ) كيف تصبح المقارنة او صغية الكود للدالةكود PHP:int orderscnt() { int cnt=0; for(int i =0;i<OrdersTotal();i++){ if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){ if(OrderSymbol()==Symbol() && MagicNumber==OrderMagicNumber()){ cnt++; } } } return(cnt); }
وشكرا جزيلا