تابع بستن خودکار معاملات در متاتریدر 5
در دنیای معاملات الگوریتمی با متاتریدر 5، مدیریت خودکار معاملات باز نقشی حیاتی در موفقیت استراتژیها ایفا میکند. بسیاری از مواقع نیاز پیدا میکنید تا تمام معاملات فروش (SELL
) یا خرید (BUY
) که با یک شماره مجیک (Magic Number) خاص باز شدهاند را بهصورت گروهی و سریع ببندید. انجام این کار بهصورت دستی، بهخصوص در بازارهای پرنوسان، نهتنها زمانبر است، بلکه میتواند منجر به خطاهای پرهزینه شود.
این مقاله به شما آموزش میدهد که چگونه با استفاده از یک تابع کاربردی MQL5، معاملات باز خود را در پلتفرم متاتریدر 5 بهطور خودکار و دقیق، بر اساس نوع معامله (خرید یا فروش) و شماره مجیک مورد نظرتان ببندید. یادگیری این تکنیک به شما کمک میکند تا اکسپرتهای (Expert Advisors) هوشمندتر و کارآمدتری توسعه دهید.
کد تابع بستن معاملات در MQL5
void CloseBuyOrSell(ENUM_ORDER_TYPE Type, int magicPO = 0) {
// Loop through all open positions in reverse order
for (int i = PositionsTotal() - 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
ENUM_ORDER_TYPE positionType = (ENUM_ORDER_TYPE)PositionGetInteger(POSITION_TYPE); // Get the type of the position
// Check if the position matches the current symbol and magic number
if (symbol != _Symbol || magic != magicPO) continue;
// Check if the position type matches the requested type
if (positionType == Type) {
// Attempt to close the position
if (Trade.PositionClose(ticket)) {
Print("Position closed successfully: Ticket #", ticket);
} else {
Print("Failed to close position: Ticket #", ticket, " Error: ", GetLastError());
}
}
}
}
نگاهی به عملکرد تابع بستن معاملات (CloseBuyOrSell)
این تابع وظیفه دارد تا موقعیتهای معاملاتی باز را بر اساس نوع سفارش (خرید یا فروش) و شماره مجیک مشخص شده، شناسایی و ببندد. بیایید مراحل اصلی کارکرد آن را مرور کنیم:
پیمایش معکوس موقعیتها:
ابتدا با استفاده از PositionsTotal تعداد کل موقعیتهای باز را میگیرد.
سپس یک حلقه for از آخرین موقعیت (PositionsTotal() – 1) به سمت اولین موقعیت (0) حرکت میکند.
چرا معکوس؟ این روشِ پیمایش تضمین میکند که اگر یک موقعیت در حین اجرای حلقه بسته شود، اندیس (شماره ردیف) موقعیتهای باقیمانده که هنوز بررسی نشدهاند، تغییر نکرده و حلقه به درستی کار خود را ادامه دهد.
دریافت اطلاعات و بررسی اولیه:
در هر بار تکرار حلقه، ابتدا شماره تیکت (ticket) موقعیت با PositionGetTicket گرفته میشود.
اگر تیکت نامعتبر باشد (ticket == 0)، با دستور continue این تکرار حلقه نادیده گرفته شده و به سراغ موقعیت بعدی میرود.
سپس اطلاعات دیگر مانند نماد (symbol)، شماره مجیک (magic) و نوع موقعیت (positionType) دریافت میشود.
فیلتر بر اساس نماد و مجیک:
کد چک میکند که آیا نماد موقعیت (symbol) با نماد فعال چارت (_Symbol) متفاوت است یا شماره مجیک موقعیت (magic) با شماره مجیک ورودی تابع (magicPo) متفاوت است.
اگر یکی از این تفاوتها وجود داشته باشد، یعنی موقعیت متعلق به نماد دیگری است یا مجیک نامبر مورد نظر ما را ندارد، با دستور continue از ادامه بررسی این موقعیت صرفنظر شده و حلقه به تکرار بعدی میرود.
فیلتر نهایی بر اساس نوع و اقدام به بستن:
تنها موقعیتهایی که از فیلتر قبلی (نماد و مجیک) عبور کردهاند به این مرحله میرسند.
در اینجا، نوع موقعیت (positionType) با نوع درخواستی که به تابع دادهایم (Type) مقایسه میشود.
اگر نوعها یکی باشند، تابع Trade.PositionClose(ticket) فراخوانی میشود تا دستور بستن آن موقعیت به سرور ارسال گردد.
گزارش نتیجه:
نتیجه عملیات بستن توسط Trade.PositionClose (که یک مقدار true یا false برمیگرداند) بررسی میشود.
اگر عملیات موفقیتآمیز (true) بود، پیام موفقیت چاپ میشود.
در غیر این صورت (false)، پیام خطا به همراه کد و توضیحات خطا (با استفاده از GetLastError() و ErrorDescription()) نمایش داده میشود تا بتوان علت عدم موفقیت را پیگیری کرد.
نحوه استفاده کد تابع بستن معاملات:
برای درک بهتر نحوه استفاده از تابع بستن معاملات، یک اکسپرت (ربات معاملهگر) ساده و کامل ارائه میکنیم. این اکسپرت شامل تابع مورد نظر است و در هر تیک قیمت (OnTick
)، آن را برای بستن معاملات مشخصی فراخوانی میکند.
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit() {
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick() {
// Example: Close all open SELL positions with Magic Number 12345
CloseBuyOrSell(ORDER_TYPE_SELL, 0);
}
//+------------------------------------------------------------------+
//| Function to close BUY or SELL positions based on type and magic |
//+------------------------------------------------------------------+
void CloseBuyOrSell(ENUM_ORDER_TYPE Type, int magicPO = 0) {
// Loop through all open positions in reverse order
for (int i = PositionsTotal() - 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
ENUM_ORDER_TYPE positionType = (ENUM_ORDER_TYPE)PositionGetInteger(POSITION_TYPE); // Get the type of the position
// Check if the position matches the current symbol and magic number
if (symbol != _Symbol || magic != magicPO) continue;
// Check if the position type matches the requested type
if (positionType == Type) {
// Attempt to close the position
if (Trade.PositionClose(ticket)) {
Print("Position closed successfully: Ticket #", ticket);
} else {
Print("Failed to close position: Ticket #", ticket, " Error: ", GetLastError());
}
}
}
}
نحوه استفاده و اجرا
- این کد را در MetaEditor کپی کرده و به عنوان یک اکسپرت ذخیره کنید.
- کامپایل: روی دکمه
Compile
در MetaEditor کلیک کنید (یا کلید F7 را بزنید). در صورت عدم وجود خطا، فایل اجرایی اکسپرت (.ex5
) ساخته میشود. - اجرا در متاتریدر: به پلتفرم متاتریدر 5 بروید. اکسپرت کامپایل شده را از پنجره
Navigator
(بخش Expert Advisors) پیدا کرده و روی چارت مورد نظرتان بکشید (Drag & Drop). - فعالسازی: مطمئن شوید که گزینه
Allow Algo Trading
در نوار ابزار متاتریدر فعال باشد. - مشاهده عملکرد: اکسپرت با هر تغییر قیمت (تیک) فعال شده و بررسی میکند که آیا موقعیت فروش (
SELL
) با شماره مجیک ۰ روی نماد جاری باز است یا خیر. در صورت وجود، اقدام به بستن آن میکند و نتیجه در تبExperts
یاJournal
در پنجره ترمینال متاتریدر نمایش داده میشود.
مزایای استفاده از تابع بستن معاملات در اکسپرتها:
صرفهجویی در زمان و اتوماسیون: با خودکارسازی فرآیند بستن معاملات، نیازی به نظارت دستی و مداوم ندارید.
کاهش خطاهای انسانی: این تابع از اشتباهاتی مانند بستن اشتباه یا تاخیر در معاملات جلوگیری میکند.
دقت و انعطافپذیری بالا: امکان بستن معاملات خاص (خرید، فروش یا مجیک نامبر مشخص) به شما کنترل کامل میدهد.
قابلیت ادغام در استراتژیهای پیچیده: به راحتی میتوانید این تابع را در اکسپرتهای پیشرفتهتر استفاده کنید.
مدیریت هوشمند خطا: با گزارش خطاها، اکسپرت شما پایدارتر عمل کرده و مشکلات را به شما اطلاع میدهد.
این تابع ابزاری قدرتمند برای بهبود عملکرد و مدیریت معاملات در اکسپرتهای شماست.
نتیجهگیری: گامی مهم در خودکارسازی معاملات
تابع بستن خودکار معاملات که در این مقاله با آن آشنا شدید، یکی از ابزارهای حیاتی برای افزایش دقت، سرعت و بهینهسازی مدیریت پوزیشنها در متاتریدر 5 است. با استفاده از این مهارت پایه، میتوانید استراتژیهای الگوریتمی خود را با اعتماد به نفس بیشتر و کنترل دقیقتر اجرا کنید، بدون نگرانی از خطاهای انسانی یا اتلاف وقت.
اگر به دنبال ارتقای مهارتهای خود در اکسپرتنویسی و کسب دانش عمیق در طراحی رباتهای معاملاتی حرفهای هستید، دوره جامع اکسپرتنویسی بورس۹۰ برای شما طراحی شده است. در این دوره، بهصورت عملی و گامبهگام تمامی تکنیکهای پیشرفته MQL5 را فرا خواهید گرفت و آماده خواهید شد تا اکسپرتهایی قدرتمند و کاربردی بسازید. همین حالا شروع کنید و مسیر پیشرفت خود را به سمت تخصصیترین سطح برنامهنویسی بازارهای مالی هموار کنید.
بدون دیدگاه