2026-03-25 09:57:33 -05:00
//+------------------------------------------------------------------+
2026-03-20 10:20:00 -05:00
//| ConfigTab.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 AIDATATASKRUNER_UI_TRAINING_CONFIGTAB_MQH
# define AIDATATASKRUNER_UI_TRAINING_CONFIGTAB_MQH
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
# include "..\\Defines.mqh"
2026-06-03 22:07:50 -05:00
//--- Funciones como
# include <TSN\\ExtraCodes\\Func.mqh>
2026-03-20 17:16:21 -05:00
//--- Json para parsear (con el exe comunicador)
# include <TSN\\Json\\Json.mqh>
2026-03-24 10:39:38 -05:00
//--- Expert para lanzar eas
# include <TSN\\ExtraCodes\\Expert.mqh>
//--- Def para el procoolo de comunciaon
# include "..\\..\\Backend\\Training\\Def.mqh"
2026-03-25 18:05:47 -05:00
//--- Dll custom para filse eslec dialog con mas alcanzse
# include "..\\..\\DllFilseSelctDialog\\DllFilseSelctDialog\\Main.mqh"
2026-03-24 10:39:38 -05:00
2026-03-20 10:20:00 -05:00
/*
[ CTrainingTabConfig ]
2026-03-21 08:06:31 -05:00
//--- Parte general
2026-03-20 10:20:00 -05:00
m_label_titulo = " Config "
m_label_name_file = " Config file: "
m_label_name_file_val_tooltip = " Selected config file "
2026-03-21 11:41:29 -05:00
m_btn_name_file_browse = " Browse "
m_btn_name_file_browse_tooltip = " Select config JSON file "
2026-03-20 10:20:00 -05:00
m_btn_open = " Open "
m_btn_open_tooltip = " Open file in default editor "
2026-03-20 17:16:21 -05:00
2026-03-21 08:06:31 -05:00
//--- Parte de python
2026-03-20 17:16:21 -05:00
m_label_tit_run_py = " Run python "
2026-03-21 11:41:29 -05:00
m_label_py_file = " Python file: "
m_label_py_file_val_tooltip = " Path to the Python script or executable "
m_btn_py_file_browse = " Browse "
m_btn_py_file_browse_tooltip = " Select a .py script or .exe executable "
2026-03-20 17:16:21 -05:00
2026-03-24 10:39:38 -05:00
// Edit timeout
m_edit_py_max_tiemout = " Tiemout for execute py: "
m_edit_py_max_tiemout_tooltup = " Enter the value in seconds for the maximum time the py can run "
2026-03-20 17:16:21 -05:00
// Boton
m_btn_run_py = " Run "
m_btn_run_py_tooltip = " Click here to run python exe "
m_btn_run_py_running = " Running... "
2026-03-21 08:06:31 -05:00
//--- Mensajes espeficiso por funcion
OnClickBottom_error_select_file = " No file selected "
2026-03-20 17:16:21 -05:00
OnClickBottom_no_config_selected = " No config file selected "
OnClickBottom_python_is_runing = " Python is already running "
2026-03-21 11:41:29 -05:00
OnClickBottom_python_no_py_selected = " No python \ exe files selected "
2026-03-24 10:39:38 -05:00
// Error de laucher
OnClickBottom_python_launch_error_file = " Failed to write in args.txt for launcher for python, last error = %d "
OnClickBottom_python_launch_error_exe = " Failed to execute launcher, Check the terminal logs "
2026-03-24 10:47:07 -05:00
OnClickBottom_python_launch_python_launch_error_chart = " Failed to open chart, last error = %d "
2026-03-20 10:20:00 -05:00
* /
2026-03-20 17:16:21 -05:00
//---
# define AIDATATASKRUNNER_TRAINING_NUM_C ( 80 )
2026-03-24 10:39:38 -05:00
# define AIDATATASKRUNNER_FILENAME_ARGS_LAUNCHER ( " LauncherPy \\ args.txt " )
2026-03-28 10:58:12 -05:00
# define AIDATATASKRUNNER_FILENAME_BAT_PY ( " LauncherPy \\ py.bat " )
2026-03-20 17:16:21 -05:00
2026-03-20 10:20:00 -05:00
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
2026-03-20 17:16:21 -05:00
class IRunPy : public CLoggerBase
{
public :
IRunPy ( void ) { }
~ IRunPy ( void ) { }
//---
virtual void OnTrainingInit ( ) { }
virtual void OnTrainingEnd ( ) { }
2026-06-03 22:07:50 -05:00
virtual void OnTrainingNewResult ( TSN : : CJsonNode & json ) { }
2026-03-21 08:06:31 -05:00
//---
virtual __forceinline uint8_t EventsFlags ( ) const = 0 ;
2026-03-20 17:16:21 -05:00
} ;
//---
# define TRAINING_RUNNER_PY_FLAG_ON_TRAINIG ( 1 )
# define TRAINING_RUNNER_PY_FLAG_ON_INIT ( 2 )
# define TRAINING_RUNNER_PY_FLAG_ON_DEINIT ( 4 )
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class CTrainingTabConfig : public CGuiBaseComponent < CLoggerBase >
2026-03-20 10:20:00 -05:00
{
private :
2026-06-03 22:07:50 -05:00
//---
TSN : : CJsonParser m_json_parser ;
//---
2026-03-20 10:20:00 -05:00
CTextLabel m_label_titulo ;
CTextLabel m_label_name_file ;
CTextLabel m_label_name_file_val ;
2026-03-21 11:41:29 -05:00
CButton m_btn_name_file_browse ;
2026-03-20 10:20:00 -05:00
CButton m_btn_open ;
2026-03-25 09:57:33 -05:00
CButton m_btn_file_config_template ;
2026-03-21 11:41:29 -05:00
//---
2026-03-20 17:16:21 -05:00
CTextLabel m_label_tit_run_py ;
2026-03-26 11:23:24 -05:00
// Py file
2026-03-21 11:41:29 -05:00
CTextLabel m_label_py_file ;
CTextLabel m_label_py_file_val ;
CButton m_btn_py_file_browse ;
2026-03-26 11:23:24 -05:00
// Log file
CTextLabel m_label_log_pyfile ;
CTextLabel m_label_log_pyfile_val ;
CButton m_btn_logpyfile_browse ;
// Max timeout
2026-03-24 10:39:38 -05:00
CTextEdit m_edit_py_max_tiemout ;
2026-03-26 11:23:24 -05:00
// Btn run final
2026-03-20 17:16:21 -05:00
CButton m_btn_run_py ;
2026-03-26 11:23:24 -05:00
//---
2026-03-21 11:41:29 -05:00
string m_py_file_extension ;
2026-03-20 17:16:21 -05:00
2026-03-20 10:20:00 -05:00
//---
2026-03-20 17:16:21 -05:00
bool m_py_is_run ;
2026-03-20 10:20:00 -05:00
bool m_common_flag ;
2026-03-20 17:16:21 -05:00
int m_extra_file_flags ;
string m_base_terminal_files_path ;
//---
string m_path_to_config_json ;
string m_path_to_lock_bin ;
2026-03-24 10:39:38 -05:00
string m_path_to_ea_launcher ;
2026-03-26 11:23:24 -05:00
string m_path_to_log_py ;
2026-03-28 08:35:32 -05:00
string m_path_py_interpete ;
2026-03-28 10:58:12 -05:00
string m_python_path_env ;
2026-03-24 10:39:38 -05:00
uint m_timeout_for_execute_py ;
2026-03-20 17:16:21 -05:00
//---
IRunPy * m_runer_py_on_pass [ ] ;
int m_runer_py_on_pass_size ;
IRunPy * m_runer_py_on_init [ ] ;
int m_runer_py_on_init_size ;
IRunPy * m_runer_py_on_deinit [ ] ;
int m_runer_py_on_deinit_size ;
//---
void OnTrainingFinish ( ) ;
void OnTrainingStart ( ) ;
2026-03-20 10:20:00 -05:00
public :
2026-03-20 17:16:21 -05:00
CTrainingTabConfig ( void ) ;
~ CTrainingTabConfig ( void ) ;
//---
2026-03-21 08:06:31 -05:00
void AddRunnerPy ( IRunPy * runer ) ;
2026-03-20 10:20:00 -05:00
//---
2026-03-28 10:58:12 -05:00
void SetExtra ( bool common_flag , const string & path_config_json , const string & path_lock , const string & path_ea_launcer , const string & path_py_inter , const string & py_path_env ) ;
2026-03-20 10:20:00 -05:00
bool Create ( CWndCreate * p , CWindow & main_window , int top_gap , int left_gap , int right_gap , int bottom_gap ) ;
//---
bool OnClickBottom ( const long lparam ) ;
2026-03-24 10:39:38 -05:00
bool OnTextEdit ( const long lparam ) ;
2026-03-26 06:46:59 -05:00
bool OnClickDec ( const long lparam ) ;
bool OnClickInc ( const long lparam ) ;
2026-03-20 10:20:00 -05:00
//---
void OnLenguajeChange ( ) override final ;
//---
__forceinline string ConfigFilePath ( ) const { return m_label_name_file_val . LabelText ( ) ; }
2026-03-20 17:16:21 -05:00
//---
// Se tendra que llamar a aesta funcion ojito
void OnFinishPy ( ) ;
//---
void OnTimerEvent ( ) ;
2026-03-20 10:20:00 -05:00
} ;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
2026-03-20 17:16:21 -05:00
CTrainingTabConfig : : CTrainingTabConfig ( )
: CGuiBaseComponent < CLoggerBase > ( " CTrainingTabConfig " ) , m_py_is_run ( false )
{
m_runer_py_on_deinit_size = ArrayResize ( m_runer_py_on_deinit , 0 ) ;
m_runer_py_on_init_size = ArrayResize ( m_runer_py_on_init , 0 ) ;
m_runer_py_on_pass_size = ArrayResize ( m_runer_py_on_pass , 0 ) ;
}
//+------------------------------------------------------------------+
CTrainingTabConfig : : ~ CTrainingTabConfig ( )
2026-03-20 10:20:00 -05:00
{
2026-03-20 17:16:21 -05:00
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
2026-03-28 10:58:12 -05:00
void CTrainingTabConfig : : SetExtra ( bool common_flag , const string & path_config_json , const string & path_lock , const string & path_ea_launcer , const string & path_py_inter , const string & py_path_env )
2026-03-20 17:16:21 -05:00
{
//---
2026-03-20 10:20:00 -05:00
m_common_flag = common_flag ;
2026-03-20 17:16:21 -05:00
m_extra_file_flags = ( m_common_flag ? FILE_COMMON : 0 ) ;
2026-03-28 08:35:32 -05:00
m_path_py_interpete = path_py_inter ;
2026-03-20 17:16:21 -05:00
//--- Estos arhcivos van tal cual no hay una carpeta base asi que se debe esopciifcar ruta completa (son relativos a Files\\) tal cual no de bsae_path
m_path_to_config_json = path_config_json ;
m_path_to_lock_bin = path_lock ;
2026-03-24 10:39:38 -05:00
m_path_to_ea_launcher = path_ea_launcer ;
2026-03-28 10:58:12 -05:00
m_python_path_env = py_path_env ;
2026-03-20 17:16:21 -05:00
//---
m_base_terminal_files_path = ( m_common_flag ? TERMINAL_MT5_COMMON_PATH + " \\ Files \\ " : TERMINAL_MT5_DATA_PAH + " \\ MQL5 \\ Files \\ " ) ;
2026-03-20 10:20:00 -05:00
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CTrainingTabConfig : : Create ( CWndCreate * p , CWindow & main_window , int top_gap , int left_gap , int right_gap , int bottom_gap )
{
2026-03-21 11:41:29 -05:00
//---
const int initial_x = left_gap + 5 ;
2026-03-20 10:20:00 -05:00
int x = left_gap + 5 ;
int y = top_gap + 10 ;
//--- Titulo
m_label_titulo . FontSize ( 14 ) ;
m_label_titulo . Font ( " Arial " ) ;
m_label_titulo . LabelColor ( AIDATATASKRUNER_COLOR_TEXT_PRIMARY ) ;
2026-03-21 11:41:29 -05:00
m_label_titulo . BackColor ( AIDATATASKRUNER_COLOR_FONDO_SUBTAB_PRESSED ) ;
2026-03-20 10:20:00 -05:00
if ( ! p . CreateTextLabel ( m_label_titulo , m_language [ GUIBASE_COMPONENT_NAME ( m_label_titulo ) ] ,
main_window , 0 , m_base_tab , m_base_tab_idx , x , y , 200 ) )
2026-03-20 17:16:21 -05:00
{
GUIBASE_ERROR_CREATION ( m_label_titulo ) ;
return false ;
}
2026-03-21 11:41:29 -05:00
y + = m_label_titulo . YSize ( ) + 14 ;
2026-03-20 10:20:00 -05:00
//--- Label Config file:
m_label_name_file . FontSize ( 10 ) ;
m_label_name_file . Font ( " Arial " ) ;
m_label_name_file . LabelColor ( AIDATATASKRUNER_COLOR_TEXT_SECONDARY ) ;
2026-03-21 11:41:29 -05:00
m_label_name_file . BackColor ( AIDATATASKRUNER_COLOR_FONDO_SUBTAB_PRESSED ) ;
2026-03-20 10:20:00 -05:00
if ( ! p . CreateTextLabel ( m_label_name_file , m_language [ GUIBASE_COMPONENT_NAME ( m_label_name_file ) ] ,
main_window , 0 , m_base_tab , m_base_tab_idx , x , y , 100 , 25 ) )
2026-03-20 17:16:21 -05:00
{
GUIBASE_ERROR_CREATION ( m_label_name_file ) ;
return false ;
}
2026-03-20 10:20:00 -05:00
x + = m_label_name_file . XSize ( ) + 5 ;
//--- Label valor (ruta)
m_label_name_file_val . FontSize ( 10 ) ;
m_label_name_file_val . Font ( " Arial " ) ;
m_label_name_file_val . LabelColor ( AIDATATASKRUNER_COLOR_TEXT_PRIMARY ) ;
m_label_name_file_val . BackColor ( AIDATATASKRUNER_COLOR_EDIT_BACK ) ;
m_label_name_file_val . LabelXGap ( 5 ) ;
2026-03-26 06:46:59 -05:00
m_label_name_file_val . LabelYGap ( 3 ) ;
2026-03-20 10:20:00 -05:00
m_label_name_file_val . Tooltip ( m_language . Tooltip ( GUIBASE_COMPONENT_NAME ( m_label_name_file_val ) ) ) ;
2026-03-20 17:16:21 -05:00
if ( ! p . CreateTextLabel ( m_label_name_file_val , " " ,
2026-03-20 10:20:00 -05:00
main_window , 0 , m_base_tab , m_base_tab_idx , x , y , 350 , 25 ) )
2026-03-20 17:16:21 -05:00
{
GUIBASE_ERROR_CREATION ( m_label_name_file_val ) ;
return false ;
}
2026-03-21 11:41:29 -05:00
x = initial_x ; // Reinit
y + = m_label_name_file_val . YSize ( ) + 8 ; // Bajamos (peude no caber la ruta)
2026-03-20 10:20:00 -05:00
//--- Browse
2026-03-21 11:41:29 -05:00
m_btn_name_file_browse . FontSize ( 10 ) ;
m_btn_name_file_browse . Font ( " Arial " ) ;
m_btn_name_file_browse . BackColor ( AIDATATASKRUNER_COLOR_BTN_BACK ) ;
m_btn_name_file_browse . LabelColor ( AIDATATASKRUNER_COLOR_TEXT_SECONDARY ) ;
m_btn_name_file_browse . BorderColor ( AIDATATASKRUNER_COLOR_BTN_BORDER ) ;
m_btn_name_file_browse . Tooltip ( m_language . Tooltip ( GUIBASE_COMPONENT_NAME ( m_btn_name_file_browse ) ) ) ;
if ( ! p . CreateButton ( m_btn_name_file_browse , m_language [ GUIBASE_COMPONENT_NAME ( m_btn_name_file_browse ) ] ,
2026-03-20 10:20:00 -05:00
main_window , 0 , m_base_tab , m_base_tab_idx , x , y , 80 ) )
2026-03-20 17:16:21 -05:00
{
2026-03-21 11:41:29 -05:00
GUIBASE_ERROR_CREATION ( m_btn_name_file_browse ) ;
2026-03-20 17:16:21 -05:00
return false ;
}
2026-03-21 11:41:29 -05:00
x + = m_btn_name_file_browse . XSize ( ) + 5 ;
2026-03-20 10:20:00 -05:00
//--- Open
m_btn_open . FontSize ( 10 ) ;
m_btn_open . Font ( " Arial " ) ;
m_btn_open . BackColor ( AIDATATASKRUNER_COLOR_BTN_BACK ) ;
m_btn_open . LabelColor ( AIDATATASKRUNER_COLOR_TEXT_SECONDARY ) ;
m_btn_open . BorderColor ( AIDATATASKRUNER_COLOR_BTN_BORDER ) ;
m_btn_open . Tooltip ( m_language . Tooltip ( GUIBASE_COMPONENT_NAME ( m_btn_open ) ) ) ;
if ( ! p . CreateButton ( m_btn_open , m_language [ GUIBASE_COMPONENT_NAME ( m_btn_open ) ] ,
main_window , 0 , m_base_tab , m_base_tab_idx , x , y , 80 ) )
2026-03-20 17:16:21 -05:00
{
GUIBASE_ERROR_CREATION ( m_btn_open ) ;
return false ;
}
2026-03-25 09:57:33 -05:00
x + = m_btn_open . XSize ( ) + 5 ;
//---
m_btn_file_config_template . FontSize ( 10 ) ;
m_btn_file_config_template . Font ( " Arial " ) ;
m_btn_file_config_template . BackColor ( AIDATATASKRUNER_COLOR_BTN_BACK ) ;
m_btn_file_config_template . LabelColor ( AIDATATASKRUNER_COLOR_TEXT_SECONDARY ) ;
m_btn_file_config_template . BorderColor ( AIDATATASKRUNER_COLOR_BTN_BORDER ) ;
m_btn_file_config_template . Tooltip ( m_language . Tooltip ( GUIBASE_COMPONENT_NAME ( m_btn_file_config_template ) ) ) ;
if ( ! p . CreateButton ( m_btn_file_config_template , " ? " ,
main_window , 0 , m_base_tab , m_base_tab_idx , x , y , 50 ) )
{
GUIBASE_ERROR_CREATION ( m_btn_file_config_template ) ;
return false ;
}
2026-03-20 17:16:21 -05:00
//--- Label titulo Run Python
2026-03-21 11:41:29 -05:00
y + = m_btn_open . YSize ( ) + 21 ; // separacion visual de seccion
x = initial_x ;
2026-03-20 17:16:21 -05:00
m_label_tit_run_py . FontSize ( 14 ) ;
m_label_tit_run_py . Font ( " Arial " ) ;
m_label_tit_run_py . LabelColor ( AIDATATASKRUNER_COLOR_TEXT_PRIMARY ) ;
2026-03-21 11:41:29 -05:00
m_label_tit_run_py . BackColor ( AIDATATASKRUNER_COLOR_FONDO_SUBTAB_PRESSED ) ;
2026-03-20 17:16:21 -05:00
if ( ! p . CreateTextLabel ( m_label_tit_run_py , m_language [ GUIBASE_COMPONENT_NAME ( m_label_tit_run_py ) ] ,
main_window , 0 , m_base_tab , m_base_tab_idx , x , y , 200 ) )
{
GUIBASE_ERROR_CREATION ( m_label_tit_run_py ) ;
return false ;
}
y + = m_label_tit_run_py . YSize ( ) + 10 ;
2026-03-21 11:41:29 -05:00
//--- Label py file
m_label_py_file . FontSize ( 10 ) ;
m_label_py_file . Font ( " Arial " ) ;
m_label_py_file . LabelColor ( AIDATATASKRUNER_COLOR_TEXT_SECONDARY ) ;
m_label_py_file . BackColor ( AIDATATASKRUNER_COLOR_FONDO_SUBTAB_PRESSED ) ;
if ( ! p . CreateTextLabel ( m_label_py_file , m_language [ GUIBASE_COMPONENT_NAME ( m_label_py_file ) ] ,
main_window , 0 , m_base_tab , m_base_tab_idx , x , y , 100 , 25 ) )
{
GUIBASE_ERROR_CREATION ( m_label_py_file ) ;
return false ;
}
x + = m_label_py_file . XSize ( ) + 5 ;
//--- Label py file val
m_label_py_file_val . FontSize ( 10 ) ;
m_label_py_file_val . Font ( " Arial " ) ;
m_label_py_file_val . LabelColor ( AIDATATASKRUNER_COLOR_TEXT_PRIMARY ) ;
m_label_py_file_val . BackColor ( AIDATATASKRUNER_COLOR_EDIT_BACK ) ;
m_label_py_file_val . LabelXGap ( 5 ) ;
2026-03-26 06:46:59 -05:00
m_label_py_file_val . LabelYGap ( 2 ) ;
2026-03-21 11:41:29 -05:00
m_label_py_file_val . Tooltip ( m_language . Tooltip ( GUIBASE_COMPONENT_NAME ( m_label_py_file_val ) ) ) ;
2026-03-26 11:23:24 -05:00
const int x_label_py_file_val = x ;
2026-03-21 11:41:29 -05:00
if ( ! p . CreateTextLabel ( m_label_py_file_val , " " ,
2026-03-26 06:46:59 -05:00
main_window , 0 , m_base_tab , m_base_tab_idx , x , y , 425 , 25 ) )
2026-03-21 11:41:29 -05:00
{
GUIBASE_ERROR_CREATION ( m_label_py_file_val ) ;
return false ;
}
2026-03-26 11:23:24 -05:00
x = initial_x ;
2026-03-21 11:41:29 -05:00
y + = m_label_py_file_val . YSize ( ) + 8 ;
//--- Browse py file
m_btn_py_file_browse . FontSize ( 10 ) ;
m_btn_py_file_browse . Font ( " Arial " ) ;
m_btn_py_file_browse . BackColor ( AIDATATASKRUNER_COLOR_BTN_BACK ) ;
m_btn_py_file_browse . LabelColor ( AIDATATASKRUNER_COLOR_TEXT_SECONDARY ) ;
m_btn_py_file_browse . BorderColor ( AIDATATASKRUNER_COLOR_BTN_BORDER ) ;
m_btn_py_file_browse . Tooltip ( m_language . Tooltip ( GUIBASE_COMPONENT_NAME ( m_btn_py_file_browse ) ) ) ;
if ( ! p . CreateButton ( m_btn_py_file_browse , m_language [ GUIBASE_COMPONENT_NAME ( m_btn_py_file_browse ) ] ,
main_window , 0 , m_base_tab , m_base_tab_idx , x , y , 80 ) )
{
GUIBASE_ERROR_CREATION ( m_btn_py_file_browse ) ;
return false ;
}
//---
y + = m_btn_py_file_browse . YSize ( ) + 10 ; // separacion visual de seccion
x = initial_x ;
2026-03-26 11:23:24 -05:00
//--- Label logpy file
m_label_log_pyfile . FontSize ( 10 ) ;
m_label_log_pyfile . Font ( " Arial " ) ;
m_label_log_pyfile . LabelColor ( AIDATATASKRUNER_COLOR_TEXT_SECONDARY ) ;
m_label_log_pyfile . BackColor ( AIDATATASKRUNER_COLOR_FONDO_SUBTAB_PRESSED ) ;
if ( ! p . CreateTextLabel ( m_label_log_pyfile , m_language [ GUIBASE_COMPONENT_NAME ( m_label_log_pyfile ) ] ,
main_window , 0 , m_base_tab , m_base_tab_idx , x , y , 130 , 25 ) )
{
GUIBASE_ERROR_CREATION ( m_label_py_file ) ;
return false ;
}
x = x_label_py_file_val ; // mismo nivel
//--- Label logpy file val
m_label_log_pyfile_val . FontSize ( 10 ) ;
m_label_log_pyfile_val . Font ( " Arial " ) ;
m_label_log_pyfile_val . LabelColor ( AIDATATASKRUNER_COLOR_TEXT_PRIMARY ) ;
m_label_log_pyfile_val . BackColor ( AIDATATASKRUNER_COLOR_EDIT_BACK ) ;
m_label_log_pyfile_val . LabelXGap ( 5 ) ;
m_label_log_pyfile_val . LabelYGap ( 2 ) ;
m_label_log_pyfile_val . Tooltip ( m_language . Tooltip ( GUIBASE_COMPONENT_NAME ( m_label_log_pyfile_val ) ) ) ;
if ( ! p . CreateTextLabel ( m_label_log_pyfile_val , " " ,
main_window , 0 , m_base_tab , m_base_tab_idx , x , y , 425 , 25 ) )
{
GUIBASE_ERROR_CREATION ( m_label_log_pyfile_val ) ;
return false ;
}
x = initial_x ;
y + = m_label_log_pyfile_val . YSize ( ) + 8 ;
//--- Browse logpy file
m_btn_logpyfile_browse . FontSize ( 10 ) ;
m_btn_logpyfile_browse . Font ( " Arial " ) ;
m_btn_logpyfile_browse . BackColor ( AIDATATASKRUNER_COLOR_BTN_BACK ) ;
m_btn_logpyfile_browse . LabelColor ( AIDATATASKRUNER_COLOR_TEXT_SECONDARY ) ;
m_btn_logpyfile_browse . BorderColor ( AIDATATASKRUNER_COLOR_BTN_BORDER ) ;
m_btn_logpyfile_browse . Tooltip ( m_language . Tooltip ( GUIBASE_COMPONENT_NAME ( m_btn_logpyfile_browse ) ) ) ;
if ( ! p . CreateButton ( m_btn_logpyfile_browse , m_language [ GUIBASE_COMPONENT_NAME ( m_btn_logpyfile_browse ) ] ,
main_window , 0 , m_base_tab , m_base_tab_idx , x , y , 80 ) )
{
GUIBASE_ERROR_CREATION ( m_btn_logpyfile_browse ) ;
return false ;
}
//---
y + = m_btn_logpyfile_browse . YSize ( ) + 10 ; // separacion visual de seccion
x = initial_x ;
2026-03-24 10:39:38 -05:00
//---
const string texto = m_language [ AIDATATASKRUNNERL_COMPONENT_NAME ( m_edit_py_max_tiemout ) ] ;
m_edit_py_max_tiemout . FontSize ( 10 ) ;
m_edit_py_max_tiemout . Font ( " Arial " ) ;
m_edit_py_max_tiemout . CanvasFontSet ( ) ;
const int width = m_edit_py_max_tiemout . m_canvas . TextWidth ( texto ) ;
m_edit_py_max_tiemout . LabelColor ( AIDATATASKRUNER_COLOR_TEXT_SECONDARY ) ;
m_edit_py_max_tiemout . BackColor ( AIDATATASKRUNER_COLOR_FONDO_SUBTAB_PRESSED ) ;
m_edit_py_max_tiemout . GetTextBoxPointer ( ) . BackColor ( AIDATATASKRUNER_COLOR_EDIT_BACK ) ;
m_edit_py_max_tiemout . GetTextBoxPointer ( ) . BorderColor ( AIDATATASKRUNER_COLOR_EDIT_BORDER ) ;
m_edit_py_max_tiemout . GetTextBoxPointer ( ) . DefaultTextColor ( AIDATATASKRUNER_COLOR_EDIT_TEXT_NORMAL ) ;
m_edit_py_max_tiemout . GetTextBoxPointer ( ) . LabelColor ( AIDATATASKRUNER_COLOR_EDIT_TEXT_NORMAL ) ;
m_edit_py_max_tiemout . GetTextBoxPointer ( ) . SelectedBackColor ( AIDATATASKRUNER_COLOR_EDIT_TEXT_SELECTED ) ;
m_edit_py_max_tiemout . GetTextBoxPointer ( ) . SelectedTextColor ( AIDATATASKRUNER_COLOR_EDIT_TEXT_HIGHLIGHT ) ;
m_edit_py_max_tiemout . Tooltip ( m_language . Tooltip ( GUIBASE_COMPONENT_NAME ( m_edit_py_max_tiemout ) ) ) ;
# define AIDATATASKRUNNER_TRAINING_EDITPY_MAX_VAL ( double ( UINT_MAX ) / 1000.0 )
2026-03-26 09:51:33 -05:00
# define AIDATATASKRUNNER_TRAINING_EDITPY_DEF_VAL ( 1800 )
2026-03-24 10:39:38 -05:00
if ( ! p . CreateTextEdit ( m_edit_py_max_tiemout , texto ,
main_window , 0 , m_base_tab , m_base_tab_idx , false , x , y ,
width + 10 + 200 , 200 , AIDATATASKRUNNER_TRAINING_EDITPY_MAX_VAL
2026-03-26 09:51:33 -05:00
, 1.0 , 1.0 , 0 , double ( AIDATATASKRUNNER_TRAINING_EDITPY_DEF_VAL ) ) ) // Min value = 1.0 | Step = 1.0 | 0 = Digitos | 1800 = valor por defecto (30 minutos)
2026-03-24 10:39:38 -05:00
{
AIDATATASKRUNER_ERROR_CREATION ( m_edit_py_max_tiemout ) ;
return false ;
}
2026-03-26 09:51:33 -05:00
m_timeout_for_execute_py = AIDATATASKRUNNER_TRAINING_EDITPY_DEF_VAL * 1000 ; // 30 min default
2026-03-24 10:39:38 -05:00
//---
y + = m_edit_py_max_tiemout . YSize ( ) + 12 ;
x = initial_x ;
2026-03-20 17:16:21 -05:00
//--- Boton Run
m_btn_run_py . FontSize ( 10 ) ;
m_btn_run_py . Font ( " Arial " ) ;
m_btn_run_py . BackColor ( AIDATATASKRUNER_COLOR_BTN_BACK ) ;
m_btn_run_py . LabelColor ( AIDATATASKRUNER_COLOR_TEXT_SECONDARY ) ;
m_btn_run_py . BorderColor ( AIDATATASKRUNER_COLOR_BTN_BORDER ) ;
m_btn_run_py . Tooltip ( m_language . Tooltip ( GUIBASE_COMPONENT_NAME ( m_btn_run_py ) ) ) ;
if ( ! p . CreateButton ( m_btn_run_py , m_language [ GUIBASE_COMPONENT_NAME ( m_btn_run_py ) ] ,
main_window , 0 , m_base_tab , m_base_tab_idx , x , y , 140 ) )
{
GUIBASE_ERROR_CREATION ( m_btn_run_py ) ;
return false ;
}
2026-03-20 10:20:00 -05:00
2026-03-26 09:51:33 -05:00
2026-03-20 17:16:21 -05:00
//---
2026-03-20 10:20:00 -05:00
return true ;
}
2026-03-24 10:39:38 -05:00
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CTrainingTabConfig : : OnTextEdit ( const long lparam )
{
if ( m_edit_py_max_tiemout . Id ( ) = = lparam )
{
m_timeout_for_execute_py = uint ( m_edit_py_max_tiemout . GetValue ( ) ) * 1000 ;
return true ;
}
return false ;
}
2026-03-26 06:46:59 -05:00
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CTrainingTabConfig : : OnClickDec ( const long lparam )
{
if ( m_edit_py_max_tiemout . Id ( ) = = lparam )
{
m_timeout_for_execute_py = uint ( m_edit_py_max_tiemout . GetValue ( ) ) * 1000 ;
return true ;
}
return false ;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CTrainingTabConfig : : OnClickInc ( const long lparam )
{
if ( m_edit_py_max_tiemout . Id ( ) = = lparam )
{
m_timeout_for_execute_py = uint ( m_edit_py_max_tiemout . GetValue ( ) ) * 1000 ;
return true ;
}
return false ;
}
2026-03-20 10:20:00 -05:00
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CTrainingTabConfig : : OnClickBottom ( const long lparam )
{
2026-03-26 11:23:24 -05:00
//---
if ( m_btn_logpyfile_browse . Id ( ) = = lparam )
{
//---
string arr [ ] ;
if ( FileSelectDialog ( GUIBASE_MSG ( " flselect_logiflepy " ) , NULL , " Log files (*.log)|*.log " , ( m_common_flag ? FSD_COMMON_FOLDER : 0 ) ,
arr , NULL ) ! = 1 )
{
MessageBox ( GUIBASE_MSG ( " error_select_file " ) , GUIBASE_MSG ( " error " ) , MB_ICONERROR | MB_OK ) ;
return true ;
}
//--- Guardamos la ruta y la extension
//Print(out_file_complete_path);
m_label_log_pyfile_val . LabelText ( arr [ 0 ] ) ; // ruta completa aqui
m_label_log_pyfile_val . Update ( true ) ;
//---
return true ;
}
2026-03-20 17:16:21 -05:00
//---
2026-03-21 11:41:29 -05:00
if ( m_btn_py_file_browse . Id ( ) = = lparam )
{
2026-03-26 06:46:59 -05:00
string out_file_complete_path = " " ;
2026-03-25 18:14:32 -05:00
if ( ! FileSelectDialogComplete ( out_file_complete_path , 500 , GUIBASE_MSG ( " flselect_py " ) ,
2026-03-26 06:46:59 -05:00
" Python files (*.py) \0 *.py \0 Executable files (*.exe) \0 *.exe \0 \0 " , TERMINAL_MT5_DATA_PAH , // Base del temrinal NAME\\
OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST ) ) // EL FOLDER y archivo deben de sexisteir
2026-03-21 11:41:29 -05:00
{
//reciclamos el msg mismo que se usa en el browse deljson confgig
2026-03-25 18:05:47 -05:00
MessageBox ( GUIBASE_MSG ( " error_select_file " ) , GUIBASE_MSG ( " error " ) , MB_ICONERROR | MB_OK ) ;
2026-03-21 11:41:29 -05:00
return true ;
}
//--- Guardamos la ruta y la extension
2026-03-26 06:46:59 -05:00
//Print(out_file_complete_path);
2026-03-25 18:05:47 -05:00
m_label_py_file_val . LabelText ( out_file_complete_path ) ; // ruta completa aqui
2026-03-21 11:41:29 -05:00
m_label_py_file_val . Update ( true ) ;
//---
2026-03-25 18:05:47 -05:00
m_py_file_extension = FileGetExtension ( out_file_complete_path ) ; // solo da la ext no con el .
2026-03-21 11:41:29 -05:00
return true ;
}
2026-03-26 11:23:24 -05:00
//--- Config file
// Browse
2026-03-21 11:41:29 -05:00
if ( m_btn_name_file_browse . Id ( ) = = lparam )
2026-03-20 10:20:00 -05:00
{
//---
string arr [ ] ;
2026-03-25 09:57:33 -05:00
if ( FileSelectDialog ( " Configuration " , NULL , " JSON files (*.json)|*.json " , ( m_common_flag ? FSD_COMMON_FOLDER : 0 ) | FSD_FILE_MUST_EXIST ,
2026-03-20 10:20:00 -05:00
arr , NULL ) ! = 1 )
{
2026-03-25 18:05:47 -05:00
MessageBox ( GUIBASE_MSG ( " error_select_file " ) , GUIBASE_MSG ( " error " ) , MB_ICONERROR | MB_OK ) ;
2026-03-20 10:20:00 -05:00
return true ;
}
//---
m_label_name_file_val . LabelText ( arr [ 0 ] ) ;
m_label_name_file_val . Update ( true ) ;
//---
return true ;
}
2026-03-20 17:16:21 -05:00
2026-03-26 11:23:24 -05:00
// Template
2026-03-25 09:57:33 -05:00
if ( m_btn_file_config_template . Id ( ) = = lparam )
{
//---
string arr [ ] ;
// para el temaplte usamos el common folder flag del panel dado que teamplestes se ubica ahi vale?¿
if ( FileSelectDialog ( " Configuration " , AIDATATASKRUNER_PATH_TEMPLATES , " JSON files (*.json)|*.json " , AIDATATASK_RUNNER_FSD_COMON_FLAG | FSD_FILE_MUST_EXIST ,
2026-03-27 12:33:09 -05:00
arr , AIDATATASKRUNER_FILENAME_TEMPLATES_PYCONFIG ) ! = 1 )
2026-03-25 09:57:33 -05:00
{
MessageBox ( GUIBASE_MSG ( " error_select_file " ) , GUIBASE_COMMON ( " error " ) , MB_ICONERROR | MB_OK ) ;
return true ;
}
//---
m_label_name_file_val . LabelText ( arr [ 0 ] ) ;
m_label_name_file_val . Update ( true ) ;
//---
return true ;
}
2026-03-26 11:23:24 -05:00
// Open
2026-03-20 10:20:00 -05:00
if ( m_btn_open . Id ( ) = = lparam )
{
2026-03-21 06:15:18 -05:00
const string full_path = m_base_terminal_files_path + m_label_name_file_val . LabelText ( ) ;
2026-03-20 17:16:21 -05:00
ShellExecuteW ( 0 , " open " , full_path , NULL , NULL , SW_SHOW ) ; // no verificamos noe s critrico
2026-03-20 10:20:00 -05:00
return true ;
}
2026-03-20 17:16:21 -05:00
//---
if ( m_btn_run_py . Id ( ) = = lparam )
{
//---
if ( m_py_is_run )
{
2026-03-25 09:57:33 -05:00
MessageBox ( GUIBASE_MSG ( " python_is_runing " ) , GUIBASE_COMMON ( " warning " ) , MB_ICONWARNING | MB_OK ) ;
2026-03-20 17:16:21 -05:00
return true ;
}
2026-03-24 10:39:38 -05:00
//--- Check inicialzies
// Configuracion seleccionada
2026-03-20 17:16:21 -05:00
const string config = m_label_name_file_val . LabelText ( ) ;
if ( config .Length ( ) < 1 )
{
2026-03-25 09:57:33 -05:00
MessageBox ( GUIBASE_MSG ( " no_config_selected " ) , GUIBASE_COMMON ( " error " ) , MB_ICONERROR | MB_OK ) ;
2026-03-20 17:16:21 -05:00
return true ;
}
2026-03-24 10:39:38 -05:00
// Archivos py selecionado
2026-03-21 11:41:29 -05:00
const string py = m_label_py_file_val . LabelText ( ) ;
if ( py .Length ( ) < 1 )
{
2026-03-25 09:57:33 -05:00
MessageBox ( GUIBASE_MSG ( " no_py_selected " ) , GUIBASE_COMMON ( " error " ) , MB_ICONERROR | MB_OK ) ;
2026-03-21 11:41:29 -05:00
return true ;
}
2026-03-24 10:39:38 -05:00
//--- Abrimos el archivo de comuncionacion
const string fn = AIDATATASKRUNER_BASE_FOLDER + AIDATATASKRUNNER_FILENAME_ARGS_LAUNCHER ;
: : ResetLastError ( ) ;
2026-03-26 09:51:33 -05:00
const int fh = FileOpen ( fn , FILE_WRITE | FILE_TXT | AIDATATASK_RUNNER_COMON_FLAG , 0 ) ;
2026-03-24 10:39:38 -05:00
if ( fh = = INVALID_HANDLE )
{
2026-03-25 09:57:33 -05:00
MessageBox ( StringFormat ( GUIBASE_MSG ( " python_launch_error_file " ) , : : GetLastError ( ) ) , GUIBASE_COMMON ( " error " ) , MB_ICONERROR | MB_OK ) ;
2026-03-24 10:39:38 -05:00
return true ;
}
2026-03-20 17:16:21 -05:00
2026-03-24 10:39:38 -05:00
//---
// Escritura
2026-03-26 11:23:24 -05:00
FileWrite ( fh , m_label_log_pyfile_val . LabelText ( ) ) ;
2026-03-25 18:05:47 -05:00
FileWrite ( fh , py ) ; // Py path to execute (ya da la ruyta completa)
2026-03-24 10:39:38 -05:00
FileWrite ( fh , m_py_file_extension ) ; // Extension
2026-03-28 08:35:32 -05:00
FileWrite ( fh , m_path_py_interpete ) ; // Interprete
2026-03-28 10:58:12 -05:00
FileWrite ( fh , m_python_path_env ) ;
2026-03-24 10:39:38 -05:00
: : FileClose ( fh ) ;
2026-03-26 09:51:33 -05:00
//---
/*
input string InpFileNameArgs = " " ;
input int InpFileCommonFlag = 0 ;
2026-03-26 10:26:25 -05:00
2026-03-26 09:51:33 -05:00
input string InpArgsConfigJson = " " ;
input string InpArgsResJson = " " ;
input string InpArgsLockBin = " " ;
input string InpArgsBaseTerminalPath = " " ;
// 1 hora (3600 * 1000) en ms
input uint InpPyTimeoutMs = 3600000 ;
* /
2026-03-24 10:39:38 -05:00
//--- Lanzamos el ea
2026-03-28 10:58:12 -05:00
MqlParam params [ 9 ] ;
2026-03-24 10:39:38 -05:00
params [ 0 ] . type = TYPE_STRING ;
params [ 0 ] . string_value = " Experts \\ " + m_path_to_ea_launcher ;
params [ 1 ] . type = TYPE_STRING ;
params [ 1 ] . string_value = fn ; // Nombre del archivo
params [ 2 ] . type = TYPE_INT ;
params [ 2 ] . integer_value = AIDATATASK_RUNNER_COMON_FLAG ; // Bandera common o no common
2026-03-24 07:46:45 -05:00
2026-03-21 11:41:29 -05:00
//---
2026-03-24 10:39:38 -05:00
// Paramemos de args como tal
params [ 3 ] . type = TYPE_STRING ;
2026-03-26 09:51:33 -05:00
params [ 3 ] . string_value = config ;
2026-03-24 10:39:38 -05:00
params [ 4 ] . type = TYPE_STRING ;
2026-03-26 09:51:33 -05:00
params [ 4 ] . string_value = m_path_to_config_json ;
2026-03-24 10:39:38 -05:00
params [ 5 ] . type = TYPE_STRING ;
2026-03-26 09:51:33 -05:00
params [ 5 ] . string_value = m_path_to_lock_bin ;
2026-03-24 10:39:38 -05:00
// Basew terminal path s
params [ 6 ] . type = TYPE_STRING ;
params [ 6 ] . string_value = m_base_terminal_files_path ;
2026-03-21 11:41:29 -05:00
//---
2026-03-24 10:39:38 -05:00
params [ 7 ] . type = TYPE_UINT ;
params [ 7 ] . integer_value = m_timeout_for_execute_py ;
2026-03-28 10:58:12 -05:00
//---
params [ 8 ] . type = TYPE_STRING ;
params [ 8 ] . string_value = AIDATATASKRUNER_BASE_FOLDER + AIDATATASKRUNNER_FILENAME_BAT_PY ;
2026-03-24 10:47:07 -05:00
//---
: : ResetLastError ( ) ;
const long bot_chart_id = OpenChartAndDevoler ( ChartID ( ) , _Symbol , _Period , 1500 ) ;
if ( bot_chart_id = = -1 )
{
2026-03-25 09:57:33 -05:00
MessageBox ( StringFormat ( GUIBASE_MSG ( " python_launch_error_chart " ) , : : GetLastError ( ) ) , GUIBASE_COMMON ( " error " ) , MB_ICONERROR | MB_OK ) ;
2026-03-24 10:47:07 -05:00
return true ;
}
//--- Check sincronizacion del grafico
while ( ChartGetInteger ( bot_chart_id , CHART_VISIBLE_BARS ) < 1 )
{
// Espera para la siguiente iteracion
Sleep ( 350 ) ;
}
2026-03-24 10:39:38 -05:00
2026-03-24 10:47:07 -05:00
if ( ! EXPERT : : Run ( bot_chart_id , params , EXPERT_PERMISOS_FLAG_DLL ) )
2026-03-20 17:16:21 -05:00
{
2026-03-25 09:57:33 -05:00
MessageBox ( GUIBASE_MSG ( " python_launch_error_exe " ) , GUIBASE_COMMON ( " error " ) , MB_ICONERROR | MB_OK ) ;
2026-03-26 09:51:33 -05:00
: : ChartClose ( bot_chart_id ) ; // Cerramos
2026-03-20 17:16:21 -05:00
return true ;
}
2026-03-24 10:39:38 -05:00
//--- Exito al lanzar el runner entonces comenzamos
2026-03-20 17:16:21 -05:00
OnTrainingStart ( ) ;
//---
m_py_is_run = true ;
//--- cambio de estado a running
m_btn_run_py . LabelText ( m_language [ GUIBASE_COMPONENT_NAME ( m_btn_run_py ) + " _running " ] ) ;
m_btn_run_py . Update ( true ) ;
return true ;
}
//---
2026-03-20 10:20:00 -05:00
return false ;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CTrainingTabConfig : : OnLenguajeChange ( void )
{
2026-03-21 11:41:29 -05:00
2026-03-20 17:16:21 -05:00
//---
2026-03-20 10:20:00 -05:00
m_label_titulo . LabelText ( m_language [ GUIBASE_COMPONENT_NAME ( m_label_titulo ) ] ) ;
m_label_titulo . Update ( true ) ;
2026-03-20 17:16:21 -05:00
//---
2026-03-26 11:23:24 -05:00
// Label
2026-03-20 10:20:00 -05:00
m_label_name_file . LabelText ( m_language [ GUIBASE_COMPONENT_NAME ( m_label_name_file ) ] ) ;
m_label_name_file . Update ( true ) ;
2026-03-26 11:23:24 -05:00
// Val
2026-03-20 17:16:21 -05:00
m_label_name_file_val . Tooltip ( m_language . Tooltip ( GUIBASE_COMPONENT_NAME ( m_label_name_file_val ) ) ) ;
2026-03-26 11:23:24 -05:00
// Browse
2026-03-21 11:41:29 -05:00
m_btn_name_file_browse . LabelText ( m_language [ GUIBASE_COMPONENT_NAME ( m_btn_name_file_browse ) ] ) ;
m_btn_name_file_browse . Tooltip ( m_language . Tooltip ( GUIBASE_COMPONENT_NAME ( m_btn_name_file_browse ) ) ) ;
m_btn_name_file_browse . Update ( true ) ;
2026-03-20 10:20:00 -05:00
2026-03-26 11:23:24 -05:00
// Open
2026-03-20 10:20:00 -05:00
m_btn_open . LabelText ( m_language [ GUIBASE_COMPONENT_NAME ( m_btn_open ) ] ) ;
m_btn_open . Tooltip ( m_language . Tooltip ( GUIBASE_COMPONENT_NAME ( m_btn_open ) ) ) ;
m_btn_open . Update ( true ) ;
2026-03-20 17:16:21 -05:00
2026-03-26 11:23:24 -05:00
// Teemplate ?
2026-03-25 09:57:33 -05:00
m_btn_file_config_template . Tooltip ( m_language . Tooltip ( GUIBASE_COMPONENT_NAME ( m_btn_file_config_template ) ) ) ;
2026-03-26 11:23:24 -05:00
//--- Titulo run py
2026-03-20 17:16:21 -05:00
m_label_tit_run_py . LabelText ( m_language [ GUIBASE_COMPONENT_NAME ( m_label_tit_run_py ) ] ) ;
m_label_tit_run_py . Update ( true ) ;
2026-03-21 11:41:29 -05:00
//---
2026-03-26 11:23:24 -05:00
// Label
2026-03-21 11:41:29 -05:00
m_label_py_file . LabelText ( m_language [ GUIBASE_COMPONENT_NAME ( m_label_py_file ) ] ) ;
m_label_py_file . Update ( true ) ;
2026-03-26 11:23:24 -05:00
// Val
2026-03-21 11:41:29 -05:00
m_label_py_file_val . Tooltip ( m_language . Tooltip ( GUIBASE_COMPONENT_NAME ( m_label_py_file_val ) ) ) ;
2026-03-26 11:23:24 -05:00
// Browse
2026-03-21 11:41:29 -05:00
m_btn_py_file_browse . LabelText ( m_language [ GUIBASE_COMPONENT_NAME ( m_btn_py_file_browse ) ] ) ;
m_btn_py_file_browse . Tooltip ( m_language . Tooltip ( GUIBASE_COMPONENT_NAME ( m_btn_py_file_browse ) ) ) ;
m_btn_py_file_browse . Update ( true ) ;
2026-03-26 11:23:24 -05:00
//---
// Label
m_label_log_pyfile . LabelText ( m_language [ GUIBASE_COMPONENT_NAME ( m_label_log_pyfile ) ] ) ;
m_label_log_pyfile . Update ( true ) ;
// Val
m_label_log_pyfile_val . Tooltip ( m_language . Tooltip ( GUIBASE_COMPONENT_NAME ( m_label_log_pyfile_val ) ) ) ;
// Browse
m_btn_logpyfile_browse . LabelText ( m_language [ GUIBASE_COMPONENT_NAME ( m_btn_logpyfile_browse ) ] ) ;
m_btn_logpyfile_browse . Tooltip ( m_language . Tooltip ( GUIBASE_COMPONENT_NAME ( m_btn_logpyfile_browse ) ) ) ;
m_btn_logpyfile_browse . Update ( true ) ;
2026-03-24 10:39:38 -05:00
//--- Actulziamos el edit del py
const string key = GUIBASE_COMPONENT_NAME ( m_edit_py_max_tiemout ) ;
m_edit_py_max_tiemout . LabelText ( m_language [ key ] ) ;
m_edit_py_max_tiemout . Tooltip ( m_language . Tooltip ( key ) ) ;
const string texto = m_edit_py_max_tiemout . LabelText ( ) ;
m_edit_py_max_tiemout . CanvasFontSet ( ) ;
const int width = m_edit_py_max_tiemout . m_canvas . TextWidth ( texto ) ;
// Ancho texto | Extra separacion entre texto y obj element| Ancho de elemento
m_edit_py_max_tiemout . XSize ( width + 10 + 200 ) ;
m_edit_py_max_tiemout . Update ( true ) ;
2026-03-20 17:16:21 -05:00
//---
2026-03-21 08:06:31 -05:00
m_btn_run_py . Tooltip ( m_language [ GUIBASE_COMPONENT_NAME ( m_btn_run_py ) ] ) ; // toltip solo cambios
2026-03-22 22:09:32 -05:00
m_btn_run_py . LabelText ( m_language [ GUIBASE_COMPONENT_NAME ( m_btn_run_py ) + ( m_py_is_run ? " _running " : " " ) ] ) ;
2026-03-20 17:16:21 -05:00
m_btn_run_py . Update ( true ) ;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
2026-03-21 08:06:31 -05:00
void CTrainingTabConfig : : AddRunnerPy ( IRunPy * runer )
2026-03-20 17:16:21 -05:00
{
//---
2026-03-21 08:06:31 -05:00
const uint8_t flags = runer . EventsFlags ( ) ;
//---
if ( ( flags & TRAINING_RUNNER_PY_FLAG_ON_INIT ) ! = 0 )
2026-03-20 17:16:21 -05:00
{
m_runer_py_on_init [ ArrayResize ( m_runer_py_on_init , ( + + m_runer_py_on_init_size ) ) - 1 ] = runer ;
}
//---
if ( ( flags & TRAINING_RUNNER_PY_FLAG_ON_TRAINIG ) ! = 0 )
{
m_runer_py_on_pass [ ArrayResize ( m_runer_py_on_pass , ( + + m_runer_py_on_pass_size ) ) - 1 ] = runer ;
}
//---
if ( ( flags & TRAINING_RUNNER_PY_FLAG_ON_DEINIT ) ! = 0 )
{
m_runer_py_on_deinit [ ArrayResize ( m_runer_py_on_deinit , ( + + m_runer_py_on_deinit_size ) ) - 1 ] = runer ;
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CTrainingTabConfig : : OnTrainingStart ( )
{
//---
LogWarning ( " El entremianeto a empezado " , FUNCION_ACTUAL ) ;
//--- Eliminamos los archvos anteriorres si es que existen
: : FileDelete ( m_path_to_lock_bin , m_extra_file_flags ) ;
: : FileDelete ( m_path_to_config_json , m_extra_file_flags ) ;
//---
for ( int i = 0 ; i < m_runer_py_on_init_size ; i + + )
{
m_runer_py_on_init [ i ] . OnTrainingInit ( ) ;
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CTrainingTabConfig : : OnTrainingFinish ( )
{
//---
m_py_is_run = false ;
//---
LogWarning ( " Training has finished " , FUNCION_ACTUAL ) ;
//---
for ( int i = 0 ; i < m_runer_py_on_deinit_size ; i + + )
{
m_runer_py_on_deinit [ i ] . OnTrainingEnd ( ) ;
}
//---
const string run_key = GUIBASE_COMPONENT_NAME ( m_btn_run_py ) + ( m_py_is_run ? " _running " : " " ) ;
2026-03-21 08:06:31 -05:00
m_btn_run_py . LabelText ( m_language [ run_key ] ) ;
2026-03-20 17:16:21 -05:00
m_btn_run_py . Update ( true ) ;
2026-03-20 10:20:00 -05:00
}
2026-03-20 17:16:21 -05:00
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CTrainingTabConfig : : OnTimerEvent ( )
{
if ( ! m_py_is_run )
return ;
static int8_t ct = 0 ;
if ( ct + + > AIDATATASKRUNNER_TRAINING_NUM_C )
{
2026-03-21 08:06:31 -05:00
//---
ct = 0 ;
2026-03-20 17:16:21 -05:00
//---
2026-03-24 10:39:38 -05:00
if ( : : FileIsExist ( m_path_to_lock_bin , m_extra_file_flags ) )
2026-03-20 17:16:21 -05:00
{
2026-03-21 08:06:31 -05:00
//--- Reinicio primero procemos luego
// Lo eliminamos denuevo para que esperemos la siguiente entrega
: : FileDelete ( m_path_to_lock_bin , m_extra_file_flags ) ;
2026-03-26 10:26:25 -05:00
//---
LogInfo ( " Nuevo pase recibido de py " , FUNCION_ACTUAL ) ;
2026-03-21 08:06:31 -05:00
2026-03-20 17:16:21 -05:00
//---
2026-06-03 22:07:50 -05:00
m_json_parser . AssingFile ( m_path_to_config_json , ( m_extra_file_flags & FILE_COMMON ) ! = 0 ) ;
if ( m_json_parser . Parse ( ) )
2026-03-20 17:16:21 -05:00
{
//---
2026-06-03 22:07:50 -05:00
TSN : : CJsonNode root = m_json_parser . GetRoot ( ) ;
2026-03-20 17:16:21 -05:00
//---
2026-06-03 22:07:50 -05:00
if ( root [ " finish " ] . IsValid ( ) )
2026-03-20 17:16:21 -05:00
{
2026-06-03 22:07:50 -05:00
const int res = int ( root [ " finish " ] . ToInt ( 0 ) ) ;
2026-03-26 11:52:16 -05:00
if ( res ! = AIDATATASKRUNNNER_TRAINIG_OUT_EXITO ) // no es igual a exito hubo un fallo
2026-03-24 10:39:38 -05:00
{
const string str = AiDataTaskRunnerTrainingGetErr ( res ) ;
2026-03-26 12:50:40 -05:00
LogFatalError ( StringFormat ( " Fallo al ejecutar el py, el EA launcher retonrno valor no igual a 0, valor de finish = %I64d, str = %s " , res , str ) ,
2026-03-24 10:39:38 -05:00
FUNCION_ACTUAL ) ;
}
2026-03-20 17:16:21 -05:00
OnTrainingFinish ( ) ;
}
else
{
for ( int i = 0 ; i < m_runer_py_on_pass_size ; i + + )
{
2026-06-03 22:07:50 -05:00
m_runer_py_on_pass [ i ] . OnTrainingNewResult ( root ) ;
2026-03-20 17:16:21 -05:00
}
// Nota:
// Se garnatiza que en la otra tab haya un hook que vayue guradadno los json asi que noe s enceiso eliminar esa
// tab hook se encarga de eso
}
}
else
{
2026-06-03 22:07:50 -05:00
LogError ( : : StringFormat ( " Fallo al parsear json ultimo error = %s " , : : EnumToString ( m_json_parser . LastErr ( ) ) ) , FUNCION_ACTUAL ) ;
2026-03-20 17:16:21 -05:00
}
}
}
}
2026-03-20 10:20:00 -05:00
//---
# endif // AIDATATASKRUNER_UI_TRAINING_CONFIGTAB_MQH
2026-03-24 10:39:38 -05:00
//+------------------------------------------------------------------+