373 lines
14 KiB
MQL5
373 lines
14 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| Reciber.mqh |
|
|
//| Copyright 2026,Niquel Mendoza. |
|
|
//| https://www.mql5.com/en/users/nique_372 |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2026,Niquel Mendoza."
|
|
#property link "https://www.mql5.com/en/users/nique_372"
|
|
#property strict
|
|
|
|
#ifndef AIDATATASKRUNNER_BACKEND_API_API_MQH
|
|
#define AIDATATASKRUNNER_BACKEND_API_API_MQH
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
#include "Protocol\\Def.mqh"
|
|
|
|
//--- Frontend:
|
|
// Generacion de datos (aqui tambien va el backend pero como interfaz)
|
|
#include "..\\..\\UI\\DataGenerationTab\\Base.mqh"
|
|
|
|
//---
|
|
//#define AIDATATASKRUNER_API_DEBUG
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
// Esta clase se encarga de procesar las llamadas que se le hacen
|
|
// Aplicarlas y sincronizar el frontend
|
|
class CAiDataTaskRunnerApiReciber : public CLoggerBase
|
|
{
|
|
private:
|
|
ITaskRunerAi* m_backend;
|
|
CTaskRunerAiTabDGenMain* m_fronted;
|
|
const long m_chart_id;
|
|
|
|
public:
|
|
CAiDataTaskRunnerApiReciber(void) : m_chart_id(ChartID()) {}
|
|
~CAiDataTaskRunnerApiReciber(void) {}
|
|
|
|
//---
|
|
void SetDataGeneration(ITaskRunerAi* backend, CTaskRunerAiTabDGenMain* fronted);
|
|
bool Init();
|
|
void Deinit();
|
|
|
|
|
|
//---
|
|
void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam);
|
|
};
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
bool CAiDataTaskRunnerApiReciber::Init()
|
|
{
|
|
const string file_name = AIDATATASKRUNER_API_GLOBAL_IDS_FOLDER + ::StringFormat("%I64d.bin", m_chart_id);
|
|
::ResetLastError();
|
|
const int fh = FileOpen(file_name, FILE_WRITE | FILE_BIN);
|
|
if(fh == INVALID_HANDLE)
|
|
{
|
|
LogError(StringFormat("Fallo al registrar chart id = %I64d, err=%d", m_chart_id, ::GetLastError()), FUNCION_ACTUAL);
|
|
return false;
|
|
}
|
|
FileClose(fh);
|
|
return true;
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CAiDataTaskRunnerApiReciber::Deinit()
|
|
{
|
|
const string file_name = AIDATATASKRUNER_API_GLOBAL_IDS_FOLDER + StringFormat("%I64d.bin", m_chart_id);
|
|
FileDelete(file_name);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CAiDataTaskRunnerApiReciber::SetDataGeneration(ITaskRunerAi* backend, CTaskRunerAiTabDGenMain* fronted)
|
|
{
|
|
m_backend = backend;
|
|
m_fronted = fronted;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CAiDataTaskRunnerApiReciber::ChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
|
|
{
|
|
//---
|
|
if(id == CHARTEVENT_CUSTOM + AIDATATASKRUNER_API_ON_PARAM_CHANGE)
|
|
{
|
|
//---
|
|
// De entrada: (api recibe datos)
|
|
// lparam= Chart id de donde se envia (de que chart id se envia)
|
|
// dparam= Id del evento (como id de la funcion) que se desea correr
|
|
// sparam= IdCall\"Parametros
|
|
|
|
//---
|
|
// De salida: (api responde al que le envio datos)
|
|
// lparam=evento respondiido
|
|
// dparam=fallo\exito
|
|
// sparam=info (empaquetada)
|
|
|
|
//---
|
|
#ifdef AIDATATASKRUNER_API_DEBUG
|
|
PRINT_EVENT(h, id, lparam, dparam, sparam)
|
|
#endif // AIDATATASKRUNER_API_DEBUG
|
|
|
|
//---
|
|
const uint8_t event_id = uint8_t(dparam);
|
|
|
|
//---
|
|
static string id_call, val;
|
|
if(!AiDataTaskRunnerDesempaquetar(sparam, id_call, val))
|
|
{
|
|
LogError("Formato invalido de empauqetacion de api (val recibido de tlgm)", FUNCION_ACTUAL);
|
|
return;
|
|
}
|
|
|
|
//---
|
|
switch(event_id)
|
|
{
|
|
case 0: // AIDATATASKRUNER_API_ADD_TASK_TO_TABLE
|
|
{
|
|
//---
|
|
static string arr[TASKTESTER_VALUES];
|
|
if(StringSplit(val, AIDATATASKRUNER_API_SEPARATOR_PARAM, arr) != TASKTESTER_VALUES)
|
|
{
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE, AIDATATASKRUNER_API_ADD_TASK_TO_TABLE, AIDATATASKRUNER_API_RES_FALLO,
|
|
AiDataTaskRunnerEmpaquetar(id_call, "Invalid format"));
|
|
return;
|
|
}
|
|
|
|
//---
|
|
static TaskTester task;
|
|
task.Assing(arr);
|
|
const bool ok = m_backend.AddDirectTask(task);
|
|
|
|
//---
|
|
if(ok)
|
|
{
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE, AIDATATASKRUNER_API_ADD_TASK_TO_TABLE
|
|
, AIDATATASKRUNER_API_RES_EXITO, AiDataTaskRunnerEmpaquetar(id_call, "Task added successfully"));
|
|
}
|
|
else
|
|
{
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE, AIDATATASKRUNER_API_ADD_TASK_TO_TABLE,
|
|
AIDATATASKRUNER_API_RES_FALLO, AiDataTaskRunnerEmpaquetar(id_call, m_backend.m_last_error_msg));
|
|
}
|
|
|
|
|
|
//---
|
|
break;
|
|
}
|
|
|
|
//---
|
|
case 1: // AIDATATASKRUNER_API_SAVE_TASK_IN_FILE
|
|
{
|
|
//---
|
|
static string arr[2];
|
|
if(StringSplit(val, AIDATATASKRUNER_API_SEPARATOR_PARAM, arr) != 2)
|
|
{
|
|
LogError("Fallo al parsear val, para añadir nueva tarea, formato invalido\nse debe de separar con | y en los valores no tener el carcter |", FUNCION_ACTUAL);
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE, AIDATATASKRUNER_API_SAVE_TASK_IN_FILE, AIDATATASKRUNER_API_RES_FALLO,
|
|
AiDataTaskRunnerEmpaquetar(id_call, "Invalid format, use | for separate bool parameter and file name"));
|
|
return;
|
|
}
|
|
|
|
|
|
//---
|
|
if(!m_backend.SaveAllTaskInFile(arr[1], bool(int(arr[0])))) // Añadimos internamente
|
|
{
|
|
const string str = StringFormat("Failed to save tasks to file = %s, last error:\n%s", val, m_backend.m_last_error_msg);
|
|
LogError(str, FUNCION_ACTUAL);
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE, AIDATATASKRUNER_API_SAVE_TASK_IN_FILE, AIDATATASKRUNER_API_RES_FALLO,
|
|
AiDataTaskRunnerEmpaquetar(id_call, str));
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE, AIDATATASKRUNER_API_SAVE_TASK_IN_FILE, AIDATATASKRUNER_API_RES_EXITO,
|
|
AiDataTaskRunnerEmpaquetar(id_call, StringFormat("Successfully saving all tasks to file %s, in %s base folder", arr[1])));
|
|
}
|
|
|
|
//---
|
|
break;
|
|
}
|
|
|
|
|
|
//---
|
|
case 2: // AIDATATASKRUNER_API_LOAD_TASK_IN_FILE
|
|
{
|
|
//---
|
|
if(!m_backend.SetTastByFile(val)) // Añadimos internamente
|
|
{
|
|
const string str = StringFormat("Failed to load tasks from file = %s", val);
|
|
LogError(str, FUNCION_ACTUAL);
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE, AIDATATASKRUNER_API_LOAD_TASK_IN_FILE, AIDATATASKRUNER_API_RES_FALLO,
|
|
AiDataTaskRunnerEmpaquetar(id_call, str));
|
|
}
|
|
else
|
|
{
|
|
m_fronted.SincronizeFrontendOfBackend(TASKRUNERAIDGENMAIN_FLAG_TABLE); // sincronizamos la tabla con los elementos del backend
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE, AIDATATASKRUNER_API_LOAD_TASK_IN_FILE, AIDATATASKRUNER_API_RES_EXITO,
|
|
AiDataTaskRunnerEmpaquetar(id_call, "Tasks loaded successfully"));
|
|
}
|
|
|
|
//---
|
|
break;
|
|
}
|
|
|
|
//---
|
|
case 3: // AIDATATASKRUNER_API_TASK_TOTAL
|
|
{
|
|
//---
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE, AIDATATASKRUNER_API_TASK_TOTAL, AIDATATASKRUNER_API_RES_EXITO,
|
|
AiDataTaskRunnerEmpaquetar(id_call, string(m_backend.TaskSize())));
|
|
|
|
//---
|
|
break;
|
|
}
|
|
|
|
//---
|
|
case 4: // AIDATATASKRUNER_API_GET_TASK_BY_INDEX
|
|
{
|
|
//---
|
|
const int index = int(val);
|
|
if(index < 0 || index >= m_backend.TaskSize())
|
|
{
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE, AIDATATASKRUNER_API_GET_TASK_BY_INDEX,
|
|
AIDATATASKRUNER_API_RES_FALLO, AiDataTaskRunnerEmpaquetar(id_call, StringFormat("Invalid index acces = %d ", index)));
|
|
break;
|
|
}
|
|
|
|
//---
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE, AIDATATASKRUNER_API_GET_TASK_BY_INDEX, AIDATATASKRUNER_API_RES_EXITO,
|
|
AiDataTaskRunnerEmpaquetar(id_call, string(m_backend.GetTaskByIndex(index).ToStringFile())));
|
|
|
|
//---
|
|
break;
|
|
}
|
|
|
|
case 5: // AIDATATASKRUNER_API_CLEAN_ALL_TASK_OF_TABLE
|
|
{
|
|
const bool ok = m_fronted.CleanAllTask();
|
|
if(ok)
|
|
{
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE,
|
|
AIDATATASKRUNER_API_CLEAN_ALL_TASK_OF_TABLE, AIDATATASKRUNER_API_RES_EXITO,
|
|
AiDataTaskRunnerEmpaquetar(id_call, "All tasks cleaned"));
|
|
}
|
|
else
|
|
{
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE,
|
|
AIDATATASKRUNER_API_CLEAN_ALL_TASK_OF_TABLE, AIDATATASKRUNER_API_RES_FALLO,
|
|
AiDataTaskRunnerEmpaquetar(id_call, "No tasks to clean"));
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 6: // AIDATATASKRUNER_API_EXECUTE_ALL_TASK_OF_TABLE
|
|
{
|
|
int arr[];
|
|
const bool ok = m_fronted.RunAllTask(arr);
|
|
if(ok)
|
|
{
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE,
|
|
AIDATATASKRUNER_API_EXECUTE_ALL_TASK_OF_TABLE, AIDATATASKRUNER_API_RES_EXITO,
|
|
AiDataTaskRunnerEmpaquetar(id_call, StringFormat("Task run: [%s]", ArrayToString(arr, ","))));
|
|
}
|
|
else
|
|
{
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE,
|
|
AIDATATASKRUNER_API_EXECUTE_ALL_TASK_OF_TABLE, AIDATATASKRUNER_API_RES_FALLO,
|
|
AiDataTaskRunnerEmpaquetar(id_call, "No pending tasks"));
|
|
}
|
|
break;
|
|
}
|
|
|
|
//---
|
|
case 7: // AIDATATASKRUNER_API_LOAD_CONFIG_IN_FILE
|
|
{
|
|
const bool ok = m_backend.LoadConfig(val);
|
|
if(ok)
|
|
{
|
|
m_fronted.SincronizeFrontendOfBackend(TASKRUNERAIDGENMAIN_FLAG_CONFIG);
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE,
|
|
AIDATATASKRUNER_API_LOAD_CONFIG_IN_FILE, AIDATATASKRUNER_API_RES_EXITO,
|
|
AiDataTaskRunnerEmpaquetar(id_call, "Config loaded successfully"));
|
|
}
|
|
else
|
|
{
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE,
|
|
AIDATATASKRUNER_API_LOAD_CONFIG_IN_FILE, AIDATATASKRUNER_API_RES_FALLO,
|
|
AiDataTaskRunnerEmpaquetar(id_call, StringFormat("Failed: %s", m_backend.m_last_error_msg)));
|
|
}
|
|
break;
|
|
}
|
|
|
|
//---
|
|
case 8: // AIDATATASKRUNER_API_SAVE_CONFIG_IN_FILE
|
|
{
|
|
const bool ok = m_backend.SaveConfig(val);
|
|
if(ok)
|
|
{
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE,
|
|
AIDATATASKRUNER_API_SAVE_CONFIG_IN_FILE, AIDATATASKRUNER_API_RES_EXITO,
|
|
AiDataTaskRunnerEmpaquetar(id_call, "Config saved successfully"));
|
|
}
|
|
else
|
|
{
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE,
|
|
AIDATATASKRUNER_API_SAVE_CONFIG_IN_FILE, AIDATATASKRUNER_API_RES_FALLO,
|
|
AiDataTaskRunnerEmpaquetar(id_call, StringFormat("Failed: %s", m_backend.m_last_error_msg)));
|
|
}
|
|
break;
|
|
}
|
|
|
|
//---
|
|
case 9: // AIDATATASKRUNER_API_MAIN_FOLDER
|
|
{
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE, AIDATATASKRUNER_API_MAIN_FOLDER, AIDATATASKRUNER_API_RES_EXITO,
|
|
AiDataTaskRunnerEmpaquetar(id_call, AIDATATASKRUNER_BASE_FOLDER));
|
|
break;
|
|
}
|
|
|
|
//---
|
|
case 10: // AIDATATASKRUNER_API_TASK_FOLDER
|
|
{
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE, AIDATATASKRUNER_API_TASK_FOLDER, AIDATATASKRUNER_API_RES_EXITO,
|
|
AiDataTaskRunnerEmpaquetar(id_call, AIDATATASKRUNER_PATH_TASK));
|
|
break;
|
|
}
|
|
|
|
//---
|
|
case 11: // AIDATATASKRUNER_API_IS_IN_COMMON_FOLDER
|
|
{
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE, AIDATATASKRUNER_API_IS_IN_COMMON_FOLDER, AIDATATASKRUNER_API_RES_EXITO,
|
|
AiDataTaskRunnerEmpaquetar(id_call, g_aidatatask_runner_config_g.comon_flag ? "1" : "0"));
|
|
break;
|
|
}
|
|
|
|
//---
|
|
case AIDATATASKRUNER_API_GET_TASK_STATUS:
|
|
{
|
|
//---
|
|
const int index = int(val);
|
|
if(index < 0 || index >= m_backend.TaskSize())
|
|
{
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE, AIDATATASKRUNER_API_GET_TASK_STATUS,
|
|
AIDATATASKRUNER_API_RES_FALLO, AiDataTaskRunnerEmpaquetar(id_call, StringFormat("Invalid index acces = %d ", index)));
|
|
break;
|
|
}
|
|
|
|
//---
|
|
::EventChartCustom(lparam, AIDATATASKRUNER_API_ON_PARAM_CHANGE, AIDATATASKRUNER_API_GET_TASK_STATUS, AIDATATASKRUNER_API_RES_EXITO,
|
|
AiDataTaskRunnerEmpaquetar(id_call, string(int(m_backend.GetTaskStatus(index)))));
|
|
|
|
break;
|
|
}
|
|
|
|
//---
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
#endif // AIDATATASKRUNNER_BACKEND_API_API_MQH
|