icon icon Home
icon icon Accounts
icon icon Quick start
icon icon Symbols

چطور زبان برنامه‌نویسی MQL را یاد بگیریم و اکسپرت و اندیکاتور حرفه‌ای بسازیم؟

نویسنده
شهاب سهرابی
شهاب سهرابی
calendar آخرین بروزرسانی: 28 آذر 1404
watch زمان مطالعه 5 دقیقه

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

bookmark
نکات کلیدی
  • کسب توانایی در شخصی‌سازی ابزارهای معاملاتی، جایگاه شما را از یک کاربر معمولی به یک سازنده استراتژی ارتقا می‌دهد.
  • اگر تحلیل تکنیکال را به خوبی می‌دانید، نگران کدنویسی نباشید؛ تبدیل منطق تحلیلی به MQL بسیار ساده‌تر از یادگیری یک زبان برنامه‌نویسی جدید از صفر است.
  • MQL صرفا یک زبان برنامه‌نویسی نیست؛ بلکه «پلی» استراتژیک میان تحلیل ذهنی شما و اجرای ماشینی است که خطای انسانی را به حداقل می‌رساند.
  • برای تسلط بر MQL، نیازی به ریاضیات پیچیده ندارید؛ آنچه شما نیاز دارید، درک عمیق از رفتار قیمت و داشتن منطق معاملاتی شفاف است.

زبان MQL چیست و چه نقشی در پلتفرم متاتریدر دارد؟

زبان MQL مخفف MetaQuotes Language است و توسط شرکت MetaQuotes برای توسعه ابزارهای سفارشی در متاتریدر ۴ و ۵ طراحی شده است. این زبان شباهت زیادی به زبان برنامه نویسی ++C دارد و امکان برنامه‌ نویسی رویداد محور، کار با داده‌های قیمتی، طراحی الگوریتم‌های معاملاتی و ساخت ابزارهای تکنیکال را فراهم می‌کند. سه خروجی اصلی این زبان عبارتند از:
  • اندیکاتورهای سفارشی (Custom Indicators)؛
  • اکسپرت‌ها (Expert Advisors)؛
  • اسکریپت‌ها (Scripts).
به کمک MQL می‌توان عملیات تحلیل، معامله، مدیریت ریسک و مدیریت سفارش را به‌ صورت خودکار و سیستماتیک اجرا کرد.

کاربردهای زبان MQL در تحلیل، معامله و خودکارسازی استراتژی‌ها

MQL برای موارد زیر به کار می‌رود:
    • تحلیل تکنیکال پیشرفته: محاسبه اندیکاتورها، پردازش داده‌های OHLC، ساخت مدل‌های آماری‌ـ‌محوری و ترکیب داده‌های مالتی تایم‌ فریم؛
  • معاملات خودکار: ثبت سفارش، مدیریت حد ضرر و حد سود، ورود و خروج خودکار از بازار و اجرای الگوریتم‌های مدیریت سرمایه؛
  • ساخت ابزارهای بصری: رسم خطوط، اشکال، هشدارها و ارائه داده‌های اضافی روی چارچوب قیمت؛
  • ساخت اسکریپت‌های تک اجرایی: ابزارهایی مثل بستن تمام معاملات، پاک‌سازی چارت یا جابه‌جایی دسته‌ جمعی حد ضرر.
sms-star

ساخت توابع بازگشتی (Recursive Functions) برای تحلیل‌های پیچیده مانند سطوح فیبوناچی پویا یا شاخص‌های سفارشی کاربرد دارد.

تفاوت MQL با زبان‌های عمومی مثل Python و ++C

اگرچه Python و ++C از قدرتمندترین زبان‌های برنامه‌ نویسی چند منظوره به شمار می‌روند، اما به دلایل زیر MQL به‌ طور چشمگیری عملکرد بهتری در محیط متاتریدر داشته و به زبان غالب این پلتفرم تبدیل شده است:

  • زبان MQL به‌ طور ویژه برای متاتریدر طراحی شده است. به همین دلیل، مستقیماً با هسته معاملاتی پلتفرم ارتباط برقرار می‌کند و همین موضوع باعث می‌شود اجرای دستورها، پردازش داده‌های قیمتی و مدیریت سفارش‌ها با کمترین تأخیر و بالاترین سرعت انجام شود. 
  • زبان‌هایی مانند Python و ++C برای استفاده‌های گسترده‌تر طراحی شده‌اند و معمولاً در حوزه‌هایی مثل علوم داده، هوش مصنوعی، برنامه‌نویسی سیستمی و نرم‌افزارهای مهندسی به کار می‌روند.
  • هرچند پایتون (Python) به دلیل سادگی و وجود کتابخانه‌های متعدد برای تحلیل داده و یادگیری ماشین بسیار محبوب است، اما در بخش اجرای لحظه‌ای معاملات به اندازه MQL سریع نیست و نیازمند پل‌های ارتباطی، APIها یا واسط‌هایی مانند MetaTrader Gateway یا MetaAPI است.
  • زبان ++C در سرعت اجرا بالاتر از MQL عمل می‌کند، اما پیچیدگی بالاتر و عدم وجود توابع اختصاصی برای عملیات معاملاتی آن را به گزینه‌ای کمتر مناسب برای کاربران متاتریدر تبدیل می‌کند.

در جدول زیر یک مقایسه دقیق و خلاصه بین این سه زبان ارائه شده است:

ویژگیMQLPythonC++
نوع زباناختصاصی برای متاتریدرعمومیعمومی
سرعت اجرابسیار سریع (Native MT)کندتربسیار سریع
سطح پیچیدگیمتوسطسادهسخت
کاربرد اصلیمعامله‌گری + تحلیلتحلیل + هوش مصنوعیسیستم‌های پیشرفته

تفاوت بین MQL4 و MQL5

طبق مقاله موجود در  وب سایت medium.com، زبان‌های MQL4 و MQL5 هر دو بر پایه ++C توسعه داده شده‌اند، اما در سطح معماری، شیوه اجرای دستورات معاملاتی، مدل برنامه‌ نویسی، نحوه پردازش داده‌ها و امکانات توسعه، تفاوت‌های قابل‌ توجهی دارند. این اختلافات باعث می‌شود که انتخاب بین آن‌ها بسته به نوع پروژه، پیچیدگی استراتژی و میزان نیاز به توسعه بلند مدت متفاوت باشد. 

برخی از برجسته‌ترین تفاوت‌های MQL4 و MQL5  به شرح زیر است: 

  • مدل برنامه‌نویسی
    MQL4 بیشتر رویه‌ای است و پیچیدگی کمتری دارد، در حالی‌که MQL5 کاملاً شی‌ء گرا طراحی شده و برای ساخت پروژه‌های مقیاس‌پذیر مناسب‌تر است.
  • اجرای معاملات
    در MQL4 سفارش‌ها به‌ طور مستقیم با()OrderSend اجرا می‌شوند، اما در MQL5 مدل Trade Request استفاده می‌شود که کنترل دقیق‌تری روی نوع سفارش، پارامترها و نحوه پر شدن (Fill Policy) ارائه می‌دهد.
  • دسترسی به داده‌ها و اندیکاتورها
    در MQL4 مقدار اندیکاتور مستقیماً با تابعی مانند()iMA بازگردانده می‌شود، اما در MQL5 ابتدا یک شناسه اندیکاتور ایجاد شده و سپس داده‌ها از طریق تابع()CopyBuffer دریافت می‌شوند. این روش امکان پردازش هم‌زمان منابع متعدد داده را فراهم می‌کند.
  • پشتیبانی از رویدادها
    MQL4 تنها رویدادهای پایه‌ای مانند()OnTick (اجرای برنامه با هر تیک قیمت) و() OnTimer (اجرای برنامه بر اساس زمان‌بندی مشخص) را پشتیبانی می‌کند، اما در MQL5 علاوه‌بر این موارد، رویدادهای پیشرفته‌تری مثل()OnTrade (رویدادهای مرتبط با معاملات و تغییر وضعیت پوزیشن‌ها) و()OnChartEvent (رویدادهای تعاملی مرتبط با چارت و ورودی کاربر) وجود دارد که برای طراحی سیستم‌های واکنش‌گرا و هوشمند ضروری هستند.
  • تست و بهینه‌سازی استراتژی‌ها
    MQL5 با پشتیبانی از تست چندنخی، داده تیک واقعی و بهینه‌سازی ژنتیکی، ابزار بسیار دقیق‌تری برای بک‌ تست ارائه می‌دهد، اما MQL4 بیشتر مناسب تست استراتژی‌های ساده‌تر است.

بنابراین، اگر در حال توسعه پروژه‌های جدید، ربات‌های پیچیده یا استراتژی‌های داده‌ محور هستید، MQL5 انتخاب منطقی‌تر و آینده‌نگرانه‌تری است. اما برای استراتژی‌های کلاسیک و ساختارهای ساده‌تر، MQL4 همچنان گزینه‌ای سبک و کاربردی محسوب می‌شود.

نحوه آماده‌سازی محیط کدنویسی در متاتریدر

برای شروع کدنویسی در متاتریدر، ابتدا باید محیط توسعه آن را آماده کنید. این کار با آشنایی و نصب MetaEditor آغاز می‌شود که در آن تمام مراحل نوشتن، ویرایش و کامپایل کد انجام می‌گیرد. سپس لازم است روش ایجاد و مدیریت فایل‌های جدید برای اکسپرت، اندیکاتور و اسکریپت را یاد بگیرید تا پروژه‌های خود را منظم پیش ببرید. در پایان نیز با ساختار و پسوند فایل‌های MQL4 و MQL5 آشنا می‌شوید تا بدانید هر نوع فایل چه کاربردی دارد. این سه گام، پایه ورود به برنامه‌نویسی MQL هستند. 

معرفی و نصب MetaEditor

MetaEditor محیط اصلی توسعه در متاتریدر است که تمام مراحل کدنویسی، کامپایل، تست و دیباگ (اشکال‌زدایی) در آن انجام می‌شود. برای دسترسی به MetaEditor  مراحل زیر را دنبال کنید:

  • پلتفرم MetaTrader را نصب کنید تا این ابزار به‌ صورت خودکار در دسترس قرار گیرد.
  • از طریق منوی “Tools” با انتخاب گزینه “MetaQuotes Language Editor” یا با فشردن دکمه F4 می‌توانید وارد محیط MetaEditor شوید.
زبان برنامه نویسی متاتریدر

رابط کاربری MetaEditor شامل بخش مدیریت فایل‌ها، صفحه ویرایش کد و پنل خطاهاست و به شما امکان می‌دهد بدون نیاز به ابزار جانبی، برنامه‌نویسی MQL را آغاز کنید. نصب و اجرای صحیح این محیط اولین گام برای ساخت هر نوع اکسپرت، اندیکاتور یا اسکریپت است.

زبان برنامه نویسی متاتریدر

ایجاد و مدیریت فایل‌های جدید برای اکسپرت، اندیکاتور و اسکریپت

در MetaEditor می‌توانید انواع فایل‌های جدید را با فرمت‌های مخصوص ایجاد کنید. برای این منظور با انتخاب مسیر “File → New”، فایل‌های پایه برای اکسپرت، اندیکاتور یا اسکریپت به‌ صورت خودکار تولید می‌شوند. 

زبان برنامه نویسی متاتریدر
زبان برنامه نویسی متاتریدر

هر فایل دارای ساختار اولیه و توابع اصلی مخصوص همان نوع برنامه است. همچنین از بخش Navigator می‌توانید فایل‌ها را گروه‌بندی، جابه‌جا و مدیریت کنید. این رویکرد باعث می‌شود پروژه‌های پیچیده را بهتر سازمان‌دهی کرده و توسعه را با نظم بیشتری پیش ببرید.

زبان برنامه نویسی متاتریدر

شناخت ساختار و پسوند فایل‌های MQL4 و MQL5

فایل‌های برنامه‌نویسی در متاتریدر با دو پسوند

  • MQ4/MQ5 (فایل‌های متن کد)؛
  • و EX4/EX5 (فایل‌های کامپایل‌شده).

شناخته می‌شوند. فایل‌های MQ4 و MQ5 قابل ویرایش هستند و محتوای برنامه را در خود نگه می‌دارند، در حالی که نسخه EX پس از کامپایل تولید شده و قابل ویرایش نیست. علاوه بر این، ساختار کلی فایل‌ها شامل بخش‌هایی مانند بخش اعلان متغیرها، توابع رویدادی و بدنه اصلی کد است. شناخت این ساختار و تفاوت نسخه 4 و 5 کمک می‌کند پروژه‌ها را درست مدیریت و خطاها را بهتر ردیابی کنید.

sms-star

بهینه‌سازی محاسبات ریاضی با استفاده از توابع داخلی MQL سرعت پردازش اندیکاتورها و استراتژی‌ها را افزایش می‌دهد.

مبانی برنامه‌نویسی در MQL

در ادامه، مهم‌ترین اجزا و تکنیک‌های برنامه‌نویسی در MQL را بررسی می‌کنیم تا بتوانید کدهای خود را در متاتریدر به‌صورت مؤثر بنویسید و اجرا کنید.

ساختار کلی برنامه در MQL (رویدادها، توابع، متغیرها)

در MQL برنامه‌ها معمولاً بر پایه توابع رویدادی اجرا می‌شوند؛ یعنی بخش‌های مختلف کد هنگام وقوع رویدادهای مشخص فعال می‌شوند. برای مثال، در اکسپرت‌ها رویداد تغییر قیمت اجراکننده تابع OnTick است و در اندیکاتورها تابع OnCalculate هنگام پردازش داده‌ها فراخوانی می‌شود. 

رویدادهای اصلی در MQL 

رویدادهای زیر، هسته اصلی اجرای برنامه را تشکیل می‌دهند و بدون آن‌ها، کد MQL هیچ عملیاتی انجام نمی‌دهد.

نوع برنامهرویداد اصلیتوضیح کاربرد
اکسپرت (EA)OnTick()هنگام دریافت هر تیک قیمت اجرا می‌شود و معمولاً منطق معامله در این تابع نوشته می‌شود
اندیکاتورOncalculate()هنگام پردازش داده‌های تاریخی یا جدید اجرا می‌شود و مقدار اندیکاتور را محاسبه می‌کند
اسکریپتOnStart()تنها یک‌بار هنگام اجرای اسکریپت اجرا می‌شود، مناسب عملیات یکباره مثل باز کردن یا بستن معاملات

توابع دلخواه (User Functions)

همچنین، می‌توانید توابع دلخواه خود (User Functions) را برای سازمان‌دهی بهتر کد ایجاد کنید. تعریف متغیرها نیز بخش مهمی از ساختار برنامه است و شامل انواع عددی، منطقی، رشته‌ای و آرایه‌ها می‌شود. درک این ساختار به شما کمک می‌کند برنامه‌هایی منظم و قابل‌فهم در MQL بنویسید.

کد زیر نمونه‌ای از توابع سفارشی است که شما می‌توانید MQL ایجاد کنید. 

double CalculateEMA(double price[], int period) {

    // محاسبه میانگین متحرک نمایی

}

این کد یک تابع دلخواه (User Function) در MQL است که برای محاسبه میانگین متحرک نمایی (EMA) استفاده می‌شود.

متغیرها و انواع داده‌ها

تعریف و مدیریت متغیرها بخش اساسی برنامه‌نویسی است. انواع متغیرها در MQL شامل موارد زیر هستند:

نوع دادهتوضیحمثال
عدد صحیح (int)ذخیره مقادیر عددی صحیحint lotSize = 1;
عدد اعشاری (double)ذخیره مقادیر با ممیز اعشاریdouble price = 4000.25;
منطقی (bool)ذخیره مقادیر درست/نادرستbool isTradeOpen = true;
رشته (string)ذخیره متنstring symbol = "XAUUSD";
آرایه (array)ذخیره مجموعه داده‌هاdouble prices[100];

درک صحیح متغیرها و توابع، همراه با نحوه فراخوانی رویدادها به شما کمک می‌کند برنامه‌هایی منظم، قابل‌ فهم و بدون خطا در MQL بنویسید.

کار با داده‌های قیمتی و توابع داخلی متاتریدر

یکی از مهم‌ترین قابلیت‌های MQL، دسترسی مستقیم به داده‌های قیمتی و سری‌های زمانی است. با توابع داخلی مانند iClose, iOpen, iHigh, iLow و CopyRates می‌توانید داده‌های کندل‌ها را فراخوانی کنید. همچنین توابع متنوعی برای محاسبه اندیکاتورها، دریافت اطلاعات حساب، وضعیت معاملات باز و ارسال سفارش وجود دارد. این ابزارها امکان ایجاد استراتژی‌های هوشمند و واکنش‌گرا را فراهم می‌کنند و هسته اصلی برنامه‌نویسی معاملاتی در MQL محسوب می‌شوند.

مثال زیر نشان می‌دهد که چگونه از توابع داده‌های قیمتی و اندیکاتورها در MQL برای ساخت یک منطق ساده معاملاتی استفاده می‌شود:

مثال کاربردی: بررسی شکست سقف کندل قبل و صدور هشدار

در این مثال، برنامه:

  • بالاترین قیمت کندل قبلی را با iHigh دریافت می‌کند؛ 
  • قیمت فعلی را با Bid می‌گیرد؛
  • اگر قیمت فعلی از سقف کندل قبلی عبور کرده باشد، یک پیام هشدار چاپ می‌کند؛
  • هم‌زمان مقدار اندیکاتور مووینگ‌ اوریج را با iMA می‌خواند تا یک شرط اضافی نیز بررسی کند.
زبان برنامه نویسی متاتریدر

آشنایی با حلقه‌ها، شرط‌ها و آرایه‌ها در MQL

برای پیاده‌سازی منطق برنامه، از ساختارهای کنترلی مانند شرط‌ها (if, else) و حلقه‌ها (for, while) استفاده می‌شود. حلقه‌ها به‌ ویژه در پردازش داده‌های قیمتی و محاسبات اندیکاتورها کاربرد زیادی دارند. آرایه‌ها نیز برای ذخیره مقادیر متعدد، مثل قیمت‌های گذشته یا خروجی محاسبات، مورد استفاده قرار می‌گیرند. یادگیری صحیح این مفاهیم باعث می‌شود بتوانید الگوریتم‌های پیچیده‌تری طراحی کرده و برنامه‌های کارآمدتری بسازید.

مثال زیر دقیقاً نشان می‌دهد شرط‌ها، حلقه‌ها و آرایه‌ها چگونه در MQL برای پیاده‌سازی منطق برنامه استفاده می‌شوند:

مثال کاربردی: تشخیص روند با استفاده از قیمت‌های گذشته

فرض کنید می‌خواهیم یک اکسپرت ساده بنویسیم که با بررسی ۱۰ کندل گذشته تشخیص دهد بازار صعودی است یا نزولی. برای این کار:

  • از آرایه برای ذخیره قیمت‌های بسته‌شدن ۱۰ کندل آخر استفاده می‌کنیم.
  • با یک حلقه for میانگین قیمت‌ها را محاسبه می‌کنیم.
  • با یک شرط if تصمیم می‌گیریم که روند صعودی است یا نزولی.

نمونه کد زیر برای MQL4 نوشته شده است: 

زبان برنامه نویسی متاتریدر

در مثال فوق: 

  • آرایه: برای نگهداری داده‌های گذشته؛
  • حلقه for: برای پردازش مجموعه‌ای از داده‌ها؛
  • شرط if: برای تصمیم‌گیری بر اساس نتیجه محاسبات.

استفاده شده است.

این دقیقاً همان منطق پایه‌ای است که در اکسپرت‌ها و اندیکاتورهای واقعی به شکل پیشرفته‌تر استفاده می‌شود.

نحوه دیباگ و رفع خطا در MetaEditor

MetaEditor چند قابلیت اصلی برای اشکال‌زدایی (debug) دارد: 

  • قرار دادن Breakpoint (توقف موقت روی سطر مشخص)؛
  • اجرای کد مرحله‌ به‌ مرحله (Step Into / Step Over / Step Out)؛
  • مشاهده مقدار متغیرها در پنجره‌های Watch و Local Variables؛
  • بررسی Call Stack و مشاهده خطاها و هشدارها در پنل Errors

همچنین می‌توانید Breakpoint شرطی تعریف کنید (مثلاً وقتی متغیری به مقدار خاص رسید توقف کند) و از پیام‌های چاپی (Print) برای ردیابی سریع استفاده کنید.

برای استفاده مؤثر از ابزارهای دیباگ در MetaEditor به شیوه زیر عمل کنید: 

  • ابتدا کد را کامپایل می‌کنید تا خطاها و هشدارها در پنل Errors نمایش داده شوند. 
  • با دوبار کلیک روی هر خطا مستقیماً به بخش مربوطه منتقل می‌شوید. 
  • پس از رفع خطاهای اولیه، می‌توانید برای بررسی رفتار برنامه در زمان اجرا یک Breakpoint روی خط دلخواه قرار دهید و فرآیند دیباگ را آغاز کنید. 
  • در این حالت، اجرای برنامه هنگام رسیدن به نقطه توقف متوقف می‌شود و شما می‌توانید با استفاده از ابزارهایی مانند Step Over، Step Into و Step Out جریان اجرای کد را به‌ صورت کنترل‌شده دنبال کنید.
  • همچنین امکان مشاهده مقدار متغیرها از طریق پنجره‌های Watch و Local Variables یا حتی با قرار دادن ماوس روی نام متغیر وجود دارد. 

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

مثال کاربردی:

فرض کنید، می‌خواهید یک اکسپرت ساده ایجاد کنید که میانگین ۵ قیمت بسته‌ شدن(Close) آخر را محاسبه می‌کند و اگر آخرین قیمت از میانگین بالاتر باشد، پیغام می‌دهد، اما گاهی خطای دسترسی به اندیس آرایه (out of range) رخ می‌دهد.

برای رفع این خطا، می‌توانید چنین کدی بنویسید:

زبان برنامه نویسی متاتریدر

در این کد، حلقه طوری نوشته شده که مقدار i از 0 تا 5 افزایش پیدا می‌کند. اما آرایه‌ی closePrices فقط پنج خانه دارد و اندیس‌های آن از 0 تا 4 معتبر هستند. بنابراین، وقتی حلقه به i = 5 می‌رسد، برنامه تلاش می‌کند به خانه‌ای دسترسی پیدا کند که وجود ندارد و همین باعث ایجاد خطای out of range می‌شود.

روش دیباگ با MetaEditor:

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

بعد از شروع دیباگ، برنامه تا رسیدن به Breakpoint اجرا می‌شود و در همان نقطه متوقف می‌گردد. حالا می‌توانید مقدار متغیر i و عناصر آرایه را در پنجره Local Variables یا با بردن ماوس روی نام متغیر ببینید. وقتی در آخرین دور حلقه می‌بینید مقدار i برابر 5 شده، متوجه می‌شوید که حلقه وارد محدوده‌ای شده که آرایه چنین اندیسی ندارد و همین علت خطاست.

با این بررسی مشخص می‌شود شرط حلقه اشتباه نوشته شده و باید به جای i <= 5 از i < 5 استفاده شود. پس کد را اصلاح می‌کنید و دوباره آن را اجرا یا دیباگ می‌کنید تا مطمئن شوید مشکل کاملاً برطرف شده است.

کد اصلاح شده به صورت زیر است:

زبان برنامه نویسی متاتریدر

آموزش اکسپرت‌نویسی در MQL

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

اکسپرت چیست و چگونه کار می‌کند؟

اکسپرت یا Expert Advisor برنامه‌ای است که روی پلتفرم متاتریدر اجرا می‌شود و معاملات شما را به صورت خودکار بر اساس قوانین تعریف‌ شده انجام می‌دهد.

  • اکسپرت می‌تواند ورود، خروج، حد سود و حد ضرر را به طور خودکار مدیریت کند.
  • این برنامه با استفاده از اندیکاتورها و الگوریتم‌های معاملاتی تصمیم‌گیری می‌کند.
  • استفاده از اکسپرت باعث می‌شود خطای انسانی کاهش یابد و معاملات سریع‌تر و منظم‌تر انجام شوند.

پس از آشنایی با اکسپرت، گام بعدی طراحی اولین برنامه ساده برای ورود و خروج خودکار از معامله است.

حتما بخوانید: اکسپرت سودده اسکالپینگ در فارکس

طراحی اولین اکسپرت ساده

در این مرحله، یک نمونه اکسپرت پایه ایجاد می کنیم که بتواند به صورت خودکار و بر اساس قوانین مشخص شده، معاملات را باز و بسته کند. این کار، به کاهش خطای انسانی و افزایش سرعت اجرای معاملات کمک می‌کند. برای این منظور مراحل زیر را دنبال می‌کنیم: 

تعیین شرایط ورود و خروج

برای شروع، باید شرایط دقیق ورود و خروج را مشخص کنید. مثال‌های رایج شامل:

  • کراس مووینگ اوریج:

    • وقتی میانگین متحرک کوتاه‌ مدت (مثلاً MA 10) از پایین به بالا میانگین بلند مدت (مثلاً MA 50) را قطع کند ، به معنی سیگنال خرید (Buy) است.
    • وقتی MA کوتاه‌ مدت از بالا به پایین MA بلندمدت را قطع کند به معنی سیگنال فروش (Sell) است.
  • شکست سطوح مقاومت و حمایت:

    • عبور قیمت از یک سطح مقاومت تائید ورود به معامله خرید؛
    • عبور قیمت از سطح حمایت تائید ورود به معامله فروش است.

مثال کاربردی کدنویسی  MQL (کد بلاک):

زبان برنامه نویسی متاتریدر

این کد ساده، شرایط کراس مووینگ اوریج را بررسی کرده و سفارش خرید ایجاد می‌کند.

تعریف نوع سفارش (Buy یا Sell)

  • نوع سفارش مشخص می‌کند که اکسپرت خرید یا فروش انجام دهد.
  • در مثال بالا، OP_BUY برای خرید و OP_SELL برای فروش استفاده می‌شود.
  • بهتر است شرایط ورود و خروج هر نوع سفارش را شفاف و قابل تغییر از طریق پارامترها تنظیم کنید.

تعیین حد سود و حد ضرر اولیه 

برای مدیریت ریسک و محافظت از سرمایه، اکسپرت باید حد سود و حد ضرر هر معامله را مشخص کند. این مقادیر می‌توانند به صورت ثابت یا پویا تعریف شوند:

مثال کاربردی در MQL برای تعیین حد سود و ضرر (کد بلاک):

چطور زبان برنامه‌نویسی MQL را یاد بگیریم و اکسپرت و اندیکاتور حرفه‌ای بسازیم؟

در این مثال:

StopLoss = 50 پیپ، یعنی اگر بازار 50 پیپ برخلاف معامله حرکت کند، معامله بسته می‌شود.

TakeProfit = 100 پیپ، یعنی اگر بازار 100 پیپ به نفع معامله حرکت کند، سود گرفته می‌شود.

Point در متاتریدر، کوچک‌ترین تغییر قیمت را نشان می‌دهد و برای محاسبه دقیق حد سود و ضرر استفاده می‌شود.

این روش تضمین می‌کند که اکسپرت به صورت خودکار ریسک و سود را مدیریت کند.

sms-star

توصیه می‌شود پارامترها مانند حجم معامله، حد سود و ضرر، فاصله میانگین‌ها و نوع سفارش را به صورت پارامترهای ورودی (Inputs) تعریف کنید تا اکسپرت انعطاف‌پذیر باشد و بدون تغییر کد، قابل تنظیم باشد.

مدیریت سفارش‌ها، پوزیشن‌ها و پارامترهای ورودی

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

 

در این مرحله، هدف این است که اکسپرت بتواند تصمیم بگیرد چه زمانی وارد معامله شود، چه زمانی معامله را مدیریت کند و چه زمانی از بازار خارج شود.

sms-star

تعریف پارامترهای قابل تغییر باعث می‌شود کاربر بدون نیاز به تغییر کد اصلی، حجم معامله، حد سود و حد ضرر یا فیلتر زمانی را به راحتی تنظیم کند.

پارامترهای ورودی 

پارامترهای ورودی به کاربر اجازه می‌دهند بدون تغییر کد، رفتار اکسپرت را متناسب با استراتژی و مدیریت سرمایه خود تنظیم کند. این پارامترها معمولاً در ابتدای کد با دستور input تعریف می‌شوند.

مهم‌ترین پارامترهای ورودی عبارت‌اند از:

  • Lot Size (حجم معامله): تعیین اندازه معامله بر اساس ریسک‌پذیری؛
  • Stop Loss و Take Profit: مدیریت ریسک و هدف سود؛
  • حداکثر تعداد معاملات همزمان؛
  • فیلتر زمانی (Trading Hours / Sessions)؛
  • فعال یا غیرفعال بودن Buy یا Sell.

مثال کاربردی:
فرض کنید یک اکسپرت اسکالپ برای EURUSD نوشته‌اید. با پارامترهای ورودی، کاربر می‌تواند:

  • حجم معامله را از 0.1 به 0.3 لات تغییر دهد؛
  • حد ضرر را روی 15 پیپ و حد سود را روی 25 پیپ تنظیم کند؛
  • اکسپرت را فقط در سشن لندن فعال نگه دارد. 

این کار باعث می‌شود یک اکسپرت، برای چند سبک معاملاتی مختلف قابل استفاده باشد.

بررسی و مدیریت وضعیت سفارش‌ها و پوزیشن‌های باز

اکسپرت باید در هر لحظه بداند:

  • آیا پوزیشن فعالی روی نماد وجود دارد یا نه؟
  • نوع پوزیشن Buy است یا Sell؟
  • حجم، حد ضرر و حد سود فعلی چقدر است؟

این بررسی معمولاً با توابعی مانند:

  • () PositionTotal
  • () PositionSelect
  • () OrderSelect

انجام می‌شود.

مثال کاربردی:
اگر روی XAUUSD یک پوزیشن Buy باز باشد:

  • اکسپرت نباید دوباره Buy ارسال کند؛
  • می‌تواند Stop Loss را به صورت تریلینگ استاپ (Trailing Stop) جابه‌جا کند؛
  • یا در صورت تغییر شرایط بازار، زودتر از حد سود از معامله خارج شود.

این منطق از معاملات تکراری، اور تریدینگ و افزایش ریسک ناخواسته جلوگیری می‌کند.

مدیریت چند معامله و جلوگیری از همپوشانی (Trade Overlap)

در استراتژی‌های حرفه‌ای، اکسپرت ممکن است چند نماد را همزمان معامله کند و یا روی یک نماد، چند استراتژی مختلف داشته باشد. برای کنترل این شرایط، معمولاً از تکنیک‌هایی ماند عدد جادویی (Magic Number)، بررسی تعداد پوزیشن‌های فعال و محدودیت معاملات همزمان استفاده می‌شود.

مثال کاربردی:
یک اکسپرت روی EURUSD و GBPUSD فعال است:

اگر EURUSD در ضرر است، اکسپرت می‌تواند از باز کردن معامله جدید روی همان نماد جلوگیری کند و اما اجازه دهد GBPUSD طبق شرایط خودش معامله شود. این منطق باعث کنترل همزمان ریسک کل حساب می‌شود، نه فقط یک معامله.

sms-star

استفاده بهینه از Indicator Buffers باعث می‌شود اندیکاتورهای سفارشی شما سریع‌تر اجرا شده و حافظه کمتری مصرف کنند.

ارتباط منطقی با مرحله بعد (تست و بهینه‌سازی)

وقتی مدیریت سفارش‌ها و پارامترها به‌ درستی پیاده‌سازی شود، اکسپرت آماده بررسی عملکرد واقعی است. در این مرحله، باید رفتار اکسپرت را در شرایط مختلف بازار با Strategy Tester بررسی کرد تا مشخص شود:

  • آیا پارامترها بهینه هستند؟
  • آیا منطق ورود و خروج پایدار است؟
  • اکسپرت در شرایط پرنوسان چگونه عمل می‌کند؟

بدون مدیریت صحیح سفارش‌ها، نتایج تست نیز غیرواقعی و گمراه‌کننده خواهند بود.

تست و بهینه‌سازی اکسپرت با Strategy Tester

پس از طراحی اکسپرت، مهم‌ترین مرحله قبل از اجرای واقعی، تست و بهینه‌سازی آن با Strategy Tester در متاتریدر است. Strategy Tester به شما این امکان را می‌دهد که عملکرد اکسپرت را روی داده‌های تاریخی بررسی کرده و نقاط ضعف و قوت آن را شناسایی کنید، بدون اینکه سرمایه واقعی درگیر شود. در این مرحله، اکسپرت دقیقاً در شرایطی شبیه‌سازی می‌شود که گویی در بازار واقعی در حال معامله است.

برای انجام تست در Strategy Tester  از مسیر:  View → Strategy Tester استفاده کنید. 

زبان برنامه نویسی متاتریدر
زبان برنامه نویسی متاتریدر

بررسی عملکرد اکسپرت با بک‌ تست (Backtesting)

بک‌ تست اکسپرت به فرآیند اجرای Expert Advisor روی داده‌های تاریخی بازار گفته می‌شود تا عملکرد آن پیش از ورود به معاملات واقعی ارزیابی شود. با انجام بک‌ تست در Strategy Tester متاتریدر، می‌توان به‌ صورت دقیق بررسی کرد که آیا منطق معاملاتی اکسپرت در شرایط مختلف بازار به‌درستی عمل می‌کند یا خیر.

در این مرحله مشخص می‌شود:

  • آیا قوانین ورود و خروج معاملات به‌ صورت صحیح اجرا می‌شوند؟
  • استراتژی در چه شرایطی (روندی یا رنج) بیشترین بازدهی یا بیشترین زیان را دارد؟
  • عملکرد اکسپرت در نوسانات شدید بازار چگونه است؟

در Strategy Tester متاتریدر امکان تنظیم پارامترهای زیر وجود دارد:

  • نماد معاملاتی (مانند XAUUSD، EURUSD یا BTCUSD)؛
  • تایم‌ فریم موردنظر (M15، H1، H4 و …)؛
  • بازه زمانی تست (چند ماه یا چند سال گذشته).

پس از اجرای بک‌ تست، نتیجه معاملات به‌ صورت گزارش آماری و نمودار عملکرد نمایش داده می‌شود که مبنای تصمیم‌گیری برای مراحل بعدی است.

بهینه‌سازی پارامترهای اکسپرت برای سود بیشتر و ریسک کمتر

پس از انجام بک‌ تست اولیه، نوبت به مرحله بهینه‌سازی اکسپرت (Optimization) می‌رسد. در این بخش، Strategy Tester متاتریدر مقادیر مختلف پارامترهای ورودی را به‌ صورت خودکار آزمایش می‌کند تا بهترین ترکیب ممکن از نظر سودآوری و کنترل ریسک شناسایی شود.

پارامترهایی که معمولاً برای بهینه‌سازی استفاده می‌شوند عبارت‌اند از:

با فعال‌سازی بهینه‌سازی، متاتریدر صدها یا حتی هزاران سناریوی مختلف را بررسی کرده و نتایج را بر اساس شاخص‌هایی مانند پرافیت فکتور،  سود خالص (Net Profit) و ماکسیمم دراودان رتبه‌بندی می‌کند.

تحلیل گزارش‌ها، نمودارها و Drawdown

پس از پایان بک‌ تست یا بهینه‌سازی، Strategy Tester گزارش‌های تحلیلی کاملی در اختیار شما قرار می‌دهد که شامل موارد زیر است:

  • مجموع سود و زیان خالص (Net Profit)؛
  • حداکثر افت سرمایه (Maximum Drawdown)؛
  • درصد معاملات موفق یا وین ریت (Win Rate)؛
  • نمودار رشد یا افت سرمایه (Equity Curve).

تحلیل این داده‌ها به شما کمک می‌کند تشخیص دهید که آیا اکسپرت عملکردی پایدار دارد یا فقط در یک بازه خاص سودده بوده است؟ و یا میزان ریسک استراتژی منطقی است یا دراودان آن بیش از حد بالا است؟

sms-star

نتایج درخشان در Strategy Tester به‌ تنهایی تضمین‌کننده سود در بازار واقعی نیست و همیشه پس از بک‌ تست و بهینه‌سازی، اکسپرت را مدتی در حساب دمو یا Forward Test اجرا کنید تا رفتار آن در شرایط زنده بازار ارزیابی شود.

آموزش ساخت اندیکاتور سفارشی در MQL

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

تفاوت اندیکاتورهای سفارشی با اندیکاتورهای پیش‌فرض

اندیکاتورهای پیش‌فرض متاتریدر مانند مووینگ اوریج، RSI یا MACD ابزارهایی استاندارد هستند که منطق و ساختار آن‌ها قابل تغییر نیست. در مقابل، اندیکاتورهای سفارشی که با زبان MQL4 یا MQL5 نوشته می‌شوند، آزادی کامل در طراحی دارند. در اندیکاتور سفارشی می‌توان:

  • فرمول محاسباتی دلخواه تعریف کرد؛
  • داده‌ها را از چند تایم‌ فریم یا نماد مختلف دریافت کرد؛ 
  • نحوه رسم خطوط، هیستوگرام یا سیگنال‌ها را شخصی‌سازی نمود.

به همین دلیل، ساخت اندیکاتور سفارشی یکی از مهم‌ترین مهارت‌ها برای معامله‌گران حرفه‌ای و توسعه‌دهندگان الگوریتم‌های معاملاتی محسوب می‌شود.

تعریف و استفاده از بافرهای اندیکاتور

بافر (Indicator Buffer) در MQL فضایی از حافظه است که مقادیر محاسبه‌شده اندیکاتور در آن ذخیره می‌شود. هر خط یا شکل قابل نمایش روی چارت، به یک بافر مجزا متصل است. در اندیکاتورهای سفارشی:

  • هر بافر نماینده یک خروجی (مثلاً خط، هیستوگرام یا سیگنال) است؛
  • با دستور SetIndexBuffer، بافر به اندیکاتور متصل می‌شود؛
  • داده‌های هر کندل در اندیس مربوط به همان کندل ذخیره می‌شوند.

استفاده صحیح از بافرها نقش کلیدی در عملکرد، دقت و سرعت اندیکاتور دارد، به‌ خصوص زمانی که اندیکاتور شامل چند خروجی هم‌زمان باشد.

در ادامه یک مثال کاربردی و ساده در MQL4 برای نشان دادن تعریف و استفاده از بافرهای اندیکاتور ارائه می‌دهیم. این مثال شامل یک اندیکاتور سفارشی است که میانگین متحرک ساده (SMA) را روی چارت رسم می‌کند و از Indicator Buffer برای ذخیره داده‌ها استفاده می‌کند.

//+——————————————————————+

//| Custom Indicator: Simple Moving Average Example                 |

//+——————————————————————+

#property indicator_separate_window false     // نمایش روی چارت قیمت

#property indicator_buffers 1                // تعداد بافرها

#property indicator_color1 Blue              // رنگ خط اندیکاتور

// تعریف بافر اندیکاتور

double SMA_Buffer[];

// تنظیمات ورودی اندیکاتور

input int Period = 14;

//+——————————————————————+

//| Initialization function                                          |

//+——————————————————————+

int OnInit()

{

    // اتصال بافر به اندیکاتور

    SetIndexBuffer(0, SMA_Buffer);

    SetIndexStyle(0, DRAW_LINE); // نوع رسم: خط

    SetIndexLabel(0, “SMA ” + IntegerToString(Period));

    

    return(INIT_SUCCEEDED);

}

//+——————————————————————+

//| Calculation function                                             |

//+——————————————————————+

int OnCalculate(const int rates_total,

                const int prev_calculated,

                const int begin,

                const double &price[])

{

    // محاسبه SMA و ذخیره در بافر

    for(int i = 0; i < rates_total; i++)

    {

        if(i >= Period – 1)

        {

            double sum = 0;

            for(int j = 0; j < Period; j++)

                sum += Close[i – j]; // جمع قیمت‌های بسته شدن

            SMA_Buffer[i] = sum / Period; // ذخیره در بافر

        }

        else

        {

            SMA_Buffer[i] = 0; // مقدار اولیه صفر برای کندل‌های ابتدایی

        }

    }

    return(rates_total);

}

به طور مثال در کد فوق: 

SetIndexBuffer(0, SMA_Buffer);

این دستور بافر را به اندیکاتور متصل می‌کند تا داده‌ها روی چارت رسم شوند.

رسم اشکال گرافیکی و نمایش داده روی چارت

در MQL می‌توان علاوه بر خطوط اندیکاتوری، اشکال گرافیکی مختلفی مانند فلش‌ها، متن‌ها، مستطیل‌ها و خطوط عمودی یا افقی را روی چارت رسم کرد. این قابلیت برای نمایش سیگنال‌های خرید و فروش یا نواحی مهم قیمتی بسیار کاربردی است. برخی از کاربردهای رایج عبارتند از:

  • نمایش فلش خرید و فروش هنگام صدور سیگنال؛
  • رسم خطوط هشدار در سطوح کلیدی؛
  • نمایش متن توضیحی یا وضعیت بازار روی چارت

این اشکال معمولاً با استفاده از توابعی مانند ObjectCreate و ObjectSet مدیریت می‌شوند و به افزایش خوانایی و کاربرد عملی اندیکاتور کمک می‌کنند.

افزودن تنظیمات شخصی‌سازی برای کاربران اندیکاتور

پس از طراحی منطق و ظاهر اندیکاتور، آخرین گام مهم، افزودن تنظیمات قابل تغییر برای کاربر است تا بتواند اندیکاتور را متناسب با سبک معاملاتی خود تنظیم کند. تنظیمات ورودی (Inputs) به کاربران اجازه می‌دهد بدون تغییر کد، رفتار اندیکاتور را کنترل کنند. این تنظیمات معمولاً در ابتدای کد و با کلمه کلیدی input تعریف می‌شوند.

نمونه تنظیمات قابل شخصی‌سازی عبارتند از:

  • دوره محاسبات اندیکاتور؛
  • رنگ و ضخامت خطوط؛
  • فعال یا غیرفعال کردن سیگنال‌ها؛
  • تغییر نوع نمایش (خطی، هیستوگرام، فلش).

وجود تنظیمات انعطاف‌پذیر باعث می‌شود اندیکاتور سفارشی برای طیف گسترده‌تری از معامله‌گران قابل استفاده باشد و تجربه کاربری حرفه‌ای‌تری ارائه دهد.

نمونه اندیکاتور سفارشی: نمایش میانگین متحرک و سیگنال فلش خرید/فروش

در ادامه، یک نمونه کامل کد اندیکاتور سفارشی در MQL4 ارائه می دهیم.

ویژگی‌ها و سفارشی‌سازی‌ها

  • میانگین متحرک ساده (SMA) روی چارت رسم می‌شود؛
  • وقتی قیمت بالای SMA بسته شود،  فلش خرید نمایش داده می‌شود؛
  • وقتی قیمت پایین SMA بسته شود ، فلش فروش نمایش داده می‌شود؛
  • ورودی‌های قابل تغییر برای کاربرعبارتند از:

    • طول دوره SMA؛
    • رنگ خط SMA؛
    • فعال/غیرفعال کردن نمایش فلش‌ها.

//+——————————————————————+

//|                                         CustomMA_Signals.mq4    |

//|                        نمونه اندیکاتور سفارشی با MQL4           |

//+——————————————————————+

#property indicator_separate_window false

#property indicator_buffers 2

#property indicator_color1 Blue    // خط SMA

#property indicator_color2 Red     // فلش‌ها

//— ورودی‌های سفارشی

input int SMA_Period = 20;             // طول دوره میانگین متحرک

input color SMA_Color = Blue;          // رنگ خط SMA

input bool Show_Arrows = true;         // فعال/غیرفعال کردن فلش‌ها

//— بافرها

double SMA_Buffer[];

double Arrow_Buffer[];

//+——————————————————————+

//| تابع مقداردهی اولیه اندیکاتور                                    |

//+——————————————————————+

int OnInit()

{

   SetIndexBuffer(0, SMA_Buffer);           // اتصال بافر SMA

   SetIndexStyle(0, DRAW_LINE);             // رسم خط

   SetIndexLabel(0, “SMA”);

   SetIndexBuffer(1, Arrow_Buffer);         // اتصال بافر فلش‌ها

   SetIndexStyle(1, DRAW_ARROW);

   SetIndexArrow(1, 234);                   // کد ASCII فلش

   SetIndexLabel(1, “SignalArrow”);

   return(INIT_SUCCEEDED);

}

//+——————————————————————+

//| تابع اصلی اندیکاتور                                             |

//+——————————————————————+

int OnCalculate(const int rates_total,

                const int prev_calculated,

                const double &price[])

{

   int start = SMA_Period;

   // محاسبه SMA

   for(int i=start; i<rates_total; i++)

   {

      double sum = 0;

      for(int j=0; j<SMA_Period; j++)

         sum += Close[i-j];

      SMA_Buffer[i] = sum / SMA_Period;

      // بررسی سیگنال خرید/فروش

      if(Show_Arrows)

      {

         Arrow_Buffer[i] = EMPTY_VALUE;  // مقدار پیش‌فرض بدون فلش

         if(Close[i] > SMA_Buffer[i-1] && Close[i-1] <= SMA_Buffer[i-2])

            Arrow_Buffer[i] = Low[i] – 10*Point;   // فلش خرید پایین کندل

         if(Close[i] < SMA_Buffer[i-1] && Close[i-1] >= SMA_Buffer[i-2])

            Arrow_Buffer[i] = High[i] + 10*Point;  // فلش فروش بالای کندل

      }

   }

   return(rates_total);

}

توضیح عملکرد اندیکاتور سفارشی فوق

  1. محاسبه میانگین متحرک (SMA):

    • بافر SMA_Buffer مقادیر میانگین متحرک را نگه می‌دارد و روی چارت رسم می‌کند.
    • طول دوره و رنگ خط توسط کاربر قابل تغییر است.

  2. تشخیص سیگنال‌های خرید/فروش:

    • هرگاه قیمت بالای SMA بسته شود و در کندل قبل زیر SMA بسته شده باشد، فلش خرید قرار می‌دهد.
    • هرگاه قیمت پایین SMA بسته شود و در کندل قبل بالای SMA بسته شده باشد،  فلش فروش قرار می‌دهد.
    • این سیگنال‌ها در بافر Arrow_Buffer ذخیره شده و روی چارت نمایش داده می‌شوند.

  3. سفارشی‌سازی کاربر:
    • ورودی‌های SMA_Period، SMA_Color و Show_Arrows به کاربران امکان تغییر اندیکاتور بدون تغییر کد را می‌دهد.

ساخت اسکریپت‌های کاربردی در MQL

اسکریپت‌ها ابزارهای بسیار کاربردی در متاتریدر هستند که به تریدرها اجازه می‌دهند کارهای تکراری و زمان‌بر را به‌ صورت خودکار و سریع انجام دهند. در این بخش، شما با مفهوم اسکریپت، تفاوت آن با اکسپرت، مثال‌های عملی و نحوه اجرای آن‌ها در متاتریدر آشنا می‌شوید. استفاده از تصاویر و مثال‌های عملی باعث می‌شود آموزش قابل درک و کاربردی برای معامله‌گران مبتدی و حرفه‌ای باشد.

اسکریپت چیست و چه تفاوتی با اکسپرت دارد؟

اسکریپت در متاتریدر یک برنامه کوتاه و تک‌مرحله‌ای است که فقط یکبار اجرا می‌شود و معمولاً برای کارهای فوری مانند بستن معاملات یا حذف پندیگ‌ها استفاده می‌شود.

در مقابل، اکسپرت (Expert Advisor) یک برنامه پیچیده‌تر و دائم فعال است که می‌تواند استراتژی‌های معاملاتی خودکار را به‌ صورت مداوم اجرا کند.

مثال کاربردی از اسکریپت: بستن همه معاملات

مثال زیر یک نمونه ساده از اسکریپت بستن تمام معاملات در MQL4 است: 

//+——————————————————————+

//| اسکریپت بستن همه معاملات باز در متاتریدر                        |

//+——————————————————————+

#property strict

void OnStart()

{

   // شمارنده معاملات باز

   int totalOrders = OrdersTotal();

   // حلقه برای بررسی و بستن هر معامله

   for(int i = totalOrders-1; i >= 0; i–)

   {

      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

      {

         int type = OrderType();

         

         // بستن معاملات خرید و فروش

         if(type == OP_BUY || type == OP_SELL)

         {

            bool closed = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 3, clrRed);

            

            if(closed)

               Print(“معامله با موفقیت بسته شد: “, OrderTicket());

            else

               Print(“خطا در بستن معامله: “, OrderTicket(), ” – Error: “, GetLastError());

         }

      }

   }

}

توضیح اسکریپت فوق به شرح زیر است:

  • OrdersTotal() تعداد معاملات باز در حساب را برمی‌گرداند.
  • حلقه for همه معاملات باز را بررسی می‌کند.
  • OrderSelect() برای انتخاب هر معامله استفاده می‌شود.
  • OrderType() مشخص می‌کند که معامله خرید است یا فروش.
  • OrderClose() معامله را می‌بندد و نتیجه موفقیت یا خطا را چاپ می‌کند.

کار با توابع سفارشی و ساخت کتابخانه‌ها (Libraries)

توابع سفارشی در MQL5 به شما امکان می‌دهند کدهای تکراری را ساده و قابل استفاده مجدد کنید. با تعریف توابع شخصی، می‌توانید منطق پیچیده معاملات، تحلیل داده‌ها یا مدیریت ریسک را در بخش‌های جداگانه نگهداری کنید و از آن‌ها در اکسپرت‌ها و اسکریپت‌ها استفاده نمایید.

کتابخانه‌ها (Libraries) نیز فایل‌هایی هستند که شامل توابع و کلاس‌های عمومی می‌شوند و می‌توانند بین چند پروژه به اشتراک گذاشته شوند. با استفاده از کتابخانه‌ها، مدیریت پروژه‌های بزرگ آسان‌تر شده و کد شما منظم و قابل نگهداری می‌شود.

مثال کاربردی:

فرض کنید می‌خواهید در چند اکسپرت مختلف میانگین متحرک ساده (SMA) را محاسبه کنید. به جای نوشتن کد محاسبه SMA در هر اکسپرت، می‌توانید یک تابع سفارشی در یک فایل کتابخانه ایجاد کنید:

// File: MyLibrary.mqh

double SimpleMA(const double &prices[], int period)

{

    double sum = 0;

    for(int i = 0; i < period; i++)

        sum += prices[i];

    return sum / period;

}

سپس در اکسپرت‌های مختلف، این کتابخانه را فراخوانی می‌کنید:

#include <MyLibrary.mqh>

void OnTick()

{

    double maValue = SimpleMA(Close, 14);

    Print(“مقدار SMA 14 دوره: “, maValue);

}

مدیریت رویدادها و تایمرها در MQL5

در MQL5، مدیریت رویدادها و تایمرها اجازه می‌دهد عملیات زمان‌بندی شده یا واکنش به رویدادها در بازار را کنترل کنید. انواع رویدادها شامل: 

()OnTick

()OnTimer

()OnTrade 

()OnChartEvent

هستند. تایمرها با دستور  ()EventSetTimer تنظیم می‌شوند و باعث اجرای کد در فواصل زمانی مشخص می‌گردند.

مثال کاربردی از یک تایمر:

// تنظیم تایمر برای اجرای تابع هر 5 ثانیه

EventSetTimer(5);

void OnTimer()

{

   Print(“اجرای کد در تایمر هر 5 ثانیه”);

}

مزایای استفاده از رویداد و تایمر:

  • اجرای خودکار بررسی شرایط معامله؛
  • کاهش بار پردازشی با جلوگیری از اجرای مداوم کد؛
  • بهینه‌سازی استراتژی‌های الگوریتمی.

بهینه‌سازی عملکرد و کاهش تاخیر در اجرای کد

بهینه‌سازی عملکرد در MQL5 شامل کاهش مصرف پردازنده، اجرای سریع‌تر کد و کاهش تاخیر در سیگنال‌ها می‌شود. تکنیک‌ها شامل: استفاده از آرایه‌ها و حلقه‌های بهینه، محدود کردن محاسبات در هر تیک، و استفاده از توابع داخلی MQL5 به جای محاسبات دستی است.

مثال کاربردی از بهینه‌سازی عملکرد:

// استفاده از ArrayCopy به جای حلقه دستی

double prices[];

ArraySetAsSeries(prices,true);

ArrayCopy(prices, Close, 0, 0, ArraySize(Close));

مزایای بهینه‌سازی عملکرد در MQL عبارتند از: 
  • کاهش زمان پاسخ اکسپرت به تغییرات قیمت؛
  • اجرای سریع‌تر سیگنال‌ها؛
  • افزایش کارایی معاملات الگوریتمی.

امنیت در اکسپرت‌ها و جلوگیری از سوءاستفاده

امنیت در اکسپرت‌ها شامل محافظت از کد، جلوگیری از تغییر غیرمجاز و محدود کردن دسترسی به توابع حیاتی است. می‌توان با استفاده از رمزنگاری داده‌ها، بررسی مالکیت اکانت و محدود کردن فعالیت‌ها از سوء استفاده جلوگیری کرد. مثال کاربردی از نحوه اجرای موارد امنیتی با استفاده از MQL: کد زیر در MQL5 یک روش ساده برای محدود کردن دسترسی به اکسپرت بر اساس شماره حساب کاربر را نشان می‌دهد.

// بررسی شماره حساب برای محدود کردن اجرای اکسپرت

if(AccountInfoInteger(ACCOUNT_LOGIN) != 123456)

{

   Print(“این اکسپرت برای شما فعال نیست”);

   return;

}

مزایای اعمال موارد امنیتی مناسب هنگام برنامه نویسی در MQL:

  • جلوگیری از کپی غیرمجاز اکسپرت‌ها؛
  • حفاظت از استراتژی‌های معاملاتی؛
  • کاهش ریسک مالی برای توسعه‌دهنده. 

منابع آموزشی زبان MQL

برای یادگیری حرفه‌ای برنامه‌نویسی در متاتریدر و ارتقای مهارت‌های خود در MQL4 و MQL5، منابع زیر توصیه را توصیه می‌کنیم:

1- سایت رسمی MQL4 و MQL5 که شامل: مستندات کامل توابع، کلاس‌ها و ساختار زبان؛ مثال‌های کد عملی برای اکسپرت، اندیکاتور و اسکریپت و اخبار و به‌روزرسانی‌های رسمی متاتریدر است.

2 – کتابخانه‌ها و مثال‌های آموزشی: این نوع منابع شامل مجموعه‌ای از کتابخانه‌ها و فایل‌های .mqh که شامل توابع عمومی و کاربردی هستند، می شود. استفاده از این کتابخانه‌ها در پروژه‌های واقعی به درک بهتر ساختار کد و بهینه‌سازی توسعه کمک می‌کند و امکان مشاهده و مطالعه کدهای آماده برای یادگیری بهترین شیوه‌ها را فراهم می‌کند.

2 – دوره‌ها و ویدئوهای آموزشی: در سرتاسر اینترنت دوره‌ها و ویدئوهای فراوانی وجود دارد که به صورت کلی و یا به صورت شاخه‌ای به آموزش برنامه‌نویسی به زبان MQL می‌پردازند. برخی از این دوره‌ها عبارتند از: 

13 lessons

MQL4 Programming Tutorial،

 MQL5 for Beginners

نتیجه‌گیری

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

شروع مسیر با یادگیری اصول پایه‌ای MQL امکان‌پذیر است، اما تبدیل شدن به یک توسعه‌دهنده حرفه‌ای، سرمایه‌گذاری بلندمدت ارزشمند در دنیای ترید الگوریتمی به شمار می‌رود و مهارت‌هایی ایجاد می‌کند که در طراحی استراتژی‌های پیچیده و بهینه‌سازی عملکرد معاملات به شما برتری می‌دهد.

ادامه خواندن
not-found
calendar 28 آذر 1404
rate banner
به این مقاله امتیاز بدهید
Plugin not installed

Leave a Reply

Your email address will not be published. Required fields are marked *

نه ممنون