انواع دادهها در زبان 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 سایت جهان بورس استفاده نمایید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.