النتائج 1 إلى 7 من 7
- 27-10-2016, 02:49 AM #1
مطلوب كود برمجي لحفظ أكبر قيمة للخسارة العائمة خلال اختبار الإكسبرت
السلام عليكم ورحمة الله تعالى وبركاته ،،،
أحبتي في الله ،
نظرا للخطأ الذي نواجهه في اختبارات الاكسبرتات وبالتقرير تحديدا حيث أن نسبة الدروداون الموجودة غير الحقيقية التي تهم صانع الإكسبرت وهي الانخفاض الحقيقي دون البالانس ، وبالتالي أرجو التكرم بكتابة كود برمجي يحفظ أقصى خسارة عائمة وصلها الإكسبرت أثناء اختباره ، بمعنى إن افتتح عقد ووصلت خسارته 100 دولار ومن ثم عاد إلى الربح فسوف تظهر بخانة أقصى خسارة عائمة هي 100 دولار .. نفترض فتح عقود جديدة ووصلت الخسارة إلى 40 دولار فبهذه الحالة تبقى خانة أقصى خسارة عائمة هي 100 دولار ولا تتغير إلا إذا أصبحت الخسارة العائمة 101 دولار فيحفظها وهكذا ،،، إظهارها على الشاشة أمر بسيط ولكن الأهم هي طريقة الحفظ ذاتها فقد فشلت محاولاتي ..
لكم جيعا كل الود
أخوكم أمجد
- 27-10-2016, 11:33 AM #2
وعليكم السلام
كود:int OnInit() { GlobalVariableSet("loss",0); //////////////////// // باقي الكود return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { Comment(""); } void OnTick() { double max=GlobalVariableGet("loss"); Comment("MaxLose="+max); if(Profit()<max){GlobalVariableSet("loss",Profit());Print(max+" أقصى خسارة عائمة هي");} //////////////////////////////////////////////////////////////////////////////////// // باقي الكود } double Profit() { double n=0; int G = OrdersTotal(); for (int i = 0 ; i < G ; i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){ if (OrderSymbol()==Symbol() && (OrderType()==OP_BUY || OrderType()==OP_SELL)) { n=n+OrderProfit(); } } } return(n); }
- 28-10-2016, 03:44 AM #3
ممنونك يا بطل
أخي الكريم ،،
ألف شكر على هذا الكود ، ما قصرت والله .. الكود يظهر لدي أقصى قيمة وصلها الانخفاض في الجورنال ، هل أستطيع أن أطلب منك أن نجد طريقة لعرضها على الشاشة بشكل دائم كما هي الصورة المرفقة والتي استخدم لها الكود التالي ، وما نريده بالزبط أن يكون هناك متغير نضعه مكان AccountBalance في السطر الثاني من الكود
كود PHP:ObjectCreate("dX01_ValueRGE1", OBJ_LABEL, 0, 1, 0);
ObjectSetText("dX01_ValueRGE1", " " + DoubleToStr(AccountBalance(),2),12, "", clrOrange);
ObjectSet("dX01_ValueRGE1", OBJPROP_CORNER,1);
ObjectSet("dX01_ValueRGE1", OBJPROP_XDISTANCE, 20);
ObjectSet("dX01_ValueRGE1", OBJPROP_YDISTANCE, 40);
ObjectCreate("dX01_LabelRGE5", OBJ_LABEL, 0, 0, 0);
ObjectSetText("dX01_LabelRGE5", "BALANCE",12, "", clrOrange);
ObjectSet("dX01_LabelRGE5", OBJPROP_CORNER,1);
ObjectSet("dX01_LabelRGE5", OBJPROP_XDISTANCE,130);
ObjectSet("dX01_LabelRGE5", OBJPROP_YDISTANCE,40);
كود PHP:ObjectCreate("dX01_ValueRGE11", OBJ_LABEL, 0, 1, 0);
ObjectSetText("dX01_ValueRGE11", " " + DoubleToStr(profit(),2),12, "", clrOrange);
ObjectSet("dX01_ValueRGE11", OBJPROP_CORNER,1);
ObjectSet("dX01_ValueRGE11", OBJPROP_XDISTANCE, 20);
ObjectSet("dX01_ValueRGE11", OBJPROP_YDISTANCE, 80);
ObjectCreate("dX01_LabelRGE12", OBJ_LABEL, 0, 0, 0);
ObjectSetText("dX01_LabelRGE12", "Profit ",12, "", clrOrange);
ObjectSet("dX01_LabelRGE12", OBJPROP_CORNER,1);
ObjectSet("dX01_LabelRGE12", OBJPROP_XDISTANCE,130);
ObjectSet("dX01_LabelRGE12", OBJPROP_YDISTANCE,80);
كود PHP:double profit()
{
double pr_2=0;
for(int p=0;p<OrdersTotal();p++){
if(OrderSelect(p,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol()){
pr_2=pr_2+OrderProfit();
}
}return(pr_2);
}
أرجو أن تكون فكرتي واضحة فطلبي هذا سوف يخدم غالبية من يتجه للتداول الآلي وتصميم الإكسبرتات
لكم جميعا كل الود
أخوكم أمجد
- 29-10-2016, 11:01 AM #4
جرب هدا
وضع علامة صح على Visual mode اثناء الاختبار
كود:int OnInit() { GlobalVariableSet("loss",0); ObjectCreate("dX01_ValueRGE1", OBJ_LABEL, 0, 1, 0); //////////////////// // باقي الكود return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { Comment(""); } void OnTick() { double max=GlobalVariableGet("loss"); if(Profit()<max){GlobalVariableSet("loss",Profit());Print(max+" أقصى خسارة عائمة هي");} Write(max); //////////////////////////////////////////////////////////////////////////////////// // باقي الكود } double Profit() { double n=0; int G = OrdersTotal(); for (int i = 0 ; i < G ; i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){ if (OrderSymbol()==Symbol() && (OrderType()==OP_BUY || OrderType()==OP_SELL)) { n=n+OrderProfit(); } } } return(n); } void Write(double Maxloss) { ObjectSetText("dX01_ValueRGE1", " " + DoubleToStr(Maxloss,2),12, "", clrOrange); ObjectSet("dX01_ValueRGE1", OBJPROP_CORNER,1); ObjectSet("dX01_ValueRGE1", OBJPROP_XDISTANCE, 20); ObjectSet("dX01_ValueRGE1", OBJPROP_YDISTANCE, 40); ObjectCreate("dX01_LabelRGE5", OBJ_LABEL, 0, 0, 0); ObjectSetText("dX01_LabelRGE5", "Maximum drawdown =",12, "", clrOrange); ObjectSet("dX01_LabelRGE5", OBJPROP_CORNER,1); ObjectSet("dX01_LabelRGE5", OBJPROP_XDISTANCE,130); ObjectSet("dX01_LabelRGE5", OBJPROP_YDISTANCE,40); }آخر تعديل بواسطة tradingsystem ، 29-10-2016 الساعة 11:17 AM
- 30-10-2016, 01:27 AM #5
الله يعطيك العافية ومجهود تشكر عليه من الصميم أخي الفاضل ، لقد ظهر أثناء الاختبار ويعمل بشكل صحيح بغض النظر عن تنسيقه فهو ما سأعمل عليه ليكون مع مجموعة المعلومات التي على الشارت ، ولكن ما لفت انتباهي أنه بمجرد أن انتهى الاختبار اختفى تماما من على الشارت وهو خطأ فالمفترض أن يبقى مثل مثيلاته من المعلومات التي بالزاوية اليمنى العلوية بالشارت المرفق في مشاركة سابقة
لكم جميعا كل الود
أخوكم أمجد
- 30-10-2016, 10:18 AM #6
هل الكود ObjectDelete مكتوب عندك ؟
أنا بالبداية كتبته بالكود ثم محيته ولا اعرف هل اخذت الكود قبل التعديل ام بعده.
كود:void OnDeinit(const int reason) { ObjectDelete("dX01_ValueRGE1"); }
كود:int OnInit() { GlobalVariableSet("loss",0); ObjectCreate("DD", OBJ_LABEL, 0, 1, 0); //////////////////// // باقي الكود return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { } void OnTick() { double max=GlobalVariableGet("loss"); if(Profit()<max){GlobalVariableSet("loss",Profit());Print(max+" أقصى خسارة عائمة هي");} Write(max); //////////////////////////////////////////////////////////////////////////////////// // باقي الكود } double Profit() { double n=0; int G = OrdersTotal(); for (int i = 0 ; i < G ; i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){ if (OrderSymbol()==Symbol() && (OrderType()==OP_BUY || OrderType()==OP_SELL)) { n=n+OrderProfit(); } } } return(n); } void Write(double Maxloss) { ObjectSetText("DD", " " + DoubleToStr(Maxloss,2),12, "", clrOrange); ObjectSet("DD", OBJPROP_CORNER,1); ObjectSet("DD", OBJPROP_XDISTANCE, 20); ObjectSet("DD", OBJPROP_YDISTANCE, 40); ObjectCreate("DD", OBJ_LABEL, 0, 0, 0); ObjectSetText("DD", "Maximum drawdown =",12, "", clrOrange); ObjectSet("DD", OBJPROP_CORNER,1); ObjectSet("DD", OBJPROP_XDISTANCE,130); ObjectSet("DD", OBJPROP_YDISTANCE,40); }
وجرب استعمل هذا الكود لانه ربما يوجد مؤشر اخر على الشارت بنفس الاسم dX01_ValueRGE1 يشوش عليه.آخر تعديل بواسطة tradingsystem ، 30-10-2016 الساعة 10:27 AM
- 30-10-2016, 03:57 PM #7
جربته ، تظهر عبارة maximum drawdown ولكن للأسف لا تظهر القيمة بجانبه ... سأحاول أن أقوم ببعض التعديلات ، ولو في حاجة أسرع من وضع أكثر من كود في أكثر من مكان فهو أفضل بكثير وعلى سبيل المثال ما طرحته في المشاركة رقم 3 ، بحيث أضع كود لحساب الخسارة وهي بكل بساطة الإيكويتي - البالانس وبما أنه تحت الصفر فيحفظه بمتغير ولا يتم تعديل المتغير إلا إذا انخفضت القيمة للخسارة أدنى من الرقم المحفوظ بالمتغير المذكور.
لك تحياتي وتقديري
أخوك أمجد