programação
Agora você está lendo
MQL Praticamente. Ace of Intelligence, ou seja, notificações no telefone [Curso de Programação]
0

MQL Praticamente. Ace of Intelligence, ou seja, notificações no telefone [Curso de Programação]

criado Radek SzafronAbril 12 2019

Bem-vindo de volta à parte IV do nosso curso de programação prática. Hoje vamos lidar com assuntos de imensa importância, vamos criar Asa de Inteligênciaque, na nossa ausência, lidará com atividades de inteligência focadas em mudanças de preços no mercado de ações. Quando as coisas ficam no ritmo certo, a nossa As irá enviar imediatamente uma mensagem secreta (não muito) para o nosso telemóvel que nos permitirá resolver o problema com as nossas próprias mãos.


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


Nosso aplicativo permitirá que você defina níveis de preços, sobre os quais receberemos uma notificação empurrar no nosso telefone. Os níveis serão determinados arrastando as linhas coloridas que serão desenhadas depois de clicar na figura do nosso Asa de Inteligência. Vamos começar com o que são essas notificações e como configurar nossos dispositivos para deixar tudo bem.

notificações empurrar

notificações empurrar eles são uma função da plataforma Meta Trader, que permite enviar mensagens do terminal para um dispositivo iOS ou Android que tenha o aplicativo móvel Meta Trader instalado. Se você ainda não tem um aplicativo no seu celular, baixe-o, porque sem ele, o nosso As não consegue lidar muito bem.

rys_1 rys_2

A configuração do dispositivo é muito rápida. No primeiro passo, você deve conhecer o seu MetaQuotes ID, ou seja, o número pelo qual vamos direcionar a mensagem para o telefone apropriado (ou geladeira com sistema android). número MetaQuotes ID está no aplicativo móvel no menu Configurações / bate-papo e mensagenscomo na imagem abaixo.

Rys_3 programação forex

O número está sendo lido MetaQuotes ID em seguida, entre no programa MetaTarder no seu computador no menu Ferramentas / Opções / Notificações.

Rys_4 programação forex

Pronto!

Formação técnica

No começo, baixe o pacote localizado um pouco abaixo e instale o código-fonte do aplicativo ou arquivo atual Como Intelligence.mq4 no catálogo MQL4 \ Experts \ .

Nosso programa também terá uma pequena interface gráfica, colocada na biblioteca elementy_graficzne.ex4que você copia para o diretório MQL4 \ Libraries \ As Intelligence .

DOWNLOAD DE ARQUIVOS

começamos

Depois de abrir o arquivo Como Intelligence.mq4na parte superior, você verá o seguinte trecho de código.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#propriedade rigoroso
# Importar "Como Wywiadu \\ elements_graficzne.ex4"
anular AgencieRozpocznijMisje (int x, int s);
anular AgencieByeBye ();
corda AgencieIdentyfikujSie ();
# Importar
cor de entrada Kolor = clrDodgerBlue;
cor de entrada Kolor_wylaczony = clrGold;
entrada ENUM_LINE_STYLE Styl = STYLE_SOLID;
entrada int espessura = 2;
corda Nome do instrumento = "";
corda Id_line = "INTERVIEW_LINES";
Código MQL4

Começamos o código a partir da importação da biblioteca e, em seguida, usando palavras-chave de entrada, criamos parâmetros para configuração na janela de configurações. As configurações nos permitirão definir a aparência da linha, por meio da qual definiremos o preço para nossas notificações.

Variáveis ​​globais

Sob as definições do tipo entrada vemos algo novo, declarações variáveis Nazwa_instrumentu oraz Id_liniique estão fora do conteúdo de qualquer função. O que isso significa? Desta forma, definimos variáveis ​​globais, que estará disponível em todo lugar em nosso código, isto é, cada função do algoritmo poderá lê-los e dar-lhes valor. De variáveis ​​declaradas como entrada eles diferem apenas em que o usuário não pode acessá-los na janela de configurações.

matrizes

Ao escrever o software aparece muitas vezes precisa usar quantidade suficientemente grande de dados que criar uma variável separada para cada um deles seria, pelo menos, embaraçoso. As tabelas vêm para o resgate, permitindo que você crie um conjunto ordenado de dados de um determinado tipo, por exemplo, um tipo duplo, disponível com um nome que definimos. Para cada tabela, podemos (não precisamos) definir seu tamanho, ou seja, quantos dados de um determinado tipo estarão nele. Vamos dar uma olhada no seguinte trecho de código.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
corda Tablica_nazwy_linii [];
duplo Tablica_dane_linii [] [4];
#define CZAS_AKTYWACJI 0
#define TYP_SYGNALU 1
#define STATUS_LINII 2
#define CENA_LINII 3
#define SYGNAL_LONG 0
#define SYGNAL_SHORT 1
#define LINIA_WYLACZONA 0
#define LINIA_ZMODYFIKOWANA 1
#define LINIA_AKTYWNA 2
#define LINIA_USUNIETA 3
Código MQL4

Placas unidimensionais

No código acima, nas linhas 1 e 2, criamos duas tabelas. Tablica_nazwy_linii ele será usado para armazenar os nomes dos objetos que desenharemos no gráfico. Cada linha representará uma, definida pelo usuário, notificação e, como nosso aplicativo permite que você defina qualquer número de notificações, é necessário usar as tabelas.

Tablica_nazwy_linii é uma matriz unidimensional, que reconhecemos depois de um par de colchetes []. Entre parênteses você pode digitar o número de peças de dados que queremos colocar em cima da mesa, mas no nosso caso, não sabemos o quanto o gráfico ser indo para a linha, uma vez que depende do usuário, por isso vamos deixar parênteses vazio, o que significa que vamos de forma dinâmica, em tempo real, definir e altere o tamanho da matriz, dependendo de suas necessidades. Vamos dar uma olhada no desenho abaixo, que descreve como as placas unidimensionais funcionam.

Rys_5 programação forex

Programação Forex - Arrays

Matrizes multidimensionais

A segunda placa, chamada Tablica_dane_linii servirá para armazenar dados adicionais para cada uma das notificações definidas pelo usuário. Não podemos colocar informações adicionais na mesma tabela como nomes de objetos, porque os nomes são do tipo cordae digite dados duploe uma tabela pode conter apenas um tipo de dados.

Tablica_dane_linii é uma placa bidimensional, que simboliza dois colchetes [] [4]. A primeira dimensão será usada para identificação, como na tabela Tablica_nazwy_liniiqual linha queremos dizer, e a segunda dimensão para armazenar dados adicionais 4 para cada uma das notificações definidas.

Para facilitar a navegação pelos elementos de uma tabela bidimensional usando palavras-chave #define Nós criamos uma lista de valores pré-definidos com, na medida do conveniente para lembrar nomes. Em cada nome listado após a palavra-chave #define Há um número que temos certeza de que será constante.

A seguir, usaremos as placas na prática, enquanto isso, vamos ver o gráfico a seguir, que explica como funciona uma tabela bidimensional.

rys_6

Estrutura de aplicação

Nosso aplicativo usará cinco, mais conhecidas para nós, funções da API MQL para manipulação de eventos.

OnInit () - preparação do algoritmo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int Oninit ()
{
if(IsDemo() == falso) retorno INIT_FAILED;
// Record! Explore Area () é uma versão curta
// Examine o terreno () == false
if(! Área de Investimento ()) BlurSlady ();
EventSetMillisecondTimer(250);
AgencieRozpocznijMisje (0, 0);
retorno INIT_SUCCEEDED;
}
Código MQL4

Em função OnInit() começamos verificando se estamos jogando no lugar certo e, em seguida, se os dados que o aplicativo possui estão corretos. Como é possível, desde OnInit() é a primeira função chamada pelo programa para fazer o algoritmo ter dados incorretos? Isso pode acontecer, por exemplo, quando executamos o algoritmo no gráfico de um instrumento e depois mudamos o símbolo. Nesse caso, terei que excluir as linhas desenhadas anteriormente e todas as notificações canceladas. É com isso que a função lida com ZatrzyjSlady ().

Na próxima etapa, nós corremos cronômetro e nós chamamos uma função da biblioteca Agent StartMissions (...)cuja tarefa é atrair os nossos Asa no gráfico.

No código-fonte, você encontrará vários outros recursos interessantes. Para aqueles de vocês que gostariam de fazer o raio X Asa De A a Z, a interpretação de materiais adicionais deve ser um bom treinamento para navegar na documentação do MQL. Todo o código do aplicativo de hoje eu tentei manter dentro das questões discutidas, de modo que a sua interpretação fosse o mais fácil possível. Desejo-lhe uma aprendizagem frutuosa e, porque você já conhece muitos elementos da linguagem, divirta-se criando as primeiras soluções independentes!

OnChartEvent (...) - monitoramento de eventos

1
2
3
4
5
6
7
8
9
10
11
12
anular OnChartEvent(const int id const long & lParam const double & dparam,
string const & SPAR)
{
if(id == CHARTEVENT_OBJECT_DRAG || id == CHARTEVENT_OBJECT_CHANGE)
{
if(StringFind(sparam, line_ID)> = 0) Atualizar dados (sparam);
}
Senão se(id == CHARTEVENT_OBJECT_CLICK)
{
if (sparam == AgentIdentifySame ()) Criar ();
}
}
Código MQL4

Graças à função OnChartEvent(...) nós monitoramos a interação do usuário com o aplicativo. Na primeira, verificamos se o usuário arrastou a linha de nossa notificação no gráfico (ou alteramos seus parâmetros na janela de configurações) e, se isso aconteceu, atualizamos os dados referentes às nossas notificações na função UpdateData (...)qual como parâmetro assume o nome da linha modificada pelo usuário. Usando o nome da linha recebida, a função localiza a linha apropriada nas tabelas e atualiza os dados relevantes, entre outros informações sobre o preço definido para a notificação.

Na segunda parte da função, monitoramos os eventos de clicar nos objetos no gráfico do nosso algoritmo. Cada clique na figura que desenhamos Ace of Intelligence cria uma nova linha no gráfico. As linhas criadas, após a mudança, chamarão a função UpdateData (...)que agendará uma notificação específica dependendo da localização da linha em relação ao preço no momento da interação com o usuário.


consultores especializados


OnTimer () - atividades recorrentes

1
2
3
4
anular NoCronômetro ()
{
SynchronizujDane ();
}
Código MQL4

Timer que é chamado 4 vezes por segundo, que definimos na função OnInit(), sincroniza dados dentro do nosso algoritmo. Para as tarefas da função SynchronizujDane () Isso inclui verificar quais linhas já foram removidas e dar a elas a cor certa, dependendo de a notificação estar ativada.

OnTick () - observação de preço

Todas as funções da API MQL listadas até o momento são familiares para nós. Hora de algo novo. função onTick() é invocado pela plataforma em qualquer alteração de preço do instrumento no qual o algoritmo opera. Esta é uma função fundamental para muitas estratégias automáticas. Vamos ver o código abaixo.

1
2
3
4
anular OnTick ()
{
PoczynWywiad ();
}
Código MQL4

Em função onTick() nossa As Ele vai para o trabalho e verifica se o preço do instrumento atingiu o valor indicado pelo usuário. Nós iremos para a função PoczynWywiad () um pouco mais, e agora vamos analisar mais uma última função necessária para lidar com eventos, OnDeinit(...).

OnDeinit (...) - terminando o algoritmo

1
2
3
4
5
6
7
8
9
anular OnDeinit(const int razão)
{
EventKillTimer();
AgencieByeBye ();
if(razão! = REASON_CHARTCHANGE && razão! = REASON_PARAMETERS)
ZatrzyjSlady ();
}
Código MQL4

Nós paramos no começo cronômetro e deletamos a foto do nosso agente e depois, usando o operador if nós verificamos qual é o motivo da conclusão da inscrição. Em alguns casos, depois de chamar a função OnDeinit(...) o programa irá reiniciar e iniciar seu algoritmo desde o início, isto é, da função OnInit(). Esse é o caso, por exemplo, quando o usuário altera o intervalo do gráfico. Nessa situação, se o instrumento não tiver sido alterado, não queremos excluir as notificações configuradas por nós. Verificar o motivo da chamada da função OnDeinit(...)ou parâmetro razão, podemos decidir se excluiremos objetos e dados ou deixaremos as notificações definidas inalteradas.

Tabelas na prática

Vamos ver como nosso aplicativo usa tabelas criadas anteriormente no exemplo de uma função Guardar dados (...), cuja tarefa é criar uma nova linha nas tabelas para os dados da nova notificação.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool ZapiszDane (corda nazwa_linii, duplo cena_linii)
{
int number_lin = ArraySize(Tablica_nazwy_linii);
ArrayResize(Array_line_line, number_line, + 1);
ArrayResize(Array_path, line_number + 1);
// Write row_number ++ é a versão abreviada number_line = number_line + 1
liczba_linii ++;
Line_name_array [número_ de linhas - 1] = nome da linha;
Line_Data_array [número_ de linhas - 1] [DAY_TIME] = 0;
Line_Data_array [número_ de linhas - 1] [SIRY TYPE] = SYGNAL_LONG;
Line_Data_array [número_ de linhas - 1] [STATUS_LINES] = LINE_DIRTY;
Line_Data_array [número_ de linhas - 1] [PRICE_LINE] = price_line;
retorno verdadeiro;
}
Código MQL4

Na linha 3, verifique quantos itens contém Tablica_nazwy_liniie porque Tablica_nazwy_linii é uma matriz, o número unidimensional de seus elementos deve corresponder ao número de linhas em ambas as tabelas. Em seguida, nas linhas 5 e 6, aumentamos o número de linhas de nossas tabelas por 1 usando API ArrayResize(...). Uma nova linha será adicionada ao final de cada tabela.

Nós aumentamos a variável liczba_linii o 1, porque adicionamos uma linha às tabelas e, em seguida, preenchemos os dados sobre a nova notificação começando com a linha nº 11, onde atribuímos o nome da linha à linha correspondente na matriz. Tablica_nazwy_linii. Lembre-se que as linhas (e colunas) nas tabelas são numeradas de zero, então se você quiser, por exemplo, salvar as informações para a quinta notificação, você deve usar a linha 4, portanto entre colchetes, após o nome da matriz número de linhas - 1 como o número da linha.

Para numerar colunas na tabela Tablica_nazwy_linii usamos valores predefinidos no início do nosso algoritmo usando palavras-chave #define. Sob os nomes de valores, há números de 0 para 3, porque a tabela possui colunas 4. Graças ao uso de uma tabela bidimensional, podemos salvar 4 informações adicionais para cada notificação, entre outros o preço e tipo de sinal que você usa na função Guardar dados (...) nós damos valores iniciais.

Ace em ação

Outra função que usa matrizes em nosso algoritmo é a função PoczynWywiad ()onde lemos os dados preparados nas tabelas e os interpretamos para decidir se enviamos uma mensagem ao usuário. Vamos olhar o código de função PoczynWywiad ().

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
anular PoczynWywiad ()
{
int i = 0;
int number_lin = ArraySize(Tablica_nazwy_linii);
para(i = 0; e <número de linhas; i ++)
{
if(Array_data_data [i] [STATUS_LINES] == LINE_ACTIVE)
{
if(Array_data_data [i] [SIRY_TYPE] == SYGNAL_LONG)
{
if(Dar Lance > = Line_Data_Array [i] [PRICE_LINE])
{
WyslijWiadomosc (i);
Array_data_data [i] [STATUS_LINES] = LINE_ INTERVAL;
}
}
outro
{
if(Dar Lance <= Line_Data_Array [i] [PRICE_LINE])
{
WyslijWiadomosc (i);
Array_data_data [i] [STATUS_LINES] = LINE_ INTERVAL;
}
}
}
}
}

Na função acima, usando um loop para nós ganhamos acesso a cada linha na tabela Tablica_dane_linii. Isso nos permite verificar o status de notificação e o tipo de sinal, e com base nos dados recebidos para verificar se o preço Dar Lance satisfaz a condição que esperamos. Quando o nosso As ele vai sentir que nos manter ignorantes seria imprudente, apressadamente nos envia uma notificação usando a função Envie uma mensagem(…), que inteligentemente fornece o número da linha onde os dados sobre a notificação necessária são armazenados. Depois de enviar a mensagem, a notificação é desativada e As, firmemente, continua.

Dê uma olhada no código no seu computador para a função Envie uma mensagem(…)para ver como nosso algoritmo usa a função da API MQL SendNotification(…) Ao enviar notificações empurrar.

soma

Se a plataforma ainda não o fez, compile o arquivo Como Intelligence.mq4 e teste sua nova aplicação! Para desenhar uma nova linha, basta clicar na bela imagem no gráfico.

No código-fonte, você encontrará vários outros recursos interessantes. Para aqueles de vocês que gostariam de fazer o raio X Asa De A a Z, a interpretação de materiais adicionais deve ser um bom treinamento para navegar na documentação do MQL. Todo o código do aplicativo de hoje eu tentei manter dentro das questões discutidas, de modo que a sua interpretação fosse o mais fácil possível. Desejo-lhe uma aprendizagem frutuosa e, porque você já conhece muitos elementos da linguagem, divirta-se criando as primeiras soluções independentes!

O que você acha disso?
Eu
33%
interessante
67%
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.