زبانهای متاکوئتز 4 و 5 به ترتیب ابزاری برای توسعه برنامههای کاربردی برای درگاه مشتری متاتریدر (Meta Trader Client Terminal) بر اساس پلتفرمهای خانوادهی متاتریدر از نسل چهارم و پنجم هستند. این زبانها ابزاری را در اختیار کاربران قرار میدهند تا استراتژیهای معاملات خودکار سمت-کاربر (client-side) را توسعه دهند.
مقاله شامل موضوعات زیر می باشد:
- MQL4 و MQL5 چیست؟
- ویژگیهای زبانهای برنامهنویسی MQL4 و MQL5
- انواع دادهها و سینتکس زبانهای MQL4 و MQL5
- تفاوت بین کدهای MQL4 و MQL5
- برنامهنویسی اندیکاتور MQL4: نحوه نوشتن یک اکسپرت (مشاور خبره: Export Advisor) در MQL4 یا MQL5
- مزایا و معایب زبانهای MQL4 و MQL5
- تبدیل MQL4 به MQL5
- سؤالات متداول MQL4 و MQL5
من یک آموزش دقیق در مورد برنامهنویسی متاتریدر، MQL4 در مقابل MQL5 برای شما آماده کردهام . پس از خواندن این مقاله، خواهید فهمید که MQL چیست، تفاوت بین دو نسخه جدید این زبان و نحوهی کار با آنها را خواهید آموخت. در اینجا میتوانید دستورالعملهای دقیق همراه با تصاویر در مورد چگونگی نوشتن یک اکسپرت ادوایزر (expert advisor) را پیدا کنید. بیایید شروع کنیم!
MQL4 و MQL5 چیست؟
از بسیاری جهات، زبانهای MQL4 و MQL5 بسیار شبیه به هم هستند. بنابراین، ما به طور جداگانه در مورد تفاوتها صحبت خواهیم کرد، اما در حال حاضر هر دوی آنها را به عنوان MQL در نظر میگیریم و فعلاً کاری با نسخههای متفاوت آن نداریم.
MQL یک زبان برنامهنویسی است که در بستر متاتریدر ساخته شده است. محیط توسعه ویرایشگر زبان متاکوئتز برای نوشتن رباتهای تجاری،اندیکاتورها، و یا سایر برنامههای کاربردی خودتان در MQL، و همچنین کامپایل کردن و دیباگ کردن (اشکال زدایی) از آنها استفاده میشود. این محیط همراه با تمام اطلاعات مرجع با درگاه مشتری متاتریدر ارائه میشود.
اگر حداقل یک بار در داراییهای خاصی سرمایهگذاری کرده باشید، شاید فقط دلار برای نگهداری در بانک خریده باشید، پس متوجه هستید که سرمایهگذاری نیاز به کنترل بیوقفه دارد. شرط میبندم شما چنین سوالاتی را بیش از یک بار از خود پرسیدهاید:
- آیا الان زمان خروج از معاملات است در حالی که قیمت در اوج خود است؟
- چگونه میتوان تعیین کرد که آیا قیمت دارایی به روند صعودی خود ادامه خواهد داد یا بازار بهم میخورد؟
- شاید این بار یک سیگنال نادرست دریافت شده باشد و نیازی به ریسک و عجله برای باز کردن یک پوزیشن نباشد؟
شما باید همگام با بازار باشید و به موقع تصمیمات معاملاتی بگیرید. توصیه میشود روز و شب در فعالترین لحظات این کنترلها را انجام دهید. وقتی کار با چندین دارایی به طور همزمان انجام میشود، اوضاع بیشتر و بیشتر تنشزا میشود.
MQL به شما امکان میدهد هر استراتژی معاملاتی یا الگوریتمی را در قالب یک برنامه کامپیوتری پیادهسازی کنید. سپس این برنامه راهاندازی شده و به طور مداوم روی یک درگاه مشتری متاتریدر اجرا میشود. علاوه بر این، مجموعهی ارسال، شامل تعدادی از رباتهای تجاری،اندیکاتورها، و اسکریپتها از طرف توسعهدهندهی پلتفرم به صورت سورس کد است که توسعهی زبان و تکنیکهای تحت برنامه را بسیار تسهیل میکند. همچنین MQL با منبع اطلاعاتی دقیق به صورت آنلاین و آفلاین ارائه میشود. یک جامعه عظیم در اطراف این زبان وجود دارد.
بیایید بگوییم شما اندیکاتوری جالب یا الگوریتم تجاری هوشمندی دارید که میخواهید در کار خود استفاده کنید یا شاید میخواهید بازار را با استفاده از شبکههای عصبی (neural networks) تجزیه و تحلیل کنید؟ هیچ محدودیتی وجود ندارد. با استفاده از MQL میتوانید هر ایدهای را به صورت اندیکاتور، اکسپرت یا برنامه دیگر، کامپایل، اشکال زدایی، بررسی دادههای تاریخی در تست کننده استراتژی، پیاده سازی کنید –همهی این موارد، به صورت فعال در تجارت امکان پذیر است، بدون آن که خطر مالی به همراه داشته باشد.
بیایید خلاصه کنیم! MQL مشکل نوشتن برنامههای کمکی برای نظارت بر وضعیت یک حساب تجاری، محاسبهاندیکاتورها و سطوح، دریافت سیگنالهای معاملاتی و تعیین نقاط ورود و خروج از بازار را حل میکند. ابزارهای زبان به یک ربات یااندیکاتور تجاری اجازه میدهد تا با استفاده از پروتکل TCP، که شامل رمزگذاری TLS یا پروتکل HTTP میباشد، مبادله اطلاعات را با یک سرور از راه دور سازماندهی کند. ارسال دادهها از طریق FTP و همچنین ارسال نوتیفیکیشنها به ایمیل و یا موبایل کاربران متاتریدر امکان پذیر است. یک برنامهی خوب و بدون باگ و اشکال تا زمانی که تصمیم بگیرید بر روی آن تغییراتی ایجاد کنید یا آن را کاملاً با برنامه دیگری جایگزین کنید، برای شما کار خواهد کرد. تنها چیزی که باید به آن اهمیت دهید یک سری کنترل جنرال و کلی است.
داستآنهای پشتپرده زبانهای MQL4 و MQL5
MQL در نتیجه توسعه تکاملی پلتفرم پدید آمد. این ابزاری برای مدیریت خودکار حسابهای معاملاتی در متاتریدر است. من به تفصیل به این نکته نمیپردازم، اما تا حدی آن را بررسی خواهم کرد.
متاکوئتز، زبان متاکوئتز (MetaQuotes Language) را همراه با پلتفرم متاتریدر که قبلاً برنامه FX Charts بود، منتشر کرد. MQL همراه با به روزرسانی متاتریدر3، به نسخه دوم رسید. در اینجا متاکوئتز، رابط برنامهنویسی نرمافزار متاکوئتز (MetaQuotes API) را که به عنوان یک لایهی افزونه بین کاربر متاتریدر (MetaTrader Client) و سرور متاتریدر (MetaTrader Server) در اختیار کاربران قرار داده است.
عرضه نسل چهارم این پلتفرم در اول ژولای 2005 انجام شد. همراه با آن، MQL4 نیز منتشر شد. سازگاری با زبان نسخه قبلی از بین رفته است. متاکوئتز همچنین پشتیبانی از رابط برنامهنویسی نرمافزار (API) درگاه مشتری را متوقف کرد، اما تواناییهای زبان خود را گسترش داد و روشهایی را برای ادغام کتابخانههای DLL سفارشی در برنامههای MQL ارائه داد. API فقط برای دسترسی کارگزاران (بروکرها) در سرور و سطوح مدیریتی قرار داد.
در ژوئن 2010، پس از انتشارهای متعدد، متاتریدر 5 (MT5) راهاندازی شد. متاکوئتز با طراحی مجدد منطق تجارت، اکثر محدودیتهای اعمال شده توسط ساختار داخلی پلتفرم را برطرف کرد. اما تاکنون، محبوبیت MT5 به پای نسل چهارم نرسیده است.
در فوریه 2014، MQL4 همراه با ساخت 600 درگاه مشتری MT4 به روز شد. متاکوئتز زبان را بهبود بخشید، بسیاری از ویژگیهای را از MQL5 معرفی کرد و همزمان به سرعت آن را به سطح جانشینی رساند.
ویژگیهای زبانهای برنامهنویسی MQL4 و MQL5
MQL برای ایجاد استراتژیهای تجارت خودکار استفاده میشود. کد MQL مقدماتی به کد C++ تفسیر میشود، که سپس به یک سری کد قابل اجرا تبدیل شده و در داخل درگاه به عنوان یک کتابخانه پویا کار میکند. اگر بخواهیم آن را با نسل قبلش مقایسه کنیم، این کار مانند قرار دادن کتابخانه DLL در کد اجرایی برنامه اصلی خواهد بود. این روش به سهولت توسعه و ورود در آستانهی پایین به حوزه تجارت خودکار کمک میکند. این زبان با وجود تخصص محدود و وابستگیش به پلتفرم، در بین معاملهگران محبوب است.
متاکوئتز هوای کاربران خود را داشت و برای تمام برنامههای آنها راهنمای دقیق اطلاعات ارائه میداد. سورسهای مربوط به برنامهنویسی MQL4 و MQL5 با چندین زبان توسط متاادیتور (MetaEditor) در قالب فایلهای HTM ارائه میشوند. بنابراین، شما همیشه یک راهنمای دقیق همراه با نمونه کدها در اختیار دارید تا بدانید یک رفتار مورد نیاز چگونه باید اجرا شود.
جامعه بزرگی از تجار و برنامهنویسان پیرامون MQL تشکیل شدهاند. ابزارهایی برای تسهیل ارتباط بین برنامهنویسان و بازرگانان وجود دارد. یک لایه از برنامههای حاضر-آماده برای ساده سازی روند معاملات در حال حاضر تشکیل شده است. بازاری برای مبادله برنامهها چه بصورت پولی و یا رایگان در سایت mql5.com وجود دارد. درگاه تجارت فروشگاه برنامه، پایگاه کد، مقالات و سیگنالهای سایر معاملهگران را با هم ادغام میکند. فروشگاه برنامه، صدها راه حل پولی و رایگان ماننداندیکاتورها، مشاوران، اسکریپتها و انواع برنامههای کاربردی را ارائه میدهد. این در صورتی است که خرید یک برنامه حاضر-آماده آسانتر از "اختراع مجدد چرخ" باشد.
اگر قاطعانه تصمیم گرفتهاید که خودتان بر MQL مسلط شوید و در دنیای ایجاد برنامههای خود غرق شوید، میتوانید با استفاده از این مقاله در مورد مشکلاتی که یک مبتدی هنگام برداشتن اولین قدمها در این راه با آن روبرو میشود، مطلع شوید. این متن مطالب جدید و تازهای برای افراد سطح بالا و حرفهای ندارد.
توسعه دهندگان با انتشار منظم آموزشها در قالب مقالات در حوزهی موضوعات مختلف از دنیای تجارت، اطلاعات لازم را برای پشتیبانی از استفاده کنندگان MQL فراهم میكنند. نویسندگان مقالات، تکنیکهای جدید برنامهنویسی را در نظر میگیرند، که شامل ایجاد شبکههای عصبی، تجزیه و تحلیل و حل مشکلات و محدودیتهای زبان، تجزیه و تحلیل و آزمایش استراتژیهای معاملاتی، جستجو و پیادهسازی الگوریتمهای جدید میشود.
MQL Wizard، 8 آپشن را برای MQL4 و 10 آپشن را برای MQL5 ارائه میدهد. در اینجا اسکرین شاتهای wizard برای هر دو نسخه زبان وجود دارد.
بیایید محبوبترین آنها را ببینیم:
- مشاور خبره / ربات معاملاتی (Expert Advisor / Trading Robot)؛
- اندیکاتور (Indicator)؛
- متن (Script)؛
- شامل فایلهای (.mqh) کتابخانه.
پس از کامپایل شدن، این برنامهها به صورت کد اجرایی در درایو مناسبی در درگاه مشتری متاتریدر قرار میگیرند (File→ Open Data Folder): اکسپرتها، اندیکاتورها، اسکریپتها و غیره. سپس، پس از مقدار دهی اولیه بر روی نمودار، آنها در پاسخ به وقایع ایجاد شده توسط درگاه مشتری متاتریدر در حین اجرای عملیات آغاز به کار میکنند. رویدادها محرکی برای راهاندازی برنامههای سفارشی هستند و به شما امکان میدهد تا مقداردهی اولیه و غیرفعالسازی اولیه، دریافت نرخ جدید، رویداد سفارشی بر روی نمودار، و موارد بیشتری را ردیابی کنید.
علاوه بر این، اکنون امکان ایجاد برنامههای کاربردی در پایتون وجود دارد. بر این اساس، ابزارهای پایتون در درگاه تجاری در دسترس قرار گرفتهاند.
کنترل کنندههای وقایع (event handlers) متوالی در مرجع MQL4 شرح داده شده است.
در MQL5، تعداد کنترل کنندهها در مقایسه با نسل قبلی افزایش یافته است. اکنون لیست به شرح زیر است:
بعداً لیست وقایع گسترش یافته است. و اکنون به شرح زیر است:
ربات معاملات یا اکسپرت (مشاور خبره)
در جامعهی معاملهگران، که از آن به عنوان خبره (Expert) نیز یاد میشود. اکسپرت به نمودار موجود در درگاه مشتری متاتریدر متصل است و تا زمانی که درگاه معاملاتی در حال اجرا باشد و اتصال به سرور معاملاتی امکانپذیر باشد، به طور مدام کار میکند. اکسپرت هرگونه اقدام در جهت پیاده سازی استراتژی معاملاتی، کنترل وضعیت حساب، انجام عملیات معاملاتی تحت شرایط خاص، و مدیریت اشیاء گرافیکی را به عهده داشت. هر زمان که ربات معاملاتی تیک جدیدی برای یک ابزار دریافت میکند، شروع به باز کردن معاملات میکند. اکسپرت همچنین میتواند در پاسخ به تعدادی از رویدادهای دیگر راهاندازی شود: توابعی همچون OnTimer، OnChartEvent، OnTesterTimer و غیره.
اکسپرت برای ایجاد رابط کاربر استفاده میشوند. رباتها و همچنین اندیکاتورها به اشیاء گرافیکی دسترسی دارند.
در زیر کد یک ربات تجاری ساده آورده شده است. بعد از هر تیک جدید روی نمادی که نمودار EA (EA: Export Advisor) روی آن کار میکند، معاملات بازار بررسی میشود. اگر در حال حاضر معاملهای برای برخی از نمادها وجود داشته باشد، EA منتظر بسته شدن آن است. اگر معاملهای در کار نباشد، آن گاه یکی در خلاف معامله قبلی باز میشود. پارامترهای EA: حجم، حد ضرر و حد سود حاصل توسط کاربر تنظیم میشود. در زمان اولین راهاندازی، یک پوزیشن لانگ (طولانی) را در مورد برخی از ارزها باز میکند. بعد از بسته شدن آن، معاملهی بعدی یک معاملهی شورت (کوتاه) خواهد بود، سپس دوباره لانگ و این رویه ادامه خواهد داشت. در صورت ناموفق بودن تلاش برای باز کردن یک معامله، EA یک پیام خطا برای لاگ مینویسد و به مدت 60 ثانیه به از کار میافتد، سپس این تلاش تکرار میشود. EA، صحیح بودن پارامترهای وارد شده توسط کاربر را بررسی نمیکند، بنابراین، این مسأله را با دقت کنترل کنید. در اینجا برخی از مشکلات بالقوه وجود دارد که بلافاصله قابل مشاهده هستند:
- توانایی کلی معاملات بررسی نمیشود. میتواند توسط کاربر در درگاه یا به طور خاص برای این مشاور غیرفعال شود. سرور معاملاتی نیز ممکن است محدودیتهایی در تجارت خودکار داشته باشد.
- حجم آن ممکن است از کوچکترین کمتر یا از بزرگترین آن بزرگتر باشد، و اگر سرور دارای محدودیت در حجم باشد، ممکن است مناسب نباشد. به عنوان مثال، یک کاربر 0.23 لات را وارد میکند و حداقل تغییر در سرور 0.05 لات است. در نتیجه، معامله باز نمیشود و تابع OrderSend خطایی را برمیگرداند.
- درستی سطوح توقف برای معامله نیز توسط اکسپرت بررسی نمیشود. ممکن است در حداقل / حداکثر مقادیر مجاز نباشند یا در محدودههای تعیین شده توسط سطوح فریز شده قرار نگیرند.
سادهترین کدی که میتواند به عنوان یک الگو برای پیادهسازی راهحلها در مقیاس بزرگتر مورد استفاده قرار گیرد.
این کد در 31 مارس 2020 در متاکوئتز لنگوئج ادیتور 5 ساخت 2375 (MetaQuotes Language Editor 5 build 2375) کامپایل و اجرا میشود.
اندیکاتور
اندیکاتور برای نمایش اطلاعات مربوط به دادههای قیمت که متناسب با شرایط تغییر میکند استفاده میشود. تمام انواع اسیلاتورها (نوسانگرها)، خطوط روند، و فراکتالها همه اندیکاتور هستند. اندیکاتورها به ابزارهای گرافیکی دسترسی دارند. 6 مورد از آنها در MQL4 وجود دارد، در حالی که در MQL5 تعداد آنها 18 تا است. به عنوان مثال، اندیکاتور محرک میانگین (Moving Average) مقداری از متوسط قیمت و یا مقدار ی از قیمت مسطح شده را به صورت دورهای را در گذشته نشان داده و به طور غیر مستقیم جهت آینده قیمت یک ابزار را نشان میدهد. این اندیکاتور به صورت تمام وقت روی نمودار کار میکند. هر زمان که تیک مربوطهی ابزارِ روی نمودار که اندیکاتور روی آن کار میکند دریافت شود، یا زمانی که وقایع از سمت کاربر دریافت میشود، اندیکاتور به روزرسانی شده و دوباره محاسبات را از سر میگیرد.
یک یا چند بافر با هر اندیکاتور داخل درگاه مشتری متاتریدر مرتبط هستند، جایی که دادههای عددی در آن قرار میگیرد. MQL4، 32 بافر را برای یک اندیکاتور فراهم میکند، در حالی که در MQL5 به شما امکان میدهد تا با 512 بافر کار کنید.
در زیر مثالی از سورس کد اندیکاتور Bears آورده شده است که توسط توسعهدهندگان پلتفرم همراه با متاتریدر 4 ارائه شده است.
اسکریپت (Script)
توسعه دهندگان از اسکریپتها برای ایجاد الگوریتمهایی استفاده میکنند که نیازی به پردازش داده در زمان واقعی ندارند. به عنوان مثال، برای دانلود دادههای آماری و یا اطلاعات خروجی دیباگ شده. به محض این که اسکریپتها توسط تابع OnStart به هر نمودار پیوست شوند، اجرا میشوند. این تنها موردی است که اسکریپت میتواند پردازش کند.
تصویر زیر کد اسکریپت برای بسته شدن تمام سفارشات بازار در حساب را نشان میدهد. این اسکریپت فارغ از اینکه کدام نمودار نمادی بر روی آن راه اندازی شده است، همه سفارشات را پردازش میکند. در این حالت، دستورات معلق (pending orders) نادیده گرفته میشوند.
نتیجهی اجرای این اسکریپت، خروجی زیر بر روی لاگ متاتریدر خواهد بود:
تلاش بیشتری برای آموزش این اسکریپت برای پردازش سفارشات معلق به طور جداگانه در MQL4 لازم است. ابتدا بیایید یک خصوصیت (property) ایجاد کنیم تا اسکریپت بتواند پنجرهای با دادههای ورودی را نشان دهد. در مرحله بعدی، یک شمارش (Enum: Enumeration) اضافه کنید که شامل این 3 آپشن برای بسته شدن معاملات با یک اسکریپت باشد: فقط سفارشات بازار، فقط سفارشات معلق، یا همه معاملات موجود در حساب در حال حاضر. سپس آرایهای را برای ذخیرهی تیکتهای سفارش معلق اضافه کرده و مطابق با حلقهی"for" اول آن را پر میکنیم. اکنون پردازش آپشن بسته شدن معاملات انتخاب شده توسط کاربر، باقی مانده است.
در نتیجه، چنین اسکریپتی، نه تنها تمام معاملات را میبندد، بلکه انتخاب کاربر را نیز در نظر میگیرد.
شامل پروندههای کتابخانهی (.mqh)
همانطور که از نام آن پیداست، برای گنجاندن در انواع دیگر برنامهها برای درگاه مشتری متاتریدر استفاده میشود. یک توسعه دهندهی باتجربه مجموعهای از ابزارهای خاص خود را دارد که میتواند بارها در برنامههای مختلف مورد استفادهی مجدد قرار دهد.
در ویرایشگر زبان متاکوئتز (MetaQuotes Language Editor)، شما فقط باید مسیر فایل هدر موجود را که فایل در آن محل قرار دارد، مشخص کنید. هنگام کامپایل برنامه، MetaEditor این فایل و کد آن را پیدا میکند و به جای دستور #include، کدی را از آن وارد میکند. اکنون همهی کد کتابخانه میتواند در برنامه استفاده شود.
به طور مشابه، برنامهنویسان C و C++ با درج فایلهای هدر در پروژههای خود و ایجاد پیوندهای باینری، از کد مجدداً استفاده میکنند.
مثال زیر سادهترین تفسیر از یک آرایه پویا با نام مستعار std::vector از کتابخانه استاندارد C++ را ارائه میدهد. این کد در 31 مارچ 2020 کامپایل شده، و با نسخه متا ادیتور ورژن 5.00 ساخت 237531 (MetaEditor: 5.00 build 2375) کار میکند.
انواع دادهها و سینتکس زبانهای MQL4 و MQL5
انواع دادهها و سینتکس زبان ارث برنده از C++ هستند. قبل از کامپایل شدن، کد MQL پیش پردازش میشود و به کد C++ مربوطه برگردانده میشود، بنابراین، ساختارهای زبانی که در عناصر والد (ancestor) آن معتبر هستند به احتمال زیاد کامپایل میشوند و در MQL کار میکنند. یک برنامهنویس آشنا به C، C++ یا C# میتواند به راحتی نحوی نوشتن کد MQL را بفهمد.
انواع دادهها
انواع دادههای اساسی که در MQL وجود دارد به شرح زیر است:
- مقادیر بولی (بولین) (Boolean Values)؛
- اعداد ممیز شناور 32 بیتی و 64 بیتی؛
- اعداد صحیح، همچنین 32 بیتی و 64 بیتی (single and double precision)، signed و unsigned ؛
- Char برای ذخیره دادههای کاراکتری
- شمارشهای Enum، اما کلاس enum را پشتیبانی نمیشود.
- ساختارها، کلاسها، و تمپلیتهای کلاس.
در عین حال، از توابع color (رنگ)، string (رشته) و datetime داده به عنوان توابع built-in پشتیبانی بیشتری میشود، که البته، تا حدودی کار را برای توسعه دهنده ساده میکند. کار با این توابع در زبان C به صورت سراسری (Global) سازماندهی میشود. رفتار یک رشته MQL با خانواده تمپلیتهای std::string برای C++03 تفاوت اساسی دارد. آنها را با هم اشتباه نگیرید.
سینتکس (نحو) زبانهای متاکوئتز (MetaQuotes)
MQL یک سینتکس مشابه C++ دارد. سیمنتیک و یا مفهوم والد استاندارد C ++ 03 با تغییرات جزئی به MQL منتقل شده است. در حال حاضر، MQL از نظر قابلیتها با استاندارد C ++ 03 مطابقت دارد.
تفاوت اصلی بین MQL و C++ در سیمنتیک یا مفهوم متفاوت اشارهگرها (pointer) است. اگر در C++ یک آدرس مجازی که دادهها در آن قرار دارند وجود دارد، پس در MQL این یک توصیفگر است، یک آنالوگ از یک توصیفگر استاندارد POSIX، یک شناسه عددی، نوعی پوشش (wrapper) روی یک اشارهگر خام، که توسط آن اشیاء (objects) در حافظه پویا ایجاد میشوند و با این شناسهگر موجود مرتبط میشوند. عملگر پیکان "→" برای اشارهگرهای MQL پشتیبانی نمیشود، برای اشاره به محتویات خانه در حافظه (dereferencing) با استفاده از عملگر نقطه " . " انجام میشود. توصیف کننده، دقیقاً مانند اشارهگر، باید پس از پایان برنامه حذف شود. با این حال، اگر فراموش کنید شیای را که این دسته به آن اشاره دارد از بین ببرید، زمان غیرفعال کردن برنامه، runtime این کار را برای شما انجام میدهد.
زبان MQL فاقد مفهوم یک متغیر موقتی و حرکت داده است. عبور متغیرها از طریق مرجع (reference) و مقداری که متفاوت است از C++ و به روش خاص خود در MQL پیاده سازی میشود. هر شی پیچیده (complex) یا کلاس سفارشی از طریق مرجع به تابع منتقل میشود، چه شما از اوپراتور Ampersand استفاده کنید و چه استفاده نکنید.
تعدادی از محدودیتها برای والد وجود دارد. شما نمیتوانید توابع و تمپلیتها را با تعدادی از آرگومآنهای متغیر بنویسید. اما آنچه که جالب توجه است این است که، تعدادی از توابع built-in مانند iCustom (که بعداً در این مقاله آن را تجزیه و تحلیل خواهیم کرد)، printf، StringFormat، PrintFormat تعدادی از آرگومآنهای متغیر را میگیرند. پارادوکس جالبیست!
در MQl کار با رفرنسهای داده و شی، از بعضی جهات، نسبت به C++ متفاوت است، اما همه آنها با استفاده از پیامهای کامپایلر به راحتی از بین میروند. تفاوتهایی در signature (امضا)ها در تابع copy constructor (سازنده کپی) و copy assignment operator (عملگر انتساب کپی) به دلیل سمنتیکها و معانی مختلف عبور متغیرها با استفاده از مرجع، وجود دارد. همچنین، هیچ موو سمنتیکی (move semantic) برای متغیرهای متحرک و نمونههای شی در MQL وجود ندارد.
تفاوت بین کدهای MQL4 و MQL5
تفاوتهای بین زبان نسل چهارم و پنجم MQL، به دلیل تفاوت بین خود پلتفرمهای متاتریدر 4 و متاتریدر 5 است. لازم به ذکر است که از زمان انتشار ساخت 600 MT4، تنها نسخه پنجم ویرایشگر زبان متاکوئتز ادیتور (MetaQuotes Language Editor) برای نوشتن و کامپایل برنامهها در MQL4 و MQL5 استفاده میشود. به طور خاص، زبانها به روشهای مختلفی با عملیات معاملاتی کار میکنند، زیرا پلتفرم پنجم حالتهای معاملاتی بیشتری دارد و مفاهیم سفارش، معامله، و پوزیشن از یکدیگر جدا شده اند.
اکنون برای ارسال درخواستها، تنها از تابع OrderSend استفاده میشود، برخلاف نسخه چهارم، که در آن از توابع جداگانه برای تنظیم، اصلاح، و یا حذف سفارش استفاده میشود.
MQL4 | MQL5 | |
---|---|---|
Timeframes | 9 (M1, M5, M15, M30, H1, H4, D, W, MN) | 21 (M1, M2, M3, M4, M5, M6, M10, M12, M15, M20, M30, H1, H2, H3, H4, H6, H8, H12, D1, W1, MN1) |
Estilos de dibujo | 6 DRAW_NONE DRAW_LINE DRAW_SECTION DRAW_HISTOGRAM DRAW_ARROW DRAW_ZIGZAG With build 600, the number has become consistent with the fifth version | 18 DRAW_NONE DRAW_LINE DRAW_SECTION DRAW_HISTOGRAM DRAW_HISTOGRAM2 DRAW_ARROW DRAW_ZIGZAG DRAW_FILLING DRAW_BARS DRAW_CANDLES DRAW_COLOR_LINE DRAW_COLOR_SECTION DRAW_COLOR_HISTOGRAM DRAW_COLOR_HISTOGRAM2 DRAW_COLOR_ARROW DRAW_COLOR_ZIGZAG DRAW_COLOR_BARS DRAW_COLOR_CANDLES |
Event-driven launch model | OnInit OnStart OnDeinit OnTick OnCalculate OnTimer OnChartEvent OnTester | OnInit OnStart OnDeinit OnTick OnCalculate OnTimer OnTrade OnTradeTransaction OnBookEvent OnChartEvent OnTester OnTesterInit OnTesterDeinit OnTesterPass |
Trading | OrderSend OrderModify OrderDelete The behavior is specified by a separate set of parameters for each function. It complicates writing and debugging programs. | OrderSend One function for all operations. The required behavior is specified in the MqlTradeRequest structure. The response is returned to the MqlTradeResult structure. It is easier to design the behavior, test the result, and debug the program. |
Indicator data buffer | 32 | 512 |
Built-in indicators | Quantity: 30 | Quantity: 38 Indicators are created using handles. The number of copies and memory consumption have been reduced. |
Trading Modes | Hedging | Netting Hedging Stock |
OpenCL and DirectX graphics tools | No | Yes |
Generation of trading robots | No | Yes. At the same time, you can specify custom signal modules. |
بنابراین، تعداد تفاوتها اندک است، اما به هر حال وجود دارند. پس از بروزرسانی در ساخت 600، MQL4 با MQL5 فقط در بخشی متفاوت است که یک پلتفرم با پلتفرم دیگری متفاوت است. وبلاگ LiteFinance در حال حاضر مقالهای دارد که به مقایسه متاتریدر 4 و متاتریدر 5 اختصاص دارد، اکیداً توصیه میکنم اگر میخواهید دانش خود را در این زمینه بیشتر کنید، آن را مطالعه کنید.
برنامهنویسی اندیکاتور MQL4: نحوه نوشتن یک اکسپرت (مشاور خبره: Export Advisor) در MQL4 یا MQL5
پیش از شروع به نوشتن یک اکسپرت، باید بدانید که باید از قبل یک استراتژی تجارت داشته باشید. فقط در این صورت است که میتوانید ایده را در قالب یک الگوریتم رسمیشروع کنید. خود کد تنها یک ابزار زبانی است که اجرای یک ایده خاص فراهم میکند.
بنابراین، اولین چیزی که شما نیاز دارید یک استراتژی تجارت کارا است. مسئله توسعهی این ایده خارج از محدوده این مقاله است، بنابراین بیایید یک مثال ساده بزنیم. بیایید موارد زیر را فرض کنیم. در زمآنهایی که ابزار کم فعالیت است و به اصطلاح در حالت "فلت" هستیم، میتوان معاملات را در جهت مخالف با سطوحی از محدودیتهای کوچک باز کرد. این به شما این امکان را میدهد که از حرکتهای کوچک بازار خنثی استفاده کرده و سود کسب کنید.
ما یک اکسپرت خواهیم نوشت که باز کردن دستی معاملات و کنترل محدودیتهای آنها را اتوماتیک کرده تا به صورت خودکار عمل کند و آن را در دورههای فلت معاملات در یک حساب تجاری راه اندازی خواهد کرد.
در ابتدا، بدون در نظر گرفتن نسخه زبان، روش کار یکسان است. برای نوشتن برنامهها در MQL، باید درگاه مشتری متاتریدر (MetaTrader Client Terminal) را نصب کنید، بستهی ارسالی آن شامل متا ادیتور (MetaEditor) است. اکنون میتوانیم MetaEditor را مستقیماً از فهرست کاری درگاه، و یا از طریق منوی اصلی در درگاه تجاری: Tools و سپس MetaQuotes Language Editor (F4) راه اندازی کنیم. در پنجرهی MetaEditor در منوی اصلی، روی File → New کلیک کنید. همین کار پس از کلیک روی گزینه New در فهرست گرافیکی انجام میشود.
نحوهی ایجاد ربات معاملاتی MQL4
در برنامهی سازندهی MQL4 EA (اکسپرت MQL4)، Wisard اکسپرت (EA: Expert Advisor) (الگو) را انتخاب کرده و بر روی Next را کلیک کنید.
در مرحله بعد، پارامترهایی را که رابط کاربر برای تعامل با برنامه در اختیار کاربر قرار میدهد، وارد کرده و با کلیک بر روی Ok آن را تأیید کنید. در اینجا ما اضافه میکنیم:
- ابزاری برای معامله
- انتخاب جهت برای اولین معاملهای که ربات باز میکند. در حال حاضر، این یک عدد صحیح (interger) است، اما بعداً ما کد را درست میکنیم تا فقط "خرید" یا "فروش" انتخاب شود.
MetaEditor به طور خودکار کنترل کننده رویداد OnTick را در کد گنجانده است. بقیه موارد را باید خودتان انتخاب کنید. همانطور که مشاهده میکنید، ما علاوه بر این به OnTimer دسترسی داریم که هر بار با تنظیم تکرار برای تایمر و OnChartEvent فراخوانی میشود، که در پاسخ به اقدامات کاربر با نمودار فراخوانی میشود. در اینجا میبینید که کنترل کنندههای (handler) بیشتری برای MQL5 در دسترس هستند.
بیشتر پیش بروید و کنترل کنندههای رویداد (event handlers) را در مُد تست انتخاب کنید. در MQL5 میتوانید رویدادهای بیشتری را در مد تستر انتخاب کنید و بر این اساس تعداد بیشتری کنترل کننده برای آنها در دسترس است.
در طی دو مرحله قبلی، همه گزینهها را خالی گذاشتم. تمام منطق ما با تابع OnTick اجرا میشود. هر زمان که یک تیک جدید برای یک سمبل وارد میشود، این تابع فراخوانده میشود.
پس از کلیک بر روی دکمه Finish، MetaEditor الگویی را برای اکسپرت (EA) آینده با نام و پارامترهای مشخص شدهای ایجاد میکند. کنترل کنندههای رویداد انتخاب شده نیز در کد گنجانده خواهند شد. من به تفصیل به هر یک از آنها نمیپردازم. تمام اطلاعات لازم در این باره در راهنمای مرجع موجود است.
این کد هم اکنون میتواند در درگاه تجاری کامپایل شده و اجرا شود. اما هیچ اتفاقی نمیافتد. ما متغیرهای ورودی داریم، اما هنوز از آنها استفاده نمیکنیم. تابع OnInit همیشه درگاه را در مورد مقداردهی اولیه موفقیت آمیز آگاه میکند، در حالی که توابع OnTick و OnDeinit هیچ دستورالعملی ندارند.
بیایید شروع به نوشتن کد کنیم.
در ابتدا بیایید فضاهای اضافی را حذف کرده و کامنتها را به یک خط خلاصه کنید. سپس دادهی شمارشی (enume) TradeCmd (خطوط 11-14) را تعریف میکنیم تا جهت اولین معامله را در حالتی طبیعی و نه به صورت عدد مشخص شود. سپس نوع متغیر ورودی FirstTradeDirection را از int به TradeCmd(20) تغییر دهید. مرحله بعدی ایجاد یک متغیر ثابت سراسری Direction با نوع TradeCmd، در جهت معاملهی قبلی ایجاد کنید و برای معاملات بعدی آن را در جهت مخالف تغییر دهد.
در ابتدا، فراموش کردم متغیرهایی را برای حجم معاملات، سطوح حد ضرر، و حد سود در Wizard اضافه کنم. اکنون آنها را با کیوورد input و سایر تنظیمات خارجی اضافه میکنیم.
یایید به سراغ تابع OnTick برویم. ما در دسترس بودن معاملات باز را آنالیز میکنیم. برای این کار، ما با استفاده از یک چرخه ساده در محدودهی [0, TotalTrades)، در تمام معاملات باز تکرار میکنیم. ما یک به یک بررسی میکنیم که نماد معاملهی انتخاب شده با نماد مشخص شده در InputSymbol مطابقت داشته باشد. وقتی که حداقل یک معامله از این قبیل وجود داشته باشد، دیگر کاری لازم نیست انجام شود. و ما از تابع OnTick، زودتر از زمان تعریف شده در Return (خطوط 29-35)، خارج میشویم. منتظر شروع بعدی باشید.
در غیر این صورت، شما باید معاملهای را باز کنید. برای استفاده صحیح از تابع OrderSend، که به کمک آن درخواستی را به سرور معامله ارسال میکنیم، بگذارید به اسناد MQL4 مراجعه کنیم. اعلان به این شکل است:
بیایید پارامترها را به ترتیب در نظر بگیریم:
- نماد (symbol). ما هم اکنون آن را داریم، اما به هیچ وجه صحت را بررسی نمیکنیم و فقط به آنچه که کاربر به عنوان ورودی وارد میکند، اعتماد میکنیم.
- CMD. برای این منظور از متغیر استاتیک سراسری Direction استفاده میکنیم.
- حجم (Volume). توسط کاربر مشخص شده است. مجدداً، لازم است مقدار وارد شده برای محدودیتها بررسی شود: حداقل، حداکثر، و حداقل سطح تغییر حجم.
- قیمت (price). اگر خرید میکنیم درخواست فروش (Ask) دهیم، اگر میفروشیم پیشنهاد قیمت (Bid) دهیم.
- لغزش (Slippage). در مورد ما، این موضوع آن قدرها مهم نیست. آن را روی 2 پیپ (pip) تنظیم کنید.
- حد ضرر (Stoploss). باز هم، این بستگی به جهت تراکنش دارد. اگر ما خرید میکنیم باید از قیمت باز کردن معامله کمتر باشد و اگر میفروشیم از قیمت باز کردن معامله بیشتر باشد.
- حد سود (Takeprofit). مانند حد ضرر، به جهت معامله بستگی دارد.
چهار پارامتر دیگر با مقدار پیش فرض هنوز مورد توجه ما نیستند. در نتیجه، برای باز کردن یک معامله: InputVolume (یعنی حجم)، Direction (یعنی جهت معامله)، InputSymbol (یعنی نماد)، لغزش را روی 1 نقطه تنظیم کنید. آنچه ما باید بسته به Direction محاسبه کنیم این موارد هستند: Price (به عنوان قیمت باز)، Sl (به عنوان حد متوقف) و TP (به عنوان حد سود). اگر ما خرید کنیم، سپس قیمت آن Ask است، Stoploss کمتر از قیمت فعلی، و Take profit بالاتر است، در غیر این صورت، اگر ما بفروشیم، قیمت Bid است، Stoploss بالاتر از قیمت فعلی است، و Take Profit کمتر است . ما همچنین به 2 متغیر اضافی نیاز داریم. اولین مورد برای تبدیل سطح محدودیتها از نقاط به نقطه مقدار اسمیاست که حداقل مقداری است که به وسیلهی آن پیشنهاد یک نماد میتواند تغییر کند. مورد دوم برای عادی سازی مقادیر با نقطه شناور رقمیاست که تعداد ارقام قابل توجهی در بخشی از پیشنهاد قیمت است.
این را به MQL تبدیل کنید.
ما مستقیماً شروع به باز کردن معامله میکنیم. ما متغیر سیستم _LastError را با تابع داخلی ResetLastError مجدداً تنظیم میکنیم. ما با استفاده از تابع OrderSend درخواستی را ارسال میکنیم و نتیجه را در متغیر result مینویسیم. برای توسعه رویدادها دو آپشن وجود دارد:
- اگر result حاوی مقداری بیشتر از صفر باشد، معامله با موفقیت باز شده است. بنابراین، برای اینکه دفعه بعد معاملهای در جهت مخالف ایجاد کنیم، باید مقدار Direction را تغییر دهیم.
- اگر result حاوی مقدار منفی باشد، معامله باز نشده است. شما باید آخرین خطا را با استفاده از GetLastError بررسی کنید، آن را تجزیه و تحلیل کنید و کاری انجام دهید: دوباره امتحان کنید، مدتی کاری نکنید، اطلاعات دیباگ را به قسمت لاگ وارد کنید، و غیره. برای سادگی، مقدار آخرین خطا را به لاگ وارد میکنیم.
بیایید نگاهی به آن بیندازیم.
بنابراین، پس از چند ده خط کد نوشتن، ربات معاملاتی ما آماده است. البته من اعتراف میکنم که این ربات هنوز خیلی کاربردی نیست، اما میتواند به عنوان یک نمونه عالی از این واقعیت باشد که نوشتن کد به دانش زیاد و تلاش قابل توجهی نیاز ندارد.
در صورت نیاز، یک لیست کاملی در اینجا آمده است.
ما کد را کامپایل کرده و اکسپرت (Expert Advisor) را در درگاه تجاری راه اندازی میکنیم.
نحوه ایجاد یک اکسپرت در MQL5
در اینجا MQL5 برتری انکارناپذیری نسبت به MQL4 دارد. شما میتوانید برای نسخه پنجم یک ربات معاملاتی را تنها با چند کلیک ایجاد کنید، بدون اینکه حتی یک خط کد بنویسید.
در MetaEditor، روی New کلیک کنید و Expert Advisor (تولید) را در برنامهی Wizard انتخاب کنید.
بیایید نام اکسپرت خود را MQL5_Generated_Robot بگذاریم. در صورت تمایل، نویسنده و وبسایتش یا پروفایل او را نشان میدهیم. در صورت لزوم پارامترهای اکسپرت را اضافه کنید: نماد (symbol) و بازه زمانی (timeframe) معاملات. با دوبار کلیک کردن پارامتر فعال میشود، با کلیک بر روی نام یا مقدار متغیر امکان تغییر پیشفرضهای پیشنهادی برای شما فراهم میشود. میتوانید هر نمادی را که میخواهید تنظیم کنید. من آن را به عنوان شکل فعلی تعریف کردم، که در نمودار اکسپرن (EA) کار میکند. من برای افزایش احتمال سیگنالهای معامله، بازه زمانی را روی M15 تنظیم کردم.
بیایید جلوتر برویم. حال باید یک سیگنال انتخاب کرده و تنظیمات مربوط به آن را انجام دهیم. در اینجا میتوانید ترکیبات سیگنالهای مختلف پیشنهاد شده توسط توسعه دهندگان را امتحان کنید. این سیگنالها باعث ایجاد رویدادها برای اکسپرت به منظور انجام معاملات میشود.
شما میتوانید سیگنالهای سفارشی را از جمله آنهایی که برای نظارت در mql5.com است، به این بخش اضافه کنید. گزینههای زیر به طور پیش فرض با پلتفرم ارائه میشوند:
من "معامله در تقاطع دو میانگین: Trading at the intersection of two averages" را انتخاب کردم و دورههایی را که برابر با 21 و 55 تنظیم کردهام . اگر بخواهید تعداد خطاهای مثبت کاذب را کاهش دهید، انتخاب دورههای خیلی کوتاه مدت مطلوب نخواهد بود. نماد فعلی را ترک میکنیم. به عنوان مثال، ما EURJPY را معامله خواهیم کرد و سیگنالهایی را از میانگین متحرک اعمال شده روی دادههای قیمت همان EURJPY دریافت خواهیم کرد. اگر استراتژی شما وابسته به رفتار ابزار دیگری باشد، نماد متفاوتی را در اینجا انتخاب کنید. من همچنین زمان را روی M15 تنظیم کردم.
تایید. میبینیم که سیگنالی برای نماد و بازه زمانی فعلی اضافه شده است، که رویدادهایی را برای اکسپرت (EA) ایجاد میکند.
به حالت Trailing Stop بروید. در اینجا من یک محدودیت با اندازهی ثابت را انتخاب کردهام . من همچنین حد ضرر را در 150 نقطه و حد سود را در 200 نقطه تنظیم میکنم.
در مرحله بعدی، ما میتوانیم از بین پنج حالت مدیریت پول برای یک حساب تجاری، یکی را انتخاب کنیم. تجارت با موارد زیر در دسترس است:
- حجم تجارت ثابت (Fixed Trade volume)؛
- حاشیه ثابت (Fixed margin)؛
- ریسک ثابت (Fixed risk)؛
- حداقل حجم تجارت مجاز؛
- حجم تجارت بهینه شده.
من با ریسک ثابت 1٪ از وجوه موجود در حساب، تجارت کردم.
روی Done کلیک کنید و سود کسب کنید! ما یک اکسپرت، بدون نوشتن حتی یک خط کد، ایجاد کردهایم.
بیایید نگاه دقیق تری بیندازیم و تحلیل کوچکی روی منابع انجام دهیم.
قسمت بالایی جدول و صفات - همه چیز آشنا است. سپس شامل ماژولهای کتابخانه میشود. اکسپرت ربات ماست. MACross یک تولید کننده سیگنال برای عبور میانگین متحرک (Moving Average) است، TrailingFixedPips یک ماژول کنترل کنندهی سطح محدودیت است، MoneyFixedRisk یک ماژول مدیریت ریسک است. سپس تنظیماتی که شامل متغیرهای ورودی هستند که اینترفیس یا همان رابط کاربری برای تعامل با برنامه را تعریف میکنند. به نظر آشنا میآید، اینطور نیست؟ البته! ما آنها را درExpert Advisor Generation Wizard تنظیم میکنیم. در آینده، مقادیر پیش فرض ممکن است در اینجا تغییر کند.
در مرحلهی بعد، یک متغیر سراسری خودکار از نوع CExpert اعلان شده، که با مقدار پیش فرض مقدار دهی اولیه شده است. برای یک شی، این بدان معنی است که سازنده پیش فرض فراخوانی شده است. در بدنهی OnInit، اکسپرت (EA) مقداردهی اولیه شده است، سیگنالها و فیلترها ایجاده شدهاند و با مقادیر مشخصی در تنظیمات مقداردهی شدهاند. در زیر کدی آورده شده است که من همهی بررسیهای نتایج مقداردهی اولیه برای موفقیت و توصیفگرها برای اعتبارسنجی در سفارش را حذف کردهام تا به لحاظ بصری حجم کد نوشته شده را کاهش دهم.
در زیر میتوانید توابع OnDeinit، OnTick، OnTimer، OnTrade را مشاهده کنید. هر کدام از آنها به سادگی متد مربوط به کلاس CExpert را فراخوانی میکنند.
اگر دقت کنید، در نَویگِیتور سمت چپ در پوشه Include -> Experts، میتوانید سیگنالها و ماژولهای موجود در تولیدکننده (ژنراتور: generato) را مشاهده کنید. بر این اساس، میتوانید راه حلهای تخصصی به ژنراتور اضافه کرده و تنها با چند کلیک برخی موارد را برای هرگونه که نیاز است ایجاد کنید.
بیایید سعی کنیم کد را کامپایل کنیم. صفر خطا و صفر هشدار، این یک موفقیت است. برای راه اندازی حالت آزمایشی استراتژی، همزمان دکمههای Ctrl و F5 را فشار دهید یا روی دکمه موجود در منوی گرافیکی در بالا کلیک کنید.
کنترل در تنظیمات تست کننده استراتژی به درگاه مشتری متاتریدر منتقل میشود. سپس ما فایل را برای آزمایش و پیکربندی بقیه پارامترها انتخاب میکنیم: نماد (symbol)، بازه زمانی (timeframe)، عمق تاریخچه (history depth)، مانده و اهرم (balance and leverage) حساب معاملاتی، و غیره. تنظیمات زیادی وجود دارد و برای هر یک از آنها توضیحاتی در فایل مرجع وجود دارد. برای اطلاعات دقیق در مورد تنظیمات و حالت تست، روی تستر تمرکز کنید و F1 را فشار دهید.
برای شروع، در گوشه پایین سمت راست تستر، Start را فشار دهید و اگر آزمایش بدون بهینه سازی انجام شد، میتوانید حالت تصویری (visualization mode) را برای استراتژی خود انتخاب کنید.
توسعهدهندگان به خوبی توضیحاتی را برای هر ماژول و سیگنال داخلی در https://www.mql5.com/en/docs/standardlibrary/expertclasses ارائه دادهاند. برای گسترش دانش خود در این سوال، از مراجعه به این اسناد و توضیحات درنگ نکنید.
مزایا و معایب زبانهای MQL4 و MQL5
اِشکال اصلی در همین هدف این زبانها است. متاکوئتز کوئرینگ لنگوئج (MetaQuotes Querying Language) یک زبان برای نوشتن برنامههای کاربردی فقط برای متاتریدر (MetaTrader) است. کامپایل کردن و دیباگینگ (اشکال زدایی) کد MQL فقط در محیط متاتریدر امکان پذیر است. تنها درگاه مشتری متاتریدر (MetaTrader Client Terminal) میتواند برنامه را برای اجرا راه اندازی کند. هیچ مدیریت حافظهی دستی وجود ندارد. شما همچنان انتخاب میکنید که متغیر را روی پشته (stack) یا در دامنهی پویا (dynamic scope) ایجاد شود، اما در هر صورت، به آدرس مجازی آن دسترسی ندارید.
این برنامه شایستگیهای بسیار بیشتری دارد. یادگیری آسان، به ویژه اگر قبلاً تجربه کدنویسی در زبانهای دیگر را داشته باشید. عملکرد بسیار بالا در سطح C و C++. پشتیبانی از سبک برنامهنویسی شی گرا: محصورسازی و توسعه پذیری، وراثت، چند شکلی و روشهای مجازی کلاسها. امکان ایجاد الگوهایی برای کلاسها و توابع، یعنی چند شکلی پارامتریکی. همه اینها باعث میشود که کد بارها مورد استفاده مجدد قرار گیرد. زیرساخت رایگان شامل یک درگاه تجاری، محیط توسعه، تستر برای آزمودن استراتژی، و کتابخانهها میباشد.
تبدیل MQL4 به MQL5
بیایید تبدیل به روزرسانی یک برنامه از یک نسخه به نسخه دیگر را با استفاده از مثال یک ربات، که قبلاً در این مقاله در بخش قابلیتهای زبان ارائه شده بود، بررسی کنیم. برای این کار یک اکسپرت (EA) خالی در MetaEditor 5 ایجاد کنید و کد منبع MQL4_Example_EA Expert Advisor را در آن کپی کنید. شما قادر نخواهید بود این کد را بدون تغییر کامپایل کنید، هنگام تلاش خطاهای زیادی رخ میدهد.
در ابتدا، تقریباً هیچ چیز تغییر نمیکند، به جز چند نکته:
- #property را از دستورالعملهای پیش پردازنده حذف کنید، بنابراین منطقی به نظر میرسد هنگامیکه کد MQL4 کامپایل میشود.
- منتقل کردن متغیر استاتیک Direction به بالای تابع مقداردهی اولیه EA، تا متناسب با موقعیتهای موجود، به روش خاصی در OnInit، آن را مقداردهی کند. در آینده، این امکان را به شما میدهد تا تنظیمات EA را در میانهی فرآیند تجارت تغییر دهید.
توجه داشته باشید که اکنون انتخاب معامله برای هر نماد در MQL5 با استفاده از تابع داخلی PositionSelect، بدون نیاز به جستجوی همه معاملات باز، آسان تر است.
بیایید تابع OnTick را به طور کامل در نظر بگیریم. ما از PositionSelect برای بررسی پوزیشن باز نماد استفاده میکنیم. اگر چنین موردی وجود ندارد، به داخل بدنهی if بروید و آماده ارسال درخواست برای باز کردن یک معامله شوید. MQL5 به خوبی ساختار MqlTradeRequest را برای ایجاد یک درخواست، در مقابل یک سری پارامترها در MQL4، در اختیار ما قرار میدهد. اکنون هر یک از فیلدهای آن را جداگانه در نظر نخواهم گرفت. بگذارید توجه داشته باشیم که دقیقاً مانند MQL4، ما 4 پارامتر از 7 پارامتر مورد نیاز را در اختیار داریم: نماد تجارت، حجم، جهت و انحراف از قیمت درخواستی. ما سه مورد باقیمانده (قیمت باز کردن معامله، حد ضرر و حد سود) را متناسب با جهت معامله محاسبه میکنیم. ساختار را به ترتیب پر میکنیم. اکنون نیازی به عادی سازی اعداد ممیز شناور نیست، بنابراین نیازی به متغیر رقمینیست.
ارسال درخواست در آخرین نسخه زبان، کوتاهتر و مختصرتر به نظر میرسد. تمام اطلاعات مربوط به نتیجه اجرای تابع OrderSend اکنون در MqlTradeResult به ما بازگردانده میشود.
من مبحث را با کد زیر بعد از انجام دیباگینگ و آزمودن آن به وسیلهی یک سری تست، به پایان رساندم. اندازه تغییر نکرده است، اگرچه ما تغییری در منطق آن ایجاد کردیم که در تابع Onlnit در مرحلهی اولیه، نیازمند اقدامات اضافی بود.
بیایید خلاصه کنیم. به روزرسانی برنامهها از MQL4 به MQL5 آسان است. اگر دانش مقدماتی در مورد MQL داشته باشید، انجام آن توسط خود شما کار دشواری نخواهد بود.
بعلاوه، من به طور خاص تعدادی از متداول ترین سؤالات پیرامون MQL را برای شما انتخاب کردم و سعی کردم به آنها به صورت مختصر و مفید پاسخ دهم.
سؤالات متداول MQL4 و MQL5
MetaQuotes Language یک زبان برنامهنویسی سطح بالا است که برای نوشتن برنامههای کاربردی در پلتفرم معاملاتی MetaTrader با نوعدهی کم زور (سختگیری قواعدی ندارد: weakly typed) استاتیک، که از نظر سینتکسی و یا همان قواعد نحوی بسیار شبیه به زبان والد خود یعنی C++ است، استفاده میشود. زبان متاکوئتز مفهوم پارادایم چندگانه را پیاده سازی میکند. در حین کدنویسی، میتوانید از رویکرد شی گرا، عملگرا، رویهای یا ترکیبی استفاده کنید. OOP از کپسوله سازی، وراثت و چند شکلی پشتیبانی میکند. الگوهای تابع و کلاس موجود است. متأسفانه، استفاده از برنامه نویسی متا (metaprograming) با محاسبه زمان کامپایل امکان پذیر نیست.
برای نوشتن برنامه در MQL، باید درگاه مشتری متاتریدر (MetaTrader Client Terminal) را نصب کنید. بستهی ارسال آن شامل محیطی برای توسعهی برنامهها در MQL با نام MetaEditor است. ما آن را با استفاده از منوی اصلی Tools -> MetaQuotes Language Editor (F4) راه اندازی میکنیم. اکنون آماده نوشتن اولین برنامه MQL خود هستیم.
نتیجه اجرای چنین برنامهای در درگاه معاملات، خروجی زیر خواهد بود:
Mq4 یک فایل متنی ساده است. این پسوند به سیستم عامل اجازه میدهد تا خود فایل را به طور خودکار با محیط توسعه MetaEditor مرتبط کند. یک فایل ex4، یک فایل اجرایی است که به عنوان متن قابل خواندن نیست و حاوی دادههایی با کد باینری است.
در حین کامپایل شدن، کد برنامه mq4 به کد قابل اجرای ex4 تبدیل میشود. این تبدیل ساده است و اغلب هنگام ایجاد برنامه اتفاق میافتد. این دقیقاً همان کاری است که کامپایلر انجام میدهد.
فرآیند معکوس، دیکامپایل کردن (جداسازی قطعات: disassembly) کد قابل اجرای ex4 به کد متن mq4 است که به ندرت اتفاق میافتد و اغلب هیچ مبنای قانونی ندارد. پروژههای متن باز (open source) به طور کلی کد منبع را به هر کسی که با قوانین توزیع، تبدیل، و استفاده از آنها موافق است ارائه میدهند. بقیه پروژهها با توجه به قانون کپیرایت از تمام توسعههایشان محافظت میکنند. هیچ ابزار استانداردی برای انجام دیکامپایل کردن (decompile) وجود ندارد.
اگر واقعاً باید کد اجرایی فایل ex4 را به کد برنامه تبدیل کنید، چه میکنید؟ در اینجا چندین پاسخ برای این سوال وجود دارد که به منظور افزایش پیچیدگی در اجرا قرار داده شده است:
- با نویسنده برنامه تماس بگیرید و از شرایط به دست آوردن کد مطلع شوید.
- برنامه نویسی را پیدا کنید که بتواند منطق برنامه ex4 شما را پیاده کند و با او مذاکره کنید.
- MQL را بیاموزید و برنامهای را بنویسید که معادل برنامهای که در قالب ex4 دارید، باشد. این مسیر آسان نیست، اما حداقل امکانات شما را نسبت به سایرین که این قابلیت را ندارند گسترش میدهد.
- دیکامپایل کردن را توسط خودتان یا با کمک کسی انجام دهید. لطفاً از مسئولیت مندرج شده در قانون کپی رایت آگاه باشید.
فایلهای mq4 و mq5، فایلهای متنی سادهای هستند که حاوی کد MQL به صورت متن هستند. اگر نمیخواهید کد منبع خود را به اشتراک بگذارید، آسانترین کار در این شرایط توزیع نکردن فایلها در این قالب است.
یک راه ساده برای محافظت از کدتان توزیع آن در قالب ex4 (ex5) است. هنگام کامپایل شدن کد mq4 (mq5)، فایلها در این قالب توسط MetaEditor تولید میشوند. مطابق با قوانین زبان، دستورالعملهای موجود در متن به یک کد باینری قابل اجرا تبدیل میشوند که با اضافه کردن خبره (مشاور: advisor)، اسکریپت، یا اندیکاتور به نمودار، توسط درگاه اجرا میشود.
جدا کردن (disassembling) کد اجرایی از نسخه اصلی یک کار بیاهمیت نیست، این کار به محافظت از کد منبع شما کمک میکند. در هر صورت، هنگام دیکامپایل کردن کد منبع، نام متغیرهای معنیدار کد شما از بین میرود، بنابراین درک منطق برنامه بسیار دشوارتر خواهد شد.
MetaQuotes Language یک زبان برنامهنویسی سطح بالای شیگرا است، با تایپ استاتیک کم زور که از C++ به ارث رسیده است. MQL5 توسعهی منطقی زبان MQL4 است که همراه با پلتفرم MetaTrader 5 منتشر شد. بعدها، تأثیر بسزایی در توسعهی MQL4 داشت و به بروزرسانی آن کمک کرد.
در MQL5 ابزاری برای تولید اکسپرت (Expert Advisor) وجود دارد که به شما این امکان را میدهد تا از نوشتن هر گونه کدی با دست بینیاز باشید. با چند کلیک، یک ربات معاملاتی به همراه کد منبع دریافت خواهید کرد. آن را برای معامله که با استفاده از سیگنالها انجام میشود، تنظیم کنید. کنترل وضعیت حساب معاملات، بر اساس استراتژیهای مدیریت ریسک و پول ارائه شده، که در درگاه معاملاتی صورت میگیرد.
دانلود اندیکاتور هیچ تفاوتی با دانلود هر فایل دیگر بر روی کامپیوتر شما ندارد. این کار باید روی کامپیوتر انجام شود، زیرا MQL فقط با نسخه دسکتاپ MetaTrader Client Terminal قابل استفاده است. فهرست کار درگاه را باز کنید (File → Open Data Folder). در مرحلهی بعد، به فهرست اندیکاتورهای MQL بروید و اندیکاتور دانلود شده را در اینجا جای گذاری کنید. پس از ریاستارت کردن درگاه، اندیکاتور در Navigator در دسترس خواهد بود. تنها کاری که باید انجام دهید انتقال آن به نمودار و تنظیم پارامترهای ورودی است.
در واقع، تمام برنامههای MQL4 یا MQL5 با استفاده از نسخه پنجم ویرایشگر زبان متکوئتز (MetaQuotes Language Editor) ایجاد میشوند. در نتیجه، سازگاری بین نسخههای اصلی و فرعی زبان از گذشته تا به امروز وجود دارد. تنها محدودیتی که در این مورد وجود دارد، خود سرور MetaQuotes است. برخی از توابع و ساختارها در نسخه چهارم پلتفرم وجود ندارند. منطق پردازش عملیات تجاری در نسخه پنجم سرور تا حدی تغییر کرده است. در ساختار داخلی اندیکاتورها نیز تفاوتهایی وجود دارد. در نسخه چهارم، بیش از هشت بافر اندیکاتور قابل استفاده نیست. در MetaTrader 5، تعداد بافرها به 21 عدد افزایش یافته است.
تابع داخلی iCustom به شما امکان میدهد تا از سیگنالهای اندیکاتورها برای پیادهسازی منطق معاملات در داخل EA استفاده کنید. اگر اندیکاتور خود را دارید و میخواهید سیگنالهای تجاری را در اکسپرت برای انجام عملیات تجاری ایجاد کنید، باید از iCustom برای این کار استفاده کنید. بیایید نگاهی به اسناد بیاندازیم. در اینجا میتوانید تعریف MQL4 را مشاهده کنید:
تعریف MQL5:
اساساً، تابع همان کار را میکند، حتی اگر امضای (signature) آن در نسخه چهارم و پنجم زبان متفاوت باشد. بیایید نگاهی دقیقتر به هر یک از پارامترها بیندازیم:
- خط نماد رشته (String symbol line). این نمادی است که محاسبه خواهد شد.
- بازه زمانی (Timeframe). در MQL4 یک عدد صحیح از نوع int است، در MQL5 نیز یک عدد صحیح است اما از نوع enum که حاوی شمارش بازههای زمانی میباشد.
- نام پارامتر رشتهای (String parameter name). شما باید مسیر اندیکاتور (مثلاً اگر در فهرست دیگری قرار دارد) و همچنین نام اندیکاتور را به همراه پسوندی که میخواهیم برای آن محاسبه کنیم، به درون آن منتقل کنید. در مرحلهی بعد، پارامترهای مورد نیاز برای اندیکاتوری که میخواهیم استفاده کنیم، منتقل میشوند.
یا به عنوان مثال، برای Ichimoku مجموعه دیگری از متغیرها خواهد بود:
بنابراین، در حالت اول، برای بدست آوردن مقدار صحیح، باید 6 پارامتر را به تابع منتقل کنید و در حالت دوم 3 پارامتر را به تابع منتقل کنید.
- دو پارامتر دیگر در MQL4 نسخه چهارم وجود دارد. حالت اول یک حالت عدد صحیح است که شاخص خط اندیکاتور را نشان میدهد و به وسیلهی runtime برای اجرای داخلی بافرهای داده استفاده میشود.
- شیفت و تغییر بعدی عدد صحیح نشان دهندهی شیفت رو به جلو و یا رو به عقب اندیکاتور در طول خط زمانی (timeline) است.
MQL وارث زبان C++ است که در آن سرور معاملاتی MetaTrader و همهی برنامههای کاربردی مرتبط از جمله Client Terminal و Language Editor نوشته شده است. متأسفانه، اگر MQL را با والد آن مقایسه کنیم، روشن است که این زبان با تأخیر در حال توسعه است. در حال حاضر، قابلیتهای MQL مطابق با استاندارد C++ 2003 است. شایان ذکر است که MQL زبان کاملاً قدرتمندی است و میتواند 99٪ نیازهای فعلی برنامه نویسان و توسعه دهندگان را پوشش دهد.
در نگاه اول، کد برنامهها در نسخههای 4 و 5 کمیمتفاوت است، اما هنوز تفاوتهایی وجود دارد. در نسخه پنجم، همهی ماکروهای نسخه چهارم با نوع شمارشی (enumeration) جایگزین شده است.
- مدل رویداد برای راه اندازی برنامههای سفارشی گسترش یافته است. مجموعه ای از کنترل کنندههای (handler) رویدادها مانند OnTrade، OnTradeTransaction، OnTesterInit، OnTesterDeinit، OnTesterPass ظاهر شدهاند. رفتار نادرست OnTick و OnTimer در حالت تست کنندهی استراتژی رفع شده است. تابع OnTimer اکنون میتواند با تایمری 1000 برابر بیشتر از MQL4 اجرا شود. به ازای یک بار در هر میکروثانیه در مقایسه با میلی ثانیه.
- MQL5 منطق ارسال سفارشات تجاری و سازوکار پاسخ به آنها را تغییر داده است. چندین تابع معاملاتی در MQL4 به یک تابع به نام OrderSend با حالتهای عملکردی مختلف، ترکیب شدهاند. خود فرآیند معامله در MetaTrader 5 با معاملات در پلتفرم چهارم متفاوت بود. یک حالت شبکهای علاوه بر تابعی که امکان تراکنشهای آنسوی پرچین (hedge) را فراهم میکند، معرفی شد. علاوه بر سفارشات MT4، پوزیشنها و معاملات نیز ظاهر شده است. این زبان اکنون از تابع OrderSendAsync برای ارسال درخواست به سرور تجارت در حالت ناهمزمان برخوردار است.
همه ماکروهای MQL4 در MQL5 با نوع شمارشی جایگزین شده اند، بنابراین کامپایلر اکنون نوع تبدیل ضمنی را به توسعه دهنده نشان میدهد.
MetaTrader 5 به شما امکان میدهد با 21 تایم فریم استاندارد در مقایسه با 9 تایم فریم در MetaTrader 4 کار کنید. اندیکاتورها در MQL5 تعداد بیشتری بافر را در نمودار دریافت کردهاند .
تبدیل MQL4 به MQL5 برای یک برنامهنویس مبتدی، یک کار پیش پا افتاده است، اما توجه و صبر شما را میطلبد. کامپایلر بسیاری از موارد ناسازگار با MQL5 را به تنهایی به شما نشان میدهد.
در MQL4، یک درخواست تجاری با استفاده از تابع OrderSend و مجموعه ای از پارامترها مختص به آن اجرا میشود. تغییر سفارش و حذف سفارش معلق توسط توابع جداگانه اجرا میشود. نتیجه کوئری (پرس و جو) با مقدار بولی که در انتهای تابع برگردانده شده تعیین میشود. تجزیه و تحلیل نتیجه به تعیین کد بازگشت سرور با استفاده از تابع GetLastError مختصر شده است.
- MQL5 دارای ساختار ویژه MqlTradeRequest برای ارسال سفارشات تجاری به سرور است. شما باید آن را با نوع عملکرد مناسب و نوع سفارشی پر کنید. برای به دست آوردن نتیجه، هنگام فراخواندن تابع OrderSend برای دریافت پاسخ از سرور، باید نمونهای از ساختار MqlTradeResult را اعلام و تصویب کنید، پارامترهای متفاوتی را که قبلا هنگام فراخوانی OrderSend به یک ساختار MqlTradeRequest منتقل شده است ترکیب کرده و به سرور ارسال کنید. ما ساختار MqlTradeResult دریافت شده به عنوان پاسخ را تجزیه و تحلیل میکنیم. تمام اطلاعات لازم در پاسخ از سرور در دسترس خواهد بود.
- در كد خود به کنترلکنندههای (handler) رویدادها توجه ویژه داشته باشید MQL5 علاوه بر این دارای توابع OnTesterTick، OnTesterTimer، OnBookEvent است. برنامههای مختلفی برای پاسخ به رویدادهای درگاه تجاری راه اندازی میشوند.
برای اکسپرتها:
- OnInit، OnDeinit، OnTimer، OnTick، OnChartEvent، OnTester
برای اندیکاتورها:
- OnInit، OnDeinit، OnTimer، OnCalculate، OnChartEvent، OnTester
برای اسکریپتها:
- OnStart (این کنترل کننده نمیتواند در اندیکاتورها و اسکریپتها استفاده شود)
برای کتابخانههای گنجانده شده هیچ امکان راه اندازی وجود ندارد، زیرا آنها منحصراً در سایر پروژههای بزرگ استفاده میشوند.
تفاوت دیگر این است که متغیرهای از پیش تعریف شدهی Ask، Bid، و همچنین آرایههای Open [ ]، High [ ]، Low [ ]، Close [ ]، Volume [ ]، Time [ ] در MQL5 وجود ندارد. بنابراین، برای دستیابی مستقل به این دادهها با استفاده از توابع داخلی برای دسترسی به سریهای زمانی CopyRates، CopyOpen، CopyHigh و غیره، کد برنامه باید اصلاح شود. آرایهای پویا را اعلام کرده و دادهها را در آن وارد کنید. تابع ارائه دهندهی نتیجه، به خودی خود اندازه آرایه را تغییر خواهد داد.
پا نوشت: آیا نوشته ی من مورد پسندتان قرار گرفت؟ لطفا در شبکه های اجتماعی آن را به اشتراک بگذارید: این بهترین ''تشکر'' خواهد بود :)
لینک های مفید:
- پیشنهاد می کنم که با یک کارگزار (بروکر) مطمئن معامله کنید اینجا. سیستم این امکان را به شما می دهد که یا خودتان به معامله بپردازید یا معامله ی معامله کنندگان موفق از سرتاسر دنیا را کپی کنید.
- در پلتفرم لایت فایننس از کد تشویقی BLOG برای گرفتن امتیاز سپرده گذاری 50% استفاده کنید. به هنگام سپرده گذاری سپرده گذاری در حساب معاملاتی خود تنها لازم است که این کد را در محل مناسب وارد نمایید.
- کانال تلگرام با تحلیل های باکیفیت، مطالب مربوط به فارکس، مقالات آموزشی، و سایر مطالب مفید برای معامله گران https://t.me/farsi_forex_trading_blog

محتوای این مقاله بیانگر نظر نویسنده است و لزوماً بیانگر موضع رسمی کارگزار لایت فایننس نیست. مطالب منتشر شده در این صفحه صرفاً برای اهداف اطلاعاتی ارائه شده است و نباید به عنوان ارائه مشاوره سرمایه گذاری برای اهداف دستورالعمل 2014/65/EU مورد نظر تلقی شوند.
بر اساس قانون کپیرایت، این ماده مالکیت معنوی محسوب میشود که شامل ممنوعیت کپی و توزیع آن بدون رضایت میباشد.