
چگونه اکسپرت بنویسیم؟
نوشتن یک اکسپرت (Expert Advisor) یعنی تبدیل دقیق یک استراتژی معاملاتی به کدی خودکار که در پلتفرم متاتریدر، بدون دخالت احساسی انسان، اجرا میشود. برای این کار باید ابتدا منطق استراتژی خود را به زبان شرطی و قابلکدنویسی تبدیل کرده، سپس با استفاده از زبان MQL4 یا MQL5 ساختار اکسپرت را برنامهنویسی کنید. این فرآیند شامل تعریف سیگنال ورود و خروج، مدیریت ریسک، اضافهکردن اندیکاتورها، تست در Strategy Tester و بهینهسازی دقیق عملکرد است. اکسپرت حرفهای نهتنها از نظر فنی درست نوشته شده، بلکه در شرایط واقعی بازار نیز پایداری و کارایی لازم را دارد و میتواند بهعنوان ابزاری استراتژیک برای اجرای دقیق و خودکار تحلیلهای معاملاتی به کار رود.
اکسپرت فارکس چیست و چه نقشی در معاملات خودکار دارد؟
اکسپرت یا «Expert Advisor» برنامهای است که روی پلتفرم متاتریدر نصب میشود و میتواند براساس منطق از پیش تعیینشده، معاملات را بهصورت خودکار اجرا کند. اکسپرتها در زبان برنامهنویسی اختصاصی متاتریدر یعنی MQL4 یا MQL5 نوشته میشوند و امکان انجام مجموعهای از عملیات را بدون دخالت مستقیم انسان فراهم میکنند؛ از جمله باز کردن و بستن معاملات، مدیریت حجم و حتی اعمال فیلترهای پیچیده تحلیل تکنیکال.
نقش اصلی اکسپرت در بازار فارکس، حذف تصمیمگیریهای احساسی و اجرای دقیق و مداوم استراتژی معاملاتی است. معاملهگر میتواند منطق استراتژی خود را تبدیل به کد کرده و اطمینان حاصل کند که هر بار، بر اساس همان قواعد معامله انجام میشود؛ بدون آنکه خستگی، ترس یا طمع در تصمیمگیریها دخالت داشته باشد.
اکسپرتها نهتنها در معاملات خودکار بلکه در تحلیل بازار، تولید سیگنال، مدیریت ریسک و مانیتورینگ نمادها نیز کاربرد دارند. آنها میتوانند یک بازار را شبانهروز زیر نظر داشته باشند و در کسری از ثانیه واکنش نشان دهند، قابلیتی که برای تریدرهای دستی ممکن نیست.
قبل از نوشتن اکسپرت چه چیزهایی باید بدانیم؟
نوشتن یک اکسپرت صرفاً به معنای کدنویسی نیست؛ بلکه نیازمند آمادگی در سه زمینه است: تحلیل، منطق، و ابزار. پیش از شروع به نوشتن کد، باید پاسخ چند سؤال کلیدی روشن شده باشد: دقیقاً چه استراتژیای را میخواهید پیادهسازی کنید؟ شرایط ورود و خروج چیست؟ مدیریت سرمایه به چه صورت انجام میشود؟ رفتار اکسپرت در شرایط خاص مثل اخبار یا نوسانات شدید چگونه باید باشد؟
از سوی دیگر، آشنایی با پلتفرم متاتریدر و محیط برنامهنویسی MQL الزامی است. حتی اگر خودتان قصد نوشتن کد را نداشته باشید و بخواهید آن را به برنامهنویس بسپارید، بدون درک ساختار اکسپرتها نمیتوانید ایدهتان را دقیق منتقل کنید.
همچنین باید به مسئله تستپذیری استراتژی توجه داشت. اگر استراتژی شما پر از ابهام یا وابسته به قضاوت چشمی باشد، تبدیل آن به کد قابلاعتماد بسیار دشوار خواهد بود. بنابراین، استراتژیهایی که قانونمند، قابل اندازهگیری و قابل تکرار باشند، بهترین انتخاب برای تبدیل به اکسپرت هستند.
در کنار اینها، مفاهیم پایهای مثل انواع سفارشها (Market, Limit, Stop)، ساختار کندلها، تایمفریمها و ساختارهای شرطی (مثل «اگر … آنگاه …») نیز باید برای شما شفاف باشد. بدون این مقدمات، وارد شدن به دنیای اکسپرتنویسی صرفاً وقتسوزی خواهد بود.
زبان برنامهنویسی MQL4 و MQL5؛ انتخاب مناسب برای اکسپرتنویسی

زبانهای MQL4 و MQL5 دو زبان اختصاصی پلتفرم متاتریدر هستند که برای توسعه اندیکاتور، اسکریپت و اکسپرت استفاده میشوند. اگر قصد دارید برای متاتریدر ۴ اکسپرت بنویسید، باید از MQL4 استفاده کنید و اگر پلتفرم شما متاتریدر ۵ است، باید سراغ MQL5 بروید. هر دو زبان بر پایه ساختار C طراحی شدهاند و برای افرادی که با زبانهای برنامهنویسی مانند C++ یا JavaScript آشنا هستند، یادگیری آنها سادهتر خواهد بود.
MQL4 زبان قدیمیتر است و جامعهی کاربری بزرگتری دارد، اما نسبت به MQL5 امکانات محدودتری دارد. در مقابل، MQL5 ساختار پیشرفتهتری دارد، امکان مدیریت چند نماد بهصورت همزمان را فراهم کرده و قابلیتهای پیشرفتهای برای بهینهسازی و تحلیل دارد.
اگر تازهکار هستید و هدف شما نوشتن اکسپرتهای ساده یا تکنمادی است، شروع با MQL4 میتواند انتخاب مناسبی باشد، چون منابع آموزشی بیشتری دارد و پیچیدگی کمتری دارد. اما اگر میخواهید وارد توسعه سیستمهای پیچیدهتر، مبتنی بر چند دارایی یا با بهینهسازی پیشرفته شوید، MQL5 گزینه بهتری است.
نکته مهم اینجاست که ساختار و منطق نوشتن در هر دو زبان تا حد زیادی مشابه است. پس با یادگیری یکی، درک پایهای از دیگری نیز به دست خواهید آورد و بعداً بهراحتی میتوانید بین آنها جابجا شوید.
تبدیل استراتژی معاملاتی به منطق برنامهنویسی؛ اولین گام واقعی اکسپرتنویسی
اگر بخواهیم یک اکسپرت بسازیم، باید بدانیم که کد فقط ترجمهای از منطق استراتژی معاملاتی ماست. اکسپرت نمیفهمد که «اینجا احتمال رشد بیشتر است» یا «این کندل قشنگ است». او فقط میفهمد که «اگر A و B همزمان رخ داد، آنگاه دستور خرید بده». بنابراین، اولین گام جدی در نوشتن اکسپرت، تبدیل استراتژی ذهنی به یک منطق شرطی دقیق است.
برای شروع این فرآیند، باید استراتژی معاملاتی را با دقت نوشت. مثلاً:
- چه اندیکاتورها یا فاکتورهایی باید بررسی شوند؟
- شرایط ورود دقیقاً چیست؟ مثلاً تقاطع دو میانگین، یا عبور RSI از ۳۰
- حد ضرر، حد سود و مدیریت حجم بر چه اساسی تنظیم میشوند؟
- چه زمانی معامله بسته میشود؟ با رسیدن به هدف؟ برخورد به استاپ؟ یا شرایط خاص جدید؟
بهترین روش برای آمادهسازی این منطق، طراحی یک فلوچارت یا جدول تصمیمگیری است. زمانی که بتوانید استراتژی را بدون ابهام روی کاغذ ترسیم کنید، وارد مرحلهای میشوید که پیادهسازی آن در کد، یک کار فنی و مشخص خواهد بود.
فراموش نکنید که هر چه استراتژی دقیقتر و قابلاندازهگیریتر باشد، اکسپرت قدرتمندتری خواهید داشت. منطقهایی مانند «احساس میکنم روند قویه» یا «احتمال میدم اصلاح تموم شده باشه» به درد کدنویسی نمیخورند. اکسپرت با دادههای عددی و شرطی کار میکند، نه با احساس و تفسیر شخصی.
ساختار پایه یک اکسپرت در متاتریدر چگونه نوشته میشود؟
وقتی آماده شدید تا وارد فضای کدنویسی شوید، اولین چیزی که باید بشناسید، ساختار استاندارد یک اکسپرت در MQL است. یک اکسپرت از چند بخش کلیدی تشکیل شده که باید در هر فایل وجود داشته باشند. مهمترین آنها عبارتاند از:
- OnInit() این تابع هنگام شروع اجرای اکسپرت (مثلاً لحظهای که آن را روی چارت اجرا میکنید) فراخوانی میشود. معمولاً برای تعریف اولیه متغیرها، گرفتن تنظیمات یا بارگذاری اندیکاتورها استفاده میشود.
- OnDeinit() وقتی اکسپرت از روی چارت حذف میشود یا خاموش میشود، این تابع اجرا میشود. اگر بخواهید منابع خاصی را آزاد کنید یا اطلاعاتی ذخیره کنید، اینجا انجام میشود.
- OnTick() مهمترین بخش اکسپرت همین تابع است. هر بار که قیمت جدیدی از بازار دریافت میشود یعنی هر tick، این تابع اجرا میشود و کدهای اصلی بررسی شرایط بازار و تصمیمگیری در آن نوشته میشود.
برای مثال، ساختار پایه یک اکسپرت بسیار ساده در MQL4 ممکن است به شکل زیر باشد
image
در این ساختار ساده، بدنه کد اصلی داخل OnTick() نوشته میشود. در ادامه، شرطها و منطق تصمیمگیری که در مرحله قبلی طراحی کردهاید، در همین تابع قرار میگیرد.
نکته مهم در طراحی این ساختار، رعایت نظم و ماژولار کردن کدهاست. یعنی بهتر است هر بخش از استراتژی (ورود، خروج، مدیریت ریسک، لاگنویسی و غیره) در قالب تابع جداگانه نوشته شود تا کدها خواناتر و قابلتوسعهتر باشند.
چگونه سیگنال ورود و خروج را در اکسپرت تعریف کنیم؟

تعریف سیگنال ورود و خروج، قلب تپنده یک اکسپرت است. در این مرحله باید منطق تصمیمگیری معاملاتی را به کدی تبدیل کنیم که هر بار که بازار داده جدید میدهد، آن را بررسی کند و اگر شرایط برقرار بود، اقدام کند.
فرض کنید استراتژی شما این باشد: «اگر میانگین متحرک کوتاهمدت، میانگین بلندمدت را به سمت بالا قطع کرد، وارد خرید شو. اگر برعکس شد، معامله را ببند.
در MQL4 این منطق به صورت ساده ممکن است اینطور کدنویسی شود:
image
در این مثال، از توابع داخلی متاتریدر برای محاسبه میانگینها استفاده شده و تقاطع آنها بررسی شده است. مشابه همین، برای خروج از معامله نیز میتوان از شرایطی مانند رسیدن به حد سود یا حد ضرر، یا تقاطع عکس میانگینها استفاده کرد.
نکته کلیدی اینجاست که تعریف سیگنال باید ساده، دقیق و بدون ابهام باشد. اکسپرت نمیتواند تردید داشته باشد یا چند شرط مبهم را تفسیر کند. پس اگر مثلاً میخواهید از ترکیب RSI و MACD استفاده کنید، دقیق بنویسید که چه عددی از RSI و چه وضعیت هیستوگرام MACD مد نظر شما است.
در کنار سیگنالها، دستورهای معاملاتی مانند OrderSend، OrderClose، OrderModify در MQL4 یا trade.Buy()، trade.Sell در MQL5 برای اجرای دستورات خرید و فروش استفاده میشوند. در این مرحله باید دقت زیادی به پارامترها، حجم معامله، استاپ و تیکپرافیت، و مدیریت خطا داشته باشید.
اضافه کردن اندیکاتورها و فیلترهای تکنیکال به اکسپرت
یکی از ویژگیهای قدرتمند اکسپرتها، توانایی استفاده از اندیکاتورهای تکنیکال در تصمیمگیری معاملاتی است. اکسپرت میتواند سیگنالهای ورود و خروج را بر اساس تحلیل شاخصهایی مانند Moving Average، RSI، MACD، Bollinger Bands،ATR و بسیاری دیگر بررسی و اجرا کند؛دقیقتر از آنچه یک انسان بتواند در لحظه انجام دهد.
برای مثال، فرض کنید میخواهید اکسپرت تنها زمانی وارد معامله شود که قیمت بالاتر از میانگین متحرک ۲۰ روزه باشد و همزمان RSI کمتر از ۳۰ قرار گرفته باشد. در زبان MQL4 این دو شرط به این صورت فراخوانی میشوند:
image
در همین مثال، اگر بخواهید از MACD نیز بهعنوان تأییدیه استفاده کنید، کافی است مقادیر مربوط به خط سیگنال و هیستوگرام را فراخوانی کرده و در شرطها بگنجانید.
اضافه کردن فیلترها نیز فرآیندی مشابه دارد. فیلترها ممکن است به سادگی تایمفریم (مثلاً فقط روی تایمفریم H1 اجرا شود)، یا به پیچیدگی بررسی حجم، ساعات خاص روز یا اجتناب از ترید در زمان اخبار باشند.
نکته مهم اینجاست: در طراحی اکسپرت، هر اندیکاتور باید هدف مشخصی داشته باشد. نباید صرفاً برای "زیاد کردن فیلتر" اندیکاتور اضافه کرد، بلکه باید بدانید که چه تصمیمی را به کمک آن سادهتر یا دقیقتر میکنید. این نگاه، اکسپرت شما را از یک سیستم ساده به ابزاری هدفمند تبدیل میکند.
چگونه اکسپرت را تست و بهینه کنیم؟ آموزش Strategy Tester در متاتریدر
بعد از نوشتن اکسپرت، مرحلهای حیاتی فرا میرسد: تست و بهینهسازی. بدون تست، هیچ اکسپرتی قابل اعتماد نیست. حتی اگر کد بدون خطا اجرا شود. ابزار اصلی برای این کار در متاتریدر، Strategy Tester است.
در متاتریدر ۴، از منوی View میتوان Strategy Tester را باز کرد. در آنجا نماد مورد نظر، تایمفریم، بازه زمانی و مدل تست (Every tick یا Control points) را انتخاب میکنید. سپس با فشردن Start، فرآیند تست آغاز میشود. متاتریدر بر اساس دادههای گذشته، رفتار اکسپرت را شبیهسازی کرده و نتیجه آن را در قالب گزارش به شما نشان میدهد.
گزارش شامل مواردی مثل تعداد معاملات، درصد سوددهی، نسبت سود به ضرر، ماکزیمم دراودان (Drawdown) و سود خالص است. تحلیل این دادهها به شما کمک میکند متوجه شوید که اکسپرت در چه شرایطی خوب عمل کرده و کجا ضعف دارد.
اما بخش مهمتر، بهینهسازی (Optimization) است. در این حالت، شما چند متغیر مثل طول میانگینها، حد ضرر یا حجم را به عنوان پارامتر قابل تغییر مشخص میکنید و متاتریدر، با ترکیبهای مختلف این مقادیر، صدها یا هزاران بار تست انجام میدهد تا بهترین تنظیمات را پیدا کند.
نکات مهم در بهینهسازی:
- همیشه با دادههای قدیمی بهینهسازی نکنید؛ بهتر است بخشی از دادهها را برای تست جداگانه نگه دارید (Forward Testing) .
- دنبال بهترین عملکرد روی کل بازار نباشید؛ دنبال عملکرد پایدار در بازههای متنوع باشید.
- تنظیمات ایدهآل روی گذشته، لزوماً در آینده هم خوب کار نمیکنند. پس از "Overfitting" پرهیز کنید.
خطاهای رایج در اکسپرتنویسی و راههای جلوگیری از آنها

اکسپرتنویسی مثل هر نوع کدنویسی دیگری، پر از جزئیات و دامهای پنهان است. حتی اگر منطق استراتژی درست باشد، ممکن است پیادهسازی آن در کد منجر به خطاهای رفتاری یا عملکردی شود. شناخت این اشتباهات رایج، مسیر توسعه را کوتاهتر و پایدارتری میکند.
نداشتن بررسی وضعیت پوزیشنها:
بسیاری از تریدرها فراموش میکنند قبل از ارسال دستور خرید یا فروش، بررسی کنند که آیا معاملهای باز است یا نه. این موضوع میتواند باعث باز شدن چندین پوزیشن همزمان شود.
برای بررسی تعداد پوزیشنهای باز با OrdersTotal() در MQL4 یا PositionsTotal() در MQL5 پیش از ارسال دستور جدید.
نداشتن مدیریت خطا:
برخی از کدها، اگر دستور معاملاتی با خطا مواجه شود (مثلاً به دلیل اسپرد بالا یا مشکل اتصال)، هیچ واکنشی نشان نمیدهند. نتیجه؟ اکسپرت تصور میکند معامله انجام شده، ولی در واقع انجام نشده.
نادیده گرفتن تایمفریم و دادههای کندل:
استفاده اشتباه از Close[0] یا iMA(..., 0) میتواند منجر به استفاده از قیمتی شود که هنوز بسته نشده و ممکن است در طول کندل تغییر کند.
برای بررسی قطعی، از Close[1] استفاده کنید تا اطلاعات کندل بستهشده قبلی را بخوانید.
استفاده از پارامترهای ثابت بدون قابلیت تنظیم:
وقتی همه مقادیر به صورت ثابت در کد نوشته شده باشند، امکان بهینهسازی یا تنظیم آن برای نمادها و شرایط مختلف از بین میرود.
برای جل.گیری از این مورد، استفاده از extern یا input برای متغیرهای کلیدی و پارامترهایی مثل استاپ، حجم، دوره میانگین و ...توصیه میشود.
تست نکردن در شرایط واقعی بازار:
برخی اکسپرتها فقط روی دادههای گذشته خوب عمل میکنند و در حساب واقعی با مشکلات جدی مواجه میشوند.
تست در حساب دمو با شرایط زنده، استفاده از دادههای متفاوت، بررسی رفتار در اخبار و زمان باز و بسته شدن بازار بهترین روش ها برای پیشگیری از این مشکل است.
چگونه یک اکسپرت حرفهای و قابل استفاده در بازار واقعی بسازیم؟
ساخت یک اکسپرت حرفهای چیزی فراتر از نوشتن یک سری دستور معاملاتی است. اکسپرت حرفهای باید نهتنها بر اساس منطق صحیح کدنویسی شده باشد، بلکه در شرایط واقعی بازار نیز پایدار و قابل اعتماد عمل کند.
اولین ویژگی یک اکسپرت حرفهای، داشتن ساختار ماژولار و خواناست. کدی که تفکیک شده، توابع مشخص و منطق واضح دارد، بهراحتی قابل بهروزرسانی، اشکالزدایی و توسعه است. دومین نکته، تطبیقپذیری اکسپرت با نمادها و تایمفریمهای مختلف است. استفاده از متغیرهای ورودی (input parameters) این امکان را میدهد که کاربر بتواند پارامترها را بر اساس نیاز خود تغییر دهد.
همچنین، یک اکسپرت حرفهای باید قابلیت واکنش مناسب به شرایط خاص بازار را داشته باشد؛ از جمله نوسانات شدید، اخبار اقتصادی، زمانهای کمنقدینگی یا تعطیلی بازار. افزودن فیلترهایی مانند بررسی حجم، اسپرد، یا زمان سررسید کندلها میتواند به افزایش پایداری کمک کند.
در نهایت، قبل از استفاده از اکسپرت در حساب واقعی، تست کامل آن در محیط دمو و بررسی رفتار در موقعیتهای مختلف ضروری است. گزارشگیری دقیق، ثبت وقایع (log) و مانیتور عملکرد در زمان اجرا نیز بخشی از فرایند حرفهایسازی اکسپرت است.
اکسپرت حرفهای نتیجه یک فرآیند دقیق، مرحلهبهمرحله و آزمودهشده است. نه صرفاً یک کد، بلکه یک ابزار استراتژیک برای تبدیل نظم تحلیلی به عملکرد اتوماتیک.
نظرات
اولین اکسپرتی که نوشتم یه حلقه بینهایت داشت و متاتریدرم هنگ کرد 😅 ولی الان سه ساله نصف معاملاتم اتوماته. شروعش سخته ولی میارزه.
خیلی وقت بود دنبال همچین آموزشی به فارسی بودم، مرسی.
کد زدن اکسپرت راحتترین بخش کاره. سختترین بخش اینه که استراتژیای داشته باشی که ارزش اتومات کردن داشته باشه. من دهها اکسپرت نوشتم که رو کاغذ عالی بودن و تو بازار واقعی نه.
میشه قسمت دوم رو درباره بکتست بنویسید؟ اکسپرتم رو نوشتم ولی نمیدونم چطور با دیتای دقیق تستش کنم که نتیجهش قابل اعتماد باشه.
همیشه فکر میکردم برای نوشتن اکسپرت باید برنامهنویس حرفهای باشی. این مقاله باعث شد بالاخره MQL رو شروع کنم. ممنون که انقدر ساده توضیح دادید.
