J'ai également pris l'habitude de créer une bibliothèque de graphiques, juste avec les éléments dont j'ai besoin.
Le principal atout de la bibliothèque est son moteur de fenêtrage :
cela ne dépend pas des graphiques, vous pouvez dire que les fenêtres virtuelles sans une seule fonction pour travailler avec les graphiques, même les fenêtres absolues fonctionneront correctement (événements, propriétés).
ensembles de propriétés pour une fenêtre qui affectent son comportement, propriétés dépendantes de cette fenêtre et autres
en ce qui concerne les graphiques, vous pouvez utiliser à la fois des objets standard et des canevas, ainsi que DirectX, ce que vous voulez.
les fenêtres du moteur sont les éléments de base pour construire des éléments graphiques.
utilisation de différentes optimisations pour la performance (exclusion des appels inutiles aux fonctions du système graphique, ainsi que l'exclusion du dessin des boîtes invisibles)
Simplicité de la création d'un nouvel élément graphique, tant au niveau de la mise en œuvre de la conception graphique que de la création d'éléments graphiques enfants/de la structure des fenêtres. Tous les événements et le calcul des propriétés dépendantes seront effectués au niveau du moteur, il ne distingue pas les éléments graphiques personnalisés, il fonctionne uniquement au niveau des fenêtres de base.
Création et suppression de l'objet standard OBJ_RECTANGLE_LABEL
Ceci implémente une méthode pour modifier les propriétés de l'objet standard OBJ_RECTANGLE_LABEL, en parcourant l'aide et en utilisant les propriétés d'intérêt .
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;
}
gestion facile des événements
Il s'agit d'un gestionnaire d'événement externe, le nom de l'objet d'intérêt (fenêtre/élément graphique) peut être spécifié lors de sa création .
L'étiquette de texte est implémentée via un kanvas car la largeur et la hauteur ne peuvent pas être modifiées dans l'objet OBJ_LABEL. Pour cette raison, le rendu est effectué lorsqu'un événement CHARTEVENT_ON_PAINT se produit (ce qui nécessite un redessin).
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;
}
Ce qu'il faut rendre et mettre à jour est déterminé automatiquement. Les propriétés sont enregistrées avant d'appeler ChartRedraw() . Les événements qui n'ont pas entraîné le redécoupage du graphique sont ignorés.
Nous avons testé la fonctionnalité et le potentiel des graphiques 3D dans MT5 sur un ordinateur faible avec 4 Go de RAM et 2 cœurs de processeur.
Il fonctionne bien, même après une longue pause dans la programmation. Mais la chose est lourde et il faut beaucoup de travail pour créer quelque chose de sérieux.
Nous avons testé la fonctionnalité et le potentiel des graphiques 3D dans MT5 sur un ordinateur faible avec 4 Go de RAM et 2 cœurs de processeur.
Il fonctionne bien, même après une longue pause dans la programmation. Mais, la chose est lourde et il faut beaucoup de travail pour développer quelque chose de sérieux.
Pour le HFT, je pense que la 3D sera utile pour l'analyse graphique du volume et du flux d'ordres de la coupe. Mais je ne sais pas comment interpréter de telles informations.
Comment la bibliothèque progresse-t-elle ?
tout est plus que bien.
J'ai également pris l'habitude de créer une bibliothèque de graphiques, juste avec les éléments dont j'ai besoin.
Le principal atout de la bibliothèque est son moteur de fenêtrage :
Création et suppression de l'objet standard OBJ_RECTANGLE_LABEL
Ceci implémente une méthode pour modifier les propriétés de l'objet standard OBJ_RECTANGLE_LABEL, en parcourant l'aide et en utilisant les propriétés d'intérêt
.
- gestion facile des événements
Il s'agit d'un gestionnaire d'événement externe, le nom de l'objet d'intérêt (fenêtre/élément graphique) peut être spécifié lors de sa création.
L'étiquette de texte est implémentée via un kanvas car la largeur et la hauteur ne peuvent pas être modifiées dans l'objet OBJ_LABEL. Pour cette raison, le rendu est effectué lorsqu'un événement CHARTEVENT_ON_PAINT se produit (ce qui nécessite un redessin).
Ce qu'il faut rendre et mettre à jour est déterminé automatiquement. Les propriétés sont enregistrées avant d'appeler ChartRedraw() . Les événements qui n'ont pas entraîné le redécoupage du graphique sont ignorés.
La démo est dans le fichier joint, les sources ci-dessus sont utilisées dans cette démo.
La démo n'affiche pas toutes les propriétés possibles, seulement certaines d'entre elles :
C'est toujours un travail en cours, jusqu'à présent.
La démo n'affiche pas toutes les propriétés possibles, seulement certaines d'entre elles :
C'est toujours un travail en cours, pour l'instant.
Bonne chance pour le développement ! :)
Bonne chance pour le développement ! :)
Merci :)
Nous avons testé la fonctionnalité et le potentiel des graphiques 3D dans MT5 sur un ordinateur faible avec 4 Go de RAM et 2 cœurs de processeur.
Il fonctionne bien, même après une longue pause dans la programmation. Mais la chose est lourde et il faut beaucoup de travail pour créer quelque chose de sérieux.
Nous avons testé la fonctionnalité et le potentiel des graphiques 3D dans MT5 sur un ordinateur faible avec 4 Go de RAM et 2 cœurs de processeur.
Il fonctionne bien, même après une longue pause dans la programmation. Mais, la chose est lourde et il faut beaucoup de travail pour développer quelque chose de sérieux.
Pour le HFT, je pense que la 3D sera utile pour l'analyse graphique du volume et du flux d'ordres de la coupe.
Mais je ne sais pas comment interpréter de telles informations.
Mon Dieu ! À quoi ça sert tout ça ?