نوشتن متن و نمایش اسپرد در MQL5 با استفاده از تابع Label
در فرآیند برنامهنویسی اکسپرتها و اندیکاتورها در MQL5، گاهی نیاز پیدا میکنیم که اطلاعاتی خاص را مستقیماً روی نمودار معاملاتی به کاربر نمایش دهیم. این اطلاعات میتواند شامل وضعیت فعلی اکسپرت، مقادیر محاسبهشده توسط اندیکاتور، هشدارهای خاص، یا هر متن دلخواه دیگری باشد که به درک بهتر شرایط بازار یا عملکرد برنامه کمک کند. یکی از بهترین روشها برای انجام این کار، استفاده از اشیاء گرافیکی (Graphical Objects) در متاتریدر است.
Label یکی از انواع این اشیاء گرافیکی است که به طور ویژه برای نمایش متن طراحی شده و قابلیتهای انعطافپذیری بالایی در تعیین موقعیت، فونت، اندازه و رنگ دارد. استفاده مستقیم از توابع مربوط به ایجاد و مدیریت اشیاء گرافیکی (مانند ObjectCreate, ObjectSetInteger, ObjectSetString و…) میتواند کمی پیچیده باشد، به همین دلیل برنامهنویسان اغلب از توابع کمکی (Helper Functions) استفاده میکنند تا این فرآیند را سادهتر کنند.
در ادامه، ما یک تابع کمکی به نام Label را معرفی و کد آن را ارائه میدهیم که کار ایجاد و تنظیم یک شیء Label برای نمایش متن روی نمودار را برای شما بسیار آسان میکند. با استفاده از این تابع، میتوانید تنها با یک فراخوانی، متن مورد نظر خود را روی چارت قرار دهید.
ویدئوی آموزشی: پیادهسازی تابع Label و نمایش اسپرد روی نمودار
برای درک عمیقتر نحوه استفاده از تابع Label که در ادامه کد آن را مشاهده خواهید کرد، و همچنین دیدن پیادهسازی عملی آن برای نمایش متن دلخواه و مقدار لحظهای اسپرد روی نمودار متاتریدر، تماشای ویدیوی آموزشی زیر را به شما توصیه میکنیم. این ویدیو مراحل کار را به صورت بصری توضیح میدهد و شما را برای استفاده از کد و درک بهتر آن آماده میسازد.
تابع کمکی Label برای نمایش متن
تابع Label که در اینجا ارائه شده است، تمام تنظیمات مورد نیاز برای ایجاد یک شیء Label را در خود جای داده است. شما با فراخوانی این تابع و تنظیم پارامترهای آن، میتوانید کنترل کاملی بر ظاهر و موقعیت متن روی نمودار داشته باشید.
کد تابع Label:
bool Label(const long chart_ID=0, // ای دی چارت
const string name="Label", // اسم
const int sub_window=0, // شماره پنجره
const int x=0, // X فاصله محور
const int y=0, // Y فاصله محور
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // انتخاب گوشه چارت
const string text="Label", // متن
const string font="Arial", // فونت
const int font_size=10, // اندازه فونت
const color clr=clrRed, // رنگ
const double angle=0.0, // زاویه نوشته
const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // نقطه اتکا نوشته
const bool back=false, // قرار گرفتن در پشت
const bool selection=false, // قابلیت حرکت
const bool hidden=true, // مخفی شدن از لیست
const long z_order=-1) // اولویت برای کلیک ماوس
{
ResetLastError();
if(ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0)){
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
ChartRedraw();
return(true);
}
else {
Print(__FUNCTION__,
": failed to create => ",name," object! Error code = ",GetLastError());
return(false);
}
}
توضیح پارامترهای اصلی تابع Label:
در اینجا برخی از مهمترین پارامترهایی که هنگام فراخوانی تابع Label باید به آنها توجه کنید، آورده شده است:
chart_ID: شناسه نموداری که میخواهید متن روی آن نمایش داده شود. مقدار 0 همیشه به معنای نمودار فعلی است که اکسپرت یا اندیکاتور روی آن اجرا میشود.
name: یک نام منحصربهفرد برای شیء Label شما. این نام برای شناسایی و مدیریت (مانند حذف یا تغییر خصوصیات) Label در آینده استفاده میشود. استفاده از نامهای توصیفی توصیه میشود.
sub_window: شماره پنجره فرعی نمودار. 0 به معنای پنجره اصلی نمودار (جایی که کندلها نمایش داده میشوند) است. اگر از پنجرههای فرعی برای اندیکاتورها استفاده میکنید، میتوانید شماره مربوط به آن پنجره را وارد کنید.
x و y: موقعیت افقی و عمودی Label بر حسب پیکسل. این مقادیر نسبت به گوشهای که در پارامتر corner مشخص میکنید، محاسبه میشوند.
corner: مشخص میکند که نقطه مرجع برای تعیین موقعیت Label کدام گوشه نمودار باشد (بالا چپ، بالا راست، پایین چپ، پایین راست).
text: رشته متنی که میخواهید روی نمودار نمایش داده شود.
font: نام فونت مورد نظر (مانند “Arial”, “Times New Roman” و…).
font_size: اندازه فونت بر حسب پیکسل.
clr: رنگ متن. میتوانید از ثابتهای رنگی پیشفرض MQL5 (مانند clrRed, clrBlue, clrGreen) یا مقادیر رنگی سفارشی استفاده کنید.
سایر پارامترها مانند angle, anchor, back, selection, hidden و z_order برای تنظیمات پیشرفتهتر ظاهر و رفتار Label استفاده میشوند که میتوانید بر اساس نیاز خود آنها را تغییر دهید.
مثال عملی: نوشتن اندیکاتور نمایش اسپرد
یکی از کاربردهای مفید نمایش متن روی نمودار، نمایش مقادیر لحظهای بازار مانند اسپرد (Spread) جفت ارز یا نماد معاملاتی فعلی است. با استفاده از تابع کمکی Label که کد آن را در بالا مشاهده کردید، به راحتی میتوانید یک اندیکاتور ساده برای نمایش اسپرد بنویسید.
برای این کار، کافیست تابع Label را در کد اندیکاتور خود (مثلاً در تابع OnCalculate که در هر تیک قیمتی یا بارگذاری مجدد اندیکاتور اجرا میشود) فراخوانی کنید. برای دریافت مقدار اسپرد فعلی نماد نیز میتوانید از تابع داخلی MQL5 به نام SymbolInfoInteger با شناسه SYMBOL_SPREAD استفاده کنید.
نحوه فراخوانی تابع Label برای نمایش اسپرد:
فرض کنید میخواهیم مقدار اسپرد را در گوشه بالا سمت راست نمودار با فاصله ۱۵۰ پیکسل از بالا و ۱۵۰ پیکسل از راست، به رنگ مشکی و فونت Arial با اندازه ۱۰ نمایش دهیم. فراخوانی تابع Label
به شکل زیر خواهد بود:
Label(0,"spread",0,150,150,CORNER_RIGHT_UPPER,"Spread : " + IntegerToString(SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)),"Arial",10,clrBlack);
توضیح بخش مربوط به نمایش اسپرد در فراخوانی بالا:
بخش کلیدی در پارامتر text
این فراخوانی است: "Spread : " + IntegerToString(SymbolInfoInteger(_Symbol,SYMBOL_SPREAD))
.
SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)
: این تابع داخلی MQL5 مقدار اسپرد نماد فعلی (_Symbol
) را برمیگرداند. اسپرد معمولاً به صورت عدد صحیح (پوینت) نمایش داده میشود.IntegerToString(...)
: چون تابعLabel
برای پارامترtext
یک رشته متنی نیاز دارد، مقدار عددی اسپرد (که توسطSymbolInfoInteger
برگردانده میشود) با استفاده از تابعIntegerToString
به یک رشته متنی تبدیل میشود."Spread : " + ...
: در نهایت، رشته “Spread : ” به ابتدای مقدار عددی اسپرد اضافه میشود تا متن نهایی نمایش داده شده روی نمودار به صورت “Spread : [مقدار اسپرد]” دیده شود.
با قرار دادن فراخوانی این تابع در منطق اندیکاتور یا اکسپرت خود، میتوانید به صورت پویا و در زمان واقعی، مقدار اسپرد را روی نمودار مشاهده کنید.
نتیجهگیری و کاربردها:
همانطور که دیدید، استفاده از تابع کمکی Label
ابزاری قدرتمند و ساده برای نمایش اطلاعات متنی دلخواه و مقادیر مهم بازار مانند اسپرد مستقیماً روی نمودارهای متاتریدر شماست. تسلط بر این قابلیت، به شما امکان میدهد تا اندیکاتورها و اکسپرتهای کاربردیتر و تعاملیتری بسازید و درک بصری بهتری از عملکرد برنامههای معاملاتی خود داشته باشید.
یادگیری نحوه کار با اشیاء گرافیکی و توابعی مانند Label
، تنها بخشی از دنیای جذاب و گسترده برنامهنویسی در MQL5 است. اگر به ساخت ابزارهای معاملاتی سفارشی، خودکارسازی استراتژیها یا توسعه اکسپرتهای معاملاتی خودتان علاقهمند هستید، یادگیری زبان MQL5 گام بعدی ضروری برای شماست.
اولین قدم در این مسیر را همین حالا بردارید!
برای آشنایی با مفاهیم اولیه برنامهنویسی در MQL5 و شروع به ساخت اولین ابزارهای معاملاتی ساده خود، دوره مقدماتی رایگان اکسپرت نویسی ما را از دست ندهید. در این دوره، با زبان MQL5 آشنا میشوید و یاد میگیرید چگونه محیط برنامهنویسی متاتریدر را بشناسید و کدهای ساده و کاربردی بنویسید.
برای تماشای رایگان دوره مقدماتی اکسپرت نویسی و شروع یادگیری MQL5، روی دکمه زیر کلیک کنید.
گپ و گفت کاربران
اگر سوال یا خطایی در کد مشاهده کردید حتما برامون کامنت کنید تا بررسی شود.
بدون دیدگاه