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 InpMagic = 35465 ; // Magic Number
input bool InpModifiedChart = true ; // Modificar el grafico?
2026-11-06 15:35:47 -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 InpStrategyLogLevel = VERBOSE_LOG_LEVEL_CAUTION ; // Strategy log level
sinput group " -----| De la estrategia |----- "
input string InpStrategyFibboLevels = " 0.00,0.50,1.0 " ;
input string InpStrategyFibboColors = " clrRed,clrWhite,clrRed " ;
input double InpStrategyFibboChooseLevel = 0.50 ;
sinput group " -----| TP/SL |----- "
input ENUM_TYPE_TP_SL_FIXED InpStrategyTypeTpSl = TP_SL_ATR ; // Tipo de TP/SL
sinput group " -- TP SL by Point "
input long InpStrategySlPoint = 250 ; // Stop Loss en puntos
input long InpStrategyTpPoint = 500 ; // Take Profit en puntos
sinput group " -- TP SL by ATR "
input double InpStrategyAtrMultiplierTp = 2.0 ; // Multiplicador del ATR para el TP
input double InpStrategyAtrMultiplierSl = 2.0 ; // Multiplicador del ATR para el SL
sinput group " -----| Ordenes |----- "
input ulong InpStrategyMaxDeviationOrders = 100 ; //Maxima desviacion/slípagge de las ordenes en puntos
sinput group " "
sinput group " -------| Account Status |------- "
input ENUM_VERBOSE_LOG_LEVEL InpAccountStatusLogLevel = VERBOSE_LOG_LEVEL_ERROR_ONLY ; //(Account Status|Ticket Mangement) log level:
sinput group " "
sinput group " -------| Risk Management |------- "
input TSN : : ENUM_LOTE_TYPE InpRmLoteType = TSN : : Dinamico ; //Lote Type:
input double InpRmLote = 0.1 ; //Lot size (only for fixed lot)
input TSN : : ENUM_MODE_RISK_MANAGEMENT InpRmRiskMode = TSN : : risk_mode_personal_account ; //type of risk management mode
input TSN : : ENUM_GET_LOT InpRmGetMode = TSN : : GET_LOT_BY_STOPLOSS_AND_RISK_PER_OPERATION ; //How to get the lot
input double InpRmPropFirmBalance = 0 ; //If risk mode is Prop Firm FTMO, then put your ftmo account balance
input ENUM_VERBOSE_LOG_LEVEL InpRmLogLevel = VERBOSE_LOG_LEVEL_ERROR_ONLY ; //Risk Management log level:
sinput group " - ML/Maximum loss/Maximum loss - "
input double InpRmPercentageOrMoneyMl = 0 ; //percentage or money (0 => not used ML)
input TSN : : ENUM_RISK_CALCULATION_MODE InpRmModeCalculationMl = TSN : : percentage ; //Mode calculation Max Loss
input TSN : : ENUM_APPLIED_PERCENTAGES InpRmAppliedPercentagesMl = TSN : : Balance ; //ML percentage applies to:
sinput group " - MWL/Maximum weekly loss/Maximum weekly loss - "
input double InpRmPercentageOrMoneyMwl = 0 ; //percentage or money (0 => not used MWL)
input TSN : : ENUM_RISK_CALCULATION_MODE InpRmModeCalculationMwl = TSN : : percentage ; //Mode calculation Max weekly Loss
input TSN : : ENUM_APPLIED_PERCENTAGES InpRmAppliedPercentagesMwl = TSN : : Balance ; //MWL percentage applies to:
sinput group " - MDL/Maximum daily loss/Maximum daily loss - "
input double InpRmPercentageOrMoneyMdl = 3.0 ; //percentage or money (0 => not used MDL)
input TSN : : ENUM_RISK_CALCULATION_MODE InpRmModeCalculationMdl = TSN : : percentage ; //Mode calculation Max daily loss
input TSN : : ENUM_APPLIED_PERCENTAGES InpRmAppliedPercentagesMdl = TSN : : Balance ; //MDL percentage applies to:
sinput group " - GMLPO/Gross maximum loss per CanTradetion/Percentage to risk per CanTradetion - "
input TSN : : ENUM_OF_DYNAMIC_MODES_OF_GMLPO InpRmModeGmlpo = TSN : : NO_DYNAMIC_GMLPO ; //Select GMLPO mode:
input double InpRmPercentageOrMoneyGmlpo = 2.0 ; //percentage or money (0 => not used GMLPO)
input TSN : : ENUM_RISK_CALCULATION_MODE InpRmModeCalculationGmlpo = TSN : : percentage ; //Mode calculation Max Loss per CanTradetion
input TSN : : ENUM_APPLIED_PERCENTAGES InpRmAppliedPercentagesGmlpo = TSN : : Balance ; //GMPLO percentage applies to:
sinput group " -- Optional GMLPO settings, Dynamic GMLPO "
sinput group " --- Full customizable dynamic GMLPO "
input string InpRmNote1 = " subtracted from your total balance to establish a threshold. " ; //This parameter determines a specific percentage that will be
input string InpRmStrPercentagesToBeReviewed = " 15,30,50 " ; //percentages separated by commas.
input string InpRmNote2 = " a new risk level will be triggered on your future trades: " ; //When the current balance (equity) falls below this threshold
input string InpRmStrPercentagesToApply = " 10,20,25 " ; //percentages separated by commas.
input string InpRmNote3 = " 0 in both parameters => do not use dynamic risk in gmlpo " ; //Note:
sinput group " --- Fixed dynamic GMLPO with parameters "
sinput group " - 1 - "
input string InpRmNote11 = " subtracted from your total balance to establish a threshold. " ; //This parameter determines a specific percentage that will be
input double InpRmBalancePercentageToActivateTheRisk1 = 2.0 ; //percentage 1 that will be exceeded to modify the risk separated by commas
input string InpRmNote21 = " a new risk level will be triggered on your future trades: " ; //When the current balance (equity) falls below this threshold
input double InpRmPercentageToBeModified1 = 1.0 ; //new percentage 1 to which the gmlpo is modified
sinput group " - 2 - "
input double InpRmBalancePercentageToActivateTheRisk2 = 5.0 ; //percentage 2 that will be exceeded to modify the risk separated by commas
input double InpRmPercentageToBeModified2 = 0.7 ; //new percentage 2 to which the gmlpo is modified
sinput group " - 3 - "
input double InpRmBalancePercentageToActivateTheRisk3 = 7.0 ; //percentage 3 that will be exceeded to modify the risk separated by commas
input double InpRmPercentageToBeModified3 = 0.5 ; //new percentage 3 to which the gmlpo is modified
sinput group " - 4 - "
input double InpRmBalancePercentageToActivateTheRisk4 = 9.0 ; //percentage 4 that will be exceeded to modify the risk separated by commas
input double InpRmPercentageToBeModified4 = 0.33 ; //new percentage 4 1 to which the gmlpo is modified
sinput group " -- MDP/Maximum daily profit/Maximum daily profit -- "
input bool InpRmMdpIsStrict = true ; //MDP is strict?
input double InpRmPercentageOrMoneyMdp = 11.0 ; //percentage or money (0 => not used MDP)
input TSN : : ENUM_RISK_CALCULATION_MODE InpRmModeCalculationMdp = TSN : : percentage ; //Mode calculation Max Daily Profit
input TSN : : ENUM_APPLIED_PERCENTAGES InpRmAppliedPercentagesMdp = TSN : : Balance ; //MDP percentage applies to:
sinput group " "
sinput group " -------| Swing Zz |------- "
input int16_t InpSwingZzLenth = 5 ;
sinput group " "
sinput group " -------| Soportes y Resistencias |------- "
input int range_obt_s_r = 500 ; //Rango de obtecion
sinput group " "
sinput group " --- Objetos Graficos "
input int width_s_r_lines = 1 ; //Ancho de las lineas de s/r
input ENUM_LINE_STYLE style_lines_s_r = STYLE_SOLID ; //Estilo de las lineas de s/r
input color color_resistencia = clrBlue ; //Color de la linea de resistencia
input color color_soporte = clrRed ; //Color de la linea del soporte
sinput group " --- Obtencion "
input int8_t min_toques_s_r = 2 ; //Toques minimos
input int16_t max_toques_s_tr = 5 ; //Toques maximos para invalidar un s_r
input int16_t periodo_maximo_minimo = 12 ; //Periodo del maximo/minimo
input ENUM_GET_SWING type_get_swing_s_r = PURE_SWINGS ; //Eliga como obtener los max y min:
sinput group " "
sinput group " --- Maxima diferecia para el cambio "
input TSN : : ENUM_MODE_DIFF modo_diff_inverse_s_r = TSN : : MODE_DIFF_BY_ATR ; //Modo para calcular la minima difrerencia para el cambio
input double atr_multiplier_s_r_inverse_or_points = 0.95 ; //Multiplicador del atr (14 periodos) o puntos fijos
sinput group " "
sinput group " --- Maxima diferecia para encontrar maximo o minimos que coinciden "
input TSN : : ENUM_MODE_DIFF modo_diff_range_s_r = TSN : : MODE_DIFF_BY_ATR ; //Modo para calcular la minima difrerencia para el cambio
input double atr_multiplier_s_r_range_or_points = 0.95 ; //Multiplicador del atr (14 periodos) o puntos fijos
sinput group " "
sinput group " -------| Sessiones |------- "
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 " - New York Session "
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
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
2026-11-06 15:35:47 -05:00
CEstrategia strategy ( InpMagic , _Symbol , InpDrawObjects , _Period , 0 , 0 , InpStrategyMaxDeviationOrders ) ;
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 ;
//---
TSN : : CLossProfitManager g_loss_profit_manager ; // LossProfitManager
TSN : : CAtrOptimizedZero g_atr_opt_zero ( PERIOD_CURRENT , _Symbol , 14 ) ;
bool NewDay = false ;
2026-11-02 11:19:09 -05:00
uint g_trade_flags = 0 ;
2026-11-01 22:12:14 -05:00
//+------------------------------------------------------------------+
//| 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 ( InpModifiedChart )
{
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 ) ;
}
//---
2026-11-06 15:35:47 -05:00
g_session . 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
g_session . SetExtra ( clr_line_Sesion_ny , clr_line_Sesion_ny , STYLE_SOLID , withd_lines_extra , typo_dibujado_session ) ;
g_session . SetGrapichStyles ( style_rect_sessions , clr_Rect_Sesion_ny , Width_rect , fill_rects_session ) ;
//---
MqlParam params [ ] ;
ZZToParams ( InpSwingZzLenth , 500 , false , params ) ;
2026-11-06 15:35:47 -05:00
g_zz . Create ( _Symbol , _Period , 0 , 0 , InpDrawObjects , params ) ;
2026-11-01 22:12:14 -05:00
g_zz . SetProperties ( clrBlue , clrRed , " H " , " L " , " Arial " , 10 , 10 ) ;
//---
2026-11-06 15:35:47 -05:00
g_support_resistence . Create ( _Symbol , _Period , 0 , 0 , InpDrawObjects ) ;
2026-11-01 22:12:14 -05:00
g_support_resistence . SetProperties ( min_toques_s_r , max_toques_s_tr , periodo_maximo_minimo , type_get_swing_s_r , range_obt_s_r ) ;
g_support_resistence . SetDiffInverse ( TSN : : CreateDiffptr ( modo_diff_inverse_s_r , _Symbol , atr_h , 0 , atr_multiplier_s_r_inverse_or_points ) ) ;
g_support_resistence . SetDiffMaxDiffRange ( TSN : : CreateDiffptr ( modo_diff_inverse_s_r , _Symbol , atr_h , 0 , atr_multiplier_s_r_range_or_points ) ) ;
g_support_resistence . SetGrapich ( color_resistencia , color_soporte , style_lines_s_r , width_s_r_lines , 8 , " Arial " ) ;
//--- Estrategia
strategy . AddLogFlags ( InpStrategyLogLevel ) ;
strategy . SetAtrTP_SL ( & g_atr_opt_zero , InpStrategyAtrMultiplierTp , InpStrategyAtrMultiplierSl ) ;
strategy . SetOperateMode ( TR_BUY_SELL , InpStrategyTypeTpSl ) ;
strategy . SetTP_SL ( InpStrategySlPoint , InpStrategyTpPoint ) ;
if ( InpRmLoteType = = TSN : : Fijo )
strategy . FixedLotSize ( InpRmLote ) ;
//--- Risk management
string _what = NULL ;
TSNSTD_TRY_INI
{
2026-11-06 15:35:47 -05:00
//--- Strategy (fibbo)
TSNSTD_TRY_EF ( strategy .Init ( clrRed , InpStrategyFibboChooseLevel , InpStrategyFibboLevels , InpStrategyFibboColors ) , true ,
TSN : : CErrorTrace : : FormatTrace ( _what ) )
//--- Risk management
2026-11-01 22:12:14 -05:00
TSN : : CRiskManagementCreator manager ;
manager . SetPropirm ( InpRmPropFirmBalance ) ;
//---
TSN : : MQLArtRMCreatorRes result = manager . GetRiskPointer ( InpRmRiskMode , InpMagic , InpRmGetMode ) ;
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 ( InpRmLogLevel ) ;
risk . SetLossProfitManager ( g_loss_profit_manager ) ;
CAutoCleaner : : AddPtr ( risk ) ;
// We set the parameters
string to_apply = InpRmStrPercentagesToApply , to_modfied = InpRmStrPercentagesToBeReviewed ;
if ( InpRmModeGmlpo = = TSN : : DYNAMIC_GMLPO_FIXED_PARAMETERS )
TSN : : CRmFunctions : : SetDynamicUsingFixedParameters ( InpRmBalancePercentageToActivateTheRisk1 , InpRmBalancePercentageToActivateTheRisk2 , InpRmBalancePercentageToActivateTheRisk3
, InpRmBalancePercentageToActivateTheRisk4 , InpRmPercentageToBeModified1 , InpRmPercentageToBeModified2 , InpRmPercentageToBeModified3 , InpRmPercentageToBeModified4
, to_modfied , to_apply ) ;
//--- Maximum losses and profits
TSNSTD_TRY_INI_S // nota: genera bool _err implicito
{
TSNSTD_TRY_SE ( risk . AddLP ( InpRmPercentageOrMoneyMdl , InpRmAppliedPercentagesMdl , InpRmModeCalculationMdl , TSN : : LP_MDL , true ) , true ) ;
TSNSTD_TRY_SE ( risk . AddLP ( InpRmPercentageOrMoneyGmlpo , InpRmAppliedPercentagesGmlpo , InpRmModeCalculationGmlpo , TSN : : LP_GMLPO , true , ( InpRmModeGmlpo ! = TSN : : NO_DYNAMIC_GMLPO ) , to_modfied , to_apply ) , true ) ;
TSNSTD_TRY_SE ( risk . AddLP ( InpRmPercentageOrMoneyMl , InpRmAppliedPercentagesMl , InpRmModeCalculationMl , TSN : : LP_ML , true ) , true ) ;
TSNSTD_TRY_SE ( risk . AddLP ( InpRmPercentageOrMoneyMwl , InpRmAppliedPercentagesMwl , InpRmModeCalculationMwl , TSN : : LP_MWL , true ) , true ) ;
TSNSTD_TRY_SE ( risk . AddLP ( InpRmPercentageOrMoneyMdp , InpRmAppliedPercentagesMdp , InpRmModeCalculationMdp , TSN : : LP_MDP , InpRmMdpIsStrict ) , true ) ;
risk . EndAddProfitLoss ( ) ; // Execute this every time we finish setting the maximum losses and profits
}
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 ;
}
//--- We initialize the account
TSN : : account_status . AddLogFlags ( InpAccountStatusLogLevel ) ;
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 )
{
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 ( InpRmRiskMode = = 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
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
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 ;
//--- Bloque 4 | Estrategia
// La estrucutra de como ejecutar OnNewBar debe de ir asi
// 1ero deberan de ir las funcion FuncionOnBar y OnTick (estas actulizan los ticks internos de cada instancia)
if ( CNewBarManager_IsNewBarM1 ( g_new_bar_manager ) )
{
ICTGen_FuncionOnBarM1 ( NewDay , time_curr ) ;
g_session . OnNewBarM1 ( ) ;
if ( CNewBarManager_IsNewBar ( g_new_bar_manager , idx_controler_curr ) )
{
strategy . OnNewBar ( time_curr ) ;
}
}
}
//+------------------------------------------------------------------+
//| TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction & trans ,
const MqlTradeRequest & request ,
const MqlTradeResult & result )
{
//---
TSN : : account_status . OnTradeTransactionEvent ( trans ) ;
}
//+------------------------------------------------------------------+