رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة سمير محمد ارمان
السلام عليكم وكل عام وانتم بخير
سؤال الى استاذى الغالى مستر دولار
او اخى الكريم جميل
عايز اعمل اكسبيرت يعمل على كل شارت الخاص بيه فقط
عندما يتم اغلاق صفقة على خسارة او ربح
هنا يتم اغلاق كل الصفقات الموجوده على هذا الشارت فقط
ويتم العمل من جديد فى فتح صفقات على نفس الشارت
انا كل حاجة عندى تمام فاضل بس هو تصفير العداد بتاع الربح والخسارة
كما مبين
ارجو المساعدة كود PHP:
for( int b=0;b<OrdersHistoryTotal();b++){
OrderSelect(b,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderType()<=1){
double Profit = OrderProfit();
}
}
if(Profit>0||Profit<0){CloseDeleteAll();Profit=0;}//عايز بعد الاغلاق كل الصفقات تكون pofit تساوى صفر
وعليكم السلام ورحمة الله أهلا اخي سمير .
في البداية ملاحظة على الدالة الذي ارفقتها انت مش محتاج لأنه الأصل عايز تحسب البيع والشراء مع بعض فلاداعي لهذه الجزئية واستخدم بدلا من هذا الماجيك .
حسب مافهمت من كلامك ان ماعندك مشكلة في الأغلاق فقط مشكلتك في تصفير الربح الخاص بالزوج ؟؟
اذا الفكرة مختصرة في ان هذا الزوج ، فرضا الدولار ين لديه صفقات مفتوحة وصفقات مغلقة وساتعامل مع هذا الزوج بدالتين على اساس هذه الفكرة وبعيد عن الأزواج الثانية .
الدالة الأولى لأحتساب العقود المفتوحة حاليا على هذا لزوج كالتالي
كود PHP:
int TotalOrder(){
int cnt=0;
for(int i =0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNo){
cnt++;
}
}
}
return(cnt);
}
وركز على أن مستخدم الأكسبيرت يغير الماجيك على كل شارت .
الدالة الثانية هي احتساب الربح للعقود المغلقة كما رأيتها في الدالة التي انت ارفقتها لكن مع التغيير
كود PHP:
double profitxx(){
double c;
for(int i=0;i<OrdersHistoryTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo){
c=c+OrderProfit();
if(TotalOrder()==0) c=0;
}
}
return(c);
}
في داخل الدالة الثانية استدعينا الدالة الأولى
كود PHP:
if(TotalOrder()==0) c=0;
وقلنا اذا كانت العقود الحالية المفتوحة تساوي 0 نصفر عداد الربح ونبتدي من جديد وهكذا بأستمرار ، وتضيف Comment للدالة profitxx حتشوف العداد يتصفر ويعد من جديد .
وحياك الله اخي سمير .
1 مرفق
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة Jmeel
وعليكم السلام ورحمة الله أهلا اخي سمير .
في البداية ملاحظة على الدالة الذي ارفقتها انت مش محتاج لأنه الأصل عايز تحسب البيع والشراء مع بعض فلاداعي لهذه الجزئية واستخدم بدلا من هذا الماجيك .
حسب مافهمت من كلامك ان ماعندك مشكلة في الأغلاق فقط مشكلتك في تصفير الربح الخاص بالزوج ؟؟
اذا الفكرة مختصرة في ان هذا الزوج ، فرضا الدولار ين لديه صفقات مفتوحة وصفقات مغلقة وساتعامل مع هذا الزوج بدالتين على اساس هذه الفكرة وبعيد عن الأزواج الثانية .
الدالة الأولى لأحتساب العقود المفتوحة حاليا على هذا لزوج كالتالي
كود PHP:
int TotalOrder(){
int cnt=0;
for(int i =0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNo){
cnt++;
}
}
}
return(cnt);
}
وركز على أن مستخدم الأكسبيرت يغير الماجيك على كل شارت .
الدالة الثانية هي احتساب الربح للعقود المغلقة كما رأيتها في الدالة التي انت ارفقتها لكن مع التغيير
كود PHP:
double profitxx(){
double c;
for(int i=0;i<OrdersHistoryTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo){
c=c+OrderProfit();
if(TotalOrder()==0) c=0;
}
}
return(c);
}
في داخل الدالة الثانية استدعينا الدالة الأولى
كود PHP:
if(TotalOrder()==0) c=0;
وقلنا اذا كانت العقود الحالية المفتوحة تساوي 0 نصفر عداد الربح ونبتدي من جديد وهكذا بأستمرار ، وتضيف Comment للدالة profitxx حتشوف العداد يتصفر ويعد من جديد .
وحياك الله اخي سمير .
السلام عليكم اخى الكريم
وشكرا على المساعدة الكريمة من شخصك الكريم
تم العمل كما قلت
بس بعد اغلاق الصفقات وفتح صفقات اخرى على نفس الشارت بطريقة يدوية فقط
تجد الاكسبيرت يعمل اغلاق الصفقات الموجوده
كما مبين الاكسبيرت فى المرفقات
طريقة العمل
يتم فتح صفقات يدوى على اى شارت
بعد كده يتم وضع الاكسبيرت على هذا الشارت
عند اغلاق اى صفقة من هذه الصفقات على ربح او خسارة يتم اغلاق كل الصفقات الموجوده على هذا الشارت فقط
وعند فتح صفقات بطريقة يدوية على نفس الشارت لا يقوم الاكسبيرت باغلاق هذه الصفقات
حتى تكون فى صفقة خاسرة او رابحة
هذه هى الطريقة المطلوب العمل بيه
وشكرا على المساعدة الكريمة
رد:موضوع مخصص للأسئلة البرمجية
اخي سمير انت ذكرت ان مشكلتك في تصفير عداد الربح فقط وانا فعلا كنت مستغرب وكررت لك السؤال . والسبب ان هذا الشرط غير مقبول لأنه سيغلق اي صفقة حال فتحها .
كود PHP:
if(Profit()>0||Profit()<0){CloseDeleteAll();}
حتى اذا كان الأغلاق يدوي لابد أن يكون الأغلاق مثلا بخسارة او مكسب 10 نقاط او 10 دولار ولكن ليس الصفر .
جرب تعدل هذا الشرط وحيشتغل كما تريد .
1 مرفق
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة سمير محمد ارمان
السلام عليكم اخى الكريم
انا عملت المستحيل
بس مش شغال معى
لو تعرف تعمل لى تعديل على الاكسبيرت اكون شاكر لك
تحياتى لك
أبشر أخي سمير الموضوع بسيط وبدري على المستحيل ، تم تصحيح الأكسبيرت في موضوع اغلاق العقود .
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
وعليكم السلام ورحمة الله وبركاته
ستستخدم الداله
كود PHP:
ObjectGet("name",OBJPROP_PRICE1);
لإستدعاء قيمة الخطوط
name هو إسم الخط أو الترند
و بالنسبه للترند ستستخدم الداله
كود PHP:
ObjectGetValueByShift("name",1);
الرقم 1 هو رقم الشمعه التي تريد معرفة قيمة خط الترند عندها
بالنسبه لهذا المؤشر فهو يستخدم أسماء الخطوط مثل
و يتغير الرقم من 1 إلى 20 أو حسب ما حددت في إعدادات المؤشر عدد القمم و القيعان التي تريد إظهارها
لذلك سيكون سهل أن تستخدم حلقة تبحث في هذه الأسماء لتضع الشروط مثل
كود PHP:
for(int i=1;i<=20;i++)
{
double price=ObjectGet("RES__________"+i,OBJPROP_PRICE1);
if(Close[1]>price)
{
// open buy for example
}
}
شكرا أستاذ اسامه ...
إذا دخل الإكسبيرت بمجرد لمس أحد الخطوط
وأردت ألا يدخل الإكسبيرت صفقه اخرى إلا بعد تحرك السعر عدد معين من النقاط من آخر صفقه ...كيف أعبر عنها جزاك الله خيرا
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة dentist_hussein
شكرا أستاذ اسامه ...
إذا دخل الإكسبيرت بمجرد لمس أحد الخطوط
وأردت ألا يدخل الإكسبيرت صفقه اخرى إلا بعد تحرك السعر عدد معين من النقاط من آخر صفقه ...كيف أعبر عنها جزاك الله خيرا
اهلا دكتور ، تفضل اجابة مؤقته ، نحتاج الى ثلاث اشياء اولا سعر افتتاح الصفقة الأخيرة ثانيا السعر الحالي ثالثا متغير نضع فيه عدد النقاط الفاصلة بين السعر الحالي وسعر آخر صفقة مفتوحة
هذه الدالة لتعود بسعر آخر صفقة لازالت مفتوحة وطبعا حسب نوعها .
كود PHP:
double LastOrderOpenPrice(int type){
for(int i=OrdersTotal()-1; i>=0; i--){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo&&OrderType()==type){
return(OrderOpenPrice());
}
}
return(0);
}
ثم متغير
كود PHP:
extern int LastOrderDef =40;
ثم تضيف الى شرط الشراء او البيع
كود PHP:
if(Close[0]-LastOrderOpenPrice(OP_SELL)>LastOrderDef *Point) { //DoSell();}
طبعا تخلي بالك اين موقع الخطوط من السعر اللحظي .
1 مرفق
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة Jmeel
أبشر أخي سمير الموضوع بسيط وبدري على المستحيل ، تم تصحيح الأكسبيرت في موضوع اغلاق العقود .
السلام عليكم اخى الكريم
كلمة شكر قلية عليك
جزاك الله عنى خير على المساعدة الكريمة
وانت تساعدنى وانا ايضا احاول اصل الى الطريقة وتم ايضا الوصول الى الطريقة
كما موجود فى الاكسبيرت فى المرفقات
شكر وتقدير لك على المساعدة الكريمة
تحياتى لك
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة kira-h
تحياتي أساتذتي الكرام
أريد دالة تعمل كالتالي
عند كل تحقق ربح 10% من الحساب يتم إضافة رقم إلى الماجيك نمبر
مثلا الماجيك نمبر 4561 فإذا تحقق ربح 10% يصبح الماجيك نمبر الجديد 4562 وإذا تحقق ربح 10% مرة الأخرى يصبح الماجيك نمبر 4563 وهكذا...
إذا كانت هذه الدالة غير موجودة فما هي الدالة التي تحقق ما يلي:
عند كل ربح 10% من الحساب يتوقف عمل الاكسبيرت
إلى أن أتدخل يدويا مثلا بإعادة تشغيل المنصة أو بتغيير الماجيك نمبر ليعمل الاكسبيرت مرة أخرى
وهكذا...
وجزاكم الله خيرا
اقتباس:
المشاركة الأصلية كتبت بواسطة Jmeel
اهلا اخي حسن تفضل هذا الكود تضعه في دالة ستارت
كود PHP:
double accv=(AccountEquity()-AccountBalance());
if(Win_PercenStop &&(( accv/AccountBalance() )*100 ) >=WinPercent ) { MagicNo=MagicNo+1; Delete_Close_AllOrders();}
Comment(MagicNo);
وطبعا حيكون عندك هذا الكود في المتغيرات
كود PHP:
bool Win_PercenStop=true;
double WinPercent=3;
كلما يحقق نسبة الربح سيغلق العقود ويبتدي من جديد بماجيك مضاف اليه الرقم 1 كما فهمت من شرحك .
أستاذ جميل جزاك الله خيرا على المساعدة
بالنسبة للدالة قمت بتجربتها ولاحظت أنه مثلا إذا حصلت خسارة ثم تحقق نسبة الربح يتم الاغلاق وهذا ما لا أريده
أريد دالة تعمل حسب المثال التالي للتوضيح
لدينا رأس مال 1000 دولار ثم حددنا الربح 20% أو 200 دولار
إذن عند تحقق أول ربح 200 دولار أي البالنس أصبح 1200 دولار يتم الاغلاق وتغيير الماجيك نمبر
عند تحقق البالنس 1400 دولار يتم الاغلاق وتغيير الماجيك نمبر
عند تحقق البالنس 1600 دولار يتم الاغلاق وتغيير الماجيك نمبر
وإذا مثلا انخفض البالنس إلى 800 دولار ينتظر الاكسبيرت تحقق البالنس 1800 دولار ويتم الاغلاق وتغيير الماجيك نمبر ...
وهكذا...
يمكن عمل دالة تحديد البالنس وإضافة دالة إيقاف عمل الاكسبيرت ثم أتدخل يدويا في تغيير الماجيك نمبر والبالنس
لكن أريد عمل باكتيست للطريقة!!! هذا هو الهدف الأساسي
بانتظارك وبارك الله فيك
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة Jmeel
اهلا دكتور ، تفضل اجابة مؤقته ، نحتاج الى ثلاث اشياء اولا سعر افتتاح الصفقة الأخيرة ثانيا السعر الحالي ثالثا متغير نضع فيه عدد النقاط الفاصلة بين السعر الحالي وسعر آخر صفقة مفتوحة
هذه الدالة لتعود بسعر آخر صفقة لازالت مفتوحة وطبعا حسب نوعها .
كود PHP:
double LastOrderOpenPrice(int type){
for(int i=OrdersTotal()-1; i>=0; i--){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo&&OrderType()==type){
return(OrderOpenPrice());
}
}
return(0);
}
ثم متغير
كود PHP:
extern int LastOrderDef =40;
ثم تضيف الى شرط الشراء او البيع
كود PHP:
if(Close[0]-LastOrderOpenPrice(OP_SELL)>LastOrderDef *Point) { //DoSell();}
طبعا تخلي بالك اين موقع الخطوط من السعر اللحظي .
جزاك الله خيرا أخي جميل و لو تسمح أخي توضحلى قصدك بموقع الخطوط من السعر اللحظي أكون شاكر .
أنا مثلا إذا اردت أن يكون السعر أسفل خط مقاومه و متجه من أسفل لأعلى أضع ف الشروط أن يكون
Open[0] أقل من الخط ثم إذا كان السعر Close[0] أكبر من أو يساوي خط المقاومه يتم فتح بيع ..
1 مرفق
رد:موضوع مخصص للأسئلة البرمجية
توجد رساله خطأ تظهر عند فتح اى ملف بأمتداد mql4 لا اعرف السبب ولا استطيع فتح اى ملف وقراءته بسبب ذلك الخطأ كما فى الصوره