النتائج 1 إلى 15 من 35
- 22-04-2013, 08:03 PM #1
...@@ مساعده في كتابة كود برمجي @@...
السلام عليكم ورحمة الله وبركاته
انا الان تواجهني مشكله برمجيه وحاولت ان احلها لكن لم اوفق الي حل
المشكله لها شقين الشق الاول
هذا الشرط
هو عبارة عن شرط الدخول في صفقة الشراء علي حسب المتغيرات الموضحه في الجمله المشكله ان هذا الشرط قد يتحقق كل شمعه او شمعه وشمعه علي حسب المعادلات المحدده لقيمة المتغيراتفي الشرط والان انا اريده ان يفتح امر شراء واحد فقط عند تحقق الشرط لكن لا يمنع فتح امر شراء اخر علي شمعه اخري اذا توافقت الشروط ايضا بمعني انه هنا يقبل بفتح اوامر شراء متعدده كلماتحقق الشرط لكن عند تحقق الشرط يفتح امر واحد فقط في الشمعه الواحده واذا تحقق الشرط علي شمعه اخري يفتح ايضا امر شراء واحد فقط وهكذاكود:if (can>=stepdeviation && Close[0] ==(buypoint-9*Point)) { OrderSend(Symbol(),OP_BUY,lotsize,Ask,3,0,0,"",magicn,0,Green); {
هذا كان الشق الاول
وطبعا الشق الثاني مرتبط بالمشكله الاولي بمعني انه بعد ان يفتح الاكسبيرت مثلا 10صفقات شراء وكلها لها نفس الماجيك نمبر وعلي نفس الزوج كيف اختار من الصفقات العشره صفقه واحده فقط لكي اعدل عليها دون المساس بالباقي اي انه كيف اختار مثلا الصفقه السابعه او الرابعه لاعدلها او اغلقها وليس الباقين ؟؟؟؟؟؟
هذه هي المشكله التي تواجهني الان وحاولت ان ابتكر لها دوال خارجيه لتعد الاوامر او تمنع التكرار ولكن لم اصل الي حل
فأرجو المساعده جازاكم الله خيرا
والسلام عليكم ورحمة الله وبركاته
- 22-04-2013, 08:54 PM #2
السلام عليكم
من الافضل اخى انك تنقل الموضوع لمنتدى الاكسبرتات هتلاقى الحل على الفور
https://forum.arabictrader.com/f31.html
تحياتى
- 22-04-2013, 08:59 PM #3
- 23-04-2013, 12:39 AM #4
رد:...@@ مساعده في كتابة كود برمجي @@...
الأخ كاش جاوبك على سؤال منع تكرار الصفقة في نفس الشمعة اما بالنسبة للشق الثاني فهو ان تضيف متغير مع المتغيرات :
بعدها حتعمل حلقة لأختيار الصفقة من خلال رقم التكت :كود PHP:extern int Ticketa=0;
بعدها حتستدعي الصفقة :كود PHP:int Ticket(int type)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()==type)
return(OrderTicket());
}
return(-1);
}
كود PHP:if ( Ticket(OP_BUY)==Ticketa) // نفذ التعديل المطلوب
- 23-04-2013, 04:36 AM #5
رد:...@@ مساعده في كتابة كود برمجي @@...
وعليكم السلام ورحمة الله وبركاته
الجزء الثاني من السؤال
يمكنك عمل دالة تعد عدد الأوامر المفتوحه وتختار أي أمر منهم
مثال
سوف أقوم بعمل دالة تغلق رقم الأمر الذي أريده
والمتغير Num ستضع رقم الصفقه التي تريد إغلاقها أو مثلا إذا قمت بتغيير الداله حسب الأمر الذي تريدهكود PHP:void CloseSelectedOrder(int Num)
{
int OrderNumber;
for (int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol())
{
OrderNumber++;
if(OrderNumber!=Num)continue;
if (OrderType()==OP_SELL)
{
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,digits),3*Q);
}
if (OrderType()==OP_BUY)
{
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,digits),3*Q);
}
}
}
}
بالنسبه للسؤال الأول فكما أخبرك الأخ ecash
- 23-04-2013, 01:19 PM #6
السلام عليكم ورحمة الله وبركاته
فعلا الكلمات لا توفي حقكم جعل الله عملكم هذا في ميزان حسناتكم .................... اشكركم جدا علي المساعده جاري التنفيذ وتجرب الدوال و بعدها عرض النتائج ان شاء الله
- 23-04-2013, 09:57 PM #7
السلام عليكم ورحمة الله وبركاته
بعد التجربه للكواد المقترحه وجدت الاتي
للاسف الاكسبيرت بالرغم من وجود متغير الزمن في شرط الدخول الاانه يكرر فتح الاوامر ولكن بصوره عشوائيه بمعني انه يفتح صفقتين او ثلاثه قبل ان يتوقف عن فتح الصفقات عند هذه النقطه
هذا اولا
ثانيا الاكواد التي ذكرها كل من الاخ الفاضل جميل ومستر دولار
كود الاخ جميل هو متغير خارجي اضع به رقم التيكيت للصفقه ............ لكن انا اريد الاكسبيرت يتعرف علي الصفقه من نفسه بدون تدخل مني مطلقا وفقا لشروط الاكسبيرت
كود الاخ المبجل مستر دولار ايضا يترك المتغير num لاعطيه رقم الصفقه التي اريد ان اغلقها وكما وضحت اريد الاكسبرت بنفسه يختار بدون تدخل مني
واخيرا هذا هو الكود الكامل للاكسبيرت بكل معادلاه ومتغيراته وبه الدوال صحيحه لفتح الاوامر وهو يفتح اوامر البيع والشراء بتكرار و ليست مره واحده بالرغم من اضافة متغيرفارجو الاطلاع عليه ولا يهم قيم المعادلات لانها لن تؤثر علي عملية فتح الاوامر حتي الان لانه لم تدخل في الدوال بعد لذلك يمكن تجاهلها تماما والتركيز علي شروط فتح الصفقه فقط ....... ومازال الاكسبيرت يفتح اكثر من صفقه واحده في المره الواحدهكود:t!= Time[0]
ارجو مراجعته جازاكم الله خيرا
كود://+------------------------------------------------------------------+ //| number.mq4 | //| Copyright 2013, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright 2013, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" extern double magicn = 2013; extern double lotsize = 0.01; extern double dlotsize = 0.02; extern double stepdeviation= 4; //// sell orders with dubled lot double sellpoint ; double doblebuy ; double sellstop ; double sellprofit ; double doblebuystop ; double doblebuyprofit ; //// buy orders with dubled lot double buypoint; double doblesell; double buystop ; double buyprofit ; double doblesellstop ; double doblesellprofit; double i ; double point; int digits,Q; datetime t; double can ; int init() { if(Digits==5||Digits==3) {Q=10;} else {Q=1;} if(Digits<4) { point=0.01; digits=2; } else { point=0.0001; digits=4; } return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if (Close[1]>Open[1]) { ///sell orders conditions in up candle can = (High[1]-Low[1])*10000; sellpoint = NormalizeDouble((High[1]+((High[1]-Close[1])*Point)),Digits); doblebuy = NormalizeDouble((sellpoint+ ((Close[1]-Open[1])*Point)),Digits); sellstop = doblebuy; sellprofit = NormalizeDouble(((High[1]-Open[1])*Point),Digits); doblebuystop = NormalizeDouble((doblebuy- (((High[1]-Low[1])/2)*Point)),Digits); doblebuyprofit = NormalizeDouble((doblebuy+(((High[1]-Low[1])/2) *Point)),Digits); //// buy orders conditions in up candle buypoint = NormalizeDouble((Low[1]-((Open[1]-Low[1])*Point)),Digits); doblesell = NormalizeDouble(((buypoint -((Close[1]-Open[1])*Point))),Digits); buystop = doblesell; buyprofit = NormalizeDouble((((Open[1]-Low[1])*Point)),Digits); doblesellstop = NormalizeDouble(((doblesell+((High[1]-Low[1])/2)*Point)),Digits); doblesellprofit = NormalizeDouble((( doblesell-((High[1]-Low[1])/2) *Point)),Digits); ////////////in up candle /////////// if ( Close[1]>Open[1]&&Close[0]==buypoint&&t!=Time[0]&&can>=stepdeviation) { OrderSend(Symbol(),OP_BUY,lotsize,Ask,3,0,0,"",magicn,0,Green); t=Time[0]; } if ( Close[1]>Open[1]&&Close[0]==sellpoint&&t!=Time[0]&&can>=stepdeviation) { OrderSend(Symbol(),OP_SELL,lotsize,Bid,5,0,0,"",magicn,0,Red); } } return(0); } //+------------------------------------------------------------------+
- 23-04-2013, 10:46 PM #8
رد:...@@ مساعده في كتابة كود برمجي @@...
زميلي العزيز تفضل تم اصلاح التكرار ، يظل عندك مشكلة في معادلات استخراج الأستوب والهدف .
- 23-04-2013, 11:44 PM #9
السلام عليكم ورحمة الله وبركاته
اولا اخي الفاضل زميلي العزيز دي فعلا مكانه لا استحقها فيمكنك ان تناديني تلميذي العزيز سوف تكون مناسبه لانني مازلت اتعلم منك ومن اخرين
ثانيا بخصوص الكود الذي عدلته انت لماذا في دالة البيع ذكرت ان
في جسد جملة شرط الشراء ولم تذكره في جسد جملة شرط البيعكود:T=Time[0]
هذه نقطه
والنقطه الثانيه والاهم
للاسف الاكسبيرت توقف عن فتح اي صفقات شراء تماما ولا يفتح الا ثلاث صفقات بيع فقط بالرغم من تحقق الشروط للبيع والشراء
لذلك التعديلات التي غيرتها اخي الكريم لم تصلح المشكله لكن جعلته يتوقف عن فتح الاوامر ......
وبالنسبه لباقي المعادلات نعم انا لم اراجع الاهداف والاستوبات لانني افضل بناء الاكسبيرت جزء جزء حتي اتجنب اي خطأ يمكن ان يحدث فبمعدما انتهي من مشكله فتح واختيار الاوامر سوف ادقق في الاستوب كما طلبت من ياخي الكريم لاعرف اين يوجد الخطأ
لذلك ارجو مراجعة الكود مره اخري لانه فعلا توقف عن فتح صفقات .......آخر تعديل بواسطة batttot ، 23-04-2013 الساعة 11:47 PM
- 24-04-2013, 12:04 AM #10
انا وضعت T!=Time[0] في الشرط الأساسي ةالذي بعده تبتدي المعادلات ولآن امر البيع وأمر الشراء في الأصل تابعين لتحقق هذا الشرط . اما عدم تنفيذ صفقات فهو راجع كما اخبرتك لأخطاء استخراج الأستوب والتارجت من المعادلات لو تلاحظ ستجد انه لم يسجل الأستوب والتارجت مع فتح الصفقة وهنا اساس الخطأ ، وتستطيع استخدام الأمر Comment أو Print للأستوب والتارجت ولاحظ الرقم هل هو مناسب مع سعر البيع او الشراء ؟؟
- 24-04-2013, 12:49 AM #11
اخي الفاضل
انت تقول ان الخطأ في استخراج الاهدف والاستوب ........... انا قمت بمسح كل المتغيرات والمعادلات ولم اترك غير نقطة الشراء
buypoint
ونقطة البيع
sellpoint
وكما تلاحظ ان نقطة الشراء هي سعر الهاي للشمعه مضاف اليه المسافه من الهاي الي الاغلاق لنفس الشمعه
ونقطة البيع هي سعر اللو مطروح منه المسافه من اللو الي الاوبن لنفس الشمعه
والمعادلات صحيحه وقرأ نقاط الدخول جيدا
وهنا طبعا لا مجال لوجود اي خطأ في الاستوب او الهدف لانني في الاساس وضعت فيهم القيمه صفر اي ان الاستوب والهدف = 0
كود:OrderSend(Symbol(),OP_BUY,lotsize,Ask,3,0,0,"",magicn,0,Green);
علي كل حال هذا هو الكود بعد مسح كل المغيرات وترك فقط البيع والشراء فقط لا غير وايضا مازال بنفس العيب لا يفتح اي صفقات حسب الكود الذي كتبته اخي الكريم لان العيب الان في تنفيذ الصفقات ولا دخل له بالهدف والاستوب لان لا وجود لهم من الاساسكود:OrderSend(Symbol(),OP_SELL,lotsize,Bid,5,0,0,"",magicn,0,Red);
فأرجو اخر الكريم ان تقوم مراجعته جازاك الله خيرا
كود://+------------------------------------------------------------------+ //| number.mq4 | //| Copyright 2013, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright 2013, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" extern double magicn = 2013; extern double lotsize = 0.01; extern double dlotsize = 0.02; extern double stepdeviation= 4; //// sell orders with dubled lot double sellpoint ; //// buy orders with dubled lot double buypoint; double i ; double point; int digits,Q; datetime T; double can ; int init() { if(Digits==5||Digits==3) {Q=10;} else {Q=1;} if(Digits<4) { point=0.01; digits=2; } else { point=0.0001; digits=4; } return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if (T!=Time[0] && Close[1]>Open[1]) { ///sell orders conditions in up candle can = (High[1]-Low[1])*10000; sellpoint = NormalizeDouble((High[1]+((High[1]-Close[1])*Point)),Digits); //// buy orders conditions in up candle buypoint = NormalizeDouble((Low[1]-((Open[1]-Low[1])*Point)),Digits); ////////////in up candle /////////// if ( Close[1]>Open[1]&&Close[0]==buypoint && can>=stepdeviation) { OrderSend(Symbol(),OP_BUY,lotsize,Ask,3,0,0,"",magicn,0,Green); T=Time[0]; } if ( Close[1]>Open[1]&&Close[0]==sellpoint&&can>=stepdeviation) { OrderSend(Symbol(),OP_SELL,lotsize,Bid,5,0,0,"",magicn,0,Red); } T=Time[0]; } return(0); } //+------------------------------------------------------------------+
- 24-04-2013, 01:20 AM #12
رد:...@@ مساعده في كتابة كود برمجي @@...
ولايهمك تفضل هذا الكود قمت بترتيب وتنظيم شكل الأكسبيرت وأوقفت اكواد المعادلات القديمة ووضعت شروط بسيطة للتأكيد وستلاحظ انه لايفتح الا امر واحد مع اتجاه الشمعة السابقة هذا اولا . بالأضافة الى ترتيب الجمل والأقواس .
ثانيا اضفت لك برنت لكل معادلة قديمة ستشغلها بعد ان تتأكد من صحة الأكسبيرت وتعمل من نسخة تانية تجرب عليها وتبتدي كود بعد كود ، تشوف برنت الكود مثلا صفقة شراء هل التارجت اعلى السعر والأستوب اسفل السعر ام لا وبغير هذه الحالة لن يعمل . او تضعها صفر . وهكذا حتى تصل الى الحل بالصبر .آخر تعديل بواسطة Jmeel ، 24-04-2013 الساعة 01:22 AM
- 24-04-2013, 01:50 AM #13
اخي الفاضل يبدو انه هناك سوء تفاهم ................. اخي الكريم لماذا تصمم علي وضع استوب لوز و تيك بروفيت انا قلت لنترك هذا الاختيار تماما الان ونجعل الهدف والاستوب =0
اخي الفاضل
لماذا قمت بالغاء شرط نقطة الدخول .؟؟؟؟؟؟؟؟؟ ات بذلك حولت الاكسبريت الي مجرد اكسبيرت لفتح صفقة شراء مع الشمعه الصاعده وصفقة بيع مع الشمعه الهابطه وكما تلاحظ ان هذا الاكسبيرت قمت بتصميمه انا من قبل علي ان يكون مشروع التخرج ......
لماذا قمت بالغاء شرط الشراء واضفت هدف واستوب اخي الكريم
انا اريد اني ييبيع ويشتري من نقطة الشراء التي الغيتها او من نقطة البيع التي الغيتها ايضا ..............ارجو التوضيح لهذا النقطه لان السطور التي قمت بالغائها هي الاساس في عمل الاكسبيرت وبدلا منها وضعت اوامر للهدف والاستوب
اخي الكريم انا لا اريدوضع هدف واستوب للصفقات اريد تركها كما هي وارداني يفعل البيع والشراء من نفقطة البيع ونقطة الشراء....... والنقطتين محسوبتين بدقه وتأكدت من الحسابات اكثر من مره
فلماذا قمت بالغائهم .....................
- 24-04-2013, 04:34 AM #14
رد:...@@ مساعده في كتابة كود برمجي @@...
الفكرة دائما عندما تجد خطأ في إكسبرت حاول تبسيط الكود على أقصى تقدير ثم تبحث عن الخطأ في كل جزء حتى تصل إلى الحل هذا ما قام بعمله الأخ جميل فإذا أردت أن تعيد الشروط الأساسيه مره أخرى فبالتالي النتيجه ستكون صحيحه
بالنسبه لطريقته تعريف متغير T وأضاف الشرط T!=Time[0] فهي صحيحه
يوجد طريقة أخرى يمكنك عمل دالة للبحث عن الصفقات والتأكد هل فتحت صفقه في هذه الشمعه أم لا
مثال
ثم ستضيف من ضمن الشروط للبيع والشراءكود PHP:bool IsOrderOpened()
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
if(OrderOpenTime()>=Time[0])return(true);
else if(OrderOpenTime()<Time[0])return(false);
}
}
return(false);
}
if(I
وإذا أردت إضافة الصفقات التي أغلقت من ضمن الشروط أيضا سوف تقوم بعمل داله أخرى لكن ستبحث في الصفقات المغلقه وليس الصفقات المفتوحه لأن الداله السابقه ستبحث في الصفقات المفتوحهكود PHP:if(IsOrderOpened()==false)
بالنسبه للجزء الثاني
حتى تختار صفقة معينه حسب رقمها أيضا نفس فكرة الداله التي قمت بوضعها سابقا سوف تبحث في الصفقات المفتوحه من 0 إلى عدد الصفقات
أنت تريد الصفقه رقم 7 مثلا ستقوم بعمل متغير مثلا
ثم في كل مره يبحث عن الصفقه وتكون بنفس الماجيك نمبر ونفس الشروط يزيد قيمة المتغير حتى يصل إلى رقم الصفقه الذي تريدهكود PHP:int OrderNumber;
كود PHP:int OrderNumber;
for (int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol())
{
OrderNumber++;
if(OrderNumber==7)
{
Print("ticket : ",OrderTicket());
}
}
}
- 24-04-2013, 05:53 AM #15
مرحبا بك أخي ، انا ذهبت في البداية كما هي طريقتي الخاصة للبحث عن حلول لأخطاء بأيسر الطرق فكان البداية هي اضافة كود التايم لايقاف التكرار على الشمعة الواحدة ، بعدها تستطيع أن تعمل على حل مشكلة سعر الدخول فقط وترك الأستوب والهدف بمعنى أن نحل الأشكال مرحليا حتى نفهم ماذا صنعنا وبالتالي يصبح ثابت في ذاكرتنا ، هذا ماقصدت أخي وسأواصل معك حتى نصل إن شاء الله .
الأكثر زيارة
رد مع اقتباس