تابع استخراج اطلاعات آخرین پوزیشن باز در MQL5
مقدمه: کلید مدیریت هوشمند معاملات در MQL5
در دنیای هیجانانگیز و پرسرعت معاملات الگوریتمی با متاتریدر، دسترسی سریع و دقیق به اطلاعات موقعیتهای معاملاتی باز (Positions)، یکی از مهمترین ارکان ساخت استراتژیهای هوشمند و سودآور است.
اگر شما هم یک برنامهنویس MQL5 هستید و اکسپرتهای (رباتهای معاملهگر) خود را توسعه میدهید، بدون شک بارها نیاز پیدا کردهاید که اطلاعات مربوط به آخرین معامله باز خود را به صورت خودکار و با اطمینان کامل بازیابی کنید. این اطلاعات میتواند شامل نوع معامله (خرید یا فروش)، حجم دقیق آن، و قیمت ورود به معامله باشد.
در این مقاله آموزشی و کاربردی، قصد داریم شما را با یک تابع سفارشی و بسیار مفید به نام GetLastPositionInfo
آشنا کنیم. ما به شما نشان خواهیم داد که چگونه با استفاده از این تابع، به سادگی اطلاعات کلیدی آخرین پوزیشن معاملاتی خود را در زبان برنامهنویسی MQL5 استخراج کرده و در اکسپرتهای خود به کار بگیرید. آمادهاید تا یک ابزار قدرتمند دیگر به جعبه ابزار برنامهنویسی خود اضافه کنید؟
تابع GetLastPositionInfo: چرا و چگونه به کارمان میآید؟
تابع GetLastPositionInfo
یک تابع سفارشی (Custom Function) در MQL5 است که با هدف اصلی بازیابی اطلاعات آخرین موقعیت معاملاتی باز (Open Position) یک اکسپرت خاص طراحی شده است.
این تابع به طور ویژه برای معاملهگرانی که از استراتژیهای مبتنی بر مدیریت دقیق پوزیشن (Position Management)، مانند استراتژیهای مارتینگل، گرید، یا خروج بر اساس سیگنال مخالف استفاده میکنند، بسیار کارآمد و ضروری است.
با فراخوانی این تابع، شما به راحتی میتوانید به اطلاعات زیر از آخرین معامله باز شده توسط اکسپرت خود (با مجیک نامبر و سیمبل مشخص) دسترسی پیدا کنید:
- نوع معامله (Position Type): آیا آخرین معامله شما خرید (BUY) بوده یا فروش (SELL)؟
- حجم معامله (Position Volume): آخرین معامله با چه حجمی (لات – Lot Size) باز شده است؟
- قیمت باز شدن (Position Open Price): آخرین معامله دقیقاً در چه قیمتی فعال شده است؟
دانستن این اطلاعات به شما کمک میکند تا تصمیمات بعدی استراتژی خود را هوشمندانهتر اتخاذ کنید، ریسک را بهتر مدیریت نمایید و از باز شدن معاملات ناخواسته جلوگیری کنید.
کد تابع GetLastPositionInfo در MQL5
در این بخش، کد کامل تابع GetLastPositionInfo
را مشاهده میکنید. این کد به گونهای نوشته شده است که خوانا باشد و مدیریت خطای مناسبی نیز داشته باشد.
bool GetLastPositionInfo(ENUM_POSITION_TYPE &lastPositionType, double &lastVolume, double &lastOpenPrice,ulong InpMagicNumber=0) {
// Initialize output variables to default values
lastVolume = 0.0;
lastOpenPrice = 0.0;
// Get the total number of open positions
int totalPositions = PositionsTotal();
// Loop through all open positions in reverse order
for (int i = totalPositions - 1; i >= 0; i--) {
ulong ticket = PositionGetTicket(i); // Get the ticket of the position
if (ticket == 0) {
Print("Failed to retrieve position ticket at index ", i);
return false; // Exit if ticket retrieval fails
}
if (!PositionSelectByTicket(ticket)) {
Print("Failed to select position with ticket: ", ticket);
return false; // Exit if position selection fails
}
long magicNumber;
if (!PositionGetInteger(POSITION_MAGIC, magicNumber)) {
Print("Failed to retrieve magic number for position with ticket: ", ticket);
return false; // Exit if magic number retrieval fails
}
string symbol = PositionGetString(POSITION_SYMBOL); // Get the symbol of the position
if (magicNumber == InpMagicNumber && symbol == _Symbol) {
// Retrieve position type, volume, and open price
lastPositionType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
lastVolume = PositionGetDouble(POSITION_VOLUME);
lastOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN);
// Successfully found the desired position, exit the loop
return true;
}
}
// No matching position found
Print("No matching position found with the specified magic number and symbol.");
return false;
}
نحوه استفاده از مثال بالا:
- کد تابع
GetLastPositionInfo
(که در بخش قبلی ارائه شد) را به طور کامل در انتهای فایل اکسپرت خود (خارج از هر تابع دیگری) کپی و پیست کنید. - متغیر
InpMagicNumber
را در ابتدای اکسپرت خود به عنوان یک ورودی (input
) یا متغیر سراسری تعریف کرده و مقدار مناسب را به آن اختصاص دهید. (در مثال بالا 12345 در نظر گرفته شده است). - کد داخل تابع
OnStart()
را میتوانید در هرجایی از اکسپرت خود که نیاز به اطلاعات آخرین پوزیشن دارید (مثلاً درOnTick()
برای تصمیمگیریهای لحظهای) استفاده کنید. - پس از اجرای اکسپرت، نتایج در تب “Experts” ترمینال متاتریدر شما چاپ خواهد شد.
توضیحات مختصر کد:
تابع GetLastPositionInfo
یک تابع سفارشی است که اطلاعات آخرین موقعیت معاملاتی باز (Open Position) را بر اساس شماره مجیک (Magic Number) و نماد فعلی (_Symbol
) بازمیگرداند. این تابع شماره مجیک را به عنوان پارامتر ورودی (InpMagicNumber
) دریافت میکند.
پارامترها:
lastPositionType
: نوع معامله (BUY یا SELL)lastVolume
: حجم معاملهlastOpenPrice
: قیمت باز شدن معاملهInpMagicNumber
: شماره مجیک اختصاصی برای فیلتر کردن موقعیتها (اختیاری، با مقدار پیشفرض در صورت عدم ارسال)
حلقه معکوس: تابع تمام موقعیتهای باز را به صورت معکوس بررسی میکند تا آخرین موقعیت مطابق با شرایط (شماره مجیک و نماد) را پیدا کند. این رویکرد بهینهتر است، زیرا فقط به دنبال آخرین موقعیت مطابق با شرایط هستیم.
بررسی شماره مجیک و نماد: تابع فقط موقعیتهایی را در نظر میگیرد که شماره مجیک آنها با InpMagicNumber
(در صورت ارسال) و نماد آنها با _Symbol
مطابقت داشته باشد. این بررسی اطمینان میدهد که اطلاعات مربوط به استراتژی خاص شما بازیابی میشود.
مدیریت دقیق خطاها: اگر هر مرحله از فرآیند بازیابی اطلاعات ناموفق باشد (مانند دریافت تیکت یا انتخاب موقعیت)، تابع پیام خطا چاپ کرده و مقدار false
برمیگرداند.
خروجی: در صورت پیدا کردن موقعیت مطابق با شرایط، اطلاعات مربوط به نوع معامله، حجم و قیمت باز شدن در متغیرهای خروجی ذخیره شده و تابع مقدار true
برمیگرداند. اگر هیچ موقعیتی پیدا نشود، پیام مناسبی چاپ شده و مقدار false
برگردانده میشود.
مثال قابل کپی بدون خطا:
برای اینکه کاربران بتوانند به راحتی از این تابع استفاده کنند، یک مثال ساده و کامل ارائه میکنیم:
//+------------------------------------------------------------------+
//| GetLastPositionInfo.mq5 |
//| Copyright 2024, Bourse90.com. |
//| https://www.Bourse90.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Bourse90.com."
#property link "https://www.Bourse90.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
ENUM_POSITION_TYPE lastPositionType;
double lastVolume, lastOpenPrice;
if (GetLastPositionInfo(lastPositionType, lastVolume, lastOpenPrice,0)) {
Print("Last Position Info:");
Print("Type: ", EnumToString(lastPositionType));
Print("Volume: ", lastVolume);
Print("Open Price: ", lastOpenPrice);
} else {
Print("Failed to retrieve last position information.");
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
bool GetLastPositionInfo(ENUM_POSITION_TYPE &lastPositionType, double &lastVolume, double &lastOpenPrice,ulong InpMagicNumber=0) {
// Initialize output variables to default values
lastVolume = 0.0;
lastOpenPrice = 0.0;
// Get the total number of open positions
int totalPositions = PositionsTotal();
// Loop through all open positions in reverse order
for (int i = totalPositions - 1; i >= 0; i--) {
ulong ticket = PositionGetTicket(i); // Get the ticket of the position
if (ticket == 0) {
Print("Failed to retrieve position ticket at index ", i);
return false; // Exit if ticket retrieval fails
}
if (!PositionSelectByTicket(ticket)) {
Print("Failed to select position with ticket: ", ticket);
return false; // Exit if position selection fails
}
long magicNumber;
if (!PositionGetInteger(POSITION_MAGIC, magicNumber)) {
Print("Failed to retrieve magic number for position with ticket: ", ticket);
return false; // Exit if magic number retrieval fails
}
string symbol = PositionGetString(POSITION_SYMBOL); // Get the symbol of the position
if (magicNumber == InpMagicNumber && symbol == _Symbol) {
// Retrieve position type, volume, and open price
lastPositionType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
lastVolume = PositionGetDouble(POSITION_VOLUME);
lastOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN);
// Successfully found the desired position, exit the loop
return true;
}
}
// No matching position found
Print("No matching position found with the specified magic number and symbol.");
return false;
}
نتیجهگیری: یک ابزار ضروری برای اکسپرتنویسان حرفهای
تابع GetLastPositionInfo یک ابزار ساده اما بسیار قدرتمند و کاربردی برای معاملهگران الگوریتمی و برنامهنویسان MQL5 است که به دنبال دسترسی سریع، دقیق و مطمئن به اطلاعات آخرین موقعیت معاملاتی باز خود هستند. این تابع با داشتن منطق جستجوی بهینه و مدیریت خطای مناسب، نه تنها انعطافپذیر است، بلکه به راحتی قابل توسعه و ادغام در پروژههای اکسپرت نویسی بزرگتر و پیچیدهتر نیز میباشد. با استفاده صحیح از این تابع، میتوانید دقت و کارایی استراتژیهای مدیریت پوزیشن خود را به طور قابل توجهی افزایش دهید.
آیا آمادهاید تا مهارتهای اکسپرتنویسی خود را به سطح بالاتری ببرید؟
اگر به یادگیری عمیقتر و جامعتر در زمینه ساخت رباتهای معاملهگر حرفهای (اکسپرت) در MQL5 علاقهمند هستید، صمیمانه شما را دعوت میکنیم تا در دوره جامع اکسپرت نویسی ما شرکت کنید. در این دوره، تمامی مفاهیم کلیدی و پیشرفته MQL5، از جمله تکنیکهای پیشرفته مدیریت پوزیشنها، طراحی و پیادهسازی انواع استراتژیهای معاملاتی، بهینهسازی کدها برای حداکثر کارایی، و مدیریت حرفهای ریسک و سرمایه، به صورت کاملاً عملی و پروژهمحور به شما آموزش داده میشود.
با شرکت در این دوره، شما نه تنها دانش فنی لازم برای تبدیل شدن به یک متخصص اکسپرتنویسی را کسب میکنید، بلکه قادر خواهید بود تا استراتژیهای معاملاتی منحصر به فرد خود را به طور کامل خودکار کرده و کنترل دقیقتری بر معاملات خود در بازار فارکس و سایر بازارهای مالی داشته باشید.
آیا این آموزش برای شما مفید بود؟ برای برداشتن قدم بعدی و یادگیری جامع اکسپرتنویسی، از مفاهیم پایه تا ساخت رباتهای حرفهای، به صفحه دوره جامع اکسپرت نویسی ما سر بزنید؛
بدون دیدگاه