programação
Agora você está lendo
MQL Praticamente. Botão de Pânico, parte II [Curso de Programação]
0

MQL Praticamente. Botão de Pânico, parte II [Curso de Programação]

criado Radek Szafron29 2019 marca

Bem-vindo à segunda parte do Panic Button! Nesta semana, veremos novamente o código do nosso botão de pânico. Nossa tarefa hoje é adicionar o que é mais importante, isto é, a função de nos libertar do peso das posições abertas e nos libertar das restrições de constantemente encarar o monitor.

Vamos desenvolver a funcionalidade básica com outra coisa. Garantiremos que a ferramenta que projetamos seja segura e que cliques acidentais sejam inabaláveis ​​e estoicamente tranquilos. Como qualquer botão sério em nosso planeta e o nosso terá um tipo de fusível que permitirá que você feche a posição somente quando o clique for acompanhado pressionando uma tecla [Shift] no teclado.


Não deixe de ler: MQL Praticamente. Botão de pânico, parte I


Estamos abrindo uma fábrica de algoritmos

Então, ligamos o MetaEditor.

Vamos editar o código da nossa aplicação na semana passada. Abra o arquivo Panic Button.mq4 do catálogo Especialistas e vamos dar uma olhada na função Oninit (). Sua função deve parecer quase idêntica à função colocada abaixo com uma pequena diferença. Hoje, um novo elemento do código apareceu // comment .

int Oninit ()
{
if(IsDemo () == falso)
{
 
retorno INIT_FAILED;
 
}
bool azul = falso;
if(Tylko_ten_instrument == verdadeiro)
{
 
azul = verdadeiro;
 
}
Przycisku_utworz_sie (5, 15azul);
// <- [É assim que fazemos comentários] EventSetMillisecondTimer(250); // Fim da novidade
retorno INIT_SUCCEEDED;
}
Código MQL4

Adicione o código em falta para a função Oninit ().

Nós começamos o relógio

A função da API MQL adicionada ao código acima bool EventSetMillisecondTimer(int milissegundo)permite que você configure o cronômetro. Timer é um método que permite chamar outra função da API - NoCronômetro () cada número específico de milissegundos. Essa solução nos permite executar certas partes do código periodicamente colocando-as dentro da função NoCronômetro (). No nosso caso, 4 vezes por segundo, ou o que 250 milissegundos.

O relógio está correndo, então vamos escrever uma nova função.

anular NoCronômetro()
{
 
Przycisku_badz_czujny ();
 
}
Código MQL4

Bom trabalho. Você acabou de criar um algoritmo responsável por proteger nosso botão contra cliques acidentais. Foi essa parte difícil. De agora em diante, para clicar no botão, você precisará segurar a tecla [Shift] no teclado. Rodadas em elétrons são desaparafusadas em função Przycisku_badz_czujny ()que nós importamos da biblioteca Biblioteka_panic_button.ex4 na semana passada.

A plataforma exige que o timer seja desativado quando não precisarmos mais dele. Podemos fazer isso adicionando a função da API EventKillTimer () funcionar OnDeinit ()que criamos na seção anterior e que, como lembrete, será chamado pela plataforma ao fechar nosso aplicativo. Vamos modificar a função OnDeinit ()faça com que pareça a função abaixo.

anular OnDeinit(const int razão)
{
 
Przycisku_bye_bye ();
 
EventKillTimer ();
}
Código MQL4

Você pode iniciar o aplicativo aqui e ver como o algoritmo responde pressionando uma tecla [Shift].

Nós assistimos todos os movimentos

Chegou a hora de começar a pensar sobre a função de fechamento de posição. Para fazer isso, precisamos reconhecer o momento em que o botão é clicado. A função da API nos ajuda anular OnChartEvent(const int id const long & lParam const double & dparam, string const & SPAR).

função OnChartEvent (...) ele é chamado pela plataforma sempre que um evento ocorre no gráfico que pode ser relevante para a operação do programa, por exemplo, o usuário clica no objeto ou move o mouse. Vamos escrever a função apropriada.

anular OnChartEvent(const int id const long & lParam const double & dparam, string const & SPAR)
{
 
}
Código MQL4

Plataforma, chamando a função OnChartEvent (...) Ele fornece informações adicionais para ele usando parâmetros id, lParam, dparamoraz vergar. Isso nos permite identificar o que aconteceu e o tipo de evento é armazenado na variável idqual é o tipo int, isto é, é um inteiro. palavra const quando o tipo de variável significa que uma determinada variável não pode ser modificada e é usada apenas para ler informações.

Vamos expandir nossa função com outro elemento.

anular OnChartEvent(const int id const long & lParam const double & dparam, string const & SPAR)
{
 
if(id == CHARTEVENT_OBJECT_CLICK)
{
 
}
 
}
Código MQL4

Usando o operador if acima nós verificamos se a variável id é igual == o valor definido na variável gerada automaticamente pelo nome CHARTEVENT_OBJECT_CLICK. Nesse caso, temos certeza de que o usuário clicou em um objeto não especificado no gráfico em que nosso algoritmo funciona.

Nós já sabemos que quando a expressão condicional do operador if será logicamente verdadeiro que o código entre as chaves será feito {} pertencente a este operador. Vamos adicionar ao nosso código o que deve acontecer quando o gráfico clica em qualquer objeto.

anular OnChartEvent(const int id const long & lParam const double & dparam, string const & SPAR)
{
 
if(id == CHARTEVENT_OBJECT_CLICK)
{
 
if(Button_you_you_t_click_turned (sparam) == verdadeiro)
{
 
}
 
}
 
}
Código MQL4

O código acima verifica se foi o nosso botão que foi clicado usando a função bool Przycisku_czy_jestes_klikniety (corda object_name)que vem da biblioteca importada. A função como um parâmetro assume uma variável com tipo de dados corda, que é uma variável de texto que deve conter o nome do objeto que foi clicado pelo usuário. A função compara o valor recebido com o nome do elemento gráfico do botão e a resposta para a pergunta se o nosso botão foi clicado responderá com o valor do tipo boolou valor verdadeiro lub falso.

Como sabemos o nome do objeto que foi clicado? função OnChartEvent (...) recebe da plataforma o nome do último objeto clicado usando o parâmetro corda nomeado vergarque podemos passar diretamente como um parâmetro para a nossa função, oh sim Przycisku_czy_jestes_klikniety (ESPATO).

Nós executamos a tarefa confiada [Konkrety]

Quando a funçãoButton_or_jestes_klikniety (...) retornará o valor verdadeiro saberemos que não há piadas, você tem que salvar a situação.

Vamos adicionar ao nosso código uma função que realizará a tarefa principal do nosso algoritmo, ou seja, fechar a posição na conta. A função tem a seguinte declaração:

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument),

Na prática, colocamos no código como na caixa abaixo.

anular OnChartEvent(const int id const long & lParam const double & dparam, string const & SPAR)
{
 
if(id == CHARTEVENT_OBJECT_CLICK)
{
 
if(Button_you_you_t_click_turned (sparam) == verdadeiro)
{
 
Zamknij_pozycje_i_zlecenia (Tylko_ten_instrument);
 
}
 
}
 
}
Código MQL4

função Close_positions_and_ orders (...) pega uma variável de tipo como um argumento boolque deve levar informação, verdadeiro lub falsodevemos fechar as posições de apenas o instrumento no qual o algoritmo funciona. Você lembra do parâmetro Tylko_ten_instrument a partir do painel de configurações na primeira parte? Acabamos de ser úteis. Dependendo da nossa escolha nas configurações, o programa fechará os itens compatíveis com o gráfico selecionado ou todos os itens da conta.


consultores especializados


Nós criamos a função principal

Nós começamos a editar o arquivo "Useful_functions.mqh" a partir do diretório MQL4 \ Include \ Panic Button \

Até agora, usamos apenas funções que vêm da API da MQL ou são importadas da biblioteca Biblioteka_panic_button.ex4. No mundo real, entretanto, a programação exige que nós mesmos criemos a maioria das funções, enquanto apoiamos todo o espectro de soluções prontas. função Close_positions_and_ orders (...) , a partir do qual usamos o acima, você encontrará no arquivo Przydatne_funkcje.mqh, que na parte anterior nós colocamos no catálogo MQL4 \ Include \ Panic Button \ e nos juntamos ao código usando a palavra-chave #include. Abra o arquivo no MetaEditor porque, surpresa, a função que fecha as entradas já está no arquivo, mas ainda precisamos dar o conteúdo.

Definição de função

Depois de abrir o arquivo Przydatne_funkcje.mqh você vai ver que ele está nele definição função de fechamento de posição. Parece exatamente como as funções que usamos até agora com a diferença que é nossa, e podemos dar a ela que tipo de alma o nome, o tipo e o conjunto de parâmetros desejarão. Sua função deve parecer mais ou menos como a função abaixo:

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument)
{
retorno verdadeiro;
}
Código MQL4

Assim, em cabeçalho , nós definimos uma função chamada Zamknij_pozycje_i_zlecenia retornando o tipo de dados bool e tomando um parâmetro nomeado tylko_ten_instrument também sobre o tipo de dados bool.

O conteúdo da função

Tudo o que colocamos entre chaves {} depois do cabeçalho da função, ele consiste em seu conteúdo. Então, vamos enriquecer nosso conteúdo com o primeiro código.

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument)
{
if(isConnected() == falso) retorno falso;
int i = 0; int number_of_the_power_and = OrdersTotal();
if(number_of_content_and == 0) retorno verdadeiro;
bool resultado verdadeiro;
retorno resultar;
}
Código MQL4

Acima, primeiro if, nós verificamos se estamos conectados ao servidor usando a função API isConnected() e em caso de problemas, deixamos a função com a ajuda do operador retorno enquanto retorna o valor falsopara que você saiba que algo está errado. Isso é logo depois if não há chaves, porque usamos um registro abreviado possível em situações em que, após a expressão condicional, queremos realizar apenas uma operação.

Quando estamos online, o algoritmo vai além e cria duas variáveis int sobre nomes i oraz liczba_pozycji_i_zlecen atribuindo ao primeiro valor 0e o segundo valor da função API OrdersTotal(), que informa sobre o número de posições abertas e pedidos em sua conta.

Outro operador if verifica se, às vezes, todos os itens não estão mais fechados, e o usuário clica no botão apenas por diversão ou afeto, o que resulta em deixar a função com a transferência de valor verdadeiroporque está tudo bem.

Quando uma função ainda tem algo para fazer, cria uma variável bool nomeado resultado, que mais tarde servirá para fornecer informações sobre se todos os itens foram fechados corretamente usando o operador final retornoque nós modificamos ligeiramente nesta etapa.

Para loop

operador para, que em sua popularidade é susceptível de dar lugar apenas ao operador if, é usado para executar um determinado conjunto de operações, um número especificado de repetições. Ideal para situações como as nossas, porque temos que realizar uma operação de fechamento para cada pedido separadamente. Vamos adicionar um loop para nossa função para.

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument)
{
if(isConnected() == falso) retorno falso;
int i = 0; int number_of_the_power_and = OrdersTotal();
if(number_of_content_and == 0) retorno verdadeiro;
bool resultado verdadeiro;
para(i = número_de_itens_i_ pedidos - 1; i> = 0; i--)
{
 
}
retorno resultar;
}
Código MQL4

W cabeçalhodepois do operador para nós vemos um registro misterioso: (i = número_de_itens_i_ pedidos - 1; i> = 0; i--) .

O registro significa que o loop começa com a variável que criamos anteriormente i igual à variável liczba_pozycji_i_zlecen menos um e vai repetir a operação entre chaves {} contanto que variável i é maior ou igual a zero [i> = 0] e, após o final de cada ciclo, reduzirá a variável i por um [i--] para que o loop tenha a chance de terminar em algum momento. Simples, descomplicado e confortável de ler.

Falando na linguagem das pessoas, o loop para executa a operação entre parênteses {} tantas vezes quantas temos posições abertas.

Vamos adicionar conteúdo ao nosso loop.

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument)
{
if(isConnected() == falso) retorno falso;
int i = 0; int number_of_the_power_and = OrdersTotal();
if(number_of_content_and == 0) retorno verdadeiro;
bool resultado verdadeiro;
para(i = número_de_itens_i_ pedidos - 1; i> = 0; i--)
{
if(OrderSelect(E, SELECT_BY_POS) == falso)
{
resultado falso; continuar;
}
if(only_ten_instrument == verdadeiro && OrderSymbol()! Símbolo() continuar;
if(OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if(EncomendarFechar(OrderTicket() OrderLots() OrderClosePrice() 0) == falso)
{
resultado falso; continuar;
}
}
Senão se(OrderDelete(OrderTicket()) == falso) resultado = falso;
}
retorno resultar;
}
Código MQL4

Física de foguetes

Vamos analisar passo a passo o que está acontecendo dentro do nosso loop paraque nós escrevemos bravamente no estágio anterior.

Na primeira etapa, usando a função API OrderSelect(...) escolhemos um pedido do terminal usando o número de sua posição na lista de pedidos (a primeira ordem na lista tem o número zero). Nós temos uma variável para essa finalidade ique altera o valor em cada loop. Em caso de falha, escrevemos o erro na variável resultado e informar o loop para usando o operador continuarque ela deve parar neste ponto e começar um novo ciclo com uma variável i menos um [i--].

Quando tudo corre bem, outro operador if usará, novidade, operação lógica "e" &&que retorna um valor verdadeiro somente se ambas as expressões, em cada uma de suas páginas, retornarem um valor verdadeiro. Assim, quando o instrumento da ordem selecionada [OrderSymbol()] não responde [!=] um instrumento gráfico [Símbolo()] e variável tylko_ten_instrument tem um valor verdadeiro, nós ignoramos a ordem dada e usando o operador continuar nós vamos para o próximo ciclo do loop para. Em todos os outros casos, o algoritmo vai abaixo.

Então o nosso programa verifica qual a ordem que temos o prazer, e faz isso usando a função API OrderType() e operação lógica "ou" ||que retorna um valor verdadeiroquando pelo menos uma das expressões em cada uma de suas páginas retorna um valor verdadeiro. Caso contrário, quando a expressão lógica do operador if como um todo, ele retornará o valor falso o operador será executado Senão seque trabalha com o primeiro se eles e serve-lhe como plano B, quando ele não pode concordar com sua própria expressão lógica.

Dependendo do tipo de pedido primeiro if ao lidar com uma ordem de compra no mercado [OP_BUY] ou venda no mercado [OP_SELL] fechará a posição usando a função API EncomendarFechar(...)e o outro ifna verdade Senão se cancela pedidos pendentes usando a função OrderDelete(...).

Eu me curvo, o programa está pronto!

Nós salvamos as alterações no arquivo Przydatne_funkcje.mqh, retornamos ao código principal do aplicativo Panic Button.mq4 e entusiasta, cheia de energia e curiosidade resultante da vontade de testar um novo trabalho, prima ... compilar! Então corrigimos os erros e até a próxima semana! 🙂

BAIXAR UM CONJUNTO DE ARQUIVOS MQL

O que você acha disso?
Eu
95%
interessante
8%
Heh ...
0%
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.