رویداد‌ها در متاتریدر ۴

رویـداد‌هـا در مـتـاتـریـدر 4

رویـداد‌هـا در مـتـاتـریـدر 4

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

رویداد به چه چیزی گفته می‌شود و اصلاً چرا باید پیگیر آن باشیم؟

برای اجرای برخی از استراتژی‌ها، اینکه تنها بدانیم آیا اکسپرت پوزیشنی را باز کرده یا نه، کافی نیست. بعضی‌وقت‌ها لازم است لحظه‌ی بازشدن، بسته‌شدن، یا اصلاح یک پوزیشن‌، و یا شروع شدن یک معامله‌ی انتظاری را، سریع “دریابیم”. هیچ تابعی در MQL4 از قبل آماده نشده تا مشکل ما را حل کند. اما همه‌چیز برای ساختن چنین چیزی مهیاست و قصد داریم همین کار را بکنیم.

اصول تعریف رویداد

فرد چطور می‌تواند بفهمد که رویدادی اتفاق اُفتاده است؟ رویداد، بطور کلی، چیست؟ در تلاش برای پاسخگویی به این سوالات، به چنین نتیجه‌ای خواهیم رسید: یک رویداد، تغییر وضعیت یک معامله/پوزیشن باز است. در اینجا، تغییر حجم پوزیشن‌های باز، یا [تغییر] حد ضررِ یک پوزیشن را، می‌توانیم مثال بزنیم.

فرد چطور می‌تواند رخ دادن یک رویداد را در لحظه شناسایی کند؟ جواب ساده است. برای انجام این کار، باید مقدار (value) را به‌ حافظه بسپاریم، تا پیگیری شود (در اینجا، حجم پوزیشن‌ها مدنظر است)، و سپس، برای مثال، در تیک بعدی، آن را با مقدارِ جدیدِ بدست‌آمده، مقایسه کنیم. بیایید یک اکسپرت ساده بنویسیم، تا ما را از تغییرات [بوجودآمده] در حجم پوزیشن‌ها مطلع کند.

ضروری است که بعضی از ویژگی‌های خاص این اکسپرت را خاطرنشان کنیم:

  • متغیرهای first و pre_OrdersTotal، اِستاتیک اعلام شده‌اند. بنابراین، مقادیر آن‌ها هنگام تَرکِ تابع ()start صفر نمی‌شود. جایگزین متغیرهای اِستاتیک، متغیرهای جهانی هستند (که فراتر از توابع اعلام شده‌اند)، اما بسیاری از آن‌ها باعث به‌هم‌ریختگی و ادغام اسامی می‌شوند (فرد ممکن است اشتباهاً متغیری با نام مشابه، درون تابع، اعلام کند، که این باعث تداخل خواهد شد). بنابراین، تمام متغیرها را در بدنه‌ی تابع اعلام می‌کنیم.
  • اکسپرت، ما را درباره‌ی تغییرات در حجم پوزیشن‌های باز، و همینطور، معاملات انتظاری، آگاه می‌سازد (تابع ()OrdersTotal، حجم کلی آن‌ها را برمی‌گرداند).
  • در اینجا، اکسپرت، به ما چیزی درباره‌ی شروع شدنِ یک معامله‌ی انتظاری، نمی‌گوید زیرا مقدارِ ()OrdersTotal، تغییر نخواهد کرد.
  • وقتی اولین بار نرم‌افزار و اکسپرت را اجرا می‌کنیم، اکسپرت قادر به شناسایی تغییرات در حجم معاملات نیست زیرا “نمی‌داند” چه تعداد معامله روی تیک قبلی بوده است.
  • پیام، فقط وقتی ظاهر می‌شود که برای جفت‌اَرزی که اکسپرت روی نمودار آن مشغول کار است، تیک جدیدی برسد. اکسپرت هیچ رویداد راه‌اندازی دیگری ندارد.

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

در نسخه‌ی بالا، پیام‌ِ مرتبط با تغییرات در حجم پوزیشن‌ها، بلافاصله نمایش داده می‌شود: باور نداری برو چک کن!

فیلتر کردن رویدادها: معیارها

اکسپرت ما، ما را درباره‌ی پوزیشن‌های جدیدی که روی تمام جفت‌اَرزها ظاهر می‌شوند، آگاه می‌سازد، همانطور که در حال حاضر هم اینگونه است. اما، رایج‌تر این است که فقط به اطلاعاتی در مورد تغییرات حجم در معاملاتِ جفت‌اَرز کنونی، نیاز داریم. علاوه بر این، معاملاتی که اکسپرت آن‌ها را مدیریت می‌کند، اغلب رایج است که با یک MagicNumber علامت‌گذاری می‌شوند. پس بیایید رویدادها را با این دو معیار، فیلتر کنیم. به‌عبارت دیگر، ما از تغییرات در حجم معاملات، فقط برای جفت‌اَرز کنونی، و فقط برای MagicNumber داده‌شده، آگاه خواهیم شد.

پالایش

البته، پیدا کردن حجم کلی معاملات خوب است، اما بعضی‌وقت‌ها اطلاعات بیشتر و دقیق‌تری نیاز است، برای مثال، “پوزیشن Buy باز شد یاSell ؟”، “آیا معامله‌ی انتظاری شروع شد؟”، “پوزیشن با حد ضرر بسته شد، یا با حد سود، یا دستی؟”. بیایید لیست رویدادهایی که قرار است پیگیری شوند را تا جای ممکن کامل، و موارد را گروه‌بندی کنیم.

  1. باز کردن یک پوزیشن
    • “پوزیشن بازار”
      • Buy
      • Sell
    • معامله‌ی انتظاری
      • Buy Limit
      • Sell Limit
      • Buy Stop
      • Sell Stop
  1. شروع معامله
    • Buy Limit
    • Sell Limit
    • Buy Stop
    • Sell Stop
  2. بستن یک پوزیشن
    • “پوزیشن بازار”
      • Buy
        • حد ضرر
        • حد سود
        • دستی (نه حد ضرر، نه حد سود)
      • Sell
        • حد ضرر
        • حد سود
        • دستی
      • معامله‌ی انتظاری (حذف)
        • Buy Limit
          • منقضی شدن
          • دستی
        • Sell Limit
          • زمان انقضاء
          • دستی
        • Buy Stop
          • منقضی شدن
          • دستی
        • Sell Stop
          • منقضی شدن
          • دستی
  1. اصلاح یک پوزیشن
    • “پوزیشن بازار”
      • Buy
        • حد سود
        • حد ضرر
      • Sell
        • حد سود
        • حد ضرر
      • معامله‌ی انتظاری
        • Buy Limit
          • قیمت بازشدن
          • حد ضرر
          • حد سود
          • تاریخ انقضاء
        • Sell Limit
          • قیمت بازشدن
          • حد ضرر
          • حد سود
          • تاریخ انقضاء
        • Buy Stop
          • قیمت بازشدن
          • حد ضرر
          • حد سود
          • تاریخ انقضاء
        • Sell Stop
          • قیمت بازشدن
          • حد ضرر
          • حد سود
          • تاریخ انقضاء

قبل از اینکه برویم سراغ الگوریتم، بیایید بررسی کنیم آیا تمام رویدادهای اشاره‌شده در بالا را واقعاً نیاز داریم یا خیر. اگر بخواهیم اکسپرتی بسازیم که ما را در مورد تمام تغییرات بوجود‌آمده در تمام پوزیشن‌ها مطلع سازد، جواب بله است، و تمام این رویدادها را باید درنظر بگیریم. اما هدف ما متواضعانه‌تر است: می‌خواهیم کاری کنیم اکسپرت “بفهمد” برای پوزیشن‌هایی که دارد با آن‌ها کار می‌کند، چه اتفاقاتی می‌اُفتند. در اینجا، لیست را می‌شود به‌طرز چشمگیری کوتاه‌تر کرد: بازشدن پوزیشن، درج معاملات انتظاری، تمام آیتم‌های اصلاح و بستن دستی پوزیشن‌ها را، می‌توان از لیست حذف نمود – این رویدادها را خود اکسپرت تولید می‌کند (و نمی‌توانند بدون اکسپرت اتفاق بیفتند). بنابراین، اکنون چنین لیستی خواهیم داشت:

  1. شروع شدن معامله
  • Buy Limit
  • Sell Limit
  • Buy Stop
  • Sell Stop
  1. بستن پوزیشن
    • “پوزیشن بازار”
      • Buy
        • حد ضرر
        • حد سود
      • Sell
        • حد ضرر
        • حد سود
      • معامله‌ی انتظاری (منقضی شدن)
        • Buy Limit
        • Sell Limit
        • Buy Stop
        • Sell Stop

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

  • اگر حجم کلی پوزیشن‌ها کاهش یافت، در بخش هیستوری، پوزیشنی که اخیراً بسته شده‌است را جستجو کرده و با کمک پارامترهای آن بفهمید چگونه بسته شده‌است، یا
  • تیکت‌های تمام پوزیشن‌های باز را به‌خاطر سپرده و سپس در بخش هیستوری، با تیکت آن، دنبال پوزیشن “ناپدیدشده” بگردید.

راه اول در اجرا ساده‌تر است اما ممکن است داده‌‌ی اشتباه تولید شود، اگر دو پوزیشن درون یک تیک مشابه بسته شوند—یکی دستی باشد و دیگری توسط StopLoss بسته شود—اکسپرت، با پیدا کردن آن پوزیشنی که زمان بسته‌شدنش نزدیک‌تر است، دو رویداد مشابه تولید خواهد کرد (اگر پوزیشن آخر دستی بسته شده باشد، هر دو رویداد، بسته‌شدن دستی تلقی خواهند شد). آنگاه اکسپرت “نخواهد دانست” که یکی از پوزیشن‌ها توسط StopLoss بسته شده‌است.

بنابراین، برای جلوگیری از چنین مشکلاتی، بیایید تا حد امکان کد باسوادی بنویسیم!

ادغام در اکسپرتها و کاربرد آن

برای اینکه در هر اکسپرتی از “تله‌ی رویداد” راحت استفاده کنیم، بیایید کد را در فایل Events.mq4 قرار داده تا با دستور #include آن را درون اکسپرت‌ها اضافه کنیم. برای انجام این کار:

  • کد را به‌شکل یک تابع درآورید، تا پس از این، از اکسپرت‌ها فراخوانده شود؛
  • متغیر جهانی MagicNumber را حذف کرده و پارامتر تابع magic را اضافه کنید (همان نقش را ایفا خواهند کرد، و این کار را جهت مسدود نشدن لیست متغیرهای اکسترنال اکسپرت، انجام می‌دهیم)؛
  • برای هر رویداد، یک متغیر جهانی اضافه کنید – این کار کاربرد آن‌ها را راحت‌تر می‌کند (همچنین باید صفر کردن این متغیرها را در تابع start وارد کنیم)؛
  • حلقه‌ی بی‌نهایت را حذف کنید – اکنون “نمونه‌گیری” بین فراخوان‌های تابع انجام خواهد شد (به‌عبارت دیگر، با فراخوانی یک تابع، لیستی از تغییرات را، در مقایسه با فراخوان قبلی تابع، دریافت می‌کنیم)؛
  • هشدارها را حذف کنید، در صورت نیاز می‌شود آن‌ها را به اکسپرت اضافه کرد؛
  • تمام موارد بالا را درنظر گرفته و کد را صیقل دهید.

و این چیزی است که باید به آن دست یابیم:

اکنون رویدادها را می‌توان از هر اکسپرتی، تنها با فعال کردن یک کتابخانه (library)، پیگیری کرد. مثالی از چنین اکسپرتی (EventsExpert.mq4) اینجا آورده شده‌است:

نتیجهگیری

در این مقاله، راه‌های پیگیریِ برنامه‌ریزی‌شده‌ی رویدادها را در متاتریدر ۴ با استفاده از ابزارهای MQL4 بررسی کردیم. تمام رویدادها را در سه گروه تقسیم‌بندی کردیم و آن‌ها را با توجه به معیارهای از پیش تعیین شده، فیلتر کردیم. همچنین کتابخانه‌ای ساختیم که به ما اجازه می‌دهد برخی از رویدادها را از هر اکسپرتی، به‌سادگی پیگیری کنیم.‌

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

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

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

 

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

جواهری

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

چگونه زیگزاگ‌های سریع و بدون ترسیم‌ مجدد بنویسیم

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

ویژگی‌های ساخت اندیکاتورهای سفارشی

نوشتن نظر شما

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

9 + نوزده =