Discusión sobre el artículo "DoEasy. Elementos de control (Parte 31): Desplazamiento por el contenido del control "ScrollBar""
Para tales obras, un monumento será erigido probablemente en mql5, descendientes))) Lo que vale un archivo defines.mqh, en 4k líneas. Si nos fijamos en la diferencia entre 70 partes y 131 partes, es increíble la cantidad de trabajo que hay )))
He encontrado un pequeño error, en el fichero trading.mqh , SetPrices, tiene la visibilidad private, no protected, los descendientes no pueden usar la función. En el fichero TradingControl.mqh, CreatePReqClose(), hay errores de uso.
private: template <typename PR,typename SL,typename TP,typename PL> bool SetPrices(const ENUM_ORDER_TYPE action,const PR price,const SL sl,const TP tp,const PL limit,const string source_method,CSymbol *symbol_obj);
Para tales obras, un monumento será erigido probablemente en mql5, descendientes))) Lo que vale un archivo defines.mqh, en 4k líneas. Si nos fijamos en la diferencia entre 70 partes y 131 partes, es increíble la cantidad de trabajo que hay )))
He encontrado un pequeño error, en el fichero trading.mqh , SetPrices, tiene la visibilidad private, no protected, los descendientes no pueden usar la función. En el fichero TradingControl.mqh, CreatePReqClose(), hay errores de uso.
Sí. Este error fue mi descuido y el error del compilador antiguo que se perdió. En las últimas versiones del compilador se detectó el error y lo arreglé. En las últimas versiones de la librería, los métodos están en la sección protected, no en la sección private
¿No sería mejor crear una estructura y convertir las cadenas en una matriz CharArray?
ulong m_ticket; // Ticket de la orden/operación seleccionada (MQL5) long m_long_prop[ORDER_PROP_INTEGER_TOTAL]; // Propiedades de los números enteros double m_double_prop[ORDER_PROP_DOUBLE_TOTAL]; // Propiedades sustanciales string m_string_prop[ORDER_PROP_STRING_TOTAL]; // Propiedades de las cadenas
//--- Crea un nuevo objeto gráfico, devuelve un puntero al objeto de control gráfico CChartObjectsControl *CreateNewStdGraphObjectAndGetCtrlObj(const long chart_id, const string name, int subwindow, const ENUM_OBJECT type_object, const datetime time1, const double price1, const datetime time2=0, const double price2=0, const datetime time3=0, const double price3=0, const datetime time4=0, const double price4=0, const datetime time5=0, const double price5=0) { //--- Si el objeto con ID de gráfico y nombre ya existe en la colección - infórmelo y devuelva NULL if(this.IsPresentGraphObjInList(chart_id,name)) { ::Print(DFUN,CMessage::Text(MSG_GRAPH_ELM_COLLECTION_ERR_GR_OBJ_ALREADY_EXISTS)," ChartID ",(string)chart_id,", ",name); return NULL; } //--- Si no se pudo crear un nuevo objeto gráfico estándar - infórmelo y devuelva NULL if(!CreateNewStdGraphObject(chart_id,name,type_object,subwindow,time1,price1,time2,price2,time3,price3,time4,price4,time5,price5)) { ::Print(DFUN,CMessage::Text(MSG_GRAPH_STD_OBJ_ERR_FAILED_CREATE_STD_GRAPH_OBJ),StdGraphObjectTypeDescription(type_object)); CMessage::ToLog(::GetLastError(),true); return NULL; } //--- Si no se pudo obtener el objeto de control de horario - infórmelo CChartObjectsControl *ctrl=this.GetChartObjectCtrlObj(chart_id); if(ctrl==NULL) ::Print(DFUN,CMessage::Text(MSG_GRAPH_ELM_COLLECTION_ERR_FAILED_GET_CTRL_OBJ),(string)chart_id); //--- Devuelve un puntero al objeto de control de horario, o NULL en caso de error al recibirlo return ctrl; }
He intentado crear un objeto simple (etiqueta de texto), pero no he podido.
Después de CreateNewStdGraphObject(), ¿cómo debería entrar el objeto creado en m_list_charts_control para obtener un objeto distinto de cero en la siguiente llamada?
CChartObjectsControl *ctrl=this.GetChartObjectCtrlObj(chart_id);
//--- Crea un objeto gráfico "Etiqueta de Texto" bool CreateTextLabel(const long chart_id,const string name,const int subwindow,const bool extended, const int x,const int y, const string text,const int size,const ENUM_BASE_CORNER corner, const ENUM_ANCHOR_POINT anchor_point,const double angle) { string nm=this.m_name_program+"_"+name; ENUM_OBJECT type_object=OBJ_LABEL; CChartObjectsControl *ctrl=this.CreateNewStdGraphObjectAndGetCtrlObj(chart_id,nm,subwindow,type_object,0,0); if(ctrl==NULL) return false;
Devuelve false antes de llegar al ajuste de la propiedad.
//+------------------------------------------------------------------+ //| Devuelve el objeto barra por tiempo en la serie temporal || //+------------------------------------------------------------------+ CBar *CSeriesDE::GetBar(const datetime time) { CBar *obj=new CBar(); if(obj==NULL) return NULL; obj.SetSymbolPeriod(this.m_symbol,this.m_timeframe,time); this.m_list_series.Sort(SORT_BY_BAR_TIME); int index=this.m_list_series.Search(obj); delete obj; return this.m_list_series.At(index); }
Aquí timeseries no está ordenando para mí.... El método Sort() de CArray debería implementarse por separado en una clase heredada para ordenar objetos, ¿no?
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso

Artículo publicado DoEasy. Elementos de control (Parte 31): Desplazamiento por el contenido del control "ScrollBar":
En este artículo, crearemos la funcionalidad necesaria para desplazar el contenido del contenedor usando los botones de la barra de desplazamiento horizontal.
Vamos a compilar el asesor y a ejecutarlo en el gráfico:
Como podemos ver, el desplazamiento controlado por los botones con flechas funciona correctamente. Al intentar mover el control deslizante con el ratón, este "se resiste", lo cual es natural: aún no hemos implementado el procesamiento del desplazamiento del control deslizante, pero ya hemos creado el recálculo de sus dimensiones y coordenadas. Como consecuencia, al intentar mover el control deslizante con el ratón, el método de configuración de sus coordenadas lo retorna a la posición que se corresponde con la posición del contenido del contenedor en su área visible. En artículos posteriores, mejoraremos todo lo necesario para que funcione correctamente.
Autor: Artyom Trishkin