2026-03-18 12:10:52 -05:00 | | | //+------------------------------------------------------------------+
|
| | | //| Tools.mqh |
|
| | | //| Copyright 2025, Niquel Mendoza. |
|
| | | //| https://www.mql5.com/es/users/nique_372 |
|
| | | //+------------------------------------------------------------------+
|
| | | #property copyright "Copyright 2025, Niquel Mendoza."
|
| | | #property link "https://www.mql5.com/es/users/nique_372"
|
| | | #property strict
|
| | |
|
| | | #ifndef AIDATATASKRUNNER_BACKEND_TLGM_TOOLS_TOOLS_MQH
|
| | | #define AIDATATASKRUNNER_BACKEND_TLGM_TOOLS_TOOLS_MQH
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
| | | //--- Reciber
|
2026-04-25 18:03:47 -05:00 | | | #include <TSN\\AiFullTab\\TlgReciber.mqh>
|
2026-07-13 10:55:30 -05:00 | | | #include <TSN\\MQLArticles\\Utils\\EnumReg.mqh>
|
2026-03-18 12:10:52 -05:00 | | |
|
| | | //--- Protocolo de comunicacion con telegram
|
| | | #include "..\\Protocol\\Def.mqh"
|
| | |
|
2026-07-13 16:01:06 -05:00 | | | //--- Extra tools
|
| | | #include <TSN\\LLMBTools\\Main.mqh>
|
| | |
|
| | |
|
2026-07-13 10:55:30 -05:00 | | | //+------------------------------------------------------------------+
|
| | | //| Generador de id interno (correlacion con ChartEvent, no con el |
|
| | | //| id de tool_call del LLM: Run() es sincrono y ya no lo recibe) |
|
| | | //+------------------------------------------------------------------+
|
| | | namespace TSN
|
2026-06-03 22:07:50 -05:00 | | | {
|
2026-07-13 10:55:30 -05:00 | | | //---
|
| | | static int g_aitaskrunner_tool_counter = 0;
|
| | |
|
| | | //---
|
| | | #define AiTaskRunnerGenId(name) StringFormat("tlg_aitaskruner_%s_%d", name, ++g_aitaskrunner_tool_counter)
|
| | |
|
| | |
|
2026-03-18 12:10:52 -05:00 | | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | //| name: aidatataskrunner_get_task_total |
|
| | | //| desc: Returns the total number of tasks in the table |
|
| | | //| params: none |
|
2026-03-18 12:10:52 -05:00 | | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | class CAiTaskRunnerToolGetTaskTotal : public CLLmTool
|
2026-03-18 12:10:52 -05:00 | | | {
|
| | | private:
|
2026-04-01 13:21:12 -05:00 | | | const long m_panel_chart_id;
|
2026-03-18 12:10:52 -05:00 | | | const long m_bot_chart_id;
|
| | |
|
| | | public:
|
2026-04-01 13:21:12 -05:00 | | | CAiTaskRunnerToolGetTaskTotal(const long panel_chart_id, const long bot_chart_id)
|
2026-07-13 10:55:30 -05:00 | | | : CLLmTool("aidatataskrunner_get_task_total"),
|
2026-04-01 13:21:12 -05:00 | | | m_panel_chart_id(panel_chart_id), m_bot_chart_id(bot_chart_id)
|
2026-07-13 10:55:30 -05:00 | | | {}
|
2026-03-18 12:10:52 -05:00 | | | ~CAiTaskRunnerToolGetTaskTotal() {}
|
| | |
|
| | | //---
|
2026-07-15 12:35:26 -05:00 | | | void Run(CJsonNode ¶m, CJsonBuilderStr* &out) override final
|
2026-03-18 12:10:52 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | out = m_shared_builder;
|
2026-07-13 10:55:30 -05:00 | | | const string id = AiTaskRunnerGenId(m_name);
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.PutChar('"');
|
| | | m_shared_builder.Obj();
|
2026-04-01 13:21:12 -05:00 | | | if(!::EventChartCustom(m_panel_chart_id, AIDATATASKRUNER_API_ON_PARAM_CHANGE,
|
| | | m_bot_chart_id, double(AIDATATASKRUNER_API_TASK_TOTAL),
|
| | | AiDataTaskRunnerEmpaquetar(id, "")))
|
2026-07-13 10:55:30 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.KeyWV("ok").Val(false);
|
| | | m_shared_builder.KeyWV("error").ValS("Failed to dispatch get_task_total");
|
2026-07-13 10:55:30 -05:00 | | | }
|
2026-07-15 12:35:26 -05:00 | | | else
|
| | | {
|
| | | m_shared_builder.KeyWV("ok").Val(true);
|
| | | m_shared_builder.KeyWV("result").ValS("Queued | Result will appear in chat");
|
| | | }
|
| | | m_shared_builder.EndObj();
|
| | | m_shared_builder.PutChar('"');
|
2026-03-18 12:10:52 -05:00 | | | }
|
| | | };
|
| | |
|
| | |
|
| | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | //| name: aidatataskrunner_clean_all_tasks |
|
| | | //| desc: Cleans all tasks from the table that are not running or |
|
| | | //| queued |
|
| | | //| params: none |
|
2026-03-18 12:10:52 -05:00 | | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | class CAiTaskRunnerToolCleanAllTasks : public CLLmTool
|
2026-03-18 12:10:52 -05:00 | | | {
|
| | | private:
|
2026-04-01 13:21:12 -05:00 | | | const long m_panel_chart_id;
|
2026-03-18 12:10:52 -05:00 | | | const long m_bot_chart_id;
|
| | |
|
| | | public:
|
2026-04-01 13:21:12 -05:00 | | | CAiTaskRunnerToolCleanAllTasks(const long panel_chart_id, const long bot_chart_id)
|
2026-07-13 10:55:30 -05:00 | | | : CLLmTool("aidatataskrunner_clean_all_tasks"),
|
2026-04-01 13:21:12 -05:00 | | | m_panel_chart_id(panel_chart_id), m_bot_chart_id(bot_chart_id)
|
2026-07-13 10:55:30 -05:00 | | | {}
|
2026-03-18 12:10:52 -05:00 | | | ~CAiTaskRunnerToolCleanAllTasks() {}
|
| | |
|
| | | //---
|
2026-07-15 12:35:26 -05:00 | | | void Run(CJsonNode ¶m, CJsonBuilderStr* &out) override final
|
2026-03-18 12:10:52 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | out = m_shared_builder;
|
2026-07-13 10:55:30 -05:00 | | | const string id = AiTaskRunnerGenId(m_name);
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.PutChar('"');
|
| | | m_shared_builder.Obj();
|
2026-04-01 13:21:12 -05:00 | | | if(!::EventChartCustom(m_panel_chart_id, AIDATATASKRUNER_API_ON_PARAM_CHANGE,
|
| | | m_bot_chart_id, double(AIDATATASKRUNER_API_CLEAN_ALL_TASK_OF_TABLE),
|
| | | AiDataTaskRunnerEmpaquetar(id, "")))
|
2026-07-13 10:55:30 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.KeyWV("ok").Val(false);
|
| | | m_shared_builder.KeyWV("error").ValS("Failed to dispatch clean_all_tasks");
|
| | | }
|
| | | else
|
| | | {
|
| | | m_shared_builder.KeyWV("ok").Val(true);
|
| | | m_shared_builder.KeyWV("result").ValS("Queued | Cleaning tasks, result will appear in chat");
|
2026-07-13 10:55:30 -05:00 | | | }
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.EndObj();
|
| | | m_shared_builder.PutChar('"');
|
2026-03-18 12:10:52 -05:00 | | | }
|
| | | };
|
| | |
|
| | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | //| name: aidatataskrunner_execute_all_tasks |
|
| | | //| desc: Executes all pending tasks in the table |
|
| | | //| params: none |
|
2026-03-18 12:10:52 -05:00 | | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | class CAiTaskRunnerToolExecuteAllTasks : public CLLmTool
|
2026-03-18 12:10:52 -05:00 | | | {
|
| | | private:
|
2026-04-01 13:21:12 -05:00 | | | const long m_panel_chart_id;
|
2026-03-18 12:10:52 -05:00 | | | const long m_bot_chart_id;
|
| | |
|
| | | public:
|
2026-04-01 13:21:12 -05:00 | | | CAiTaskRunnerToolExecuteAllTasks(const long panel_chart_id, const long bot_chart_id)
|
2026-07-13 10:55:30 -05:00 | | | : CLLmTool("aidatataskrunner_execute_all_tasks"),
|
2026-04-01 13:21:12 -05:00 | | | m_panel_chart_id(panel_chart_id), m_bot_chart_id(bot_chart_id)
|
2026-07-13 10:55:30 -05:00 | | | {}
|
2026-03-18 12:10:52 -05:00 | | | ~CAiTaskRunnerToolExecuteAllTasks() {}
|
| | |
|
| | | //---
|
2026-07-15 12:35:26 -05:00 | | | void Run(CJsonNode ¶m, CJsonBuilderStr* &out) override final
|
2026-03-18 12:10:52 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | out = m_shared_builder;
|
2026-07-13 10:55:30 -05:00 | | | const string id = AiTaskRunnerGenId(m_name);
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.PutChar('"');
|
| | | m_shared_builder.Obj();
|
2026-04-01 13:21:12 -05:00 | | | if(!::EventChartCustom(m_panel_chart_id, AIDATATASKRUNER_API_ON_PARAM_CHANGE,
|
| | | m_bot_chart_id, double(AIDATATASKRUNER_API_EXECUTE_ALL_TASK_OF_TABLE),
|
| | | AiDataTaskRunnerEmpaquetar(id, "")))
|
2026-07-13 10:55:30 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.KeyWV("ok").Val(false);
|
| | | m_shared_builder.KeyWV("error").ValS("Failed to dispatch execute_all_tasks");
|
2026-07-13 10:55:30 -05:00 | | | }
|
2026-07-15 12:35:26 -05:00 | | | else
|
| | | {
|
| | | m_shared_builder.KeyWV("ok").Val(true);
|
| | | m_shared_builder.KeyWV("result").ValS("Queued | Executing all tasks, result will appear in chat");
|
| | | }
|
| | | m_shared_builder.EndObj();
|
| | | m_shared_builder.PutChar('"');
|
2026-03-18 12:10:52 -05:00 | | | }
|
| | | };
|
| | |
|
| | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | //| name: aidatataskrunner_get_main_folder |
|
| | | //| desc: Returns the main base folder path used by AiDataTaskRunner |
|
| | | //| params: none |
|
2026-03-18 12:10:52 -05:00 | | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | class CAiTaskRunnerToolGetMainFolder : public CLLmTool
|
2026-03-18 12:10:52 -05:00 | | | {
|
| | | private:
|
2026-04-01 13:21:12 -05:00 | | | const long m_panel_chart_id;
|
2026-03-18 12:10:52 -05:00 | | | const long m_bot_chart_id;
|
| | |
|
| | | public:
|
2026-04-01 13:21:12 -05:00 | | | CAiTaskRunnerToolGetMainFolder(const long panel_chart_id, const long bot_chart_id)
|
2026-07-13 10:55:30 -05:00 | | | : CLLmTool("aidatataskrunner_get_main_folder"),
|
2026-04-01 13:21:12 -05:00 | | | m_panel_chart_id(panel_chart_id), m_bot_chart_id(bot_chart_id)
|
2026-07-13 10:55:30 -05:00 | | | {}
|
2026-03-18 12:10:52 -05:00 | | | ~CAiTaskRunnerToolGetMainFolder() {}
|
| | |
|
| | | //---
|
2026-07-15 12:35:26 -05:00 | | | void Run(CJsonNode ¶m, CJsonBuilderStr* &out) override final
|
2026-03-18 12:10:52 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | out = m_shared_builder;
|
2026-07-13 10:55:30 -05:00 | | | const string id = AiTaskRunnerGenId(m_name);
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.PutChar('"');
|
| | | m_shared_builder.Obj();
|
2026-04-01 13:21:12 -05:00 | | | if(!::EventChartCustom(m_panel_chart_id, AIDATATASKRUNER_API_ON_PARAM_CHANGE,
|
| | | m_bot_chart_id, double(AIDATATASKRUNER_API_MAIN_FOLDER),
|
| | | AiDataTaskRunnerEmpaquetar(id, "")))
|
2026-07-13 10:55:30 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.KeyWV("ok").Val(false);
|
| | | m_shared_builder.KeyWV("error").ValS("Failed to dispatch get_main_folder");
|
| | | }
|
| | | else
|
| | | {
|
| | | m_shared_builder.KeyWV("ok").Val(true);
|
| | | m_shared_builder.KeyWV("result").ValS("Queued | Result will appear in chat");
|
2026-07-13 10:55:30 -05:00 | | | }
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.EndObj();
|
| | | m_shared_builder.PutChar('"');
|
2026-03-18 12:10:52 -05:00 | | | }
|
| | | };
|
| | |
|
| | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | //| name: aidatataskrunner_get_task_folder |
|
| | | //| desc: Returns the tasks folder path used by AiDataTaskRunner |
|
| | | //| params: none |
|
2026-03-18 12:10:52 -05:00 | | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | class CAiTaskRunnerToolGetTaskFolder : public CLLmTool
|
2026-03-18 12:10:52 -05:00 | | | {
|
| | | private:
|
2026-04-01 13:21:12 -05:00 | | | const long m_panel_chart_id;
|
2026-03-18 12:10:52 -05:00 | | | const long m_bot_chart_id;
|
| | |
|
| | | public:
|
2026-04-01 13:21:12 -05:00 | | | CAiTaskRunnerToolGetTaskFolder(const long panel_chart_id, const long bot_chart_id)
|
2026-07-13 10:55:30 -05:00 | | | : CLLmTool("aidatataskrunner_get_task_folder"),
|
2026-04-01 13:21:12 -05:00 | | | m_panel_chart_id(panel_chart_id), m_bot_chart_id(bot_chart_id)
|
2026-07-13 10:55:30 -05:00 | | | {}
|
2026-03-18 12:10:52 -05:00 | | | ~CAiTaskRunnerToolGetTaskFolder() {}
|
| | |
|
| | | //---
|
2026-07-15 12:35:26 -05:00 | | | void Run(CJsonNode ¶m, CJsonBuilderStr* &out) override final
|
2026-03-18 12:10:52 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | out = m_shared_builder;
|
2026-07-13 10:55:30 -05:00 | | | const string id = AiTaskRunnerGenId(m_name);
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.PutChar('"');
|
| | | m_shared_builder.Obj();
|
2026-04-01 13:21:12 -05:00 | | | if(!::EventChartCustom(m_panel_chart_id, AIDATATASKRUNER_API_ON_PARAM_CHANGE,
|
| | | m_bot_chart_id, double(AIDATATASKRUNER_API_TASK_FOLDER),
|
| | | AiDataTaskRunnerEmpaquetar(id, "")))
|
2026-07-13 10:55:30 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.KeyWV("ok").Val(false);
|
| | | m_shared_builder.KeyWV("error").ValS("Failed to dispatch get_task_folder");
|
2026-07-13 10:55:30 -05:00 | | | }
|
2026-07-15 12:35:26 -05:00 | | | else
|
| | | {
|
| | | m_shared_builder.KeyWV("ok").Val(true);
|
| | | m_shared_builder.KeyWV("result").ValS("Queued | Result will appear in chat");
|
| | | }
|
| | | m_shared_builder.EndObj();
|
| | | m_shared_builder.PutChar('"');
|
2026-03-18 12:10:52 -05:00 | | | }
|
| | | };
|
| | |
|
| | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | //| name: aidatataskrunner_is_in_commonfolder |
|
| | | //| desc: Returns whether AiDataTaskRunner is using the MT5 common |
|
| | | //| folder |
|
| | | //| params: none |
|
2026-03-18 12:10:52 -05:00 | | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | class CAiTaskRunnerToolIsInCommonFolder : public CLLmTool
|
2026-03-18 12:10:52 -05:00 | | | {
|
| | | private:
|
2026-04-01 13:21:12 -05:00 | | | const long m_panel_chart_id;
|
2026-03-18 12:10:52 -05:00 | | | const long m_bot_chart_id;
|
| | |
|
| | | public:
|
2026-04-01 13:21:12 -05:00 | | | CAiTaskRunnerToolIsInCommonFolder(const long panel_chart_id, const long bot_chart_id)
|
2026-07-13 10:55:30 -05:00 | | | : CLLmTool("aidatataskrunner_is_in_commonfolder"),
|
2026-04-01 13:21:12 -05:00 | | | m_panel_chart_id(panel_chart_id), m_bot_chart_id(bot_chart_id)
|
2026-07-13 10:55:30 -05:00 | | | {}
|
2026-03-18 12:10:52 -05:00 | | | ~CAiTaskRunnerToolIsInCommonFolder() {}
|
| | |
|
| | | //---
|
2026-07-15 12:35:26 -05:00 | | | void Run(CJsonNode ¶m, CJsonBuilderStr* &out) override final
|
2026-03-18 12:10:52 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | out = m_shared_builder;
|
2026-07-13 10:55:30 -05:00 | | | const string id = AiTaskRunnerGenId(m_name);
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.PutChar('"');
|
| | | m_shared_builder.Obj();
|
2026-04-01 13:21:12 -05:00 | | | if(!::EventChartCustom(m_panel_chart_id, AIDATATASKRUNER_API_ON_PARAM_CHANGE,
|
| | | m_bot_chart_id, double(AIDATATASKRUNER_API_IS_IN_COMMON_FOLDER),
|
| | | AiDataTaskRunnerEmpaquetar(id, "")))
|
2026-07-13 10:55:30 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.KeyWV("ok").Val(false);
|
| | | m_shared_builder.KeyWV("error").ValS("Failed to dispatch is_in_commonfolder");
|
| | | }
|
| | | else
|
| | | {
|
| | | m_shared_builder.KeyWV("ok").Val(true);
|
| | | m_shared_builder.KeyWV("result").ValS("Queued | Result will appear in chat");
|
2026-07-13 10:55:30 -05:00 | | | }
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.EndObj();
|
| | | m_shared_builder.PutChar('"');
|
2026-03-18 12:10:52 -05:00 | | | }
|
| | | };
|
| | |
|
| | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | //| name: aidatataskrunner_add_task |
|
| | | //| desc: Adds a new backtest task to the AiDataTaskRunner table |
|
| | | //| params (definir schema en JSON, requeridos: symbol, start_date, |
|
| | | //| end_date): |
|
| | | //| symbol string Trading symbol e.g. EURUSD, XAUUSD |
|
| | | //| start_date string Start date format YYYY.MM.DD HH:MM |
|
| | | //| end_date string End date format YYYY.MM.DD HH:MM |
|
| | | //| timeframe string enum: _Period,M1,M2,M3,M4,M5,M6,M10, |
|
| | | //| M12,M15,M20,M30,H1,H2,H3,H4,H6,H8,H12, |
|
| | | //| D1,W1,MN1 |
|
| | | //| set_file string Optional .set file path for EA params |
|
| | | //| symbol_folder string Optional subfolder name for grouping |
|
| | | //| label string Optional strategy name (folder prefix) |
|
| | | //| label_id string Optional variant id, default 0 |
|
| | | //+------------------------------------------------------------------+
|
| | | class CAiTaskRunnerToolAddTask : public CLLmTool
|
2026-03-18 12:10:52 -05:00 | | | {
|
| | | private:
|
2026-04-01 13:21:12 -05:00 | | | const long m_panel_chart_id;
|
2026-03-18 12:10:52 -05:00 | | | const long m_bot_chart_id;
|
| | |
|
| | | public:
|
2026-07-13 10:55:30 -05:00 | | | CAiTaskRunnerToolAddTask(const long panel_chart_id, const long bot_chart_id)
|
| | | : CLLmTool("aidatataskrunner_add_task"),
|
| | | m_panel_chart_id(panel_chart_id), m_bot_chart_id(bot_chart_id)
|
| | | {}
|
2026-03-18 12:10:52 -05:00 | | | ~CAiTaskRunnerToolAddTask(void) {}
|
| | |
|
2026-07-15 12:35:26 -05:00 | | | void Run(CJsonNode ¶m, CJsonBuilderStr* &out) override final;
|
2026-03-18 12:10:52 -05:00 | | | };
|
| | |
|
| | | //+------------------------------------------------------------------+
|
2026-07-15 12:35:26 -05:00 | | | void CAiTaskRunnerToolAddTask::Run(CJsonNode ¶m, CJsonBuilderStr* &out)
|
2026-03-18 12:10:52 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | out = m_shared_builder;
|
2026-07-13 10:55:30 -05:00 | | | const string symbol = param["symbol"].ToString();
|
| | | const string start_date = param["start_date"].ToString();
|
| | | const string end_date = param["end_date"].ToString();
|
| | | const int timeframe = CEnumRegBasis::GetValNoRef<int>(param["timeframe"].ToString("_Period"), _Period);
|
| | | const string set_file = param["set_file"].ToString("");
|
| | | const string symbol_folder = param["symbol_folder"].ToString("");
|
| | | const string label = param["label"].ToString("");
|
| | | const string label_id = param["label_id"].ToString("0");
|
2026-03-18 12:10:52 -05:00 | | |
|
| | | //---
|
| | | /*
|
| | | //---
|
| | | __forceinline string ToStringFile()
|
| | | {
|
| | | return StringFormat("%d|%s|%s|%s|%s|%s|%s|%d",
|
| | | int(timeframe), // [0]
|
| | | symbol, // [1]
|
| | | set_file, // [2]
|
| | | TimeToString(start_date), // [3]
|
| | | TimeToString(end_date), // [4]
|
| | | symbol_folder, // [5]
|
| | | label, // [6]
|
| | | label_id); // [7]
|
| | | }
|
| | | */
|
| | |
|
| | | //---
|
| | | const string val = StringFormat("%d|%s|%s|%s|%s|%s|%s|%s",
|
| | | timeframe, symbol, set_file,
|
| | | start_date, end_date,
|
| | | symbol_folder, label, label_id);
|
| | |
|
| | | //---
|
2026-07-13 10:55:30 -05:00 | | | const string id = AiTaskRunnerGenId(m_name);
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.PutChar('"');
|
| | | m_shared_builder.Obj();
|
2026-04-01 13:21:12 -05:00 | | | if(!::EventChartCustom(m_panel_chart_id, AIDATATASKRUNER_API_ON_PARAM_CHANGE,
|
| | | m_bot_chart_id, double(AIDATATASKRUNER_API_ADD_TASK_TO_TABLE),
|
| | | AiDataTaskRunnerEmpaquetar(id, val)))
|
2026-07-13 10:55:30 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.KeyWV("ok").Val(false);
|
| | | m_shared_builder.KeyWV("error").ValS("Failed to dispatch add_task");
|
2026-07-13 10:55:30 -05:00 | | | }
|
2026-07-15 12:35:26 -05:00 | | | else
|
| | | {
|
| | | m_shared_builder.KeyWV("ok").Val(true);
|
| | | m_shared_builder.KeyWV("result").ValS("Queued | Task added to table");
|
| | | }
|
| | | m_shared_builder.EndObj();
|
| | | m_shared_builder.PutChar('"');
|
2026-03-18 12:10:52 -05:00 | | | }
|
| | |
|
| | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | //| name: aidatataskrunner_save_tasks_to_file |
|
| | | //| desc: Saves all tasks to a CSV file. Can filter to save only |
|
| | | //| unfinished tasks (pending, queued or in process) |
|
| | | //| params (requeridos: file_name, only_unfinished): |
|
| | | //| file_name string Absolute path inside MT5 Files\\ or |
|
| | | //| Common\\Files\\, extension .csv |
|
| | | //| only_unfinished boolean If true saves only pending/queued/in- |
|
| | | //| process tasks, else saves all |
|
2026-03-18 12:10:52 -05:00 | | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | class CAiTaskRunnerToolSaveTasksToFile : public CLLmTool
|
2026-03-18 12:10:52 -05:00 | | | {
|
| | | private:
|
2026-04-01 13:21:12 -05:00 | | | const long m_panel_chart_id;
|
2026-03-18 12:10:52 -05:00 | | | const long m_bot_chart_id;
|
| | |
|
| | | public:
|
2026-07-13 10:55:30 -05:00 | | | CAiTaskRunnerToolSaveTasksToFile(const long panel_chart_id, const long bot_chart_id)
|
| | | : CLLmTool("aidatataskrunner_save_tasks_to_file"),
|
| | | m_panel_chart_id(panel_chart_id), m_bot_chart_id(bot_chart_id)
|
| | | {}
|
2026-03-18 12:10:52 -05:00 | | | ~CAiTaskRunnerToolSaveTasksToFile(void) {}
|
| | |
|
2026-07-15 12:35:26 -05:00 | | | void Run(CJsonNode ¶m, CJsonBuilderStr* &out) override final;
|
2026-03-18 12:10:52 -05:00 | | | };
|
| | |
|
| | | //+------------------------------------------------------------------+
|
2026-07-15 12:35:26 -05:00 | | | void CAiTaskRunnerToolSaveTasksToFile::Run(CJsonNode ¶m, CJsonBuilderStr* &out)
|
2026-03-18 12:10:52 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | out = m_shared_builder;
|
2026-07-13 10:55:30 -05:00 | | | const string file_name = param["file_name"].ToString();
|
| | | const bool only_unfinished = param["only_unfinished"].ToBool(false);
|
2026-03-18 12:10:52 -05:00 | | |
|
| | | //---
|
| | | const string val = StringFormat("%d|%s", int(only_unfinished), file_name);
|
| | |
|
| | | //---
|
2026-07-13 10:55:30 -05:00 | | | const string id = AiTaskRunnerGenId(m_name);
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.PutChar('"');
|
| | | m_shared_builder.Obj();
|
2026-04-01 13:21:12 -05:00 | | | if(!::EventChartCustom(m_panel_chart_id, AIDATATASKRUNER_API_ON_PARAM_CHANGE,
|
| | | m_bot_chart_id, double(AIDATATASKRUNER_API_SAVE_TASK_IN_FILE),
|
| | | AiDataTaskRunnerEmpaquetar(id, val)))
|
2026-07-13 10:55:30 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.KeyWV("ok").Val(false);
|
| | | m_shared_builder.KeyWV("error").ValS("Failed to dispatch save_tasks_to_file");
|
2026-07-13 10:55:30 -05:00 | | | }
|
2026-07-15 12:35:26 -05:00 | | | else
|
| | | {
|
| | | m_shared_builder.KeyWV("ok").Val(true);
|
| | | m_shared_builder.KeyWV("result").ValS("Queued | Saving tasks to file");
|
| | | }
|
| | | m_shared_builder.EndObj();
|
| | | m_shared_builder.PutChar('"');
|
2026-03-18 12:10:52 -05:00 | | | }
|
| | |
|
| | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | //| name: aidatataskrunner_load_tasks_from_file |
|
| | | //| desc: Loads tasks from a CSV file into the table |
|
| | | //| params (requerido: file_name): |
|
| | | //| file_name string Absolute path inside MT5 Files\\ or |
|
| | | //| Common\\Files\\, extension .csv |
|
2026-03-18 12:10:52 -05:00 | | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | class CAiTaskRunnerToolLoadTasksFromFile : public CLLmTool
|
2026-03-18 12:10:52 -05:00 | | | {
|
| | | private:
|
2026-04-01 13:21:12 -05:00 | | | const long m_panel_chart_id;
|
2026-03-18 12:10:52 -05:00 | | | const long m_bot_chart_id;
|
| | |
|
| | | public:
|
2026-07-13 10:55:30 -05:00 | | | CAiTaskRunnerToolLoadTasksFromFile(const long panel_chart_id, const long bot_chart_id)
|
| | | : CLLmTool("aidatataskrunner_load_tasks_from_file"),
|
| | | m_panel_chart_id(panel_chart_id), m_bot_chart_id(bot_chart_id)
|
| | | {}
|
2026-03-18 12:10:52 -05:00 | | | ~CAiTaskRunnerToolLoadTasksFromFile(void) {}
|
| | |
|
2026-07-15 12:35:26 -05:00 | | | void Run(CJsonNode ¶m, CJsonBuilderStr* &out) override final;
|
2026-03-18 12:10:52 -05:00 | | | };
|
| | |
|
| | | //+------------------------------------------------------------------+
|
2026-07-15 12:35:26 -05:00 | | | void CAiTaskRunnerToolLoadTasksFromFile::Run(CJsonNode ¶m, CJsonBuilderStr* &out)
|
2026-03-18 12:10:52 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | out = m_shared_builder;
|
2026-07-13 10:55:30 -05:00 | | | const string file_name = param["file_name"].ToString();
|
2026-03-18 12:10:52 -05:00 | | |
|
| | | //---
|
2026-07-13 10:55:30 -05:00 | | | const string id = AiTaskRunnerGenId(m_name);
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.PutChar('"');
|
| | | m_shared_builder.Obj();
|
2026-04-01 13:21:12 -05:00 | | | if(!::EventChartCustom(m_panel_chart_id, AIDATATASKRUNER_API_ON_PARAM_CHANGE,
|
| | | m_bot_chart_id, double(AIDATATASKRUNER_API_LOAD_TASK_IN_FILE),
|
| | | AiDataTaskRunnerEmpaquetar(id, file_name)))
|
2026-07-13 10:55:30 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.KeyWV("ok").Val(false);
|
| | | m_shared_builder.KeyWV("error").ValS("Failed to dispatch load_tasks_from_file");
|
2026-07-13 10:55:30 -05:00 | | | }
|
2026-07-15 12:35:26 -05:00 | | | else
|
| | | {
|
| | | m_shared_builder.KeyWV("ok").Val(true);
|
| | | m_shared_builder.KeyWV("result").ValS("Queued | Loading tasks from file");
|
| | | }
|
| | | m_shared_builder.EndObj();
|
| | | m_shared_builder.PutChar('"');
|
2026-03-18 12:10:52 -05:00 | | | }
|
| | |
|
| | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | //| name: aidatataskrunner_load_config |
|
| | | //| desc: Loads the panel configuration from a file |
|
| | | //| params (requerido: file_name): |
|
| | | //| file_name string Absolute path inside MT5 Files\\ or |
|
| | | //| Common\\Files\\, extension .txt |
|
2026-03-18 12:10:52 -05:00 | | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | class CAiTaskRunnerToolLoadConfig : public CLLmTool
|
2026-03-18 12:10:52 -05:00 | | | {
|
| | | private:
|
2026-04-01 13:21:12 -05:00 | | | const long m_panel_chart_id;
|
2026-03-18 12:10:52 -05:00 | | | const long m_bot_chart_id;
|
| | |
|
| | | public:
|
2026-07-13 10:55:30 -05:00 | | | CAiTaskRunnerToolLoadConfig(const long panel_chart_id, const long bot_chart_id)
|
| | | : CLLmTool("aidatataskrunner_load_config"),
|
| | | m_panel_chart_id(panel_chart_id), m_bot_chart_id(bot_chart_id)
|
| | | {}
|
2026-03-18 12:10:52 -05:00 | | | ~CAiTaskRunnerToolLoadConfig(void) {}
|
| | |
|
2026-07-15 12:35:26 -05:00 | | | void Run(CJsonNode ¶m, CJsonBuilderStr* &out) override final;
|
2026-03-18 12:10:52 -05:00 | | | };
|
| | |
|
| | | //+------------------------------------------------------------------+
|
2026-07-15 12:35:26 -05:00 | | | void CAiTaskRunnerToolLoadConfig::Run(CJsonNode ¶m, CJsonBuilderStr* &out)
|
2026-03-18 12:10:52 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | out = m_shared_builder;
|
2026-07-13 10:55:30 -05:00 | | | const string file_name = param["file_name"].ToString();
|
2026-03-18 12:10:52 -05:00 | | |
|
| | | //---
|
2026-07-13 10:55:30 -05:00 | | | const string id = AiTaskRunnerGenId(m_name);
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.PutChar('"');
|
| | | m_shared_builder.Obj();
|
2026-04-01 13:21:12 -05:00 | | | if(!::EventChartCustom(m_panel_chart_id, AIDATATASKRUNER_API_ON_PARAM_CHANGE,
|
| | | m_bot_chart_id, double(AIDATATASKRUNER_API_LOAD_CONFIG_IN_FILE),
|
| | | AiDataTaskRunnerEmpaquetar(id, file_name)))
|
2026-07-13 10:55:30 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.KeyWV("ok").Val(false);
|
| | | m_shared_builder.KeyWV("error").ValS("Failed to dispatch load_config");
|
2026-07-13 10:55:30 -05:00 | | | }
|
2026-07-15 12:35:26 -05:00 | | | else
|
| | | {
|
| | | m_shared_builder.KeyWV("ok").Val(true);
|
| | | m_shared_builder.KeyWV("result").ValS("Queued | Loading config from file");
|
| | | }
|
| | | m_shared_builder.EndObj();
|
| | | m_shared_builder.PutChar('"');
|
2026-03-18 12:10:52 -05:00 | | | }
|
| | |
|
| | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | //| name: aidatataskrunner_save_config |
|
| | | //| desc: Saves the current panel configuration to a file |
|
| | | //| params (requerido: file_name): |
|
| | | //| file_name string Absolute path inside MT5 Files\\ or |
|
| | | //| Common\\Files\\, extension .txt |
|
2026-03-18 12:10:52 -05:00 | | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | class CAiTaskRunnerToolSaveConfig : public CLLmTool
|
2026-03-18 12:10:52 -05:00 | | | {
|
| | | private:
|
2026-04-01 13:21:12 -05:00 | | | const long m_panel_chart_id;
|
2026-03-18 12:10:52 -05:00 | | | const long m_bot_chart_id;
|
| | |
|
| | | public:
|
2026-07-13 10:55:30 -05:00 | | | CAiTaskRunnerToolSaveConfig(const long panel_chart_id, const long bot_chart_id)
|
| | | : CLLmTool("aidatataskrunner_save_config"),
|
| | | m_panel_chart_id(panel_chart_id), m_bot_chart_id(bot_chart_id)
|
| | | {}
|
2026-03-18 12:10:52 -05:00 | | | ~CAiTaskRunnerToolSaveConfig(void) {}
|
| | |
|
2026-07-15 12:35:26 -05:00 | | | void Run(CJsonNode ¶m, CJsonBuilderStr* &out) override final;
|
2026-03-18 12:10:52 -05:00 | | | };
|
| | |
|
| | | //+------------------------------------------------------------------+
|
2026-07-15 12:35:26 -05:00 | | | void CAiTaskRunnerToolSaveConfig::Run(CJsonNode ¶m, CJsonBuilderStr* &out)
|
2026-03-18 12:10:52 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | out = m_shared_builder;
|
2026-07-13 10:55:30 -05:00 | | | const string file_name = param["file_name"].ToString();
|
2026-03-18 12:10:52 -05:00 | | |
|
| | | //---
|
2026-07-13 10:55:30 -05:00 | | | const string id = AiTaskRunnerGenId(m_name);
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.PutChar('"');
|
| | | m_shared_builder.Obj();
|
2026-04-01 13:21:12 -05:00 | | | if(!::EventChartCustom(m_panel_chart_id, AIDATATASKRUNER_API_ON_PARAM_CHANGE,
|
| | | m_bot_chart_id, double(AIDATATASKRUNER_API_SAVE_CONFIG_IN_FILE),
|
| | | AiDataTaskRunnerEmpaquetar(id, file_name)))
|
2026-07-13 10:55:30 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.KeyWV("ok").Val(false);
|
| | | m_shared_builder.KeyWV("error").ValS("Failed to dispatch save_config");
|
2026-07-13 10:55:30 -05:00 | | | }
|
2026-07-15 12:35:26 -05:00 | | | else
|
| | | {
|
| | | m_shared_builder.KeyWV("ok").Val(true);
|
| | | m_shared_builder.KeyWV("result").ValS("Queued | Saving config to file");
|
| | | }
|
| | | m_shared_builder.EndObj();
|
| | | m_shared_builder.PutChar('"');
|
2026-03-18 12:10:52 -05:00 | | | }
|
| | |
|
| | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | //| name: aidatataskrunner_get_task_by_index |
|
| | | //| desc: Returns the details of a task by its index in the table |
|
| | | //| params (requerido: index): |
|
| | | //| index integer Zero-based index of the task in the table. Use |
|
| | | //| aidatataskrunner_get_task_total to know total |
|
2026-03-18 12:10:52 -05:00 | | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | class CAiTaskRunnerToolGetTaskByIndex : public CLLmTool
|
2026-03-18 12:10:52 -05:00 | | | {
|
| | | private:
|
2026-04-01 13:21:12 -05:00 | | | const long m_panel_chart_id;
|
2026-03-18 12:10:52 -05:00 | | | const long m_bot_chart_id;
|
| | |
|
| | | public:
|
2026-07-13 10:55:30 -05:00 | | | CAiTaskRunnerToolGetTaskByIndex(const long panel_chart_id, const long bot_chart_id)
|
| | | : CLLmTool("aidatataskrunner_get_task_by_index"),
|
| | | m_panel_chart_id(panel_chart_id), m_bot_chart_id(bot_chart_id)
|
| | | {}
|
2026-03-18 12:10:52 -05:00 | | | ~CAiTaskRunnerToolGetTaskByIndex(void) {}
|
| | |
|
2026-07-15 12:35:26 -05:00 | | | void Run(CJsonNode ¶m, CJsonBuilderStr* &out) override final;
|
2026-03-18 12:10:52 -05:00 | | | };
|
| | |
|
| | | //+------------------------------------------------------------------+
|
2026-07-15 12:35:26 -05:00 | | | void CAiTaskRunnerToolGetTaskByIndex::Run(CJsonNode ¶m, CJsonBuilderStr* &out)
|
2026-03-18 12:10:52 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | out = m_shared_builder;
|
2026-07-13 10:55:30 -05:00 | | | const string index = param["index"].ToString();
|
2026-03-18 12:10:52 -05:00 | | |
|
| | | //---
|
2026-07-13 10:55:30 -05:00 | | | const string id = AiTaskRunnerGenId(m_name);
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.PutChar('"');
|
| | | m_shared_builder.Obj();
|
2026-04-01 13:21:12 -05:00 | | | if(!::EventChartCustom(m_panel_chart_id, AIDATATASKRUNER_API_ON_PARAM_CHANGE,
|
| | | m_bot_chart_id, double(AIDATATASKRUNER_API_GET_TASK_BY_INDEX),
|
| | | AiDataTaskRunnerEmpaquetar(id, index)))
|
2026-07-13 10:55:30 -05:00 | | | {
|
2026-07-15 12:35:26 -05:00 | | | m_shared_builder.KeyWV("ok").Val(false);
|
| | | m_shared_builder.KeyWV("error").ValS("Failed to dispatch get_task_by_index");
|
2026-07-13 10:55:30 -05:00 | | | }
|
2026-07-15 12:35:26 -05:00 | | | else
|
| | | {
|
| | | m_shared_builder.KeyWV("ok").Val(true);
|
| | | m_shared_builder.KeyWV("result").ValS("Queued | Result will appear in chat");
|
| | | }
|
| | | m_shared_builder.EndObj();
|
| | | m_shared_builder.PutChar('"');
|
2026-03-18 12:10:52 -05:00 | | | }
|
2026-07-13 10:55:30 -05:00 | | | }
|
2026-03-18 12:10:52 -05:00 | | | //+------------------------------------------------------------------+
|
2026-07-13 10:55:30 -05:00 | | | #endif // AIDATATASKRUNNER_BACKEND_TLGM_TOOLS_TOOLS_MQH
|