بدست آوردن قیمت دقیق در ساعت مشخص از سشنهای فارکس در MQL5 – کد آماده
مقدمه
بازار فارکس به دلیل تحرکات قیمتی بالا و حجم بالای معاملات، یکی از محبوبترین بازارهای مالی در جهان است. معاملهگران حرفهای برای بهینهسازی استراتژیهای خود، اغلب از قیمتهای شروع (Open) و پایان (Close) سشنهای مختلف فارکس استفاده میکنند. این قیمتها به عنوان نقاط کلیدی در ورود، خروج یا مدیریت معاملات بسیار کاربردی هستند. در این مقاله، شما یاد خواهید گرفت که چگونه با استفاده از زبان برنامهنویسی MQL5، قیمتهای Open و Close سشنهای فارکس را به صورت خودکار و دقیق محاسبه کنید.
تابع اصلی: محاسبه زمان شمعهای فارکس با MQL5
datetime GetOpenCloseSessionTime(datetime now, int hour, int minute) {
if (hour < 0 || hour > 23 || minute < 0 || minute > 59) {
Print("Invalid hour or minute values. Hour must be between 0-23 and minute between 0-59.");
return 0;
}
MqlDateTime nowStruct;
TimeToStruct(now, nowStruct);
nowStruct.sec = 0;
datetime nowTime = StructToTime(nowStruct);
nowStruct.hour = hour;
nowStruct.min = minute;
datetime prevTime = StructToTime(nowStruct);
while (prevTime >= nowTime) {
prevTime -= 86400; // Subtract one day
}
return prevTime;
}
توضیحات کد: ساختار و عملکرد تابع GetOpenCloseSessionTime
این تابع (GetOpenCloseSessionTime) برای محاسبه زمان شروع یک شمع خاص (Candle) با ساعت و دقیقه دلخواه طراحی شده است. در ادامه، اجزای کلیدی کد توضیح داده شدهاند:
بررسی ورودیها:
تابع ابتدا مقادیر hour و minute را بررسی میکند. اگر مقادیر خارج از محدوده مجاز باشند (ساعت بین 0 تا 23 و دقیقه بین 0 تا 59)، پیام خطا چاپ شده و مقدار 0 برمیگردد.
ساختار MqlDateTime:
از ساختار MqlDateTime برای تجزیه زمان فعلی استفاده شده و ثانیهها به صفر تنظیم میشوند.
محاسبه زمان شمع:
ساعت و دقیقه مورد نظر به ساختار اضافه میشوند و زمان شمع محاسبه میشود.
تنظیم زمان به آخرین شمع قبل از زمان فعلی:
اگر زمان محاسبهشده بزرگتر یا مساوی زمان فعلی باشد، حلقه while مقدار یک روز (86400 ثانیه) از زمان محاسبهشده کم میکند تا به آخرین شمع قبل از زمان فعلی برسد.
مثال عملی: استفاده از تابع برای محاسبه قیمتهای Open و Close
برای اینکه کاربران بتوانند به راحتی از این تابع استفاده کنند، یک مثال ساده و کامل ارائه میشود. این مثال شامل یک اکسپرت (Expert Advisor) است که از تابع GetOpenCloseSessionTime برای محاسبه قیمتهای Open و Close استفاده میکند.
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit() {
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick() {
// Calculate the time of the last 10:30 candle
datetime when = GetOpenCloseSessionTime(TimeCurrent(), 10, 30);
if (when == 0) {
Print("Failed to calculate the candle time.");
return;
}
// Find the bar index for the calculated time
int whenbar = iBarShift(_Symbol, PERIOD_CURRENT, when);
if (whenbar == -1) {
Print("Failed to find the bar index for the given time.");
return;
}
// Get the open price of the calculated bar
double Openprice = iOpen(_Symbol, PERIOD_CURRENT, whenbar);
if (Openprice == EMPTY_VALUE) {
Print("Failed to retrieve the open price for the given bar.");
return;
}
// Display the results on the chart
Comment("Open Price: ", Openprice, "\nTime: ", TimeToString(when, TIME_DATE | TIME_MINUTES));
}
//+------------------------------------------------------------------+
//| Function to calculate the time of a specific candle |
//+------------------------------------------------------------------+
datetime GetOpenCloseSessionTime(datetime now, int hour, int minute) {
if (hour < 0 || hour > 23 || minute < 0 || minute > 59) {
Print("Invalid hour or minute values. Hour must be between 0-23 and minute between 0-59.");
return 0;
}
MqlDateTime nowStruct;
TimeToStruct(now, nowStruct);
nowStruct.sec = 0;
datetime nowTime = StructToTime(nowStruct);
nowStruct.hour = hour;
nowStruct.min = minute;
datetime prevTime = StructToTime(nowStruct);
while (prevTime >= nowTime) {
prevTime -= 86400; // Subtract one day
}
return prevTime;
}
مزایای کد: دقت، انعطافپذیری و کاربرد حرفهای
محاسبه دقیق زمان شمعها:
این تابع زمان شمعهای مربوط به ساعت و دقیقه دلخواه را به طور دقیق محاسبه میکند و برای تحلیلهای زمانی سشنهای فارکس بسیار کاربردی است.
مدیریت خطاهای احتمالی:
اگر ورودیها نامعتبر باشند یا توابع داخلی خطا دهند، پیامهای خطا چاپ شده و کد از اجرای نادرست جلوگیری میکند.
قابلیت استفاده مجدد:
این تابع به راحتی میتواند برای هر ساعت و دقیقه دلخواه استفاده شود و در پروژههای مختلف ادغام شود.
سازگاری با استانداردهای MQL5:
استفاده از ساختارهای استاندارد (مانند MqlDateTime) و توابع داخلی MQL5، کدنویسی تمیز و استاندارد را تضمین میکند.
نتیجهگیری: گامی مهم در خودکارسازی معاملات
محاسبه قیمتهای Open و Close سشنهای فارکس، یکی از مهارتهای ضروری برای معاملهگران الگوریتمی است. تابعی که در این مقاله معرفی شد، به شما کمک میکند تا این اطلاعات را به صورت خودکار و دقیق بدست آورید و به راحتی در استراتژیهای معاملاتی خود استفاده کنید.
برای تسلط کامل بر تمام جنبههای اکسپرتنویسی پیشرفته در MQL5 و تبدیل شدن به یک متخصص در این زمینه، دوره جامع اکسپرت نویسی بورس۹۰ بهترین مسیر پیش روی شماست. در این دوره، تمام تکنیکهای لازم برای ساخت رباتهای معاملاتی حرفهای را به صورت عملی یاد خواهید گرفت و استراتژیهای خود را به طور کامل خودکار خواهید کرد.
فوقالعاده عالی و کاربردی بود .ممنون
خیلی خوشحالم که براتون مفید بوده 🙏