259 lines
		
	
	
	
		
			20 KiB
		
	
	
	
		
			MQL5
		
	
	
	
	
	
			
		
		
	
	
			259 lines
		
	
	
	
		
			20 KiB
		
	
	
	
		
			MQL5
		
	
	
	
	
	
//+------------------------------------------------------------------+
 | 
						|
//|                                                    LineCorte.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_FINAL_FILE_LINE_CORTE_BY_LEO_MQH
 | 
						|
#define HISTOGRAM_FINAL_FILE_LINE_CORTE_BY_LEO_MQH
 | 
						|
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
//|                                                                  |
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
#include "..\\..\\General\\Canvas.mqh"
 | 
						|
 | 
						|
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
//| Clase Base Abstracta                                             |
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
class CHistogramLineCorteBase
 | 
						|
 {
 | 
						|
protected:
 | 
						|
  CCanvasCustom*     m_canvas;
 | 
						|
  bool               m_init;
 | 
						|
 | 
						|
  int                m_x;
 | 
						|
  int                m_y;
 | 
						|
  int                m_size;
 | 
						|
  uint               m_clr;
 | 
						|
  uint               m_clr_clean;
 | 
						|
 | 
						|
public:
 | 
						|
                     CHistogramLineCorteBase(void);
 | 
						|
                    ~CHistogramLineCorteBase(void) {}
 | 
						|
 | 
						|
  void               Init(CCanvasCustom* c);
 | 
						|
  void               Set(int x, int y, int width, uint clr, uint clr_clean, bool update = false);
 | 
						|
 | 
						|
  // Métodos virtuales puros
 | 
						|
  virtual __forceinline void DrawLine(void) = 0;
 | 
						|
  virtual __forceinline void CleanLine(void) = 0;
 | 
						|
  virtual void       ReSize(int new_size, bool update = false) = 0;
 | 
						|
  virtual void       SetNewValueEjePrincipal(int eje_value, bool clean, bool update = false) = 0;
 | 
						|
  virtual void       SetCordenadas(int x, int y, int width, bool update = false) = 0;
 | 
						|
 | 
						|
  // Métodos comunes
 | 
						|
  void               Color(uint new_value, bool update = false);
 | 
						|
 | 
						|
  __forceinline uint Color(void) const { return m_clr; }
 | 
						|
  __forceinline int  Size(void) const { return m_size; }
 | 
						|
  __forceinline int  X(void) const { return m_x; }
 | 
						|
  __forceinline int  Y(void) const { return m_y; }
 | 
						|
 };
 | 
						|
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
//| Constructor Base                                                 |
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
CHistogramLineCorteBase::CHistogramLineCorteBase(void)
 | 
						|
  : m_x(0), m_y(0), m_size(0), m_canvas(NULL),
 | 
						|
    m_clr(0x00000000), m_clr_clean(0x00000000), m_init(false)
 | 
						|
 {
 | 
						|
 }
 | 
						|
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
//| Inicialización Base                                              |
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
void CHistogramLineCorteBase::Init(CCanvasCustom *c)
 | 
						|
 {
 | 
						|
  if(m_init)
 | 
						|
    return;
 | 
						|
 | 
						|
  m_init = true;
 | 
						|
  m_canvas = c;
 | 
						|
 }
 | 
						|
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
//| Cambiar Color                                                    |
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
void CHistogramLineCorteBase::Color(uint new_value, bool update = false)
 | 
						|
 {
 | 
						|
  m_clr = new_value;
 | 
						|
  DrawLine();
 | 
						|
 | 
						|
  if(update)
 | 
						|
    m_canvas.Update();
 | 
						|
 }
 | 
						|
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
//| Configurar Línea                                                 |
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
void CHistogramLineCorteBase::Set(int x, int y, int width, uint clr, uint clr_clean, bool update = false)
 | 
						|
 {
 | 
						|
  m_x = x;
 | 
						|
  m_y = y;
 | 
						|
  m_size = width;
 | 
						|
  m_clr = clr;
 | 
						|
  m_clr_clean = clr_clean;
 | 
						|
 | 
						|
  DrawLine();
 | 
						|
 | 
						|
  if(update)
 | 
						|
    m_canvas.Update();
 | 
						|
 }
 | 
						|
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
//| Clase para Línea Horizontal                                      |
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
class CHistogramLineCorteHor : public CHistogramLineCorteBase
 | 
						|
 {
 | 
						|
public:
 | 
						|
                     CHistogramLineCorteHor(void) {}
 | 
						|
                    ~CHistogramLineCorteHor(void) {}
 | 
						|
 | 
						|
  __forceinline void DrawLine(void) override;
 | 
						|
  __forceinline void CleanLine() override;
 | 
						|
  void               ReSize(int new_size, bool update = false) override;
 | 
						|
  void               SetNewValueEjePrincipal(int eje_value, bool clean, bool update = false) override;
 | 
						|
  void               SetCordenadas(int x, int y, int width, bool update = false) override;
 | 
						|
 };
 | 
						|
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
//| Dibujar Línea Horizontal                                         |
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
__forceinline void CHistogramLineCorteHor::DrawLine(void)
 | 
						|
 {
 | 
						|
  m_canvas.LineHorizontal(m_x, m_x + m_size, m_y, m_clr);
 | 
						|
 }
 | 
						|
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
//| Limpiar Línea Horizontal                                         |
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
__forceinline void CHistogramLineCorteHor::CleanLine()
 | 
						|
 {
 | 
						|
  m_canvas.LineHorizontal(m_x, m_x + m_size, m_y, m_clr_clean);
 | 
						|
 }
 | 
						|
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
//| Redimensionar Línea Horizontal                                   |
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
void CHistogramLineCorteHor::ReSize(int new_size, bool update = false)
 | 
						|
 {
 | 
						|
  m_canvas.LineHorizontal(m_x, m_x + m_size, m_y, m_clr_clean);
 | 
						|
  m_size = new_size;
 | 
						|
  m_canvas.LineHorizontal(m_x, m_x + m_size, m_y, m_clr);
 | 
						|
 | 
						|
  if(update)
 | 
						|
    m_canvas.Update();
 | 
						|
 }
 | 
						|
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
//| Cambiar Valor Eje Principal (Y) Horizontal                       |
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
void CHistogramLineCorteHor::SetNewValueEjePrincipal(int eje_value, bool clean, bool update = false)
 | 
						|
 {
 | 
						|
  if(clean)
 | 
						|
    m_canvas.LineHorizontal(m_x, m_x + m_size, m_y, m_clr_clean);
 | 
						|
 | 
						|
  m_y = eje_value;
 | 
						|
  m_canvas.LineHorizontal(m_x, m_x + m_size, m_y, m_clr);
 | 
						|
 | 
						|
  if(update)
 | 
						|
    m_canvas.Update();
 | 
						|
 }
 | 
						|
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
//| Establecer Coordenadas Horizontal                                |
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
void CHistogramLineCorteHor::SetCordenadas(int x, int y, int width, bool update = false)
 | 
						|
 {
 | 
						|
  m_canvas.LineHorizontal(m_x, m_x + m_size, m_y, m_clr_clean);
 | 
						|
  m_x = x;
 | 
						|
  m_y = y;
 | 
						|
  m_size = width;
 | 
						|
  m_canvas.LineHorizontal(m_x, m_x + m_size, m_y, m_clr);
 | 
						|
 | 
						|
  if(update)
 | 
						|
    m_canvas.Update();
 | 
						|
 }
 | 
						|
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
//| Clase para Línea Vertical                                        |
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
class CHistogramLineCorteVer : public CHistogramLineCorteBase
 | 
						|
 {
 | 
						|
public:
 | 
						|
                     CHistogramLineCorteVer(void) {}
 | 
						|
                    ~CHistogramLineCorteVer(void) {}
 | 
						|
 | 
						|
  __forceinline void DrawLine(void) override;
 | 
						|
  __forceinline void CleanLine() override;
 | 
						|
  void               ReSize(int new_size, bool update = false) override;
 | 
						|
  void               SetNewValueEjePrincipal(int eje_value, bool clean, bool update = false) override;
 | 
						|
  void               SetCordenadas(int x, int y, int width, bool update = false) override;
 | 
						|
 };
 | 
						|
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
//| Dibujar Línea Vertical                                           |
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
__forceinline void CHistogramLineCorteVer::DrawLine(void)
 | 
						|
 {
 | 
						|
  m_canvas.LineVertical(m_x, m_y, m_y + m_size, m_clr);
 | 
						|
 }
 | 
						|
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
//| Limpiar Línea Vertical                                           |
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
__forceinline void CHistogramLineCorteVer::CleanLine()
 | 
						|
 {
 | 
						|
  m_canvas.LineVertical(m_x, m_y, m_y + m_size, m_clr_clean);
 | 
						|
 }
 | 
						|
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
//| Redimensionar Línea Vertical                                     |
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
void CHistogramLineCorteVer::ReSize(int new_size, bool update = false)
 | 
						|
 {
 | 
						|
  m_canvas.LineVertical(m_x, m_y, m_y + m_size, m_clr_clean);
 | 
						|
  m_size = new_size;
 | 
						|
  m_canvas.LineVertical(m_x, m_y, m_y + m_size, m_clr);
 | 
						|
 | 
						|
  if(update)
 | 
						|
    m_canvas.Update();
 | 
						|
 }
 | 
						|
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
//| Cambiar Valor Eje Principal (X) Vertical                         |
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
void CHistogramLineCorteVer::SetNewValueEjePrincipal(int eje_value, bool clean, bool update = false)
 | 
						|
 {
 | 
						|
  if(clean)
 | 
						|
    m_canvas.LineVertical(m_x, m_y, m_y + m_size, m_clr_clean);
 | 
						|
 | 
						|
  m_x = eje_value;
 | 
						|
  m_canvas.LineVertical(m_x, m_y, m_y + m_size, m_clr);
 | 
						|
 | 
						|
  if(update)
 | 
						|
    m_canvas.Update();
 | 
						|
 }
 | 
						|
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
//| Establecer Coordenadas Vertical                                  |
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
void CHistogramLineCorteVer::SetCordenadas(int x, int y, int width, bool update = false)
 | 
						|
 {
 | 
						|
  m_canvas.LineVertical(m_x, m_y, m_y + m_size, m_clr_clean);
 | 
						|
  m_x = x;
 | 
						|
  m_y = y;
 | 
						|
  m_size = width;
 | 
						|
  m_canvas.LineVertical(m_x, m_y, m_y + m_size, m_clr);
 | 
						|
 | 
						|
  if(update)
 | 
						|
    m_canvas.Update();
 | 
						|
 }
 | 
						|
 | 
						|
//+------------------------------------------------------------------+
 | 
						|
#endif
 | 
						|
//+------------------------------------------------------------------+
 |