derivato da nique_372/GrapichsByLeo
297 righe
9,7 KiB
MQL5
297 righe
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];
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|