تابع شمارش معاملات باز در اکسپرتهای MQL5
هنگام ساخت اکسپرت (ربات معاملهگر) در MQL5، اغلب نیاز داریم بدانیم چه تعداد پوزیشن معاملاتی برای یک نماد خاص و با یک شناسه منحصر به فرد (مجیک نامبر) باز است. این اطلاعات به ما کمک میکند تا از باز کردن معاملات اضافی جلوگیری کنیم یا استراتژیهای معاملاتی خود را بهتر مدیریت نماییم.
این مقاله یک تابع کاربردی به نام CountOpenPositions را معرفی میکند که به سادگی تعداد پوزیشنهای فعال متعلق به یک اکسپرت خاص (بر اساس مجیک نامبر) روی نماد معاملاتی جاری را شمارش میکند.
قطعه کد تابع CountOpenPositions در MQL5:
//+------------------------------------------------------------------+
//| Function to count open positions for a specific symbol and magic |
//+------------------------------------------------------------------+
int CountOpenPositions(long magicPo = 0)
{
int count=0; // Counter for matching positions
int totalPositions=PositionsTotal(); // Total number of open positions
//--- Loop through all open positions
for(int i=totalPositions-1; i>=0; i--)
{
ulong ticket=PositionGetTicket(i); // Get the ticket of the position
if(ticket==0) continue; // Skip invalid tickets
string symbol=PositionGetString(POSITION_SYMBOL); // Get the symbol of the position
ulong magic=PositionGetInteger(POSITION_MAGIC); // Get the magic number of the position
//--- Check if the position matches the current symbol and magic number
if(symbol==_Symbol && magic==magicPo)
{
count++;
}
}
return count; // Return the count of matching positions
}
//+------------------------------------------------------------------+
توضیح گامبهگام کد تابع CountOpenPositions
در این بخش، عملکرد هر قسمت اصلی از تابع CountOpenPositions را به زبان ساده بررسی میکنیم:
int CountOpenPositions(long magicPo = 0)
تعریف تابع:این خط تابع ما را با نام CountOpenPositions تعریف میکند.
ورودی:یک پارامتر ورودی به نام magicPo از نوع long دارد که شماره مجیک (Magic Number) مورد نظر ما را دریافت میکند. مقدار پیشفرض آن 0 است، یعنی اگر هنگام فراخوانی تابع، مقداری برای آن نفرستیم، بهطور خودکار 0 در نظر گرفته میشود.
خروجی:نوع خروجی تابع int (عدد صحیح) است، به این معنی که تابع در نهایت تعداد پوزیشنهای شمارش شده را برمیگرداند.
int count = 0
شمارنده: یک متغیر به نام count از نوع عدد صحیح تعریف میکنیم و مقدار اولیهاش را 0 قرار میدهیم. این متغیر برای نگهداری تعداد پوزیشنهایی که با شرایط ما مطابقت دارند، استفاده میشود.
int totalPositions = PositionsTotal()
تعداد کل پوزیشنها: تابع داخلی MQL5 به نام PositionsTotal() تعداد کل پوزیشنهای بازی که در حال حاضر در حساب معاملاتی وجود دارد را برمیگرداند. ما این عدد را در متغیر totalPositions ذخیره میکنیم.
for (int i = totalPositions – 1; i >= 0; i–)
حلقه پیمایش: یک حلقه for ایجاد میکنیم تا تمام پوزیشنهای باز را یکییکی بررسی کنیم.
شروع از آخر: حلقه از آخرین پوزیشن (totalPositions – 1) شروع شده و به سمت اولین پوزیشن (0) حرکت میکند (شمارش معکوس). این روش استاندارد و مطمئنتری برای کار با لیست پوزیشنها در MQL5 است.
ulong ticket = PositionGetTicket(i)
دریافت تیکت: در هر بار تکرار حلقه، با استفاده از PositionGetTicket(i)، شماره تیکت (شناسه منحصر به فرد) پوزیشن i-ام را دریافت کرده و در متغیر ticket ذخیره میکنیم.
if (ticket == 0) continue
بررسی اعتبار تیکت: این یک بررسی احتیاطی است. اگر به هر دلیلی تیکت پوزیشن نامعتبر باشد (مقدارش صفر باشد)، دستور continue باعث میشود کد به سراغ پوزیشن بعدی در حلقه برود و ادامه دستورات داخل حلقه برای این پوزیشن اجرا نشود.
string symbol = PositionGetString(POSITION_SYMBOL)
دریافت نماد: نام نماد معاملاتی (Symbol) مربوط به پوزیشن فعلی (مثلاً “EURUSD”) را با استفاده از PositionGetString و شناسه POSITION_SYMBOL استخراج کرده و در متغیر symbol ذخیره میکنیم.
ulong magic = PositionGetInteger(POSITION_MAGIC)
دریافت مجیک نامبر: شماره مجیک پوزیشن فعلی را با استفاده از PositionGetInteger و شناسه POSITION_MAGIC دریافت کرده و در متغیر magic ذخیره میکنیم.
if (symbol == _Symbol && magic == magicPo)
شرط اصلی فیلتر: این مهمترین بخش تابع است که پوزیشنها را فیلتر میکند:
symbol == _Symbol: بررسی میکند که آیا نماد پوزیشن (symbol) با نماد چارتی که اکسپرت روی آن در حال اجراست (_Symbolکه یک متغیر از پیش تعریف شده MQL5 است) یکی است یا خیر.
magic == magicPo: بررسی میکند که آیا مجیک نامبر پوزیشن (magic) با مجیک نامبر ورودی تابع (magicPo) برابر است یا خیر.
&&(عملگر “و”): به این معنی است که هر دو شرط باید برقرار باشند تا کد داخل if اجرا شود.
count++
افزایش شمارنده:اگر هر دو شرط بالا برقرار باشند (یعنی پوزیشن متعلق به نماد جاری و مجیک نامبر مورد نظر ما باشد)، مقدار شمارنده count یکی افزایش مییابد.
return count
بازگرداندن نتیجه: پس از اتمام حلقه و بررسی تمام پوزیشنها، مقدار نهایی count (که تعداد پوزیشنهای مطابق با شرایط است) به عنوان خروجی تابع برگردانده میشود.
نحوه استفاده کد:
کد زیر یک مثال ساده هست برای اینکه درستی کد را در یک اکسپرت تست کنید.
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit() {
// Initialization code (if needed)
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
// Cleanup code (if needed)
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick() {
// Call the CountOpenPositions function with magic number 0
int positionCount = CountOpenPositions(0);
// Display the result as a comment on the chart
Comment("Number of open positions with Magic Number 0: ", positionCount);
}
//+------------------------------------------------------------------+
//| Function to count open positions for a specific symbol and magic|
//+------------------------------------------------------------------+
int CountOpenPositions(long magicPo = 0) {
int count = 0; // Counter for matching positions
int totalPositions = PositionsTotal(); // Total number of open positions
// Loop through all open positions
for (int i = totalPositions - 1; i >= 0; i--) {
ulong ticket = PositionGetTicket(i); // Get the ticket of the position
if (ticket == 0) continue; // Skip invalid tickets
string symbol = PositionGetString(POSITION_SYMBOL); // Get the symbol of the position
ulong magic = PositionGetInteger(POSITION_MAGIC); // Get the magic number of the position
// Check if the position matches the current symbol and magic number
if (symbol == _Symbol && magic == magicPo) {
count++;
}
}
return count; // Return the count of matching positions
}
راهنمای تست تابع شمارش پوزیشن در متاتریدر۵
ایجاد یک اکسپرت جدید:
- در MetaEditor، یک اکسپرت جدید ایجاد کنید. برای این کار، به مسیر زیر بروید:
File > New > Expert Advisor (Generate) - نامی برای اکسپرت انتخاب کنید، مثلاً SimplePositionCounterEA، و روی Next کلیک کنید.
تنظیمات پیشفرض را تأیید کنید و پروژه را ایجاد کنید. - پاک کردن کد پیشفرض: پس از ایجاد اکسپرت، کد پیشفرض موجود در فایل را کامل پاک کنید.
- کپی کد: تمام کد ارائهشده در بالا را کپی کرده و در فایل خالی اکسپرت خود قرار دهید.
- کامپایل کردن: کد را کامپایل کنید (با فشار دادن کلید F7 یا از منوی Tools > Compile).
اگر کد بدون خطا کامپایل شود، فایل اجرایی (SimplePositionCounterEA.ex5) در پوشه Experts متاتریدر شما ساخته میشود. - اجرای اکسپرت در متاتریدر 5: به متاتریدر 5 بروید و از پنجره Navigator ، اکسپرت جدید (SimplePositionCounterEA) را روی چارت دلخواه خود بکشید.
- اطمینان حاصل کنید که گزینه Allow Live Trading فعال است تا اکسپرت بتواند به درستی کار کند.
- مشاهده نتایج: با هر تغییر قیمت در چارت، تعداد موقعیتهای باز با شماره ماجیک 0 محاسبه شده و در تب Experts ترمینال چاپ میشود.
میتوانید خروجی را در ترمینال مشاهده کنید. اگر از تابع Comment در کد استفاده کردهاید، نتیجه همچنین روی چارت نمایش داده میشود.
مزایا و کاربردها
- کنترل تعداد معاملات: محدود کردن تعداد معاملات همزمان برای یک استراتژی.
- منطق شرطی: اجرای کدهای مختلف بر اساس وجود یا عدم وجود پوزیشن.
- جلوگیری از تداخل: کمک به عدم تداخل اکسپرتهای مختلف با مدیریت مجیک نامبر.
- سادهسازی کد: استفاده از یک تابع به جای تکرار حلقه بررسی پوزیشن.
نتیجهگیری
شمارش موقعیتهای باز یکی از ابزارهای ضروری برای معاملهگران الگوریتمی است. این مقاله به شما یاد داد که چگونه یک تابع ساده و کاربردی برای شمارش موقعیتهای باز در متاتریدر 5 بنویسید. این کد نه تنها انعطافپذیر است، بلکه به راحتی قابل توسعه و ادغام در پروژههای بزرگتر است.
اگر به دنبال یادگیری عمیقتر در زمینه اکسپرتنویسی هستید، دعوت میکنم تا در دوره جامع اکسپرت نویسی ما شرکت کنید. در این دوره، تمام مفاهیم پیشرفته MQL5، از جمله مدیریت موقعیتها، استراتژیهای معاملاتی، و بهینهسازی کدها، به طور کامل آموزش داده میشود. با شرکت در این دوره، میتوانید به یک متخصص اکسپرتنویسی تبدیل شوید و استراتژیهای معاملاتی خود را به طور کامل خودکار کنید.
بدون دیدگاه