AiDataTaskRuner/Backend/Mcp/Functions.mqh

476 lines
19 KiB
MQL5
Raw Permalink Normal View History

2026-04-17 17:27:10 -05:00
//+------------------------------------------------------------------+
//| 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 <TSN\\Mcp\\Main.mqh>
#include <TSN\\MQLArticles\\Utils\\EnumReg.mqh>
#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),
2026-04-17 22:43:49 -05:00
m_chart_id_panel(chart_id_panel), m_current_chart_id(curr_chart_id)
2026-04-17 17:27:10 -05:00
{}
~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),
2026-04-17 22:43:49 -05:00
AiDataTaskRunnerEmpaquetar("mcp_server_aidata", val)))
2026-04-17 17:27:10 -05:00
{
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;
}
//+------------------------------------------------------------------+
2026-04-17 22:43:49 -05:00
#define CMcpFuncAiTaskRunnerBase_BuildResult(dparam, val) StringFormat("{\"ok\":%s,\"result\":\"%s\"}", (dparam == AIDATATASKRUNER_API_RES_EXITO ? "true" : "false"), val)
2026-04-17 17:27:10 -05:00
//+------------------------------------------------------------------+
//| 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
{
2026-04-17 22:43:49 -05:00
2026-04-17 17:27:10 -05:00
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
{
2026-04-17 22:43:49 -05:00
2026-04-17 17:27:10 -05:00
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
{
2026-04-17 22:43:49 -05:00
2026-04-17 17:27:10 -05:00
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
{
2026-04-17 22:43:49 -05:00
2026-04-17 17:27:10 -05:00
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
{
2026-04-17 22:43:49 -05:00
2026-04-17 17:27:10 -05:00
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
{
2026-04-17 22:43:49 -05:00
2026-04-17 17:27:10 -05:00
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
{
2026-04-17 22:43:49 -05:00
2026-04-17 17:27:10 -05:00
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
{
2026-04-17 22:43:49 -05:00
2026-04-17 17:27:10 -05:00
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
{
2026-04-17 22:43:49 -05:00
2026-04-17 17:27:10 -05:00
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
{
2026-04-17 22:43:49 -05:00
2026-04-17 17:27:10 -05:00
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
{
2026-04-17 22:43:49 -05:00
2026-04-17 17:27:10 -05:00
//---
const int timeframe = CEnumReg::GetValueNoRef<int>(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