مبانی زبان MQL5 _ بخش 2

 

مبانی زبان MQL5 _ بخش 2
مبانی زبان MQL5 _ بخش 2

 

در دومین مقاله‌ی آموزش زبان mql از سری مقالات مرتبط با برنامه نویسی در بازار‌ها‌ی مالی به شرح و  بررسی «انواع داده‌ها در زبان MQL5» می‌پردازیم. در مقاله‌ی پیشین به شرح «انواع فایل‌های اجرایی در زبان MQL5 » پرداختیم. و در این بخش موارد را پی می‌گیریم.

در صورت برقراری شرایط معاملات الگوریتمی در بازار هدف برای اعمال هر یک از این مفاهیم در استراتژی‌های معاملاتی می‌توانید از سفارش کد پایتون، سفارش کد mql و … برای کد کردن و بهینه‌یابی استراتژی‌های معاملاتی خود استفاده کنید. و در عین حال سوای امکان سفارش اکسپرت می‌توانید از سفارش اندیکاتور برای دریافت یک نمایش گرافیکی از محاسبات استراتژی خود بهره ببرید.

– – –

مبانی زبان MQL و انواع داده ها(Data Types)

در این بخش از آموزش زبان mql و بررسی مبانی زبان MQL به بررسی انواع داده‌ها در زبان ام کیو ال می‌پردازیم. هر برنامه‌ای با داده کار می‌کند. داده‌ها بسته به اهداف‌شان می‌توانند انواع مختلفی داشته باشند.؛

به عنوان مثال، داده‌ی نوع integer (عدد صحیح یا int) برای دسترسی به اجزای آرایه استفاده می‌شود. داده‌های قیمت به دسته‌ی داده‌های با دقت مضاعف با ممیز تعلق پیدا می‌کنند. و هیچ نوع داده خاصی برای داده‌های قیمت در MQL5 تعریف نشده است.

داده ها از انواع مختلف با نرخ های مختلف پردازش می شوند.؛

داده‌ی نوع integer (عدد صحیح یا int) در سریع‌ترین زمان ممکن پردازش می‌شوند. برای پردازش داده‌های double (اعشاری)، از یک پردازشگر ویژه استفاده می شود. با این حال، به دلیل پیچیدگی نمایش داخلی داده‌های اعشاری، پردازش آن‌ها کندتر از عدد صحیح است.

داده های String (رشته‌ای) به دلیل تخصیص/تخصیص مجدد حافظه پویا کامپیوتر در طولانی‌ترین زمان پردازش می شوند.

Basic or Simple data types
Basic or Simple data types

انواع داده های پایه یا ساده (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 نمایش می‌دهد.

انواع عدد صحیح (Integer Types)
انواع عدد صحیح (Integer Types)

مقادیر نوع صحیح را می‌توان به صورت ثابت‌های عددی، ثابت‌های رنگ، ثابت‌های زمان، ثابت کاراکتر و enum ارائه کرد.

  •  numeric constants
  • color literals
  • date-time literals
  • character constants
  • enumerations
01-انواع عدد صحیح (Integer Types)
01-انواع عدد صحیح (Integer Types)
02-انواع عدد صحیح (Integer Types)
02-انواع عدد صحیح (Integer Types)
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='$';
   int c='©';      // code 0xA9
   int d='\xAE';   // code of the symbol ®
//--- output print constants
   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);
//--- represent characters as a number
   int a1=65;
   int b1=36;
   int c1=169;
   int d1=174;
//--- add a character to the string
   StringSetCharacter(test,1,a1);
   Print(test);
//--- add a character to the string
   StringSetCharacter(test,1,b1);
   Print(test);
//--- add a character to the string
   StringSetCharacter(test,1,c1);
   Print(test);
//--- add a character to the string
   StringSetCharacter(test,1,d1);
   Print(test);
  }

همانطور که در بالا ذکر شد، مقدار ثابت (یا متغیر) کاراکتر یک ایندکس در جدول کاراکترها است. ایندکس که یک عدد صحیح است، می‌توان آن را به روش‌های مختلفی نوشت.

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) نوع رشته ارائه شده در جدول زیر مدیریت کرد.:

 

01-توابع از پیش تعریف‌شده‌ی رشته‌ها (Built-in string type methods)
01-توابع از پیش تعریف‌شده‌ی رشته‌ها (Built-in string type methods)
02-توابع از پیش تعریف‌شده‌ی رشته‌ها (Built-in string type methods)
02-توابع از پیش تعریف‌شده‌ی رشته‌ها (Built-in string type methods)
03-توابع از پیش تعریف‌شده‌ی رشته‌ها (Built-in string type methods)
03-توابع از پیش تعریف‌شده‌ی رشته‌ها (Built-in string type methods)
04-توابع از پیش تعریف‌شده‌ی رشته‌ها (Built-in string type methods)
04-توابع از پیش تعریف‌شده‌ی رشته‌ها (Built-in string type 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 سایت جهان بورس استفاده نمایید.

3.7 3 رای ها
امتیازدهی به مقاله
0 نظرات
بازخورد (Feedback) های اینلاین
مشاهده همه دیدگاه ها
سبد خرید
هیچ محصولی در سبد خرید وجود ندارد!
خرید را ادامه دهید