//+------------------------------------------------------------------+ //| TerminalInfoExport.mq5 | //| Copyright 2025, Ramesh MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "visit the product page." #property link "https://www.mql5.com/en/market/product/146544" #property version "1.00" #property description "This script helps export terminal, account, history orders and history deals informations to CSV files, email and to google sheet." #property script_show_inputs; #include #include #include #include #include input group "choose to export terminal info"; input bool exportTerminalInformations = false; //export terminal informations? input string terminalInfoName = "Terminal_Info"; //terminal info file or sheet name input group "choose to export history deals"; input bool exportHistoricalDeals = false; //export historical deals? input string historyDealsName = "History_Deals"; //history deals file or sheet name input group "choose to export history orders"; input bool exportHistoricalOrders = false; //export historical orders? input string historyOrdersName = "History_Orders"; //history orders file or sheet name input group "choose to export account info"; input bool exportAccountInfos = false; //export account informations? input string accountInfoName = "Account_Info"; //account info file or sheet name input group "output to file"; input bool doYouWantToWriteToFile = false; // do you want to write to file? input group "send email"; input bool doYouWantToSendEmail = false; //do you want to send informations to email? input group "output to Google Sheet"; input bool doYouWantToExportToGoogleSheet = false; //do you want to export to Google sheet? input string appsScriptUrl = "Please enter the apps script url here"; //Apps Script deployed url CHashMap codePageLanguage; // storing code page language number to code in hashmap void initiateCodePageLanguage() { codePageLanguage.Add(0, "CP_ACP"); codePageLanguage.Add(1, "CP_OEMCP"); codePageLanguage.Add(2, "CP_MACCP"); codePageLanguage.Add(3, "CP_THREAD_ACP"); codePageLanguage.Add(42, "CP_SYMBOL"); codePageLanguage.Add(65000, "CP_UTF7"); codePageLanguage.Add(65001, "CP_UTF8"); } string GetTerminalInfo() { initiateCodePageLanguage(); string terminalCodePageLang; CTerminalInfo terminalInfo; bool terminalCodePageLangFound = codePageLanguage.TryGetValue(terminalInfo.CodePage(), terminalCodePageLang); string terminal_infos = "Terminal_Infos; Values\n"; string terminalInformations = StringFormat( "build number; %d\n" + "trade server connected; %s\n" + "DLLs are allowed; %s\n" + "trading enabled; %s\n" + "email enabled; %s\n" + "ftp enabled; %s\n" + "max bars allowed in chart; %d\n" + "code page language; %s\n" + "cpu cores used; %d\n" + "physical memory; %d MB\n" + "memory available; %d MB\n" + "memory used; %d MB\n" + "memory total; %d MB\n" + "system is x64; %s\n" + "OpenCl version; %s\n" + "free disk space; %d MB\n" + "terminal language; %s\n" + "common data folder of all terminals, installed on the computer; %s\n" + "data folder of the terminal; %s\n" + "folder of the client terminal; %s\n" + "company name of the terminal; %s\n" + "name of the terminal; %s" , terminalInfo.Build(), terminalInfo.IsConnected() ? "yes" : "no", terminalInfo.IsDLLsAllowed() ? "yes" : "no", terminalInfo.IsTradeAllowed() ? "yes" : "no", terminalInfo.IsEmailEnabled() ? "yes" : "no", terminalInfo.IsFtpEnabled() ? "yes" : "no", terminalInfo.MaxBars(), terminalCodePageLangFound ? terminalCodePageLang : "not found", terminalInfo.CPUCores(), terminalInfo.MemoryPhysical(), terminalInfo.MemoryAvailable(), terminalInfo.MemoryUsed(), terminalInfo.MemoryTotal(), terminalInfo.IsX64() ? "yes" : "no", terminalInfo.OpenCLSupport() == 0 ? "OpenCL not supported" : IntegerToString(terminalInfo.OpenCLSupport()), terminalInfo.DiskSpace(), terminalInfo.Language(), terminalInfo.CommonDataPath(), terminalInfo.DataPath(), terminalInfo.Path(), terminalInfo.Company(), terminalInfo.Name() ); StringAdd(terminal_infos, terminalInformations); return terminal_infos; } string GetAccountInfo() { CAccountInfo accountInfo; string account_info = "symbol; name; currency; company; balance; credit; profit; equity; margin; " + "login; trade_mode; leverage; limit_orders; margin_mode\n"; StringAdd(account_info, StringFormat( "%s; %s; %s; %s; %f; %f; %f; %f; %f; %d; %d; %d; %d; %d", Symbol(), accountInfo.Name(), accountInfo.Currency(), accountInfo.Company(), accountInfo.Balance(), accountInfo.Credit(), accountInfo.Profit(), accountInfo.Equity(), accountInfo.Margin(), accountInfo.Login(), accountInfo.TradeMode(), accountInfo.Leverage(), accountInfo.LimitOrders(), accountInfo.MarginMode() )); return account_info; } string GetHistoryDeals() { CDealInfo deal; HistorySelect(StringToTime("1970.01.01 09:00"), TimeCurrent()); int totalDeals = HistoryDealsTotal(); string deals = "ticket; symbol; time; price; profit; type; volume; comment; sl; tp; commission; " + "fee; order_id; position_id; magic\n"; for(int i = 0; i < totalDeals; i++) { deal.SelectByIndex(i); ulong ticket = deal.Ticket(); string dealInfo = StringFormat( "%d; %s; %s; %f; %f; %s; %d; %s; %f; %f; %f; %f; %d; %d; %d\n", ticket, deal.Symbol(), TimeToString(deal.Time()), deal.Price(), deal.Profit(), deal.Type() == 0 ? "buy" : "sell", deal.Volume(), deal.Comment(), HistoryDealGetDouble(ticket, DEAL_SL), HistoryDealGetDouble(ticket, DEAL_TP), HistoryDealGetDouble(ticket, DEAL_COMMISSION), HistoryDealGetDouble(ticket, DEAL_FEE), HistoryDealGetInteger(ticket, DEAL_ORDER), HistoryDealGetInteger(ticket, DEAL_POSITION_ID), HistoryDealGetInteger(ticket, DEAL_MAGIC) ); StringAdd(deals, dealInfo); } return deals; } string GetHistoryOrders() { CHistoryOrderInfo order; HistorySelect(StringToTime("1970.01.01 09:00"), TimeCurrent()); int totalOrders = HistoryOrdersTotal(); string orders = "ticket; symbol; time; price; type; volume; comment; sl; tp; state; order_time_done; " + "order_expire; position_id; magic\n"; for(int i = 0; i < totalOrders; i++) { order.SelectByIndex(i); ulong ticket = order.Ticket(); string orderInfo = StringFormat( "%d; %s; %s; %f; %s; %d; %s; %f; %f; %d; %s; %s; %d; %d\n", ticket, order.Symbol(), TimeToString(order.TimeSetup()), order.PriceOpen(), order.Type() == 0 ? "buy" : "sell", order.VolumeInitial(), order.Comment(), order.StopLoss(), order.TakeProfit(), HistoryOrderGetInteger(ticket, ORDER_STATE), TimeToString(HistoryOrderGetInteger(ticket,ORDER_TIME_DONE)), TimeToString(HistoryOrderGetInteger(ticket, ORDER_TIME_EXPIRATION)), HistoryOrderGetInteger(ticket, ORDER_POSITION_ID), HistoryOrderGetInteger(ticket, ORDER_MAGIC) ); StringAdd(orders, orderInfo); } return orders; } void WriteToFile(string terminalInfos, string historicalDeals, string historicalOrders, string accountInfos) { if(terminalInfos != NULL) { int fileHandler = FileOpen(terminalInfoName + ".csv", FILE_READ|FILE_WRITE|FILE_CSV|FILE_ANSI); FileSeek(fileHandler, 0, SEEK_SET); FileWrite(fileHandler, terminalInfos); FileClose(fileHandler); } if(historicalDeals != NULL) { int fileHandler = FileOpen(historyDealsName + ".csv", FILE_READ|FILE_WRITE|FILE_CSV|FILE_ANSI); FileSeek(fileHandler, 0, SEEK_SET); FileWrite(fileHandler, historicalDeals); FileClose(fileHandler); } if(historicalOrders != NULL) { int fileHandler = FileOpen(historyOrdersName + ".csv", FILE_READ|FILE_WRITE|FILE_CSV|FILE_ANSI); FileSeek(fileHandler, 0, SEEK_SET); FileWrite(fileHandler, historicalOrders); FileClose(fileHandler); } if(accountInfos != NULL) { int fileHandler = FileOpen(accountInfoName + ".csv", FILE_READ|FILE_WRITE|FILE_CSV|FILE_ANSI); FileSeek(fileHandler, 0, SEEK_SET); FileWrite(fileHandler, accountInfos); FileClose(fileHandler); } } void SendEmail(string terminalInfos, string historicalDeals, string historicalOrders, string accountInfos) { string emailSubject = NULL; string emailBody = NULL; if(terminalInfos != NULL) { emailSubject = AmmendEmailSubject(emailSubject, true, "Terminal Informations"); emailBody = AmmendEmailBody(emailBody, "Terminal Informations", terminalInfos); } if(historicalDeals != NULL) { emailSubject = AmmendEmailSubject(emailSubject, emailSubject == NULL, "Historical Deals"); emailBody = AmmendEmailBody(emailBody, "Historical Deals", historicalDeals); } if(historicalOrders != NULL) { emailSubject = AmmendEmailSubject(emailSubject, emailSubject == NULL, "Historical Orders"); emailBody = AmmendEmailBody(emailBody, "Historical Orders", historicalOrders); } if(accountInfos != NULL) { emailSubject = AmmendEmailSubject(emailSubject, emailSubject == NULL, "Account Informations"); emailBody = AmmendEmailBody(emailBody, "Account Informations", accountInfos); } if(!SendMail(emailSubject, emailBody)) { Alert("Email could not be sent with error code " + IntegerToString(GetLastError())); } } string AmmendEmailSubject(string subject, bool first, string newSubject) { if(!first) { subject = subject + " and "; } StringAdd(subject, newSubject); return subject; } string AmmendEmailBody(string body, string category, string newBody) { body = "\n" + body + "\n" + category + "\n" + newBody + "\n"; return body; } void WriteToGoogleSheet(string terminalInfos, string historicalDeals, string historicalOrders, string accountInfos) { if(terminalInfos != NULL) { StringReplace(terminalInfos, "\\", "/"); SheetExporter(terminalInfoName, terminalInfos); } if(historicalDeals != NULL) { SheetExporter(historyDealsName, historicalDeals); } if(historicalOrders != NULL) { SheetExporter(historyOrdersName, historicalOrders); } if(accountInfos != NULL) { SheetExporter(accountInfoName, accountInfos); } } void SheetExporter(string sheetName, string data) { string headers = "Content-Type: application/json\r\n"; char postData[], result[]; string responseHeaders; StringReplace(data, "\n", "#;#"); StringReplace(data, "; ", "#:#"); string jsonDataWithSheetName = StringFormat("{\"sheetName\": \"%s\", \"data\": \"%s\"}", sheetName, data); // Convert to char array StringToCharArray(jsonDataWithSheetName, postData, 0, StringLen(jsonDataWithSheetName), CP_UTF8); // Send POST request int res = WebRequest("POST", appsScriptUrl, headers, 5000, postData, result, responseHeaders); // Check response if(res != 200) { Alert("Account Infos not exported to Google Sheets returned error ", res, " and get last error is ", GetLastError()); } } //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { string terminalInfos = NULL; string historicalDeals = NULL; string historicalOrders = NULL; string accountInfos = NULL; if(exportTerminalInformations) terminalInfos = GetTerminalInfo(); if(exportHistoricalDeals) historicalDeals = GetHistoryDeals(); if(exportHistoricalOrders) historicalOrders = GetHistoryOrders(); if(exportAccountInfos) accountInfos = GetAccountInfo(); Print(terminalInfos); if(doYouWantToWriteToFile) { WriteToFile(terminalInfos, historicalDeals, historicalOrders, accountInfos); } if(doYouWantToSendEmail) { SendEmail(terminalInfos, historicalDeals, historicalOrders, accountInfos); } if(doYouWantToExportToGoogleSheet) { WriteToGoogleSheet(terminalInfos, historicalDeals, historicalOrders, accountInfos); } if(!doYouWantToWriteToFile && !doYouWantToExportToGoogleSheet && !doYouWantToSendEmail) { //Alert("You forgot to enable one of the export options provided"); } } //+------------------------------------------------------------------+