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

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

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

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

  • اگر بخواهیم یک برنامه را اندیکاتور سفارشی تلقی کنیم، باید یک یا دو تعریف برای آن درنظر بگیریم:

یا

  • برای تعیین مقیاسِ یک پنجرۀ اندیکاتور جداگانه، از این تعاریف استفاده می‌شود:

که در اینجا، “Min_Value” و “Max_Value” مقادیر مرتبط هستند. برای مثال، این مقادیر برای اندیکاتور سفارشی RSI بایستی به‌ترتیب صفر و ۱۰۰ باشند.

  • تعداد آرایه‌های اندیکاتور مورد نیاز برای ترسیم یک اندیکاتور، می‌بایستی اینگونه تعریف شود:

که در اینجا N می‌تواند مقداری از ۱ تا ۸ داشته باشد.

  • رنگ خطوط در یک اندیکاتور، با این تعاریف، مشخص می‌شود:

که در اینجا N تعداد آرایه‌های اندیکاتوری است که توسط “#define indicator_buffer” تعریف شده‌است.

  • توابعی وجود دارند که به ما اجازه می‌دهند فرآیند محاسباتی اندیکاتور و تصویرسازی آن را کنترل کنیم. از اندیکاتور سفارشی Ishimoku Kinko Hyo در اینجا برای نشان دادن این موضوع استفاده شده‌است:

  • تابع “SetIndexStyle”، پارامترهای ترسیم یک آرایۀ اندیکاتور را کنترل می‌کند. حالت ترسیم DRAW_LINE، فرض را بر این می‌گذارد که خطوط بین مقادیر تعریف‌شده در یک آرایۀ اندیکاتور مرتبط، رسم می‌شوند. حالت ترسیم DRAW_HISTOGRAM نیز، که در پنجره‌ی اصلی اندیکاتور اِعمال شده‌است، ویژگی‌های خاص خود را دارد. یک هیستوگرام بین مقادیر مربوطۀ دو آرایه شاخص ترسیم شده‌است: زوج (در اینجا: SpanA_Buffer) و فَرد (در اینجا: SpanB_Buffer). در اینجا، از رنگ آرایۀ شاخصی استفاده می‌شود که مقدار آن بالاتر است.
  • تابع “SetIndexDrawBegin” مشخص می‌کند دیتای قابل‌توجهی از آرایۀ اندیکاتور، از کدام اِلمان آغاز می‌شود.
  • تابع “SetIndexBuffer”، اجازه می‌دهد هر آرایۀ تک-بُعدی از نوع “double” را به‌عنوان آرایۀ شاخص، اعلام کنیم. در اینجا، خود سیستم آرایه‌های شاخص را مدیریت می‌کند. به همین دلیل نیازی نیست این آرایه‌ها را مشخص کنیم.

تابع ArrayResize، را نمی‌توان بر آرایه‌های اندیکاتور اِعمال کرد، چراکه بی‌فایده‌ است. همچنین اِعمال تابع ArrayInitialize بر آرایه‌های اندیکاتور نیز ‌بی‌فایده‌ است، به‌خصوص اگر به‌عنوان تابع ‘init’ باشد، درحالیکه آرایه‌های اندیکاتور هنوز اختصاص نیافته‌اند. آرایه‌های اندیکاتور به‌شکل خودکار حین تخصیص حافظه و تخصیص مجدد، مقداردهی اولیه می‌شوند. EMPTY_VALUE، یا مقداری که توسط تابع SetIndexEmptyValue مشخص شده‌است، به‌عنوان مقادیر مقداردهی اولیه استفاده می‌شوند. مقادیر “خالی” نمایش داده نمی‌شوند.

  • تابع “SetIndexLabel” نام را برای نمایش در نکات ابزار و در پنجره دیتا به‌همراه مقدار مربوطه، تعیین می‌کند (“ValueN” به‌طور پیش‌فرض تعیین شده‌است، که در اینجا N شمارۀ آرایۀ شاخص است). اگر به‌جای یک اسم، NULL منتقل شود، مقدار مربوطه نه در نکات ابزار و نه در پنجره دیتا، نمایش داده نخواهد شد. در این شرایط، اَبرها با استفاده از یک هیستوگرام بیرون آمده، و توسط یک خط محدود می‌شوند. در این لحظه، مقادیر آرایه‌های مربوط به “خط” و “هیستوگرام” یکسان هستند و می‌توان تنها یکی از آن‌ها را نشان داد.
  • تابع “IndicatorCounted”، اجازه می‌دهد محاسبه‌ای اقتصادی از یک اندیکاتور را سازماندهی کنیم. این تابع تعداد کندل‌ها تا لحظه‌ی شروع قبلی اندیکاتور را برمی‌گرداند، به‌عبارت دیگر، تعداد کندل‌هایی که قبلاً محاسبه‌ شده‌اند (به‌شکل بالقوه، در صورت عدم خطا یا خاتمۀ زودهنگام حین راه‌اندازی قبلی) و نیازی به محاسبۀ مجدد ندارند. هنگام مقداردهی مجدد اندیکاتور سفارشی یا آپدیت مهم هیستوری دیتا، این مقدار به‌طور خودکار ری‌ست و صفر می‌شود.
  • بیایید یک مثال دیگر را بررسی کنیم – اندیکاتور سفارشی با نام Accelerator/Decelerator Oscillator

  • تابع “IndicatorBuffers”، تعداد بافرها را برای استفاده در محاسبات اندیکاتور، مشخص می‌کند. به‌طور کلی، این تابع زمانی فراخوانده می‌شود که آرایه‌های شاخص بیشتری نسبت به تعداد لازم برای ترسیم یک اندیکاتور، استفاده شوند. در این هنگام، خود سیستم مدیریت آرایه‌های اضافی را برعهده می‌گیرد.
  • تابع “SetIndexDigits”، دقیق بودن اطلاعات خروجی را مدیریت می‌کند. در این شرایط، وقتیکه تفاوت بین دو مووینگ اَورج، و نیز تفاوت‌های دیگر بین نتیجه و خط سیگنال محاسبه می‌شود، دقت استاندارد تا ۴ رقم پس از نقطه، بدیهی‌ است که کافی نیست.
  • تابع “SetIndexDrawBegin”، اِلمان شروع قابل‌توجه آرایۀ اندیکاتور را تعیین می‌کند. در مثال ما، خط سیگنال به‌عنوان مووینگ اَورج ساده از مووینگ اَورج ساده دیگری، محاسبه می‌شود. به همین دلیل است که ۳۸ مقدار اولیۀ اندیکاتور، خالی (Empty) درنظر گرفته شده‌اند و قرار نیست رسم شوند.
  • تابع “IndicatorShortName”، به‌اصطلاح یک نام اختصاری برای اندیکاتور تعیین می‌کند تا در گوشه‌ی بالا سمت چپِ پنجره‌ی اندیکاتور و در “DataWindow” نمایش داده شود. اگر نام اختصاری تعیین نشود، نام اندیکاتور سفارشی به‌شکل سابق استفاده می‌شود. در مثال ارائه‌شده، نیازی به استفاده از تابع SetIndexLabel نیست، زیرا فقط یک مقدار خروجی داریم. بنابراین، نام اندیکاتور برای خروجی یک مقدار سیگنال، کافی است.
  • تابع “SetIndexStyle”، پارامترهای ترسیم یک آرایۀ اندیکاتور را مدیریت می‌کند. حالت ترسیم DRAW_NONE یعنی خط نیازی به رسم‌شدن ندارد. موضوع این است هیستوگرامِ اندیکاتور موجود باید دو رنگ متفاوت داشته باشد. داده‌ها از ExtBuffer0، در دو آرایه‌ی دیگر اختصاص داده می‌شوند، ExtBuffer1 و ExtBuffer2. برای اینکه داده‌های مضاعف در نکات ابزار یا Data Window، خروجی گرفته نشوند، از تابع SetIndexLabel با پارامتر NULL استفاده شده‌است. حالت ترسیم DRAW_HISTOGRAM، که بر اندیکاتور یک پنجره‌ی مجزا، اِعمال شده‌است، اجازه می‌دهد هیستوگرام را بین مقدار صفر و مقدار یک آرایۀ مرتبط (در مقایسه با ترسیم یک هیستوگرام در پنجره‌ی اصلی که قبل‌تر توضیح داده شد) رسم کنیم.
  • پارامترهای ورودی که توسط اندیکاتورهای سفارشی و توابع، برای محاسبات استفاده می‌شوند، باید به‌عنوان “extern” تعریف شوند و ممکن است از هر نوعی باشند.
  • اگر پارامترهای ورودی تعیین نشده باشند، اندیکاتور سفارشی مربوطه، در ساده‌ترین شکل ممکن، فراخوانده می‌شود.

انتقال دو مقدار اول “NULL” و “۰” یعنی از نمودار کنونی استفاده خواهد شد. نام فایل مربوطه (بدون پسوند mq4)، به‌عنوان نام اندیکاتور سفارشی استفاده می‌شود. اگر پارامتر یکی‌مانده به آخر ۰ باشد، بدان معنی خواهد بود که ما به داده‌های اولین آرایۀ اندیکاتور علاقه‌مند هستیم. و اگر آخرین پارامتر ۰ باشد، این یعنی ما به مقدار آخرین اِلمان آرایۀ اندیکاتور درخواست‌شده، علاقه‌مند هستیم (به‌عبارت دیگر، تازه‌ترین مقدار فعلی).

  • پارامترها، با ترتیبی که توصیف شدند، به تابع محاسبۀ اندیکاتور سفارشی منتقل می‌شوند. برای مثال، اندیکاتور سفارشی “Ichimoku” با پارامترهای (۵۲،۲۶،۹)، اینگونه فراخوانده خواهد شد:

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

این یعنی از مقادیری استفاده می‌شود که متغیرهای “Tenkan”، “Kijun”، “Senkou”، را مقداردهی اولیه می‌کنند، یعنی ۹، ۲۶، و ۵۲. با این حال، اگر یک اندیکاتور سفارشی، که مجموعه‌های مختلفی از پارامترها را دارد، در یک اکسپرت فراخوانده شود، شدیداً توصیه بر این است که از تنظیمات پیش‌فرض استفاده نشود.

باید توجه داشت که مازاد اندیکاتورهای سفارشی، درست همانند اندیکاتورهایی که اشتباه نوشته شده‌اند، باعث کاهش بسیار زیاد سرعت نرم‌افزار می‌شوند!

جواهری

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

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

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

کارگزار ECN یا ECN Broker چیست ؟

نوشتن نظر شما

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

7 − چهار =