ICTLibraryExamples/Sensei/Est2023/Ea.mq5
Nique_372 Nique_372 3fd17f5686
2026-11-06 15:35:47 -05:00
551 Zeilen
28 KiB
MQL5
//+------------------------------------------------------------------+
//| 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?
input bool InpDrawObjects = true; // Draw objects
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;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CEstrategia strategy(InpMagic, _Symbol, InpDrawObjects, _Period, 0, 0, InpStrategyMaxDeviationOrders);
//---
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;
uint g_trade_flags = 0;
//+------------------------------------------------------------------+
//| 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
g_session_operativa.Create(_Symbol, _Period, 0, 0, InpDrawObjects, true, InpOperativeSessionStartHour, InpOperativeSessionStartMinute, InpOperativeSessionEndHour, InpOperativeSessionEndMinute,
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();
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");
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();
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");
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();
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");
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
g_fvg.Create(_Symbol, _Period, 0, 0, InpDrawObjects);
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
g_ob.Create(_Symbol, _Period, 0, 0, InpDrawObjects);
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);
g_zz.Create(_Symbol, InpStrategyTimeframeMidTf, 0, 0, InpDrawObjects, params);
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
{
//--- Strategy (fibbo)
TSNSTD_TRY_EF(strategy.SetFibbo(clrRed, InpStrategyFibboLevels, InpStrategyFibboColors, InpStrategyFibboChooseLevel), true,
TSN::CErrorTrace::FormatTrace(_what))
//--- Risk management
TSN::CRiskManagementCreator manager;
manager.SetPropirm(InpRmPropFirmBalance);
//---
TSN::MQLArtRMCreatorRes result = manager.GetRiskPointer(InpRmRiskMode, InpMagic, InpRmGetMode);
TSNSTD_TRY_EF(result.ok, true,
TSN::CErrorTrace::FormatTrace(_what))
//---
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;
//---
TSNSTD_TRY_N_EF(_err, true, TSN::CErrorTrace::FormatTrace(_what))
}
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);
TSNMQLART_U_BEVENTS_MAN_REM_F(g_trade_flags, BASICEVENT_REG_FLAG_ON_NEW_DAY);
//--- Nueva semana
if(CNewBarManager_IsNewBar(g_new_bar_manager, idx_controler_w1))
{
CBasicEvents::OnNewWeek(time_curr);
TSNMQLART_U_BEVENTS_MAN_REM_F(g_trade_flags, BASICEVENT_REG_FLAG_ON_NEW_WEEK);
}
//--- Nuevo mes
if(CNewBarManager_IsNewBar(g_new_bar_manager, idx_bar_mn1))
{
CBasicEvents::OnNewMonth(time_curr);
// 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);
}
//---
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
if(TSNMQLART_U_BEVENTS_MAN_TRADE_NOW(g_trade_flags))
{
if(g_loss_profit_manager.MaxLossIsSuperated())
{
const int type = g_loss_profit_manager.GetLastLossSuperatedType();
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)
{
if(InpRmRiskMode == TSN::risk_mode_propfirm_dynamic_daiy_loss)
Print("The expert advisor lost the funding test");
else
Print("Maximum loss exceeded now");
//---
risk.CloseAllPositions();
Remover();
}
}
else
if(g_loss_profit_manager.MaxProfitIsSuperated())
{
// 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.
risk.CloseAllPositions();
TSNMQLART_U_BEVENTS_MAN_ADD_F(g_trade_flags, BASICEVENT_REG_FLAG_ON_NEW_DAY);
Print("Excellent Maximum daily profit achieved");
}
}
}
//---
if(CNewBarManager_IsNewBarM1(g_new_bar_manager)) // Siempre corre
{
ICTGen_FuncionOnBarM1(NewDay, time_curr);
g_confirmation_htf.OnNewBarM1(); // M1
g_zz.OnNewBar(); // Se controla auto
//---
const bool new_bar = CNewBarManager_IsNewBar(g_new_bar_manager, idx_controler_curr);
if(new_bar) // A cada vela del grafico actual
g_confirmation_htf.Execute();
//---
if(TSNMQLART_U_BEVENTS_MAN_NO_TRADE_NOW(g_trade_flags))
return;
//--- sesion operativoa
g_session_operativa.OnNewBarM1();
//--- estrategia solo en cada barra
if(new_bar)
strategy.OnNewBar(time_curr);
}
}
//+------------------------------------------------------------------+
//| TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction & trans,
const MqlTradeRequest & request,
const MqlTradeResult & result)
{
//---
TSN::account_status.OnTradeTransactionEvent(trans);
}
//+------------------------------------------------------------------+