297 lines
		
	
	
	
		
			9.7 KiB
		
	
	
	
		
			MQL5
		
	
	
	
	
	
			
		
		
	
	
			297 lines
		
	
	
	
		
			9.7 KiB
		
	
	
	
		
			MQL5
		
	
	
	
	
	
//+------------------------------------------------------------------+
 | 
						|
//|                                                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];
 | 
						|
   }
 | 
						|
 }
 | 
						|
//+------------------------------------------------------------------+
 |