También le he cogido el tranquillo a hacer una biblioteca de gráficos, sólo con los elementos que necesito.
El principal truco de la biblioteca es su motor de ventanas:
no depende de los gráficos, se puede decir que las ventanas virtuales sin una sola función para trabajar con los gráficos, incluso absolutamente ventanas funcionará correctamente (eventos, propiedades)
conjuntos de propiedades de una ventana que afectan a su comportamiento, propiedades dependientes de esa ventana y otras
como gráficos puedes usar tanto objetos estándar como canvas, y DirectX, lo que quieras
Las ventanas del motor son los bloques de construcción de los elementos gráficos
uso de diferentes optimizaciones para el rendimiento (exclusión de las llamadas innecesarias de las funciones del sistema gráfico, así como la exclusión del dibujo de las cajas invisibles)
Simplicidad en la creación de un nuevo elemento gráfico, tanto en la implementación del diseño gráfico como en la creación de elementos gráficos hijos/estructura de ventanas. Todos los eventos y el cálculo de las propiedades dependientes se realizarán a nivel del motor, no distingue los elementos gráficos personalizados, sólo funciona a nivel de las ventanas básicas
Creación y eliminación del objeto estándar OBJ_RECTANGLE_LABEL
Esto implementa un método para cambiar las propiedades del objeto OBJ_RECTANGLE_LABEL estándar, recorriendo la ayuda y utilizando las propiedades de interés
bool cV_object_rectangle::_Set_property(eV_object_property property,sV_property_value &property_value)
{
_is_redraw_object=true;
switch(property)
{
case vop_s_is_hidden:
{
if(property_value.data_long)
{
ObjectSetInteger(0,visual_object_name,OBJPROP_XSIZE,0);
ObjectSetInteger(0,visual_object_name,OBJPROP_YSIZE,0);
ObjectSetInteger(0,visual_object_name,OBJPROP_XDISTANCE,-20);
ObjectSetInteger(0,visual_object_name,OBJPROP_YDISTANCE,-20);
}
else
{
ObjectSetInteger(0,visual_object_name,OBJPROP_XSIZE,_property_values[vop_s_size_real_x].data_long);
ObjectSetInteger(0,visual_object_name,OBJPROP_YSIZE,_property_values[vop_s_size_real_y].data_long);
ObjectSetInteger(0,visual_object_name,OBJPROP_XDISTANCE,_property_values[vop_s_position_real_x].data_long);
ObjectSetInteger(0,visual_object_name,OBJPROP_YDISTANCE,_property_values[vop_s_position_real_y].data_long);
}
break;
}
case vop_s_color_back:
{
ObjectSetInteger(0,visual_object_name,OBJPROP_BGCOLOR,property_value.data_long);
break;
}
case vop_border_type:
{
ObjectSetInteger(0,visual_object_name,OBJPROP_BORDER_TYPE,property_value.data_long);
break;
}
case vop_s_color_borders:
{
ObjectSetInteger(0,visual_object_name,OBJPROP_COLOR,property_value.data_long);
break;
}
case vop_s_position_real_x:
{
ObjectSetInteger(0,visual_object_name,OBJPROP_XDISTANCE,property_value.data_long);
break;
}
case vop_s_position_real_y:
{
ObjectSetInteger(0,visual_object_name,OBJPROP_YDISTANCE,property_value.data_long);
break;
}
case vop_s_size_real_x:
{
ObjectSetInteger(0,visual_object_name,OBJPROP_XSIZE,property_value.data_long);
break;
}
case vop_s_size_real_y:
{
ObjectSetInteger(0,visual_object_name,OBJPROP_YSIZE,property_value.data_long);
break;
}
case vop_font_size:
{
ObjectSetInteger(0,visual_object_name,OBJPROP_FONTSIZE,property_value.data_long);
break;
}
case vop_line_width:
{
ObjectSetInteger(0,visual_object_name,OBJPROP_WIDTH,property_value.data_long);
break;
}
default:
{
_is_redraw_object=false;
}
}
returntrue;
}
fácil manejo de eventos
Este es un manejador de eventos externo, el nombre del objeto de interés (ventana/artículo gráfico) puede ser especificado al crearlo
La etiqueta de texto se implementa a través de kanvas porque la anchura y la altura no pueden cambiarse en el objeto OBJ_LABEL, y por esta razón la renderización se realiza cuando se produce un evento CHARTEVENT_ON_PAINT (que requiere redibujar)
bool cV_object_label::_On_event(const sEvent &event)
{
if(event.id==CHARTEVENT_ON_PAINT)
{
color color_back=clrBlack;
if(CheckPointer(_object_parent))
{
color_back=color(_object_parent._property_values[vop_color_back].data_long);
}
int width=int(_property_values[vop_s_size_real_x].data_long);
int height=int(_property_values[vop_s_size_real_y].data_long);
int x=int(_property_values[vop_s_position_global_x].data_long-_property_values[vop_s_position_real_x].data_long);
int y=int(_property_values[vop_s_position_global_y].data_long-_property_values[vop_s_position_real_y].data_long);
_canvas.Resize(width,height);
width=int(_property_values[vop_size_x].data_long);
height=int(_property_values[vop_size_y].data_long);
_canvas.Erase(ColorToARGB(color_back));
switch(int(_property_values[vop_text_anchor].data_long))
{
caseTA_CENTER:
{
x=x+(width-_canvas.TextWidth(_property_values[vop_text].data_string))/2;
break;
}
caseTA_RIGHT:
{
x=x+(width-_canvas.TextWidth(_property_values[vop_text].data_string));
break;
}
}
_canvas.TextOut(x,y,_property_values[vop_text].data_string,ColorToARGB(color(_property_values[vop_s_color_back].data_long)));//);
_canvas.Update(false);
}
returntrue;
}
Lo que hay que renderizar y actualizar se determina automáticamente. Las propiedades se registran antes de llamar a ChartRedraw() . Se omiten los eventos que no han provocado el redibujado del gráfico.
Probé la funcionalidad y el potencial de los gráficos 3D en MT5 en un ordenador débil con 4 GB de RAM y 2 núcleos de procesador.
Funciona bien incluso después de una larga pausa en la programación. Pero, la cosa es pesada y se necesita mucho trabajo para desarrollar algo serio.
Para la HFT, creo que el 3D será útil para el análisis gráfico del volumen de la copa y el flujo de órdenes. Pero no sé cómo interpretar esa información.
¿Cómo avanza la biblioteca?
todo está más que bien.
También le he cogido el tranquillo a hacer una biblioteca de gráficos, sólo con los elementos que necesito.
El principal truco de la biblioteca es su motor de ventanas:
Creación y eliminación del objeto estándar OBJ_RECTANGLE_LABEL
Esto implementa un método para cambiar las propiedades del objeto OBJ_RECTANGLE_LABEL estándar, recorriendo la ayuda y utilizando las propiedades de interés
- fácil manejo de eventos
Este es un manejador de eventos externo, el nombre del objeto de interés (ventana/artículo gráfico) puede ser especificado al crearloLa etiqueta de texto se implementa a través de kanvas porque la anchura y la altura no pueden cambiarse en el objeto OBJ_LABEL, y por esta razón la renderización se realiza cuando se produce un evento CHARTEVENT_ON_PAINT (que requiere redibujar)
Lo que hay que renderizar y actualizar se determina automáticamente. Las propiedades se registran antes de llamar a ChartRedraw() . Se omiten los eventos que no han provocado el redibujado del gráfico.
La demo está en el archivo adjunto, las fuentes anteriores se utilizan en él.
La demo no muestra todas las propiedades posibles, sólo algunas de ellas:
De momento, sigue siendo un trabajo en curso.
La demo no muestra todas las propiedades posibles, sólo algunas de ellas:
Por ahora, sigue siendo un trabajo en curso.
¡Buena suerte con el desarrollo! :)
¡Buena suerte con el desarrollo! :)
Gracias :)
Probé la funcionalidad y el potencial de los gráficos 3D en MT5 en un ordenador débil con 4 GB de RAM y 2 núcleos de procesador.
Funciona bien incluso después de una larga pausa en la programación. Pero la cosa es pesada y se necesita mucho trabajo para crear algo serio.
Probé la funcionalidad y el potencial de los gráficos 3D en MT5 en un ordenador débil con 4 GB de RAM y 2 núcleos de procesador.
Funciona bien incluso después de una larga pausa en la programación. Pero, la cosa es pesada y se necesita mucho trabajo para desarrollar algo serio.
Para la HFT, creo que el 3D será útil para el análisis gráfico del volumen de la copa y el flujo de órdenes.
Pero no sé cómo interpretar esa información.
¡Dios mío! ¿Para qué es todo esto?