//+------------------------------------------------------------------+ //| SymbolsChange.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 //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #include "..\\..\\Histogram\\Main.mqh" //--- #define HIST_SYMBOL_CHANGE_DAILY 0 #define HIST_SYMBOL_CHANGE_WEEKLY 1 #define HIST_SYMBOL_CHANGE_MONTHLY 2 //--- #define HIST_SYMBOL_DATA_BULL 0xFF00CA00 #define HIST_SYMBOL_DATA_BEAR 0xFFCA0000 #define HIST_SYMBOL_DATA_NO_CHANGE 0xFF5B5B5B //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CSymbolChange { private: string m_symbol; double m_bid; double m_prev_bid; double m_open_mensual; double m_open_semanal; double m_open_diario; double m_change_mensual; double m_change_semanal; double m_change_diario; public: CSymbolChange(string symbol); ~CSymbolChange(void); //--- void OnNewDay(); bool Revise(); //--- __forceinline string Symbol() { return m_symbol; } __forceinline double MonthlyPercentChange() const { return m_change_mensual; } __forceinline double WeeklyPercentChange() const { return m_change_semanal; } __forceinline double DailyPercentChange() const { return m_change_diario;} }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ CSymbolChange::CSymbolChange(string symbol) : m_prev_bid(0.00) { m_symbol = symbol; } //+------------------------------------------------------------------+ CSymbolChange::~CSymbolChange(void) { } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CSymbolChange::OnNewDay(void) { m_open_mensual = ::iOpen(m_symbol, PERIOD_MN1, 0); m_open_diario = ::iOpen(m_symbol, PERIOD_D1, 0); m_open_semanal = ::iOpen(m_symbol, PERIOD_W1, 0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool CSymbolChange::Revise() { m_bid = ::SymbolInfoDouble(m_symbol, SYMBOL_BID); if(m_bid == m_prev_bid) return false; m_change_mensual = ((m_bid - m_open_mensual) / m_open_mensual) * 100.0; m_change_diario = ((m_bid - m_open_diario) / m_open_diario) * 100.0; m_change_semanal = ((m_bid - m_open_semanal) / m_open_semanal) * 100.0; m_prev_bid = m_bid; return true; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CHistSymbolData { private: CHistogramHorizontal* m_hist; CSymbolChange* m_symbols_arr[]; int m_symbols_arr_size; CBarControlerFast* m_bar_controler_d1; static uint ValueToClr(double value); public: CHistSymbolData(); void Init(string symbols_str); void Execute(int update_per_segund); void Finalize(); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ CHistSymbolData::CHistSymbolData(void) : m_symbols_arr_size(0), m_hist(NULL) { ArrayResize(m_symbols_arr, 0); m_bar_controler_d1 = new CBarControlerFast(PERIOD_D1, "EURUSD"); // Usar de un simbolo que se reinica m_bar_controler_d1.IsNewBar(TimeTradeServer()); // Iniciamos } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CHistSymbolData::Init(string symbols_str) { string arr[]; m_symbols_arr_size = ::StringSplit(symbols_str, '|', arr); ::ArrayResize(m_symbols_arr, m_symbols_arr_size); for(int i = 0; i < m_symbols_arr_size; i++) { arr[i].TrimLeft(); arr[i].TrimRight(); Print(arr[i]); CSymbolChange* new_s = new CSymbolChange(arr[i]); //--- m_symbols_arr[i] = new_s; } //--- m_hist = new CHistogramHorizontal(); const int width = 800; const int height = 500; m_hist.Initialize(width, height, "objhistogram", 0, 0, TRGB(0xFF, clrWhite)); m_hist.CreateBitmapLabel(50, 50, COLOR_FORMAT_ARGB_RAW); m_hist.TituloDefault("Comparacion de cambios", 40); m_hist.CreateCopyrightDefault("Leo"); //--- const uint clr_black = TRGB(0xFF, clrBlack); m_hist.NumConjuntoBars(m_symbols_arr_size, 3); for(int i = 0; i < m_symbols_arr_size; i++) { //--- m_symbols_arr[i].OnNewDay(); m_symbols_arr[i].Revise(); //--- m_hist.ReadIndex(i); m_hist.BarConjuntoSet(m_symbols_arr[i].Symbol(), clr_black, 10, "Arial", HISTOGRAM_TEXT_MODE_CENTER, 10, HIST_DRAW_RECT_FILL); //--- Valores const double dchange = m_symbols_arr[i].DailyPercentChange(); const uint dcolor = ValueToClr(dchange); const double wchange = m_symbols_arr[i].WeeklyPercentChange(); const uint wcolor = ValueToClr(wchange); const double mchange = m_symbols_arr[i].MonthlyPercentChange(); const uint mcolor = ValueToClr(mchange); //--- Daily m_hist.AddBarToConjuntoBarFast(dchange, dcolor); //--- Weekly m_hist.AddBarToConjuntoBarFast(wchange, wcolor); //--- Monthly m_hist.AddBarToConjuntoBarFast(mchange, mcolor); } //--- int x1 = 100; int x2 = width - 100; int y1 = m_hist.TituloGetPointer().ReserveY(); int y2 = height - 100; m_hist.InitLienzoBarras(x1, y1, x2, y2, 5, 5, 10, 0.00); //--- m_hist.CreateEjeLine(HIST_LINE_MODE_IZQUIERDA, clr_black, clr_black, 10, 7, 7, 2, 11, "Arial"); m_hist.EjeLineGetPointer().HistogramLinePointerGet().CreateTitulo("% Change", clr_black, 15, 15, "Arial"); m_hist.EjeLineGetPointer().CreateTituloEje2(25, "Simbolos", clr_black, 14, "Arial"); //--- m_hist.Redraw(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ static uint CHistSymbolData::ValueToClr(double value) { if(value > 0.00) { return HIST_SYMBOL_DATA_BULL; } else if(value < 0.00) { return HIST_SYMBOL_DATA_BEAR; } return HIST_SYMBOL_DATA_NO_CHANGE; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CHistSymbolData::Execute(int update_per_segund) { //--- const int ms = 1000 / update_per_segund; //--- Ejecucion de nuevo dia const datetime time_curr = TimeTradeServer(); if(m_bar_controler_d1.IsNewBar(time_curr)) { for(int i = 0; i < m_symbols_arr_size; i++) { m_symbols_arr[i].OnNewDay(); } } //--- while(!IsStopped()) { for(int i = 0; i < m_symbols_arr_size; i++) { if(m_symbols_arr[i].Revise()) { m_hist.ReadIndex(i); //--- const double dchange = m_symbols_arr[i].DailyPercentChange(); const uint dcolor = ValueToClr(dchange); const double wchange = m_symbols_arr[i].WeeklyPercentChange(); const uint wcolor = ValueToClr(wchange); const double mchange = m_symbols_arr[i].MonthlyPercentChange(); const uint mcolor = ValueToClr(mchange); //--- Daily m_hist.BarValue(HIST_SYMBOL_CHANGE_DAILY, dchange); if(dcolor != m_hist.BarColor(HIST_SYMBOL_CHANGE_DAILY)) // Only change color if prev value is not equal at new value m_hist.BarColor(HIST_SYMBOL_CHANGE_DAILY, dcolor); //--- Weekly m_hist.BarValue(HIST_SYMBOL_CHANGE_WEEKLY, wchange); if(wcolor != m_hist.BarColor(HIST_SYMBOL_CHANGE_WEEKLY)) // Only change color if prev value is not equal at new value m_hist.BarColor(HIST_SYMBOL_CHANGE_WEEKLY, wcolor); //--- Monthly m_hist.BarValue(HIST_SYMBOL_CHANGE_MONTHLY, mchange); if(mcolor != m_hist.BarColor(HIST_SYMBOL_CHANGE_MONTHLY)) // Only change color if prev value is not equal at new value m_hist.BarColor(HIST_SYMBOL_CHANGE_MONTHLY, mcolor); } } m_hist.Redraw(); Sleep(ms); } Finalize(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CHistSymbolData::Finalize(void) { delete m_hist; delete m_bar_controler_d1; for(int i = 0; i < m_symbols_arr_size; i++) { delete m_symbols_arr[i]; } } //+------------------------------------------------------------------+