النتائج 1 إلى 15 من 10335
الموضوع: موضوع مخصص للأسئلة البرمجية
- 11-12-2007, 07:51 AM #1
موضوع مخصص للأسئلة البرمجية
بسم الله الرحمن الرحيم
الإدارة الكريمة... أعضاء المتداول الكرام: السلام عليكم ورحمة الله وبركاته
بعد إذن إدارتنا الموقّرة ، وبعد إذن أستاذنا الحبيب وضاح عطار
ما رأيكم أن يُخصص هذا الموضوع للأسئلة البرمجية التي تواجه المبرمج أحيانًا؟
فكثيرًا ما تواجهني بعض الأسئلة أثناء قراءتي لبعض الأكواد البرمجية، أو أثناء بحثي عن معلومة معيّنة في الـ MQL4 Documentation ، أو أثناء محاولتي لأداء فكرة معيّنة في مؤشر أو اكسبرت ... إلخ
وبدلاً من التراسل مع أساتذتنا الكبار على الخاص (مثل أستاذي الدكتور حازم FX5، وأستاذنا وضاح، وأستاذنا وليد)، رأيت أن الفائدة ستكون أكبر إن خصّصنا لذلك موضوعًا يجمع التساؤلات والاستفسارات
وأكون شاكرًا لو ثُبّت الموضوع
وجزاكم الله خيرًا
==========================
وضاح عطار ينصحك أيضا بقراءة هذه المواضيع :
- https://forum.arabictrader.com/t37561.html
- https://forum.arabictrader.com/t40966.html
- https://forum.arabictrader.com/t44571.html
==========================آخر تعديل بواسطة وضاح عطار ، 17-03-2009 الساعة 10:07 AM
- 11-12-2007, 08:04 AM #2
رد: موضوع مخصص للأسئلة البرمجية
أهلا بك أخي العزيز
الفكرة جميلة ولكنها مرهقة إذا لم يتكاتف الجميع للرد على السؤال الذي يعرفون جوابه على الأقل .
حتى الشخص الذي يسأل بشكل احترافي فهو مؤكد يستطيع الإجابة عن سؤال آخر .
وهذا ما أقصده هو أن تكون الإجابة من أي شخص قادر عليها .
سأحاول من جهتي قدر الإمكان متابعة الموضوع والإجابة عن كل الأسئلة وخصوصا الصعبة .
ولكن أحتاج أيضا من يساعدني وخصوصا للأسئلة السهلة والمتوسطة .
أيضا يجب ان تكون الأسئلة محددة جدا وغير عامة مثل كيف أصنع مؤشر مثلا .
وأن لا تكون طلبات لصنع مؤشرات أو اكسبيرتات لاستراتيجيات كبيرة .
بالتوفيق إن شاء الله .
- 11-12-2007, 08:07 AM #3
رد: موضوع مخصص للأسئلة البرمجية
فكرة ممتازة أخي الكريم و انا أؤيدها بشدة و ان شاء نجيب على ما استطعنا و نسأل عما لا نعلم
- 11-12-2007, 08:07 AM #4
- 11-12-2007, 08:16 AM #5
رد: موضوع مخصص للأسئلة البرمجية
شكرا لكم جميعا
ولإغناء الموضوع من الآن سأورد فيما يلي أسئلة وردتني من قبل والإجابات التي كتبتها ردا على هذه الأسئلة .
س :
في دورة Codr's Guru وجدت في درس My First Expert Advisor انه استخدم Static ثم حدد نوع الداتا بالـ Int data type .
ووضع هذا الأمر خارج الوظيفة start .
يا تُرى ما هذا الأمر وما هي استخداماته غير المثال المذكور بالكتاب ؟
ج :
بالنسبة للمتحولات في معظم اللغات الحديثة ومنها لغة MQL4 فإنها تنقسم إلى ثلاثة أقسام .
القسم الأول: متحولات محلية Local :
وهي المتحولات التي تم تعريفها داخل الوظيفة Function نفسها ولهذه المتحولات المحلية الميزات التالية :
== يمكن فقط التعامل مع هذه المتحولات المحلية ( قراءة قيمة وكتابة قيمة ) من داخل الوظيفة نفسها .
== لا يمكن التعامل مع هذه المتحولات المحلية من خارج الوظيفة التي تم تعريفهم بها .
== تفقد هذه المتحولات المحلية القيم المخزنة بها بمجرد الخروج من الوظيفة التي تم تعريفهم بها .
== إذا تم تنفيذ الوظيفة مرة أخرى فإن هذه المتحولات المحلية يتم تعريفها من جديد مرة خرى وتأخذ القيم الافتراضية لها بغض النظر عن قيمتها الأخيرة التي وصلت إليها .
الخلاصة :
المتحولات المحلية لا يمكن التعامل معها قراءة أو كتابة إلا من داخل الوظيفة التي تم تعريفهم داخلها .
القسم الثاني: متحولات عامة Global :
وهي المتحولات التي تم تعريفها داخل البرنامج نفسه وليس ضمن أي وظيفة أخرى ولهذه المتحولات العامة الميزات التالية :
== يمكن التعامل مع هذه المتحولات العامة ( قراءة قيمة وكتابة قيمة ) من أي موضع أو وظيفة في البرنامج .
== لا تفقد المتحولات العامة قيمتها أبدا إلا إذا تم الخروج من البرنامج نفسه .
الخلاصة :
المتحولات العامة يمكن التعامل معها قراءة أو كتابة من أي موقع من برنامجك .
القسم الثالث: متحولات ساكنة Static :
وهي مشابهة تماما للمتحولات المحلية ولكن لها ميزة اضافية وفرق أساسي بينها وبين المتحولات المحلية وهذه الميزة هي :
== لا تفقد المتحولات الساكنة قيمتها عند الخروج من الوظيفة التي تم تعريفهم بها .
== عند تنفيذ الوظيفة مرة أخرى تأخذ المتحولات الساكنة آخر قيمة وصلت إليها من التنفيذ السابق .
== لا تفقد المتحولات الساكنة قيمتها بمجرد الخروج من الوظيفة بل تبقى محتفظة بقيمتها دائما .
== أيضا لا يمكن التعامل مع هذه المتحولات الساكنة إلا من داخل الوظيفة نفسها ولا يمكن التعامل معها من خارج الوظيفة .
الخلاصة :
المتحولات الساكنة تشابه المتحولات المحلية في كل شيء ما عدا أنها تحتفظ بقيمتها ولا تفقدها عند الخروج من الوظيفة .
مثال يوضح استخدام وتعريف المتحولات بأنواعها الثلاثة :
كود PHP:
// تعريف متحول عام
int GlobalFlag=10;
int start()
{
// تعريف متحول ساكن أو ستاتيكي
static int tp=70;
// تعريف متحول محلي
int sl=40;
....
return(0);
}
- 11-12-2007, 08:22 AM #6
رد: موضوع مخصص للأسئلة البرمجية
س :
كيف استخدم الأمر datetime وكيف استفيد منه ؟
ج :
بداية فإن datetime لا تعتبر أمرا أي لا يطلق عليها صفة أمر بل هي في الحقيقة تسمى نوع بيانات Data Type
أي أنها تصف نوع البيانات التي ستخزن في المتحول الفلاني .
لدينا أنواع بيانات متعددة .. والمقصود بالبيانات هنا هي المعلومات التي تخزن داخل المتحولات .
فمثلا لدينا بيانات رقمية وبيانات نصية .. والبيانات الرقمية تنقسم إلى بيانات رقمية صحيحة int أو بيانات رقمية بفاصلة double .
كود PHP:// أمثلة على قيم رقمية صحيحة
int a = 10;
int b = 34322;
int c = -9871;
// أمثلة على قيم رقمية بفاصلة عشرية
double a = 12.111;
double b = -956.1007;
double c = 0.0001;
double d = 16;
أما البيانات النصية string فهي عبارة عن نص معين أو سلسلة من الأحرف والأرقام .. والأرقام في هذه السلسلة يعتبرها الكمبيوتر أحرفا أيضا .
أي أنه لا يتعامل معها كأرقام يمكن إجراء عمليات حسابية عليها مثلا .
كود PHP:// أمثلة على قيم نصية
string a = "بسم الله الرحمن الرحيم" ;
string b = www.google.com ;
string c = "12433" ;
هناك أنواع بيانات أخرى ليست رقمية ولا نصية مثل المتحول الزمني datetime وهو محور السؤال هنا .
ووظيفة هذا المتحول هي تخزين قيمة زمنية فيه عبارة عن تاريخ ( سنة شهر يوم ساعة دقيقة ثانية ) .
فمثلا لتعريف متحول زمني نستخدم الكود التالي :
كود PHP:datetime mydate;
// أمثلة على كتابة قيمة زمنية
mydate = D'2007.01.01 00:00' ; // تاريخ بداية السنة الجديدة
mydate = D'1980.07.19 12:30:27' ; // year.month.day hour.minute.second
mydate = D'19.07.1980 12:30:27' ; // day.month.year hour.minute.second
mydate = D'19.07.1980 12' ; // تساوي وتكافيء D'1980.07.19 12:00:00'
mydate = D'01.01.2004' ; // تساوي وتكافيء D'01.01.2004 00:00:00'
mydate = D'12:30:27' ; // تساوي وتكافيء D'[compilation date] 12:30:27'
mydate = D'' ; // تساوي وتكافيء D'[compilation date] 00:00:00'
حيث [compilation date] تكافيء تاريخ ترجمة نص البرنامج إلى كود تنفيذي .
كما لاحظتم فإن القيمة الزمنية ليست نصا من سلسلة أحرف ولا رقما بل هي صيغة محددة لتعيين وتعريف تاريخ وزمن معين .
لا يقبل المتحول الزمني تخزين تاريخ أو زمن خاطيء منطقيا كما يمكن الاستفادة من المتحولات الزمنية بمقارنة متحولين زمنيين
ومعرفة من هو صاحب التاريخ الأكبر مثلا أو هل هما متساويان زمنيا .
ولهذه الأمور استخدامات كثيرة في صنع المؤشرات والاكسبيرتات .
هناك البيانات المنطقية البوليانية Boolean التي تأخذ قيمتين فقط هما الصفر ( false ) أو الواحد ( true ) .
كود PHP:// أمثلة على قيم منطقية
bool a = true ;
bool b = false ;
bool c = 0 ;
هناك أيضا البيانات اللونية والتي من خلالها نستطيع تعريف لون معين .. في الحقيقة اللون هو عبارة عن رقم صحيح .
ولكن عند تعريف متحول خارجي على أنه من النوع لون فإن لغة MQL4 تتيح لنا إختيار اللون الذي نريد من لوحة ألوان جاهزة
دون الحاجة لكتابة رقم اللون والذي لا يكون معروفا لمعظم الناس .
كود PHP:// أمثلة على قيم لونية بصيغة RGB
color a = C'128,128,128' ; // gray
color a = C'0x00,0x00,0xFF' ; // blue
// أمثلة على قيم لونية بأسمائها
color a = Red ;
color a = Yellow ;
color a = Black ;
// أمثلة على قيم لونية بأرقام صحيحة
color a = 0xFFFFFF ; // white
color a = 16777215 ; // white
color a = 0x008000 ; // green
color a = 32768 ; // green
- 11-12-2007, 08:26 AM #7
رد: موضوع مخصص للأسئلة البرمجية
سبحان الله! توارد أفكار عجيب!
لن تصدقني يا أخي وضاح لو أخبرتك أني فتحت الموضوع لأسأل عن معنى الـ Static variables ، لكن لما دخلت الـ Documentation فهمت معناه إجمالاً
وبعدها خطرت لي فكرة الموضوع
- 11-12-2007, 08:29 AM #8
رد: موضوع مخصص للأسئلة البرمجية
س :
قمت ببرمجة إكسبيرت ولكن لا ينفذ أي صفقات عند تحقق الشروط المبنيه عليه, محرر الأكواد لا يظهر لي أي خطأ برمجي ,فما هي الطرق التي من خلالها نعرف سبب هذا الخطأ الغريب ؟
ج :
للأسف فإن لغة MQL4 لا تحتوي مصحح أخطاء Debuger وبالتالي فإننا سنواجه صعوبة في معرفة لماذا لا يقوم المؤشر أو الاكسبيرت بالعمل بالشكل الذي خططناه له .
لذلك وبعد الخبرة فإن أفضل طريقة لعمل Debug يدوي إن صح التعبير هي في استخدام التعليمة Print في أماكن مختارة من البرنامج
وذلك لمعرفة قيمة متحول ما عند نقطة معينة أو معرفة ما إذا كان الشرط الفلاني قد تحقق أم لا .
فمثلا نستطيع استخدام الكود التالي :
كود PHP:Print ( "A= " , A , " B= " , B ) ;
if (A==B)
{
Print ( " تحقق الشرط" );
......
}
لأنك تفترض عقلا أن المتحول A يساوي B ولكن الشرط مع ذلك لم يتحقق
ولكن عند طباعة قيمة المتحولات A و B تجد مثلا أن
المتحول A يساوي 1.1235
والمتحول B يساوي 1.123501
وطبعا فإن قيمة المتحولين ليست متساوية بالنسبة للكمبيوتر .
لذلك تستخدم مثلا وظائف أخرى برمجية لتقريب القيم والتأكد تماما أن القيمتين متساويتين فعلا .
هذا أحد الأمثلة على استخدام الوظيفة Print لعمل تصحيح يدوي .
ولكن قبل ذلك كله يجب أن يكون برنامجك متماسكا ومكتوبا بطريقة صحيحة برمجيا وأن يكون قد ناقش جميع الاحتمالات الممكنة بطريقة
برمجية صحيحة .
فمثلا الوظيفة التي تقوم بفتح صفقة ما في اكسبيرت OrderSend يجب أن تستخدم بطريقة صحيحة تماما لمعرفة لماذا فشلت
ولهذا يجب معرفة أن هذه الوظيفة تعود لنا بقيمة تمثل رقم الصفقة في حال نجحت في فتح الصفقة .
وتعود بقيمة -1 إذا فشلت لأي سبب من الأسباب .
لذلك فإن الاستخدام الخاطيء والشائع والذي لن نعرف من خلاله لماذا فشلت الوظيفة في فتح الصفقة هو على الشكل التالي :
كود PHP:OrderSend(Symbol(),OP_BUY,1,Ask,3,Ask-25*Point,Ask+25*Point,"",16384,0,Green);
أما الاستخدام الصحيح للوظيفة فهي على الشكل التالي :
كود PHP:int ticket;
ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Ask-25*Point,Ask+25*Point,"",16384,0,Green);
if(ticket<0)
{
Print("OrderSend failed with error #",GetLastError());
return(0);
}
في الكود السابق قمنا بفحص القيمة العائدة من الوظيفة وفي حال كانت تساوي -1 فهذا يعني وجود خطأ ما .
ولمعرفة نوع الخطأ قمنا باستخدام الوظيفة GetLastError والتي تعطينا رقم آخر خطأ حدث في البرنامج .
بعد ذلك قمنا بطباعة رقم الخطأ بواسطة الوظيفة Print .
وعندما نشغل الاكسبيرت ولا يقوم بفتح صفقة فإننا سنعرف على الأقل رقم الخطأ المسبب لهذه المشكلة .
ولدينا طبعا جدول بأرقام الأخطاء ومعانيها وهو كالتالي :
كود PHP:ERR_NO_ERROR 0 No error returned.
ERR_NO_RESULT 1 No error returned, but the result is unknown.
ERR_COMMON_ERROR 2 Common error.
ERR_INVALID_TRADE_PARAMETERS 3 Invalid trade parameters.
ERR_SERVER_BUSY 4 Trade server is busy.
ERR_OLD_VERSION 5 Old version of the client terminal.
ERR_NO_CONNECTION 6 No connection with trade server.
ERR_NOT_ENOUGH_RIGHTS 7 Not enough rights.
ERR_TOO_FREQUENT_REQUESTS 8 Too frequent requests.
ERR_MALFUNCTIONAL_TRADE 9 Malfunctional trade operation.
ERR_ACCOUNT_DISABLED 64 Account disabled.
ERR_INVALID_ACCOUNT 65 Invalid account.
ERR_TRADE_TIMEOUT 128 Trade timeout.
ERR_INVALID_PRICE 129 Invalid price.
ERR_INVALID_STOPS 130 Invalid stops.
ERR_INVALID_TRADE_VOLUME 131 Invalid trade volume.
ERR_MARKET_CLOSED 132 Market is closed.
ERR_TRADE_DISABLED 133 Trade is disabled.
ERR_NOT_ENOUGH_MONEY 134 Not enough money.
ERR_PRICE_CHANGED 135 Price changed.
ERR_OFF_QUOTES 136 Off quotes.
ERR_BROKER_BUSY 137 Broker is busy.
ERR_REQUOTE 138 Requote.
ERR_ORDER_LOCKED 139 Order is locked.
ERR_LONG_POSITIONS_ONLY_ALLOWED 140 Long positions only allowed.
ERR_TOO_MANY_REQUESTS 141 Too many requests.
ERR_TRADE_MODIFY_DENIED 145 Modification denied because order too close to
market.
ERR_TRADE_CONTEXT_BUSY 146 Trade context is busy.
ERR_TRADE_EXPIRATION_DENIED 147 Expirations are denied by broker.
ERR_TRADE_TOO_MANY_ORDERS 148 The amount of open and pending orders has reached
the limit set by the broker.
طبعا هناك أخطاء أخرى ولكن هذه الأرقام هي الشائعة .
ويمكن طبعا طباعة رسالة الخطأ مباشرة وليس طباعة رقمها ولكن أفضل حاليا استخدام هذه الطريقة لمزيد من الخبرة والمرونة .
بهذه الطريقة نستطيع معرفة السبب الحقيقي وراء عدم فتح الاكسبيرت لصفقاته لأننا حصلنا على رقم الخطأ الذي حصل .
وغالبا يكون الخطأ نتيجة عدم صحة الأرقام والأسعار المدخلة للوظيفة OrderSend
ويجب القياس بنفس الطريقة على الاستخدامات الهامة الأخرى للوظائف الحيوية الأخرى كتعديل ستوب أو هدف لصفقة ما .
- 11-12-2007, 09:55 AM #9
رد: موضوع مخصص للأسئلة البرمجية
موضوع مميز..
جزاكم الله خيرا..
عندي سؤال..
كيف يمكن التعامل مع الربح/الخسارة الكلية لجميع الصفقات؟
كما في هذه الصورة..
بحيث لو كانت النتيجة موجبة مثلا يقوم الاكسبرت بإغلاق الصفقات؟
وهل يتم التعامل معها باعتبار النقاط.. أم الدولار؟
وجزاكم الله خيرا..آخر تعديل بواسطة Leono ، 11-12-2007 الساعة 09:57 AM
- 11-12-2007, 10:04 AM #10
رد: موضوع مخصص للأسئلة البرمجية
قيمة الربح أو الخسارة المعلّقة لو تلاحظ ستجد أنها الناتج من طرح الـ Equity ناقص الـ Balance
ويكون ناتج الطرح موجبًا في حالة كونها ربحًا معلّقًا
وسالبًا في حالة كونها خسارة معلّقة
يعني مثلاً يمكنك كتابة الكود هكذا:
كود PHP:double floatprofit = AccountEquity()-AccountBalance();
if (floatprofit==100) Close_All();
وليصوب لي أستاذي وضاح
- 11-12-2007, 10:08 AM #11
رد: موضوع مخصص للأسئلة البرمجية
جزيت خيرا يا أبا أيمن المصري..
- 11-12-2007, 07:25 PM #12
رد: موضوع مخصص للأسئلة البرمجية
سؤال جديد..
هل الأصوب عندما نكتب أمر الشراء أن نكتبه بهذا الكود..:
كود PHP:OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,Bid-(StopLoss*Point),Bid+(TakeProfit*Point),"Comment",MagicNo,0,Blue);
كود PHP:OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,Ask-(StopLoss*Point),Ask+(TakeProfit*Point),"Comment",MagicNo,0,Blue);
كود PHP:OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,Ask+(StopLoss*Point),Ask-(TakeProfit*Point),"Comment",MagicNo,0,Red);
كود PHP:OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,Bid+(StopLoss*Point),Bid-(TakeProfit*Point),"Comment",MagicNo,0,Red);
آخر تعديل بواسطة Leono ، 11-12-2007 الساعة 07:30 PM
- 11-12-2007, 09:27 PM #13
- 11-12-2007, 09:58 PM #14
رد: موضوع مخصص للأسئلة البرمجية
شكرا لك أخي أبو أيمن
وفيما يلي إضافات بسيطة لجوابك السابق .
أنت حسبت الربح أو الخسارة من قيمة الرصيد الفعلي ناقص الرصيد النهائي .
وهذه الحالة هي فقط إذا كان الاكسبيرت يعمل هو فقط على الحساب .
أما لو كان الاكسبيرت احترافيا أكثر فيجب أن يحسب فقط ربح أو خسارة صفقاته هو فقط وليس كل الصفقات على الحساب.
فقد يكون هناك صفقات مفتوحة من قبل اكسبيرت آخر أو من قبل صاحب الحساب نفسه .
لذلك نحن نستخدم وظيفة مشابهة لهذه الوظيفة :
كود PHP:double MyOrdersProfit(int Magic)
{
double c=0;
int total = OrdersTotal();
for (int cnt = 0 ; cnt < total ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && (OrderType()==OP_BUY || OrderType()==OP_SELL))
{
c=c+OrderProfit();
}
}
return(c);
}
الناتج هو بالدولار وليس بالنقاط .
تعديل بسيط على الكود الذي أضفته أخي أبو أيمن وهو أن الكود التالي لا يعمل بشكل صحيح :
كود PHP:double floatprofit = AccountEquity()-AccountBalance();
if (floatprofit==100) Close_All();
كود PHP:double floatprofit = AccountEquity()-AccountBalance();
if (floatprofit>=100) Close_All();
أما لو وضعنا اشارة أكبر من أو يساوي فإن الكود عندها سيعمل بشكل صحيح .
- 11-12-2007, 10:10 PM #15
رد: موضوع مخصص للأسئلة البرمجية
شكرا لك أخي العزيز على هذه الإجابة .
وتوضيح أكثر
فإن الشراء دائما هو على سعر Ask والبيع يكون على سعر Bid
في حال عكست الموضوع فإن احتمال عدم تنفيذ الأمر من قبل البروكر عالي جدا .
لأنك طلبت أن تشتري ماركت بسعر مغاير لسعر Ask ولن يقبل تنفيذ الصفقة إلا إذا كان السبريد أقل أو مساوي لقيمة Slipage التي عادة تكون 3 .
وهذا يعني أنك موافق على تنفيذ الصفقة بفارق لا يزيد عن ثلاثة نقاط عن السعر الحالي .
يعني تصور لو كان سعر Ask يساوي 1.2220 وأنت طلبت منه أن يشتري لك ماركت بسعر 1.2215 .
لن يقبل البروكر ذلك وسيرفض لك طلبك أو طلب الاكسبيرت .
لذلك خذها قاعدة وهي أن الشراء على Ask والبيع على Bid . والإغلاق يكون بالعكس .
المواضيع المتشابهه
-
موضوع مخصص للاكسبيرتات اللتي يستخدمها الاعضاء على الحقيقي,,عندك اكسبيرت ممتاز ضعه هنا
By محمد معمو in forum برمجة المؤشرات واكسبرتات التداول - Experts Advisor EAمشاركات: 11آخر مشاركة: 15-12-2023, 02:03 PM -
عااااااااااااجل ( موضوع مخصص للفرص الفورية)!!!
By عاشق الذبذبـة in forum توقعات وتوصيات سوق العملاتمشاركات: 280آخر مشاركة: 27-08-2009, 10:30 PM