رویـــکــــرد شــــیء‌گرا در MQL

رویـــکــــرد شــــیء‌گرا در MQL

رویـــکــــرد شــــیء‌گرا در MQL [۱]

مقدمه

این مقاله، در ابتدا، برای برنامه‌نویس‌های حرفه‌ای و حتی تازه‌کارها، که در محیط MQL کار می‌کنند، بسیار جذاب خواهد بود. همچنین توصیه می‌شود توسعه‌دهندگان محیط MQL و ایدئولوژیست‌ها نیز این مقاله را بخوانند، چراکه قطعاً پروژه‌های خوبی از دل این مقاله بیرون خواهند آمد. همچنین، تا حد زیادی می‌توانید ایده‌های مشابه را در مقاله‌های Universal Expert Advisor Template و Sending Trading Signals in a Universal Expert Advisor پیدا کنید.

بسیار خب،

یکی از معایب MQL، به‌نظر شخص والای خودم، و از نظر برنامه‌نویسی، این است که رویکرد شیء‌گرایانه در ساخت مدل‌ سیستم معاملاتی، ندارد. توسعه‌دهندگان MQL دو راه پیش روی ما می‌گذارند: استفاده از فراخوانی توابع اکسترنال یا استفاده از پارامتر معامله MAGIC برای شناسایی متعلقات معامله [معامله متعلق به کجاست].

فی‌الواقع اگر فقط یک سیستم [ترید] را روی یک حساب داشته باشیم، نیازی به شناسایی نیست. اما وقتی این امکان در اختیار ما گذاشته شده که بتوانیم روی یک حساب چندین سیستم معاملاتی خودکار را داشته باشیم، بدون MAGIC هیچ نوع خاکی نمی‌شود بر سر ریخت! حتی وقتی توابع اکسترنال را صدا می‌زنیم، باید [وضعیت] آن‌ها را تعیین کنیم. البته شاید حضرتعالی بگویید می‌شود یک آرایه به‌نام OrderTicket ایجاد کرد و مشخص کنیم که این آرایه متعلق به فقط یک سیستم ترید است، اما این را بدانید که در برخی از بروکرهای نسبتاً محترم، تیکت معامله در سوآپ، تغییر می‌کند (در حقیقت، یکی بسته و دیگری باز می‌شود). به همین دلیل است که بدون MAGIC هرگز!

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

این یک سیستم ترید مطابق با مدل شیءگرا من است. البته، جهانی نیست، اما اکنون رویکرد دیگری سراغ ندارم.

رویـــکــــرد شــــیء‌گرا در MQL

پس بیایید این مدل را آنالیز کنیم.

  1. A) سیستم سیگنال (SS)

هدف این ماژول، پردازش و تفسیر خوانش‌های دریافتی است. معمولاً، “Object” این سیستم سیگنال، مجموعه‌ای از اندیکاتورها است، برای مثال، مووینگ اَورج‌ها. نتیجه‌ی پردازش خوانش‌ها و مقادیر اندیکاتور این است که، “این Object” (یا سمافور) سیگنال‌هایی تولید می‌کند تا ورود/خروج، یا اصلاح معامله و غیره را داشته باشیم.

سمافور سیگنال‌اَش را شکل می‌دهد و آن را به یک Object دیگر از ماژول ورود/خروج       (Enter/Exit (EE)) می‌فرستد.

تنظیم سمافور در MQL نسبتاً ساده است.

  1. تعریف یک مشخص‌کننده جهانی[۲] با استفاده از #define

بهتر است شماره‌های متوالی مانند ۱، ۲، ۳، ۴، …. تعیین نشوند، بلکه ۵تا ۵تا یا ۱۰تا ۱۰تا باشد، تا در یک اکسپرت بتوانیم یک سیگنال را برای چندین فرآیند استفاده کنیم (ماژول دوم را ببینید).

  1. سپس در تابع جهانی این ماژول، باید پردازشگر (processor) آن را فعال کنیم.

  1. و قدم آخر توضیح توابع است.

در اینجا مثالی برای پردازش سیگنال‌‌های یک Object داریم که ویژگی‌های اندیکاتور Envelope را به ارث برده است.

بنابراین، ماژولی بدست می‌آوریم که شامل objects-signals‌های مختلف است.

  1. B) Object‌های بلوک EE حداقل وظایف را دارند:

اول، objectهای آن با objects-signals فعل‌وانفعال دارند – آن‌ها را مشاهده کنید. چرخه‌ی زندگی و تعاملات اینگونه است:

بررسی سمافور »» اگر هرگونه سیگنال مثبتی وجود داشته باشد »» باز کردن/بستن/اصلاح پوزیشن‌ها »» واگذاری کنترل به objectها در ماژول PS.

تمام objectها در ماژول EE، پیشوند Process… دارند،که رفتار آن‌ها را به‌طور خاص تعیین می‌کند.

برای مثال:

هر نمونه از کلاس سیستم ترید باید خصوصیات فردی خودش را داشته باشد (همه این را متوجه می‌شویم و در ماژول‌هایمان استفاده می‌کنیم)، مانند سود، حد ضرر، سیستم مدیریت پول مخصوص به خود، [درست] همانند دیگر پارامترهای اضافی که در حالت‌های مختلف تریلینگ استفاده شده‌اند، و غیره.

هنگام به‌کار بردن این ویژگی‌ها، چندین حالت از رویکرد را امتحان کردم و به‌نظر من مناسب‌ترین ‌آ‌ن‌ها در MQL، ایجاد یک آرایه‌ی دوبُعدی است. در اینجا توضیحات مربوطه را داریم:

که در اینجا nSignal، مشخص‌کننده‌ی[۳] object-signals است.

برای مثال:

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

بنابراین، بعد از تنظیم پارامترها، تابع پردازش سمافور را فرا می‌خوانیم. ‌به‌عبارت دیگر، با سیستم سیگنال تعامل می‌کنیم. این کار در تابع مورد علاقه‌ی من یعنی start() انجام می‌شود.

رویـــکــــرد شــــیء‌گرا در MQL

همانطور که در این طرح می‌‌بینید، در این سیستم ترید، ما ۴ سمافور ثبت‌شده و ۳ ناظر (observer) داریم. هر سمافور بر اساس مدل خودش از تفسیر خوانش، بنا شده‌است.

برای مثال، سمافور ۱ سیگنال‌های آنالیز اندیکاتور MACD را می‌فرستد. Observer 1 در جای خودش بعد از دریافت این سیگنال‌ها معاملات را در یک طرح سادۀ ProcessSimple باز می‌کند.

Observer 2 و ۳، سخت‌تر هستند. هرکدام از آن‌ها سیگنال‌های دو سمافور را کنترل می‌کند. و، نتیجتاً، رویکرد بازشدن معاملات متفاوت است.‌

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

“مسئول” وضعیت معاملات بازشده، objectهای ماژول Position Support (PS) هستند.

  1. C) Block PS، به‌نظر من، جزء جالب‌ترین‌ها است، و اهمیت آن کمتر از سمافورها نیست.

در اینجا، حالت‌های مختلف تریلینگ، به‌کار گرفته شده‌اند، معاملات انتظاری باز شده‌اند،            position support و locking، کنترل سود و ضرر، و موارد دیگر را داریم. چنین PSایی باید روی سیگنال‌های EE، درباره‌ی خروج از بازار در شرایط [وجود] پوزیشن‌های ضرر، با کمترین ضرر [ممکن]، به‌اندازه‌ی کافی واکنش نشان دهد.

یک کتابخانه‌ی جالب از تریلینگ‌ها روی این سایت وجود داردLibrary of Functions and Expert Advisors for trailing / Yury Dzyuban . تمام انواع تریلینگ‌ها به‌سادگی به این سیستم متصل می‌شوند.

برای اینکه درک راحت‌تری داشته باشیم، تمام support objectها از پیشوند Trailing… شروع می‌شوند.

طرح آن بدین گونه است:

رویـــکــــرد شــــیء‌گرا در MQL

فراخوانی، و کنترل تبادل از یک observer به تریلینگ، در همان تابع start() انجام شده‌است

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

بار دیگر در اینجا می‌خواهم از توسعه‌دهندگان MQL خواهش کنم، امکانات این زبان را گسترش دهند. به‌عنوان مثال در اینجا حالتی از به‌کارگیری کلاس‌های شیء[۴]، نوشته‌شده با زبان C++ را، داریم.

منطق این سیستم در زبان MQL، خیلی متفاوت نخواهد بود. تمام توابع جهانی می‌شوند. و برای متفاوت شدن معاملات یک سیستم ترید، با معاملات یک سیستم دیگر، نیاز است پارامتر SignalID (به‌عبارت دیگر، MAGIC) را در تمام توابعی که با معاملات سروکار دارند، اضافه کنید.

این مقاله دارای فایل پیوست است.

  • [۱]) Object Approach in MQL
  • [۲]) Global identifier
  • [۳]) Identifier
  • [۴]) Object classes

مقالات پیشنهادی :

امینی

→ خواندن مطلب قبلی

تبدیل کد اندیکاتور به کد اکسپرت. طرح‌های کلی ساختاری یک اکسپرت و توابع اندیکاتور

خواندن مطلب بعدی ←

تبدیل کد اندیکاتور به کد اکسپرت. ساختار اندیکاتور

نوشتن نظر شما

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *