تبدیل کد اندیکاتور به کد اکسپرت. نتیجه‌گیری.

تبدیل کد اندیکاتور به کد اکسپرت. نتیجه‌گیری.

مقدمه

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

سورس کد اکسپرت

این کد اکسپرت را داریم:

ابتدا نیاز داریم این اکسپرت را تحلیل کنیم. هدف این اکسپرت ترید در نمودارهای H4 و Daily است و اَرز مدنظر را تریدر انتخاب می‌کند. این اکسپرت در این راستا فقط می‌تواند یک پوزیشن روی یک جفت‌اَرز باز کند. این اکسپرت دو الگوریتم محاسباتی مستقل برای BUY و SELL گرفتن دارد، و به همین دلیل است که ‌می‌تواند پوزیشن‌های مخالف باز کند.

برای بهینه‌سازی سریع‌تر اکسپرت در استراتژی‌تستر، این اکسپرت، یک متغیر اکسترنال Buy_Sell_Custom دارد – که اگر برابر با صفر باشد، اکسپرت فقط سیگنال‌های BUY را محاسبه خواهد کرد. و اگر این متغیر برابر با ۱ باشد، فقط سیگنال‌های SELL محاسبه خواهند شد. اگر به هر دو محاسبه نیاز داشتیم، این متغیر باید برابر با ۲ باشد. دیگر متغیرهای اکسترنال به دو گروه تقسیم شده‌اند: جهت BUY و SELL تریدها.

سیگنال‌های ترید، تغییرات جهت حرکت اندیکاتور سفارشی RAVI.mq4 هستند، و فیلتر، که سیگنال‌های نادرست را قطع می‌کند، جهتِ روند، است، که با اندیکاتور سفارشی ASCTrend1.mq4 تعیین می‌شود. اکسپرت دو بار اندیکاتور ASCTrend1.mq4 را فرا می‌خواند: برای دریافت از صفر و اولین مقادیر سورس بافر اندیکاتور؛ وجه تمایز آنها جهتِ روند را تعیین می‌کند. اکسپرت همچنین دو بار اندیکاتور RAVI.mq4 را برای دریافت دو نوع (دو واریانت BUY و SELL) مقادیر سورس برای دو الگوریتم محاسباتی، فرا می‌خواند.

باور دارم معنی اکثر پارامترهای ورودی اکسپرت را می‌توان از اسامی آنها فهمید. متغیرهای MA_Metod_Up و MA_Metod_Dn روش میانگین‌گیری را تعیین می‌کنند. شاید مقادیر مختلفی از صفر تا ۳ داشته باشند. متغیرهای PRICE_Up  و  PRICE_Dn مقادیر ثبات قیمت را دارا بوده و محدوده‌ی تغییر آنها از صفر تا ۶ است.

این اکسپرت بدون‌ شک، برای سود طراحی شده و علی‌رغم ساده بودنش، نتایج خوبی را در یک بهینه‌سازی خوب نشان داده است. بنابراین اَرزش آن را دارد که تلاش کنیم آن را از دسته‌ای از فایل‌ها، به یک فایل به‌نوعی خودکفا تبدیل کنیم. کد اکسپرت از فایل  Lite_EXPERT.mqhاستفاده می‌کند که در واقع دو تابع سفارشی است، و با فراخواندن آنها اکسپرت معاملات را اجرا می‌کند:

به‌‌نظر من این توابع کاملاً ساده هستند و مشکلی با آنها وجود نخواهد داشت. در اینجا الگوریتم رفرنس این توابع را مشاهده می‌کنید:

در اینجا اگر BUY_Sign، صحیح باشد (BUY_Sign=true)، تابع OpenBuyOrder() یک پوزیشن طولانی‌مدت را باز می‌کند، و اگر SELL_Sign، صحیح باشد (SELL_Sign=true)، تابع OpenSellOrder() یک پوزیشن کوتاه‌مدت را باز خواهد کرد. معنی این پارامترها از نام آنها مشخص است:

Money_Management_Up, STOPLOSS_Up, TAKEPROFIT_Up, Money_Management_Dn, STOPLOSS_Dn, TAKEPROFIT_Dn

نوشتن یک تابع اندیکاتور Get_ASCTrend1Series()

در انتهای مقاله‌ی قبلی (یعنیTransferring an Indicator Code into an Expert Advisor Code. General Structural Schemes of an Expert Advisor and Indicator Functions)، من تابع اندیکاتور Get_RAVISeries() را معرفی کردم. این تابع الان مفید است. تنها چیزی که نیاز داریم این است که یک تابع مشابه برای اندیکاتور ASCTrend1.mq4 بنویسیم. اکنون برمبنای این کد اندیکاتور، تابع Get_ASCTrend1Series() را خواهیم نوشت. پس بیایید به این کد اندیکاتور نگاهی بیندازیم:

تبدیل کد اندیکاتور به کد اکسپرت. نتیجه‌گیری.

من این اندیکاتور را بهینه‌سازی کردم. نسخه‌ی اصلی آن در فایل پیوست ASCTrend1_Old!. mq4 موجود است. اکنون بیایید تابع Get_ASCTrend1Series() را آماده کنیم. برای این منظور، کد اندیکاتور ASCTrend1.mq4 را، با توجه به طرح توسعه‌ی آن کد، که در مقاله‌ی قبلی آمده بود، تبدیل می‌کنیم. نتیجه‌ این می‌شود که تابع سفارشی زیر را داریم:

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

پس از آن نیاز است این تابع را برای تطبیق مقادیر (Values) آن با مقادیر اندیکاتور، که برمبنای آن این تابع توسعه داده شده‌است، تست کنیم. برای دست‌یابی به این هدف باید یک‌بار دیگر یک تستر اکسپرت برای تابع Get_ASCTrend1Series() ایجاد کنیم:

این اکسپرت را در استراتژی‌تستر، تست کرده و بعد از آن فایل گزارش (log-file) را جهت اطمینان از اینکه مقادیر تابع ما کاملاً با مقادیر اندیکاتور – به‌لحاظ پُر شدن با مقادیر بافر اندیکاتور شبیه‌سازی‌شده – یکسان هستند، کاملاً بررسی کنید!

تبدیل کد اندیکاتور به کد اکسپرت. نتیجه‌گیری.

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

و سرانجام می‌توانیم کد اکسپرت را تبدیل کنیم، و جایگزینی فراخوان‌های اندیکاتور سفارشی را با فراخوان‌های تابع اندیکاتور سفارشی انجام دهیم:

البته تبدیل آخر کد اکسپرت نیاز به برخی تغییرات درون تابع  start()در بخش ” DEFINING SIGNALS FOR TRADES” (تعریف سیگنال‌ها برای تریدرها) دارد، آن‌هم به‌دلیل تغییرات در پوزیشن‌های سلول‌های استفاده‌شده در بافرهای اندیکاتور شبیه‌سازی‌شده در مقایسه با بافر سورس.

تست نتایج نهایی و سورس اکسپرت

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

اما آنچه در نگاه اول واضح به‌نظر می‌رسد این است که در همه‌ی موقعیت‌ها، اکسپرت نهایی آهسته‌تر از اکسپرت سورس کار می‌کند!

تبدیل کد اندیکاتور به کد اکسپرت. نتیجه‌گیری.

تبدیل کد اندیکاتور به کد اکسپرت. نتیجه‌گیری.

دلیل زمان طولانی‌تر تست اکسپرت چیست؟ فرض ما بر این است که به‌نوعی این موضوع مرتبط با استفاده از حالت شبیه‌سازی اندیکاتور در عملکرد بافرها، و بازگشت مقادیر توابع اندیکاتور به بافرها از طریق رفرنس است. البته همه‌ی اینها را می‌توان با حذف حالت شبیه‌سازی اندیکاتور در عملکرد بافرها، بیشتر توسعه داد. نگاهی به اکسپرت FastNewASCTrend1RAVI_Expert. mq4 بیندازید و آن را آزمایش کنید. اما در این مورد شرایط کاملاً مشابه است – این اکسپرت به‌آهستگی قبلی کار می‌کند. بنابراین، این نتیجه‌گیری واضح است: در این مدل کاملاً ساده‌ی ما، بسیار غیرمنطقی است که برای تبدیل کد آن‌هم با استفاده‌ی صِرف از اندیکاتورهای غیرمتمرکز در منبع، بیاییم توابع سفارشی را به‌خاطر عملکرد سریع‌تر اکسپرت، جایگزین کنیم.

نتیجه‌گیری

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

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

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

امینی

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

یک اکسپرتِ غیرمعاملاتی برای تست اندیکاتورها

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

نمونه اکـــســپــرت

نوشتن نظر شما

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