2026-04-01 13:21:18 -05:00
//+------------------------------------------------------------------+
//| 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"
2026-04-17 22:43:49 -05:00
//---
//#define AIDATATASKRUNER_API_DEBUG
2026-04-01 13:21:18 -05:00
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
// 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
2026-04-17 17:26:58 -05:00
// dparam=fallo\exito
2026-04-01 13:21:18 -05:00
// sparam=info (empaquetada)
2026-04-17 22:43:49 -05:00
//---
# ifdef AIDATATASKRUNER_API_DEBUG
PRINT_EVENT ( h , id , lparam , dparam , sparam )
# endif // AIDATATASKRUNER_API_DEBUG
//---
2026-04-01 13:21:18 -05:00
const uint8_t event_id = uint8_t ( dparam ) ;
//---
static string id_call , val ;
if ( ! AiDataTaskRunnerDesempaquetar ( sparam , id_call , val ) )
{
2026-04-17 22:43:49 -05:00
LogError ( " Formato invalido de empauqetacion de api (val recibido de tlgm) " , FUNCION_ACTUAL ) ;
2026-04-01 13:21:18 -05:00
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 \n se 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
{
2026-04-10 15:42:04 -05:00
int arr [ ] ;
const bool ok = m_fronted . RunAllTask ( arr ) ;
2026-04-01 13:21:18 -05:00
if ( ok )
{
: : EventChartCustom ( lparam , AIDATATASKRUNER_API_ON_PARAM_CHANGE ,
AIDATATASKRUNER_API_EXECUTE_ALL_TASK_OF_TABLE , AIDATATASKRUNER_API_RES_EXITO ,
2026-04-10 15:42:04 -05:00
AiDataTaskRunnerEmpaquetar ( id_call , StringFormat ( " Task run: [%s] " , ArrayToString ( arr , " , " ) ) ) ) ;
2026-04-01 13:21:18 -05:00
}
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 ;
}
2026-04-10 15:42:04 -05:00
//---
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 ;
}
2026-04-01 13:21:18 -05:00
//---
default :
break ;
}
}
}
//+------------------------------------------------------------------+
# endif // AIDATATASKRUNNER_BACKEND_API_API_MQH