ورود

View Full Version : کمک برای ساخت برنامه تقویم اقتصادی روی متاتریدر



mahmoudezoj
شنبه 02 فروردین 1404, 10:28 صبح
سلام دوستان
به من گفتن چون موضوع سوالم مربوط به ترید هست میتونم توی بخش pithon که نزدیکترین زبان برنامه نویسی هست مطرح کنم
من با متاتریدر 5 کار میکنم (MT5) و نیاز به یک اندیکاتور دارم که تقویم اقتصادی فارکس رو روی چارت نمایش بده. اندیکاتور برای این کار زیاده ولی چون میخوام اکسپرت شخصی خودم اطلاعات رو از روی اون بخونه نیاز به کدهای اندیکاتور دارم
یدونه کد نوشتم ولی با اینکه درست کامپایل میشه ولی هیچ چیزی روی چارت نمایش نمیده. کد رو همین زیر میزارم که در صورت امکان بهم کمک کنید. اگه کد یک اندیکاتور تقویم اقتصادی فارکس دیگه هم دارید برام بزارید ممنون میشم.

کد اندیکاتور (که چیزی در چارت نمایش نمیده):

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
#property indicator_label1 "News"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed


// تعریف آدرس فایل News به عنوان یک پارامتر ورودی
input string FilePath = "MQL5\\Files\\News.xml"; // مسیر فایل


double NewsBuffer[];


int OnInit()
{
SetIndexBuffer(0, NewsBuffer);
EventSetTimer(5); // بررسی هر 5 ثانیه
return(INIT_SUCCEEDED);
}


void OnDeinit(const int reason)
{
EventKillTimer();
ObjectsDeleteAll(0, "NewsLine_"); // حذف خطوط خبری قدیمی
Comment("");
}


void OnTimer()
{
// 1. بررسی وجود فایل
if (!FileIsExist(FilePath)) {
Print("فایل یافت نشد: ", FilePath);
return;
}


// 2. باز کردن فایل
int handle = FileOpen(FilePath, FILE_READ|FILE_TXT|FILE_ANSI); // اضافه کردن FILE_ANSI
if(handle == INVALID_HANDLE) {
Print("خطا در باز کردن فایل! کد خطا: ", GetLastError());
return;
}


// 3. خواندن محتوای فایل
string xml = "";
while(!FileIsEnding(handle)) {
xml += FileReadString(handle) + "\n";
}


// 4. بستن فایل
FileClose(handle);


// 5. چاپ محتوای فایل برای دیباگ
Print("محتوای فایل: ", xml);


// 6. پردازش XML
ProcessXML(xml);
}


void ProcessXML(const string &xml) {
// 1. حذف خطوط خبری قدیمی
ObjectsDeleteAll(0, "NewsLine_");


// 2. پارس کردن XML
int pos = 0;
int newsCount = 0;

// تعریف متغیرهای title و newsTime خارج از حلقه
string title = "";
datetime newsTime = 0;


// دریافت محدوده‌ی زمانی چارت
datetime firstTime = iTime(_Symbol, _Period, 0); // زمان اولین کندل چارت
datetime lastTime = iTime(_Symbol, _Period, iBars(_Symbol, _Period) - 1); // زمان آخرین کندل چارت


while(true) {
// پیدا کردن تگ <item>
int itemStart = StringFind(xml, "<item>", pos);
if(itemStart == -1) break;

int itemEnd = StringFind(xml, "</item>", itemStart);
if(itemEnd == -1) break;

string item = StringSubstr(xml, itemStart, itemEnd - itemStart);
pos = itemEnd + 6;


// استخراج اطلاعات خبر
title = ExtractTag(item, "title"); // مقداردهی متغیر title
string pubDate = ExtractTag(item, "pubDate");
newsTime = StringToTime(pubDate); // مقداردهی متغیر newsTime


// چاپ اطلاعات برای دیباگ
Print("Title: ", title);
Print("PubDate: ", pubDate);
Print("NewsTime: ", newsTime);


// رسم خط خبری فقط اگر در محدوده‌ی زمانی چارت باشد
if(newsTime > 0 && newsTime >= firstTime && newsTime <= lastTime) {
string lineName = "NewsLine_" + IntegerToString(newsCount);
if (!ObjectCreate(0, lineName, OBJ_VLINE, 0, newsTime, 0)) {
Print("خطا در ایجاد خط خبری! کد خطا: ", GetLastError());
} else {
ObjectSetInteger(0, lineName, OBJPROP_COLOR, clrRed);
ObjectSetInteger(0, lineName, OBJPROP_WIDTH, 2);
ObjectSetString(0, lineName, OBJPROP_TEXT, title);
Print("خط خبری ایجاد شد: ", lineName, " - زمان: ", newsTime, " - عنوان: ", title);
newsCount++;
}
}
}


// نمایش اطلاعات آخرین خبر روی چارت
if (newsCount > 0) {
string commentText = "آخرین خبر: " + title + " - زمان: " + TimeToString(newsTime);
Comment(commentText);
}


Print(newsCount, " خبر پردازش شد.");
}


string ExtractTag(const string &xml, const string &tag) {
string openTag = "<" + tag + ">";
string closeTag = "</" + tag + ">";

int start = StringFind(xml, openTag);
if(start == -1) return "";

start += StringLen(openTag);
int end = StringFind(xml, closeTag, start);
if(end == -1) return "";

return StringSubstr(xml, start, end - start);
}


int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
return(rates_total);
}