
بکتست اکسپرت یعنی اجرای ربات معاملهگر روی دادههای گذشته بازار، تا پیش از سپردن پول واقعی ببینید قواعدش در گذشته چطور رفتار کردهاند. ابزار این کار در متاتریدر ۵ «تستر استراتژی» (Strategy Tester) است. ابزار دقیقی است، ولی اگر درست تنظیم نشود، نتیجهاش هم گمراهکننده میشود.
این راهنما تنظیمات تستر را قدمبهقدم توضیح میدهد، عددهای مهم گزارش را معنی میکند و خطاهایی را میشمارد که یک ربات معمولی را روی کاغذ عالی نشان میدهند. جزئیات فنی از راهنمای رسمی متاتریدر ۵ و مستندات MQL5 آمده است و نشانیها در پایان مقاله هست. تستر متاتریدر ۴ محدودتر است و مثلاً فقط روی همان نمادی معامله میکند که تست میشود؛ فرق دو تستر در مقایسه متاتریدر ۴ و ۵ آمده است.
فهرست مطالب
بکتست چه چیزی را نشان میدهد و چه چیزی را نه
بکتست به یک سؤال جواب میدهد: «اگر این ربات با همین تنظیمات در این بازه از گذشته کار میکرد، چه میشد؟» جواب این سؤال مفید است، ولی محدود:
- نشان میدهد: قواعد ربات در شرایط گذشته چند معامله باز کردهاند، سود و زیانشان چه بوده و بدترین افت سرمایه کجا رخ داده است. خطاهای منطقی کد هم معمولاً همینجا پیدا میشوند.
- نشان نمیدهد: آینده را. بازار عوض میشود و رباتی که در گذشته سود داده، برای فردا تضمینی ندارد. لغزش قیمت هنگام خبرها، قطع اتصال و تفاوتهای حساب واقعی هم در بکتست کامل دیده نمیشوند.
پس بکتست صافی اول است: رباتی که در آن رد شود کنار میرود، و رباتی که قبول شود تازه به تست فوروارد و حساب دمو میرسد.
پیش از شروع: سه چیز را آماده کنید
- فایل اجرایی اکسپرت: اکسپرت باید کامپایل شده باشد و در پنجره Navigator متاتریدر، زیر Expert Advisors دیده شود.
- همان کارگزار و نوع حسابی که با آن معامله میکنید: تستر تاریخچه قیمت را از خود پلتفرم برمیدارد و فقط بخشهای ناموجود را از سرور معاملاتی کارگزاری که به آن وصل هستید دانلود میکند. تیکهای واقعی هم از سرور همان کارگزار میآیند. یعنی داده و اسپرد بکتست، داده همان کارگزار است. اگر حساب واقعیتان جای دیگری است، بکتست را هم با داده همانجا انجام دهید. برای انتخاب کارگزار، نکتههای بررسی بروکر فارکس را ببینید.
- یک سؤال مشخص: میخواهید چه چیزی را بسنجید؟ رفتار ربات روی کدام نماد، در چه بازهای، با چه سرمایه و اهرمی. بدون سؤال مشخص، آخر کار به عددی نگاه میکنید که معلوم نیست جواب کدام سؤال است.
قدمبهقدم: تنظیم Strategy Tester
۱. باز کردن تستر و انتخاب اکسپرت
سادهترین راه این است که در Navigator روی اکسپرت راستکلیک کنید و Test را بزنید؛ تستر با همان اکسپرت باز میشود. از منوی View و گزینه Strategy Tester هم میشود تستر را باز کرد و اکسپرت را در برگه Settings انتخاب کرد.
۲. نماد، تایمفریم و بازه زمانی
نماد و تایمفریمی را انتخاب کنید که ربات برایش ساخته شده است. فقط نمادهایی که در پنجره Market Watch انتخاب شدهاند برای تست و بهینهسازی در دسترساند. در بخش Date یکی از بازههای آماده یا یک بازه دلخواه را انتخاب کنید. تست از ساعت ۰۰:۰۰ روز شروع آغاز میشود و خود روز پایان در تست نیست؛ اگر تاریخ پایان بعد از امروز باشد، تست تا امروز اجرا میشود.
بازه را آنقدر بلند بگیرید که چند وضعیت مختلف بازار را دربرگیرد: دوره روندی، دوره کمنوسان و دورههای پرخبر. رباتی که فقط در یک دوره صعودی تست شده، فقط درباره همان دوره چیزی میگوید.
۳. حالت ساخت تیک: مهمترین تنظیم
تستر برای شبیهسازی حرکت قیمت چند حالت دارد (بخش Tick generation). این انتخاب بیش از هر تنظیم دیگری روی اعتبار نتیجه اثر میگذارد:
| حالت | چه میکند | کی مناسب است |
|---|---|---|
| Every tick based on real ticks | تیکهای واقعی ثبتشده در سرور کارگزار را اجرا میکند، بدون شبیهسازی. اسپرد هم داخل هر دقیقه همان تغییرات واقعی را دارد. | ارزیابی نهایی؛ نزدیکترین حالت به شرایط واقعی. اجرای اول بهخاطر دانلود حجم زیاد تیکها ممکن است طول بکشد. |
| Every tick | تیکها را از روی کندلهای یکدقیقهای میسازد. | وقتی تیک واقعی کافی در دسترس نیست. دقیقترین حالت شبیهسازی، ولی کند. |
| 1 minute OHLC | برای هر کندل یکدقیقهای فقط چهار قیمت باز، بیشینه، کمینه و بسته را میسازد. | آزمون سریعتر، برای رباتی که داخل هر دقیقه تصمیم دقیقی نمیگیرد. |
| Open prices only | تابع OnTick اکسپرت فقط در شروع هر کندل و با قیمت باز شدن آن اجرا میشود. | فقط رباتی که واقعاً در لحظه باز شدن کندل تصمیم میگیرد. حد ضرر و سفارش معلق ممکن است با قیمتی متفاوت از قیمت تعیینشده فعال شوند. |
| Math calculations | تاریخچهای دانلود و تیکی ساخته نمیشود؛ فقط توابع OnInit، OnTester و OnDeinit اجرا میشوند. | محاسبات ریاضی و انتخاب پارامتر، نه ارزیابی معامله. |
اگر در حالت تیک واقعی برای دقیقهای داده تیک نباشد، تستر تیکهای همان دقیقه را مثل حالت Every tick میسازد. پس کیفیت تاریخچه کارگزار مستقیماً روی دقت این حالت هم اثر دارد.
مستندات MQL5 هم همین را توصیه میکند: اگر نتیجه اکسپرت در حالتهای تقریبی بیش از حد خوب به نظر میرسد، آن را در حالت Every tick هم تست کنید.
۴. تأخیر اجرا: ربات را در شرایط واقعیتر بسنجید
بخش Execution سه حالت دارد:
- No Delay: سفارشها دقیقاً با قیمت درخواستی و بدون ریکوت اجرا میشوند. این یعنی شرایط ایدئال، که در بازار واقعی وجود ندارد.
- Random Delay: تأخیر تصادفیای که به گفته راهنمای متاتریدر به شرایط واقعی نزدیک است: با احتمال ۹۰٪ بین ۰ تا ۸ ثانیه و با احتمال ۱۰٪ بین ۹ تا ۱۸ ثانیه.
- Fixed Delay: یک تأخیر ثابت. میتوانید پینگ واقعی خود تا سرور معاملاتی را، که پلتفرم اندازه میگیرد، بهعنوان تأخیر بگذارید.
رباتی که فقط با No Delay سود میدهد و با تأخیر واقعی زیانده میشود، به سرعت اجرا وابسته است و روی حساب واقعی هم احتمالاً همین را تجربه خواهد کرد.
۵. سپرده، اهرم و گزینه سود به پیپ
سپرده اولیه و اهرم را مثل حساب واقعیتان بگذارید؛ حجم معامله و مارجین لازم به همین دو بستگی دارند. اگر معنی دقیق اهرم، مارجین و پیپ را میخواهید، مفاهیم پایه فارکس با مثال را بخوانید.
گزینه محاسبه سود به پیپ (Profit calculation in pips) تست را سریعتر میکند، ولی طبق راهنمای متاتریدر در این حالت سواپ و کمیسیون حساب نمیشوند. برای آزمونهای سریع اشکالی ندارد؛ برای قضاوت نهایی خاموشش کنید، وگرنه سودی میبینید که بخشی از آن روی حساب واقعی صرف سواپ و کمیسیون میشود.
اسپرد هم در تستر شبیهسازی نمیشود: از داده تاریخی برداشته میشود و همیشه شناور فرض میشود. پس اسپرد بکتست، اسپرد تاریخچه همان کارگزار است.
۶. تست فوروارد: بخشی از داده را از ربات پنهان کنید
در فیلد Forward میتوانید یکدوم، یکسوم یا یکچهارم پایانی بازه، یا تاریخی دلخواه را برای تست فوروارد کنار بگذارید. بخش اول بازه برای بکتست و تنظیم پارامترها به کار میرود. بخش دوم، که پارامترها روی آن انتخاب نشدهاند، میسنجد آیا همان پارامترها روی داده تازه هم کار میکنند. نتیجه این بخش در برگه جداگانه Forward نمایش داده میشود.
اگر ربات در بخش اول درخشان و در بخش فوروارد ضعیف است، پارامترهایش با گذشته جفت شدهاند، نه با بازار. این مهمترین هشدار کل فرایند است.
۷. بهینهسازی، فقط همراه تست فوروارد
بهینهسازی یعنی اجرای ربات با ترکیبهای مختلف ورودیها برای پیدا کردن بهترین ترکیب. متاتریدر ۵ سه نوع بهینهسازی دارد:
- Slow complete algorithm: همه ترکیبها را امتحان میکند. دقیقترین روش است، ولی ممکن است بسیار طول بکشد.
- Fast genetic based algorithm: ترکیبهای بهتر را نسلبهنسل با الگوریتم ژنتیک جستوجو میکند؛ بسیار سریعتر و تقریباً به همان خوبی.
- All symbols selected in Market Watch: همان ورودیها را روی همه نمادهای انتخابشده در Market Watch اجرا میکند. به این درد میخورد که ببینید منطق ربات فقط روی یک نماد کار میکند یا نه.
معیار انتخاب بهترین ترکیب را هم خودتان تعیین میکنید: بیشترین موجودی، بیشترین Profit Factor، بیشترین Expected Payoff، کمترین Drawdown، بیشترین Recovery Factor، بیشترین Sharpe Ratio، معیار سفارشیای که اکسپرت در تابع OnTester برمیگرداند، یا معیار ترکیبی (Complex Criterion) که چند شاخص را با هم میسنجد. معیار «بیشترین موجودی» افت سرمایه را نمیبیند و ممکن است پرریسکترین ترکیب را بالا بیاورد.
یک قاعده ساده: هرچه پارامترهای بیشتری را بهینه کنید، احتمال اینکه ربات فقط با گذشته جفت شود بیشتر است. ترکیبی که در صدر جدول است ولی مقادیر نزدیکش نتیجه بدی دارند، احتمالاً شانسی است، نه پایدار.
خواندن گزارش تستر: کدام عددها مهماند
بعد از تست، برگه Backtest گزارش کامل را نشان میدهد. سود خالص فقط یکی از دهها عدد این گزارش است و بهتنهایی تقریباً هیچ نمیگوید. مهمترینها اینها هستند:
| شاخص | معنی | به چه نگاه کنید |
|---|---|---|
| History Quality | درصد دادههای یکدقیقهای درست در برابر داده خراب یا ناقص | پیش از هر عدد دیگری. بازههای کمکیفیت (قرمز) نتیجه را بیاعتبار میکنند. |
| Total Net Profit | نتیجه مالی همه معاملهها | فقط کنار افت سرمایه معنی دارد. |
| Profit Factor | نسبت سود ناخالص به زیان ناخالص؛ ۱ یعنی برابر | عدد نزدیک ۱ یعنی حاشیه سودی نازک که هزینههای واقعی میتوانند آن را از بین ببرند. |
| Expected Payoff | میانگین سود هر معامله | اگر از هزینه واقعی هر معامله (اسپرد و کمیسیون) کمتر باشد، روی حساب واقعی چیزی باقی نمیماند. |
| Recovery Factor | نسبت سود به بیشترین افت سرمایه | نشان میدهد برای هر واحد سود چقدر ریسک شده است. |
| Sharpe Ratio | بازده نسبت به نوسان بازده؛ در تستر نرخ بدون ریسک صفر فرض میشود | طبق راهنمای متاتریدر: زیر صفر یعنی زیانده، بین ۰ و ۱ یعنی ریسک ارزشش را ندارد، از ۱ به بالا خوب و از ۳ به بالا بسیار خوب. |
| Balance Drawdown و Equity Drawdown | بیشترین افت از اوج تا کف، به پول و درصد | افت اکوئیتی را حتماً ببینید؛ زیان معاملههای باز را هم حساب میکند. |
| Total Trades | تعداد معاملههای بستهشده | با تعداد کم، چند معامله شانسی کل نتیجه را میسازند. |
| LR Correlation | نزدیکی منحنی موجودی به یک خط راست | نزدیک ۱ یعنی رشد هموار؛ نزدیک صفر یعنی رفتار تصادفی. |
| Z-Score | همبستگی برد و باختهای پشت سر هم | بالای ۳ یعنی بعد از برد، احتمالاً باخت میآید؛ زیر منفی ۳ یعنی برد پشت برد. |
یک تفاوت مهم: افت موجودی (Balance Drawdown) فقط معاملههای بستهشده را میبیند، ولی افت اکوئیتی (Equity Drawdown) زیان شناور معاملههای باز را هم حساب میکند. رباتی که معاملههای ضررده را باز نگه میدارد تا برگردند، میتواند منحنی موجودی صاف و افت اکوئیتی ترسناکی داشته باشد. ریسک واقعی همان دومی است.
خطاهای رایجی که بکتست را گمراهکننده میکنند
- حالت تیک نامناسب: تست رباتی که داخل کندل تصمیم میگیرد، مثلاً با حد ضرر نزدیک، در حالت Open prices only یا 1 minute OHLC. نتیجه ممکن است بسیار بهتر از واقعیت به نظر برسد.
- نادیده گرفتن کیفیت تاریخچه: بکتست روی دادهای با شکاف و کندل خراب، بیشتر خود آن شکافها را میسنجد تا ربات را.
- فقط No Delay: ربات در شرایطی سنجیده میشود که در بازار وجود ندارد.
- سود به پیپ در قضاوت نهایی: سواپ و کمیسیون حذف میشوند و سود بزرگتر از واقع دیده میشود.
- داده یک کارگزار، حساب نزد کارگزاری دیگر: اسپرد و تاریخچه دو کارگزار یکی نیست.
- بازه کوتاه یا معاملههای کم: یک دوره بازار یا چند ده معامله برای قضاوت درباره رفتار ربات در شرایط مختلف کافی نیست.
- بهینهسازی بدون فوروارد: انتخاب بهترین ترکیب روی همان دادهای که ربات با آن تنظیم شده؛ همان بیشبرازش.
- اصلاح و تست دوباره روی همان بازه: اگر بعد از دیدن نتیجه کد یا پارامتر را عوض کنید و دوباره روی همان بازه تست بگیرید، آن بازه دیگر «دیدهنشده» نیست. برای قضاوت تازه، بازه تازه کنار بگذارید.
- نگاه فقط به سود خالص: بدون افت سرمایه، Profit Factor و تعداد معامله، عدد سود هیچ تصمیمی نمیسازد.
بعد از بکتست چه کنیم؟
بکتست قبولشده تازه شروع کار است. قدم بعدی اجرای ربات روی حساب دمو در شرایط زنده بازار است، تا لغزش قیمت، باز شدن اسپرد هنگام خبرها و رفتار ربات هنگام قطع اتصال دیده شود. بعد از آن نوبت اجرای واقعی با کمترین حجم و پایش مداوم است. اگر ربات باید شبانهروز روشن بماند، برای اجرای واقعی یک سرور مجازی ترید لازم دارید. این مراحل را در راهنمای ساخت ربات معاملهگر متاتریدر کامل توضیح دادهایم.
اگر ربات را خودتان نمینویسید، خدمت ساخت ربات معاملهگر تیم طراحان آیا را ببینید؛ در روند کار آن، ربات پیش از اجرای واقعی روی دادههای تاریخی بکتست و بهینهسازی میشود.
یادآوری: این مطلب آموزشی است و توصیه سرمایهگذاری نیست. معامله در بازارهای اهرمی ممکن است به از دست رفتن تمام سرمایه منجر شود و هیچ بکتستی سود آینده را تضمین نمیکند.
پرسشهای رایج
چرا بکتست با تیک واقعی اینقدر طول میکشد؟
بار اول، تستر تیکهای واقعی را از سرور کارگزار دانلود میکند و حجم این داده زیاد است. تیکها ذخیره میشوند، پس تستهای بعدی روی همان بازه سریعترند.
چرا نتیجه حساب واقعی با بکتست فرق دارد؟
چند دلیل رایج دارد: اسپرد و لغزش قیمت هنگام خبرها، تأخیر اجرا، تفاوت داده کارگزارها، و تنظیمی مثل سود به پیپ که سواپ و کمیسیون را حذف کرده بود. اگر فاصله زیاد است، تست را با تیک واقعی، تأخیر تصادفی و داده همان کارگزار تکرار کنید تا معلوم شود فاصله از کجاست.
بکتست خوب یعنی ربات سودده است؟
نه. یعنی ربات در گذشته و با این تنظیمات رد نشده است. قضاوت درباره سودآوری، بعد از تست فوروارد، دوره دمو و اجرای واقعی با حجم کم معنی پیدا میکند.
در بهینهسازی کدام معیار را انتخاب کنم؟
معیاری که ریسک را هم ببیند، مثل Recovery Factor، Sharpe Ratio یا معیار ترکیبی، از «بیشترین موجودی» بهتر است. اگر اکسپرت را خودتان مینویسید، میتوانید معیار دلخواهتان را در تابع OnTester برگردانید و با Custom max بهینه کنید.
منابع
- راهنمای متاتریدر ۵: تست استراتژی (تنظیمات، حالتهای تیک، تأخیر اجرا و تست فوروارد)
- راهنمای متاتریدر ۵: الگوریتم ساخت تیک و تیکهای واقعی
- راهنمای متاتریدر ۵: گزارش تست و معنی شاخصها
- راهنمای متاتریدر ۵: انواع بهینهسازی و معیارها
- مستندات MQL5: تست استراتژیهای معاملاتی
این راهنما در ۱ آبان ۱۴۰۵ با راهنمای رسمی متاتریدر ۵ و مستندات MQL5 تطبیق داده شد. نام و جای گزینهها ممکن است در نسخههای تازه متاتریدر کمی عوض شود.