programação
Agora você está lendo
MQL Praticamente. Algo Trader cz. Eu [curso de programação]
0

MQL Praticamente. Algo Trader cz. Eu [curso de programação]

criado Radek SzafronJulho 4 2019

No episódio de hoje, começaremos a trabalhar em softwares que permitirão que você aproveite as oportunidades oferecidas pelo comércio algorítmico e, ao mesmo tempo, mantenha o controle máximo sobre o curso dos eventos. Vamos nos concentrar em idéias que permitem que você se envolva em negociações reais, maximizando a operação intuitiva e a flexibilidade da função. No software, usamos uma interface, cuja forma é considerada por muitos como padrão na indústria de negociação diária e é frequentemente chamada de escada de preço

algotrader

Algo Trader - Interface

Plano de projeto

Vamos dividir o trabalho em vários estágios, porque além do manuseio extenso de pedidos, o Algo Trader permitirá que você execute algoritmos que irão gerenciar automaticamente a posição de acordo com várias combinações que você pode criar dependendo da situação que você encontrará no mercado.

Na parte de hoje, daremos o primeiro passo no mundo da programação orientada a objetos e lançaremos uma parte elementar do nosso projeto relacionado à interface e operação das operações básicas.

Nos próximos episódios começaremos a trabalhar nos primeiros algoritmos. No início, criaremos um algoritmo GTP que garantirá que a posição seja fechada com o lucro esperado, independentemente de quantos pedidos forem feitos. Em seguida, vamos criar o algoritmo OOO (One Opens the Other, exatamente, ainda não foi) e, finalmente, um algoritmo que permite o escalpelamento durante a apresentação de importantes dados macro. Juntamente com os algoritmos, aqui e ali, vamos adicionar algum gadget legal.

Formação técnica

Você encontrará o pacote com os arquivos necessários hoje, seguindo este link:

Usar o software significa aceitar a licença anexada ao conjunto de arquivos.

Para que o software funcione corretamente, você precisa de uma versão do Microsoft NET Framework de min. 4.6.1 Runtime, que você pode baixar aqui:

Programação orientada a objetos

Vamos criar nosso software usando programação de objetos, um método de programação que permite a ordenação lógica de fragmentos de algoritmos no chamado objetos cuja tarefa é realizar funções separadas e se comunicar com outros objetos, a fim de implementar a tarefa do programa como um todo. Para ir além, precisaremos entender quais objetos são na prática e como eles são criados. Para este propósito, dê uma olhada no seguinte artigo no Wikilivros, que - baseado no exemplo da linguagem C ++ na qual o MQL4 é baseado - permite que você entenda o básico.

LEIA O ARTIGO

Primeira classe

Como você pode ver, tudo gira em torno da palavra-chave classe. Permite definir um objeto que você pode criar com uma palavra-chave novo. Abra o arquivo contendo a definição de uma das classes que usaremos hoje, o arquivo ChartOperations.mqhque você encontrará no catálogo MQL4 \ Include \ AlgoTrader_v10.

classe cChartOperations { público: cChartOperations(int largura, int altura) { // ... } anular OnClick(int x, int y) { // ... } anular OnChartChange() { // ... } private: int Chart_width; int Chart_height; uint Last_click; int Last_click_x, Last_click_y; bool IsDoubleClick(int x, int y) { // ... } };

 

 

Cada classe tem um construtor, que na prática é uma função que é automaticamente chamada quando o objeto é criado. O construtor tem o mesmo nome do objeto e pode receber parâmetros. Em nosso trecho de código acima, criamos um construtor da seguinte forma:

cChartOperations(int largura, int altura) { }

 

Depois de criar o construtor, podemos definir os componentes da classe, ou seja, funções e variáveis. Eles são definidos exatamente como no caso de funções ordinárias e variáveis ​​com a diferença que no corpo da classe. Preste atenção às suas palavras-chave público: oraz private:. Todas as funções e variáveis ​​após a palavra público: estará disponível para funções encontradas em outras partes do software, por exemplo, na função API OnTick () ou outros objetos. Privado no entanto, ele informa ao compilador que os elementos definidos nesta parte são estritamente confidenciais e que ninguém, além de um determinado objeto, naturalmente tem acesso a eles.

Aplicações de objetos

O que cria objetos tão úteis? Entre outras coisas, é que, uma vez que o objeto definido possa ser criado em qualquer número de cópias e dependendo dos parâmetros passados ​​para eles, eles se comportarão de maneira diferente, mas de uma maneira que possamos analisar e controlar. Além disso, os objetos permitem a organização legível do código, dividindo os componentes do algoritmo em elementos extraídos, e um objeto adequadamente projetado pode ser usado em um software completamente diferente, o que permite que você crie aplicativos complexos com eficiência.


consultores especializados


Nós começamos o primeiro objeto

Vamos para o arquivo principal do nosso software, arquivo AlgoTrader_v10.mq4que você encontrará no catálogo MQL4 \ Experts \.

Vamos dar uma olhada na definição da API abaixo Oninit ():

cChartOperations* ChartOperations = NULL; int OnInit() { // (...) int chart_width = (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS); int chart_height = (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS); ChartOperations = novo cChartOperations(chart_width, chart_height); retorno(INIT_SUCCEEDED); }

Apontador

Na parte do arquivo responsável pela definição de variáveis ​​globais usando um fragmento de código ...

cChartOperations* ChartOperations = NULL;

 

... nós criamos os chamados apontador ou seja, um ponteiro que irá conter um endereço para um lugar na memória do computador, onde o nosso objeto será criado mais tarde. Usando o ponteiro, poderemos nos referir ao objeto e chamar suas funções. ponteiros nós definimos similarmente a variáveis, o primeiro elemento de notação é o tipo de objeto, então colocamos o asterisco * , após o qual definimos um nome exclusivo para o objeto, que posteriormente usaremos para referências. Para o nosso apontador nós atribuímos uma variável NULL, que diz que no estágio atual ainda não indica nenhum objeto.

construtor

Mais tarde no código, no corpo da função Oninit () nós criamos o objeto certo usando uma palavra-chave novo.

ChartOperations = novo cChartOperations(chart_width, chart_height);

 

Po novo chamamos o construtor do objeto, que no nosso caso leva duas variáveis ​​informando o objeto sobre as dimensões do nosso gráfico, porque precisamos dele para posicionar corretamente a nossa interface. O construtor chamado encaminha o endereço do objeto recém-criado na memória do computador para o nosso apontador nomeado ChartOperations.

destruidor

Objetos são um tipo especial de dados, que, se o criarmos, devemos garantir que ele seja finalmente removido da memória do computador. Tudo isso para que, na frente de seu laptop, você não precise ser um servidor enorme que reúna dados criados anteriormente que não são mais necessários para ninguém.

Para excluir objetos, usamos a palavra-chave excluirdepois disso colocamos o nosso nome poinera indicando qual objeto queremos dizer. Nós removemos nosso objeto somente na função API OnDeinit (...)porque precisamos disso durante todo o ciclo de vida da aplicação, até que o software seja desligado.

anular OnDeinit(const int razão) { // (...) excluir ChartOperations; }

Trabalhar com objetos

Vamos ver agora como podemos usar nosso objeto criado para as necessidades do nosso aplicativo. Para este propósito no corpo da classe cChartOperations Nós definimos várias funções. Vamos dar uma olhada em um deles:

anular OnClick(int x, int y) { if(IsDoubleClick(x, y)) GoToPrice(x, y); }

 

função OnClick (...) Precisamos comunicar à nossa interface quais níveis de preço são interessantes para nós. Ao clicar duas vezes no gráfico, o algoritmo definirá nossa escala de preços no local indicado. Para que nossa função funcione, precisamos detectar o momento em que clicamos no gráfico e, aqui, a função da API ajuda OnChartEvent (...)

anular OnChartEvent(const int id const longo & lparam, const duplo & dparam, const corda & spar) { // (...) if(id == CHARTEVENT_CLICK) ChartOperations.OnClick((int)lParam (int)dparam); }

 

O snippet de código acima reconhece o momento em que o usuário clica no gráfico e, em seguida, chama a função que está dentro do nosso objeto criado anteriormente. Chamar uma função consiste em colocar um ponto depois do nosso nome apontador ao objeto e, em seguida, passando o nome da função em que estamos interessados, juntamente com os parâmetros necessários, que no nosso caso indicam as coordenadas xey do local no gráfico em que o clique foi feito.

Primeiros efeitos

Os procedimentos criados por nós lançaram a primeira funcionalidade do software, que podemos testar compilando nosso programa e clicando em um gráfico diferente. Abaixo, você encontrará um gráfico que apresenta algumas funções que permitem manipular os níveis de preços exibidos em nossa interface gráfica.

programação mql

Algo Trader - Mouse e níveis de preços

Segunda classe

Desde que você foi promovido para a segunda série e nosso clique não é desperdiçado, nós projetaremos uma segunda instalação que permitirá que você faça pedidos a partir do nível de nossa escada. Para este propósito, preparamos a classe apropriada, que você encontrará no arquivo MQL4 \ Include \ AlgoTrader_v10 \ OrderOperations.mqh

classe cOrderOperations { público: cOrderOperations(int position_id) { Position_id = position_id; } anular OnTimer200ms() { ProcessOrderRequests(); } private: int Position_id; anular ProcessOrderRequests() { sOrderRequest solicitar = ReadOrderRequest(); if(request.Request_id <= 0) voltar; if(request.Order_symbol != Símbolo() || request.Position_id != Position_id) { request.Request_status = ORDER_REQUEST_STATUS_FAILED; request.Request_error = ORDER_REQUEST_ERROR_WRONG_POSITION; voltar; } if(OrderSend(request.Order_symbol, request.Order_type, request.Order_volume, request.Order_price, 0, 0, 0, request.Order_comment, request.Position_id) > 0) { request.Request_status = ORDER_REQUEST_STATUS_COMPLETED; } outro { request.Request_status = ORDER_REQUEST_STATUS_FAILED; request.Request_error = _LastError; } UpdateOrderRequest(solicitar); } };

No código acima você pode ver a definição completa do objeto cOrderOperationsque será usado para lidar com pedidos que colocaremos em nossa escada de preços. Preste atenção na função ProcessOrderRequests ()em que nosso programa se comunica com a biblioteca dll usando a função ReadOrderRequest ().

estruturas

função ReadOrderRequest () como resultado de sua ação retorna uma estrutura de tipo sOrderRequest, que é um conjunto de dados definidos por nós com um pedido feito através da interface.

anular ProcessOrderRequests() { sOrderRequest solicitar = ReadOrderRequest(); // (...) }

As estruturas são irmãs mais novas de classes que permitem criar um bloco de dados contendo muitas variáveis. Isso permite o ordenamento lógico de informações relacionadas a um determinado problema. Em nosso caso, a estrutura coleta dados sobre o pedido enviado pela nossa interface gráfica, como o preço de abertura ou o volume. Nós definimos uma estrutura precedendo seu nome com uma palavra-chave structe depois definimos uma lista dos dados de que precisamos.

struct sOrderRequest { int request_id; int Position_id; int ORDER_TYPE; duplo Order_volume; duplo Order_price; duplo Order_range; corda Order_symbol; corda Order_comment; int Request_status; int Request_error; };

 

A definição acima pode ser encontrada no arquivo MQL4 \ Include \ AlgoTrader_v10 \ Definitions.mqh.

Usamos estruturas de forma semelhante às variáveis, na primeira etapa, precisamos criá-las especificando o tipo de estrutura e, em seguida, fornecer um nome exclusivo, ao qual podemos nos referir posteriormente. No exemplo a seguir, criamos uma estrutura de tipos sOrderRequest e nós damos um nome único solicitare depois atribuímos dados de nossa interface usando funções ReadOrderRequest ().

anular ProcessOrderRequests() { sOrderRequest solicitar = ReadOrderRequest(); // (...) }

 

O acesso aos dados armazenados na estrutura é análogo ao uso de variáveis, porque, na prática, a estrutura é apenas um conjunto de variáveis ​​ocultas sob um identificador comum. Para ler ou escrever dados na estrutura, basta após o nome que atribuímos para colocar um ponto e, em seguida, indicar o nome da variável que nos interessa. No fragmento a seguir do código, lemos os dados armazenados na estrutura para enviar o pedido e, em seguida, salvamos as informações sobre o resultado da operação.

if(OrderSend(request.Order_symbol, request.Order_type, request.Order_volume, request.Order_price, 0, 0, 0, request.Order_comment, request.Position_id) > 0) { request.Request_status = ORDER_REQUEST_STATUS_COMPLETED; }

Execução de pedidos

Para que nosso software envie pedidos, devemos implementar o objeto criado com base na classe cOrderOperations. Porque precisaremos do objeto desde o lançamento do nosso programa, nós o criamos na função API Oninit ().

entrada int Position_id = 8821; // O identificador exclusivo do item cOrderOperations* OrderOperations = NULL; int OnInit() { EventSetMillisecondTimer(200); // (...) OrderOperations = novo cOrderOperations(Position_id); retorno(INIT_SUCCEEDED); }

 

No construtor cOrderOperations nós colocamos uma variável Position_id, que faz parte das configurações de nosso aplicativo disponíveis na janela padrão da plataforma MetaTrader. O identificador permite que nosso software reconheça seus próprios pedidos para que não haja confusão com pedidos de outras fontes.

Nós também lançamos o código acima Cronômetro com o intervalo 200 ms, porque nosso objeto deve verificar periodicamente se a interface envia informações sobre o pedido recebido.

anular NoCronômetro() { // (...) OrderOperations.OnTimer200ms(); }

 

A função do objeto OnTimer200ms () vai chamar uma função ProcessOrderRequests ()quem fará o pedido quando receber os dados apropriados da interface.

classe cOrderOperations { público: cOrderOperations(int position_id) { Position_id = position_id; } anular OnTimer200ms() { ProcessOrderRequests(); } // (...) };

efeito

Nosso software já pode se comunicar com a interface gráfica e podemos fazer o que mais gostamos, isto é, compilar o algoritmo e enviar um novo pedido. Para ajudar você a começar os primeiros passos abaixo, você encontrará algumas dicas que ilustram quais funções estão ocultas sob diferentes chaves.

Controle de volume

volume de negociação forex

Algo Trader - Manuseio de volume

Tipos de pedidos

negociação de algo

Algo Trader - Tratamento de pedidos

soma

Isso é tudo por hoje, mas é apenas o começo da aventura com Algo Trader. No próximo episódio, passaremos para a implementação de funções avançadas relacionadas ao suporte de algoritmos. Algo Trader será criado junto com você e ficaremos gratos por quaisquer idéias e comentários que possam torná-lo melhor para você. Adoraríamos ouvir de você em biuro@expertadvisors.pl .

O que você acha disso?
Eu
70%
interessante
20%
Heh ...
10%
Chocar!
0%
Eu não gosto
0%
ferimento
0%
Sobre o autor
Radek Szafron
A autora da publicação é Radek Szafron, proprietária da empresa Expert Advisors, que por muitos anos tem apoiado investidores, fornecendo tecnologias dedicadas ao mercado FOREX. O autor é um graduado da Escola de Economia de Varsóvia com a especialização "Mercados Financeiros" e um programador com experiência de verão quase 20. A empresa implementa projetos de algoritmos e aplicativos escritos em todas as linguagens da família "C", incluindo plataformas populares Meta Trader 4 e 5. Expert Advisors pode ser encontrado em www.expertadvisors.pl.