//+------------------------------------------------------------------+ //| Data.mqh | //| 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 strict #ifndef ICTLIBRARYEASY_SRC_BASE_DATA_MQH #define ICTLIBRARYEASY_SRC_BASE_DATA_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; } //+------------------------------------------------------------------+ #endif // ICTLIBRARYEASY_SRC_BASE_DATA_MQH