انواع دادهها در زبان MQL5_مبانی زبان MQL5 _ بخش 2
در دومین مقاله آموزش زبان mql از سری مقالات مرتبط با برنامهنویسی در بازارهای مالی به شرح و بررسی « انواع دادهها در زبان MQL5» میپردازیم. در مقاله پیشین به شرح «انواع فایلهای اجرایی در زبان MQL5 » پرداختیم. و در این بخش موارد را پی میگیریم.
– – –
انواع دادهها در زبان MQL5 – (Data Types)
در این بخش از آموزش زبان mql و بررسی مبانی زبان MQL به بررسی انواع دادهها در زبان ام کیو ال میپردازیم. هر برنامهای با داده کار میکند. دادهها بسته به اهدافشان میتوانند انواع مختلفی داشته باشند.؛
به عنوان مثال، دادهی نوع integer (عدد صحیح یا int) برای دسترسی به اجزای آرایه استفاده میشود. دادههای قیمت به دستهی دادههای با دقت مضاعف با ممیز تعلق پیدا میکنند. و هیچ نوع داده خاصی برای دادههای قیمت در MQL5 تعریف نشده است.
دادهها از انواع مختلف با نرخ های مختلف پردازش می شوند.؛
داده نوع integer (عدد صحیح یا int) در سریعترین زمان ممکن پردازش میشوند. برای پردازش دادههای double (اعشاری)، از یک پردازشگر ویژه استفاده می شود. با این حال، به دلیل پیچیدگی نمایش داخلی دادههای اعشاری، پردازش آنها کندتر از عدد صحیح است.
دادههای String (رشتهای) به دلیل تخصیص/تخصیص مجدد حافظه پویا کامپیوتر در طولانیترین زمان پردازش میشوند.
انواع دادههای پایه یا ساده (basic or simple data types)
- integers (char, short, int, long, uchar, ushort, uint, ulong)
- logical (bool)
- literals (ushort)
- strings (string)
- floating-point numbers (double, float)
- color (color)
- date and time (datetime)
- enumerations (enum)
عدد صحیح (Integer Types)
در MQL5 اعداد صحیح با یازده نوع نشان داده می شوند. برخی از انواع آن را میتوان همراه با انواع دیگر، در صورت نیاز منطق برنامه، استفاده کرد، اما در این مورد لازم است قوانین تایپ کست (type casting) را به خاطر بسپارید.
برای پرداخت بهتر به موضوع در آموزش زبان mql توجه شما را به جدول زیر جلب مینماییم. جدول زیر ویژگیهای هر نوع را نشان میدهد. علاوه بر این، آخرین ستون نوع معادل انواع داده های MQL5 در ++C نمایش میدهد.
مقادیر نوع صحیح را میتوان به صورت ثابتهای عددی، ثابتهای رنگ، ثابتهای زمان، ثابت کاراکتر و enum ارائه کرد.
- numeric constants
- color literals
- date-time literals
- character constants
- enumerations
char ch=12; short sh=-5000; int in=2445777;
از آنجایی که انواع اعداد صحیح بدون علامت برای ذخیره مقادیر منفی طراحی نشدهاند، تلاش برای تنظیم یک مقدار منفی میتواند منجر به پیامدهای غیرمنتظره شود. چنین اسکریپت سادهای منجر به یک حلقه بینهایت میشود.:
//--- Infinite loop void OnStart() { uchar u_ch; for(char ch=-128;ch<128;ch++) { u_ch=ch; Print("ch = ",ch," u_ch = ",u_ch); } }
نوع صحیح این است:
//--- Correct variant void OnStart() { uchar u_ch; for(char ch=-128;ch<=127;ch++) { u_ch=ch; Print("ch = ",ch," u_ch = ",u_ch); if(ch==127) break; } }
// Result: ch= -128 u_ch= 128 ch= -127 u_ch= 129 ch= -126 u_ch= 130 ch= -125 u_ch= 131 ch= -124 u_ch= 132 ch= -123 u_ch= 133 ch= -122 u_ch= 134 ch= -121 u_ch= 135 ch= -120 u_ch= 136 ch= -119 u_ch= 137 ch= -118 u_ch= 138 ch= -117 u_ch= 139 ch= -116 u_ch= 140 ch= -115 u_ch= 141 ch= -114 u_ch= 142 ch= -113 u_ch= 143 ch= -112 u_ch= 144 ch= -111 u_ch= 145 ...
//--- Negative values can not be stored in unsigned types uchar u_ch=-120; ushort u_sh=-5000; uint u_in=-401280;
نوع منطقی (logical)
نوع boolean
نوع bool برای ذخیره مقادیر منطقی درست یا نادرست در نظر گرفته شده است، نمایش عددی آنها به ترتیب 1 یا 0 است.
bool a = true; bool b = false; bool c = 1;
نمایش داخلی یک عدد کامل 1 بایت بزرگ است. لازم به ذکر است که در عبارات منطقی می توانید از انواع صحیح یا واقعی دیگر یا عبارات این نوع استفاده کنید – کامپایلر هیچ خطایی ایجاد نمی کند. در این مورد، مقدار صفر به عنوان نادرست، و سایر مقادیر – به عنوان درست تفسیر می شود.
int i=5; double d=-2.5; if(i) Print("i = ",i," and is set to true"); else Print("i = ",i," and is set to false"); if(d) Print("d = ",d," and has the true value"); else Print("d = ",d," and has the false value"); i=0; if(i) Print("i = ",i," and has the true value"); else Print("i = ",i," and has the false value"); d=0.0; if(d) Print("d = ",d," and has the true value"); else Print("d = ",d," and has the false value"); //--- Execution results // i= 5 and has the true value // d= -2.5 and has the true value // i= 0 and has the false value // d= 0 and has the false value
نوع literals (ushort)
ثابت های کاراکتر (Character Constants)
کاراکترها به عنوان عناصر یک رشته در MQL5 شاخصهایی در مجموعه کاراکترهای یونیکد هستند. آنها مقادیر هگزادسیمال هستند که می توانند به اعداد صحیح ریخته شوند و می توان آنها را با عملیات اعداد صحیح مانند جمع و تفریق دستکاری کرد.
هر کاراکتر منفرد در علامت نقل قول یا یک کد اسکی هگزادسیمال(hexadecimal ASCII code) از یک کاراکتر به عنوان ‘\x10‘ یک کاراکتر ثابت است و از نوع ushort است. به عنوان مثال، یک رکورد از نوع ‘0‘ یک مقدار عددی 30 است که با اندیس صفر در جدول کاراکترها مطابقت دارد.
void OnStart() { //--- define character constants int symbol_0='0'; int symbol_9=symbol_0+9; // get symbol '9' //--- output values of constants printf("In a decimal form: symbol_0 = %d, symbol_9 = %d",symbol_0,symbol_9); printf("In a hexadecimal form: symbol_0 = 0x%x, symbol_9 = 0x%x",symbol_0,symbol_9); //--- enter constants into a string string test=""; StringSetCharacter(test,0,symbol_0); StringSetCharacter(test,1,symbol_9); //--- this is what they look like in a string Print(test); }
کاراکترهای کنترلی (Escape sequence)
بک اسلش یک کاراکتر کنترلی برای یک کامپایلر است که با رشتههای ثابت و ثابتهای کاراکتر در متن اصلی یک برنامه سروکار دارد. برخی از نمادها، به عنوان مثال (‘)، (“)، (\) و کاراکترهای کنترلی را میتوان مطابق جدول زیر به صورت ترکیبی از نمادها نشان داد که با یک بک اسلش (\) شروع میشود:
- اگر بک اسلش با کاراکتری غیر از آنچه در بالا توضیح داده شد دنبال شود، نتیجه تعریف نشده است.
void OnStart() { //--- declare character constants int a='A'; int b='
همانطور که در بالا ذکر شد، مقدار ثابت (یا متغیر) کاراکتر یک ایندکس در جدول کاراکترها است. ایندکس که یک عدد صحیح است، میتوان آن را به روشهای مختلفی نوشت.
void OnStart() { //--- int a=0xAE; // the code of ® corresponds to the '\xAE' literal int b=0x24; // the code of $ corresponds to the '\x24' literal int c=0xA9; // the code of © corresponds to the '\xA9' literal int d=0x263A; // the code of ☺ corresponds to the '\x263A' literal //--- show values Print(a,b,c,d); //--- add a character to the string string test=""; StringSetCharacter(test,0,a); Print(test); //--- replace a character in a string StringSetCharacter(test,0,b); Print(test); //--- replace a character in a string StringSetCharacter(test,0,c); Print(test); //--- replace a character in a string StringSetCharacter(test,0,d); Print(test); //--- codes of suits int a1=0x2660; int b1=0x2661; int c1=0x2662; int d1=0x2663; //--- add a character of spades StringSetCharacter(test,1,a1); Print(test); //--- add a character of hearts StringSetCharacter(test,2,b1); Print(test); //--- add a character of diamonds StringSetCharacter(test,3,c1); Print(test); //--- add a character of clubs StringSetCharacter(test,4,d1); Print(test); //--- Example of character literals in a string test="Queen\x2660Ace\x2662"; printf("%s",test); }
نمایش داخلی یک کاراکتر از نوع ushort است. ثابتهای کاراکتر میتوانند مقادیر 0 تا 65535 را بپذیرند.
نوع رشتهای (String Type)
- نوع رشته برای ذخیره رشتههای متنی استفاده میشود.
- رشته متنی دنبالهای از کاراکترها در قالب یونیکد(Unicode) است که صفر نهایی در انتهای آن قرار دارد.
- یک ثابت رشتهای(string constant) را میتوان به یک متغیر رشتهای(string variable) نسبت داد.
- ثابت رشتهای دنبالهای از کاراکترهای یونیکد(Unicode) است که در گیومههای دوتایی محصور شدهاند.:
// "This is a string constant" //
- اگر نیاز دارید که کاراکتر “ را در یک رشته قرار دهید، میتوانید کاراکتر بک اسلش (\) را قبل از آن قرار دهید. اگر کاراکتر بک اسلش (\) قبل از آنها تایپ شده باشد، میتوان هر ثابت کاراکتر خاصی را در یک رشته نوشت.
string svar="This is a character string"; string svar2=StringSubstr(svar,0,4); Print("Copyright symbol\t\x00A9"); FileWrite(handle,"This string contains a new line symbols \n"); string MT5path="C:\\Program Files\\MetaTrader 5";
- برای خوانایی کد، رشتههای ثابت طولانی را میتوان بدون عملیات اضافه به بخشهایی تقسیم کرد. در طول کامپایل، این بخشها در یک رشته طولانی ترکیب میشوند.:
//--- Declare a long constant string string HTML_head="<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"" " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" "<head>\n" "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n" "<title>Trade Operations Report</title>\n" "</head>"; //--- Output the constant string into log Print(HTML_head); }
توابع از پیش تعریفشدهی رشتهها (Built-in string type methods)
رشتهها را میتوان با توابع رشته(string functions)، توابع تبدیل(conversion functions) و متدهای از پیش تعریفشده(built-in methods) نوع رشته ارائه شده در جدول زیر مدیریت کرد.:
تابع StringAdd
تابع یک زیر رشته (substring) به انتهای رشته اضافه میکند.
bool StringInit( string& string_var, // string to initialize int new_len=0, // required string length after initialization ushort character=0 // symbol, by which the string will be filled );
پارامترهای تابع
تابع StringInit
یک رشته(string) را با نمادهای مشخص شده مقداردهی اولیه میکند و اندازهی رشته(string) مشخص شده را ارائه می دهد.
bool StringInit( string& string_var, // string to initialize int new_len=0, // required string length after initialization ushort character=0 // symbol, by which the string will be filled );
پارامترهای تابع
string_var
[in][out] رشتهای که باید مقداردهی اولیه شده و مقداردهی نهایی شود.
new_len=0
[in] طول رشته پس از مقداردهی اولیه. اگر طول = 0 باشد، رشته را از مقدار اولیه خارج می کند، یعنی بافر رشته پاک می شود و آدرس بافر صفر می شود.
character=0
[in] نماد برای پر کردن رشته.
مقدار خروجی (Return Value)
در صورت موفقیت، مقدار true را بر میگرداند،و در غیر این صورت مقدار false را برمیگرداند. برای دریافت کد خطا میتوانید از تابع ()GetLastError کمک بگیرید.
نکته
اگر character=0 و new_len>0 باشد.:
بافر رشته با طول مشخص شده، توزیع شده و با صفر پر می شود.
طول رشته برابر با صفر خواهد بود، زیرا کل بافر توسط پایان دهندههای رشته پر میشود.
void OnStart() { //--- string str; StringInit(str,200,0); Print("str = ",str,": StringBufferLen(str) = ", StringBufferLen(str)," StringLen(str) = ",StringLen(str)); } /* Result str = : StringBufferLen(str) = 200 StringLen(str) = 0 */
در مقالات بعدی آموزش ام کیو ال، مطالب آموزش انواع دادهها را پی گرفته و دیگر مباحث پایه را شرح خواهیم داد.
همچنین میتوانید از سسله مقالات آموزش مبانی زبان Python سایت جهان بورس استفاده نمایید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.