هـــــشــدارهای صوتی در اندیکاتورها

هـــــشــدارهای صوتی در اندیکاتور

هـــــشــدارهای صوتی در اندیکاتورها

اندیکاتور چیست ؟با اینکه ترید خودکار روز به روز محبو‌ب‌تر می‌شود، اما باز هم تریدرهای زیادی هستند که خودشان ترید می‌کنند. بنابراین، در جایی که اکسپرت در چند میلی‌ثانیه شرایط بازار را می‌سنجد، تریدر مدت‌ها زمان و انرژی می‌گذارد و از همه مهم‌تر، دقت [اکسپرت را ندارد].

چند سال قبل، تریدرها نهایتاً از یک یا چند اندیکاتور تکنیکال استفاده می‌کردند. و بعضی استراتژی‌ها مقادیر اندیکاتور را همزمان روی چند تایم‌فریم لحاظ می‌کنند.

بنابراین، یک فرد چگونه می‌تواند یک سیگنال مهم را “دریافت” کند؟ انتخاب‌های زیادی داریم:

  • اکسپرتی بنویسید که بازار را آنالیز کرده و درباره‌ی رویداد‌های مهم هشدار دهد؛
  • پشت کامپیوتر بنشینید، ده‌ها نمودار را بررسی کرده و سعی کنید اطلاعات آن نمودارها را آنالیز کنید؛
  • یک سیستم هشدار به تمام اندیکاتور‌های مورد استفاده، اضافه کنید.

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

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

انواع هشدارها

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

یک نفر، وقتی خط اصلی MACD، خط سیگنال را لمس می‌کند، buy می‌گیرد. و دیگری صبر می‌کند تا MACD خط صفر را قطع کند، و یک نفر هم وقتی MACD زیر صفر است و به‌‌سمت بالا حرکت می‌کند، پوزیشن طولانی‌مدت می‌گیرد. خودم احساس می‌کنم توانایی شمارش‌ همه‌ی حالت‌های ممکن را ندارم، بنابراین فقط به این بسنده می‌کنم که چطور می‌توان بلوک هشدار را به یک اندیکاتور اضافه کرد. بعد از آن قادر خواهید بود هرگونه هشداری را، عملاً، به هر نوع اندیکاتوری، هر طور که عشق‌تان می‌کِشد، اضافه کنید!

محتمل‌ترین هشدارها را در اینجا داریم:

  • تقاطع دو خط یک اندیکاتور (مثل مثال بالا – خط اصلی MACD و خط سیگنال)؛
  • تقاطع خط اندیکاتور و یکlevel خاص (برای مثال، خط اصلی MACD و خط صفر، اُسیلاتور Stochastic و levelهای ۷۰ و ۳۰، CCI و levelهای ۱۰۰- و ۱۰۰)؛
  • حرکت وارونه‌ی اندیکاتور (برای مثال، AC و AO، مووینگ اَورج نُرمال)؛
  • موقعیت تغییریافته به‌سمتِ قیمت (Parabolic SAR)؛
  • ظاهر شدن فِلش (arrow) بالا یا پایین مقدار قیمت (فراکتال‌ها).

ممکن است برداشت‌های دیگری باشند که آنها فراموش کرده باشم یا حتی آنها را ندانم؛ بنابراین، فقط به همین ۵ موردی که اشاره کردیم، پرداخته می‌شود.

راههای هشدار دادن

متاتریدر ۴ و MQL4 به ما اجازه می‌دهند، راه‌های زیادی را، چه هشدار صوتی باشند، چه هشدار بصری، به‌کار بگیریم:

  • یک پیام معمولی روی صفحه (تابع Comment)؛
  • ثبت شدن در گزارش (تابع Print)؛
  • [ظاهر شدن] یک پنجره دارای پیام همراه با صدا (تابع Alert)؛
  • یک صدای خاص – یک فایلی که انتخاب می‌شود تا پخش گردد (تابع PlaySound).

علاوه بر اینها، توابعی داریم برای ارسال یک فایل به سرور FTP (تابع ()SendFTP)، نشان دادن یک پیام/دیالوگ باکس (()MessageBox)، و فرستادن ایمیل‌ها (()SendMail). یک کاربر عادی، به‌سختی می‌تواند تابع ()SendFTP را درخواست کند، و تابع ()MessageBox، برای استفاده در یک اندیکاتور مناسب نیست زیرا این تابع عملکرد اندیکاتور را تا زمانی که باکسِ پیام بسته نشود، متوقف نگه می‌دارد، و تابع ()SendMail، هرچند برای فرستان SMS خوب است اما در عمل “خطرناک” است، زیرا در یک نمودار تعدادی اندیکاتور داریم، و با استفاده از این تابع، بیشمار پیام کنترل‌نشده را برای خود خریده‌ایم. بهتر است از این تابع در یک اکسپرت استفاده کنیم، برای مثال، وقتی یک هشدار روی چند اندیکاتور همزمان اتفاق می‌اُفتد، پیامی برای ما بیاید، و اینگونه بسیار حواس‌مان به این تابع جمع است.

در این مقاله، فقط روش‌های صوتی و بصری هشداردهی در متاتریدر ۴ را درنظر گرفته‌ایم.

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

اما تجربه به ما می‌گوید سلیقه‌ها متفاوت است. بنابراین می‌خواهیم چیزی بسازم که به‌نوعی اجرای تمام روش‌های بالا را در خود داشته باشد (به‌غیر از SendFTP، MessageBox، SendMail)، و فقط کافیست مورد مناسب را انتخاب کنید.

فیلتر فرکانس هشدار

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

  • تعریف هشدارها روی کندل‌هایی که قبلاً شکل گرفته‌اند. این راه‌حل، بهترین است.
  • هشدارهای متناوب – sell بعد از buy و برعکس (این هم یکی از منطقی‌ترین راه‌حل‌هاست که می‌توان همراه با دیگر راه‌حل‌ها استفاده کرد).
  • ایجاد توقف بین هشدارها (ایده‌ی خوبی نیست).
  • روی هر کندل فقط یک هشدار بده (این محدودیت، نسبتاً محدودیتی تحت-تاثیر-قرار-گرفته است).

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

پس، بیایید تحقق بخشیدن را آغاز کنیم.

هشدار یک تقاطع دو خطِ یک اندیکاتور

بیایید با همان MACD شروع کنیم که مثالش را زدیم.

وظیفه‌ی اصلی ما این است که بفهمیم در کدام آرایه‌ها خطوط اندیکاتور ذخیره شده‌اند. برای این کار نگاهی به این کد می‌اندازیم:

لطفاً توجه کنید، کامنت “indicator buffers” چیزی است که دنبالش بودیم. چنین آرایه‌هایی اغلب اسامی جامع بصری دارند (MacdBuffer بافرِ مقدارِ خط اصلی MACD است، و SignalBuffer – بافر خط سیگنال) و همیشه خارج از توابع init،  deinitو  startقرار می‌گیرند.

اگر آرایه‌های زیادی داریم و سخت است ببینیم کدام یک از آنها مورد نیاز است، درون تابع init را بنگرید – تمام آرایه‌هایی که در نمودار نشان داده می‌شوند، با استفاده از تابع SetIndexBuffer، به یک عدد مشخص، متصل شده‌اند:

این توالی است (از صفر تا ۷)، که در آن مقادیر خط اندیکاتور در DataWindow نشان داده می‌شوند. نام‌هایی که آنجا می‌بینید، توسط تابع SetIndexLabel، داده شده‌اند، و این سومین روش شناسایی است.

اکنون، وقتی می‌دانیم داده‌های مورد نیاز کجا ذخیره شده‌اند، می‌توانیم تحقق بخشیدن به بلوک هشدار را شروع کنیم. برای این کار، بیایید به انتهای تابع شروع برویم – دُرست بالای عملگر return قبلی:

تحت هیچ شرایطی، بلوک هشدار نباید در حلقه‌ی محاسبه‌ی اندیکاتور اضافه شود – این کار اجرا را کند کرده و هیچ تاثیری ندارد.

پس بیایید “ترکیب” خودمان را بنویسیم:

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

بعد از آن یک بررسی ساده داریم: بررسی می‌کنیم آیا کندل جدید شروع شده‌است یا نه (فقط زمانی کار می‌کند که SIGNAL_BAR بیشتر از صفر است).

راستی، خود متغیر SIGNAL_BAR را کمی قبل‌تر، قبل از تابع init، اعلام کرده‌ایم:

لطفاً به دستور #define توجه کنید – کامپایلر فقط متغیر SIGNAL_BAR را با مقدار داده‌شده (۱) در سرتاسر کد، جایگزین می‌کند.

در اینجا خود کد هشدار را داریم:

این نیز بسیار ساده است. اگر هشدار قبلی SELL بود، تقاطع خطوط را بررسی کنید:

اگر مقدار خط اصلی MACD روی کندل ۱# بیشتر از مقدار خط سیگنال روی کندل ۱# باشد

و

مقدار خط سیگنال روی کندل ۲# بیشتر از مقدار خط MACD روی کندل ۲# باشد،

آنگاه

خطوط یکدیگر را قطع کردهاند.

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

در تابع PlaySound، می‌توانیم تعیین کنیم کدام فایل wave باید پخش شود. فایل را باید در مسیر MetaTrader 4\sounds\ قرار دهید و پسوند آن wav. باشد. برای مثال، می‌توانید صدای خاصی را برای هشدار BUY اختصاص دهید، و یک صدای دیگر برای SELL، یا صداهای مختلف را برای اندیکاتورهای مختلف تعیین کنید و غیره.

هشدار SELL کاملاً مشابه است:

دیگر هشدارها

اکنون، وقتی کد اندیکاتور را دانستیم، نوشتن دیگر بلوک‌های هشدار برای ما بسیار راحت‌تر است. فقط “فرمول” عوض می‌شود، و مابقی کد، فقط کپی‌-پیست می‌شود.

هشداری که در آن سیگنال‌ها تقریباً دارند یک خط خاص را لمس می‌کنند، بسیار شبیه است به هشداری که در آن تقاطع خطوط را داریم. من این را به Stochastic اضافه کردم، اما شما می‌توانید یکی مشابه، برای هر اندیکاتور دیگری ایجاد کنید:

همانطور که می‌بینید، اگر خط (%K (MainBuffer، خط ۳۰ را از پایین به بالا، لمس کند، اندیکاتور می‌گوید “Buy”، و اگر خط ۷۰ از بالا به پایین لمس شود، اندیکاتور می‌گوید “Sell”.

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

ExtBuffer3 و ExtBuffer4، برای محاسبات متوسط، استفاده شده‌اند، ExtBuffer0 همیشه مقدار اندیکاتور را ذخیره می‌کند، ExtBuffer2 و ExtBuffer3، ستون‌های “رنگی‌‌”‌ در دو رنگ را برعهده دارند. از آنجایی که فقط به مقدار اندیکاتور نیاز داریم، از ExtBuffer0 استفاده می‌کنیم:

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

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

اما بعضی‌وقت‌ها، برای مثال در Parabolic، ظاهر می‌شوند. به‌عنوان یک مثال، “فرمول” را با استفاده از آن می‌نویسیم:

همه‌چیز ساده است – مقدار اندیکاتور را با قیمت بسته‌شدن کندل مقایسه می‌کنیم. به‌یاد داشته باشید که، اگر SIGNAL_BAR، ۰ تعیین شده باشد، هر بار لمس قیمت Parabolic، همراه با یک هشدار خواهد بود.

آخرین هشدار درباره‌ی ظهور یک فِلش (arrow) در نمودار، اطلاع‌رسانی می‌کند. این مورد در اندیکاتور‌های استاندارد به‌ندرت اتفاق می‌اُفتد، اما نسبتاً در “pivot finders” سفارشی، محبوب است. به‌شخصه این نوع هشدارها را، [هشدارهایی با استفاده از] فراکتال‌های اندیکاتور، درنظر می‌گیرم (سورس کد آن به زبانMQL4  را می‌توانید در Code Base: Fractals پیدا کنید).

چنین اندیکاتورهایی یک ویژگی مشترک دارند: در جاهایی که روی یک نمودار ترسم می‌شوند، برابر با صفر (یا EMPTY_VALUE) نیستند. روی تمام دیگر کندل‌ها، بافرهای آنها خالی هستند. و این یعنی، برای تعیین سیگنال، می‌بایستی مقدار بافر را با صفر مقایسه کنید:

اما، اگر اندیکاتوری با چنین کدی را روی نمودار بیاورید، هرگز هشداری دریافت نخواهید کرد. فراکتال‌ها یک ویژگی‌ خاص دارند – از دو کندل آینده برای تحلیل استفاده می‌کنند، بنابراین، فِلش‌ها فقط روی کندل ۲# ظاهر می‌شوند (سومین کندل که با کندل صفر شروع می‌شود). پس، برای این که هشدارها کار خود را آغاز کنند، لازم است SIGNAL_BAR را ۲ تعریف کنیم:

همین، هشدارها کار خواهند کرد!

نتیجهگیری

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

این نوع هشدارها تعریف، و محقق شدند:

  • تقاطع دو خطِ یک اندیکاتور؛
  • تقاطع خط اندیکاتور و یک level خاص؛
  • حرکت وارونه‌ی اندیکاتور؛
  • موقعیت تغییریافته به‌سمت قیمت؛
  • ظاهر شدن فِلش بالا یا پایینِ مقدار قیمت.

این توابع برای هشدارها انتخاب شدند:

  • ()Comment – نمایش یک پیام معمولی؛
  • ()Print – نمایش یک پیام در گزارش؛
  • ()Alert – نمایش پیام در یک پنجره‌ی خاص و یک هشدار صوتی؛
  • ()PlaySound – پخش کردن هر نوع فایل wave.

برای کاهش فرکانس هشدار (تعداد یا همان تکرار هشدارها):

  • هنگام تعیین یک هشدار، از کندل‌هایی استفاده کنید که کامل شده‌اند؛
  • تمامی هشدارها متناوب باشند – فقط buy بعد از sell، و بالعکس.

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

امیدوارم دیده باشید که هیچ‌گونه چیز پیچیده‌ای در اضافه کردن یک بلوک هشدار به یک اندیکاتور وجود ندارد و هر کسی می‌تواند این کار را انجام دهد.

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

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

 

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

جواهری

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

مــارتینگل چـــیست؟

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

مارتینگل چیست و آیا استفاده از آن عاقلانه است؟

نوشتن نظر شما

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

3 × 3 =