//+------------------------------------------------------------------+ //| SymbolIct.mqh | //| Copyright 2026, Niquel Mendoza. | //| https://www.mql5.com/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2026, Niquel Mendoza." #property link "https://www.mql5.com/" #property strict #ifndef ICT_LIBRARY_BASE_CLASSDEF_MQH #define ICT_LIBRARY_BASE_CLASSDEF_MQH //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #include "Defines.mqh" //+------------------------------------------------------------------+ //| Clase base para manejar simbolos | //+------------------------------------------------------------------+ class CIctSymbol final { private: int16_t obj_count; public: CIctSymbol(const string& symb); ~CIctSymbol() {} //--- const string symbol; MqlTick _tick; const double point_value; const int8_t _digits; //--- __forceinline void GetTick(MqlTick& tick) const; datetime tick_time; // Hora de la última actualización de precios double tick_bid; // Precio actual Bid double tick_ask; // Precio actual Ask double tick_last; // Precio actual de la última transacción (Last) ulong tick_volume; // Volumen para el precio actual Last long tick_time_msc; // Hora de la última actualización de los precios en milisegundos uint tick_flags; // Banderas de los tics //--- Actulizacion data void UpdateTick(); inline void IncrementCoount() { obj_count++; } inline void DecrementCoount() { obj_count--; } //--- Utilidades inline double DistanceToPointDouble(double distance) const { return distance / point_value; } inline long DistanceToPointLong(double distance) const { return long(::MathRound(distance / point_value)); } //--- Getters inline int GetCounter() const { return obj_count; } __forceinline bool IsPriceEqual(const double v1, const double v2) const { return fabs(v1 - v2) < this.point_value; } //--- Operadores bool operator==(const CIctSymbol &other) const { return this.symbol == other.symbol; } bool operator==(const CIctSymbol* other) const { return other == NULL ? false : this.symbol == other.symbol; } }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ CIctSymbol::CIctSymbol(const string& symb) : symbol(symb), point_value(::SymbolInfoDouble(symb, SYMBOL_POINT)), _digits((int8_t)::SymbolInfoInteger(this.symbol, SYMBOL_DIGITS)) { } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CIctSymbol::UpdateTick(void) { ::SymbolInfoTick(this.symbol, this._tick); this.tick_ask = _tick.ask; this.tick_bid = _tick.bid; this.tick_flags = _tick.flags; this.tick_last = _tick.last; this.tick_time = _tick.time; this.tick_time_msc = _tick.time_msc; this.tick_volume = _tick.volume; } //+------------------------------------------------------------------+ __forceinline void CIctSymbol::GetTick(MqlTick &tick) const { tick = _tick; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ interface IHandlerAddBlock { inline bool Add(Bloques &new_bloque, const ENUM_ORDERBLOCKS_TYPE type); inline bool ShowObjects() const; }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ struct IctLibBloqueInitConfig { //--- Nombres y tooltips string name_bull_toltip; string name_bear_toltip; string name_bull_toltip_50; string name_bear_toltip_50; string bull_code; string bear_code; //--- string obj_code; //--- IHandlerAddBlock* handler; CIctSymbol* symbol_info; //--- int handle; //--- Datos de dibujado //-- Bloques color clr_bloque_alcista; color clr_bloque_bajista; ENUM_LINE_STYLE style_block; int width; //-- Linea ENUM_LINE_STYLE line_style_mitad; int width_line_mitad; color clr_mitad_bloque_alcista; color clr_mitad_bloque_bajista; //--- bool mostrar_la_mitad; bool fill; }; //--- class IIctLibCustomBlock : public CLoggerBase { protected: //--- string m_obj_code; //--- Nombres y tooltips string m_name_bull_toltip; string m_name_bear_toltip; string m_name_bull_toltip_50; string m_name_bear_toltip_50; string m_bull_code; string m_bear_code; //--- IHandlerAddBlock* m_handler; CIctSymbol* m_symbol_info; //--- int m_handle; //--- Datos de dibujado //-- Bloques color m_clr_bloque_alcista; color m_clr_bloque_bajista; ENUM_LINE_STYLE m_style_block; bool m_fill; int m_width; //-- Linea bool m_mostrar_la_mitad; ENUM_LINE_STYLE m_line_style_mitad; int m_width_line_mitad; color m_clr_mitad_bloque_alcista; color m_clr_mitad_bloque_bajista; public: IIctLibCustomBlock() {} ~IIctLibCustomBlock() { if(CheckPointer(m_handler) == POINTER_DYNAMIC) delete m_handler;} //--- virtual void OnSummary() const {} // Cunado se llama a Summary virtual void OnChangeTimeframe(const ENUM_TIMEFRAMES new_timeframe) { } // Cuando se llama a ChangeTimeframe virtual void OnChangeDespuesChartId() {} // Cuando se cambia de grafico (llamar a las funciones espciales para saber el nuevo subwin o chart_id) virtual void Init(const IctLibBloqueInitConfig& config) = 0; virtual void OnDeleteAll() {} virtual void OnGetBlocks(bool& prev_data_calculated, const datetime extra_time, const bool show_concepts) = 0; //--- virtual inline int Id() const = 0; // Id para distinguir de otros bloques custom virtual inline bool UpdateConcepts() const = 0; // Actuliza los conceptos (rectangulos) virtual inline uint8_t ModifyFlags() const = 0; // Banderas de modificacion }; #endif // ICT_LIBRARY_BASE_CLASSDEF_MQH //+------------------------------------------------------------------+