2026-11-01 22:12:14 -05:00
//+------------------------------------------------------------------+
//| Ea.mq5 |
//| Copyright 2025, Niquel Mendoza. |
//| https://www.mql5.com/es/users/nique_372/news |
//+------------------------------------------------------------------+
# property copyright " Copyright 2025, Niquel Mendoza. "
# property link " https://www.mql5.com/es/users/nique_372/news "
# property version " 1.00 "
# property strict
/ / + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
//| |
//+------------------------------------------------------------------+
# include "Main.mqh"
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
sinput group " ----------| General |---------- "
input ulong Magic = 35465 ; //Magic Number
input bool Modifiied_Chart = true ; //Modificar el grafico?
2026-11-06 17:08:44 -05:00
input bool InpDrawObjects = true ; //Draw objects
2026-11-01 22:12:14 -05:00
sinput group " "
sinput group " -------| Strategy |------- "
input ENUM_VERBOSE_LOG_LEVEL log_level_strategy = VERBOSE_LOG_LEVEL_CAUTION ; //Strategy log level:
input ENUM_TIMEFRAMES InpTimeframHtf = PERIOD_H4 ;
sinput group " -----| TP/SL by Fixed |----- "
input ENUM_TYPE_TP_SL_FIXED inp_type_tp_sl_fixed = TP_SL_ATR ; //Tipo de tp sl fjo:
sinput group " -- TP SL by Point "
input long sl_point = 250 ; //Stop Loss In Points
input long tp_point = 500 ; //Take Profit In Points
sinput group " -- TP SL by Atr "
input double inp_atr_multiplier_tp = 2.0 ; //Multiplicador del atr para el tp
input double inp_atr_multiplier_sl = 2.0 ; //Multiplicador del atr para el sl
sinput group " -- Ordenes -- "
input ulong max_deviation_ord = 100 ; //Maxima desviacion/slípagge de las ordenes en puntos
sinput group " "
sinput group " -------| Account Status |------- "
input ENUM_VERBOSE_LOG_LEVEL log_level_account_status = VERBOSE_LOG_LEVEL_ALL ; //(Account Status|Ticket Mangement) log level:
sinput group " "
sinput group " -------| Risk Management |------- "
input TSN : : ENUM_LOTE_TYPE Lote_Type = TSN : : Dinamico ; //Lote Type:
input double lote = 0.1 ; //Lot size (only for fixed lot)
input TSN : : ENUM_MODE_RISK_MANAGEMENT risk_mode = TSN : : risk_mode_personal_account ; //type of risk management mode
input TSN : : ENUM_GET_LOT get_mode = TSN : : GET_LOT_BY_STOPLOSS_AND_RISK_PER_OPERATION ; //How to get the lot
input double prop_firm_balance = 0 ; //If risk mode is Prop Firm FTMO, then put your ftmo account balance
input ENUM_VERBOSE_LOG_LEVEL log_level_risk_management = VERBOSE_LOG_LEVEL_WARNINGS ; //Risk Management log level:
sinput group " - ML/Maxium loss/Maxima perdida - "
input double percentage_or_money_ml_input = 0 ; //percentage or money (0 => not used ML)
input TSN : : ENUM_RISK_CALCULATION_MODE mode_calculation_ml = TSN : : percentage ; //Mode calculation Max Loss
input TSN : : ENUM_APPLIED_PERCENTAGES applied_percentages_ml = TSN : : Balance ; //ML percentage applies to:
sinput group " - MWL/Maximum weekly loss/Perdida maxima semanal - "
input double percentage_or_money_mwl_input = 0 ; //percentage or money (0 => not used MWL)
input TSN : : ENUM_RISK_CALCULATION_MODE mode_calculation_mwl = TSN : : percentage ; //Mode calculation Max weekly Loss
input TSN : : ENUM_APPLIED_PERCENTAGES applied_percentages_mwl = TSN : : Balance ; //MWL percentage applies to:
sinput group " - MDL/Maximum daily loss/Perdida maxima diaria - "
input double percentage_or_money_mdl_input = 0 ; //percentage or money (0 => not used MDL)
input TSN : : ENUM_RISK_CALCULATION_MODE mode_calculation_mdl = TSN : : percentage ; //Mode calculation Max daily loss
input TSN : : ENUM_APPLIED_PERCENTAGES applied_percentages_mdl = TSN : : Balance ; //MDL percentage applies to:
sinput group " - GMLPO/Gross maximum loss per operation/Porcentaje a arriesgar por operacion - "
input TSN : : ENUM_OF_DYNAMIC_MODES_OF_GMLPO mode_gmlpo = TSN : : DYNAMIC_GMLPO_FULL_CUSTOM ; //Select GMLPO mode:
input double percentage_or_money_gmlpo_input = 10.0 ; //percentage or money (0 => not used GMLPO)
input TSN : : ENUM_RISK_CALCULATION_MODE mode_calculation_gmlpo = TSN : : percentage ; //Mode calculation Max Loss per operation
input TSN : : ENUM_APPLIED_PERCENTAGES applied_percentages_gmlpo = TSN : : Balance ; //GMPLO percentage applies to:
sinput group " -- Optional GMLPO settings, Dynamic GMLPO "
sinput group " --- Full customizable dynamic GMLPO "
input string note1 = " subtracted from your total balance to establish a threshold. " ; //This parameter determines a specific percentage that will be
input string str_percentages_to_be_reviewed = " 15,30,50 " ; //percentages separated by commas.
input string note2 = " a new risk level will be triggered on your future trades: " ; //When the current balance (equity) falls below this threshold
input string str_percentages_to_apply = " 10,20,25 " ; //percentages separated by commas.
input string note3 = " 0 in both parameters => do not use dynamic risk in gmlpo " ; //Note:
sinput group " --- Fixed dynamic GMLPO with parameters "
sinput group " - 1 - "
input string note1_1 = " subtracted from your total balance to establish a threshold. " ; //This parameter determines a specific percentage that will be
input double inp_balance_percentage_to_activate_the_risk_1 = 2.0 ; //percentage 1 that will be exceeded to modify the risk separated by commas
input string note2_1 = " a new risk level will be triggered on your future trades: " ; //When the current balance (equity) falls below this threshold
input double inp_percentage_to_be_modified_1 = 1.0 ; //new percentage 1 to which the gmlpo is modified
sinput group " - 2 - "
input double inp_balance_percentage_to_activate_the_risk_2 = 5.0 ; //percentage 2 that will be exceeded to modify the risk separated by commas
input double inp_percentage_to_be_modified_2 = 0.7 ; //new percentage 2 to which the gmlpo is modified
sinput group " - 3 - "
input double inp_balance_percentage_to_activate_the_risk_3 = 7.0 ; //percentage 3 that will be exceeded to modify the risk separated by commas
input double inp_percentage_to_be_modified_3 = 0.5 ; //new percentage 3 to which the gmlpo is modified
sinput group " - 4 - "
input double inp_balance_percentage_to_activate_the_risk_4 = 9.0 ; //percentage 4 that will be exceeded to modify the risk separated by commas
input double inp_percentage_to_be_modified_4 = 0.33 ; //new percentage 4 1 to which the gmlpo is modified
sinput group " -- MDP/Maximum daily profit/Maxima ganancia diaria -- "
input bool mdp_is_strict = true ; //MDP is strict?
input double percentage_or_money_mdp_input = 0 ; //percentage or money (0 => not used MDP)
input TSN : : ENUM_RISK_CALCULATION_MODE mode_calculation_mdp = TSN : : percentage ; //Mode calculation Max Daily Profit
input TSN : : ENUM_APPLIED_PERCENTAGES applied_percentages_mdp = TSN : : Balance ; //MDP percentage applies to:
sinput group " "
sinput group " --------------| Sessions |-------------- "
input ENUM_TYPE_DRAW_RANGE_SESSION typo_dibujado_session = draw_session_range_lines_and_rect ; //Session drawing type
input bool fill_rects_session = true ; //fill the session rectangles
input int withd_lines_extra = 2 ; //Extra Line Witdh (if Session Draw type is Rectange and line)
input int Width_rect = 1 ; //Rectangle Sessions Width
input ENUM_LINE_STYLE style_rect_sessions = STYLE_SOLID ; //rect line style
sinput group " - London Sesion "
input bool opera_london_open = true ; //Operar london open?
input char hora_london_incio_sesion = 6 ; // London start hour
input char min_london_inicio_sesion = 0 ; // London start minute
input char hora_london_fin_sesion = 9 ; // London end hour
input char min_london_fin_sesion = 0 ; // London end minute
input color clr_Rect_Sesion_london = C ' 204 , 234 , 255 ' ; //color of London rectangle
input color clr_line_Sesion_london = clrDodgerBlue ; //color of London line
sinput group " - New York Session "
input bool opera_ny_morning = true ; //Operar ny open?
input char hora_ny_incio_sesion = 11 ; // New York Morning start hour
input char min_ny_inicio_sesion = 0 ; // New York Morning start minute
input char hora_ny_fin_sesion = 15 ; // New York Morning end hour
input char min_ny_fin_sesion = 0 ; // New York Morning end minute
input color clr_Rect_Sesion_ny = C ' 230 , 235 , 251 ' ; //color of New York Morning rectangle
input color clr_line_Sesion_ny = clrRoyalBlue ; //color of New York Morning line
sinput group " "
sinput group " -------| FVG |------- "
input bool mostrar_la_mitad_imbalances = true ; //show the middle line of (fvg-rdrb-imbalance-gap-bpr)?
input int minutos_despues_mitigacion_eliminar_imbalances = 10 ; //minutes to delete the (fvg-rdrb-imbalance-gap-ifvg-bpr) after being invalidated
input bool Fill_all_imbalance = true ; //Fill (fvg - imbalance - gap - rdrb)?
input ENUM_STYLE_DIBUJO_IMBALANCES style_draw_fvg = fvg_1_vela ; // Fvg Drawing Style
input color Color_FVG_alcista = C ' 171 , 222 , 165 ' ; // choose bullish fvg color
input color Color_FVG_bajista = C ' 248 , 154 , 152 ' ; // choose bearish fvg color
input color mitad_Color_FVG_alcista = C ' 116 , 200 , 106 ' ; //color of the middle line of the bullish fvg
input color mitad_Color_FVG_bajista = C ' 243 , 90 , 86 ' ; //color of the middle line of the bearish fvg
input ENUM_MODO_OBTENCION_IMBALANCE obtencion_type_fvg = defined_pattern ; //fvg get mode
input TSN : : ENUM_MODE_DIFF mode_min_diff_fvg = TSN : : MODE_DIFF_BY_ATR ; //Choose the minimum difference type for the fvg:
input string c111 = " is point or specify atr multipler (for a 14-period atr current) " ; //Minimum height for the fvg in points if the difference mode
input double atr_mul_or_dist_point_fvg = 0 ; //Atr multiplier or distance in points
sinput group " ------| Order Blocks |------ "
input int minutos_despues_mitigacion_eliminar_ob = 10 ; //minutes to delete the order block after being invalidated
input bool mostar_la_mitad_ob = true ; //show the middle line of an order block?
input ENUM_ORDERBLOCKS_OBTENCIUON_TYPE mod_obtencion_obs = ORDER_BLOCKS_ALL ; //Order blocks Obtaining mode
sinput group " --| General properties of the order block rectangle "
input bool fill_order_blocks = true ; //Fill Order Blocks?
sinput group " --| Bullish order block "
input color Color_OrderBlock_Alcista = C ' 45 , 154 , 29 ' ; // Choose the Bullish Order Block Color
input color line_mitad_color_oba = clrDarkGreen ; //color of the middle line of the bullish order blocks
input ENUM_OB_STYLE price_1_oba = low ; // choose price1 bullish order block
input ENUM_OB_STYLE price_2_oba = high ; // choose price2 bullish order block
sinput group " --| Bearish order block "
input color Color_OrderBlock_Bajista = C ' 249 , 95 , 57 ' ; // Choose the Bearish Order Block Color
input color line_mitad_color_obb = clrTomato ; //color of the middle line of the bearish order blocks
input ENUM_OB_STYLE price_1_obb = high ; // choose price1 bearish order block
input ENUM_OB_STYLE price_2_obb = low ; // choose price2 bearish order block
sinput group " --| Settings order block by sweeps "
input int16_t lenth_order_block = 4 ; //Num bar of swings to identify swing points
input ENUM_TYPE_ROPTRUA_CONFIRMAR_OB breakout_type_ob = BREAKUP_VELA_ROPTURA_SWING ; // break type for order block by sweep
input int max_espera_roptura_ob_sweep = 20 ; //maximum wait in bars to break a swing or open of a candle
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
2026-11-06 17:08:44 -05:00
CEstrategia strategy ( Magic , _Symbol , InpDrawObjects , _Period , 0 , 0 , max_deviation_ord ) ;
2026-11-01 22:12:14 -05:00
//---
int8_t idx_controler_w1 = INVALID_INDEX ;
int8_t idx_controler_curr = INVALID_INDEX ;
int8_t idx_bar_controlerd1 = INVALID_INDEX ;
int8_t idx_bar_mn1 = INVALID_INDEX ;
//---
2026-11-02 11:19:09 -05:00
uint g_trade_flags = 0 ;
2026-11-01 22:12:14 -05:00
bool NewDay = false ;
TSN : : CLossProfitManager g_loss_profit_manager ; // LossProfitManager
TSN : : CAtrOptimizedZero g_atr_opt_zero ( PERIOD_CURRENT , _Symbol , 14 ) ;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit ( )
{
//--- Atr
int pos_atr = ICTAtr_Create ( _Period , _Symbol , 14 , true ) ;
TSN : : CAtr * atr_h = ICTAtr_GetAtrPointer ( pos_atr ) ;
//--- Registramos timeframes
g_new_bar_manager . GetPosExecute ( PERIOD_D1 , idx_bar_controlerd1 ) ;
g_new_bar_manager . GetPosExecute ( _Period , idx_controler_curr ) ;
g_new_bar_manager . GetPosExecute ( PERIOD_W1 , idx_controler_w1 ) ;
g_new_bar_manager . GetPosExecute ( PERIOD_MN1 , idx_bar_mn1 ) ;
//---
if ( Modifiied_Chart )
{
long chart_id = ChartID ( ) ; // Obtén el ID del gráfico actual
// Ocultar la cuadrícula
ChartSetInteger ( chart_id , CHART_SHOW_GRID , false ) ;
ChartSetInteger ( chart_id , CHART_COLOR_BACKGROUND , C ' 255 , 255 , 255 ' ) ; // Fondo blanco
ChartSetInteger ( chart_id , CHART_COLOR_FOREGROUND , clrBlack ) ; // Texto y escalas negras
ChartSetInteger ( chart_id , CHART_COLOR_CHART_UP , C ' 38 , 166 , 154 ' ) ; // Velas alcistas color verde azulado
ChartSetInteger ( chart_id , CHART_COLOR_CHART_DOWN , C ' 239 , 83 , 80 ' ) ; // Velas bajistas color rojo
ChartSetInteger ( chart_id , CHART_COLOR_CANDLE_BULL , C ' 38 , 166 , 154 ' ) ; // Cuerpo de las velas alcistas
ChartSetInteger ( chart_id , CHART_COLOR_CANDLE_BEAR , C ' 239 , 83 , 80 ' ) ; // Cuerpo de las velas bajistas
ChartSetInteger ( chart_id , CHART_COLOR_CHART_LINE , clrDarkSeaGreen ) ; // Línea de tendencia
ChartSetInteger ( chart_id , CHART_COLOR_VOLUME , C ' 38 , 166 , 154 ' ) ; // Color de los volúmenes
ChartSetInteger ( chart_id , CHART_COLOR_BID , C ' 38 , 166 , 154 ' ) ; // Línea de oferta
ChartSetInteger ( chart_id , CHART_COLOR_ASK , C ' 239 , 83 , 80 ' ) ; // Línea de demanda
ChartSetInteger ( chart_id , CHART_COLOR_LAST , C ' 156 , 186 , 240 ' ) ; // Último precio
ChartSetInteger ( chart_id , CHART_COLOR_STOP_LEVEL , C ' 239 , 83 , 80 ' ) ; // Líneas de stop
ChartSetInteger ( chart_id , CHART_SHOW_VOLUMES , true ) ;
// Actualizar el gráfico
ChartRedraw ( chart_id ) ;
}
//--- Sesiones
if ( opera_london_open )
{
//ADEVERTENICA, _period, no afecta en nada a las sesion esat se ejecutan cada vela M1
CTradingSession * sesion_london = new CTradingSession ( ) ;
2026-11-06 17:08:44 -05:00
sesion_london . Create ( _Symbol , _Period , 0 , 0 , InpDrawObjects , true , hora_london_incio_sesion , min_london_inicio_sesion , hora_london_fin_sesion , min_london_fin_sesion , " London " ) ;
2026-11-01 22:12:14 -05:00
sesion_london . SetExtra ( clr_line_Sesion_london , clr_line_Sesion_london , STYLE_SOLID , withd_lines_extra , typo_dibujado_session ) ;
sesion_london . SetGrapichStyles ( style_rect_sessions , clr_Rect_Sesion_london , Width_rect , fill_rects_session ) ;
g_sesiones . AddItemFast ( sesion_london ) ;
}
if ( opera_ny_morning )
{
CTradingSession * sesion_ny = new CTradingSession ( ) ;
2026-11-06 17:08:44 -05:00
sesion_ny . Create ( _Symbol , _Period , 0 , 0 , InpDrawObjects , true , hora_ny_incio_sesion , min_ny_inicio_sesion , hora_ny_fin_sesion , min_ny_fin_sesion , " Ny " ) ;
2026-11-01 22:12:14 -05:00
sesion_ny . SetExtra ( clr_line_Sesion_ny , clr_line_Sesion_ny , STYLE_SOLID , withd_lines_extra , typo_dibujado_session ) ;
sesion_ny . SetGrapichStyles ( style_rect_sessions , clr_Rect_Sesion_ny , Width_rect , fill_rects_session ) ;
g_sesiones . AddItemFast ( sesion_ny ) ;
}
if ( g_sesiones .Size ( ) < 1 )
{
FastLog ( FUNCION_ACTUAL , FATAL_ERROR_TEXT , " Minimos se requiren 2 sesiones " ) ;
return INIT_PARAMETERS_INCORRECT ;
}
//--- Fvg
2026-11-06 17:08:44 -05:00
g_fvg . Create ( _Symbol , _Period , 0 , 0 , InpDrawObjects ) ;
2026-11-01 22:12:14 -05:00
g_fvg .Set ( 500 , obtencion_type_fvg , style_draw_fvg , TSN : : CreateDiffptr ( mode_min_diff_fvg , _Symbol , atr_h , 1 , atr_mul_or_dist_point_fvg ) ) ;
g_fvg . SetGrapich ( Color_FVG_alcista , Color_FVG_bajista , mitad_Color_FVG_alcista , mitad_Color_FVG_bajista , STYLE_SOLID , Fill_all_imbalance , 1 , mostrar_la_mitad_imbalances ,
minutos_despues_mitigacion_eliminar_imbalances , 1 , STYLE_DOT ) ;
//--- Ob
2026-11-06 17:08:44 -05:00
g_ob . Create ( _Symbol , _Period , 0 , 0 , InpDrawObjects ) ;
2026-11-01 22:12:14 -05:00
g_ob . SetGrapich ( Color_OrderBlock_Alcista , Color_OrderBlock_Bajista , line_mitad_color_oba , line_mitad_color_obb , STYLE_SOLID , fill_order_blocks , 1 , mostar_la_mitad_ob ,
minutos_despues_mitigacion_eliminar_ob , 1 , STYLE_DOT ) ;
g_ob . SetTypeBusqueda ( mod_obtencion_obs ) ;
g_ob . SetStylesPrices ( price_1_oba , price_1_obb , price_2_oba , price_2_obb ) ;
g_ob . SetOrderBlockSweep ( lenth_order_block , max_espera_roptura_ob_sweep , breakout_type_ob ) ;
g_ob .Set ( 500 ) ;
//--- Pda
g_pdas . AddItemFast ( & g_fvg ) ;
g_pdas . AddItemFast ( & g_ob ) ;
//--- Estrategia
strategy . AddLogFlags ( log_level_strategy ) ;
strategy . SetAtrTP_SL ( & g_atr_opt_zero , inp_atr_multiplier_tp , inp_atr_multiplier_sl ) ;
strategy . SetOperateMode ( TR_BUY_SELL , inp_type_tp_sl_fixed ) ;
strategy . SetTP_SL ( tp_point , sl_point ) ;
strategy .Set ( InpTimeframHtf ) ;
if ( Lote_Type = = TSN : : Fijo )
strategy . FixedLotSize ( lote ) ;
//--- Risk management
string _what = NULL ;
TSNSTD_TRY_INI
{
TSN : : CRiskManagementCreator manager ;
manager . SetPropirm ( prop_firm_balance ) ;
//---
TSN : : MQLArtRMCreatorRes result = manager . GetRiskPointer ( risk_mode , Magic , get_mode ) ;
2026-11-05 18:16:32 -05:00
TSNSTD_TRY_EF ( result . ok , true ,
2026-11-06 10:58:48 -05:00
TSN : : CErrorTrace : : FormatTrace ( _what ) )
2026-11-01 22:12:14 -05:00
//---
risk = result . ptr ;
risk . AddLogFlags ( log_level_risk_management ) ;
risk . SetLossProfitManager ( g_loss_profit_manager ) ;
CAutoCleaner : : AddPtr ( risk ) ;
// We set the parameters
string to_apply = str_percentages_to_apply , to_modfied = str_percentages_to_be_reviewed ;
if ( mode_gmlpo = = TSN : : DYNAMIC_GMLPO_FIXED_PARAMETERS )
TSN : : CRmFunctions : : SetDynamicUsingFixedParameters ( inp_balance_percentage_to_activate_the_risk_1 , inp_balance_percentage_to_activate_the_risk_2 , inp_balance_percentage_to_activate_the_risk_3
, inp_balance_percentage_to_activate_the_risk_4 , inp_percentage_to_be_modified_1 , inp_percentage_to_be_modified_2 , inp_percentage_to_be_modified_3 , inp_percentage_to_be_modified_4
, to_modfied , to_apply ) ;
//--- Maximum losses and profits
TSNSTD_TRY_INI_S // nota: genera bool _err implicito
{
TSNSTD_TRY_SE ( risk . AddLP ( percentage_or_money_mdl_input , applied_percentages_mdl , mode_calculation_mdl , TSN : : LP_MDL , true ) , true ) ;
TSNSTD_TRY_SE ( risk . AddLP ( percentage_or_money_gmlpo_input , applied_percentages_gmlpo , mode_calculation_gmlpo , TSN : : LP_GMLPO , true , ( mode_gmlpo ! = TSN : : NO_DYNAMIC_GMLPO ) , to_modfied , to_apply ) , true ) ;
TSNSTD_TRY_SE ( risk . AddLP ( percentage_or_money_ml_input , applied_percentages_ml , mode_calculation_ml , TSN : : LP_ML , true ) , true ) ;
TSNSTD_TRY_SE ( risk . AddLP ( percentage_or_money_mwl_input , applied_percentages_mwl , mode_calculation_mwl , TSN : : LP_MWL , true ) , true ) ;
TSNSTD_TRY_SE ( risk . AddLP ( percentage_or_money_mdp_input , applied_percentages_mdp , mode_calculation_mdp , TSN : : LP_MDP , mdp_is_strict ) , true ) ;
risk . EndAddProfitLoss ( ) ; //Ejecutar esto cada vez que se termina de setear las maximas peridas y gancnasias
}
TSNSTD_TRY_END ;
//---
2026-11-06 10:58:48 -05:00
TSNSTD_TRY_N_EF ( _err , true , TSN : : CErrorTrace : : FormatTrace ( _what ) )
2026-11-01 22:12:14 -05:00
}
TSNSTD_TRY_END ;
//---
if ( _what ! = NULL ) // error final
{
FastLog ( FUNCION_ACTUAL , FATAL_ERROR_TEXT , _what ) ;
return INIT_FAILED ;
}
//--- Inicilizamos la cuenta
// challange_simulator.OnEndStatus();
TSN : : account_status . AddLogFlags ( log_level_account_status ) ;
TSN : : account_status . OnInitEvent ( ) ;
//---
CAutoCleaner : : AddFunction ( TSN : : CAccountStatus_Deinit ) ;
CAutoCleaner : : AddFunction ( CBasicEvents : : Deinit ) ;
//---
return ( INIT_SUCCEEDED ) ;
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason )
{
//---
CAutoCleaner : : Deinit ( reason ) ;
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick ( )
{
//---
const datetime time_curr = TimeCurrent ( ) ;
NewDay = false ;
g_new_bar_manager . Execute ( time_curr ) ;
//--- Bloque 1 | Control diario
if ( CNewBarManager_IsNewBarM1 ( g_new_bar_manager ) )
{
//--- Nuevo dia
if ( CNewBarManager_IsNewBar ( g_new_bar_manager , idx_bar_controlerd1 ) )
{
CBasicEvents : : OnNewDay ( time_curr ) ;
2026-11-02 11:19:09 -05:00
TSNMQLART_U_BEVENTS_MAN_REM_F ( g_trade_flags , BASICEVENT_REG_FLAG_ON_NEW_DAY ) ;
2026-11-01 22:12:14 -05:00
//--- Nueva semana
if ( CNewBarManager_IsNewBar ( g_new_bar_manager , idx_controler_w1 ) )
2026-11-02 11:19:09 -05:00
{
2026-11-01 22:12:14 -05:00
CBasicEvents : : OnNewWeek ( time_curr ) ;
2026-11-02 11:19:09 -05:00
TSNMQLART_U_BEVENTS_MAN_REM_F ( g_trade_flags , BASICEVENT_REG_FLAG_ON_NEW_WEEK ) ;
}
2026-11-01 22:12:14 -05:00
//--- Nuevo mes
if ( CNewBarManager_IsNewBar ( g_new_bar_manager , idx_bar_mn1 ) )
2026-11-02 11:19:09 -05:00
{
2026-11-01 22:12:14 -05:00
CBasicEvents : : OnNewMonth ( time_curr ) ;
2026-11-02 11:19:09 -05:00
// no uso tradeflags dado que no hay parametros para un Monthly.. pero si lo hubiera:
//TSNMQLART_U_BEVENTS_MAN_REM_F(g_trade_flags, BASICEVENT_REG_FLAG_ON_NEW_MON);
}
2026-11-01 22:12:14 -05:00
//---
NewDay = true ;
}
}
//---
if ( TSN : : account_status_positions_open )
{
# ifdef MQLARTICLES_RM_MULTI_EA_MODE
risk . CalcProfit ( ) ;
# else // MQLARTICLES_RM_MULTI_EA_MODE
ACCOUNTSTATUS_ONEVERYTICK
# endif // MQLARTICLES_RM_MULTI_EA_MODE
2026-11-02 11:19:09 -05:00
if ( TSNMQLART_U_BEVENTS_MAN_TRADE_NOW ( g_trade_flags ) )
2026-11-01 22:12:14 -05:00
{
if ( g_loss_profit_manager . MaxLossIsSuperated ( ) )
{
const int type = g_loss_profit_manager . GetLastLossSuperatedType ( ) ;
2026-11-02 11:19:09 -05:00
if ( type < TSN : : LP_ML )
{
strategy . OnInterupcion ( ) ;
risk . CloseAllPositions ( ) ;
// anadimos segun corresponda
TSNMQLART_U_BEVENTS_MAN_ADD_F ( g_trade_flags , TSNMQLART_RM_LP_M_BEVENTS_F_LOSS ( type ) ) ;
Print ( TSN : : g_mqarticles_lp_str_names [ type ] , " is superated now " ) ;
}
else // Manejo de las demas perdidas (aqui tambien entra pico, como no lo tenemos "agregado" no importa, pero si estuviera habria que manejar un caso especial)
2026-11-01 22:12:14 -05:00
{
if ( risk_mode = = TSN : : risk_mode_propfirm_dynamic_daiy_loss )
Print ( " The expert advisor lost the funding test " ) ;
else
Print ( " Maximum loss exceeded now " ) ;
//---
2026-11-02 11:19:09 -05:00
strategy . OnInterupcion ( ) ;
risk . CloseAllPositions ( ) ;
2026-11-01 22:12:14 -05:00
Remover ( ) ;
}
}
else
if ( g_loss_profit_manager . MaxProfitIsSuperated ( ) )
{
2026-11-02 11:19:09 -05:00
// NOTA: no se comprueba el tipo dado que ahora mismo solo hay un profit agregado (MDP).
// Si hubieran mas se haria algo similar a la rama de losses.
2026-11-01 22:12:14 -05:00
strategy . OnInterupcion ( ) ;
risk . CloseAllPositions ( ) ;
2026-11-02 11:19:09 -05:00
TSNMQLART_U_BEVENTS_MAN_ADD_F ( g_trade_flags , BASICEVENT_REG_FLAG_ON_NEW_DAY ) ;
2026-11-01 22:12:14 -05:00
Print ( " Excellent Maximum daily profit achieved " ) ;
}
}
}
//--- Bloque 2 | Verifiacion
2026-11-02 11:19:09 -05:00
if ( TSNMQLART_U_BEVENTS_MAN_NO_TRADE_NOW ( g_trade_flags ) )
2026-11-01 22:12:14 -05:00
return ;
//---
if ( CNewBarManager_IsNewBarM1 ( g_new_bar_manager ) )
{
ICTGen_FuncionOnBarM1 ( NewDay , time_curr ) ;
g_sesiones . OnNewBarM1 ( ) ;
if ( CNewBarManager_IsNewBar ( g_new_bar_manager , idx_controler_curr ) )
{
//--- Conceptos
g_ob . OnNewBar ( ) ;
g_fvg . OnNewBar ( ) ;
strategy . OnNewBar ( time_curr ) ;
}
}
}
//+------------------------------------------------------------------+
//| TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction & trans ,
const MqlTradeRequest & request ,
const MqlTradeResult & result )
{
//---
TSN : : account_status . OnTradeTransactionEvent ( trans ) ;
}
//+------------------------------------------------------------------+