//+------------------------------------------------------------------+ //| Functions.mqh | //| Copyright 2026, Niquel Mendoza. | //| https://www.mql5.com/es/users/nique_372 | //+------------------------------------------------------------------+ #property copyright "Copyright 2026, Niquel Mendoza." #property link "https://www.mql5.com/es/users/nique_372" #property strict #ifndef AIDATATASKRUNNER_BACKEND_MCP_FUNCTIONS_MQH #define AIDATATASKRUNNER_BACKEND_MCP_FUNCTIONS_MQH //+------------------------------------------------------------------+ //| Include | //+------------------------------------------------------------------+ #include #include #include "..\\Api\\Protocol\\Def.mqh" //+------------------------------------------------------------------+ //| Base comun para todas las funciones async de AiDataTaskRunner | //+------------------------------------------------------------------+ class CMcpFuncAiTaskRunnerBase : public CMcpFunction { protected: //--- Miembros const long m_chart_id_panel; const long m_current_chart_id; //--- Funciones bool DispatchToPanel(const uint8_t event_id, const string val, string& res); bool TryUnpack(const string& sparam, string& val); public: CMcpFuncAiTaskRunnerBase(const string& func_name, const long chart_id_panel, const long curr_chart_id) : CMcpFunction(MCPSERVERBYLEO_FLAG_CHARTEVENT, true, func_name), m_chart_id_panel(chart_id_panel), m_current_chart_id(curr_chart_id) {} ~CMcpFuncAiTaskRunnerBase(void) {} }; //+------------------------------------------------------------------+ bool CMcpFuncAiTaskRunnerBase::DispatchToPanel(const uint8_t event_id, const string val, string& res) { if(!::EventChartCustom(m_chart_id_panel, AIDATATASKRUNER_API_ON_PARAM_CHANGE, m_current_chart_id, double(event_id), AiDataTaskRunnerEmpaquetar("mcp_server_aidata", val))) { res = "{\"ok\":false,\"error\":\"dispatch_failed\"}"; return false; } return true; } //+------------------------------------------------------------------+ bool CMcpFuncAiTaskRunnerBase::TryUnpack(const string& sparam, string& val) { static string id_call_recv; if(!AiDataTaskRunnerDesempaquetar(sparam, id_call_recv, val)) return false; return true; } //+------------------------------------------------------------------+ #define CMcpFuncAiTaskRunnerBase_BuildResult(dparam, val) StringFormat("{\"ok\":%s,\"result\":\"%s\"}", (dparam == AIDATATASKRUNER_API_RES_EXITO ? "true" : "false"), val) //+------------------------------------------------------------------+ //| get_task_total | //+------------------------------------------------------------------+ class CMcpFuncAiTaskRunnerGetTaskTotal : public CMcpFuncAiTaskRunnerBase { public: CMcpFuncAiTaskRunnerGetTaskTotal(const long chart_id_panel, const long curr_chart_id) : CMcpFuncAiTaskRunnerBase("aidatataskrunner_get_task_total", chart_id_panel, curr_chart_id) {} ~CMcpFuncAiTaskRunnerGetTaskTotal(void) {} //--- void Run(CJsonNode& param, string& res) override final { DispatchToPanel(AIDATATASKRUNER_API_TASK_TOTAL, "", res); } //--- void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam) override final { if(id != CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE) return; if(lparam != AIDATATASKRUNER_API_TASK_TOTAL) return; static string val; if(!TryUnpack(sparam, val)) return; m_mcp_server._RecibedEvent(CMcpFuncAiTaskRunnerBase_BuildResult(dparam, val)); } }; //+------------------------------------------------------------------+ //| get_task_by_index | //+------------------------------------------------------------------+ class CMcpFuncAiTaskRunnerGetTaskByIndex : public CMcpFuncAiTaskRunnerBase { public: CMcpFuncAiTaskRunnerGetTaskByIndex(const long chart_id_panel, const long curr_chart_id) : CMcpFuncAiTaskRunnerBase("aidatataskrunner_get_task_by_index", chart_id_panel, curr_chart_id) {} ~CMcpFuncAiTaskRunnerGetTaskByIndex(void) {} //--- void Run(CJsonNode& param, string& res) override final { DispatchToPanel(AIDATATASKRUNER_API_GET_TASK_BY_INDEX, param["index"].ToString(), res); } //--- void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam) override final { if(id != CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE) return; if(lparam != AIDATATASKRUNER_API_GET_TASK_BY_INDEX) return; static string val; if(!TryUnpack(sparam, val)) return; m_mcp_server._RecibedEvent(CMcpFuncAiTaskRunnerBase_BuildResult(dparam, val)); } }; //+------------------------------------------------------------------+ //| get_task_status | //+------------------------------------------------------------------+ class CMcpFuncAiTaskRunnerGetTaskStatus : public CMcpFuncAiTaskRunnerBase { public: CMcpFuncAiTaskRunnerGetTaskStatus(const long chart_id_panel, const long curr_chart_id) : CMcpFuncAiTaskRunnerBase("aidatataskrunner_get_task_status", chart_id_panel, curr_chart_id) {} ~CMcpFuncAiTaskRunnerGetTaskStatus(void) {} //--- void Run(CJsonNode& param, string& res) override final { DispatchToPanel(AIDATATASKRUNER_API_GET_TASK_STATUS, param["index"].ToString(), res); } //--- void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam) override final { if(id != CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE) return; if(lparam != AIDATATASKRUNER_API_GET_TASK_STATUS) return; static string val; if(!TryUnpack(sparam, val)) return; m_mcp_server._RecibedEvent(CMcpFuncAiTaskRunnerBase_BuildResult(dparam, val)); } }; //+------------------------------------------------------------------+ //| get_main_folder | //+------------------------------------------------------------------+ class CMcpFuncAiTaskRunnerGetMainFolder : public CMcpFuncAiTaskRunnerBase { public: CMcpFuncAiTaskRunnerGetMainFolder(const long chart_id_panel, const long curr_chart_id) : CMcpFuncAiTaskRunnerBase("aidatataskrunner_get_main_folder", chart_id_panel, curr_chart_id) {} ~CMcpFuncAiTaskRunnerGetMainFolder(void) {} //--- void Run(CJsonNode& param, string& res) override final { DispatchToPanel(AIDATATASKRUNER_API_MAIN_FOLDER, "", res); } //--- void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam) override final { if(id != CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE) return; if(lparam != AIDATATASKRUNER_API_MAIN_FOLDER) return; static string val; if(!TryUnpack(sparam, val)) return; m_mcp_server._RecibedEvent(CMcpFuncAiTaskRunnerBase_BuildResult(dparam, val)); } }; //+------------------------------------------------------------------+ //| get_task_folder | //+------------------------------------------------------------------+ class CMcpFuncAiTaskRunnerGetTaskFolder : public CMcpFuncAiTaskRunnerBase { public: CMcpFuncAiTaskRunnerGetTaskFolder(const long chart_id_panel, const long curr_chart_id) : CMcpFuncAiTaskRunnerBase("aidatataskrunner_get_task_folder", chart_id_panel, curr_chart_id) {} ~CMcpFuncAiTaskRunnerGetTaskFolder(void) {} //--- void Run(CJsonNode& param, string& res) override final { DispatchToPanel(AIDATATASKRUNER_API_TASK_FOLDER, "", res); } //--- void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam) override final { if(id != CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE) return; if(lparam != AIDATATASKRUNER_API_TASK_FOLDER) return; static string val; if(!TryUnpack(sparam, val)) return; m_mcp_server._RecibedEvent(CMcpFuncAiTaskRunnerBase_BuildResult(dparam, val)); } }; //+------------------------------------------------------------------+ //| is_in_commonfolder | //+------------------------------------------------------------------+ class CMcpFuncAiTaskRunnerIsInCommonFolder : public CMcpFuncAiTaskRunnerBase { public: CMcpFuncAiTaskRunnerIsInCommonFolder(const long chart_id_panel, const long curr_chart_id) : CMcpFuncAiTaskRunnerBase("aidatataskrunner_is_in_commonfolder", chart_id_panel, curr_chart_id) {} ~CMcpFuncAiTaskRunnerIsInCommonFolder(void) {} //--- void Run(CJsonNode& param, string& res) override final { DispatchToPanel(AIDATATASKRUNER_API_IS_IN_COMMON_FOLDER, "", res); } //--- void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam) override final { if(id != CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE) return; if(lparam != AIDATATASKRUNER_API_IS_IN_COMMON_FOLDER) return; static string val; if(!TryUnpack(sparam, val)) return; m_mcp_server._RecibedEvent(CMcpFuncAiTaskRunnerBase_BuildResult(dparam, val)); } }; //+------------------------------------------------------------------+ //| clean_all_tasks | //+------------------------------------------------------------------+ class CMcpFuncAiTaskRunnerCleanAllTasks : public CMcpFuncAiTaskRunnerBase { public: CMcpFuncAiTaskRunnerCleanAllTasks(const long chart_id_panel, const long curr_chart_id) : CMcpFuncAiTaskRunnerBase("aidatataskrunner_clean_all_tasks", chart_id_panel, curr_chart_id) {} ~CMcpFuncAiTaskRunnerCleanAllTasks(void) {} //--- void Run(CJsonNode& param, string& res) override final { DispatchToPanel(AIDATATASKRUNER_API_CLEAN_ALL_TASK_OF_TABLE, "", res); } //--- void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam) override final { if(id != CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE) return; if(lparam != AIDATATASKRUNER_API_CLEAN_ALL_TASK_OF_TABLE) return; static string val; if(!TryUnpack(sparam, val)) return; m_mcp_server._RecibedEvent(CMcpFuncAiTaskRunnerBase_BuildResult(dparam, val)); } }; //+------------------------------------------------------------------+ //| load_tasks_from_file | //+------------------------------------------------------------------+ class CMcpFuncAiTaskRunnerLoadTasksFromFile : public CMcpFuncAiTaskRunnerBase { public: CMcpFuncAiTaskRunnerLoadTasksFromFile(const long chart_id_panel, const long curr_chart_id) : CMcpFuncAiTaskRunnerBase("aidatataskrunner_load_tasks_from_file", chart_id_panel, curr_chart_id) {} ~CMcpFuncAiTaskRunnerLoadTasksFromFile(void) {} //--- void Run(CJsonNode& param, string& res) override final { DispatchToPanel(AIDATATASKRUNER_API_LOAD_TASK_IN_FILE, param["file_name"].ToString(), res); } //--- void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam) override final { if(id != CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE) return; if(lparam != AIDATATASKRUNER_API_LOAD_TASK_IN_FILE) return; static string val; if(!TryUnpack(sparam, val)) return; m_mcp_server._RecibedEvent(CMcpFuncAiTaskRunnerBase_BuildResult(dparam, val)); } }; //+------------------------------------------------------------------+ //| save_tasks_to_file | //+------------------------------------------------------------------+ class CMcpFuncAiTaskRunnerSaveTasksToFile : public CMcpFuncAiTaskRunnerBase { public: CMcpFuncAiTaskRunnerSaveTasksToFile(const long chart_id_panel, const long curr_chart_id) : CMcpFuncAiTaskRunnerBase("aidatataskrunner_save_tasks_to_file", chart_id_panel, curr_chart_id) {} ~CMcpFuncAiTaskRunnerSaveTasksToFile(void) {} //--- void Run(CJsonNode& param, string& res) override final { const string val = StringFormat("%d|%s", int(param["only_unfinished"].ToBool(false)), param["file_name"].ToString()); DispatchToPanel(AIDATATASKRUNER_API_SAVE_TASK_IN_FILE, val, res); } //--- void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam) override final { if(id != CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE) return; if(lparam != AIDATATASKRUNER_API_SAVE_TASK_IN_FILE) return; static string val; if(!TryUnpack(sparam, val)) return; m_mcp_server._RecibedEvent(CMcpFuncAiTaskRunnerBase_BuildResult(dparam, val)); } }; //+------------------------------------------------------------------+ //| load_config | //+------------------------------------------------------------------+ class CMcpFuncAiTaskRunnerLoadConfig : public CMcpFuncAiTaskRunnerBase { public: CMcpFuncAiTaskRunnerLoadConfig(const long chart_id_panel, const long curr_chart_id) : CMcpFuncAiTaskRunnerBase("aidatataskrunner_load_config", chart_id_panel, curr_chart_id) {} ~CMcpFuncAiTaskRunnerLoadConfig(void) {} //--- void Run(CJsonNode& param, string& res) override final { DispatchToPanel(AIDATATASKRUNER_API_LOAD_CONFIG_IN_FILE, param["file_name"].ToString(), res); } //--- void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam) override final { if(id != CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE) return; if(lparam != AIDATATASKRUNER_API_LOAD_CONFIG_IN_FILE) return; static string val; if(!TryUnpack(sparam, val)) return; m_mcp_server._RecibedEvent(CMcpFuncAiTaskRunnerBase_BuildResult(dparam, val)); } }; //+------------------------------------------------------------------+ //| save_config | //+------------------------------------------------------------------+ class CMcpFuncAiTaskRunnerSaveConfig : public CMcpFuncAiTaskRunnerBase { public: CMcpFuncAiTaskRunnerSaveConfig(const long chart_id_panel, const long curr_chart_id) : CMcpFuncAiTaskRunnerBase("aidatataskrunner_save_config", chart_id_panel, curr_chart_id) {} ~CMcpFuncAiTaskRunnerSaveConfig(void) {} //--- void Run(CJsonNode& param, string& res) override final { DispatchToPanel(AIDATATASKRUNER_API_SAVE_CONFIG_IN_FILE, param["file_name"].ToString(), res); } //--- void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam) override final { if(id != CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE) return; if(lparam != AIDATATASKRUNER_API_SAVE_CONFIG_IN_FILE) return; static string val; if(!TryUnpack(sparam, val)) return; m_mcp_server._RecibedEvent(CMcpFuncAiTaskRunnerBase_BuildResult(dparam, val)); } }; //+------------------------------------------------------------------+ //| add_task | //+------------------------------------------------------------------+ class CMcpFuncAiTaskRunnerAddTask : public CMcpFuncAiTaskRunnerBase { public: CMcpFuncAiTaskRunnerAddTask(const long chart_id_panel, const long curr_chart_id) : CMcpFuncAiTaskRunnerBase("aidatataskrunner_add_task", chart_id_panel, curr_chart_id) {} ~CMcpFuncAiTaskRunnerAddTask(void) {} //--- void Run(CJsonNode& param, string& res) override final { //--- const int timeframe = CEnumReg::GetValueNoRef(param["timeframe"].ToString("_Period"), _Period); const string val = StringFormat("%d|%s|%s|%s|%s|%s|%s|%s", timeframe, param["symbol"].ToString(), param["set_file"].ToString(""), param["start_date"].ToString(), param["end_date"].ToString(), param["symbol_folder"].ToString(""), param["label"].ToString(""), param["label_id"].ToString("0")); DispatchToPanel(AIDATATASKRUNER_API_ADD_TASK_TO_TABLE, val, res); } //--- void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam) override final { if(id != CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE) return; if(lparam != AIDATATASKRUNER_API_ADD_TASK_TO_TABLE) return; static string val; if(!TryUnpack(sparam, val)) return; m_mcp_server._RecibedEvent(CMcpFuncAiTaskRunnerBase_BuildResult(dparam, val)); } }; //+------------------------------------------------------------------+ //| execute_all_tasks | //+------------------------------------------------------------------+ class CMcpFuncAiTaskRunnerExecuteAllTasks : public CMcpFunction { private: const long m_chart_id_panel; const long m_current_chart_id; public: CMcpFuncAiTaskRunnerExecuteAllTasks(const long chart_id_panel, const long curr_chart_id) : CMcpFunction(0, false, "aidatataskrunner_execute_all_tasks"), m_chart_id_panel(chart_id_panel), m_current_chart_id(curr_chart_id) {} ~CMcpFuncAiTaskRunnerExecuteAllTasks(void) {} //--- void Run(CJsonNode& param, string& res) override final { ::EventChartCustom(m_chart_id_panel, AIDATATASKRUNER_API_ON_PARAM_CHANGE, m_current_chart_id, double(AIDATATASKRUNER_API_EXECUTE_ALL_TASK_OF_TABLE), AiDataTaskRunnerEmpaquetar("mcp_exec_all", "")); res = "{\"ok\":true,\"result\":\"queued\"}"; } }; //+------------------------------------------------------------------+ #endif // AIDATATASKRUNNER_BACKEND_MCP_FUNCTIONS_MQH