Diagramas tridimensionais - uma ferramenta profissional de análise de mercado
Introdução
Todo trader opera com preços e cotas em constante mudança. Todos procuram por correspondências e regularidades. Nós analisamos volumes, valores de indicadores diferentes, e muitos outros parâmetros. Eu não considero necessário lhe persuadir sobre os benefícios do MQL4 em termos de análise de mercado. Você pode simplesmente escrever um script e chegar a conclusões com base nos resultados. Geralmente a análise é conduzida com base em gráficos e diagramas que refletem certas correspondências de duas variáveis. Não há problema algum nisso, é claro, mas às vezes nós precisamos encontrar as correspondências de três variáveis e visualizá-las. Os diagramas 3D e as suas análises são usadas para este fim em todo o mundo. Este tipo de abordagem economiza tempo e dinheiro.
Neste artigo nós iremos escrever uma biblioteca simples para a construção de diagramas 3D e sua exibição posterior no Microsoft Excel. Nós usaremos as opções padrão do MQL4 para preparar e exportar os dados ao arquivo *.csv
O que é o formato de arquivo *.csv?
Trata-se de um arquivo de texto que armazena a sequência de valores, separados por um separador pré-definido, no nosso caso o ponto-e-vírgula - ";". Para desenhar uma tabela nós precisamos apenas escrever várias sequências de código. A vantagem deste formato é que ele é facilmente reconhecido e interpretado sob a forma de uma tabela pelo Microsoft Excel. E neste programa nós podemos facilmente criar um diagrama 3D com base nos dados adquiridos e analisá-lo.
Biblioteca generateCsv.
Para a inserção de dados rápida e simples, nós vamos criar uma biblioteca. Crie uma nova biblioteca e insira o código abaixo, em seguida salve-a com o nome generateCsv.mq4 na pasta "...MetaTrader\experts\bibliotecas". Então compile a biblioteca.
//+------------------------------------------------------------------+ //| generateCsv.mq4 | //| Copyright © 2006, Antonio Banderass. All rights reserved | //| banderassa@ukr.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Antonio Banderass. All rights reserved" #property link "banderassa@ukr.net" #property library //+------------------------------------------------------------------+ //| PrepareString | //+------------------------------------------------------------------+ string PrepareString(string s) { bool exit = false; int index = 0; string str = s; while(!exit) { index = StringFind(str, ".", index); if(index > -1) str = StringSetChar(str, index, ','); else exit = true; } return(str); } //+------------------------------------------------------------------+ //| GenerateCsv | //+------------------------------------------------------------------+ int GenerateCsv(string fileName, int arraySizeX, int arraySizeY, double arrayIndexX[], double arrayIndexY[], double arrayZ[][]) { int handle = FileOpen(fileName, FILE_CSV|FILE_WRITE, ' '), x, y; string str; if(handle1) { Print("Error:", GetLastError()); return(handle); } else { str = ";"; for(x = 0; x < arraySizeX; x++) { str = str + arrayIndexX[x]; str = str + ";"; } FileWrite(handle,PrepareString(str)); for(y = 0; y < arraySizeY; y++) { str = ""; str = str + arrayIndexY[y] + ";"; for(x = 0; x < arraySizeX; x++) { str = str + arrayZ[x,y]; str = str + ";"; } FileWrite(handle, PrepareString(str)); } } FileClose(handle); return(handle); }
Agora crie um novo arquivo de cabeçalho para o acesso às funções da biblioteca, chamado generateCsv.mqh, insira o código abaixo e salve-o na pasta "...MetaTrader\experts\include".
//+------------------------------------------------------------------+ //| generateCsv.mqh | //| Copyright © 2006, Antonio Banderass. All rights reserved | //| banderassa@ukr.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Antonio Banderass. All rights reserved" #property link "banderassa@ukr.net" #import "generateCsv.ex4" string PrepareString(string s); int GenerateCsv(string fileName, int arraySizeX, int arraySizeY, double arrayIndexX[], double arrayIndexY[],double arrayZ[][]);
Esta biblioteca simples consiste em duas funções. Vamos primeiro examinar o significado de cada função. A primeira função, PrepareString, tem como objetivo substituir os pontos de uma string por vírgulas. A questão é que, quando se escreve dados em um arquivo através do uso da função padrão FileWrite, os números inteiros e as frações são separadas por um ponto. E isso é inaceitável para nós, pois o Microsoft Excel reconhece os decimais apenas se as partes estiverem separadas por uma vírgula. É por isso que, quando vamos colocar dados no arquivo *.csv, nós chamamos esta função no corpo da função GenerateCsv. O único parâmetro da função é uma string, na qual nós precisamos substituir os pontos por vírgulas. Devolva o valor - uma nova string sem pontos. Note, por favor, que você não precisa chamar esta função, isto é feito pela segunda função de modo automático, quando necessário.
A função GenerateCsv é usada para escrever dados no formato *.csv em um arquivo. Aqui estão os seus parâmetros:
int GenerateCsv(string fileName, int arraySizeX, int arraySizeY, double arrayIndexX[], double arrayIndexY[], double arrayZ[][]);
- string fileName - nome de um arquivo a ser escrito, não esquecer de indicar o formato *.csv;
- int arraySizeX - a largura da matriz com os dados;
- int arraySizeY - a altura da matriz com os dados;
- double arrayIndexX[] - matriz dos valores da primeira variável;
- double arrayIndexY[] - matriz dos valores da segunda variável;
- double arrayZ[][] - matriz bidimensional dos valores da terceira variável;
Para entender o propósito de cada parâmetro, observe a figura:
Portanto tudo o que você precisa para escrever estes dados são três matrizes de valores para cada variável. Agora vamos ver como isso funciona.
Uso da biblioteca generateCsv
Crie um novo script chamado 3dGraphicOut e insira o código abaixo nela.
//+------------------------------------------------------------------+ //| 3dGraphicOut.mq4 | //| Copyright © 2006, Antonio Banderass. All rights reserved | //| banderassa@ukr.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Antonio Banderass. All rights reserved" #property link "banderassa@ukr.net" #include <generateCsv.mqh> #define ARRAY_SIZE_X 16 #define ARRAY_SIZE_Y 16 //+------------------------------------------------------------------+ //| start | //+------------------------------------------------------------------+ int start() { int x,y; double arrayIndexX[ARRAY_SIZE_X]; double arrayIndexY[ARRAY_SIZE_Y]; double arrayZ[ARRAY_SIZE_X,ARRAY_SIZE_Y]; for(x=0;x<ARRAY_SIZE_X;x++) arrayIndexX[x]=x/10.0; for(y=0;y<ARRAY_SIZE_Y;y++) arrayIndexY[y]=y/10.0; for(x=0;x<ARRAY_SIZE_X;x++) for(y=0;y<ARRAY_SIZE_Y;y++) arrayZ[x,y]=MathSin(arrayIndexX[x]+arrayIndexY[y]); GenerateCsv("test.csv",ARRAY_SIZE_X,ARRAY_SIZE_Y,arrayIndexX,arrayIndexY,arrayZ); return(0); }
Este é um modelo padrão, a partir do qual todo diagrama 3D deveria ser iniciado. Vamos examinar cada linha separadamente:
#include <generateCsv.mqh>
Inicie a biblioteca generateCsv.
#define ARRAY_SIZE_X 16 #define ARRAY_SIZE_Y 16
Aqui nós definimos as dimensões da tabela: ARRAY_SIZE_X - largura da tabela, ARRAY_SIZE_Y - altura.
int x,y;
Estes são dois índices da matriz. Como eles são usados muitas vezes, eu os coloquei no lado de fora do corpo do ciclo.
double arrayIndexX[ARRAY_SIZE_X];
Esta é uma matriz de valores da primeira variável. Suponha que você esteja analisando a influência de dois indicadores sobre o lucro. Neste caso os valores do primeiro indicador estarão localizados nesta matriz. Note, por favor, que você deveria começar com algum valor inicial, como zero, por exemplo, e então aumentá-lo a um determinado ritmo, como 0, por exemplo 5.
double arrayIndexY[ARRAY_SIZE_Y];
Os valores do segundo indicador são colocados nesta matriz. Também escolha o valor inicial e ritmo adequados.
double arrayZ[ARRAY_SIZE_X,ARRAY_SIZE_Y];
E esta deve conter o valor do lucro, dependendo dos valores do indicador. Novamente, observe a figura acima para entender os valores.
Preste atenção, o tipo da matriz é duplo. Isto as torna universais. Você também pode usar números inteiros (int) como os elementos das matrizes, pois o MQL4 tem uma transformação de tipo implícito.
for(x = 0; xARRAY_SIZE_X; x++) { // arrayIndexX[x]= ... ; }
Neste bloco nós preenchemos a matriz da primeira variável com valores. Não se esqueça: eles devem aumentar em um determinado ritmo.
for(y = 0; y < ARRAY_SIZE_Y; y++) { // arrayIndexY[y]= ... ; }
O mesmo se aplica à segunda variável.
for(x = 0; x < ARRAY_SIZE_X; x++) { for(y = 0; y < ARRAY_SIZE_Y; y++) { // arrayZ[x,y]= ... ; } }
E aqui está a parte mais interessante do modelo: nós preenchemos a matriz bidimensional com valores dependendo de duas outras variáveis.
GenerateCsv("test.csv",ARRAY_SIZE_X,ARRAY_SIZE_Y,arrayIndexX,arrayIndexY,arrayZ);
E, finalmente, escrevemos os dados no arquivo para a posterior análise no Microsoft Excel. Agora salve este modelo para uso futuro.
Um exemplo simples
Vamos examinar um exemplo bastante simples do uso da biblioteca. Eu intencionalmente não escrevi este exemplo com conexão a negociações, maximizando assim a sua simplicidade e disponibilidade.
//+------------------------------------------------------------------+ //| 3dGraphicOut.mq4 | //| Copyright © 2006, Antonio Banderass. All rights reserved | //| banderassa@ukr.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Antonio Banderass. All rights reserved" #property link "banderassa@ukr.net" #include <generateCsv.mqh> #define ARRAY_SIZE_X 16 #define ARRAY_SIZE_Y 16 //+------------------------------------------------------------------+ //| start | //+------------------------------------------------------------------+ int start() { int x,y; double arrayIndexX[ARRAY_SIZE_X]; double arrayIndexY[ARRAY_SIZE_Y]; double arrayZ[ARRAY_SIZE_X,ARRAY_SIZE_Y]; for(x=0;x<ARRAY_SIZE_X;x++) arrayIndexX[x]=x/10.0; for(y=0;y<ARRAY_SIZE_Y;y++) arrayIndexY[y]=y/10.0; for(x=0;x<ARRAY_SIZE_X;x++) for(y=0;y<ARRAY_SIZE_Y;y++) arrayZ[x,y]=MathSin(arrayIndexX[x]+arrayIndexY[y]); GenerateCsv("test.csv",ARRAY_SIZE_X,ARRAY_SIZE_Y,arrayIndexX,arrayIndexY,arrayZ); return(0); }
Salve o script de texto, compile-o e inicie-o no terminal. Agora abra a pasta "...MetaTraider\experts\arquivos\", um novo arquivo, "test.csv", deve aparecer ali. Abra-o usando o Microsoft Excel. O arquivo será transformado em uma tabela bidimensional, como mostrado abaixo.
Agora selecione todas as células (CTRL+A) e pressione "inserir" -> "tabela" (ALT+I,H):
Então selecione "tipo de tabela" -> "superfície, sub-tipo de tabela" -> "superfície 3D" e clique em "finalizar":
Um diagrama 3D irá aparecer:
Conclusão
Está agora disponível para você uma ferramenta conveniente para exportar dados rapidamente do terminal de negociação MetaTrader ao programa Microsoft Excel, para uma construção rápida de diagramas 3D e sua posterior análise. Agora você pode analisar as correspondências e regularidades do Forex entre três variáveis simultaneamente. Tente analisar a dependência de histogramas de lucro 3D em relação a parâmetros como TakeProfit e StopLoss, ou examinar a dependência de um gráfico de volumes em relação ao dia da semana e a hora atual. Eu acho que você irá encontrar muitas correspondências interessantes e úteis.
Traduzido do Inglês pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/en/articles/1443
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso