ICTLibraryEasy/Examples/TTrades/EasySb/Ea.mq5
2025-12-05 12:17:19 -05:00

383 lines
37 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?
sinput group ""
sinput group "-------| Strategy |-------"
input ENUM_VERBOSE_LOG_LEVEL InpStrategyLogLevel = VERBOSE_LOG_LEVEL_CAUTION; // Strategy log level
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 ENUM_LOTE_TYPE InpRmLoteType = Dinamico; //Lote Type:
input double InpRmLote = 0.1; //Lot size (only for fixed lot)
input ENUM_MODE_RISK_MANAGEMENT InpRmRiskMode = risk_mode_personal_account; //type of risk management mode
input ENUM_GET_LOT InpRmGetMode = 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 ENUM_RISK_CALCULATION_MODE InpRmModeCalculationMl = percentage; //Mode calculation Max Loss
input ENUM_APPLIED_PERCENTAGES InpRmAppliedPercentagesMl = 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 ENUM_RISK_CALCULATION_MODE InpRmModeCalculationMwl = percentage; //Mode calculation Max weekly Loss
input ENUM_APPLIED_PERCENTAGES InpRmAppliedPercentagesMwl = 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 ENUM_RISK_CALCULATION_MODE InpRmModeCalculationMdl = percentage; //Mode calculation Max daily loss
input ENUM_APPLIED_PERCENTAGES InpRmAppliedPercentagesMdl = Balance;//MDL percentage applies to:
sinput group "- GMLPO/Gross maximum loss per CanTradetion/Percentage to risk per CanTradetion -"
input ENUM_OF_DYNAMIC_MODES_OF_GMLPO InpRmModeGmlpo = NO_DYNAMIC_GMLPO; //Select GMLPO mode:
input double InpRmPercentageOrMoneyGmlpo = 2.0; //percentage or money (0 => not used GMLPO)
input ENUM_RISK_CALCULATION_MODE InpRmModeCalculationGmlpo = percentage; //Mode calculation Max Loss per CanTradetion
input ENUM_APPLIED_PERCENTAGES InpRmAppliedPercentagesGmlpo = 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 ENUM_RISK_CALCULATION_MODE InpRmModeCalculationMdp = percentage; //Mode calculation Max Daily Profit
input ENUM_APPLIED_PERCENTAGES InpRmAppliedPercentagesMdp = Balance;//MDP percentage applies to:
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;
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 ENUM_MODE_DIFF mode_min_diff_fvg = 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 "-------| Bos/ChoCh |-------"
input MODE_BUSQUEDA_SWING mode_swings_bos_choch = MODE_SWING_STRICT; //Swing find mode
input int16_t lenth_bos_choch = 2; //High and low swing (number of candles)
input color clr_Bos = C'99,148,148'; // choose the color of the bullish bos (line and text)
input color clr_Choch = C'99,148,148'; // choose the color of the bullish Choch (line and text)
input color clr_Choch_2 = C'233,116,116'; // choose the color of the bearish bos (line and text)
input color clr_Bos_2 = C'233,116,116'; // choose the color of the bearish Choch (line and text)
input int max_espera_bos_choch = 30; //Choose the maximum wait for the bos and choch (in bars)
input ENUM_LINE_STYLE line_style_bos_choch = STYLE_DOT; // Choch and Bos Line Style
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CEstrategia strategy(InpMagic, _Symbol, _Period, 0, 0, InpStrategyMaxDeviationOrders);
CBarControlerFast controler_w1(PERIOD_W1, _Symbol);
CBarControlerFast controler_curr(_Period, _Symbol);
CBarControlerFast bar_controlerd1(PERIOD_D1, _Symbol);
CBarControlerFast bar_mn1(PERIOD_MN1, _Symbol);
bool NewDay = false;
bool CanTrade = true;
const CLossProfitManager* g_loss_profit_manager;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Atr
int pos_atr = ICTAtr_Create(_Period, _Symbol, 14, true);
CAtr* atr_h = ICTAtr_GetAtrPointer(pos_atr);
//---
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);
}
//--- BosChoch
g_bos_choch.Create(_Symbol, _Period);
g_bos_choch.SetGrapich(clr_Choch, clr_Bos, clr_Choch_2, clr_Bos_2, line_style_bos_choch);
g_bos_choch.Init(lenth_bos_choch, clrRed, clrBlue, "Arial", 8, false, max_espera_bos_choch, mode_swings_bos_choch, false, 500);
//--- Sesion operativa
g_sesion.Create(_Symbol, _Period, 0, 0, true, true, InpOperativeSessionStartHour, InpOperativeSessionStartMinute, InpOperativeSessionEndHour, InpOperativeSessionEndMinute,
InpOperativeSessionName);
g_sesion.SetExtra(InpOperativeSessionLineColor, InpOperativeSessionLineColor, STYLE_SOLID, 1, InpOperativeSessionDrawStyle);
g_sesion.SetGrapichStyles(STYLE_SOLID, InpOperativeSessionRectColor, 1, true);
//---
g_fvg.Create(_Symbol, _Period);
g_fvg.Set(500, obtencion_type_fvg, style_draw_fvg, CreateDiffInstance(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);
//--- Estrategia
CAtrUltraOptimized* atr_ultra = new CAtrUltraOptimized();
atr_ultra.SetVariables(PERIOD_CURRENT, _Symbol, 0, 14);
atr_ultra.SetInternalPointer();
strategy.AddLogFlags(InpStrategyLogLevel);
strategy.SetAtrTP_SL(atr_ultra, InpStrategyAtrMultiplierTp, InpStrategyAtrMultiplierSl);
strategy.SetOperateMode(TR_BUY_SELL, InpStrategyTypeTpSl);
strategy.SetTP_SL(InpStrategySlPoint, InpStrategyTpPoint);
account_status.AddItemFast(&strategy);
if(InpRmLoteType == Fijo)
strategy.FixedLotSize(InpRmLote);
//--- Risk management
CRiskPointer* manager = new CRiskPointer(InpMagic, InpRmGetMode);
manager.SetPropirm(InpRmPropFirmBalance);
risk = manager.GetRiskPointer(InpRmRiskMode);
risk.AddLogFlags(InpRmLogLevel);
risk.SetLote(CreateLotePtr(_Symbol));
// We set the parameters
string to_apply = InpRmStrPercentagesToApply, to_modfied = InpRmStrPercentagesToBeReviewed;
if(InpRmModeGmlpo == DYNAMIC_GMLPO_FIXED_PARAMETERS)
SetDynamicUsingFixedParameters(InpRmBalancePercentageToActivateTheRisk1, InpRmBalancePercentageToActivateTheRisk2, InpRmBalancePercentageToActivateTheRisk3
, InpRmBalancePercentageToActivateTheRisk4, InpRmPercentageToBeModified1, InpRmPercentageToBeModified2, InpRmPercentageToBeModified3, InpRmPercentageToBeModified4
, to_modfied, to_apply);
risk.AddLoss(InpRmPercentageOrMoneyMdl, InpRmAppliedPercentagesMdl, InpRmModeCalculationMdl, LP_MDL, true);
risk.AddLoss(InpRmPercentageOrMoneyGmlpo, InpRmAppliedPercentagesGmlpo, InpRmModeCalculationGmlpo, LP_GMLPO, true, (InpRmModeGmlpo != NO_DYNAMIC_GMLPO), to_modfied, to_apply);
risk.AddLoss(InpRmPercentageOrMoneyMl, InpRmAppliedPercentagesMl, InpRmModeCalculationMl, LP_ML, true);
risk.AddLoss(InpRmPercentageOrMoneyMwl, InpRmAppliedPercentagesMwl, InpRmModeCalculationMwl, LP_MWL, true);
risk.AddProfit(InpRmPercentageOrMoneyMdp, InpRmAppliedPercentagesMdp, InpRmModeCalculationMdp, LP_MDP, InpRmMdpIsStrict);
risk.EndAddProfitLoss(); // Execute this every time we finish setting the maximum losses and profits
g_loss_profit_manager = risk.GetLossProfitManager();
// We finish by adding it
account_status.AddItemFast(risk);
// We delete the temporary pointer
delete manager;
//--- We initialize the account
account_status.AddLogFlagTicket(InpAccountStatusLogLevel);
account_status.AddLogFlags(InpAccountStatusLogLevel);
account_status.OnInitEvent();
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
ICTGen_OnDeinitEvent();
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
const datetime time_curr = TimeCurrent();
NewDay = false;
//--- Bloque 1 | Control diario
if(bar_controlerd1.IsNewBar(time_curr))
{
account_status.OnNewDay();
//---
if(controler_w1.IsNewBar(time_curr)) //Limpiar para no acomular mucha memoria (YA SEH HACE INTERNAMENTER)
{
account_status.OnNewWeek();
//--- Nuevo mes, eliminacion de liquidez
if(bar_mn1.IsNewBar(time_curr))
account_status.OnNewMonth();
}
CanTrade = true;
NewDay = true;
}
//---
if(account_status_positions_open)
{
CAccountStatus_OnTickEvent
if(CanTrade)
{
if(g_loss_profit_manager.MaxLossIsSuperated())
{
const ENUM_TYPE_LOSS_PROFIT type = g_loss_profit_manager.GetLastLossSuperatedType();
if(type == LP_ML)
{
if(InpRmRiskMode == risk_mode_propfirm_dynamic_daiy_loss)
{
Print("The expert advisor lost the funding test");
}
else
{
Print("Maximum loss exceeded now");
}
//---
Remover();
}
else
if(type == LP_MDL)
{
Print("Maximum daily loss exceeded now");
}
//---
strategy.OnInterupcion();
risk.CloseAllPositions();
CanTrade = false;
}
else
if(g_loss_profit_manager.MaxProfitIsSuperated())
{
if(g_loss_profit_manager.GetLastProfitSuperatedType() != LP_MDP)
return;
//---
strategy.OnInterupcion();
risk.CloseAllPositions();
Print("Excellent Maximum daily profit achieved");
CanTrade = false;
}
}
}
//--- Bloque 2 | Verifiacion
if(!CanTrade) // Si se superaron los limites de MDL, o MDP enotnces no CanTrader
return;
const bool nueva_vela = controler_curr.IsNewBar(time_curr);
//--- 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)
ICTGen_FuncionOnTick(NewDay, time_curr);
if(nueva_vela)
ICTGen_FuncionOnBar(NewDay, time_curr); //Atencion siempre FuncionOnBar primero
// 2do deben de ir ya las llanadas a OnTickEvent o OnNewBar de los conceptos
// Respentando siempre que primero se llama a OnNewBar o Ontick y ya luego se tulizan las funciones getter como oibtener la sesion acutal y eso
g_sesion.OnTickEvent();
if(nueva_vela)
{
//---
g_fvg.OnNewBar();
g_bos_choch.OnNewBarSimple();
//---
strategy.OnNewBar(time_curr);
ICTGen_FuncionOnEndBar();
}
}
//+------------------------------------------------------------------+
//| TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction & trans,
const MqlTradeRequest & request,
const MqlTradeResult & result)
{
//---
account_status.OnTradeTransactionEvent(trans);
}
//+------------------------------------------------------------------+