2026-07-27 09:45:06 -05:00 | | | //+------------------------------------------------------------------+
|
2026-04-07 09:56:10 -05:00 | | | //| AllFlows.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_WORKFLOWS_FLOWS_ALLFLOWS_MQH
|
| | | #define AIDATATASKRUNNER_BACKEND_WORKFLOWS_FLOWS_ALLFLOWS_MQH
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| Include |
|
| | | //+------------------------------------------------------------------+
|
| | | #include <TSN\\WFlows\\Orquestador.mqh>
|
| | | #include <TSN\\WFlows\\AllSteps.mqh>
|
| | | #include "..\\..\\Api\\Protocol\\Def.mqh"
|
| | | #include "..\\..\\Tester\\Def.mqh"
|
| | |
|
2026-04-09 06:52:40 -05:00 | | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
2026-04-07 09:56:10 -05:00 | | | const long g_first_chart_id = ChartID();
|
| | |
|
2026-07-06 08:44:57 -05:00 | | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
| | | namespace TSN
|
| | | {
|
2026-04-07 09:56:10 -05:00 | | | //+------------------------------------------------------------------+
|
2026-04-08 20:35:41 -05:00 | | | //| Add task |
|
2026-04-07 09:56:10 -05:00 | | | //+------------------------------------------------------------------+
|
2026-05-29 11:19:18 -05:00 | | | class CFlowAiDataAddTask : public TSN::CWorkflowStep
|
2026-04-07 09:56:10 -05:00 | | | {
|
| | | private:
|
| | | TaskTester m_task;
|
| | | string m_str;
|
| | |
|
2026-04-09 15:46:33 -05:00 | | | //---
|
| | | long m_chart_id_p;
|
2026-04-07 09:56:10 -05:00 | | |
|
| | | public:
|
2026-04-09 15:46:33 -05:00 | | | CFlowAiDataAddTask(void) : CWorkflowStep("AddTask", "AiDataTaskRunner", true, WORKFLOWBYLEO_STEP_FLAG_ON_CHART_EVENT)
|
2026-04-07 09:56:10 -05:00 | | | {}
|
| | | ~CFlowAiDataAddTask(void) {}
|
| | |
|
| | | //---
|
2026-06-22 11:03:48 -05:00 | | | bool Init(TSN::CYmlNode& parameters) override final;
|
2026-04-07 09:56:10 -05:00 | | | int Run() override final;
|
| | | void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam) override final;
|
| | | };
|
| | | //--- Registramos
|
2026-05-29 11:19:18 -05:00 | | | WORKFLOWS_FACTORY_DEFINE_CREATOR_INC_TSN(CFlowAiDataAddTask, AiDataAddTask, "AddTask", "AiDataTaskRunner")
|
2026-04-07 09:56:10 -05:00 | | | //+------------------------------------------------------------------+
|
2026-06-22 11:03:48 -05:00 | | | bool CFlowAiDataAddTask::Init(TSN::CYmlNode ¶meters)
|
2026-04-07 09:56:10 -05:00 | | | {
|
2026-04-09 15:46:33 -05:00 | | | //---
|
2026-07-27 09:45:06 -05:00 | | | if(!m_wf.Variables().TryGet("__internal::chart_id", m_chart_id_p))
|
2026-04-09 15:46:33 -05:00 | | | {
|
| | | LogError("Fallo al obtener chart id", FUNCION_ACTUAL);
|
| | | return false;
|
| | | }
|
2026-07-27 09:45:51 -05:00 | | |
|
2026-04-09 15:46:33 -05:00 | | | //---
|
2026-07-27 09:45:06 -05:00 | | | m_task.symbol = parameters["symbol"].ToString("");
|
| | | m_task.timeframe = CEnumRegBasis::GetValNoRef<ENUM_TIMEFRAMES>(parameters["timeframe"].ToString(), _Period);
|
| | | m_task.start_date = StringToTime(parameters["start_date"].ToString(""));
|
| | | m_task.end_date = StringToTime(parameters["end_date"].ToString(""));
|
| | | m_task.symbol_folder = parameters["symbol_folder"].ToString(m_task.symbol);
|
| | | m_task.label = parameters["label"].ToString("");
|
| | | m_task.label_id = int(parameters["symbol"].ToInt(0));
|
| | | m_task.set_file = parameters["set_file"].ToString("");
|
2026-04-07 09:56:10 -05:00 | | | m_str = m_task.ToStringFile();
|
| | | return true;
|
| | | }
|
| | | //+------------------------------------------------------------------+
|
| | | int CFlowAiDataAddTask::Run(void)
|
| | | {
|
2026-04-09 16:05:06 -05:00 | | | if(!::EventChartCustom(m_chart_id_p, AIDATATASKRUNER_API_ON_PARAM_CHANGE, g_first_chart_id,
|
2026-04-09 21:47:51 -05:00 | | | double(AIDATATASKRUNER_API_ADD_TASK_TO_TABLE), AiDataTaskRunnerEmpaquetar("wf", m_str)))
|
2026-04-07 09:56:10 -05:00 | | | {
|
| | | LogError("Fallo al enviar evento de add task", FUNCION_ACTUAL);
|
| | | return 1;
|
| | | }
|
| | | return 0;
|
| | | }
|
| | | //+------------------------------------------------------------------+
|
| | | void CFlowAiDataAddTask::ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam)
|
| | | {
|
| | | if(id == CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE)
|
| | | {
|
| | | // De salida: (api responde al que le envio datos)
|
| | | // lparam=evento respondiido
|
| | | // dparam=resultado
|
| | | // sparam=info (empaquetada ToolId|Val)
|
| | | if(lparam == AIDATATASKRUNER_API_ADD_TASK_TO_TABLE)
|
| | | {
|
| | | const int res = (dparam < 0.00 ? 1 : 0);
|
| | | if(res == 1)
|
| | | {
|
| | | static string id_tool, val;
|
| | | if(!AiDataTaskRunnerDesempaquetar(sparam, id_tool, val))
|
| | | {
|
| | | LogError(StringFormat("Formato invalido de empauqetacion de telegram [event_id=%I64d], mensaje recibido por UI Panel:\n%s",
|
| | | lparam, sparam), FUNCION_ACTUAL);
|
| | | return;
|
| | | }
|
| | |
|
| | | //---
|
| | | LogError(StringFormat("Fallo al ejecutar step, val: ", val), FUNCION_ACTUAL);
|
| | | }
|
| | | m_wf._RecibedEvent(res);
|
| | | }
|
| | | }
|
| | | }
|
2026-04-08 20:35:41 -05:00 | | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| Run all task |
|
| | | //+------------------------------------------------------------------+
|
2026-05-29 11:19:18 -05:00 | | | class CFlowAiDataRunAllTask : public TSN::CWorkflowStep
|
2026-04-08 20:35:41 -05:00 | | | {
|
2026-04-09 06:52:40 -05:00 | | | private:
|
2026-04-09 15:46:33 -05:00 | | | long m_chart_id_p;
|
2026-04-10 15:42:04 -05:00 | | | int m_idx[];
|
2026-04-19 20:45:23 -05:00 | | | int m_idx_size;
|
2026-04-10 15:42:04 -05:00 | | | int m_ms_pool;
|
2026-04-13 17:42:23 -05:00 | | | bool m_strict; // determian si continuar por mas que una tarea halla fallado (delas que se estan ejecutando)
|
2026-04-10 15:42:04 -05:00 | | |
|
| | | //---
|
| | | void OnTaskProcces(const string& sparam, const int res);
|
| | |
|
2026-04-08 20:35:41 -05:00 | | | public:
|
2026-04-10 15:42:04 -05:00 | | | CFlowAiDataRunAllTask(void) : CWorkflowStep("RunAllTask", "AiDataTaskRunner", true,
|
2026-04-19 20:45:23 -05:00 | | | WORKFLOWBYLEO_STEP_FLAG_ON_CHART_EVENT | WORKFLOWBYLEO_STEP_FLAG_ON_TIMER_EVENT), m_idx_size(0)
|
2026-04-08 20:35:41 -05:00 | | | {}
|
| | | ~CFlowAiDataRunAllTask(void) {}
|
| | |
|
| | | //---
|
2026-06-22 11:03:48 -05:00 | | | bool Init(TSN::CYmlNode& parameters) override final;
|
2026-04-08 20:35:41 -05:00 | | | int Run() override final;
|
| | | void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam) override final;
|
2026-04-10 15:42:04 -05:00 | | | void OnTimerEvent() override final;
|
2026-04-08 20:35:41 -05:00 | | | };
|
| | | //--- Registramos
|
2026-05-29 11:19:18 -05:00 | | | WORKFLOWS_FACTORY_DEFINE_CREATOR_INC_TSN(CFlowAiDataRunAllTask, AiDataRunAlTask, "RunAllTask", "AiDataTaskRunner")
|
2026-04-08 20:35:41 -05:00 | | | //+------------------------------------------------------------------+
|
2026-06-22 11:03:48 -05:00 | | | bool CFlowAiDataRunAllTask::Init(TSN::CYmlNode ¶meters)
|
2026-04-08 20:35:41 -05:00 | | | {
|
2026-04-09 15:46:33 -05:00 | | | //---
|
2026-07-27 09:45:06 -05:00 | | | if(!m_wf.Variables().TryGet("__internal::chart_id", m_chart_id_p))
|
2026-04-09 15:46:33 -05:00 | | | {
|
| | | LogError("Fallo al obtener chart id", FUNCION_ACTUAL);
|
| | | return false;
|
| | | }
|
2026-04-08 20:35:41 -05:00 | | | // Nada
|
2026-07-27 09:45:06 -05:00 | | | m_strict = parameters["strict"].ToBool(false);
|
| | | m_ms_pool = int(parameters["ms_pool"].ToInt(1000));
|
2026-04-08 20:35:41 -05:00 | | | return true;
|
| | | }
|
2026-04-10 15:42:04 -05:00 | | |
|
2026-04-08 20:35:41 -05:00 | | | //+------------------------------------------------------------------+
|
| | | int CFlowAiDataRunAllTask::Run(void)
|
| | | {
|
2026-04-09 16:05:06 -05:00 | | | if(!::EventChartCustom(m_chart_id_p, AIDATATASKRUNER_API_ON_PARAM_CHANGE, g_first_chart_id,
|
2026-04-09 21:47:51 -05:00 | | | double(AIDATATASKRUNER_API_EXECUTE_ALL_TASK_OF_TABLE), AiDataTaskRunnerEmpaquetar("wf", "")))
|
2026-04-08 20:35:41 -05:00 | | | {
|
| | | LogError("Fallo al enviar evento de add task", FUNCION_ACTUAL);
|
| | | return 1;
|
| | | }
|
| | | return 0;
|
| | | }
|
2026-04-10 15:42:04 -05:00 | | |
|
2026-04-08 20:35:41 -05:00 | | | //+------------------------------------------------------------------+
|
| | | void CFlowAiDataRunAllTask::ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam)
|
| | | {
|
2026-04-10 15:42:04 -05:00 | | | //---
|
2026-04-08 20:35:41 -05:00 | | | if(id == CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE)
|
| | | {
|
| | | // De salida: (api responde al que le envio datos)
|
| | | // lparam=evento respondiido
|
| | | // dparam=resultado
|
| | | // sparam=info (empaquetada ToolId|Val)
|
2026-04-10 15:42:04 -05:00 | | |
|
| | | //---
|
2026-04-08 20:35:41 -05:00 | | | if(lparam == AIDATATASKRUNER_API_EXECUTE_ALL_TASK_OF_TABLE)
|
| | | {
|
2026-04-10 15:42:04 -05:00 | | | const int res = (dparam < 0.00 ? 1 : 0);
|
| | |
|
| | | //---
|
| | | static string id_tool, val;
|
| | | if(!AiDataTaskRunnerDesempaquetar(sparam, id_tool, val))
|
2026-04-08 20:35:41 -05:00 | | | {
|
2026-04-10 15:42:04 -05:00 | | | LogError(StringFormat("Formato invalido de empauqetacion de telegram [event_id=%I64d], mensaje recibido por UI Panel:\n%s",
|
| | | lparam, sparam), FUNCION_ACTUAL);
|
| | | return;
|
| | | }
|
| | |
|
| | | //---
|
| | | if(res == 0) // Exito
|
| | | {
|
| | | const int start = val.Find("[", 0) + 1;
|
| | | const int end = val.Find("]", start) - 1;
|
2026-04-19 20:45:23 -05:00 | | |
|
2026-04-10 15:42:04 -05:00 | | | if(!StrTo::CstArray(m_idx, StringSubstrRange(val, start, end), ',')) // Fallo al parsear
|
2026-04-08 20:35:41 -05:00 | | | {
|
2026-04-10 15:42:04 -05:00 | | | LogError("Formato invalido de indices ejectuados, error al obtener indices", FUNCION_ACTUAL);
|
| | | m_wf._RecibedEvent(1);
|
2026-04-19 20:45:23 -05:00 | | | return;
|
2026-04-08 20:35:41 -05:00 | | | }
|
2026-04-19 20:45:23 -05:00 | | | // Nota el array que se obtiene es como [0,1,2,3] (en orden)
|
| | | m_idx_size = ArraySize(m_idx);
|
| | | ArrayReverse(m_idx); // Lo volteamos
|
| | |
|
| | |
|
2026-04-10 15:42:04 -05:00 | | | // Ya tenmso los indices que consultaremos
|
| | | ::EventSetMillisecondTimer(m_ms_pool);
|
| | | }
|
| | | else
|
| | | {
|
| | | // Fin
|
2026-04-08 20:35:41 -05:00 | | | LogError(StringFormat("Fallo al ejecutar step, val: ", val), FUNCION_ACTUAL);
|
2026-04-13 17:42:23 -05:00 | | | m_wf._RecibedEvent(1); // le pasmos m_strict por derfecto fallara de lo contirao sera silencionso con esta ejecucion
|
2026-04-08 20:35:41 -05:00 | | | }
|
2026-04-10 15:42:04 -05:00 | | | return;
|
| | | }
|
| | |
|
| | | //---
|
| | | if(lparam == AIDATATASKRUNER_API_GET_TASK_STATUS)
|
| | | {
|
| | | OnTaskProcces(sparam, (dparam < 0.00 ? 1 : 0));
|
2026-04-08 20:35:41 -05:00 | | | }
|
| | | }
|
| | | }
|
| | |
|
2026-04-10 15:42:04 -05:00 | | | //+------------------------------------------------------------------+
|
| | | void CFlowAiDataRunAllTask::OnTimerEvent()
|
| | | {
|
| | | if(!::EventChartCustom(m_chart_id_p, AIDATATASKRUNER_API_ON_PARAM_CHANGE, g_first_chart_id, double(AIDATATASKRUNER_API_GET_TASK_STATUS)
|
2026-04-19 20:45:23 -05:00 | | | , AiDataTaskRunnerEmpaquetar("wf", string(m_idx[m_idx_size - 1]))))
|
2026-04-10 15:42:04 -05:00 | | | {
|
| | | LogError("Fallo al enviar evento de peticion de task", FUNCION_ACTUAL);
|
| | | }
|
| | | }
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | void CFlowAiDataRunAllTask::OnTaskProcces(const string &sparam, const int res)
|
| | | {
|
| | | //---
|
| | | static string id_tool, val;
|
| | | if(!AiDataTaskRunnerDesempaquetar(sparam, id_tool, val))
|
| | | {
|
| | | LogError(StringFormat("Formato invalido de empauqetacion de telegram [event_id=%I64d], mensaje recibido por UI Panel:\n%s",
|
| | | AIDATATASKRUNER_API_GET_TASK_STATUS, sparam), FUNCION_ACTUAL);
|
| | | return;
|
| | | }
|
| | |
|
| | | //---
|
| | | if(res == 0)
|
| | | {
|
| | | const ENUM_AIEXECUTOR_TASK_STATE state = ENUM_AIEXECUTOR_TASK_STATE(int(val));
|
| | |
|
| | | //---
|
| | | if(state == AIEXECUTOR_TASK_STATE_FAILED)
|
| | | {
|
| | | if(m_strict)
|
| | | {
|
| | | LogError("Una tarea a fallado", FUNCION_ACTUAL);
|
| | | ::EventKillTimer();
|
| | | m_wf._RecibedEvent(1);
|
| | | return;
|
| | | }
|
| | | else
|
| | | {
|
| | | // La elimianmos, no hacemos mas nada¿
|
2026-04-19 20:45:23 -05:00 | | | ArrayResize(m_idx, (--m_idx_size));
|
2026-04-10 15:42:04 -05:00 | | | }
|
| | | }
|
| | | else
|
| | | if(state == AIEXECUTOR_TASK_STATE_FINISHED) // Exito
|
| | | {
|
| | | // Eliminamos el indice actual que estabamos consultando
|
2026-04-19 20:45:23 -05:00 | | | ArrayResize(m_idx, (--m_idx_size));
|
2026-04-10 15:42:04 -05:00 | | | }
|
| | | // Aun se ejecuta o es pendiente
|
| | |
|
| | | //---
|
2026-04-19 20:45:23 -05:00 | | | if(m_idx_size < 1)
|
2026-04-10 15:42:04 -05:00 | | | {
|
| | | // Pasado entonces retornamos 0
|
| | | ::EventKillTimer();
|
| | | m_wf._RecibedEvent(0);
|
| | | }
|
| | | }
|
| | | else
|
| | | {
|
2026-04-13 17:42:23 -05:00 | | | LogError(StringFormat("Error al recibir estado de tarea, val:\n%s", val), FUNCION_ACTUAL);
|
| | | ::EventKillTimer();
|
| | | m_wf._RecibedEvent(1);
|
2026-04-10 15:42:04 -05:00 | | | }
|
| | | }
|
| | |
|
| | |
|
2026-04-08 20:35:41 -05:00 | | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| Save task in file |
|
| | | //+------------------------------------------------------------------+
|
2026-05-29 11:19:18 -05:00 | | | class CFlowAiDataSaveTaskInFile : public TSN::CWorkflowStep
|
2026-04-08 20:35:41 -05:00 | | | {
|
| | | private:
|
| | | string m_file_name;
|
| | | bool m_append;
|
2026-04-09 15:46:33 -05:00 | | | long m_chart_id_p;
|
2026-04-08 20:35:41 -05:00 | | |
|
| | | public:
|
2026-04-09 15:46:33 -05:00 | | | CFlowAiDataSaveTaskInFile(void) : CWorkflowStep("SaveTaskInFile", "AiDataTaskRunner", true, WORKFLOWBYLEO_STEP_FLAG_ON_CHART_EVENT) {}
|
2026-04-08 20:35:41 -05:00 | | | ~CFlowAiDataSaveTaskInFile(void) {}
|
| | |
|
2026-06-22 11:03:48 -05:00 | | | bool Init(TSN::CYmlNode& parameters) override final;
|
2026-04-08 20:35:41 -05:00 | | | int Run() override final;
|
| | | void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam) override final;
|
| | | };
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
2026-05-29 11:19:18 -05:00 | | | WORKFLOWS_FACTORY_DEFINE_CREATOR_INC_TSN(CFlowAiDataSaveTaskInFile, AiDataSaveTaskInFile, "SaveTaskInFile", "AiDataTaskRunner")
|
2026-04-08 20:35:41 -05:00 | | | //+------------------------------------------------------------------+
|
2026-06-22 11:03:48 -05:00 | | | bool CFlowAiDataSaveTaskInFile::Init(TSN::CYmlNode ¶meters)
|
2026-04-08 20:35:41 -05:00 | | | {
|
2026-04-09 15:46:33 -05:00 | | | //---
|
2026-07-27 09:45:06 -05:00 | | | if(!m_wf.Variables().TryGet("__internal::chart_id", m_chart_id_p))
|
2026-04-09 15:46:33 -05:00 | | | {
|
| | | LogError("Fallo al obtener chart id", FUNCION_ACTUAL);
|
| | | return false;
|
| | | }
|
| | |
|
| | | //---
|
2026-07-27 09:45:06 -05:00 | | | m_file_name = parameters["file_name"].ToString("");
|
| | | m_append = parameters["only_no_proccesed"].ToBool(false);
|
2026-04-08 20:35:41 -05:00 | | | return true;
|
| | | }
|
| | | //+------------------------------------------------------------------+
|
| | | int CFlowAiDataSaveTaskInFile::Run(void)
|
| | | {
|
| | | const string val = StringFormat("%d%c%s", int(m_append), AIDATATASKRUNER_API_SEPARATOR_PARAM, m_file_name);
|
2026-04-09 16:05:06 -05:00 | | | if(!::EventChartCustom(m_chart_id_p, AIDATATASKRUNER_API_ON_PARAM_CHANGE, g_first_chart_id,
|
2026-04-09 21:47:51 -05:00 | | | double(AIDATATASKRUNER_API_SAVE_TASK_IN_FILE), AiDataTaskRunnerEmpaquetar("wf", val)))
|
2026-04-08 20:35:41 -05:00 | | | {
|
| | | LogError("Fallo al enviar evento de save task", FUNCION_ACTUAL);
|
| | | return 1;
|
| | | }
|
| | | return 0;
|
| | | }
|
| | | //+------------------------------------------------------------------+
|
| | | void CFlowAiDataSaveTaskInFile::ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam)
|
| | | {
|
| | | if(id == CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE)
|
| | | {
|
| | | if(lparam == AIDATATASKRUNER_API_SAVE_TASK_IN_FILE)
|
| | | {
|
| | | const int res = (dparam < 0.00 ? 1 : 0);
|
| | | if(res == 1)
|
| | | {
|
| | | static string id_tool, val;
|
| | | if(!AiDataTaskRunnerDesempaquetar(sparam, id_tool, val))
|
| | | {
|
| | | LogError(StringFormat("Formato invalido [event_id=%I64d]:\n%s", lparam, sparam), FUNCION_ACTUAL);
|
| | | return;
|
| | | }
|
| | | LogError(StringFormat("Fallo al ejecutar step, val: %s", val), FUNCION_ACTUAL);
|
| | | }
|
| | | m_wf._RecibedEvent(res);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| Load task in file |
|
| | | //+------------------------------------------------------------------+
|
2026-05-29 11:19:18 -05:00 | | | class CFlowAiDataLoadTaskInFile : public TSN::CWorkflowStep
|
2026-04-08 20:35:41 -05:00 | | | {
|
| | | private:
|
| | | string m_file_name;
|
2026-04-09 15:46:33 -05:00 | | | long m_chart_id_p;
|
2026-04-08 20:35:41 -05:00 | | |
|
| | | public:
|
2026-04-09 15:46:33 -05:00 | | | CFlowAiDataLoadTaskInFile(void) : CWorkflowStep("LoadTaskInFile", "AiDataTaskRunner", true, WORKFLOWBYLEO_STEP_FLAG_ON_CHART_EVENT) {}
|
2026-04-08 20:35:41 -05:00 | | | ~CFlowAiDataLoadTaskInFile(void) {}
|
| | |
|
2026-06-22 11:03:48 -05:00 | | | bool Init(TSN::CYmlNode& parameters) override final;
|
2026-04-08 20:35:41 -05:00 | | | int Run() override final;
|
| | | void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam) override final;
|
| | | };
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
2026-05-29 11:19:18 -05:00 | | | WORKFLOWS_FACTORY_DEFINE_CREATOR_INC_TSN(CFlowAiDataLoadTaskInFile, AiDataLoadTaskInFile, "LoadTaskInFile", "AiDataTaskRunner")
|
2026-04-08 20:35:41 -05:00 | | | //+------------------------------------------------------------------+
|
2026-06-22 11:03:48 -05:00 | | | bool CFlowAiDataLoadTaskInFile::Init(TSN::CYmlNode ¶meters)
|
2026-04-08 20:35:41 -05:00 | | | {
|
2026-04-09 15:46:33 -05:00 | | | //---
|
2026-07-27 09:45:06 -05:00 | | | if(!m_wf.Variables().TryGet("__internal::chart_id", m_chart_id_p))
|
2026-04-09 15:46:33 -05:00 | | | {
|
| | | LogError("Fallo al obtener chart id", FUNCION_ACTUAL);
|
| | | return false;
|
| | | }
|
| | |
|
| | | //---
|
2026-07-27 09:45:06 -05:00 | | | m_file_name = parameters["file_name"].ToString("");
|
2026-04-08 20:35:41 -05:00 | | | return true;
|
| | | }
|
| | | //+------------------------------------------------------------------+
|
| | | int CFlowAiDataLoadTaskInFile::Run(void)
|
| | | {
|
2026-04-09 16:05:06 -05:00 | | | if(!::EventChartCustom(m_chart_id_p, AIDATATASKRUNER_API_ON_PARAM_CHANGE, g_first_chart_id,
|
2026-04-09 21:47:51 -05:00 | | | double(AIDATATASKRUNER_API_LOAD_TASK_IN_FILE), AiDataTaskRunnerEmpaquetar("wf", m_file_name)))
|
2026-04-08 20:35:41 -05:00 | | | {
|
| | | LogError("Fallo al enviar evento de load task", FUNCION_ACTUAL);
|
| | | return 1;
|
| | | }
|
| | | return 0;
|
| | | }
|
| | | //+------------------------------------------------------------------+
|
| | | void CFlowAiDataLoadTaskInFile::ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam)
|
| | | {
|
| | | if(id == CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE)
|
| | | {
|
| | | if(lparam == AIDATATASKRUNER_API_LOAD_TASK_IN_FILE)
|
| | | {
|
| | | const int res = (dparam < 0.00 ? 1 : 0);
|
| | | if(res == 1)
|
| | | {
|
| | | static string id_tool, val;
|
| | | if(!AiDataTaskRunnerDesempaquetar(sparam, id_tool, val))
|
| | | {
|
| | | LogError(StringFormat("Formato invalido [event_id=%I64d]:\n%s", lparam, sparam), FUNCION_ACTUAL);
|
| | | return;
|
| | | }
|
| | | LogError(StringFormat("Fallo al ejecutar step, val: %s", val), FUNCION_ACTUAL);
|
| | | }
|
| | | m_wf._RecibedEvent(res);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | |
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| Clean all task |
|
| | | //+------------------------------------------------------------------+
|
2026-05-29 11:19:18 -05:00 | | | class CFlowAiDataCleanAllTask : public TSN::CWorkflowStep
|
2026-04-08 20:35:41 -05:00 | | | {
|
2026-04-09 06:52:40 -05:00 | | | private:
|
2026-04-09 15:46:33 -05:00 | | | long m_chart_id_p;
|
| | |
|
2026-04-08 20:35:41 -05:00 | | | public:
|
2026-04-09 15:46:33 -05:00 | | | CFlowAiDataCleanAllTask(void) : CWorkflowStep("CleanAllTask", "AiDataTaskRunner", true, WORKFLOWBYLEO_STEP_FLAG_ON_CHART_EVENT) {}
|
2026-04-08 20:35:41 -05:00 | | | ~CFlowAiDataCleanAllTask(void) {}
|
| | |
|
2026-06-22 11:03:48 -05:00 | | | bool Init(TSN::CYmlNode& parameters) override final;
|
2026-04-08 20:35:41 -05:00 | | | int Run() override final;
|
| | | void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam) override final;
|
| | | };
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
2026-05-29 11:19:18 -05:00 | | | WORKFLOWS_FACTORY_DEFINE_CREATOR_INC_TSN(CFlowAiDataCleanAllTask, AiDataCleanAllTask, "CleanAllTask", "AiDataTaskRunner")
|
2026-04-08 20:35:41 -05:00 | | | //+------------------------------------------------------------------+
|
2026-06-22 11:03:48 -05:00 | | | bool CFlowAiDataCleanAllTask::Init(TSN::CYmlNode ¶meters)
|
2026-04-08 20:35:41 -05:00 | | | {
|
2026-04-09 15:46:33 -05:00 | | | //---
|
2026-07-27 09:45:06 -05:00 | | | if(!m_wf.Variables().TryGet("__internal::chart_id", m_chart_id_p))
|
2026-04-09 15:46:33 -05:00 | | | {
|
| | | LogError("Fallo al obtener chart id", FUNCION_ACTUAL);
|
| | | return false;
|
| | | }
|
2026-04-08 20:35:41 -05:00 | | | return true;
|
| | | }
|
| | | //+------------------------------------------------------------------+
|
| | | int CFlowAiDataCleanAllTask::Run(void)
|
| | | {
|
2026-04-09 16:05:06 -05:00 | | | if(!::EventChartCustom(m_chart_id_p, AIDATATASKRUNER_API_ON_PARAM_CHANGE, g_first_chart_id,
|
2026-04-09 21:47:51 -05:00 | | | double(AIDATATASKRUNER_API_CLEAN_ALL_TASK_OF_TABLE), AiDataTaskRunnerEmpaquetar("wf", "")))
|
2026-04-08 20:35:41 -05:00 | | | {
|
| | | LogError("Fallo al enviar evento de clean all task", FUNCION_ACTUAL);
|
| | | return 1;
|
| | | }
|
| | | return 0;
|
| | | }
|
| | | //+------------------------------------------------------------------+
|
| | | void CFlowAiDataCleanAllTask::ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam)
|
| | | {
|
| | | if(id == CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE)
|
| | | {
|
| | | if(lparam == AIDATATASKRUNER_API_CLEAN_ALL_TASK_OF_TABLE)
|
| | | {
|
2026-04-13 17:42:23 -05:00 | | | const int res = (dparam < 0.00 ? 1 : 0);
|
2026-04-08 20:35:41 -05:00 | | | if(res == 1)
|
| | | {
|
| | | static string id_tool, val;
|
| | | if(!AiDataTaskRunnerDesempaquetar(sparam, id_tool, val))
|
| | | {
|
| | | LogError(StringFormat("Formato invalido [event_id=%I64d]:\n%s", lparam, sparam), FUNCION_ACTUAL);
|
| | | return;
|
| | | }
|
| | | LogError(StringFormat("Fallo al ejecutar step, val: %s", val), FUNCION_ACTUAL);
|
| | | }
|
| | | m_wf._RecibedEvent(res);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| Load config in file |
|
2026-07-06 08:44:57 -05:00 | | | //+------------------------------------------------------------------+
|
2026-05-29 11:19:18 -05:00 | | | class CFlowAiDataLoadConfigInFile : public TSN::CWorkflowStep
|
2026-04-08 20:35:41 -05:00 | | | {
|
| | | private:
|
| | | string m_file_name;
|
2026-04-09 15:46:33 -05:00 | | | long m_chart_id_p;
|
2026-04-08 20:35:41 -05:00 | | |
|
| | | public:
|
2026-04-09 15:46:33 -05:00 | | | CFlowAiDataLoadConfigInFile(void) : CWorkflowStep("LoadConfigInFile", "AiDataTaskRunner", true, WORKFLOWBYLEO_STEP_FLAG_ON_CHART_EVENT) {}
|
2026-04-08 20:35:41 -05:00 | | | ~CFlowAiDataLoadConfigInFile(void) {}
|
| | |
|
2026-06-22 11:03:48 -05:00 | | | bool Init(TSN::CYmlNode& parameters) override final;
|
2026-04-08 20:35:41 -05:00 | | | int Run() override final;
|
| | | void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam) override final;
|
| | | };
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
2026-05-29 11:19:18 -05:00 | | | WORKFLOWS_FACTORY_DEFINE_CREATOR_INC_TSN(CFlowAiDataLoadConfigInFile, AiDataLoadConfigInFile, "LoadConfigInFile", "AiDataTaskRunner")
|
2026-04-08 20:35:41 -05:00 | | | //+------------------------------------------------------------------+
|
2026-06-22 11:03:48 -05:00 | | | bool CFlowAiDataLoadConfigInFile::Init(TSN::CYmlNode ¶meters)
|
2026-04-08 20:35:41 -05:00 | | | {
|
2026-04-09 15:46:33 -05:00 | | | //---
|
2026-07-27 09:45:06 -05:00 | | | if(!m_wf.Variables().TryGet("__internal::chart_id", m_chart_id_p))
|
2026-04-09 15:46:33 -05:00 | | | {
|
| | | LogError("Fallo al obtener chart id", FUNCION_ACTUAL);
|
| | | return false;
|
| | | }
|
| | | //---
|
2026-07-27 09:45:06 -05:00 | | | m_file_name = parameters["file_name"].ToString("");
|
2026-04-08 20:35:41 -05:00 | | | return true;
|
| | | }
|
| | | //+------------------------------------------------------------------+
|
| | | int CFlowAiDataLoadConfigInFile::Run(void)
|
| | | {
|
2026-04-09 16:05:06 -05:00 | | | if(!::EventChartCustom(m_chart_id_p, AIDATATASKRUNER_API_ON_PARAM_CHANGE, g_first_chart_id,
|
2026-04-09 21:47:51 -05:00 | | | double(AIDATATASKRUNER_API_LOAD_CONFIG_IN_FILE), AiDataTaskRunnerEmpaquetar("wf", m_file_name)))
|
2026-04-08 20:35:41 -05:00 | | | {
|
| | | LogError("Fallo al enviar evento de load config", FUNCION_ACTUAL);
|
| | | return 1;
|
| | | }
|
| | | return 0;
|
| | | }
|
| | | //+------------------------------------------------------------------+
|
| | | void CFlowAiDataLoadConfigInFile::ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam)
|
2026-04-09 06:52:40 -05:00 | | | {
|
| | | if(id == CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE)
|
| | | {
|
| | | if(lparam == AIDATATASKRUNER_API_LOAD_CONFIG_IN_FILE)
|
| | | {
|
| | | const int res = (dparam < 0.00 ? 1 : 0);
|
| | | if(res == 1)
|
| | | {
|
| | | static string id_tool, val;
|
| | | if(!AiDataTaskRunnerDesempaquetar(sparam, id_tool, val))
|
| | | {
|
| | | LogError(StringFormat("Formato invalido [event_id=%I64d]:\n%s", lparam, sparam), FUNCION_ACTUAL);
|
| | | return;
|
| | | }
|
| | | LogError(StringFormat("Fallo al ejecutar step, val: %s", val), FUNCION_ACTUAL);
|
| | | }
|
| | | m_wf._RecibedEvent(res);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
2026-05-29 11:19:18 -05:00 | | | class CFlowAiDataLoadConfigInPlace : public TSN::CWorkflowStep
|
2026-04-09 06:52:40 -05:00 | | | {
|
| | | private:
|
| | | string m_file_name;
|
2026-04-09 15:46:33 -05:00 | | | long m_chart_id_p;
|
2026-04-09 06:52:40 -05:00 | | |
|
| | | public:
|
2026-04-09 15:46:33 -05:00 | | | CFlowAiDataLoadConfigInPlace(void) : CWorkflowStep("LoadConfigInPlace", "AiDataTaskRunner", true, WORKFLOWBYLEO_STEP_FLAG_ON_CHART_EVENT) {}
|
2026-04-09 06:52:40 -05:00 | | | ~CFlowAiDataLoadConfigInPlace(void) {}
|
| | |
|
2026-06-22 11:03:48 -05:00 | | | bool Init(TSN::CYmlNode& parameters) override final;
|
2026-04-09 06:52:40 -05:00 | | | int Run() override final;
|
| | | void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam) override final;
|
| | | };
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
2026-05-29 11:19:18 -05:00 | | | WORKFLOWS_FACTORY_DEFINE_CREATOR_INC_TSN(CFlowAiDataLoadConfigInPlace, AiDataLoadConfigInPlace, "LoadConfigInPlace", "AiDataTaskRunner")
|
2026-04-09 06:52:40 -05:00 | | | //+------------------------------------------------------------------+
|
2026-06-22 11:03:48 -05:00 | | | bool CFlowAiDataLoadConfigInPlace::Init(TSN::CYmlNode ¶meters)
|
2026-04-09 06:52:40 -05:00 | | | {
|
2026-04-09 15:46:33 -05:00 | | | //---
|
2026-07-27 09:45:06 -05:00 | | | if(!m_wf.Variables().TryGet("__internal::chart_id", m_chart_id_p))
|
2026-04-09 15:46:33 -05:00 | | | {
|
| | | LogError("Fallo al obtener chart id", FUNCION_ACTUAL);
|
| | | return false;
|
| | | }
|
| | | bool comon;
|
2026-07-27 09:45:06 -05:00 | | | if(!m_wf.Variables().TryGet("__internal::common_flag", comon))
|
2026-04-09 15:46:33 -05:00 | | | {
|
2026-04-09 16:05:06 -05:00 | | | LogError("Fallo al obtener common flag", FUNCION_ACTUAL);
|
2026-04-09 15:46:33 -05:00 | | | return false;
|
| | | }
|
| | |
|
2026-04-09 06:52:40 -05:00 | | | //---
|
2026-07-27 09:45:06 -05:00 | | | m_file_name = parameters["file_name"].ToString("");
|
2026-04-10 15:42:04 -05:00 | | | ::ResetLastError();
|
2026-04-09 15:46:33 -05:00 | | | const int fh = FileOpen(m_file_name, FILE_WRITE | FILE_TXT | (comon ? FILE_COMMON : 0));
|
2026-04-09 06:52:40 -05:00 | | | if(fh == INVALID_HANDLE)
|
| | | {
|
2026-04-10 15:42:04 -05:00 | | | LogError(StringFormat("Fallo al abrir el archivo = '%s', ultimo error = %d", m_file_name, ::GetLastError()), FUNCION_ACTUAL);
|
2026-04-09 06:52:40 -05:00 | | | return false;
|
| | | }
|
| | |
|
| | | //---
|
2026-07-27 09:45:06 -05:00 | | | FileWrite(fh, parameters["progress_csv"].ToString(""));
|
| | | FileWrite(fh, parameters["main_folder"].ToString(""));
|
| | | FileWrite(fh, parameters["expert_path"].ToString(""));
|
| | | FileWrite(fh, parameters["file_name_json_config"].ToString(""));
|
2026-04-09 06:52:40 -05:00 | | |
|
| | | //---
|
| | | FileClose(fh);
|
| | |
|
| | | //---
|
| | | return true;
|
| | | }
|
| | | //+------------------------------------------------------------------+
|
| | | int CFlowAiDataLoadConfigInPlace::Run(void)
|
| | | {
|
2026-04-09 16:05:06 -05:00 | | | if(!::EventChartCustom(m_chart_id_p, AIDATATASKRUNER_API_ON_PARAM_CHANGE, g_first_chart_id,
|
2026-04-09 21:47:51 -05:00 | | | double(AIDATATASKRUNER_API_LOAD_CONFIG_IN_FILE), AiDataTaskRunnerEmpaquetar("wf", m_file_name)))
|
2026-04-09 06:52:40 -05:00 | | | {
|
| | | LogError("Fallo al enviar evento de load config", FUNCION_ACTUAL);
|
| | | return 1;
|
| | | }
|
| | | return 0;
|
| | | }
|
| | | //+------------------------------------------------------------------+
|
| | | void CFlowAiDataLoadConfigInPlace::ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam)
|
2026-04-08 20:35:41 -05:00 | | | {
|
| | | if(id == CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE)
|
| | | {
|
| | | if(lparam == AIDATATASKRUNER_API_LOAD_CONFIG_IN_FILE)
|
| | | {
|
| | | const int res = (dparam < 0.00 ? 1 : 0);
|
| | | if(res == 1)
|
| | | {
|
| | | static string id_tool, val;
|
| | | if(!AiDataTaskRunnerDesempaquetar(sparam, id_tool, val))
|
| | | {
|
| | | LogError(StringFormat("Formato invalido [event_id=%I64d]:\n%s", lparam, sparam), FUNCION_ACTUAL);
|
| | | return;
|
| | | }
|
| | | LogError(StringFormat("Fallo al ejecutar step, val: %s", val), FUNCION_ACTUAL);
|
| | | }
|
| | | m_wf._RecibedEvent(res);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| Save config in file |
|
| | | //+------------------------------------------------------------------+
|
2026-05-29 11:19:18 -05:00 | | | class CFlowAiDataSaveConfigInFile : public TSN::CWorkflowStep
|
2026-04-08 20:35:41 -05:00 | | | {
|
| | | private:
|
| | | string m_file_name;
|
2026-04-09 15:46:33 -05:00 | | | long m_chart_id_p;
|
2026-04-08 20:35:41 -05:00 | | |
|
| | | public:
|
2026-04-09 15:46:33 -05:00 | | | CFlowAiDataSaveConfigInFile(void) : CWorkflowStep("SaveConfigInFile", "AiDataTaskRunner", true, WORKFLOWBYLEO_STEP_FLAG_ON_CHART_EVENT) {}
|
2026-04-08 20:35:41 -05:00 | | | ~CFlowAiDataSaveConfigInFile(void) {}
|
| | |
|
2026-06-22 11:03:48 -05:00 | | | bool Init(TSN::CYmlNode& parameters) override final;
|
2026-04-08 20:35:41 -05:00 | | | int Run() override final;
|
| | | void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam) override final;
|
| | | };
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
2026-05-29 11:19:18 -05:00 | | | WORKFLOWS_FACTORY_DEFINE_CREATOR_INC_TSN(CFlowAiDataSaveConfigInFile, AiDataSaveConfigInFile, "SaveConfigInFile", "AiDataTaskRunner")
|
2026-04-08 20:35:41 -05:00 | | | //+------------------------------------------------------------------+
|
2026-06-22 11:03:48 -05:00 | | | bool CFlowAiDataSaveConfigInFile::Init(TSN::CYmlNode ¶meters)
|
2026-04-08 20:35:41 -05:00 | | | {
|
2026-04-09 15:46:33 -05:00 | | | //---
|
2026-07-27 09:45:06 -05:00 | | | if(!m_wf.Variables().TryGet("__internal::chart_id", m_chart_id_p))
|
2026-04-09 15:46:33 -05:00 | | | {
|
| | | LogError("Fallo al obtener chart id", FUNCION_ACTUAL);
|
| | | return false;
|
| | | }
|
| | | //---
|
2026-07-27 09:45:06 -05:00 | | | m_file_name = parameters["file_name"].ToString("");
|
2026-04-08 20:35:41 -05:00 | | | return true;
|
| | | }
|
| | | //+------------------------------------------------------------------+
|
| | | int CFlowAiDataSaveConfigInFile::Run(void)
|
| | | {
|
2026-04-09 16:05:06 -05:00 | | | if(!::EventChartCustom(m_chart_id_p, AIDATATASKRUNER_API_ON_PARAM_CHANGE, g_first_chart_id,
|
2026-04-09 21:47:51 -05:00 | | | double(AIDATATASKRUNER_API_SAVE_CONFIG_IN_FILE), AiDataTaskRunnerEmpaquetar("wf", m_file_name)))
|
2026-04-08 20:35:41 -05:00 | | | {
|
| | | LogError("Fallo al enviar evento de save config", FUNCION_ACTUAL);
|
| | | return 1;
|
| | | }
|
| | | return 0;
|
| | | }
|
| | | //+------------------------------------------------------------------+
|
| | | void CFlowAiDataSaveConfigInFile::ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam)
|
| | | {
|
| | | if(id == CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE)
|
| | | {
|
| | | if(lparam == AIDATATASKRUNER_API_SAVE_CONFIG_IN_FILE)
|
| | | {
|
| | | const int res = (dparam < 0.00 ? 1 : 0);
|
| | | if(res == 1)
|
| | | {
|
| | | static string id_tool, val;
|
| | | if(!AiDataTaskRunnerDesempaquetar(sparam, id_tool, val))
|
| | | {
|
| | | LogError(StringFormat("Formato invalido [event_id=%I64d]:\n%s", lparam, sparam), FUNCION_ACTUAL);
|
| | | return;
|
| | | }
|
| | | LogError(StringFormat("Fallo al ejecutar step, val: %s", val), FUNCION_ACTUAL);
|
| | | }
|
| | | m_wf._RecibedEvent(res);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
2026-07-06 08:44:57 -05:00 | | | //---
|
| | | }
|
2026-04-07 09:56:10 -05:00 | | | //+------------------------------------------------------------------+
|
2026-04-08 20:35:41 -05:00 | | | #endif // AIDATATASKRUNNER_BACKEND_WORKFLOWS_FLOWS_ALLFLOWS_MQH
|