forked from nique_372/AiDataTaskRuner
268 lines
10 KiB
MQL5
268 lines
10 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| Sender.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_TLGM_SENDER_MQH
|
|
#define AIDATATASKRUNNER_BACKEND_TLGM_SENDER_MQH
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
//--- Clase base
|
|
#include <TSN\\LLM\\TlgSender.mqh>
|
|
|
|
//--- Defincion del protocolko de comunicacion
|
|
#include "Protocol\\Def.mqh"
|
|
|
|
//--- Backend | Frontend de la app (tab dgen)
|
|
#include "..\\..\\UI\\DataGenerationTab\\Base.mqh"
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
#define EXPERT_TELEGRAM_PATH "Experts\\Shared Projects\\AiDataTaskRuner\\Backend\\Tlgm\\TlgBot.ex5"
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
class CChatTelegramAgentLLmSenderAdtr : public CChatTelegramAgentLLmBase
|
|
{
|
|
private:
|
|
ITaskRunerAi* m_backend;
|
|
CTaskRunerAiTabDGenMain* m_fronted;
|
|
|
|
public:
|
|
CChatTelegramAgentLLmSenderAdtr(void) {}
|
|
~CChatTelegramAgentLLmSenderAdtr(void) {}
|
|
|
|
//---
|
|
void Set(ITaskRunerAi* backend, CTaskRunerAiTabDGenMain* fronted);
|
|
void ChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam);
|
|
};
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CChatTelegramAgentLLmSenderAdtr::Set(ITaskRunerAi* backend, CTaskRunerAiTabDGenMain* fronted)
|
|
{
|
|
m_backend = backend;
|
|
m_fronted = fronted;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CChatTelegramAgentLLmSenderAdtr::ChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
|
|
{
|
|
//---
|
|
if(id == CHARTEVENT_CUSTOM + CHATELGRAM_E_ON_CHANGE_PARAM && fabs(dparam - m_key) < 0.10)
|
|
{
|
|
int8_t event_id = int8_t(lparam - TLG_RECIBER_BASE_MAX_LPARAM);
|
|
if(event_id <= 0) // el evento no nos interesa (es para tab base aunque no envia igual comprobamos)
|
|
return;
|
|
event_id -= 1; // para que sea 0
|
|
|
|
|
|
//---
|
|
static string id_tool, val;
|
|
if(!TlgLlmProtocolDesempaquetar(sparam, id_tool, val))
|
|
{
|
|
LogError("Formato invalido de empauqetacion de telegram (val recibido de tlgm)", FUNCION_ACTUAL);
|
|
return;
|
|
}
|
|
|
|
//---
|
|
switch(event_id)
|
|
{
|
|
case 0: // TLGM_RECIBER_PARAM_TOOL_ADD_TASK_TO_TABLE
|
|
{
|
|
//---
|
|
static string arr[TASKTESTER_VALUES];
|
|
if(StringSplit(val, '|', arr) != TASKTESTER_VALUES)
|
|
{
|
|
::EventChartCustom(m_bot_chart_id, CHATELGRAM_E_ON_CHANGE_PARAM, TLGM_RECIBER_PARAM_TOOL_ADD_TASK_TO_TABLE, m_key,
|
|
TlgLlmProtocolEmpaquetar(id_tool, "Invalid format"));
|
|
return;
|
|
}
|
|
static TaskTester task;
|
|
task.Assing(arr);
|
|
const bool ok = m_backend.AddDirectTask(task);
|
|
::EventChartCustom(m_bot_chart_id, CHATELGRAM_E_ON_CHANGE_PARAM, TLGM_RECIBER_PARAM_TOOL_ADD_TASK_TO_TABLE, m_key,
|
|
TlgLlmProtocolEmpaquetar(id_tool, (ok ? "Task added successfully" : m_backend.m_last_error_msg)));
|
|
|
|
//---
|
|
break;
|
|
}
|
|
|
|
//---
|
|
case 1: // TLGM_RECIBER_PARAM_TOOL_SAVE_TASK_IN_FILE
|
|
{
|
|
//---
|
|
static string arr[2];
|
|
if(StringSplit(val, '|', 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(m_bot_chart_id, CHATELGRAM_E_ON_CHANGE_PARAM, TLGM_RECIBER_PARAM_TOOL_SAVE_TASK_IN_FILE, m_key,
|
|
TlgLlmProtocolEmpaquetar(id_tool, "Invalid format, use | for separate bool parameter and file name"));
|
|
return;
|
|
}
|
|
|
|
|
|
//---
|
|
arr[1] = AIDATATASKRUNER_PATH_TASK + arr[1];
|
|
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(m_bot_chart_id, CHATELGRAM_E_ON_CHANGE_PARAM, TLGM_RECIBER_PARAM_TOOL_SAVE_TASK_IN_FILE, m_key,
|
|
TlgLlmProtocolEmpaquetar(id_tool, str));
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
::EventChartCustom(m_bot_chart_id, CHATELGRAM_E_ON_CHANGE_PARAM, TLGM_RECIBER_PARAM_TOOL_SAVE_TASK_IN_FILE, m_key,
|
|
TlgLlmProtocolEmpaquetar(id_tool, StringFormat("Successfully saving all tasks to file %s, in %s base folder", arr[1])));
|
|
}
|
|
|
|
//---
|
|
break;
|
|
}
|
|
|
|
|
|
//---
|
|
case 2: // TLGM_RECIBER_PARAM_TOOL_LOAD_TASK_IN_FILE
|
|
{
|
|
//---
|
|
val = AIDATATASKRUNER_PATH_TASK + val;
|
|
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(m_bot_chart_id, CHATELGRAM_E_ON_CHANGE_PARAM, TLGM_RECIBER_PARAM_TOOL_LOAD_TASK_IN_FILE, m_key,
|
|
TlgLlmProtocolEmpaquetar(id_tool, str));
|
|
}
|
|
else
|
|
{
|
|
m_fronted.SincronizeFrontendOfBackend(TASKRUNERAIDGENMAIN_FLAG_TABLE); // sincronizamos la tabla con los elementos del backend
|
|
}
|
|
|
|
//---
|
|
break;
|
|
}
|
|
|
|
//---
|
|
case 3: // TLGM_RECIBER_PARAM_TOOL_TASK_TOTAL
|
|
{
|
|
//---
|
|
::EventChartCustom(m_bot_chart_id, CHATELGRAM_E_ON_CHANGE_PARAM, TLGM_RECIBER_PARAM_TOOL_TASK_TOTAL, m_key,
|
|
TlgLlmProtocolEmpaquetar(id_tool, string(m_backend.TaskSize())));
|
|
|
|
//---
|
|
break;
|
|
}
|
|
|
|
//---
|
|
case 4: // TLGM_RECIBER_PARAM_TOOL_GET_TASK_BY_INDEX
|
|
{
|
|
//---
|
|
const int index = int(val);
|
|
if(index < 0 || index >= m_backend.TaskSize())
|
|
{
|
|
::EventChartCustom(m_bot_chart_id, CHATELGRAM_E_ON_CHANGE_PARAM, TLGM_RECIBER_PARAM_TOOL_GET_TASK_BY_INDEX,
|
|
m_key, TlgLlmProtocolEmpaquetar(id_tool, StringFormat("Invalid index acces = %d ", index)));
|
|
}
|
|
|
|
//---
|
|
::EventChartCustom(m_bot_chart_id, CHATELGRAM_E_ON_CHANGE_PARAM, TLGM_RECIBER_PARAM_TOOL_GET_TASK_BY_INDEX, m_key,
|
|
TlgLlmProtocolEmpaquetar(id_tool, string(m_backend.GetTaskByIndex(index).ToStringFile())));
|
|
|
|
//---
|
|
break;
|
|
}
|
|
|
|
//---
|
|
case 5: // TLGM_RECIBER_PARAM_TOOL_CLEAN_ALL_TASK_OF_TABLE
|
|
{
|
|
const bool ok = m_fronted.CleanAllTask();
|
|
::EventChartCustom(m_bot_chart_id, CHATELGRAM_E_ON_CHANGE_PARAM,
|
|
TLGM_RECIBER_PARAM_TOOL_CLEAN_ALL_TASK_OF_TABLE, m_key,
|
|
TlgLlmProtocolEmpaquetar(id_tool, ok ? "All tasks cleaned" : "No tasks to clean"));
|
|
break;
|
|
}
|
|
|
|
//---
|
|
case 6: // TLGM_RECIBER_PARAM_TOOL_EXECUTE_ALL_TASK_OF_TABLE
|
|
{
|
|
const bool ok = m_fronted.RunAllTask();
|
|
::EventChartCustom(m_bot_chart_id, CHATELGRAM_E_ON_CHANGE_PARAM,
|
|
TLGM_RECIBER_PARAM_TOOL_EXECUTE_ALL_TASK_OF_TABLE, m_key,
|
|
TlgLlmProtocolEmpaquetar(id_tool, ok ? "All tasks queued for execution" : "No pending tasks"));
|
|
break;
|
|
}
|
|
|
|
//---
|
|
case 7: // TLGM_RECIBER_PARAM_TOOL_LOAD_CONFIG_IN_FILE
|
|
{
|
|
val = AIDATATASKRUNER_PATH_TASK + val;
|
|
const bool ok = m_backend.LoadConfig(val);
|
|
if(ok)
|
|
m_fronted.SincronizeFrontendOfBackend(TASKRUNERAIDGENMAIN_FLAG_CONFIG);
|
|
::EventChartCustom(m_bot_chart_id, CHATELGRAM_E_ON_CHANGE_PARAM, TLGM_RECIBER_PARAM_TOOL_LOAD_CONFIG_IN_FILE, m_key,
|
|
TlgLlmProtocolEmpaquetar(id_tool, ok ? "Config loaded successfully" : StringFormat("Failed: %s", m_backend.m_last_error_msg)));
|
|
break;
|
|
}
|
|
|
|
//---
|
|
case 8: // TLGM_RECIBER_PARAM_TOOL_SAVE_CONFIG_IN_FILE
|
|
{
|
|
val = AIDATATASKRUNER_PATH_TASK + val;
|
|
const bool ok = m_backend.SaveConfig(val);
|
|
::EventChartCustom(m_bot_chart_id, CHATELGRAM_E_ON_CHANGE_PARAM, TLGM_RECIBER_PARAM_TOOL_SAVE_CONFIG_IN_FILE, m_key,
|
|
TlgLlmProtocolEmpaquetar(id_tool, ok ? "Config saved successfully" : StringFormat("Failed: %s", m_backend.m_last_error_msg)));
|
|
break;
|
|
}
|
|
|
|
//---
|
|
case 9: // TLGM_RECIBER_PARAM_TOOL_MAIN_FOLDER
|
|
{
|
|
::EventChartCustom(m_bot_chart_id, CHATELGRAM_E_ON_CHANGE_PARAM, TLGM_RECIBER_PARAM_TOOL_MAIN_FOLDER, m_key,
|
|
TlgLlmProtocolEmpaquetar(id_tool, AIDATATASKRUNER_BASE_FOLDER));
|
|
break;
|
|
}
|
|
|
|
//---
|
|
case 10: // TLGM_RECIBER_PARAM_TOOL_TASK_FOLDER
|
|
{
|
|
::EventChartCustom(m_bot_chart_id, CHATELGRAM_E_ON_CHANGE_PARAM, TLGM_RECIBER_PARAM_TOOL_MAIN_FOLDER, m_key,
|
|
TlgLlmProtocolEmpaquetar(id_tool, AIDATATASKRUNER_PATH_TASK));
|
|
break;
|
|
}
|
|
|
|
//---
|
|
case 11: // TLGM_RECIBER_PARAM_TOOL_IS_IN_COMMON_FOLDER
|
|
{
|
|
::EventChartCustom(m_bot_chart_id, CHATELGRAM_E_ON_CHANGE_PARAM, TLGM_RECIBER_PARAM_TOOL_IS_IN_COMMON_FOLDER, m_key,
|
|
TlgLlmProtocolEmpaquetar(id_tool, g_aidatatask_runner_config_g.comon_flag ? "1" : "0"));
|
|
break;
|
|
}
|
|
|
|
//---
|
|
default:
|
|
break;
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
#endif // AIDATATASKRUNNER_BACKEND_TLGM_SENDER_MQH
|
|
//+------------------------------------------------------------------+
|