GrapichsByLeo/Examples/SymbolChange/Main.mqh
2025-10-17 06:49:12 -05:00

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