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 " -----| Confirmacion HTF |----- "
input ENUM_TIMEFRAMES InpStrategyTimeframeHTF = PERIOD_H1 ;
input ENUM_ESTRATEGIA_SENSEI_DIRECCION_IND InpStrategyDirectionType = SENSEI_DIR_MANIPULACION_SESIONES ;
sinput group " -----| Confirmacion MIDTF |----- "
input int InpStrategyMaxEspera2ConfirmacionMidTf = 30 ;
input ENUM_TIMEFRAMES InpStrategyTimeframeMidTf = PERIOD_M15 ;
input string InpStrategyFibboLevels = " 0.00,0.50,1.0 " ;
input string InpStrategyFibboColors = " clrRed,clrWhite,clrRed " ;
input double InpStrategyFibboChooseLevel = 0.50 ;
sinput group " -----| Entrada |----- "
input ENUM_ESTRATEGIA_SENSEI_ENTRADA_TYPE InpStrategyEntryType = SENSEI_EST_ENTRADA_OB ;
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 " ------| 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
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 " "
sinput group " -------| Swing Zz |------- "
input int16_t InpSwingZzLenth = 5 ;
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 " - Asia Sesion "
input bool opera_asia = false ; //Operar asia open?
input char hora_asia_incio_sesion = 0 ; // Asia start hour
input char min_asia_incio_sesion = 0 ; // Asia start minute
input char hora_asia_fin_sesion = 4 ; // Asia end hour
input char min_asia_fin_sesion = 0 ; // Asia end minute
input color clr_Rect_Sesion_asia = C ' 213 , 244 , 255 ' ; //color of Asia rectangle
input color clr_text_sesion_asia = clrDeepSkyBlue ; //color of Asia text
input color clr_line_sesion_asia = clrDeepSkyBlue ; //color of Asia line
sinput group " - London Sesion "
input bool opera_london_open = false ; //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_Text_Sesion_london = clrDodgerBlue ; //color of London text
input color clr_line_Sesion_london = clrDodgerBlue ; //color of London line
sinput group " - New York Morning 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_Text_Sesion_ny = clrRoyalBlue ; //color of New York Morning text
input color clr_line_Sesion_ny = clrRoyalBlue ; //color of New York Morning line
sinput group " "
sinput group " -------| Sesion operativa |------- "
input ENUM_TYPE_DRAW_RANGE_SESSION InpOperativeSessionDrawStyle = draw_session_range_lines_and_rect ;
input string InpOperativeSessionName = " Session operativa " ;
input int InpOperativeSessionStartHour = 10 ;
input int InpOperativeSessionStartMinute = 0 ;
input int InpOperativeSessionEndHour = 14 ;
input int InpOperativeSessionEndMinute = 0 ;
input color InpOperativeSessionLineColor = clrBlue ;
input color InpOperativeSessionRectColor = clrAliceBlue ;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
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 ;
IConfirmacion * g_confirmation_htf ;
2026-11-02 15:25:32 -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 ) ;
}
//--- Sesion operativa
2026-11-06 15:35:47 -05:00
g_session_operativa . Create ( _Symbol , _Period , 0 , 0 , InpDrawObjects , true , InpOperativeSessionStartHour , InpOperativeSessionStartMinute , InpOperativeSessionEndHour , InpOperativeSessionEndMinute ,
2026-11-01 22:12:14 -05:00
InpOperativeSessionName ) ;
g_session_operativa . SetExtra ( InpOperativeSessionLineColor , InpOperativeSessionLineColor , STYLE_SOLID , 1 , InpOperativeSessionDrawStyle ) ;
g_session_operativa . SetGrapichStyles ( STYLE_SOLID , InpOperativeSessionRectColor , 1 , true ) ;
//--- Solo crear sesiones si es que se necesita
if ( InpStrategyDirectionType = = SENSEI_DIR_MANIPULACION_SESIONES )
{
if ( opera_asia )
{
CRangeSession * asia_sesion = new CRangeSession ( ) ;
2026-11-06 15:35:47 -05:00
asia_sesion . Create ( _Symbol , _Period , 0 , 0 , InpDrawObjects , true , hora_asia_incio_sesion , min_asia_incio_sesion , hora_asia_fin_sesion , min_asia_fin_sesion , " Asia Kill Zone " ) ;
2026-11-01 22:12:14 -05:00
asia_sesion . SetGrapichStyles ( style_rect_sessions , clr_Rect_Sesion_asia , Width_rect , fill_rects_session ) ;
asia_sesion .Set ( 1 , STYLE_SOLID , clr_line_sesion_asia , clr_line_sesion_asia , clr_line_sesion_asia , draw_session_text_arriba , typo_dibujado_session ) ;
g_sessiones . AddItemFast ( asia_sesion ) ;
}
if ( opera_ny_morning )
{
CRangeSession * sesion_ny = new CRangeSession ( ) ;
2026-11-06 15:35:47 -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 . SetGrapichStyles ( style_rect_sessions , clr_Rect_Sesion_ny , Width_rect , fill_rects_session ) ;
sesion_ny .Set ( 1 , STYLE_SOLID , clr_line_Sesion_ny , clr_line_Sesion_ny , clr_line_Sesion_ny , draw_session_text_arriba , typo_dibujado_session ) ;
g_sessiones . AddItemFast ( sesion_ny ) ;
}
if ( opera_london_open )
{
//ADEVERTENICA, _period, no afecta en nada a las sesion esat se ejecutan cada vela M1
CRangeSession * london_sesion = new CRangeSession ( ) ;
2026-11-06 15:35:47 -05:00
london_sesion . 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
london_sesion . SetGrapichStyles ( style_rect_sessions , clr_Rect_Sesion_london , Width_rect , fill_rects_session ) ;
london_sesion .Set ( 1 , STYLE_SOLID , clr_line_Sesion_london , clr_line_Sesion_london , clr_line_Sesion_london , draw_session_text_arriba , typo_dibujado_session ) ;
g_sessiones . AddItemFast ( london_sesion ) ;
}
if ( g_sessiones .Size ( ) < 1 )
{
FastLog ( FUNCION_ACTUAL , FATAL_ERROR_TEXT , " Minimos se requiren 2 sesiones " ) ;
return INIT_PARAMETERS_INCORRECT ;
}
}
//--- Fvg
2026-11-06 15:35:47 -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 15:35:47 -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 ) ;
//--- ZZ
MqlParam params [ ] ;
ZZToParams ( InpSwingZzLenth , 500 , false , params ) ;
2026-11-06 15:35:47 -05:00
g_zz . Create ( _Symbol , InpStrategyTimeframeMidTf , 0 , 0 , InpDrawObjects , params ) ;
2026-11-01 22:12:14 -05:00
g_zz . SetProperties ( clrBlue , clrRed , " H " , " L " , " Arial " , 10 , 10 ) ;
//--- Estrategia
strategy . AddLogFlags ( InpStrategyLogLevel ) ;
strategy . SetAtrTP_SL ( & g_atr_opt_zero , InpStrategyAtrMultiplierTp , InpStrategyAtrMultiplierSl ) ;
strategy . SetOperateMode ( TR_BUY_SELL , InpStrategyTypeTpSl ) ;
strategy . SetTP_SL ( InpStrategySlPoint , InpStrategyTpPoint ) ;
g_confirmation_htf = ConfirmationFactory : : GetConfirmationParaDireccion ( InpStrategyDirectionType ) ;
strategy . SetConfirmations ( g_confirmation_htf , ConfirmationFactory : : GetConfirmationParaEntrada ( InpStrategyEntryType ) ) ;
strategy .Init ( InpStrategyTimeframeMidTf , InpStrategyTimeframeHTF , InpStrategyMaxEspera2ConfirmacionMidTf , InpStrategyDirectionType ) ;
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 . SetFibbo ( clrRed , InpStrategyFibboLevels , InpStrategyFibboColors , InpStrategyFibboChooseLevel ) , 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
2026-11-02 11:19:09 -05:00
, InpRmBalancePercentageToActivateTheRisk4 , InpRmPercentageToBeModified1 , InpRmPercentageToBeModified2 , InpRmPercentageToBeModified3 , InpRmPercentageToBeModified4
, to_modfied , to_apply ) ;
2026-11-01 22:12:14 -05:00
//--- 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 ) )
{
if ( CNewBarManager_IsNewBar ( g_new_bar_manager , idx_bar_controlerd1 ) )
{
CBasicEvents : : OnNewDay ( time_curr ) ;
2026-11-02 15:25:32 -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 15:25:32 -05:00
{
2026-11-01 22:12:14 -05:00
CBasicEvents : : OnNewWeek ( time_curr ) ;
2026-11-02 15:25:32 -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 15:25:32 -05:00
{
2026-11-01 22:12:14 -05:00
CBasicEvents : : OnNewMonth ( time_curr ) ;
2026-11-02 15:25:32 -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 15:25:32 -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 15:25:32 -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 15:25:32 -05:00
risk . CloseAllPositions ( ) ;
2026-11-01 22:12:14 -05:00
Remover ( ) ;
}
}
else
if ( g_loss_profit_manager . MaxProfitIsSuperated ( ) )
{
2026-11-02 15:25:32 -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 15:25:32 -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 " ) ;
}
}
}
//---
2026-11-02 11:19:09 -05:00
if ( CNewBarManager_IsNewBarM1 ( g_new_bar_manager ) ) // Siempre corre
2026-11-01 22:12:14 -05:00
{
ICTGen_FuncionOnBarM1 ( NewDay , time_curr ) ;
g_confirmation_htf . OnNewBarM1 ( ) ; // M1
g_zz . OnNewBar ( ) ; // Se controla auto
2026-11-02 11:19:09 -05:00
//---
const bool new_bar = CNewBarManager_IsNewBar ( g_new_bar_manager , idx_controler_curr ) ;
if ( new_bar ) // A cada vela del grafico actual
2026-11-01 22:12:14 -05:00
g_confirmation_htf . Execute ( ) ;
2026-11-02 11:19:09 -05:00
//---
if ( TSNMQLART_U_BEVENTS_MAN_NO_TRADE_NOW ( g_trade_flags ) )
return ;
//--- sesion operativoa
2026-11-01 22:12:14 -05:00
g_session_operativa . OnNewBarM1 ( ) ;
2026-11-02 11:19:09 -05:00
//--- estrategia solo en cada barra
if ( new_bar )
2026-11-01 22:12:14 -05:00
strategy . OnNewBar ( time_curr ) ;
}
}
//+------------------------------------------------------------------+
//| TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction & trans ,
const MqlTradeRequest & request ,
const MqlTradeResult & result )
{
//---
TSN : : account_status . OnTradeTransactionEvent ( trans ) ;
}
//+------------------------------------------------------------------+