Eu também tenho o jeito de fazer uma biblioteca gráfica, apenas com os elementos que preciso.
O principal truque da biblioteca é seu motor de janelas:
não depende de gráficos, você pode dizer janelas virtuais sem uma única função para trabalhar com gráficos, mesmo que janelas absolutamente funcionem corretamente (eventos, propriedades)
conjuntos de propriedades de uma janela que afetam seu comportamento, propriedades dependentes dessa janela e outras
como gráficos você pode usar tanto objetos padrão como telas, e DirectX, o que você quiser
as janelas do motor são os blocos de construção para construir elementos gráficos
uso de diferentes otimizações de desempenho (exclusão de chamadas desnecessárias de funções do sistema gráfico, assim como exclusão de desenho de caixas invisíveis)
Simplicidade na criação de um novo item gráfico, tanto na implementação do design gráfico quanto na criação de itens gráficos infantis/estrutura de janelas. Todos os eventos e cálculos de propriedades dependentes serão realizados no nível do motor, não distingue itens gráficos personalizados, funciona apenas no nível das janelas básicas
Criação e eliminação do objeto OBJ_RECTANGLE_LABEL padrão
Isto implementa um método para alterar as propriedades do objeto OBJ_RECTANGLE_LABEL padrão, apressando-se através da ajuda e usando as propriedades de interesse
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 manuseio de eventos
Este é um manipulador de eventos externo, o nome do objeto de interesse (janela/item gráfico) pode ser especificado ao criá-lo
A etiqueta de texto é implementada via kanvas porque a largura e altura não podem ser alteradas no objeto OBJ_LABEL, e por este motivo a renderização é realizada quando ocorre um evento CHARTEVENT_ON_PAINT (requerendo redesenho)
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;
}
O que deve ser rendido e atualizado é determinado automaticamente. As propriedades são registradas antes de chamar ChartRedraw() . Os eventos que não fizeram com que o gráfico fosse redesenhado são pulados.
Como está progredindo a biblioteca?
tudo está mais do que bem.
Eu também tenho o jeito de fazer uma biblioteca gráfica, apenas com os elementos que preciso.
O principal truque da biblioteca é seu motor de janelas:
Criação e eliminação do objeto OBJ_RECTANGLE_LABEL padrão
Isto implementa um método para alterar as propriedades do objeto OBJ_RECTANGLE_LABEL padrão, apressando-se através da ajuda e usando as propriedades de interesse
- fácil manuseio de eventos
Este é um manipulador de eventos externo, o nome do objeto de interesse (janela/item gráfico) pode ser especificado ao criá-loA etiqueta de texto é implementada via kanvas porque a largura e altura não podem ser alteradas no objeto OBJ_LABEL, e por este motivo a renderização é realizada quando ocorre um evento CHARTEVENT_ON_PAINT (requerendo redesenho)
O que deve ser rendido e atualizado é determinado automaticamente. As propriedades são registradas antes de chamar ChartRedraw() . Os eventos que não fizeram com que o gráfico fosse redesenhado são pulados.
A demonstração está em arquivo anexo, as fontes acima são usadas nele.
A demonstração não exibe todas as propriedades possíveis, apenas algumas delas:
Ainda é um trabalho em andamento, até agora.
A demonstração não exibe todas as propriedades possíveis, apenas algumas delas:
Ainda é um trabalho em andamento, por enquanto.
Boa sorte com o desenvolvimento! :)
Boa sorte com o desenvolvimento! :)
Obrigado :)
Testou a funcionalidade e o potencial dos gráficos 3D em MT5 em um computador fraco com 4 GB de RAM e 2 núcleos de processador.
Funciona bem, mesmo após uma longa pausa na programação. Mas a coisa é pesada e é preciso muito trabalho duro para criar algo sério.
Testou a funcionalidade e o potencial dos gráficos 3D em MT5 em um computador fraco com 4 GB de RAM e 2 núcleos de processador.
Funciona bem, mesmo após uma longa pausa na programação. Mas, a coisa é pesada e é preciso muito trabalho duro para desenvolver algo sério.
Para o HFT, acho que o 3D será útil para a análise gráfica do volume do copo e do fluxo do pedido.
Mas eu não sei como interpretar tais informações.
Meu Deus, para que serve tudo isso?