چرا به تست استراتژی نیاز داریم؟
تست استراتژی – ایده معاملات خودکار از این واقعیت نشات میگیرد که ربات معاملاتی میتواند بدون توقف به مدت ۲۴ ساعت در روز، هفت روز در هفته کار کند. ربات خسته نمیشود، شک نمیکند؛ ترس ندارد و کاملاً از هرگونه مشکل روانشناختی آزاد است.
به اندازه کافی صلاحیت دارد تا قوانین معاملاتی را به روشنی دریافت و آنها را در الگوریتمها اجرا کند. ربات بدون خستگی همیشه آماده به کار است. اما ابتدا باید اطمینان حاصل کنید که دو شرایط مهم زیر را برآورده میکنید:
- اکسپرت ادوایزر عملیات معاملاتی (trading operations) را مطابق با قوانین سیستم معاملاتی انجام میدهد؛
- استراتژی معاملاتی که در اکسپرت ادوایزر اجرا میشود، سود تاریخی را نشان میدهد.
برای پاسخ به این سوالات، به تستر استراتژی (Strategy Tester) که در برنامه متاتریدر ۵ موجود است، میپردازیم.
آموزش استفاده از استراتژی تستر در متاترید
حالتهای تولید تیک
اکسپرت ادوایزر برنامهای است که در ام کیو ال ۵ نوشته شده است، که هر بار در پاسخ به برخی رویدادهای (event) خارجی اجرا میشود. اکسپرت ادوایزر دارای یک تابع متناظر (event handler) برای هر رویداد از پیش تعریف شده است.
رویداد تیک جدید (تغییر قیمت – price change) رویداد اصلی اکسپرت ادوایزر است و بنابراین ما باید یک دنباله تیک را برای تست اکسپرت ادوایزر تولید کنیم. ۳ حالت از تولید تیک اجرا شده در تستر استراتژی متاتریدر ۵ وجود دارد:
- Every tick
- (Minute OHLC (OHLC prices with minute bars
- Open prices only
اساسی و دقیقترین حالت، حالت “Every tick” است، دو حالت دیگر سادهسازی آن هستند و در مقایسه با حالت “Every tick” توصیف میشوند. برای درک تفاوت بین آنها، تمام سه حالت را به ترتیب بررسی کنید.
“Every tick”
دادههای تاریخی نرخ برای ابزارهای مالی از سرور معاملاتی به متاتریدر ۵ در قالب بارهای خیلی کوچک بسته بندی شده (packed minute bars) منتقل میشود. اطلاعات مفصلی در مورد وقوع درخواستها و ساختمان قابهای زمانی مورد نیاز را میتوانید از فصل Organizing Data Access مرجع MQL5 بدست آورید.
کوچکترین عنصر تاریخچه قیمت، کندل یک دقیقهای (minute bar) است که از آن میتوانید اطلاعات مربوط به چهار مقدار قیمت را بدست آورید:
- Open، باز شدن – قیمتی که bar یک دقیقهای باز شد؛
- High، بالاترین – حداکثر قیمتی که در این bar یک دقیقهای به دست آمد؛
- Low، پایینترین – حداقل قیمتی که در این bar یک دقیقهای به دست آمد؛
- Close، بسته شدن – قیمت بسته شدن bar
bar یک دقیقهای جدید در لحظهای که دقیقه جدید آغاز میشود باز نمیشود (تعداد ثانیهها برابر با ۰ است)، اما هنگامی که یک tick اتفاق میافتد – تغییر قیمت با حداقل یک پیپ انجام میشود.
این شکل bar یک دقیقهای اول هفته جدید معاملات را نشان میدهد، که زمان باز شدن آن ۲۰۱۱٫۰۱٫۱۰ ۰۰:۰۰ است. شکاف قیمت بین روزهای جمعه و دوشنبه، معمولا اتفاق میافتد که در نمودار مشاهده میکنیم. زیرا نرخ ارز حتی در آخر هفته در واکنش به اخبار نوسان میکند.
شکل (۱) شکاف قیمت بین روزهای جمعه و دوشنبه
برای این بار، ما فقط میدانیم که بار یک دقیقهای در تاریخ ۱۰ ژانویه ۲۰۱۱ در ۰۰ ساعت ۰۰ دقیقه باز شد، اما در مورد ثانیهها چیزی نمیدانیم. این ممکن است در ۰۰:۰۰:۱۲ یا ۰۰:۰۰:۳۶ (۱۲ یا ۳۶ ثانیه پس از شروع یک روز جدید) یا هر زمان دیگری در آن دقیقه باز شده باشد. اما میدانیم که قیمت EURUSD در زمان باز شدن بار یک دقیقهای جدید ۱٫۲۸۹۴۰ بود.
ما همچنین در عرض یک ثانیه نمیدانیم چه زمانی تیک، متناظر با قیمت بسته شدن بار یک دقیقهای مورد نظر، دریافت شد. و فقط یک چیز را میدانیم – آخرین قیمت بسته شدن بار یک دقیقهای. برای این دقیقه، قیمت ۱٫۲۸۹۵۸ بود. زمان ظهور قیمتهای بالا و پایین نیز ناشناخته است، اما میدانیم که حداکثر و حداقل قیمت به ترتیب در سطح ۱٫۲۸۹۵۸ و ۱٫۲۸۹۴۰ بود.
برای تست استراتژی معاملاتی، نیاز به دنبالهای از تیکها داریم، که در آن کار اکسپرت ادوایزر شبیهسازی خواهد شد. بنابراین، برای هر بار یک دقیقهای، ۴ نقطه کنترل را میدانیم، جایی که قیمت قطعا وجود داشته است. اگر یک بار فقط دارای ۴ تیک باشد، این اطلاعات برای انجام تست استراتژی کافی است، اما معمولا حجم تیکها از ۴ بیشتر است.
از این رو، نیاز به ایجاد نقاط کنترل اضافی برای تیکها وجود دارد که بین قیمتهای open، high، low و close رخ داده است. اصول حالت تولید تیکهای “Every tick” در The Algorithm of Ticks’ Generation within the Strategy Tester of the MetaTrader 5 Terminal شرح داده شده است که در شکل زیر نشان داده شده است.
شکل (۲) الگوریتم تولید تیک ها
هنگام تست استراتژی در حالت “Every tick”، تابع OnTick اکسپرت ادوایزر در هر نقطه کنترل؛ فرا خوانده میشود. هر نقطه کنترل یک تیک از دنباله تولید شده است. اکسپرت ادوایزر زمان و قیمت تیکهای شبیهسازی شده را دریافت میکند، درست همانطور که در هنگام آنلاین بودن کار میکند.
مهم: حالت تست “Every tick” دقیقتر است، اما زمان تست استراتژی افزایش مییابد. برای تست اولیه اکثر استراتژیهای معاملاتی، معمولا استفاده از یکی از دو حالت دیگر تست کافی است.
ما در مهد سرمایه با یک تیم برنامه نویسی حرفه ای اماده ارائه خدماتی از جمله طراحی اکسپرت تخصصی و طراحی اندیکاتور تخصصی به شما عزیزان هستیم.
1 Minute OHLC در متاتریدر ۵
در متاتریدر ۵ حالت “Every tick” در بین سه حالت موجود دقیقتر است، اما در عین حال، از همه کندتر است. اجرای کنترل کننده OnTick در هر تیک رخ میدهد، در حالی که حجم تیک میتواند بسیار بزرگ باشد. برای یک استراتژی، که در آن حرکت قیمت دنباله تیک در سراسر بار اهمیتی ندارد، یک حالت شبیهسازی سریعتر – “۱ minute OHLC” وجود دارد.
در حالت “۱ minute OHLC”، دنباله تیک فقط با OHLC prices of the minute bars ساخته شده است، تعداد نقاط کنترل تولید شده به طور قابل توجهی کاهش یافته است – از این رو، زمان تست فرا رسیده است.
راه اندازی تابع OnTick در تمام نقاط کنترل که با قیمت OHLC minute bars ساخته میشوند، انجام میشود.
امتناع از تولید تیکهای واسطه اضافی بین قیمتهای open، high، low و close، منجر به ظهور جبرگرایی سفت و سخت در توسعه قیمتها، از لحظهای که قیمت open مشخص میشود. این باعث میشود که یک “Testing Grail” ایجاد شود که نشانگر یک گراف رو به بالا خوبی از موجودی سپرده تستر است. یک مثال از این قبیل Grail که در پایگاه کد – Grr-alارائه شده است.
شکل (۳) اکسپرت ادوایزر Grr-al، که از ویژگیهای برجسته prices OHLC استفاده میکند
این شکل یک گراف بسیار جذاب از تست اکسپرت ادوایزر در متاتریدر ۵ را نشان میدهد. این گراف چگونه به دست آمده ؟ ما ۴ قیمت را برای یک بار یک دقیقهای میدانیم و همچنین میدانیم که اولین قیمت open و آخرین قیمت close است.
قیمتهای high و low را بین آنها داریم و دنبالهای از وقوع آنها که ناشناخته است، اما قیمت high بیشتر از قیمت open یا برابر آن است که این معمول است (و قیمت low آن کمتر یا برابر قیمت Open).
کافی است تا زمان دریافت قیمت open را مشخص کند و سپس تیک بعدی را تجزیه و تحلیل میکند تا تعیین کند که قیمت high یا قیمت low قبل از آن میآید. اگر قیمت زیر قیمت Open است، پس قیمت low را داریم و خرید در این تیک وجود دارد، تیک بعدی با قیمت high مطابقت دارد، که در آن ما خرید را خواهیم بست و برای فروش باز میکنیم.
تیک بعدی تیک آخر است، این قیمت close است، و فروش را در آن میبندیم. اگر پس از قیمت، ما یک تیک با قیمت بالاتر از قیمت باز شدن را دریافت کنیم، پس دنباله معاملات معکوس میشود. فرآیند یک بار یک دقیقهای در این حالت “cheat” است، و منتظر بار دیگری است.
هنگام تست چنین اکسپرت ادوایزری در تاریخچه، همه چیز هموار میشود، اما هنگامی که ما آن را به صورت آنلاین راه اندازی میکنیم، حقیقتی شروع به آشکار شدن میکند – خط تعادل ثابت باقی میماند، اما سر رو به پایین است. ما برای افشای این ترفند فقط نیاز به اجرای اکسپرت ادوایزر در حالت “Every tick” داریم.
توجه: اگر نتایج تست اکسپرت ادوایزر در حالتهای تست تخمینی (“۱ minute OHLC” and “Open Prices only “) خیلی خوب به نظر میرسد، از تست آن در حالت “Every tick” نیز مطمئن شوید.
Open Prices Only در متاتریدر 5
در این حالت تیکها بر اساس prices OHLC از قاب زمانی انتخاب شده برای تست تولید میشوند. تابع OnTick اکسپرت ادوایزر تنها در آغاز بار در قیمت open اجرا میشود. با توجه به این ویژگی، سطوح توقف و در حال انتظار ممکن است در قیمتی که با قیمت مشخص شده متفاوت است (به ویژه هنگام تست در قابهای زمانی بالاتر) رخ دهد. در عوض، ما فرصتی برای اجرای سریع تست ارزیابی اکسپرت ادوایزر داریم.
یک استثنا در تولید تیکها در حالت “Open Price Only”، دورههای W1 و MN1 است: تیکها برای این قابهای زمانی، بر اساس prices OHLC هر روز تولید میشود، نه prices OHLC هفتگی یا ماهانه.
فرض کنید ما یک اکسپرت ادوایزر را روی جفت ارز EURUSD و قاب زمانی H1 در حالت “Open Prices Only” تست میکنیم.
در این مورد، تعداد کل تیکها (نقاط کنترل) بیش از ۴ عدد در بارهای یک ساعته در فواصل تست شده نخواهد بود. اما OnTick فقط در باز شدن بار یک ساعته فرا خوانده میشود. بررسیهای مورد نیاز برای تست صحیح بر روی بقیه بارها (که از اکسپرت ادوایزر “پنهان” هستند) رخ میدهد.
- محاسبات مورد نیاز مارجین؛
- تعیین کردن سطوح SL و TP؛
- تعیین کردن دستورات در حال انتظار؛
- حذف دستورات در حال انتظار منقضی شده
اگر پوزیشنهای باز یا دستورات در حال انتظار وجود نداشته باشد، لازم نیست که این بررسیها را روی تیکهای پنهان انجام دهیم، و افزایش سرعت ممکن است به آرامی و قابل توجه باشد. این حالت “Open prices only” برای تست استراتژیهایی که در روند تنها در زمان باز شدن بار معامله میکند بسیار مناسب است و از دستورات در حال انتظار و همچنین دستورات StopLoss و TakeProfit استفاده نمیکنند.
در متاتریدر ۵ برای استراتژیهایی از این قبیل، دقت لازم تست حفظ میشود.
بیایید از اکسپرت ادوایزر Moving Average با پکیج استاندارد به عنوان مثالی از اکسپرت ادوایزرها استفاده کنیم که میتواند در تمام حالات مورد تست واقع شود. منطق این اکسپرت ادوایزر به طوری ساخته شده است که تمام تصمیمات را در زمان باز شدن بار میگیرد، و فورا معاملات انجام میشود، بدون استفاده از سفارشات معوق.
یک تست از اکسپرت ادوایزر را روی جفت ارز EURUSD و در قاب زمانی H1 و در بازه زمانی ۰۹/۰۲/۲۰۱۰ تا ۲۰۱۰/۱۲/۳۱ انجام دهید و گرافها را مقایسه کنید. شکل زیر گراف موجودی سپرده را از گزارش تست برای تمام سه حالت نشان میدهد.
شکل (۴) گراف تست اکسپرت ادوایزر Moving Average.mq5 از پکیج استاندارد که به حالت تست بستگی ندارد.
در متاتریدر ۵ همانطور که میبینید، گرافها در حالتهای مختلف تست برای اکسپرت ادوایزر Moving Average از پکیج استاندارد دقیقا مشابه هم هستند.
برخی از محدودیتها در متاتریدر ۵ در حالت “Open Prices Only” وجود دارد:
شما نمیتوانید از حالت اجرای تاخیر تصادفی (the Random Delay execution mode) استفاده کنید. در تست اکسپرت ادوایزر در متاتریدر ۵ ، شما نمیتوانید به دادههای قاب زمانی (timeframe) پایینتر از آنچه که برای تست/بهینهسازی استفاده میشود دسترسی داشته باشید.
به عنوان مثال، اگر تست/بهینهسازی را در دوره H1 اجرا کنید، میتوانید به دادههای H2، H3، H4 و غیره دسترسی داشته باشید، اما به M30، M20، M10 و غیره دسترسی نخواهید داشت. علاوه بر این، قابهای زمانی بالاتر که قابل دسترسی هستند باید قاب زمانی تست چندگانه باشند.
برای مثال، اگر تست را در M20 اجرا کنید، نمیتوانید به اطلاعات M30 دسترسی پیدا کنید، اما امکان دسترسی به H1 وجود دارد. این محدودیتها با عدم امکان به دست آوردن دادههای قابهای زمانی پایینتر یا غیر چندگانه از بارهای تولید شده در طول تست/بهینهسازی، مرتبط هستند.محدودیت دسترسی به دادههای دیگر قابهای زمانی نیز برای سایر نمادهایی که اطلاعاتشان توسط اکسپرت ادوایزر مورد استفاده قرار میگیرد، اعمال میشود.
در این مورد، محدودیت هر نماد بستگی به اولین قاب زمانی که در طول تست/بهینهسازی دسترسی پیدا کرده است دارد. فرض کنید، در طول تست روی جفت ارز EURUSD و در قاب زمانی H1، یک اکسپرت ادوایزر به دادههای جفت ارز GBPUSD در قاب زمانی M20 دسترسی دارد.
در این مورد، اکسپرت ادوایزر توانایی استفاده از دادههای بیشتر EURUSD در H1، H2، و غیره، و همچنین GBPUSD در M20، H1، H2 و غیره را خواهد داشت.
توجه:
حالت “Open prices only” دارای کمترین زمان تست است، اما برای تمام استراتژیهای معاملاتی مناسب نیست. حالت تست مورد نظر را بر اساس ویژگیهای سیستم معاملاتی انتخاب کنید. برای پایان دادن به بخش حالتهای تولید، اجازه دهید یک مقایسه بصری از حالتهای مختلف تولید تیک برای EURUSD، برای دو بار M15 در بازه ۲۰۱۱٫۰۱٫۱۱ ۲۱:۰۰:۰۰ – ۲۰۱۱٫۰۱٫۱۱ ۲۱:۳۰:۰۰ را ملاحظه کنیم.
تیکها با استفاده از اکسپرت ادوایزر WriteTicksFromTester.mq5 در فایلهای مختلفی ذخیره شدند و پایان نام این فایلها در پارامترهای ورودی (input-parameters) filenamEveryTick، filenameOHLC و filenameOpenPrice مشخص شده است.
شکل (۵) ما میتوانیم تاریخ شروع و پایان تیکها (متغیرهای شروع و پایان) را برای اکسپرت ادوایزر WriteTicksFromTester مشخص کنیم
برای به دست آوردن سه فایل با سه دنباله تیک (برای هر یک از حالتهای زیر “Every tick”، “۱ minute OHLC” و “Open prices only”)، اکسپرت ادوایزر در حالتهای متناظر بصورت تکی سه بار اجرا شد. سپس دادهها از این سه فایل در نمودار با استفاده از اندیکاتور TicksFromTester.mq5 نمایش داده شدند. کد اندیکاتور به این مقاله پیوست شده است.
شکل (۶) دنباله تیک در تستر استراتژی METATRADER 5 در سه حالت تست متفاوت
به طور پیش فرض، تمام عملیات فایل (file operations) در زبان MQL5 در داخل “file sandbox” ساخته شده است و در حین تست، اکسپرت ادوایزر فقط به “file sandbox” خودش دسترسی دارد. به ترتیب از اندیکاتور و اکسپرت ادوایزر در طول تست برای کار با فایلها از یک پوشه، از flag FILE_COMMON استفاده کردیم. یک مثال از کد نویسی اکسپرت ادوایزر:
برای خواندن دادهها در اندیکاتور، ما همچنین از flag FILE_COMMON استفاده کردیم. این به ما اجازه داد تا از انتقال دستی فایلهای ضروری از یک پوشه به پوشه دیگر اجتناب کنیم.
اندیکاتور شبیهسازی اسپرد
اندیکاتور – تفاوت قیمت بین قیمت Bid و قیمت Ask اسپرد (Spread) نامیده میشود. در طول تست، اسپرد مدلسازی نشده است، اما از دادههای تاریخی گرفته شده است. اگر اسپرد در دادههای تاریخی کمتر یا برابر صفر باشد، اسپرد برای زمان دادههای تاریخی درخواست شده توسط تستر برنامه استفاده میشود.
در تستر استراتژی، اسپرد همیشه شناور در نظر گرفته میشود.
علاوه بر این، دادههای تاریخی حاوی مقادیر تیک و حجم معاملات است. برای ذخیره و بازیابی داده از یک ساختار MqlRates خاص استفاده میکنیم:
متغیرهای سراسری برنامه متاتریدر
در حین تست، متغیرهای سراسری برنامه (global variables of the client terminal) نیز شبیهسازی میشوند، اما آنها به متغیرهای فعلی سراسری مربوط نیستند که در برنامه با استفاده از دکمه F3 دیده میشود. این بدین معنی است که تمام عملیات با متغیرهای سراسری، در حین تست، خارج از ترمینال معاملاتی کاربر (در تستر برنامه) انجام میشود.
محاسبه اندیکاتورها در طول تست
در حالت real-time، مقادیر اندیکاتور در هر تیک محاسبه میشود. تستر استراتژی یک مدل مقرون به صرفه برای محاسبه اندیکاتورها را انتخاب میکند – اندیکاتورها بلافاصله قبل از اجرای اکسپرت ادوایزر دوباره محاسبه میشوند. که یعنی محاسبه دوباره اندیکاتورها قبل از فراخوانی توابع OnTick، OnTrade و OnTimer انجام میشود.
مهم نیست که آیا یک اندیکاتور برای یک کنترل کننده رویداد (event handler) خاص وجود دارد یا نه، تمام اندیکاتورهایی که دستههای آن توسط توابع iCustom یا IndicatorCreate ایجاد شده است، قبل از فراخوانی کنترل کننده رویداد (event handler)، مجددا محاسبه خواهند شد.
در نتیجه، هنگام تست در حالت “Every tick”، محاسبه اندیکاتورها قبل از فراخوانی تابع OnTick انجام میشود.
اگر تایمر در اکسپرت ادوایزر فعال باشد، با استفاده از تابع EventSetTimer، قبل از هر فراخوانی کنترل کننده OnTimer، اندیکاتورها دوباره محاسبه میشوند. بنابراین، زمان تست میتواند با استفاده از اندیکاتورهایی که به روش غیر بهینه نوشته شده است، تا حد زیادی افزایش یابد.
بارگذاری تاریخچه در حین تست استراتژی
تاریخچه یک نماد تست شده توسط برنامه از سرور معاملاتی قبل از شروع فرایند تست همگامسازی شده و بارگذاری (لود) میشود. در اولین بار، برنامه تمام سابقههای موجود یک نماد را به ترتیب بارگذاری میکند تا بعدا درخواست آن را ندهد. بعدا فقط دادههای جدید بارگذاری میشوند.
تستر برنامه تاریخچه یک نماد تست شده را از بخش معاملات برنامه پس از شروع تست دریافت میکند. اگر ابزارهای داده دیگر در فرایند تست استفاده میشود (برای مثال یک اکسپرت ادوایزر چند ارزی )، تستر برنامه برای چنین دادههایی تاریخچه مورد نیاز را از بخش معاملات در طی اولین فراخوانی درخواست میکند.
اگر دادههای تاریخی در برنامه در دسترس باشند، آنها بلافاصله به تستر منتقل میشوند. اگر دادهها در دسترس نباشند، برنامه درخواست میکند و آنها را از سرور دانلود میکند و سپس به تستر منتقل میکند.
داده ابزارهای اضافی نیز برای محاسبه cross-rates (کراس ریتس: نسبت دو ارز که توسط ارز سوم تعیین میشود) برای عملیات معاملاتی مورد نیاز است. برای مثال، هنگام تست یک استراتژی بر روی EURCHF با ارز سپرده دلار امریکا (USD)، قبل از پردازش اولین عملیات معاملاتی، تستر دادههای تاریخی EURUSD و USDCHF را از ترمینال معاملاتی کاربر درخواست میکند، اگر چه این استراتژی شامل فراخوانی مستقیم استفاده از این نمادها نیست.
قبل از تست استراتژی چند ارزی، توصیه میشود تمام دادههای تاریخی لازم را برای ترمینال معاملاتی کاربر دانلود کنید. این کار کمک میکند تا از تاخیر در تست/بهینهسازی در ارتباط با دانلود دادههای مورد نیاز جلوگیری شود.
برای مثال، میتوانید تاریخچه را از طریق باز کردن نمودارهای مناسب و پیمایش آنها تا ابتدای تاریخچه، دانلود کنید. یک نمونه از بارگذاری اجباری تاریخچه به برنامه در بخش Organizing Access to Data از مرجع MQL5 موجود است.
برنامه تاریخچه را تنها یکبار از سرور معاملاتی بارگذاری میکند آن هم اولین باری که تاریخچه یک نماد تست شده از برنامه را درخواست میکند. تاریخچه برای کاهش مصرف ترافیک داده به صورت پکیج بارگیری میشود.
عوامل تست نیز به نوبه خود، تاریخچه را از برنامه به شکل پکیج دریافت میکنند. در طی تست بعدی، تستر تاریخچه را از ترمینال بارگیری نمیکند، زیرا داده مورد نیاز از زمان اجرای قبلی تستر در دسترس است.
تست چند ارزی
تستر استراتژی ما را قادر میسازد تا بر روی استراتژیهای معاملاتی چند نمادی تست انجام دهیم. چنین اکسپرت ادوایزرهایی به طور معمول به عنوان اکسپرت ادوایزر چند ارزی در نظر گرفته میشوند، از همان ابتدا، در پلتفرمهای قبلی، تست فقط بر روی یک نماد واحد انجام میشد. در تستر استراتژی برنامه MetaTrader 5، ما میتوانیم برای تمام نمادهای موجود مدل معاملاتی ایجاد کنیم.
تستر، تاریخچه نمادهای مورد استفاده را در طول اولین فراخوانی دادههای نماد از ترمینال معاملاتی کاربر (نه از سرور معاملاتی!) به صورت خودکار بارگذاری میکند.
تستر فقط تاریخچه از دست رفته را دانلود میکند، با حاشیهای کوچک دادههای لازم تاریخچه، برای محاسبه اندیکاتورها در زمان شروع تست ارائه میدهد. برای قابهای زمان D1 و پایینتر، حداقل حجم تاریخچه دانلود شده یک سال است.
بنابراین، اگر ما یک تست را بر روی بازه ۲۰۱۰٫۱۱٫۰۱-۲۰۱۰٫۱۲٫۰۱ (تست بازه یک ماهه) با دوره M15 اجرا کنیم (هر بار برابر ۱۵ دقیقه است)، پس از آن ترمینال درخواست تاریخچه را برای ابزار مورد نظر برای کل سال ۲۰۱۰ میفرستد. برای قاب زمانی هفتگی، ما سابقه ۱۰۰ بار را میخواهیم که حدود دو سال است (یک سال ۵۲ هفته دارد).
برای تست در یک قاب زمانی ماهانه، تستر درخواست تاریخچه ۸ ساله را میفرستد (۱۲ ماه x 8 سال = ۹۶ ماه).
اگر بارهای ضروری وجود نداشته باشد، تاریخ شروع تست به طور خودکار از گذشته به حال حاضر تغییر مییابد تا ذخایر لازم بار را قبل از تست فراهم کند.
در حین تست، “Market Watch” نیز شبیهسازی شده است، که از آن میتوان اطلاعاتی را در مورد نمادها بدست آورد.
به طور پیش فرض، در ابتدای تست، تنها یک نماد در “Market Watch” تست استراتژی وجود دارد – نمادی که تست بر روی آن در حال اجرا است. تمام نمادهای لازم به طور خودکار زمانی که به آن مراجعه شد، به “Market Watch” تستر استراتژی (نه ترمینال!) متصل میشوند.
قبل از شروع تست یک اکسپرت ادوایزر چند ارزی، لازم است نمادهای مورد نیاز برای تست در «Market Watch» ترمینال را انتخاب کرده و دادههای مورد نیاز را بارگذاری کنید. در اولین فراخوانی یک نماد “خارجی “، تاریخچه آن به طور خودکار بین تستر و ترمینال معاملات کاربر همگامسازی خواهد شد. نماد “خارجی” نمادی غیر از آن چیزی است که تست بر روی آن در حال اجرا است.
ارجاع به دادههای نماد “دیگر” در موارد زیر رخ میدهد:
- هنگام استفاده از technical indicators function و IndicatorCreate در نماد/ قاب زمان؛
- درخواست داده به “Market Watch” برای نماد دیگر :
- SeriesInfoInteger
- Bars
- SymbolSelect
- SymbolIsSynchronized
- SymbolInfoDouble
- SymbolInfoInteger
- SymbolInfoString
- SymbolInfoTick
- SymbolInfoSessionQuote
- SymbolInfoSessionTrade
- MarketBookAdd
- MarketBookGet
- درخواست سری زمانی برای نماد / قاب زمانی با استفاده از توابع زیر:
- CopyBuffer
- CopyRates
- CopyTime
- CopyOpen
- CopyHigh
- CopyLow
- CopyClose
- CopyTickVolume
- CopyRealVolume
- CopySpread
در لحظه اولین فراخوانی نماد “دیگر”، فرایند تست متوقف میشود و تاریخچه برای نماد/قاب زمان، از ترمینال معاملاتی کاربر به تستر دانلود میشود. در عین حال، تولید دنباله تیک برای این نماد ساخته میشود.
یک دنباله تیک تکی برای هر نماد تولید میشود، با توجه به حالت تولید تیک انتخاب شده.
شما همچنین میتوانید با فراخوانی SymbolSelect در OnInit handler تاریخچه صریح نمادهای دلخواه را درخواست کنید – دانلود تاریخچه بلافاصله قبل از تست اکسپرت ادوایزر انجام خواهد شد.
بنابراین، نیاز به هیچ تلاش اضافی برای انجام تست چند ارزی در ترمینال معاملات کاربر MetaTrader 5 نیست. فقط نمودارهای نمادهای مناسب را در ترمینال کاربر باز کنید. تاریخچه به طور خودکار از سرور معاملاتی برای تمام نمادهای مورد نیاز ارسال خواهد شد، به شرط این که شامل این دادهها باشد.
شبیهسازی زمان در تستر استراتژی
تستر استراتژی – در طول تست، زمان محلی TimeLocal همیشه برابر زمان سرور TimeTradeServer است. زمان سرور همیشه برابر زمان متناظر با زمان GMT است – TimeGMT. به این ترتیب، تمام این توابع در حین تست یک زمان را نشان میدهند.
اختلاف بین زمان GMT، محلی و سرور در تستر استراتژی، در صورت ارتباط نداشتن با سرور صفر میشود. نتایج تست همیشه باید یکسان باشد، صرف نظر از اینکه اتصال وجود دارد یا خیر. اطلاعات در مورد زمان سرور به صورت محلی ذخیره نمیشود و از سرور گرفته میشود.
تابع OnTimer در تستر استراتژی
MQL5 فرصتی برای مدیریت رویدادهای زمانی را فراهم میکند. فراخوان کنترل کننده OnTimer صرف نظر از حالت تست انجام میشود.
بدین معنی است که اگر تست در حالت “Open prices only” برای دوره H4 اجرا شود و اکسپرت ادوایزر دارای یک تایمر که برای فراخوانی در هر ثانیه تنظیم شده است باشد، پس در هنگام باز شدن هر بار H4، کنترل کننده OnTick یک بار فراخوانده خواهد شد و در نهایت کنترل کننده OnTimer، ۱۴۴۰۰ مرتبه (۳۶۰۰ ثانیه * ۴ ساعت) فراخوانده خواهد شد.
این مقدار که توسط زمان تستر اکسپرت ادوایزر افزایش مییابد بستگی به منطق اکسپرت ادوایزر دارد. برای بررسی وابستگی زمان تست با فرکانس داده شده تایمر، یک اکسپرت ادوایزر ساده بدون هیچگونه عملیات معاملاتی نوشته شد.
اندازه گیری زمان تست در مقادیر مختلف پارامتر زمان (دوره زمانی رویداد) انجام شد. بر روی دادههای به دست آمده، ما یک زمان تست را به عنوان تابع دوره زمانی طرح ریزی میکنیم.
شکل (۷) زمان تست به عنوان تابع دوره زمانی
به طور واضح میتوان دید که، هرچه متغیر زمان در اجرای اولیه تابع EventSetTimer،کمتر باشد دوره زمانی در بین فراخوانهای کنترل کننده OnTimer کوچکتر است و زمان آزمون T، بزرگتر است.
تابع Sleep در تستر استراتژی
تابع Sleep اجازه میدهد که اکسپرت ادوایزر یا اسکریپت برای اجرای برخی از برنامههای mql5، زمانی که بر روی گراف کار میکند، تعلیق شود. این میتواند هنگامی که دادهها درخواست شدهاند اما آماده نیستند، مفید باشد. یک مثال دقیق از نحوه استفاده از تابع Sleep را در بخش Data access arrangement میتوانید پیدا کنید.
فرآیند تست توسط فراخوانی تابع Sleep به تاخیر نمیافتد. هنگامی که شما تابع Sleep را فرا میخوانید، تیکهای تولید شده در طی یک تاخیر مشخص، “played” میشوند، که ممکن است باعث اجرای دستورات در حال انتظار، حد ضرر، و غیره شود. پس از فراخواندن تابع Sleep، زمان شبیهسازی شده در تستر استراتژی با یک بازه مشخص شده در پارامتر تابع Sleep افزایش مییابد.
اگر در نتیجه اجرای تابع Sleep زمان فعلی تستر استراتژی طی دوره تست تمام شد، خطای ” Infinite Sleep loop detected while testing” را دریافت خواهید کرد. اگر این خطا را دریافت کردید، نتایج تست رد نمیشوند، تمام محاسبات در حجم کامل شان (تعداد معاملات، subsidence، و غیره) انجام میشود و نتایج این تستها به ترمینال کاربر منتقل میشود.
تابع Sleep در OnDeinit کار نمیکند، زیرا بعد از آن که فراخوانده میشود، زمان تست برای پیش افتادن از محدوده بازه تست تضمین خواهد شد.
شکل (۸) طرح استفاده از تابع Sleep در تستر استراتژی ترمینال MetaTrader 5
استفاده از تستر استراتژی برای مشکلات بهینهسازی در محاسبات ریاضی
تستر در ترمینال MetaTrader 5 نه تنها برای تست استراتژیهای معاملاتی میتواند بکار رود بلکه برای محاسبات ریاضی نیز مورد استفاده قرار میگیرد. برای استفاده از آن، باید حالت “Math calculations” را
انتخاب کنید:
در این مورد، تنها سه تابع فراخوانده خواهد شد: OnInit، OnTester ،OnDeinit. در حالت “Math calculations” تستر استراتژی هیچ تیکی تولید نمیکند و تاریخچه را نیز دانلود نمیکند.
همچنین اگر تاریخ شروع را بیشتر از تاریخ پایان تعیین کنید، تستر استراتژی در حالت “Math calculations” کار میکند.
هنگام استفاده از تستر برای حل مشکلات ریاضی، آپلود تاریخچه و تولید تیکها رخ نمیدهد.
یک مشکل ریاضی معمولی برای حل در تستر استراتژی MetaTrader 5 – جستجو برای extremum یک تابع با تعداد زیادی از متغیرهاست.
برای حل آن ما باید:
• محاسبه مقدار تابع باید در تابع OnTester قرار داده شود؛
• پارامترهای تابع باید به عنوان input-variables (متغیرهای ورودی) از اکسپرت ادوایزر تعریف شوند؛ کامپایل اکسپرت ادوایزر، پنجره “Strategy Tester” را باز کنید. در برگه “Input parameters” متغیرهای ورودی مورد نیاز را انتخاب کرده و مجموعهای از مقادیر پارامتر را با تعیین مقادیر start، stop و step برای هر یک از متغیرهای تابع تعریف کنید.
نوع بهینهسازی، ” Slow complete algorithm- الگوریتم کامل آهسته” (جستجوی کامل فضای پارامترها) یا ” Fast genetic based algorithm – الگوریتم سریع مبتنی بر ژنتیک” را انتخاب کنید. برای جستجوی ساده extremum تابع، بهتر است که بهینهسازی سریع را انتخاب کنید، اما اگر میخواهید محاسبه مقادیر برای تمام مجموعه متغیرها انجام شود، بهتر است از بهینهسازی آهسته استفاده کنید.
حالت “Math calculation” را انتخاب کنید و با استفاده از دکمه “Start”، روش بهینهسازی را اجرا کنید. توجه داشته باشید که آزماینده استراتژی هنگام بهینهسازی برای حداکثر مقادیر تابع جستجو میکند. برای پیدا کردن حداقلlocal، معکوس مقدار تابع محاسبه شده از تابع OnTester را بازگردانید:
لازم است بررسی کنیم که مقدار function_value برابر با صفر نیست، زیرا در غیر این صورت ما میتوانیم خطای بحرانی (critical error) تقسیم بر صفر دریافت کنیم.
راه دیگری وجود دارد که راحتتر است و نتایج بهینهسازی را تحریف نمیکند، و توسط خوانندگان این مقاله پیشنهاد شده است:
این گزینه نیازی به چک کردن function_value_ برای برابر بودن با صفر ندارد و سطح نتایج بهینهسازی در یک نمای سه بعدی همان شکل است، اما منعکس کننده اصل آن است.
به عنوان مثال، ما تابع sink را ارائه میدهیم:
کد اکسپرت ادوایزر برای پیدا کردن extremum این تابع در OnTester قرار میگیرد:
یک بهینهسازی انجام دهید و نتایج بهینهسازی (optimization results) را در قالب یک گراف دو بعدی ببینید.
شکل (۹) نتایج کامل بهینهسازی تابع در گراف دو بعدی
بهترین مقدار برای یک جفت پارامتر داده شده (x، y)، در بخشهایی است که پر رنگ است. همانطور که از دید فرم فرمول sink انتظار میرفت، مقادیر آن در دایرههای متحد المرکز با مرکز (۰،۰) تشکیل میشوند. در گراف سه بعدی میتوان دید که تابع sink، single global extremum را ندارد:
همگامسازی بارها در حالت Open prices only
تستر در ترمینال کاربر MetaTrader 5 اجازه میدهد تا اکسپرت ادوایزرهای را که به اصطلاح ” multi-currency -چند ارزی” نامیده میشوند را بررسی کنیم. یک اکسپرت ادوایزر چند ارزی – اکسپرت ادوایزری است که در دو یا چند نماد معامله میکند.
تست استراتژی هایی که بر روی چندین نماد معامله میکنند، چند مورد الزامات فنی اضافی را بر روی تستر اعمال میکنند :
- تولید تیکها برای این نمادها؛
- محاسبه مقادیر اندیکاتور برای این نمادها؛
- محاسبه الزامات مارجین برای این نمادها؛
- همگامسازی دنبالههای تیک تولید شده برای تمام نمادهای معاملاتی
تستر استراتژی یک دنباله تیک برای هر ابزار مطابق با حالت معاملاتی انتخاب شده تولید و پخش میکند. در یک زمان، بار جدیدی (new bar) برای هر نماد باز میشود، صرف نظر از اینکه بار در نماد دیگری باز میشود.
این بدان معنی است که وقتی یک اکسپرت ادوایزر چند ارزی را تست میکنید، یک وضعیت ممکن است رخ دهد (و اغلب اوقات اینطور است)، زمانی که برای یک ابزار در حال حاضر یک بار جدید باز شده است، و برای دیگری این چنین نیست. بنابراین، در تست، همه چیز درست همانند واقعیت اتفاق میافتد.
این شبیهسازی معتبر تاریخچه در تستر تا زمانی که از حالت تست “Every tick” و “۱ minute OHLC” استفاده میشود، مشکلی ایجاد نمیکند. برای این حالتها، تیکهای کافی برای یک کندل تولید میشود، تا بتواند منتظر باشد تا همگامسازی بارها از نمادهای مختلف صورت گیرد.
اما چگونه میتوانیم استراتژیهای چند ارزی را در حالت “Open prices only” بررسی کنیم، در صورتی که همگامسازی بارها در ابزارهای معاملاتی اجباری باشد؟ در این حالت، اکسپرت ادوایزر تنها در یک تیک فراخوانده میشود، که مربوط به زمان باز شدن بارها میشود.
ما آن را به عنوان مثال نشان خواهیم داد : اگر ما یک اکسپرت ادوایزر را بر روی EURUSD تست کنیم و یک کندل یک ساعته جدید در EURUSD باز شده است، پس ما میتوانیم این واقعیت را به راحتی تشخیص دهیم – در تست در حالت “Open prices only”، رویداد NewTick مربوط به لحظه باز شدن بار در دوره تست است اما هیچ تضمینی وجود ندارد که کندل جدید که در اکسپرت ادوایزر استفاده میشود روی نماد USDJPY باز شود.
در شرایط عادی، کافی است تا کار تابع OnTick را کامل کنید و برای خروج یک بار جدید در USDJPY در تیک بعدی بررسی کنید. اما هنگام تست در حالت “Open prices only”، هیچ تیک دیگری وجود نخواهد داشت و بنابراین ممکن است به نظر برسد که این حالت برای تست اکسپرت ادوایزرهای چند ارزی مناسب نیست.
اما این چنین نیست – فراموش نکنید که تستر MetaTrader 5 درست مثل واقعیت رفتار میکند. شما میتوانید منتظر بمانید تا بار جدید بر روی نمادهای دیگر با استفاده از تابع Sleep باز شود!
کد اکسپرت ادوایزر Synchronize_Bars_Use_Sleep.mq5 نمونهای از همگامسازی بارها در حالت “Open prices only” را نشان میدهد:
آخرین خط را در اکسپرت ادوایزر ملاحظه کنید، که زمان فعلی را هنگامی که واقعیت همگامسازی برقرار شد نشان میدهد:
برای نمایش زمان فعلی، ما از تابع TimeTradeServer به جای TimeCurrent استفاده کردیم. تابع TimeCurrent زمان آخرین تیک را باز میگرداند، که بعد از استفاده از Sleep تغییر نمیکند. اکسپرت ادوایزر را در حالت “Open prices only” پاک کنید (Rub) و پیامی در مورد همگامسازی بارها خواهید دید.
اگر لازم است که زمان فعلی سرور را بدست آورید، و نه زمان آخرین ورود به تیک را، به جای TimeCurrent از تابع TimeTradeServer استفاده کنید.
راه دیگری برای همگامسازی بارها وجود دارد – با استفاده از تایمر. یک نمونه از آن اکسپرت ادوایزر Synchronize_Bars_Use_OnTimer.mq5 است که به این مقاله پیوست میباشد.
تابع IndicatorRelease در تستر
پس از تکمیل یک تست تک، یک نمودار از ابزار به طور خودکار باز میشود که نشان دهنده معاملات کامل شده و اندیکاتورهای استفاده شده در اکسپرت ادوایزر است. این به بررسی بصری نقاط ورود و خروج کمک میکند و آنها را با مقادیر اندیکاتورها مقایسه میکند.
توجه: اندیکاتورهای نمایش داده شده در نمودار، که به طور خودکار پس از اتمام تست باز میشود، دوباره پس از اتمام تست محاسبه میشوند. حتی اگر این اندیکاتورها در اکسپرت ادوایزر تست شده استفاده شود.
اما در بعضی موارد، برنامه نویس ممکن است بخواهد اطلاعاتی را درباره اندیکاتورهایی که در الگوریتمهای معاملاتی درگیر هستند پنهان کند. به عنوان مثال، کد اکسپرت ادوایزر به عنوان یک فایل اجرایی بدون ارائه کد منبع اجاره داده شده یا فروخته میشود.
برای این منظور، استفاده از تابع IndicatorRelease مناسب است.
اگر ترمینال قالبی را با نام tester.tpl در دایرکتوری directory/profiles/templates برنامه کاربر قرار میدهد، پس آن به نمودار باز شده اعمال میشود. در نبود آن، قالب پیش فرض اعمال میشود. (default.tpl)
تابع IndicatorRelease در ابتدا برای آزاد کردن بخش محاسبه اندیکاتور در نظر گرفته شده است، اگر دیگر لازم نباشد.
این به شما این امکان را میدهد تا، منابع حافظه و CPU را ذخیره کنید، زیرا هر تیک برای محاسبه اندیکاتورها فراخوانده میشود. دومین هدف آن این است که پس از انجام تست تک، مانع از نمایش یک اندیکاتور در نمودار تست شویم.
برای جلوگیری از نشان دادن اندیکاتور در نمودار پس از تست، تابع IndicatorRelease را با دسته (handle) اندیکاتور در کنترل کننده OnDeinit فرا بخوانید. تابع OnDeinit همیشه پس از تکمیل و قبل از نمایش نمودار تست، فرا خوانده میشود.
به ترتیب برای جلوگیری از نمایش اندیکاتور در نمودار، پس از تکمیل یک تست تک، از تابع IndicatorRelease در (Handler) کنترل کننده OnDeinit استفاده کنید.
کنترل رویداد (Event Handling) در تستر
برای انجام تست ها بر روی دادههای تاریخی در تستر متاتریدر ۵ حضور کنترل کننده OnTick در اکسپرت ادوایزر اجباری نیست. کافی است که اکسپرت ادوایزر ti حاوی حداقل یکی از عملگرهای (function-handlers) زیر باشد:
- OnTick – کنترل کننده وقایع (Event handler) از یک ورودی تیک جدید؛
- OnTrade – کنترل کنده وقایع معاملاتی؛
- OnTimer – کنترل کننده وقایع از یک ورودی سیگنال از تایمر؛
- OnChartEvent – یک کنترل کننده برای وقایع کاربر
هنگام تست در اکسپرت ادوایزر، ما میتوانیم وقایع سفارشی را با استفاده از تابع OnChartEvent اداره کنیم، اما در اندیکاتورها، این تابع نمیتواند در تستر فرا خوانده شود. حتی اگر اندیکاتور دارای کنترل کنده وقایع OnChartEvent باشد و این اندیکاتور در اکسپرت ادوایزر تست شده مورد استفاده قرار گیرد، خود اندیکاتور هیچ رویداد سفارشی را دریافت نخواهد کرد.
در طول تست، یک اندیکاتور میتواند وقایع سفارشی را با استفاده از تابع EventChartCustom تولید کند، و اکسپرت ادوایزر میتواند این رویداد را در OnChartEvent پردازش کند.
بخش تست برنامه (Testing Agents)
تست در ترمینال کاربر MetaTrader 5 با استفاده از تسترها (test agents) انجام میشود. تسترهای لوکال به صورت خودکار ایجاد و فعال میشوند. تعداد پیش فرض تسترهای لوکال به تعداد هستهها در یک کامپیوتر مرتبط است.
هر تستر دارای کپی خاص خودش از متغیرهای سراسری (global variables) است که به ترمینال معاملاتی کاربر مرتبط نیست. خود ترمینال توزیع کننده (dispatcher) است، که وظایف را به تسترهای لوکال و راه دور (remote) تقسیم میکند. پس از انجام یک وظیفه بر روی اکسپرت ادوایزر، با پارامترهای داده شده، تستر نتایج را به ترمینال معاملاتی کاربر باز میگرداند. با یک تست، تنها یک تستر استفاده میشود.
تستر دادههای تاریخچه را که از ترمینال دریافت شده است، در پوشههای جداگانه، با نام ابزار ذخیره میکند، بنابراین تاریخچه EURUSD در پوشهای به نام EURUSD ذخیره میشود. علاوه بر این، تاریخچه ابزارها از منابع خودشان جدا شده هستند. ساختار ذخیرهسازی تاریخچه به روش زیر است:
برای مثال، تاریخچه EURUSD از سرور MetaQuotes-Demo را میتوان در پوشه tester_catalog \ Agent-127.0.0.1-3000 \ bases \ MetaQuotes-Demo \ EURUSD ذخیره کرد.
یک تستر لوکال پس از اتمام تست، در حالی که برای وظیفه بعدی ۵ دقیقه دیگر منتظر میماند، به حالت آماده به کار منتقل میشود، پس به منظور جلوگیری از اتلاف زمان برای فراخوانی بعدی اقدام کنید. تنها پس از پایان دوره انتظار، تستر لوکال خاموش و از حافظه CPU خالی میشود.
در صورت تکمیل زودهنگام تست، از طرف کاربر (دکمه “لغو – Cancel”) و نیز با بسته شدن ترمینال معاملاتی کاربر، تمام تسترهای محلی بلافاصله کار خود را متوقف میکنند و از حافظه تخلیه میشوند.
تبادل داده بین ترمینال معاملاتی کاربر و تستر برنامه
هنگامی که شما یک تست را اجرا میکنید، ترمینال معاملاتی کاربر تعدادی از بلوکهای پارامتر را برای فرستادن به تستر آماده میکند :
- پارامترهای ورودی برای تست (حالت شبیهسازی، بازه زمانی تست، ابزارها، معیار بهینهسازی، و غیره)
- فهرست نمادهای انتخاب شده در “Market Watch”
- مشخصات نماد تست (اندازه قرارداد، مارجین مجاز از بازار برای تنظیم StopLoss و Takeprofit، و غیره)
- اکسپرت ادوایزر تست شده و مقادیر پارامترهای ورودی آن
- اطلاعات در مورد فایلهای اضافی (کتابخانهها، اندیکاتورها، فایلهای داده – # property tester_ …)
اندیکاتور تستر | رشته | نام یک اندیکاتور سفارشی در قالب “indicator_name.ex5”. اندیکاتورهایی که نیاز به تست دارند، اگر پارامتر مربوطه شان از طریق یک رشته (String) ثابت تنظیم شده باشد، به طور خودکار از فرا خواندن تابع icutom تعریف میشوند. برای همه موارد دیگر (استفاده از تابع indicator create یا استفاده از یک رشته غیر ثابت در پارامتر که نشان دهنده نام اندیکاتور است) این ویژگی مورد نیاز است |
فایل تستر | رشته | نام فایل برای تستر با نشان دادن پسوند، داخل نقل قولها (ما بین علامت “”) (به عنوان یک رشته ثابت). فایل مشخص شده به تستر منتقل خواهد شد. فایلهای ورودی تست میشوند، اگر موارد ضروری وجود دارد، باید همیشه مشخص شود. |
کتابخانه تستر | رشته | نام کتابخانه با پسوند، داخل نقل قولها. یک کتابخانه میتواند پسوندdll یا ex5 داشته باشد. کتابخانههایی که نیاز به تست دارند، به طور خودکار تعریف میشوند. با این حال، اگر هر یک از کتابخانهها توسط یک اندیکاتور سفارشی (custom) مورد استفاده قرار گیرد، این ویژگی مورد نیاز است. |
برای هر بلوک از پارامترها یک اثر انگشت دیجیتالی در قالب MD5-hash ایجاد میشود که به تستر ارسال میشود. MD5-hash برای هر مجموعه منحصر به فرد است، حجم آن چندین برابر کمتر از مقدار اطلاعاتی است که بر اساس آن محاسبه شده است.
تستر بلوکهای یک هش (hash) را دریافت میکند و با آنهایی که قبلا وجود داشتند مقایسه میکند. اگر اثر انگشت بلوک پارامتر داده شده در تستر وجود نداشته باشد، یا هش دریافتی با آن هشی که موجود است تفاوت داشت، تستر پارامترهای این بلوک را درخواست میکند و این باعث کاهش ترافیک بین ترمینال معاملاتی و تستر میشود.
پس از تست، تستر تمام نتایج حاصل از اجرا را به ترمینال معاملاتی باز میگرداند، که در برگههای “نتایج آزمون – Test Results” و “نتایج بهینهسازی – Optimization Results” نشان داده میشوند: سود دریافت شده، تعداد معاملات، ضریب Sharpe، نتیجه تابع OnTester و غیره
در طول بهینهسازی، ترمینال معاملاتی، وظایف تست را به تسترها در پکیج کوچک هدایت میکند، هر پکیج شامل چندین وظیفه است (هر وظیفه به معنی تست تک با مجموعهای از پارامترهای ورودی است). این باعث کاهش زمان تبادل بین ترمینال معاملاتی و تستر میشود.
تسترها هرگز فایلهای EX5 که از ترمینال (اکسپرت ادوایزر، اندیکاتورها، کتابخانهها و …) بدست آمدهاند را به دلایل امنیتی در هارد دیسک ثبت نمیکنند، به طوری که یک کامپیوتر با یک تستر در حال اجرا نمیتواند از دادههای ارسالی استفاده کند. تمام فایلهای دیگر، از جمله DLL، در sandbox ثبت میشوند. در تسترهای راه دور (remote agents) نمیتوانید اکسپرتها را با استفاده از DLL تست کنید.
برای دسترسی سریع به نتایج تست زمانی که مورد نیازاند، ترمینال معاملاتی آنها را به یک کَش (cache) خاص از نتایج اضافه میکند. برای هر مجموعهای از پارامترها، ترمینال معاملاتی نتیجه کش را برای نتایج موجود از اجراهای قبلی جستجو میکند تا از اجرای مجدد جلوگیری شود. اگر نتیجه با چنین مجموعهای از پارامترها یافت نشد، تستر وظیفه انجام تست را ایجاد میکند.
تمام ترافیک بین ترمینال معاملاتی و تستر رمزگذاری شده است.
استفاده از پوشه به اشتراک گذاشته شده از تمام ترمینالهای کاربران
تمام تسترها از یکدیگر و از ترمینال معاملاتی کاربر جدا شده اند: هر تستر دارای پوشه خاص خودش است که در آن logها ثبت میشوند. علاوه بر این، تمام عملیات فایل در حین تست در پوشه agent_name / MQL5 / Files رخ میدهد.
با این حال، ما میتوانیم تعامل بین تستر لوکال و ترمینال معاملاتی کاربر را از طریق یک پوشه مشترک برای تمام ترمینالهای معاملاتی کاربر پیادهسازی کنیم، اگر در هنگام باز کردن فایل، flag FILE_COMMON را مشخص میکنید:
استفاده از DLL ها در تست استراتژی
برای سرعت بخشیدن به بهینهسازی، ما نه تنها میتوانیم از تسترهای محلی بلکه از راه دور (remote agents) نیز استفاده کنیم. اما محدودیتهایی برای تسترهای راه دور وجود دارد. اول اینکه، تسترهای راه دور در logهای خود نتایج اجرا تابع Print را که شامل پیامهای مربوط به باز و بسته شدن پوزیشن هاست، نمایش نمیدهند. حداقل اطلاعات در log برای جلوگیری از اجرای اکسپرت ادوایزرهای نادرست نوشته شده توسط کامپیوتر لوکال، به تستر remote نمایش داده میشود.
محدودیت دوم – ممنوعیت استفاده از DLL هنگام تست اکسپرت ادوایزر هاست. فراخواندن DLL به دلایل امنیتی به طور کامل بر روی تسترهای راه دور ممنوع است. در تستر محلی، فراخواندن DLL در اکسپرت ادوایزرهای تست شده تنها با اجازه “Allow import DLL” مجاز است.
شکل (۱۰) گزینه “Allow import DLL” در برنامههای mql5
نکته: هنگام استفاده از دریافتیهای اکسپرت ادوایزرها (اسکریپتها، اندیکاتورها) که نیاز به اجازه دادن به فراخواندن DLL دارند، باید از خطراتی که در هنگام تنظیم این گزینه در تنظیمات ترمینال وجود دارد، صرف نظر از نحوه استفاده از اکسپرت ادوایزر – برای تست و یا برای اجرای در یک نمودار- مطلع باشید.
نتیجه گیری
این مقاله با اصول اولیه سر و کار دارد و دانش آن به شما کمک میکند تا به سرعت در تست اکسپرت ادوایزرها در ترمینال معاملاتی MetaTrader 5 چیره دست شوید:
- سه حالت از تولید تیک؛
- محاسبه مقدار اندیکاتور در حین تست؛
- تست چند ارزی؛
- شبیهسازی زمان در حین تست؛
- کار توابع OnTimer ،OnSleep، و IndicatorRelease در تستر استراتژی ؛
- کار تسترها در هنگام فراخواندن DLL؛
- استفاده از پوشه مشترک برای تمام ترمینالهای معاملاتی کاربر؛
- همگامسازی barها در حالت “Open prices only”؛
- کنترل وقایع
وظیفه اصلی تستر استراتژی ترمینال کاربر، اطمینان از صحت داده مورد نیاز با حداقل تلاش برنامه نویس MQL5 است. توسعه دهندگان خیلی کار کردهاند تا شما مجبور نباشید کد خود را فقط برای تست استراتژی معاملاتیتان بر روی دادههای تاریخی بازنویسی کنید. کافی است که مبانی تست را بدانید و یک اکسپرت ادوایزر را به درستی بنویسید تا به یک اندازه هم در تستر و هم در حالت آنلاین نمودار به خوبی کار کند.