اکسپرت‌هایی برمبنای استراتژی‌های محبوب ترید و کیمیای بهینه‌سازی ربات ترید

اکسپرت‌هایی برمبنای استراتژی‌های

اکسپرت‌هایی برمبنای استراتژی‌های محبوب ترید و کیمیای بهینه‌سازی ربات ترید

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

من به‌نوبه‌ی خودم در اینکه این کار ارزش انجام دادن داشته باشد یا نه، شک دارم و فکر می‌کنم ضروری است هر تریدر تازه‌کاری به اکسپرت‌های صحیح-توسعه‌داده‌شده برمبنای این سیستم‌های ترید، دسترسی داشته باشد؛ بنابراین، به‌خاطر همین ضرورت، همه‌چیز از ابتدا بیان می‌شود. در این مقاله، می‌خوام مدل خود را در ارائه‌ی راه‌حل این مسئله بازگو کنم. برای ساخت اکسپرت از اندیکاتور‌های کتابخانه‌ی خودم استفاده می‌کنم که از آن‌ها در مقاله‌ی Effective Averaging Algorithms with Minimal Lag: Use in Indicators نیز استفاده کرده‌‌ام.

طرح کلی ساختار اکسپرت

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

اکسپرت‌هایی برمبنای استراتژی‌های
اکسپرت‌هایی برمبنای استراتژی‌های محبوب ترید و کیمیای بهینه‌سازی ربات ترید

سیستم ترید برمبنای تغییر جهت مووینگ

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

اکسپرت‌هایی برمبنای استراتژی‌های
اکسپرت‌هایی برمبنای استراتژی‌های محبوب ترید و کیمیای بهینه‌سازی ربات ترید

سیگنال فروش نیز تغییر جهت مووینگ از صعودی به نزولی است:

اکسپرت‌هایی برمبنای استراتژی‌های
اکسپرت‌هایی برمبنای استراتژی‌های محبوب ترید و کیمیای بهینه‌سازی ربات ترید

برای محاسبه‌ی سیگنال‌های روند، از مقدار مووینگ (moving value) روی سومین، دومین، و اولین کندل استفاده می‌کنیم. مقادیر مووینگ روی کندل صفر را درنظر نمی‌گیریم، به‌عبارت دیگر، سیستم فقط روی کندل‌های بسته‌شده کار می‌کند. از اندیکاتور سفارشی JFATL به‌عنوان یک مووینگ استفاد شده‌است – این اندیکاتور یک فیلتر FATL دیجیتال و در عین حال ساده است که هموارسازی اضافی JMA را با خود دارد. در اینترنت می‌توانید نظراتی را ببینید که می‌گویند ورود به معامله در تغییر جهت FATL، چندین پوینت سود را به‌همراه خواهد داشت، بنابراین خواننده به‌سادگی قانع می‌شود که چقدر این استراتژی در واقعیت کارآمد است.

در اینجا نسخه‌ای از اجرای سیستم به‌شکل یک اکسپرت را می‌بینید:

کد اکسپرت

برای دریافت سیگنال‌های خرید و فروش، از دو الگوریتم مستقل و کاملاً مشابه استفاده شده‌است؛ هر یک از این الگوریتم‌ها پارامترهای اکسترنال خود را برای بهینه‌سازی دارند. تجربه‌ی خودم ثابت می‌کند که استفاده از چنین رویکردی برای نوشتن این اکسپرت بسیار بهتر و سودده‌تر است از حالت تک-الگوریتمی برای شناسایی سیگنال‌های خرید و فروش. کسانی که به مدل دیگر، یعنی مدلی که هم برای پوزیشن‌های کوتاه و هم برای پوزیشن‌های بلند فقط از یک مووینگ استفاده می‌کند، علاقه‌ دارند، می‌توانند الگوریتم مربوطه را در اکسپرت EXP_0.mq4 ببینند و آن را بررسی کنند. ما بحث در مورد این اکسپرت را با دو مووینگ ادامه می‌دهیم. این اکسپرت می‌تواند همزمان یک پوزیشن در جهت Buy و یک پوزیشن در جهت Sell برای یک جفت‌اَرز ترید‌شده، باز کند. این اکسپرت معاملات را از بازار (market) اجرا می‌کند. معاملات با حد سود و حد ضرر بسته می‌شوند. اگر سیگنال‌های روند، برخلاف جهت پوزیشن‌های بازشده، ظاهر شوند، اکسپرت اجازه می‌دهد که معامله به‌اجبار بسته شود. شیوه‌ی دریافت سیگنال برای بستن معاملات دقیقاً مشابه با همان شیوه‌ی دریافت سیگنال برای باز کردن معاملات است، اما با خصوصیات معکوس.

محتوای فایل Lite_EXPERT1.mqh

برای به ‌حداکثر رساندن نیروی کار خود، سعی کنید هنگام نوشتن اکسپرت‌ها، از حداکثر تعداد توابع جهانی‌ایی که توسط کاربران تعریف شده‌اند، استفاده کنید. و بعد از آن کد یک اکسپرت را از بخش‌های مختلف گردآوری کنید، درست مانند اینکه در کارخانه‌های مختلف هر بخش تولید، و هر محصول تولید‌شده شامل حداکثر جزئیات یکپارچه و استاندارد، بلوک‌ها و ماژول‌ها باشد. همین موضوع دلیل این است که چرا در همه‌ی اکسپرت‌ها در بلوک “Execution of Trades” از چندین تابع جهانی تعریف‌شده توسط کاربران استفاده شده‌است؛ آن‌ها در کد اکسپرت توسط دستور <include <Lite_EXPERT1.mqh # وارد شده‌اند:

تابع ()OpenBuyOrder1 هنگام فراخوانی، پوزیشن‌های بلند را باز می‌کند، اگر مقدار متغیر اکسترنال BUY_Signal برابر با true باشد و پوزیشن باز وجود نداشته باشد، عدد شناسایی (عدد جادویی) آن برابر با مقدار متغیر MagicNumber است. مقادیر متغیرهای اکسترنال STOPLOSS و TAKEPROFIT به‌ترتیب مقدار حد ضرر و حد سود را در واحد پوینت تعیین می‌کنند. مقدار متغیر Money_Management ممکن است از صفر تا یک تغییر کند. این متغیر نشان می‌دهد کدام بخش از سپرده‌ی موجود برای انجام معامله استفاده می‌شود. اگر مقدار این متغیر کمتر از صفر باشد، تابع ()OpenBuyOrder1 از مقدار خودش به‌عنوان مقدار لاتیج استفاده می‌کند! پوزیشن‌های کوتاه وقتیکه تابع ()OpenSellOrder1 فراخوانده می‌شود، به‌شیوه‌ی مشابه، باز می‌شوند. هر دو تابع پوزیشن‌ها را بدون درنظر گرفتن یکدیگر باز می‌کنند، اما در مدت زمان ۱۱ ثانیه فقط یک درخواست برای انجام معامله می‌تواند به سرور فرستاده شود. ورای انجام معاملات، توابع ()OpenBuyOrder1 و ()OpenSellOrder1 در فایل گزارش (log) اطلاعات مربوط به معاملات بازشده را ثبت می‌کنند.

اگر متغیر Stop_Signal مقدار true بگیرد، تابع ()CloseOrder1، وقتی به آن رجوع می‌شود، پوزیشنی با عدد جادویی برابر با مقدار متغیر MagicNumber را می‌بندد.

تابع ()StopCorrect، مقدار StopLoss یا TakeProfit را به‌عنوان پارامتر Stop می‌پذیرد، مطابقت آن با حداقل مقدار پذیرفته‌شده را بررسی می‌کند، و اگر نیاز بود آن را به حداقل مقدار مجاز تغییر می‌دهد و با درنظر گرفتن اصلاحات احتمالی آن را برمی‌گرداند.

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

()OpenBuyOrder1()، OpenSellOrder1، و ()CloseOrder1 درون تابع ()start استفاده شده‌‌اند، درحالیکه توابع ()StopCorrect و ()MarginCheck، درون کد ()OpenBuyOrder1 و ()OpenSellOrder1 استفاده شده‌اند.

درصورتیکه توابع ()OpenBuyOrder1()، OpenSellOrder1، و ()CloseOrder1 تا پایان عملکردی صحیح داشته باشند، هر یک از آن‌ها به “true” بازمی‌گردد، اما اگر حین اجرای توابع خطایی رخ دهد، مقدار بازگشتی “false” است. تمام این سه تابع: ()OpenBuyOrder1()، OpenSellOrder1، و ()CloseOrder1 هنگام اجرای معامله، مقادیر متغیرهای اکسترنال‌شان یعنی BUY_Signal، SELL_Signal، و Stop_Signal را به “false” می‌فرستند!

تابع ()GetFreeMargin حجم سرمایه در گردش آزاد (Free Margin) حساب کنونی، که اجازه‌ی سود و ضرر را به ما می‌دهد و از آن برای باز کردن پوزیشن استفاده می‌کنیم، را برمی‌گرداند. از این تابع برای محاسبه‌ی مقدار لاتیج استفاده می‌شود.

تابع ()CountLastTime مقداردهی اولیه متغیر LastTime را همراه با رسیدگی به خطایی که حین اجرای معامله رخ داده است، انجام می‌دهد. بعد از اجرای معامله، بلافاصله باید این تابع را فراخواند. برای مثال:

شمارش توابع بالا را که کنار بگذاریم، فایل Lite_EXPERT.mqh شامل چهار تابع دیگر برای درج معاملات انتظاری و یک تابع برای حذف آن معاملات، می‌شود: ()OpenBuyLimitOrder()، OpenBuyStopOrder1()، OpenSellLimitOrder1()، OpenSellStopOrder1 و ()DeleteOrder1. به‌راحتی می‌توان از روی اسم این توابع، تعیین متغیرهای اکسترنال را درک کرده و آن را انجام داد. متغیرهای جدید LEVEL و Expiration برای ارسال فاصله در واحد پوینت از قیمت کنونی، که روی آن معاملات انتظاری درج می‌شوند، و نیز به تبع آن تاریخ انقضای معامله‌ی انتظاری، به یک تابع، ضروری هستند.

علاوه بر تمام توابعی که در بالا توضیح داده شدند، این فایل، دو تابع دیگر را نیز در خود دارد: ()OpenBuylOrder2 و ()OpenSellOrder2، که کاملاً مشابه ()OpenBuyOrder1 و ()OpenSellOrder1 هستند، البته به‌غیر از یک مورد. این توابع ابتدا پوزیشن‌ها را بدون حد سود و حد ضرر باز می‌کنند و بعد از آن تنظمیات مربوط به حد سود و حد ضرر پوزیشن‌های بازشده را انجام داده و آن‌ها را درج می‌کنند. این توابع برای عملکرد آن دسته از اکسپرت‌هایی ضروری هستند که توسعه‌داده‌شده‌اند تا با بروکرهایی کار کنند که [آن بروکرها]، به‌خاطر نوع اجرا شدن Market Watch، به مشتری اجازه نمی‌دهند هنگام باز کردن یک پوزیشن در بازار، حد سود و حد ضرر را تعیین کنند. در چنین بروکرهایی، حد سود و حد ضرر با اصلاح پوزیشن بازشده، تعیین می‌شوند.

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

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

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

نوشتن چنین کدی بدون داشتن خطاهای واضح و غیرواضح، برای یک کاربر تازه‌کار MQL4 کاری بسیار سخت و زمان‌بر است. و استفاده از کدهای آماده و جهانی در اکسپرت (که متخصص آن‌ها را نوشته است) خیلی ساده و راحت است:

فقط چند خط از یک تابع جهانیِ تعریف‌شده توسط کاربرها فراخوانده می‌شود – و کد شما آماده است! تمام چیزی که نیاز دارید فهمیدن این است که چگونه باید فراخوانی توابع را نوشت. چیزی که بیشتر اهمیت دارد این است که فهمیدن کد اکسپرت کاری کاملاً ساده و راحت است و به همین دلیل، می‌توانید هرگونه استراتژی ترید را در اکسپرت‌های خود پیاده‌سازی کنید. در اکسپرت Exp_1.mq4، توابعی برای باز کردن معاملات انتظاری و تریلینگ استاپ درنظر گرفته نشده‌است، بنابراین هنگام کامپایل کردن، متااِدیتور، اخطاری درباره‌ی حذف این توابع از اکسپرت به ما نشان خواهد داد:

اکسپرت‌هایی برمبنای استراتژی‌های
اکسپرت‌هایی برمبنای استراتژی‌های محبوب ترید و کیمیای بهینه‌سازی ربات ترید

توضیحاتی اضافی دربارهی کد اکسپرت

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

هدف از این متغیر، ذخیره‌ی حداقل تعداد کندل‌ها در حافظه‌ی اکسپرت است؛ در صورت وجود کندل‌های کمتر، اکسپرت ابداً نمی‌تواند در جهت‌های بلند، کار کند. این مقدار از الگوریتم اندیکاتور سفارشی JFATL.mq4 تعیین شده‌است. برای محاسبه‌ی فقط یک مقدار از فیلتر دیجیتال FATL، کندل‌های ۳۹ نمودار نیاز هستند. برای داشتن JFATLی که توسط الگوریتم JMA به‌نوعی هموارسازی و بدون اِشکال شده‌است، حداقل ۳۰ مقدار FATL نیاز است، و الگوریتم شناسایی سیگنال در اکسپرت، برای معاملات به‌جای یک کندل، از سه کندلِ آخر نمودار بعلاوه‌ی کندل چهارم، یعنی کندل صفر، استفاده می‌کند. بررسی اینکه آیا تعداد کندل‌ها برای محاسبات بیشتر کافی است یا خیر، چیزی شبیه به این خواهد بود:

بررسی

جهت حذف محاسبه‌ی مجدد سیگنال‌ها در هر تیک توسط اکسپرت، برای ورود به بازار، ضروری است؛ اکسپرت باید این کار را هنگام تغییر کندل انجام دهد، که این کار به‌خوبی منابع کامپیوتر را حفظ کرده، و زمان بهینه‌سازی را کاهش می‌دهد. به همین دلیل است که متغیر LastBars_Up از نوع استاتیک اعلام شده‌است – تا تعداد کندل‌ها روی تیک قبلی تابع int start() را به‌یاد داشته باشد. مقداردهی اولیه BUY_Sign و BUY_Stop برای ورود و خروج از بازار فقط یک‌ مرتبه هنگام تغییر کندل انجام می‌شود؛ آن‌ها باید این مقدار را تا زمانی که معامله اجرا شده یا بسته می‌شود و یا تا زمانی که تغییر دیگری در کندل‌ها رخ می‌دهد، نگه دارند. به همین دلیل است که این متغیرها از نوع استاتیک اعلام شده‌اند. گمان می‌کنم، جزئیات دیگر اکسپرت کاملاً واضح باشند و بتوان آن‌ها را از کد فهمید.

جایگزین کردن مووینگ در اکسپرت

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

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

در بلوک مقداردهی اولیه، مقدار متغیر باید تغییر کند:

اکنون دو JMA متوالی بدون اِشکال داریم، که هر کدام حداقل ۳۰ کندل و ۴ کندل برای الگوریتم محاسباتی اکسپرت، نیاز دارند. بعد از آن در بلوک مقادیر جمع‌آوری منابع ، رفرنس اندیکاتور سفارشی باید به رفرنسی تغییر کند که در ابتدای این پاراگراف قرار داده شده‌است. برای بخش دوم این الگوریتم، همه‌چیز به‌ روش مشابه انجام شده‌است. بنابراین، ممکن است فقط از مووینگ‌ها استفاده نکنیم، بلکه از اُسیلاتورهایی استفاده کنیم که بعضی‌وقت‌ها ممکن است بسیار پُرکاربرد باشند. کد آماد‌ه‌ی اکسپرت برمبنای J2JMA در فایل EXP_2.mqh قرار داده شده‌اشت.

بهینهسازی اکسپرت

اکنون، روی مثال اکسپرت‌مان، بیایید در مورد برخی از جزئیات بهینه‌سازی در تمام اکسپرت‌هایی که در این نوع مقالات آورده می‌شوند، صحبت کنیم. همانطور که پیش‌تر اشاره شد، دو الگوریتم مستقل در این اکسپرت داریم؛ برای کار کردن با پوزیشن‌های بلند و کوتاه. طبیعتاً، سریع‌تر و راحت‌تر این است که اکسپرت را فقط برای جهت Buy یا Sell در یک زمان، بهینه‌سازی کنیم. برای دست‌یابی به این هدف، دو متغیر اکسترنال داریم – Test_Up و Test_Dn.

با تعیین مقدار “false” برای یکی از این متغیرهای منطقی (Logical)، مانع از انجام تمام محاسبات در آن جهت خواهیم شد و در نتیجه بهینه‌سازی در زمان کمتری انجام خواهد شد. بعد از بهینه‌سازی پارامترهای اکسپرت در یک جهت، مقادیر متغیرهای Test_Up و Test_Dn را معکوس ‌‌کرده و اکسپرت را در جهت مخالف بهینه‌سازی می‌کنیم. و فقط بعد از آن است که برای هر دو متغیر، “true” را تعیین، و نتایج را بررسی می‌کنیم. فرآیند بهینه‌سازی و تست کاملاً شفاف در مقاله‌یTesting of Expert Advisors in MetaTrader 4 Client Terminal: an Outward Glance گفته شده‌است، و بهینه‌سازی برای این اکسپرت دقیقاً همانطور که در این مقاله گفته شده، انجام گرفته است. استراتژی‌تستر را اجرا کرده، اکسپرت را آپلود کنید، جفت‌اَرز ترید را انتخاب کنید، دوره را انتخاب کنید، و در آخر روش بهینه‌سازی و دوره‌ی زمانی برای بهینه‌سازی را تعیین کنید:

اکسپرت‌هایی برمبنای استراتژی‌های
اکسپرت‌هایی برمبنای استراتژی‌های محبوب ترید و کیمیای بهینه‌سازی ربات ترید

بعد از آن، “Expert properties” را در تستر انتخاب کرده و تَب “Testing” را باز کنید:

اکسپرت‌هایی برمبنای استراتژی‌های
اکسپرت‌هایی برمبنای استراتژی‌های محبوب ترید و کیمیای بهینه‌سازی ربات ترید

در اینجا، مقدار سرمایه‌گذاری اولیه را تعیین کرده، و یک جهت (کوتاه یا بلند) را برای بهینه‌سازی انتخاب می‌کنیم، و الگوریتم ژنتیکی بهینه‌سازی را انتخاب می‌کنیم. بعد از آن به تَب “Inputs” بروید:

اکسپرت‌هایی برمبنای استراتژی‌های
اکسپرت‌هایی برمبنای استراتژی‌های محبوب ترید و کیمیای بهینه‌سازی ربات ترید

در اینجا، “true” را به یکی از متغیرهای اکسترنال Test_Up و Test_Dn، و “false” را به دومی اختصاص می‌دهیم. سپس به متغیرهای Timeframe_Up و Timeframe_Dn، مقادیر دوره‌های نموداری که روی آن بهینه‌سازی قرار است انجام شود را اختصاص دهید، و در Money_Management_Up و Money_Management_Dn، آن بخش از سرمایه را که برای انجام معاملات متناظر Buy و Sell استفاده می‌شود، تعریف کنید.

برای متغیرهای اکسترنال باقی‌مانده، محدودیت‌های متغیرحین بهینه‌سازی تعیین کنید. بعد از آن، متغیرهای اکسترنال بهینه‌شده را پرچم‌دار کنید (علامت‌گذاری کنید). OK را بزنید و تَب را ببندید و بهینه‌سازی را شروع کنید. بعد از اینکه بهینه‌سازی پایان یافت

اکسپرت‌هایی برمبنای استراتژی‌های
اکسپرت‌هایی برمبنای استراتژی‌های محبوب ترید و کیمیای بهینه‌سازی ربات ترید

به تَب “Results” در تستر بروید:

اکسپرت‌هایی برمبنای استراتژی‌های
اکسپرت‌هایی برمبنای استراتژی‌های محبوب ترید و کیمیای بهینه‌سازی ربات ترید

و نتایج رضایت‌بخش بهینه‌سازی را در استراتژی‌تستر آپلود کنید. و استراتژی‌تستر همین رویه را در جهت مخالف پیش می‌گیرد. نتیجتاً اینکه اکسپرتی داریم با پارامترهای آپلودشده که در دوره‌ی زمانی بهینه‌سازی سودده است. توجه کنید: properties اکسپرت در متاتریدر ۴ با آنچه در بالا نشان داده شد، تفاوت دارد:

اکسپرت‌هایی برمبنای استراتژی‌های
اکسپرت‌هایی برمبنای استراتژی‌های محبوب ترید و کیمیای بهینه‌سازی ربات ترید

خیلی راحت نیست که با پنجره‌های نرم‌افزار در این حالت کار کنیم و حالت تمام‌صفحه (Maximized) در چنین مواقعی بیشتر ترجیح داده می‌شود. این فایل پنجره‌ی خصوصیات اکسپرت‌هایی که نام فایل‌شان با Exp_ c (حساس به حروف بزرگ و کوچک) شروع می‌شود را، تمام‌صفحه نشان می‌دهد. برای استفاده از این فایل باید آن را از همان مسیر اجرا کرد، بعد از آن ماژول برنامه صبر می‌کند تا پنجره‌ی خصوصیات اکسپرت ظاهر شده و اندازه‌های آن را تعییر می‌دهد؛ در این لحظه توصیه می‌کنیم اصلاً موس خود را حرکت ندهید.

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

اکسپرت‌هایی برمبنای استراتژی‌های
اکسپرت‌هایی برمبنای استراتژی‌های محبوب ترید و کیمیای بهینه‌سازی ربات ترید

بسته به هدف بهینه‌سازی اکسپرت، مقادیر متفاوتی در اینجا داریم. چیزی که اهمیت دارد این است که دوره نمی‌تواند فراتر از داده‌های هیستوری موجود برود، درغیراین‌صورت، شرایط زیر را داریم:

اکسپرت‌هایی برمبنای استراتژی‌های
اکسپرت‌هایی برمبنای استراتژی‌های محبوب ترید و کیمیای بهینه‌سازی ربات ترید

پایین‌ترین حد ممکن در تمام داده‌های مربوط به تاریخچه در آرشیو خوانش‌ها (Quotes) را می‌توانید در شکل زیر ببینید:

اکسپرت‌هایی برمبنای استراتژی‌های
اکسپرت‌هایی برمبنای استراتژی‌های محبوب ترید و کیمیای بهینه‌سازی ربات ترید

طبیعتاً خطاهایی را که در ادامه ملاحظه می‌کنید، ممکن است در عملکرد اکسپرت و اندیکاتورهای آن، حین بهینه‌سازی و تست، ببینید:

اکسپرت‌هایی برمبنای استراتژی‌های
اکسپرت‌هایی برمبنای استراتژی‌های محبوب ترید و کیمیای بهینه‌سازی ربات ترید

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

اکنون می‌خواهم توضیحاتی درباره‌ی تَب “Inputs” اکسپرت بدهم. مجدد، بیایید فقط یک بخش از آن را بررسی کنیم – برای پوزیشن‌های بلند. قبلاً به Test_Up اشاره کرده‌ام. معنای پارامتر Timeframe_Up واضح است. Money_Management_Up را هم قبلاً توضیح داده‌ایم. حالا به بررسی پارامتر Length_Up می‌پردازیم. معنای این پارامتر درست همانند پارامتر Period در مووینگ اَورج‌های ساده است. این پارامتر می‌تواند مقداری از ۱ تا بی‌نهایت داشته باشد. تعیین مقدار بیشتر از ۱۵۰ برای این پارامتر اصلاً معنایی ندارد و در بیشتر مواقع راحت‌تر این است که به تایم‌فریم بالاتر برویم. حین بهینه‌سازی این پارامتر دقت داشته باشید که هرچه این پارامتر بزرگتر باشد، روند‌های پایدارتر و طولانی‌مدت‌تر توسط اندیکاتور JFATL شناسایی می‌شوند. بنابراین، در این سیستم ترید، وابستگی غیرمشهودی بین پارامتر Length_Up و STOPLOSS_Up و TAKEPROFIT_Up داریم. منطقاً، حد سود و حد ضرر مستقیماً به Length_Up وابسته هستند. البته، می‌توانیم معاملات را صرف‌نظر از Length_Up درج کنیم، اما در چنین حالتی سودده بودن سیستم ترید، دیگر با خصوصیات خود سیستم تعریف نمی‌شود بلکه با شرایط آن زمانِ بازار باید آن را تعریف کرد که در این سیستم ترید چنین چیزی اصلاً تعریف نشده‌است! معنای این حرف را می‌توان از مثال زیر فهمید. فرض کنید می‌خواهیم نتایج کاملاً خوبی از تست اکسپرت حین بهینه‌سازی این اکسپرت روی EUR/USD همراه با پارامترهای زیر، کسب کنیم:

واقعیت این است که JFATL با Length_Up برابر با چهار، اندیکاتور روندهای بسیار سریع است؛ ترکیب این با نمودار دقیقه‌ای، که اکسپرت روی آن فعالیت دارد، به چنین سیستمی امکان به‌ثبات رساندن مقیاس تغییر قیمت حتی تا ده الی پانزده رقم (بعد از نقطه) را می‌دهد (بهنوعی ۱۰ الی ۱۵ رقم اَعشار)، و به همین دلیل است که نتایج چشمگیر تست با چنین مقادیر بزرگ حد سود و حد ضرر، فقط این واقعیت را القا می‌کنند که حین بهینه‌سازی، بازار یک روند قوی را تجربه کرده که در خود سیستم شناسایی نشده‌است. بنابراین، می‌فهمیم که بعد از آپلود این پارامترها، اکسپرت به‌سختی چنین نتایج خوبی را نشان می‌دهد. هرچند، اگر بتوانید با استفاده از ابزارهای دیگر حضور یک روند قوی را در بازار شناسایی کنید، آنگاه استفاده از چنین پارامترهایی توجیه‌پذیر است.

دامنه‌ی مقادیر متغیر Phase_Up، از ۱۰۰- تا ۱۰۰+ تغییر می‌کند. وقتیکه مقادیر برابر با ۱۰۰- هستند، فرآیندهای ناپایدار مووینگ JFATL در وضعیتی با حداقل خصوصیات به سر می‌برند، اما تجربه‌ی من نشان می‌دهد که بهترین نتایج بهینه‌سازی وقتی حاصل می‌شود که این مقدار برابر با ۱۰۰+ است. متغیر IPC_Up تعیین می‌کند که کدام قیمت‌ها برای پردازش بیشتر توسط الگوریتم JFATL استفاده خواهند شد. استفاده از متغیر ClosePos_Up بسته‌شدن به‌ اجبارِ پوزیشن را، درصورتیکه روندی خلاف جهت پوزیشن بازشده شروع شود، فعال می‌کند. باید این را نیز درنظر بگیریم که اگر حد سود و حد ضرر خیلی با فاصله از بازار قرار داده شوند، تمام پوزیشن‌ها با سیگنال‌های مووینگ بسته می‌شوند و حد سود و حد ضرر، اگر مقدار ClosePos_Up برابر با “true” تعیین شده‌ باشد، روی معاملات هیچ تاثیری نخواهند داشت!

نتیجه‌گیری

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

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

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

 

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

جواهری

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

اکسپرت‌هایی برمبنای استراتژی‌های محبوب ترید و کیمیای بهینه‌سازی ربات ترید(ادامه مطلب)

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

یک قالب جهانی برای اکسپرت متاتریدر

۲ مورد نظر

  • سلام
    فایل mqh. را در مسیر فولدر Include کپی کرده ام ولی روش اجرا کردنش رو نمیدونم.
    در metaeditor هم متن برنامه اش پیداست و Compile کردم و اروری نداشت.
    فقط چیکار کنم که اجرا بشه.
    ممنون

    • با سلام خدمت شما دوست عزیز
      کدهای موجود در فایل های MQH اجرایی نیستند و باید در برنامه نوشته شده فراخوانی شوند و برنامه اصلی کامپایل کرده و فایل EX4 یا همان اکسپرت نوشته شده در متاتریدر اجرا بفرمائید

نوشتن نظر شما

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

4 × 4 =