English Русский 中文 Español Deutsch 日本語 한국어 Français Italiano Türkçe
Uma biblioteca para construção de um gráfico pelo Google Chart API

Uma biblioteca para construção de um gráfico pelo Google Chart API

MetaTrader 5Exemplos | 24 janeiro 2014, 08:57
2 917 0
Евгений
Евгений

Introdução

O Google Chart permite a construção de 11 tipos diferentes de gráficos. Aqui estão eles:
  1. Gráficos de linha.
  2. Gráficos de barra.
  3. Gráficos de dispersão.
  4. Gráficos de radar.
  5. Gráficos candlestick.
  6. Gráficos de Venn.
  7. Códigos QR.
  8. Gráficos de mapa.
  9. Fórmulas.
  10. Tabela de gráficos.
  11. Gráficos de pizza.

Um conjunto para trabalho bem suficiente conforme foi afirmado na descrição dos artigos - tudo que você precisa para obter um gráfico pronto - é enviar uma consulta especialmente montada ao servidor do Google. Um simples exemplo de como fazer isso foi implementado no artigo Criando um painel de informações usando classes da biblioteca padrão e Google Chart API, mas isso não é nem a décima parte do que este serviço pode fornecer. Naturalmente, a fim de montar adequadamente uma solicitação, precisamos examinar sua estrutura e as palavras chave, assim, neste artigo, iremos tentar criar um biblioteca de classe, o uso do qual permitirá criar rapidamente o gráfico desejado e colocá-lo no gráfico, bem como atualizar dinamicamente os dados, com a base na qual o gráfico foi construído.

Deve ser observado imediatamente que não haverá comparações massivas do código da biblioteca neste artigo, mas em vez disso, haverá um certificado anexo, criado usando o Doxygen (detalhes no artigo Documentação gerada automaticamente para o código MQL5). Nele você conseguirá encontrar descrições de métodos públicos de classes de bibliotecas e documentação sobre enumerações e exceções, que surgem no processo de criação do gráfico.

1. Descrição dos meios de obter e exibir gráficos

Vamos começar do fim. Suponha que nós formulamos o pedido corretamente. Agora, você precisa enviá-lo para o servidor, gravar a resposta em um arquivo e anexar o arquivo a um objeto gráfico no gráfico para exibir a tabela. Para trabalhar com a internet nós utilizamos as funções descritas no artigo Utilizando WinInet.dll para troca de dados entre terminais através da internet.

Também, há um pequeno porém: os componentes, que são projetados para exibir imagens (etiqueta de gráfico e imagem) apenas funcionam com imagens no formato BMP, enquanto o Google Chart apenas devolve PNG ou GIF. Consequentemente, você precisará converter a imagem. Esse é o id um para converter a função Convert_PNG(). O código de função para obter o gráfico se parece com isso:

bool CDiagram::GetChart()
{
   if(!ObjExist()) {SetUserError(DIAGRAM_ERR_OBJ_NOT_EXIST); return false;}
   string request=CreateRequest();
   //Print(request);
   if(StringLen(request)>2048) {SetUserError(DIAGRAM_ERR_TOO_LARGE_REQUEST); return false;}
   //try to establish a connection
   int rv=InternetAttemptConnect(0);
   if(rv!=0) {SetUserError(DIAGRAM_ERR_INTERNET_CONNECT_FAILED); return false;}
   //initialize the structures
   int hInternetSession=InternetOpenW("Microsoft Internet Explorer", 0, "", "", 0);
   if(hInternetSession<=0) {SetUserError(DIAGRAM_ERR_INTERNET_CONNECT_FAILED); return false;}
   //send request
   int hURL=InternetOpenUrlW(hInternetSession, request, "", 0, 0, 0);
   if(hURL<=0) SetUserError(DIAGRAM_ERR_INTERNET_CONNECT_FAILED);
   //prepare the paths for conversion 
   CString src;
   src.Assign(TerminalInfoString(TERMINAL_PATH));
   src.Append("\MQL5\Files\\"+name+".png");
   src.Replace("\\","\\\\");
   CString dst;
   dst.Assign(TerminalInfoString(TERMINAL_PATH));
   dst.Append("\MQL5\Images\\"+name+".bmp");
   dst.Replace("\\","\\\\");
   DeleteFileW(dst.Str());
   DeleteFileW(src.Str());
   CFileBin chart_file;//file into which the results are recorded
                       //create it
   chart_file.Open(name+".png",FILE_BIN|FILE_WRITE);
   //****************************   
   int dwBytesRead[1];// number of recorded documents
   char readed[1000];//the actual data
                    //read the data, received from the server after the request
   while(InternetReadFile(hURL,readed,1000,dwBytesRead))
     {
      if(dwBytesRead[0]<=0) break;//no data - exit
      chart_file.WriteCharArray(readed,0,dwBytesRead[0]);//record the data into the file
     }
   InternetCloseHandle(hInternetSession);//terminate the connection
   chart_file.Close();//and file
   //convert the file
   if(!Convert_PNG(src.Str(), dst.Str())) SetUserError(DIAGRAM_ERR_IMAGE_CONVERSION_FAILED);
   //attach the file to the graphic object
   switch (obj_type)
   {
      case OBJ_BITMAP: 
      {
         ObjectSetString(chart_ID, name, OBJPROP_BMPFILE, name+".bmp"); 
         return true;
      }
      case OBJ_BITMAP_LABEL:
      {
         ObjectSetString(chart_ID, name, OBJPROP_BMPFILE, 0, name+".bmp"); 
         ObjectSetString(chart_ID, name, OBJPROP_BMPFILE, 1, name+".bmp"); 
         return true;
      }
      default: return false;
   }
   //redraw the chart   
   ChartRedraw();
}
Vale observar meu uso extenso de classes da Biblioteca padrão durante a criação da biblioteca do Google Charts, pelas quais estendo agradecimentos especiais a seus desenvolvedores.

2. Visão geral dos componentes da biblioteca do Google Chart

O pedido para o servidor deve começar como se segue: http://chart.apis.google.com/chart?cht = , adicionalmente, você precisa indicar o tipo do gráfico, e apenas então todos os outros parâmetros. O pedido, além do cabeçalho, consiste de comandos e seus parâmetros. Os comandos são divididos um do outro pelo símbolo "&". Por exemplo, o comando & Chtt = Title definirá a palavra "Title" no cabeçalho do gráfico.

Então vamos começar.

2.1 Gráficos de linha

Esse é talvez o gráfico mais frequentemente utilizado, que possui o maior número de propriedades. A construção do gráfico é realizada pela classe CLineXYChart. Exemplo:

CLineXYChart chart;
chart.Attach(0, "test diagram");
chart.SetSize(200,200);
double Y[10]={-50, -40, -25, -35, 10, 50, 70, 40, 15, 80};
chart.AddLine(Y, Red, 0, "Test line");
chart.GetChart();

Como resultado, no componente chamado "Diagrama de teste" você verá a seguinte imagem:

Figura 1. Um simples exemplo de construção de um gráfico de linha

Relembre que um certificado de métodos de classe pode ser encontrado anexado ao certificado, aqui estão alguns exemplos de seu uso.

Complique o gráfico adicionando outra linha do eixo e rede:

//create a copy of the class
CLineXYChart chart;
//attach it to the object constructed earlier
chart.Attach(0, "test diagram");
//set the size
chart.SetSize(200,200);
//prepare the data
double Y2[10]={-70, -5, 6, 8, 10, 20, 100, 130, 90, 60};
double Y[10]={-50, -40, -25, -35, 10, 50, 70, 40, 15, 80};
//add lines
chart.AddLine(Y, Red, 0, "Test line");
chart.AddLine(Y2, Blue, 0, "Test line 2");
//axis
chart.SetAxis(DIAGRAM_AXIS_BOTTOM|DIAGRAM_AXIS_LEFT, -1, 0, 0, 10, 0);
//and grid
chart.SetGrid();
//obtain the chart
chart.GetChart();

O gráfico agora tem a mesma visualização que na imagem abaixo. Vale observar uma característica importante - o método GetChart() deve chamar os outros métodos, porque é o método que recebe o gráfico.

Figura 2. Um exemplo mais complexo de um gráfico linear

E isso não é tudo. Adicione os marcadores, o título, a legenda e o conteúdo:

//create a class copy
CLineXYChart chart;
//attach it to the object created earlier
chart.Attach(0, "test diagram");
//set the size
chart.SetSize(500,300);
//prepare the data
double Y2[10]={-70, -5, 6, 8, 10, 20, 100, 130, 90, 60};
double Y[10]={-50, -40, -25, -35, 10, 50, 70, 40, 15, 80};
//add lines
int first_line=chart.AddLine(Y, Red, 0, "Test line");
int second_line=chart.AddLine(Y2, Blue, 0, "Test line 2");
//axis
chart.SetAxis(DIAGRAM_AXIS_BOTTOM|DIAGRAM_AXIS_LEFT, -1, 0, 0, 10, 0);
//grid
chart.SetGrid();
//legend
chart.ShowLegend();
//title
chart.SetTitle("My Chart", Green, 15);
//filling
chart.SetFill(Linen);
//markers
chart.SetLineMarker(first_line, DIAGRAM_LINE_MARKERS_DIAMOND, BlueViolet, 10);
chart.SetLineMarker(second_line, DIAGRAM_LINE_MARKERS_CROSS, YellowGreen, 15);
//obtain the chart
chart.GetChart();

Para a configuração das propriedades, que são únicas de uma linha em particular, utilizamos identificadores (first_line e second_line), que são então enviados para os métodos apropriados.

Figura 3. Um exemplo ainda mais b complexo de um gráfico de linhas

Mas isso não é o fim. Há uma possibilidade de adicionar etiquetas à linha, preenchendo na área abaixo da linha e entre as linhas, escalando as linhas, e adicionando uma linha ao eixo menor:

//create a class copy
CLineXYChart chart;
//attach it to the object created earlier
chart.Attach(0, "test diagram");
//set the size
chart.SetSize(700,400);
//prepare the data
double Y3[10]={1000, 1200, 1800, 1700, 1300, 900, 700, 750, 800, 600};
double X3[10]={2, 4, 5, 6, 10, 15, 17, 20, 21, 23};
double Y2[10]={-70, -5, 6, 8, 10, 20, 100, 130, 90, 60};
double Y[10]={-50, -40, -25, -35, 10, 50, 70, 40, 15, 80};
//add lines
int first_line=chart.AddLine(Y, Red, 0, "Test line");
int second_line=chart.AddLine(Y2, Blue, 0, "Test line 2");
int third_line=chart.AddLine(Y3, X3, Green, 0, "Test line 3");
//major axis
chart.SetAxis(DIAGRAM_AXIS_BOTTOM|DIAGRAM_AXIS_LEFT, -1, 0, 0, 10, 0);
//minor axis 
chart.SetAxis(DIAGRAM_AXIS_RIGHT|DIAGRAM_AXIS_TOP, third_line, 0, Red, 15, 2);
//grid
chart.SetGrid();
//legend
chart.ShowLegend(DIAGRAM_LEGEND_POSITION_BOTTOM_HORIZONTAL);
//title
chart.SetTitle("My Chart", Green, 15);
//filling in the chart
chart.SetFill(Linen, Silver);
//markers
chart.SetLineMarker(first_line, DIAGRAM_LINE_MARKERS_DIAMOND, BlueViolet, 10);
chart.SetLineMarker(second_line, DIAGRAM_LINE_MARKERS_CROSS, YellowGreen, 15);
//set the filling between the two lines
chart.SetLineFilling(first_line, Lime , second_line);
//add tags
chart.AddLabel(first_line, DIAGRAM_LABEL_TYPE_FLAG, 5, "Flag", Red, 15); 
chart.AddLabel(second_line, DIAGRAM_LABELS_TYPE_ANNOTATION, 3, "annotation", Blue, 25);
//slightly compress the lines (by 20%)
chart.SetLineScaling(second_line, false, 20);
//attach the third line to the minor axis
chart.SetLineScaling(third_line, true, 20);
//obtain the chart
chart.GetChart();

Figura 4. Todas as características de um gráfico de linha

Se você quer atualizar os dados do gráfico de forma dinâmica, então você pode usar o método SetLineData(), ou completamente remover a linha com os dados antigos, utilizando DeleteLine(), e criar uma nova. No entanto, o primeiro método é de maior preferência.

2.2 Gráficos de barra

Em outras palavras, isso é um gráfico de barras. A classe CBarChart é responsável por construir ele. Isso difere de CLineXYChart devido a ausência dos marcadores, a necessidade de especificar um conjunto de dados para o eixo X, e a presença de certas características, que são únicas para o gráfico de seu tipo. Em todos os outros aspectos tudo é igual à CLineXYChart.

Exemplo:

CBarChart chart;
chart.Attach(0, "test diagram");
//set the size
chart.SetSize(700,400);
//prepare the data
double Y3[10]={100, 120, 18, 17, 13, 9, 70, 75, 80, 60};
double Y2[10]={70, 5, 6, 8, 10, 20, 100, 130, 90, 60};
double Y[10]={50, 40, 25, 35, 10, 50, 70, 40, 15, 80};
//add lines
int first_line=chart.AddLine(Y, Red, 0, "Test bar 1");
int second_line=chart.AddLine(Y2, Blue, 0, "Test bar 2");
int third_line=chart.AddLine(Y3, Green, 0, "Test bar 3");
//major axis
chart.SetAxis(DIAGRAM_AXIS_BOTTOM|DIAGRAM_AXIS_LEFT, -1, 0, 0, 10, 0);
//grid
chart.SetGrid();
//legend
chart.ShowLegend();
//title
chart.SetTitle("My Chart", Green, 15);
//chart filling
chart.SetFill(Linen, Silver);
//obtain the chart
chart.GetChart(); 

Figura 5. Um exemplo de um gráfico de barras

Por favor observe que nós possuímos três conjuntos de dados, e as barras são localizadas acima uma das outras e em uma ordem ótima para exibição. No entanto, há uma outra forma de agrupar as colunas. é definido utilizando o método SetGrouped():

 / / Set the grouping  chart.SetGrouped (true);

Figura 6. Exemplo de um gráfico de barras com uma forma diferente de agrupar as colunas

Como você pode ver, agora as não colunas são localizadas acima umas das outras, mas por ordem de criação.

2.3 Gráfico de pizza

A classe CPieChart constrói um gráfico de pizza. Você pode criar um gráfico bidimensional, assim como um tridimensional:

CPieChart chart;
chart.Attach(0, "test diagram");
//set the size
chart.SetSize(300,200);
//add sections
chart.AddPieSlice(10, 0, Red, 0, "Test slice 1");
chart.AddPieSlice(20, 0, Green, 0, "Test slice 2");
chart.AddPieSlice(30, 0, Blue, 0, "Test slice 3");
//legends
chart.ShowLegend();
//title
chart.SetTitle("My Chart", Green, 15);
//display mode - 2D
chart.SetPieType(true);
//obtain the chart
chart.GetChart();  

Figura 7. Exemplos 2D e 3D de gráficos de pizza

Figura 7. Exemplos 2D e 3D de gráficos de pizza

O tipo de exibição (2D ou 3D) é estabelecido chamando o método SetPieType(). Outro recurso útil é a capacidade de definir vários anéis, porém, neste caso, apenas o modo 2D estará disponível. Para configurar o segundo anel, especifique o parâmetro dimensional do método AddPieSlice() como diferente de zero.

//add the second ring
chart.AddPieSlice(50, 1, YellowGreen, 0, "Test ring 1");
chart.AddPieSlice(20, 1, Magenta, 0, "Test ring 2");
chart.AddPieSlice(70, 1, Maroon, 0, "Test ring 3");

Figura 8. Gráfico de pizza concêntrico

Observe que o gráfico acima também contém etiquetas de setor remotas. Elas são configuradas pelo método SetPieLabels(), e podem substituir uma legenda. No entanto, há uma desvantagem - o tamanho das etiquetas não é automaticamente adaptado ao tamanho do gráfico, o que pode levar elas a transbordar além de seus limites. Em tal caso, você precisa aumentar a largura do gráfico. A configuração das grades, eixos, marcadores e escalas não é fornecida neste tipo de gráfico. O setor pode ser removido pelo método DeleteLine().

2.4 Gráfico de radar

A classe CRadarChart constrói gráficos de radar. Ela não possui diferenças da classe CLineXYChart. Todos os seus métodos estão disponíveis em CRadarChart:

CRadarChart chart;
chart.Attach(0, "test diagram");
//set the size
chart.SetSize(300,300);
//add lines
double Y3[10]={100, 120, 18, 17, 13, 9, 70, 75, 80, 60};
double Y2[10]={70, 5, 6, 8, 10, 20, 100, 130, 90, 60};
double Y[10]={50, 40, 25, 35, 10, 50, 70, 40, 15, 80};
int first_line=chart.AddLine(Y, Red, 0, "Test line");
int second_line=chart.AddLine(Y2, Blue, 0, "Test line 2");
int third_line=chart.AddLine(Y3, Green, 0, "Test line 3");
//set the filling between the two lines
chart.SetLineFilling(first_line, Lime , second_line);
//markers
chart.SetLineMarker(first_line, DIAGRAM_LINE_MARKERS_CIRCLE, BlueViolet, 10);
chart.SetLineMarker(second_line, DIAGRAM_LINE_MARKERS_DIAMOND, YellowGreen, 15);
//title
chart.SetTitle("My Chart", Green, 15);
//grid
chart.SetGrid();
//legend
chart.ShowLegend(DIAGRAM_LEGEND_POSITION_BOTTOM_HORIZONTAL);
//obtain the chart
chart.GetChart();

Figura 9. Gráficos de radar

2.5 Gráfico candelabro

A classe CCandleChart constrói o gráfico candelabro. Os candelabros são adicionados pelo método AddCandles():

CCandleChart chart;
chart.Attach(0, "test diagram");
//set the size
chart.SetSize(300,300);
//add 10 candlesticks to the current chart
double Open[10], Close[10], High[10], Low[10];
CopyOpen(Symbol(), PERIOD_CURRENT, 0, 10, Open);
CopyClose(Symbol(), PERIOD_CURRENT, 0, 10, Close);
CopyHigh(Symbol(), PERIOD_CURRENT, 0, 10, High);
CopyLow(Symbol(), PERIOD_CURRENT, 0, 10, Low);
chart.AddCandles(Open, Close, High, Low);
//title
chart.SetTitle(Symbol(), Green, 15);
//grid
chart.SetGrid();
//major axis
chart.SetAxis(DIAGRAM_AXIS_LEFT, -1, 0, 0, 10, 4);
//obtain the chart
chart.GetChart();

Figura 10. Gráfico candelabro

Mercados, legendas e rótulos não estão disponíveis para esse tipo de gráfico.

2.6 Fórmulas

A classe CFormulaChart permite a você criar uma fórmula. A fórmula é passada na forma de uma linha na linguagem TeX para o método SetFormulaString():

CFormulaChart chart;
chart.Attach(0, "test diagram");
//set the size
chart.SetSize(300,75);
//add the formula
chart.SetFormulaString("x=-b\pm\sqrt{b^2-4ac}\over(2a)");
//its color
chart.SetFormulaColor(Blue);
//title
chart.GetChart();

Figura 11. Fórmulas

O preenchimento também pode ser configurado utilizando o método SetFill(). Nenhuma outra característica adicional é suportada.

2.7 Tabela de gráficos

A classe CGraphChart constrói a tabela. Os métodos AddNode() e AddEdge() adicionam observações e bordas à tabela:

CGraphChart chart;
chart.Attach(0, "test diagram");
//set the size
chart.SetSize(300,220);
//add nodes and edges
int A=chart.AddNode("A");
int B=chart.AddNode("B");
int C=chart.AddNode("C");
int D=chart.AddNode("D");
chart.AddEdge(A,B);
chart.AddEdge(B,C);
chart.AddEdge(C,D);
chart.AddEdge(A,C);
//set the engine
chart.SetEngine(DIAGRAM_GRAPH_ENGINE_NEATO);
//and arrows
chart.SetGraphType(false);
//title
chart.GetChart();

Figura 11. Gráficos

O método SetEngine() configura um tipo específico de sistema gráfico, utilizado na construção do gráfico. Você pode experimentar com isso você mesmo. Os métodos DeleteNode() e DeleteEdge() adicionam observações e bordas à tabela.

2.8 Gráficos de Venn

A classe CVennChart constrói um gráficos de Venn.

O método SetCircleSizes () determina o tamanho dos conjuntos, SetCircleColors(), sua cor, SetVennLegend() suas assinaturas, e SetIntersections() as dimensões das interseções:

CVennChart chart;
chart.Attach(0, "test diagram");
//set the size
chart.SetSize(300,220);
//add sets(set their sizes)
chart.SetCircleSizes(100, 90, 80);
//color
chart.SetCircleColors(Yellow, Lime, Maroon);
//signatures
chart.SetVennLegend("EURUSD", "USDJPY", "EURJPY");
//dimensions of intersections
chart.SetIntersections(30,30,30,10);
//legend
chart.ShowLegend();
//title
chart.SetTitle("Venn", Green, 15);
//title
chart.GetChart();

Figura 11. Gráficos de Venn

Códigos QR

A classe CQRCode permite a você criar um código QR:

CQRCode chart;
chart.Attach(0, "test diagram");
//set the size
chart.SetSize(300,220);
//add data
chart.SetData("test data");
//set the level of error correction during coding
chart.SetErrCorrection(DIAGRAM_QRCODE_ERROR_CORRECTION_LOW);
//and the coding
chart.SetEncoding(DIAGRAM_QRCODE_ENCODING_UTF_8);
//title
chart.GetChart();

Figura 11. Código QR

O método SetData() configura os dados, baseado em qual código será criado. Os métodos SetErrCorrection() e SetEncoding() definirão a correção de erros durante a codificação e a codificação.

2.10 Gráficos de mapa

A classe CMapChart criará um mapa do mundo ou continente, com a possibilidade para selecionar os países necessários:

CMapChart chart;
chart.Attach(0, "test diagram");
//set the size
chart.SetSize(440,220);
//set the region
chart.SetZoomArea(DIAGRAM_MAP_AREA_AFRICA);
//and the country
chart.SetCountries("DZEGMGAOBWNGCFKECGCVSNDJTZGHMZZM");
//color
chart.SetColors(White, Red, Blue);
//color of the ocean - blue (2nd parameter)
chart.SetFill(Gray, Blue);
//title
chart.GetChart();

Figura 11. Mapa da áfrica

Os códigos dos países necessários são transmitidos pelo método SetCountries() no formato ISO 3166-1-alpha-2. SetZoomArea() configura o mapa do continente, e SetColors() a cor dos países.

2.11 Gráficos de dispersão

A classe CScatterChart constrói gráficos de dispersão. A única diferença de CLineXYChart é a forma que os dados são especificados.

Aqui, de forma a especificar os dados, nós utilizamos o método AddLineScatter(), no qual as coordenadas dos pontos e suas dimensões são transmitidas:

//create a class copy
CScatterChart chart;
//attach it to the object created earlier
chart.Attach(0, "test diagram");
//set the size
chart.SetSize(300,300);
//prepare the data
double Y2[10]={70, 5, 6, 8, 10, 20, 100, 130, 90, 60};
double X2[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
double Z2[10]={90, 80, 75, 90, 10, 700, 80, 90, 90, 88};
double Y[10]={50, 40, 25, 35, 10, 50, 70, 40, 105, 80};
double X[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
double Z[10]={60, 90, 90, 80, 70, 90, 73, 80, 77, 100};
//add the scatters
int first_line=chart.AddLineScatter(Y, X, Z, Red, 0, "scatters 1");
int second_line=chart.AddLineScatter(Y2, X2, Z2, Blue, 0, "scatters 2");
//major axis
chart.SetAxis(DIAGRAM_AXIS_BOTTOM|DIAGRAM_AXIS_LEFT, -1, 0, 0, 10, 0);
//grid
chart.SetGrid();
//legend
chart.ShowLegend(DIAGRAM_LEGEND_POSITION_BOTTOM_HORIZONTAL);
//title
chart.SetTitle("My Chart", Green, 15);
//filling the chart
chart.SetFill(Linen, Silver);
//obtain the chart
chart.GetChart();

Figura 11. Gráficos de dispersão

Conclusão

Espero, estimado leitor, que esta biblioteca facilite sua difícil vida como negociante. Gostaria de adicionar que utilizar o OOP simplifica significativamente a criação de projetos de grande escala, torna-os mais flexíveis e fáceis para o usuário.

Boa sorte.

Anexos:


Nome do arquivo
Descrição
1
google_charts.mqh Biblioteca, colocada em MQL5 \\ Include
2
google_charts_test.mq5 Script do teste, colocado em MQL5 \\ Script
3
google_charts_help.zip Arquivo com documentação gerada por Doxygen para as classes da biblioteca
4 Libraries.zip Arquivo com bibliotecas e seus códigos fonte, extraia em MQL5\\Libraries (bibliotecas escritas com C++ Builder)

Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/114

Arquivos anexados |
google_charts.mqh (122.64 KB)
libraries.zip (184.93 KB)
Uma solução livre de DLL para comunicação entre os terminais MetaTrader utilizando pipes nomeados Uma solução livre de DLL para comunicação entre os terminais MetaTrader utilizando pipes nomeados
O artigo descreve como implementar a Comunicação Interprocesso entre os terminais do cliente MetaTrader 5 usando pipes nomeados. Para o uso de pipes nomeados, a classe CNamedPipes é desenvolvida. Para o teste de seu uso e medir a conexão por ele, o indicador de tick, o servidor e os scripts do cliente são apresentados. O uso de pipes nomeados é suficiente para cotas em tempo real.
O uso de ORDER_MAGIC para negociação com diferentes consultores especialistas em um único instrumento O uso de ORDER_MAGIC para negociação com diferentes consultores especialistas em um único instrumento
Este artigo considera as questões de codificação de informação, usando a identificação mágica, assim como a divisão, montagem e sincronização de negociação automática de diferentes Expert Advisors. Este artigo será interessante para iniciantes, assim como para negociantes mais experientes, porque trata da questão das posições virtuais, o que pode ser útil na implementação de sistemas completos de sincronização de Expert Advisors e várias estratégias.
Escrevendo um Expert Advisor utilizando a abordagem de programação orientada a objeto do MQL5 Escrevendo um Expert Advisor utilizando a abordagem de programação orientada a objeto do MQL5
Este artigo foca na abordagem orientada a objeto para fazer o que fizemos no artigo "Guia passo a passo para escrever um Expert Advisor no MQL5 para iniciantes" - criando um simples Expert Advisor. A maior parte das pessoas acha que isso é difícil, mas quero assegurá-lo que quando você terminar de ler esse artigo, você será capaz de escrever o seu próprio consultor especialista que é baseado em orientação a objeto.
Os princípios do cálculo econômico de indicadores Os princípios do cálculo econômico de indicadores
Chamadas para usuário e indicadores técnicos ocupam um espaço muito pequeno no código do programa dos sistemas de negócio automatizado. Geralmente, são apenas algumas linhas de código. Mas, o que geralmente acontece é que essas poucas linhas de código são as que usam a maior parte do tempo, tempo que precisa ser gasto em teste do Expert Advisor. Então, tudo que está relacionado com cálculos de dados dentro de um indicador, precisa ser considerado mais a fundo do que só ser visto de relance. Este artigo falará precisamente sobre isso.