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];
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								 }
							 | 
						||
| 
								 | 
							
								//+------------------------------------------------------------------+
							 |