GrapichsByLeo/Histogram/Barra/Default/Base.mqh
2025-10-16 21:01:22 -05:00

709 lines
53 KiB
MQL5

//+------------------------------------------------------------------+
//| Base.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
#ifndef HISTOGRAM_BARRAS_BASE_BY_LEO_MQH
#define HISTOGRAM_BARRAS_BASE_BY_LEO_MQH
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
#include "..\\Defines.mqh"
#include "..\\Texto.mqh"
// Estilo agresivo, no se hacen comprobaciones.. para maxima velocidad.. a tener cuidado con todas las funciones
// Notas:
// - para horizontal_ m_barras_y1_init nunca es el comienzo se le agrega un gap de 1 para respoectar linea de corte
// Clase base para barras normales con fill
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class CHistogramConjuntoNor : public CLoggerBase
{
protected:
//--- Barras de un conjutno
HistogramBar m_barras[]; // Barras que representan el conjunto
ENUM_HIST_DRAW_RECT_STYLE m_barras_style_draw_rect;
HistFunctionDrawRect m_function_draw_rect; // Funcion para dibujar las barras
int m_barras_size; // Tamaño de barras
int m_barras_reserve; // Reserva de barras
int m_barras_x1_init; // Y1 inicial para barras
int m_barras_y1_init; // X1 inciial para barras
int m_barras_gap_eje; // Gap para el eje (solo se usa con corte)
bool m_init;
//--- Variables cacheadas con el maximo y minimo valor
double m_max_value;
double m_min_value;
//--- Puntero a canvas del CHistogram
CCanvasCustom* m_canvas;
//--- Funcion para convertir valor a pixel (setean externamente)
HistogramFuncionCalculatePixel m_function_calc_pixel;
double m_fpos;
double m_fneg;
double m_fcort;
//--- Espacio disponible
int m_barras_ancho_total; // Ancho en pixeles sumando todas las barras
int m_barras_ancho_unico; // Ancho de cada barra
//--- Texto
HistogramFuncionCalcTextCordinates m_label_function;
HistogramBarLabel m_label;
int m_label_gap_by_eje; // Gap del eje
//--- Variables controladas externamente no de la clase
double m_value_for_ancho;
uint m_clean_color;
//--- Function que se ejeucta cada vez que se cambia el tamaño de barras (numero de barras)
virtual void OnBarrasResize() = 0; // Funcion se que sejeucta cada vez que cambia el max_ancho
virtual void ResizeBarra(HistogramBar& barra) = 0; // Funcion para aumentar el "size"
virtual void RecalculeBarCordinates() = 0; // Recalcula las cordenadas de las barras
virtual void CalculeTextCordinates() = 0; // Calcula las cordenas del texto
virtual void OnNewValuesPosNegCorte() = 0;
//---
void SetFunctionCalcText();
public:
//--- Constructor
CHistogramConjuntoNor();
//--- Set general
// Esta funcion setea los valores generales de la clase
void Set(CCanvasCustom* c, string label, uint txt_clr, ENUM_HISTOGRAM_TEXT_MODE txt_mode, int txt_font_size, string txt_font, int label_gap_eje, ENUM_HIST_DRAW_RECT_STYLE initial_style);
// Inicializa la clase
void Init(HistogramFuncionCalculatePixel fcalc, int x1_in, int y1_in, int size_corte, int barras_ancho_max, double fpos, double fneg, double fcort); // Inicializa
//--- Recalculo
//- Funcion que se ejeucta cada vez que se "ropme" un maximo o minimo como para cambiars los "size" de las barras
void SetNewsValues(int gap_corte, double fpos, double fneg, double fcort);
//- Funcion que se ejecuta cuando se cambia x1, y1, sizebarras
void SetNewsCordenadasAndSize(int x1, int y1, int barras_ancho);
//- Recalcula las cordenas
// Como parametro se le da las cordenadas de un rectnauglo disponible para esta barra
// Lo que hace es recaclular las cordendas de los rectangulos y el texto
void SetNewCordenadas(int x1, int y1);
//- Limpia las barras
// clean_color: color con el que se limpiaran las abrras usualente color d efondo
// redraw: bandera que indica si se redibujara (si es false solo se camiba los pixeles pero la imagen "externa" no)
void CleanBarras(bool free_array, bool redraw = false);
//--- Recalculo
__forceinline void RecalculeCordinates(); // Recalcula todas las cordenas TEXTO Y BARRAS
__forceinline void RecalculeCordinatesOnlyBars(); // Actuliza el ancho y reclaucla cordendas
//- Destruccion
// Funcion que se llama luego de eliminar el objeto (solo si se limina dinamicamente)
void Destroy();
//--- Setter y Getters generales
//- Reserve
__forceinline int ReserveBarras() const { return m_barras_reserve; }
inline void ReserveBarras(int size);
//- Tamaño
__forceinline int SizeBarras() const { return m_barras_size; }
//- Tamaño en pixeles ocupado por todo el conjunto
// Getter
__forceinline int SizeBarrasInPixels() const { return m_barras_ancho_total;}
// Settet
void SizeBarrasInPixels(const int new_max_ancho);
//- Tamaño en pixeles ocupado por cada barra
__forceinline int SizeBarra() const { return m_barras_ancho_unico; }
//- Cordenas de inicio
__forceinline int XInicial() const { return m_barras_x1_init; }
__forceinline int YInicial() const { return m_barras_y1_init; }
//- Iniciado ?
__forceinline bool IsInit() const { return m_init; }
//- Color de limpieza
__forceinline uint CleanColor() const { return m_clean_color; }
inline void CleanColor(uint new_valuie) { m_clean_color = new_valuie; }
//--- Trabajo con barras
// update_data, unicamente actuliza pixeles NO la imagen como tal para eso se debera de llamar a canvas.Update()
// false: cuando solo se busca añadir barras todavia no hacer el calculo de cordenadas
// true: una vez finalizado todo si es que se necesita añadir otra barra extra
//- Añadir
inline void AddBarraFast(double value, uint clr);
void AddBarra(double value, uint clr, bool update_data);
//- Remover
void RemoveBar(const int index, bool update_data);
//- Color
inline void BarColor(const int index, const uint new_value);
__forceinline uint BarColor(const int index) const { return m_barras[index].clr; }
//- Fondo?
__forceinline ENUM_HIST_DRAW_RECT_STYLE DrawRectStyle() const { return m_barras_style_draw_rect; }
void DrawRectStyle(const ENUM_HIST_DRAW_RECT_STYLE default_style, bool redraw_pixels_in_canvas);
void DrawRectStyle(HistFunctionDrawRect funtion_draw, ENUM_HIST_DRAW_RECT_STYLE style_type, bool redraw_pixels_in_canvas);
//- Valor
// El ultimo parametro update_max_min, se debera poner true luego de llamar inicalemntemente a setmaxmin
void BarValue(const int index, const double new_value, bool update_max_min, bool update_rect);
__forceinline double BarValue(const int index) const { return m_barras[index].value; }
__forceinline double BarMaxValue() const { return m_max_value; }
__forceinline double BarMinValue() const { return m_min_value; }
//- Maximio y minimo
// Recalcual el maixmo y minimo
void SetMaxAndMinValue();
//--- Texto del conjunto de barras
//- Setter general
inline void Text(const string& new_text, uint new_clr);
//- Valor
__forceinline string TextValue() const { return m_label.value;}
inline void TextValue(const string& new_text);
//- Color
__forceinline uint TextColor() const { return m_label.clr;}
inline void TextColor(const uint new_value);
inline void TextClean(); // Solo limpia los pixeles y si es necesario redibuja NO ELIMINA EL FONT NI NADA
//--- Redibuja
void Redraw(); // Redibuja
//--- Ancho
__forceinline double ValueForAncho() const { return m_value_for_ancho; }
inline void ValueForAncho(double v) { m_value_for_ancho = v; }
inline void ValueForAnchoReduce(double r) { m_value_for_ancho -= r; }
inline void ValueForAnchoAument(double a) { m_value_for_ancho += a; }
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CHistogramConjuntoNor::CHistogramConjuntoNor(void)
: m_barras_reserve(0), m_barras_size(0), m_canvas(NULL), m_barras_ancho_total(0),
m_barras_ancho_unico(0), m_fcort(0.00), m_fneg(0.00), m_fpos(0.00), m_function_calc_pixel(NULL), m_label_function(NULL),
m_barras_x1_init(0), m_barras_y1_init(0), m_init(false), m_barras_gap_eje(0), m_label_gap_by_eje(0)
{
//--- Valores por defecto para label
m_label.clr = clrBlack;
m_label.font = "Arial";
m_label.font_size = 5;
m_label.mode = WRONG_VALUE;
m_label.value = NULL;
m_label.x = 0;
m_label.y = 0;
//--- Resize inicial
ArrayResize(m_barras, 0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CHistogramConjuntoNor::Destroy()
{
//---
if(!m_init)
return;
//--- Limpiaza su parte en canvas
CleanBarras(true); // Limpiamos las barras
TextColor(); // Limpaimos el texto
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CHistogramConjuntoNor::CleanBarras(bool free_array, bool redraw = false)
{
for(int i = 0; i < m_barras_size; i++)
m_function_draw_rect(m_canvas, m_barras[i].x1, m_barras[i].y1, m_barras[i].x2, m_barras[i].y2, m_clean_color); // Limpiamos el espacio ocupado
//---
if(free_array)
{
ArrayResize(m_barras, 0, m_barras_reserve);
m_barras_size = 0;
}
//---
if(redraw)
m_canvas.Update();
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CHistogramConjuntoNor::ReserveBarras(int size)
{
m_barras_reserve = size;
m_barras.Reserve((uint)size);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
inline void CHistogramConjuntoNor::AddBarraFast(double value, uint clr)
{
HistogramBar new_bar(0, 0, 0, 0, value, clr);
ArrayResize(m_barras, m_barras_size + 1, m_barras_reserve);
m_barras[m_barras_size] = new_bar;
m_barras_size++;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CHistogramConjuntoNor::AddBarra(double value, uint clr, bool update_data)
{
HistogramBar new_bar(0, 0, 0, 0, value, clr);
ArrayResize(m_barras, m_barras_size + 1, m_barras_reserve);
m_barras[m_barras_size] = new_bar;
m_barras_size++;
//--- Solo recalcular si se pide ademas de que debe de estar iniciado
if(m_init && update_data)
{
//--- Recalculamos el ancho de cada barra
HISTOGRAM_CONJ_RECALCULE
//--- Recalculamso cordenadas con el nuevo ancho
RecalculeCordinatesOnlyBars();
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
// Esta funcion se ejecuta
void CHistogramConjuntoNor::Redraw()
{
m_canvas.Update();
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CHistogramConjuntoNor::RemoveBar(const int index, bool update_data)
{
//---
const int last = m_barras_size - 1;
//---
if(m_barras_size > 1)
{
// Si hay 2 barras o mas enotnces limpiamos la anteiro (si el index es mayor a 0, de lo contiroa limpiamos el siguiente 1)
int idx = (index == 0) ? 1 : (index - 1);
m_function_draw_rect(m_canvas, m_barras[idx].x1, m_barras[idx].y1, m_barras[idx].x2, m_barras[idx].y2, m_clean_color);
}
//---
m_function_draw_rect(m_canvas, m_barras[index].x1, m_barras[index].y1, m_barras[index].x2, m_barras[index].y2, m_clean_color);
//--- Eliminamos
for(int i = index; i < last; i++)
m_barras[i] = m_barras[i + 1];
//--- Resize
m_barras_size--;
ArrayResize(m_barras, m_barras_size, m_barras_reserve);
//---
if(update_data)
{
if(m_barras_size <= 0)
{
// Ya no hay barras no hace falta recalcular
return;
}
//--- Recalculamos el ancho de cada barra
HISTOGRAM_CONJ_RECALCULE
//--- Recalculamso cordenadas
OnBarrasResize(); // Redibujamos si es necesario
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
inline void CHistogramConjuntoNor::BarColor(const int index, const uint new_value)
{
m_barras[index].clr = new_value;
m_function_draw_rect(m_canvas, m_barras[index].x1, m_barras[index].y1, m_barras[index].x2, m_barras[index].y2, new_value);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CHistogramConjuntoNor::BarValue(const int index, const double new_value, bool update_max_min, bool update_rect)
{
if(update_max_min)
{
if(new_value > m_max_value)
m_max_value = new_value;
if(new_value < m_min_value)
m_min_value = new_value;
}
//--- Limpiamos valor anterior
m_function_draw_rect(m_canvas, m_barras[index].x1, m_barras[index].y1, m_barras[index].x2, m_barras[index].y2, m_clean_color);
//--- Actulizamos valor
m_barras[index].value = new_value;
//---
if(update_rect)
{
ResizeBarra(m_barras[index]);
m_function_draw_rect(m_canvas, m_barras[index].x1, m_barras[index].y1, m_barras[index].x2, m_barras[index].y2, m_barras[index].clr);
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CHistogramConjuntoNor::DrawRectStyle(const ENUM_HIST_DRAW_RECT_STYLE default_style, bool redraw_pixels_in_canvas)
{
//--- Reseteo
m_barras_style_draw_rect = default_style;
if(m_barras_style_draw_rect)
m_function_draw_rect = HistConjuntoDrawRectFunctions::HistDrawRectFill;
else
m_function_draw_rect = HistConjuntoDrawRectFunctions::HistDrawRectNoFill;
//--- Redibujamos
if(redraw_pixels_in_canvas)
for(int i = 0; i < m_barras_size; i++)
m_function_draw_rect(m_canvas, m_barras[i].x1, m_barras[i].y1, m_barras[i].x2, m_barras[i].y2, m_barras[i].clr);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CHistogramConjuntoNor::DrawRectStyle(HistFunctionDrawRect funtion_draw, ENUM_HIST_DRAW_RECT_STYLE style_type, bool redraw_pixels_in_canvas)
{
//--- Reseteo
m_barras_style_draw_rect = style_type;
m_function_draw_rect = funtion_draw;
//--- Redibujamos
if(redraw_pixels_in_canvas)
for(int i = 0; i < m_barras_size; i++)
m_function_draw_rect(m_canvas, m_barras[i].x1, m_barras[i].y1, m_barras[i].x2, m_barras[i].y2, m_barras[i].clr);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CHistogramConjuntoNor::SetMaxAndMinValue()
{
m_max_value = m_barras[0].value;
m_min_value = m_barras[0].value;
for(int i = 1; i < m_barras_size; i++)
{
const double v = m_barras[i].value;
if(v > m_max_value)
m_max_value = v;
if(v < m_min_value)
m_min_value = v;
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
inline void CHistogramConjuntoNor::Text(const string &new_text, uint new_clr)
{
m_label.clr = new_clr;
m_label.value = new_text;
//--- Cambiamos el texto
::TextSetFont(m_label.font, m_label.font_size);
m_canvas.TextOuTF(m_label.x, m_label.y, m_label.value, m_label.clr, m_label.mode);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
inline void CHistogramConjuntoNor::TextColor(const uint new_value)
{
m_label.clr = new_value;
//--- Cambiamos el texto
::TextSetFont(m_label.font, m_label.font_size);
m_canvas.TextOuTF(m_label.x, m_label.y, m_label.value, m_label.clr, m_label.mode);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
inline void CHistogramConjuntoNor::TextClean()
{
::TextSetFont(m_label.font, m_label.font_size);
m_canvas.TextOuTF(m_label.x, m_label.y, m_label.value, m_clean_color, m_label.mode);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
inline void CHistogramConjuntoNor::TextValue(const string &new_text)
{
//---
::TextSetFont(m_label.font, m_label.font_size);
//--- Limpiamoas el texto anterior
m_canvas.TextOuTF(m_label.x, m_label.y, m_label.value, m_clean_color, m_label.mode);
//--- Cambiamos el texto
m_label.value = new_text;
m_canvas.TextOuTF(m_label.x, m_label.y, m_label.value, m_label.clr, m_label.mode);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CHistogramConjuntoNor::SetFunctionCalcText(void)
{
switch(m_label.mode)
{
case HISTOGRAM_TEXT_MODE_CENTER:
m_label_function = HistogramFuncTxtCalc::HFCTextCenter;
break;
case HISTOGRAM_TEXT_MODE_LEFT_UPPER:
m_label_function = HistogramFuncTxtCalc::HFCTextLeftUpper;
break;
case HISTOGRAM_TEXT_MODE_RIGHT_UPPER:
m_label_function = HistogramFuncTxtCalc::HFCTextRightUpper;
break;
default:
m_label_function = HistogramFuncTxtCalc::HFCTextCenter;
break;
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
/*
Notas:
- Niguna de estas fucniones REDIBUJA EL BITMAP, unicamente acutlizan los piexles de canvas, para acutlizar la imagen, lo que ve el usuario
Se debera de llamar a Redraw
*/
//+------------------------------------------------------------------+
void CHistogramConjuntoNor::SetNewCordenadas(int x1, int y1)
{
//--- Nuevas cordenas de anclaje
m_barras_x1_init = x1;
m_barras_y1_init = y1;
//--- Recalculo de cordenas texto y barras
RecalculeCordinates();
}
//+------------------------------------------------------------------+
void CHistogramConjuntoNor::SizeBarrasInPixels(const int new_max_ancho)
{
//--- Vefificacion de tamaño
if(m_barras_size < 1 || !m_init)
{
LogFatalError("No hay barras para el resize, o no esta iniciado", FUNCION_ACTUAL);
Remover();
return;
}
//---
m_barras_ancho_total = new_max_ancho;
#ifdef HISTOGRAM_CONJ_ACTIVAR_AUTO_RESIZE
//--- Verificacion del texto
if(m_label.font_size > m_barras_ancho_total)
{
LogWarning("Se esta modificando el fontsize, valor mas grande que el ancho disponible", FUNCION_ACTUAL);
m_label.font_size = m_barras_ancho_total;
}
#endif
//--- Ancho de la barra
HISTOGRAM_CONJ_RECALCULE
//---
OnBarrasResize(); // Cambio del "aancho" de las barras, solo el ancho
CalculeTextCordinates(); // Recalculo del texto
}
//+------------------------------------------------------------------+
void CHistogramConjuntoNor::SetNewsCordenadasAndSize(int x1, int y1, int barras_ancho)
{
//--- Vefificacion de tamaño
if(m_barras_size < 1 || !m_init)
{
LogFatalError("No hay barras para el resize, o no esta iniciado", FUNCION_ACTUAL);
Remover();
return;
}
//--- Nuevas cordenas de anclaje
m_barras_x1_init = x1;
m_barras_y1_init = y1;
//--- Nuevo ancho
m_barras_ancho_total = barras_ancho;
#ifdef HISTOGRAM_CONJ_ACTIVAR_AUTO_RESIZE
//--- Verificacion del texto
if(m_label.font_size > m_barras_ancho_total)
{
LogWarning("Se esta modificando el fontsize, valor mas grande que el ancho disponible", FUNCION_ACTUAL);
m_label.font_size = m_barras_ancho_total;
}
#endif
//--- Ancho de la barra
HISTOGRAM_CONJ_RECALCULE
//---Recalculamos cordenas de texto y barras
RecalculeCordinates();
}
//+------------------------------------------------------------------+
void CHistogramConjuntoNor::SetNewsValues(int gap_corte, double fpos, double fneg, double fcort)
{
m_fcort = fcort;
m_fneg = fneg;
m_fpos = fpos;
m_barras_gap_eje = gap_corte;
//--- Recalculamos las cordenadas de las barras
//RecalculeBarCordinates();
OnNewValuesPosNegCorte();
}
//+------------------------------------------------------------------+
// Estra funcion recalcula las cordadenas de todo
__forceinline void CHistogramConjuntoNor::RecalculeCordinates(void)
{
RecalculeBarCordinates(); // Recalculaos y filleamos los recnautrlgos
CalculeTextCordinates(); // Recalculamos todas las cordenadas del texto
}
//+------------------------------------------------------------------+
// Esta funcion se debera de ejeuctar cuando se agergan barras. (luego de m_init = true), y
// al momento de finalizar el agregado se debra de ejecutar esto para reclauclos las cordnaas y ancho de cada barra (esto dado qeu se aumentaron barras)
__forceinline void CHistogramConjuntoNor::RecalculeCordinatesOnlyBars()
{
for(int i = 0; i < m_barras_size; i++)
m_function_draw_rect(m_canvas, m_barras[i].x1, m_barras[i].y1, m_barras[i].x2, m_barras[i].y2, m_clean_color); // Limpiamos el espacio ocupado (si hjay corndenas no inbiciado no se dibujan)
RecalculeBarCordinates();
}
//+------------------------------------------------------------------+
//| Seteo general de parametros |
//+------------------------------------------------------------------+
/*
Advertencia, si el txt_font o txt_font_Size es invalido se toma el valor de canvas (setear el fontsize con FOntSet en CHistogram)
*/
void CHistogramConjuntoNor::Set(CCanvasCustom *c, string label, uint txt_clr, ENUM_HISTOGRAM_TEXT_MODE txt_mode, int txt_font_size, string txt_font, int label_gap_eje, ENUM_HIST_DRAW_RECT_STYLE initial_style)
{
//--- General
m_canvas = c;
//---
m_barras_style_draw_rect = initial_style;
if(m_barras_style_draw_rect) // Si no es 0, (fill)
m_function_draw_rect = HistConjuntoDrawRectFunctions::HistDrawRectFill;
else
m_function_draw_rect = HistConjuntoDrawRectFunctions::HistDrawRectNoFill;
//--- Texto
m_label_gap_by_eje = label_gap_eje;
m_label.clr = txt_clr;
m_label.mode = txt_mode;
m_label.value = label;
m_label.font = txt_font == NULL ? c.FontNameGet() : txt_font;
m_label.font_size = txt_font_size < 1 ? c.FontSizeGet() : txt_font_size;
SetFunctionCalcText(); // Seteamos la funcion para calcular el texto
//--- Si ya esta inicado volvermos a recalcular
if(m_init)
RecalculeCordinates(); // SI se cambio el fill entonces recalcula, si se camibo el texto tambien
}
//+------------------------------------------------------------------+
//| Inicializacion de la clase |
//+------------------------------------------------------------------+
void CHistogramConjuntoNor::Init(HistogramFuncionCalculatePixel fcalc, int x1_in, int y1_in, int size_corte, int barras_ancho_max, double fpos, double fneg, double fcort)
{
//---
if(m_barras_size < 1)
{
LogFatalError("No hay barras para crear el conjunto", FUNCION_ACTUAL);
Remover();
return;
}
//---
m_function_calc_pixel = fcalc;
//--- General
m_init = true;
m_barras_x1_init = x1_in;
m_barras_y1_init = y1_in;
m_fcort = fcort;
m_fneg = fneg;
m_fpos = fpos;
m_barras_gap_eje = size_corte;
//--- Ancho de la barra
m_barras_ancho_total = barras_ancho_max;
HISTOGRAM_CONJ_RECALCULE
#ifdef HISTOGRAM_CONJ_ACTIVAR_AUTO_RESIZE
//--- Verificacion del texto
if(m_label.font_size > m_barras_ancho_total)
{
LogWarning("Se esta modificando el fontsize, valor mas grande que el ancho disponible", FUNCION_ACTUAL);
m_label.font_size = m_barras_ancho_total;
}
#endif
//--- Dibujamos
RecalculeCordinates();
}
//+------------------------------------------------------------------+
#endif
//+------------------------------------------------------------------+