Você está na página 1de 305

No MQL4 linguagem de programação algorítmica

Curso Introdutório

Atualmente, um computador pessoal se tornou indispensável para todos. O rápido desenvolvimento da Internet e do
desempenho dos computadores modernos abriu novos horizontes em vários campos da atividade humana. Logo em
dez anos atrás, o mercado financeiro comércio estava disponível apenas para os bancos e para uma comunidade
limitada de especialistas. Hoje em dia, qualquer pessoa pode participar do mundo dos comerciantes e profissionais
independentes iniciar negociação em qualquer momento.

Centenas de milhares de comerciantes no mundo inteiro já julgada Metatrader 4 Terminal Client pelos seus méritos.
O uso de sua linguagem de programação embutida, MQL4, elevadores comerciantes a um novo nível de negociação
- a negociação automática. Agora, um comerciante pode executar as suas ideias, como um programa aplicativo -
escrever um indicador personalizado, um script para executar operações simples, ou criar um Expert Advisor - um
sistema automatizado negociação (trading robot). Um Expert Advisor (EA) pode trabalhar em um 24 / 7, sem
qualquer intervenção - faixa de segurança preços, enviar mensagens eletrônicas, SMS de seu telefone celular, assim
como fazem muitas outras coisas úteis.

A principal vantagem das aplicações é a possibilidade de fazer rotas de acordo com o algoritmo fixado pelo
comerciante. Qualquer idéias que podem ser descritos em uma linguagem algorítmica (intersecção de duas médias
móveis ou de processamento digital de sinais, três telas por Elder Peters ou «análise fractal, uma rede neural ou
construções geométricas) pode ser codificado em um aplicativo e depois utilizadas na prática negociação.

Desenvolvimento de aplicações para Metatrader 4 Terminal Client requer o conhecimento de MQL4. O presente
livro didático vai ajudá-lo a criar seu próprio Expert Advisors, scripts e indicadores e encarnar-los em suas idéias -
o seu rentável algoritmos de negociação. O manual é destinado a um grande número de leitores sem experiência em
programação que querem aprender a desenvolver aplicações comerciais automatizados para Metatrader Cliente
Terminal 4. O livro didático é concebido de tal modo que, para tornar o aprendizado MQL4 como convenientes e
conseqüente possível.

Prefácio

É uma espécie de dificuldade para começar a escrever um livro sobre programação para iniciantes, porque a área de
conhecimento em apreço envolve alguns novos conceitos que não são baseados em qualquer coisa previamente
conhecida ou costume.

De modo geral, um problema deste tipo pode ocorrer em qualquer outro campo do conhecimento. Por exemplo, o
ponto é conhecido na matemática como infinitesimal círculo, que o círculo em si é definida como um conjunto de
pontos ordenados de uma certa forma. Como é fácil de ver, esses termos são definidos através de cada uma das
outras. Ao mesmo tempo, este "descuido" não se tornou um obstáculo para a matemática. Ambos os círculos,
pontos, bem como outros termos aprovados em matemática ir bem em conjunto. Além disso, toda a gente percebe
pela visão que é um ponto eo que é um círculo.

É fácil descobrir que a grande maioria dos termos ordinários têm fronteiras indeterminadas. Alguns desses limites
são tão nebulosos que estas auxiliem algumas dúvidas sobre a existência do próprio fenômeno ou objeto definido
pela expressão. No entanto, a natureza do homem é que este estranho (em termos de lógica normal) situação não
vem entre um homem e de sua fecunda existência e actividades. Após um termo tem sido utilizado por um
determinado período de tempo, leva-se em completar o seu sentido para nós. É difícil responder à pergunta de como
e por que isso acontece por aqui. Mas ela faz. Nós apenas sabemos que várias referência a um prazo desempenha
um papel importante em termos do processo de aprendizagem notável.
Foram estabelecidas as seguintes tarefas presentes neste trabalho:

desdobra o sentimento de novo usando termos bem conhecidos analogias;


tornando o significado de cada termo intuitivamente claro quando ele ocorre pela primeira vez;
fornecendo os leitores com a quantidade de informação necessária para caracterizar programas e programação.
Para este efeito, o livro contém muitos exemplos e figuras. O texto inclui referências cruzadas que permitem ao
leitor a obter informações sobre temas afins.

Algumas palavras sobre a apresentação dos materiais. Alguns livros didáticos sobre programação convidar os seus
leitores sobre as primeiras páginas para imprimir "Olá, mundo!" usando um programa simples. Seus autores
consideram que, logo que os seus leitores início da aprendizagem de programação, deve remeter ao programa textos
e gradualmente se acostumar com a forma como os programas podem olhar, que mais tarde irão facilitar a sua
aprendizagem. No entanto, esta abordagem resulta em que o leitor tenha de lidar com vários desconhecidos termos,
ao mesmo tempo, e só para adivinhar o conteúdo e as propriedades de algumas linhas do programa. Isso pode
resultar em um equívoco e, consecutivamente, na vaga no conhecimento do leitor.

A meu ver, seria mais eficaz a utilização de um método em que o leitor vai para a próxima seção do livro didático
só depois que ele ou ela teve uma profunda compreensão das matérias anteriores. No âmbito deste método, o
primeiro programa será oferecido ao leitor apenas depois que ele ou ela tem dominado todas as condições
necessárias e ganhou alguns insights sobre os princípios básicos da codificação. Este é o método atual é baseada no
livro didático.

Para dominar o conhecimento dado no livro, o leitor tem de ser um usuário PC e ter uma certa experiência em
trabalhar com Metatrader 4 produzidos pela MetaQuotes Software Corp.

Introdução à Programação MQL4

Antes de começar a estudar MQL4 programação, iremos definir o escopo de nosso estudo. Em primeiro lugar deve-
se notar que os programas discutidos neste livro pode ser usado apenas como aplicações para trabalhar em
Metatrader Cliente Terminal 4. Fig. 1 abaixo mostra o papel do comércio na gestão destes programas. Para uma
melhor compreensão da importância do comércio na gestão destes programas, vamos olhar para Fig. 1.
Se você está interessado em MQL4 programação, você deve ter conseguido familiarizar com o cliente terminal.
Cliente terminal é uma parte do sistema de comércio on-line. Este sistema também inclui um servidor instalado em
um centro lidar. O centro que tratam, por seu turno, está relacionada com outros participantes do mercado - os
bancos e instituições financeiras.

O cliente terminal inclui ambiente informacional - um conjunto de parâmetros que informam sobre o estado do
mercado e das relações entre um profissional e de lidar center. Contém informações sobre preços correntes,
limitações em relação aos máximos e mínimos para tamanho, distância mínima de ordens stop, abono / proibição do
comércio automatizado e muitos outros parâmetros úteis caracterizando o estado atual. O ambiente informacional
são atualizados quando novas carrapatos são recebidos pelo terminal (linha verde na fig. 1).

Built-in ferramentas

O cliente terminal built-in contém ferramentas que permitem realizar uma análise técnica do mercado e executar
manual de gestão comercial. Para uma análise do mercado podem utilizar técnicas diferentes indicadores e estudos
linha - suporte / resistência linhas de tendência canais, etc níveis Fibonacci

Manual de gestão para a negociação da ordem de ferramentas de gestão é utilizado. Usando esta barra um
comerciante pode abrir, fechar e modificar ordens. Além disso, o terminal tem a opção de parar de modo
automatizado de gestão de posição. Um comerciante ações do built-in com ferramentas de gestão comercial resulta
a formação do comércio encomenda, que são enviadas para um servidor.

Para obter mais informações sobre o cliente terminal por favor consulte o "UserGuide" (ClientTerminal_folder \
Terminal.chm).

Ferramentas de programação
Análise do mercado e do comércio na gestão Metatrader 4 Terminal Client é implementado com a ajuda de
ferramentas de programação. MQL4 linguagem permite a criação de tais programas. Existem três tipos de
aplicações criadas em MQL4 e destinados a trabalhar no terminal do cliente:

personalizado indicador - um programa para visualização gráfica de mercado, de acordo com regularidades escrito
um algoritmo do autor;
Consultor Especialista - um programa que permite automatizar uma grande parte das operações comerciais e torna
possível automatizar totalmente a negociação;
script - um programa para executar um tempo de execução das acções, incluindo as operações comerciais.
Fig. 1 revela que o pedido tem a mesma via de acesso ao cliente terminal ambiente informacional como built-in
para ferramentas manuais negociação (setas azuis). Ele também pode formar gestora influências (setas vermelhas),
passaram para o cliente de terminal. Programas de diferentes tipos podem ser utilizados simultaneamente e
intercâmbio de dados. Usando esses aplicativos um programador pode automatizar uma grande parte das operações
comerciais ou criar um robô que será um comércio sem interferência do operador.

Os pedidos e manuais dos instrumentos de gestão podem ser utilizadas em simultâneo o cliente terminal
complementando-se mutuamente.

A característica fundamental técnicas de negociação on-line utilizando o sistema de comércio Metatrader é que
todas as acções de gestão são produzidas no terminal cliente e, em seguida, enviada para um servidor. Programas
aplicativos (Expert Advisor, script, indicador) pode trabalhar apenas como parte do cliente terminal, desde que
esteja conectado a um servidor (que tratam centro). Nenhum dos programas aplicativos estão instalados no
servidor.
O servidor permite apenas para processar sinais provenientes de um cliente de terminal. Se um cliente terminal está
desconectado da Internet ou de um programa aplicativo (Expert Advisor ou script) em execução em que não geram
qualquer gerir as acções, nada irá acontecer no servidor.

O escopo de nosso estudo inclui programas (Expert Advisors, scripts personalizados e indicadores) que permitam a
realização parcial ou totalmente automatizada alargar significativamente o comércio e manutenção de trocas
informativas (ver fig. 1). Neste livro você encontrará a descrição do programa e os componentes principais regras
de criação e utilizando programas. Também vamos considerar em detalhes exemplos de programas e parâmetros do
ambiente informacional do cliente terminal, que estão disponíveis para um programa durante a sua execução.

Programas para a negociação automática possuem potencial muito mais possibilidades do que ferramentas manuais
de gestão comercial.
Na maioria dos casos, um programa permite fazer um trabalho mais fácil do comerciante eliminando a necessidade
de um monitoramento constante da situação no mercado antes da sessão um computador por um longo período de
tempo. Poderá também contribuir para aliviar a tensão nervosa e diminuir o número de erros que aparecem nos
períodos de extrema tensão emocional. Mas o principal é que a utilização do programa de comércio método permite
desenvolver uma gestão própria do idéias e testá-las em dados históricos, escolha óptima parâmetros de aplicação
dessas idéias e, finalmente, para implementar uma estratégia comercial bem articulada.

Noções básicas de MQL4

Esta seção representa termos básicos subjacentes MQL4 linguagem de programação:

§ Alguns conceitos básicos

Expressões como 'carrapato' (uma alteração de preços), «controlo» em algoritmos, 'comentário'


nos programas são descritos. O principal evento quando negociação em mercados financeiros é a
mudança de preço. Esta é a razão por carrapato é um importante acontecimento que torna os
mecanismos básicos de MQL4 programas veiculados. O que fazer quando um novo carrapato
rendimentos? Quais as acções a tomar? Este controle é que se muda para a frente aqui. Mas não
se esqueça de comentar o seu código.

§ Constantes e Variáveis

Os termos de constantes e variáveis são introduzidas, a diferença entre esses termos são
explicados. Como o termo sugere, é uma coisa constante, contínua, definir de uma vez por
todas. Ao contrário da constante, uma variável é um objeto que o código de programação pode
modificar o seu conteúdo. É impossível escrever um programa sem utilizar objetos imutáveis
(constantes) e / ou objetos que podem ser modificados durante a execução do programa
(variáveis).

§ Tipos de dados

Certos tipos de dados são usados em qualquer linguagem de programação. O tipo de uma
variável é escolhido de acordo com a sua finalidade. Como é que podemos declarar uma variável,
como podemos inicializá-lo (preset seu valor inicial)? Uma má escolha do tipo de uma variável
pode abrandar o programa ou mesmo resultar na sua acção errada.

§ Operações e Expressões

Operações operar sobre operandos. Quais são os tipos de operações que existem? O que é
utilizada para typecasting?Quais são as características especiais das operações sobre
inteiros? Porque é importante lembrar que cerca de precedences de dados de diferentes
tipos? Sem saber sobre as características de algumas operações, você pode fazer erros sutis.

§ Operadores

Simples e compostos operadores. Uma ação necessária não deve ser executado por um simples
operador. Se for necessário que um grupo de operadores é executado como um grande operador,
este grupo deve ser incluído em um composto operador. Requisitos específicos e exemplos de
utilização de operadores estão dadas.

§ Funções

A necessidade de se obter um simples código remete-nos para o prazo de Função. Para utilizar a
função de locais diferentes no programa, é necessário prestar-lhe-Function Parameters. Iremos
considerar o processo de criação da função personalizada. Os exemplos de utilização de funções
normalizadas são dadas.

§ Tipos de Programas

Scripts, indicadores e Expert Advisors são os tipos de MQL4 programas que lhe permitem cobrir
praticamente toda a classe dos problemas relativos à negociação em mercados fincancial. É
necessário compreender os efeitos de cada tipo de programas, a fim de utilizar Metatrader Cliente
Terminal 4, da melhor forma.

Alguns conceitos básicos

Assim, o tema do nosso interesse, é um programa escrito em MQL4. Antes de darmos início a uma
apresentação detalhada das regras de escrever programas, é necessário descrever os conceitos básicos
que caracterizam um programa e de suas interrelações com informação ambiental. O Metatrader 4
Terminal Client for conhecida a trabalhar on-line. A situação dos mercados financeiros muda
continuamente, o que afecta os símbolos gráficos no cliente de terminal. Carrapatos terminal fornecer ao
cliente, com informações sobre a evolução dos preços no mercado.

A noção de carrapato

Assinale-se de um evento que se caracteriza por um novo preço do símbolo em algum instante.
Carrapatos são entregues a cada cliente através de um terminal instalado em um servidor central que
tratam. Conforme adequado à situação actual dos mercados, carrapatos podem ser recebidas mais ou
menos freqüentes, mas cada um deles traz uma nova citação - o custo de uma moeda expresso em
termos de outra moeda.
Um pedido que operam com o cliente terminal pode funcionar dentro de um período longo de tempo,
por exemplo, vários dias ou semanas. Cada pedido é executado de acordo com as regras estabelecidas
para os programas de um certo tipo. Por exemplo, uma Expert Advisor (EA) não funciona continuamente
o tempo todo. Um Expert Advisor é normalmente lançado no momento em que surge um novo
carrapato. Por este motivo, não se caracterizar como apenas um carrapato nova citação, mas sim como
um evento para ser processado pelo cliente terminal.
A duração do Expert Advisor da operação depende de qual programa está incluído no código-la. Normal
EAs completar um ciclo de processamento de informação durante alguns décimos ou centésimos de
segundo. Dentro desse prazo, o EA pode ter processado alguns parâmetros, fazer uma decisão
comercial, forneça o profissional com algumas informações úteis, etc Após ter terminado esta parte do
seu trabalho, a EA vai para o modo de espera até que um novo carrapato vem. Este novo carrapato
lança o Expert Advisor novamente, o programa faz o seu adequado funcionamento novamente e volta ao
modo de espera. A descrição detalhada de como o aparecimento de um novo programa carrapato
influências operação segue abaixo.

A noção de controle

Falando sobre o código em execução um programa de fluxo, bem como sua interação com o cliente
terminal, vamos usar o termo de «controlo».
O controle é um processo de realização de ações predeterminadas pelo programa algoritmo eo cliente
terminal funcionalidades. Controle pode ser transferida dentro do programa a partir de um código de
linha para um outro, bem como o programa de terminal para o cliente.
O controle é transferido de uma forma semelhante à de alguém que dá a palavra para falar numa
reunião. Tal como oradores abordar uma reunião e, em seguida, dar a palavra a outros, o programa
cliente do terminal e transferência de controle entre si.Pelo que, o cliente terminal domina. Seu estado é
maior do que a do programa, como a autoridade do presidente de uma reunião, é maior do que as de
um vulgar coluna.
Antes do programa é lançado, o controle está sob a supervisão do cliente terminal. Quando um novo
carrapato é recebida, o terminal cliente transfere o controle para o programa. O código do programa
começa a ser executado neste momento.
O cliente terminal, depois de ter transferido o controle para o programa, não pode parar o seu
funcionamento. Ela continua trabalhando com o máximo desempenho durante todo o período de tempo
que é lançado no PC. O programa só poderá começar a funcionar no momento em que o cliente tenha
transferido o controlo terminal para ele (como o presidente de uma reunião a reunião controla o tempo
todo que está acontecendo, enquanto que o atual orador toma a palavra por apenas um período limitado
de tempo ).
Depois de ter completado o seu funcionamento, o programa retorna controle para o cliente terminal e
não pode ser lançado por sua própria iniciativa. No entanto, quando o controlo já foi transferida para o
programa, ele retorna controle para o cliente terminal, por si só. Em outras palavras, o cliente terminal
não poderá retornar controle a partir do programa, por si só. Dynamic ações do usuário (por exemplo,
forçou o encerramento do programa) são uma isenção.
Ao discutir os assuntos de desempenho dos programas e estruturas internas, estamos interessados
principalmente na parte do controle que são transferidos dentro de um programa. Deixe a Fig's
referem. 2 mostra que a natureza global da transferência de controle para, a partir e dentro de um
programa. Círculos apresentados na figura caracterizar algumas pequenas, logicamente concluído
fragmentos de um programa, enquanto que as setas entre os círculos mostram como controle é
transferido de um fragmento para outro.

Fig. 2. Transferindo o controle de um programa

Um programa que aceitou o controle do cliente terminal (executando o programa) começa a fazer
algumas ações de acordo com a sua inerente algoritmo. O programa contém linhas programa; geral
ordem de execução programa consiste na transferência do controle seqüencial a partir de uma linha
para outra na direção de cima para baixo. O que, segundo as quais as regras podem ser escritos nestas
linhas serão consideradas inferiores, em todos os detalhes.
Aqui, é importante apenas para enfatizar que cada fragmento é executado logicamente concluído - por
exemplo, alguns cálculos matemáticos são feitas, uma mensagem é exibida na tela, uma ordem
comercial é formada, etc Até o fragmento actual do programa é executado , Que mantém o
controle. Depois de ter sido integralmente cumpridos, o controle é transferido para um outro
fragmento. Assim, o controlo dentro de um programa é transferido de um fragmento para outro
logicamente concluído que eles são executados. Logo que o último fragmento é executado, o programa
fará a transferência (retorno) para controlar o terminal cliente.
A noção de comentário

Um programa consiste em dois tipos de registros: aqueles que apresenta o programa em si e que são
textos explicativos para o programa código.
Um comentário é opcional e nonexecutable parte de um programa.
Então, é um comentário opcional parte de um programa. Isso significa que um programa pronto
funcionará de acordo com o seu código independentemente de saber se existem comentários nos ou
não. No entanto, as observações facilitar a compreensão do programa código muito. Verificou-se uma
linha e multi-line comentários. A uma linha de comentário é qualquer seqüência de caracteres após duas
barras oblíquas (//). O sinal de um uma linha de comentário é terminada por linha alimentação. Um
comentário multi-linha começa com os caracteres de / * e é terminada por * / (ver fig. 3).

Os comentários são utilizadas para explicar o programa código. Um bom programa


contém semper comentários.

Fig. 3. Exemplo de comentários em um programa.

Os comentários são amplamente utilizadas na codificação. Eles normalmente são exibidas em cinza nos
códigos. Iremos utilizar comentários, também, a fim de explicar os nossos códigos e torná-los mais
inteligíveis.
Constantes e Variáveis

Os termos de 'constante' e 'variável' são consideradas em uma seção, uma vez que estes termos são
muito próximos de si mesmas.
A noção de constante

Constante é uma parte de um programa, um objeto que tem um valor.


A duração do programa é uma constante na semelhantes para o mesmo termo usado em equações
matemáticas. É um valor invariável. Para descrever a natureza de um constante utilizada em uma
linguagem algorítmica em tantos detalhes quanto possível, vamos remeter ao bem-conhecido físico e
matemático constantes.
A raça humana tem descoberto as constantes, os valores dos quais não dependem de nós, de qualquer
maneira. Essas são, por exemplo, na física: a queda livre que a aceleração é semper igual a 9,8 m / s /
s; em matemática: Pi = 3.14. Constantes do tipo não pode ser considerado semelhante aos constantes,
de uma linguagem algorítmica.
O prazo de constante também é usado em equações matemáticas. Por exemplo, na equação de Y = 3 *
X + 7, números 3 e 7 são constantes. Os valores dessas constantes são totalmente dependentes da
vontade da pessoa que fez a equação. Esta é a mais próxima de constantes analogia usados em
programas MQL4.
Uma constante (como um valor) é colocada por um programador no código na fase da sua criação. A
única constante é caracterizada pelo seu valor, pelo que a perspectiva da "constante" e "o valor de uma
constante" são sinônimos completo.
Constantes exemplar:
37, 3.14, verdade, "Kazan"

Fig. 4. Uma constante na memória de um PC.

As propriedades de constantes

A propriedade de uma constante é o seu poder de reter durante o tempo de funcionamento do


programa o valor fixado pelo programador e definir este valor para o programa quando o programa
solicita deste (Fig. 5). Para cada constante no programa, o computador aloca uma parte da sua memória
do tamanho necessário. O valor de uma constante não pode ser mudado durante a execução do
programa nem por um programador, nem pelo computador (Fig. 6).

O valor da constante semper permanece a mesma.

Fig. 5. O estado da memória celular de uma constante quando se define o valor para o programa.

O valor de uma constante não pode ser mudado durante a operação do programa.
Fig. 6. É impossível alterar o valor de um programa constante durante a operação.

A noção de variável

Parte variável é um programa que tem um valor e um nome.


O prazo da variável em MQL4 é semelhante à que foi aceite pela matemática. A diferença entre eles
consiste apenas na medida em que o valor de uma variável em matemática é semper implícita, enquanto
que o valor da variável em execução um programa é armazenado em uma cela especial na memória do
computador.
O termo de "variável identificador 'é a plena sinônimo de" variável nome'. A variável é colocado no texto
do código, pelo seu autor, na fase de codificação como uma variável nome. O nome (identificador) de
uma variável pode ser composta por letras, dígitos, sublinhado. No entanto, ele deve começar com uma
letra. MQL4 é sensível a maiúsculas e minúsculas, ou seja, S e snão são os mesmos.
Exemplar variável nomes: Alfa, alfa, beta, o número, Num., A_37, A37, qwerty_123
Os seguintes identificadores de variáveis representam os nomes das diferentes variáveis: А_22 ea a_22;
Massa, MASSA.
Exemplar valores das variáveis: 37, 3.14, verdadeiro, "Kazan".

As propriedades da variável

A propriedade de uma variável é a sua capacidade de se obter um certo valor a partir do programa,
retê-los durante o período de funcionamento do programa e definir este valor para o programa quando
solicitado pelo programa. Para cada variável do programa, o computador aloca uma parte da sua
memória do tamanho necessário. Vamos referir-se a Fig. 7 e estudar a construção de uma variável.

Fig. 7. Uma variável na memória de um computador.

Existe um valor de uma variável na memória do celular no computador. Esse valor pode ser solicitada
para a transformação e modificado pelo programa. O nome de uma variável nunca é alterado. Ao
escrever um código, o programador pode definir qualquer nome para a variável. No entanto, logo que o
programa está pronto lançado, nem o programador nem computador, nem o programa tem qualquer
viabilidade técnica para mudar o nome da variável.
Se um programa enquanto está a ser executado reúne o nome de uma variável, o programa remete
para essa variável, a fim de obter o seu valor para a transformação. Se um programa se referiu a uma
variável, este último apresenta um valor para o seu programa. Pelo que, o valor da variável permanece o
mesmo, considerando que o programa se torna a cópia do valor contido na célula de memória alocado
para essa variável (Fig. 8).

Quando o valor de uma variável é definida para um programa, este valor


permanece inalterado. O nome de uma variável nunca será mudado.

Fig. 8. O estado da célula de memória de uma variável quando se define o valor para o programa.

Uma variável não está relacionada com a execução do programa durante um certo período de
tempo. Durante este período, o programa pode referir-se a outras variáveis ou fazer cálculos
necessários. Entre as "sessões" de comunicação com o programa, a variável retém o seu valor, ou seja,
mantendo-se inalterada.
De acordo com o algoritmo do programa, ele pode tornar-se necessário alterar o valor de uma
variável. Neste caso, o programa apresenta ao seu novo valor variável, a variável que recebe este valor
a partir do programa. Todas as modificações são feitas na memória celular. Isso resulta em que o valor
anterior da variável é eliminada, enquanto que um novo valor da variável definida pelo programa toma o
seu lugar (Fig. 9).

O valor de uma variável pode ser alterado pelo programa. O nome da variável é
semper inalterada.

Fig. 9. O estado da célula de memória de uma variável quando a receber o valor do programa.
Constantes e Variáveis exemplar em um Programa

Em um programa, constantes e variáveis podem ser encontrados na operadores. No código abaixo, A e


B são variáveis, 7 e 3 são constantes:

A = 7; / / Linha 1
B = A + 3; / / Linha 2
Vamos estudar como o programa funciona com constantes e variáveis. Execução dessas linhas, o
programa irá fazer os seguintes passos:
Linha 1:

1. 7 apresenta o seu valor constante para o programa.


2. Um valor variável recebe 7 do programa.

Linha 2:

1. O programa tem encontrado uma expressão para a direita a partir do sinal da igualdade e está a
tentar calculá-lo.
2. Constant 3 apresenta o seu valor para o programa.
3. O programa refere-se a uma variável pelo nome.
4. Uma variável define o seu valor (7) para o programa.
5. O programa faz cálculos (7 + 3).
6. В variável recebe valor 10 através do programa.

O Valor de uma variável pode ser mudado durante a operação do programa. Por exemplo, pode haver
uma rubrica no programa que contém o seguinte:

В = 33; / / Linha 3

Neste caso, o seguinte será feito na execução do programa:

1. 33 conjuntos constante o seu valor para o programa.


2. Variável B gets (nova) valor 33 através do programa.

É fácil notar que o valor variável B recebe 10, a certa altura da execução do programa, e então ele
recebe o valor de 33. O nome da variável B mantém-se inalterado durante todos estes acontecimentos,
enquanto que o valor da variável irá mudar.
Fig. 10 mostra constantes e variáveis do programa código:

Fig. 10. Uma constante e uma variável em um programa.


Tipos de dados

É um conhecimento comum que só equitype valores podem ser acrescentadas ou subtraídas. Por
exemplo, maçãs pode ser adicionado à maçãs, maçãs, mas não pode ser adicionado à metros quadrados
ou a temperatura. Limitações semelhantes podem ser encontrados na maioria das línguas modernas
algorítmica.
Tal como objetos de vida normal ter alguns tipos caracterizando as suas cores (vermelho, azul, amarelo,
verde), o seu sabor (amargo, ácido, doce), montante (um e meio, dois, sete), MQL4 usa dados de
diferentes tipos. Falando sobre o tipo de dados, vamos dizer o tipo do valor de uma constante, de uma
variável eo valor retornado por uma função (a noção de função é considerado na seção de Funções).
Em MQL4, são distinguidos os seguintes tipos (para os valores de constantes, variáveis, e os valores
devolvidos pelas funções):

§ int - inteiros;
§ duplo - números reais;
§ bool - booleanos (lógicos) valores;
§ string - valores do tipo string;
§ cor - valores de cor tipo;
§ datetime - valores de data e hora.

Tipo int

Os valores do tipo int são inteiros. Este tipo inclui valores que são inteiro pela sua natureza. Os
seguintes valores são inteiros, por exemplo: quantidade de bares na janela do símbolo (16000 bares),
abriu e quantidade de encomendas pendentes (3 ordens), na distância entre os pontos actuais dos
preços e símbolo da ordem Open Preço (15 pontos). Montantes representam objetos tais como eventos
também pode ser apenas inteiros. Por exemplo, a quantidade de tentativas para abrir um despacho não
pode ser igual a uma e meia, mas só para um, dois, três, etc
Existem 2 tipos de valores inteiros:

§ Valores decimais pode ser composta por algarismos de 0 a 9 e ser positivos ou negativos: 10,
11, 12, 1, 5, -379, 25, -12.345, -1, 2.
§ Hexadecimal valores podem consistir de latim letras de A a F ou a partir de um f, algarismos de
0 a 9. Eles devem começar com 0x ou 0x e ter valores positivos ou negativos: 0x1a7b, 0xff340,
0xAC3 0X2DF23, 0X13AAB, 0x1.

Valores do tipo int deve estar dentro da faixa de -2 147 483 648 para 2 147 483 647. Se o valor de uma
constante ou uma variável está fora do intervalo acima, o resultado da operação programa será nulo. Os
valores de constantes e variáveis do tipoint ter 4 bytes da memória de um computador.
Um exemplo de utilização de uma variável do tipo int em um programa:

Arte int = 10; / / Exemplo variável inteira


int B_27 = - 1; / / Exemplo variável inteira
Num int = 21; / / Exemplo variável inteira
Max int = 2147483647; / / Exemplo variável inteira
int = Min - 2147483648; / / Exemplo variável inteira

Tipo dupla

O valor real da dupla tipo são números que contêm uma parte fracionária.
Exemplo valores deste tipo podem ser quaisquer valores que têm uma parte fracionária: inclinação da
linha de apoio, símbolo preço, valor médio de abertura ordena dentro de um dia.
Às vezes você pode enfrentar problemas designando variáveis ao escrever o seu código, ou seja, ele não
é claro para um programador que tipo (int ou dupla), a variável pertence. Vamos considerar um
pequeno exemplo:
Um programa abriu 12 ordens dentro de uma semana. Qual é o tipo da variável A, que considera a
quantidade média diária de ordens abertas por esse programa? A resposta é óbvia: A = 12 ordens / 5
dias. Significa que a variável A = 2.4 deveria ser considerada no programa como dupla, uma vez que
este valor tem uma parte fracionária. Que tipo deve ser a mesma variável A se o valor total das
encomendas abertos dentro de uma semana é 10? Você pode pensar que, se 2 (10 encomendas / 5 dias
= 2) não tem nenhuma parte fracionária, uma variável pode ser considerada como int. No entanto, esse
raciocínio está errada. O actual valor de uma variável pode ter uma fração parte constituído por apenas
zeros. É importante que esse valor dessa variável é real, pela sua natureza. Neste caso, a variável A tem
também de ser do tipo dupla. O ponto separa também devem ser inscritas no registo constante no
programa: А = 2,0
Os valores reais das variáveis constantes e constituído por uma parte inteira, um ponto decimal, e uma
parte fracionária. Os valores podem ser positivos ou negativos. A parte inteira e da parte fracionária são
constituídos por algarismos de 0 a 9. A quantidade de algarismos significativos depois da vírgula pode
chegar ao valor de 15.

Exemplo:
27,12 -1,0 2,5001 -765456,0 198732,07 0,123456789012345
Os valores do tipo dupla pode variar entre -1,7 * e-308 a 1.7 * e308. Na memória do computador, os
valores de constantes e variáveis do tipo dupla ter 8 bytes.
Um exemplo de utilização de uma variável do tipo dupla em um programa:

Arte duplo = 10,123; / / Exemplo variável real


B_27 duplo = - 1,0; / / Exemplo variável real
Num duplo = 0,5; / / Exemplo variável real
MMM = duplo - 12.07; / / Exemplo variável real
Price_1 duplo = 1,2756; / / Exemplo variável real

Tipo bool

Os valores do tipo bool são valores de Boolean (logical) Tipo ou que contenham desmentistes verdade.
Com o objectivo de aprender a noção de Boolean tipo, vamos considerar um pequeno exemplo do nosso
quotidiano. Digamos, um professor precisa de conta a presença dos livros didáticos dos alunos. Nesse
caso, o professor irá listar todos os alunos, sobre uma folha de papel e, em seguida, irá assinalar, em
uma linha direita se um aluno tem um livro didático ou não. Por exemplo, o professor pode usar marcas
e traços em cima da mesa:

Lista de Alunos Livros Didáticos Livro Didático Livro Didático


em Física em Biologia em Química
1 Smith V -- --
2 Jones V -- V
3 Marrom -- V V
... ... ... ... ...
25 Thompson V V V

Os valores nas colunas direito só pode ser de 2 tipos: verdadeiro ou falso. Estes valores não podem ser
atribuídas a qualquer dos tipos acima, uma vez que são considerados não em todos os números. Eles
não são os valores de cor, sabor, volume, etc, de qualquer modo. No entanto, que assume assim um
importante sentido. Em MQL4, tais valores booleanos são nomeadas, ou lógico, de valores. Constantes e
variáveis do tipo bool são caracterizados através de que podem ter apenas 2 possíveis valores: true
(verdadeiro, TRUE, 1) ou falsa (falso, FALSE, 0). Os valores de constantes e variáveis do tipo bool ter 4
bytes na memória do computador.
Um exemplo de utilização de uma variável do tipo bool em um programa:

bool aa = True; / / Boolean аа variável tem o valor de verdade


bool B17 = TRUE; / / Boolean B17 variável tem o valor de verdade
Hamma bool = 1; / / Boolean Hamma variável tem o valor de verdade
Asd bool = False; / / Boolean Asd variável tem o valor de um falso
Nol bool = FALSE; / / variável Booleana Nol tem o valor de um falso
Prim bool = 0; / / variável Booleana Prim tem o valor de um falso

Tipo string

O valor do tipo string é um valor representado como um conjunto de caracteres ASCII.


No nosso quotidiano, pertence a um conteúdo semelhante, por exemplo, armazenar nomes, carro faz,
etc Uma seqüência de tipo valor é gravado como um conjunto de caracteres colocados em aspas (não
deve ser misturado com o dobro única aspas!).Aspas são usadas apenas para marcar o início eo fim de
uma string constante. O valor em si é o conjunto de caracteres emoldurado pelas cotações.
Se existe uma necessidade de introduzir um aspas duplas ( "), você deve colocar um reverso barra (\)
antes dela. Qualquer caractere especial constantes no verso seguinte barra (\) pode ser introduzido em
uma seqüência. O comprimento de uma string constante varia de 0 a 255 caracteres. Se o comprimento
de uma string constante ultrapassa o seu máximo, o excesso de personagens o lado direito será
truncado e compilador dará o correspondente aviso. Uma combinação de dois caracteres, a primeira das
quais é a reverso barra (\), é comummente aceite pela maioria dos programas e percebida como uma
instrução para executar um determinado texto de formatação. Essa combinação não é exibido no texto.
Por exemplo, a combinação de \ n indica a necessidade de uma alimentação de linha; \ t demandas
tabulação, etc
O valor do tipo string é gravada como um conjunto de personagens emoldurado por aspas duplas:
"Metatrader 4", "Stop Loss", "Ssssstop_Loss", "stoploss", "10 sementes". O valor da cadeia, como tal, é o
conjunto de caracteres. As aspas são usadas apenas para marcar o valor das fronteiras. A representação
interna é uma estrutura de 8 bytes.
Um exemplo de utilização de uma variável do tipo string em um programa:

string Prefix = "Metatrader 4"; / / Exemplo variável string


string Postfix = "_of_my_progr. OK"; / / Exemplo variável string
string Name_Mass = "History"; / / Exemplo variável string
string texto = "Linha de Alta \ n Baixa Line", / / o texto contém
caracteres line feed

Tipo de cor

O valor da cor é um tipo de valor cromático.


O significado de "cor" (azul, vermelho, branco, amarelo, verde, etc) é um conhecimento comum. É fácil
imaginar o que uma variável ou uma constante de cor tipo pode significar. É uma constante ou uma
variável, cujo valor é uma cor. Pode parecer a ser um tanto incomum, mas é muito simples, de modo
geral. Tal como o valor de uma constante é um número inteiro, o valor de uma cor é uma cor constante.
Os valores constantes da cor e variáveis pode ser representado como um dos três tipos:

§ Literais

O valor de cor tipo representado como um literal é constituído por três partes que representam
os valores numéricos da intensidade das três cores fundamentais: vermelho, verde e azul
(RGB). O valor deste tipo começa com 'C' e é citada por aspas simples.
Os valores numéricos de RGB intensidade variam de 0 a 255 e podem ser registradas tanto
decimalmente e hexadecimally.
Exemplos: C'128128128 '(cinza), C'0x00, 0x00, 0xFF' (azul), C'0xFF, 0x33, 0x00 '(vermelha).

§ Integer Representação

Integer é registados como uma representação hexadecimal ou um número decimal. Um número


hexadecimal é apresentado como 0xRRGGBB onde TR é o valor da intensidade vermelho, GG -
verde, e BB - azul. Decimal constantes não são reflectidas directamente em RGB. Representam o
valor decimal de uma representação hexadecimal inteiro.
Representação dos valores de cor e tipo como inteiros literais hexadecimal como é muito fácil de
utilizar. A maioria dos modernos editores de texto e gráficos fornecem informações sobre a
intensidade do vermelho, verde e azul componentes selecionados no valor de cor. Você acabou de
seleccionar uma cor em seu editor e copiar os valores encontrados em sua descrição para a cor
correspondente valor representação no código.
Exemplos: 0xFFFFFF (branco), 0x008000 (verde), 16777215 (branco), 32768 (verde).
Fig. 11. Cor parâmetros para literal inteiro e representação do valor constante cor pode ser
tomada nos modernos editores.

§ Color Names

A forma mais fácil de se definir uma cor para indicar o seu nome, de acordo com a tabela de
cores da web. Neste caso, o valor de uma cor é representada como uma palavra correspondente
com a cor, por exemplo, vermelho - a cor vermelha.

DarkGreen DarkSlateGray Olive Verde Teal Marinha


Indigo MidnightBlue DarkBlue DarkOliveGreen SaddleBrown ForestGreen
DarkGoldenrod DarkSlateBlue Sienna MediumBlue Marrom DarkTurquoise
DarkViolet Tijolo refratário MediumVioletRed MediumSeaGreen Chocolate Crimson
MediumSpringGreen LawnGreen CadetBlue DarkOrchid YellowGreen LimeGreen
Laranja Ouro Amarelo Chartreuse Lime SpringGreen
Azul Magenta Vermelho Gray SlateGray Peru
DeepPink MediumTurquoise DodgerBlue Turquesa RoyalBlue SlateBlue
MediumOrchid GreenYellow MediumAquamarine DarkSeaGreen Tomate RosyBrown
PaleVioletRed Coral CornflowerBlue DarkGray SandyBrown MediumSlateBlue
BurlyWood HotPink Salmão Violet LightCoral SkyBlue
Khaki LightGreen Aquamarine Prata LightSkyBlue LightSteelBlue
Thistle PowderBlue PaleGoldenrod PaleTurquoise LightGray Trigo
LightPink Gainsboro PeachPuff Rosa Bisque LightGoldenrod Blan
Beige AntiqueWhite PapayaWhip Cornsilk LightYellow LightCyan
MistyRose OldLace WhiteSmoke Concha marinha Marfim Melada
MintCream Neve Branco

Constantes e variáveis de cor tipo tomar 4 bytes na memória do computador. Um exemplo de como
usar essa variável em um programa:

Paint_1 color = C '128, 128, 128'; / / O valor de cinza foi atribuído à


variável
Colo cor C = '0 x00, 0 x00, 0 xFF "; / / O valor de azul foi atribuído à
variável
BMP_4 color = C '0 xFF, 0 x33, 0 x00' / / O valor do vermelho foi atribuído
à variável

K_12 color = 0 xFF3300; / / O valor do vermelho foi atribuído à variável


N_3 color = 0 x008000; / / O valor do verde foi atribuído à variável
Cor cor = 16777215; / / O valor do branco foi atribuído à variável
Alfa color = 32768; / / O valor do verde foi atribuído à variável
A = cor vermelha; / / O valor do vermelho foi atribuído à variável
B = cor amarela; / / O valor de cor amarela foi atribuído à variável
color = Colorit Negro; / / O valor dos negros foi atribuído à variável
B_21 color = White; / / O valor do branco foi atribuído à variável

Tipo datetime

O valor é do tipo datetime os valores de data e hora.


Os valores deste tipo podem ser usados em programas para analisar o momento do início ou cessação
de alguns eventos, incluindo os lançamentos de importantes notícias, horários start / acabamento, etc As
constantes de data e hora pode ser representado como uma linha literal consistindo de 6 peças que
representam o valor numérico do ano, mês, dia (ou dia, mês, ano), hora, minuto e segundo.
A única constante é enquadrado em cotações e começa com 'D'. É permitido o uso truncado valores: ou
sem data ou sem tempo, ou apenas um valor vazio. O intervalo de valores: a partir de 1 º de janeiro de
1970, a 31 de dezembro de 2037. Os valores de constantes e variáveis do tipo datetime ter 4 bytes na
memória do computador. Um valor representa a quantidade de segundos decorridos a partir das 00:00
do dia 1 de janeiro 1970.
Um exemplo de utilização de uma variável do tipo datetime em um programa:

Alfa datetime = D '2004.01.01 00: 00 "; / / Ano Novo


Tim datetime = D "01.01.2004"; / / Ano Novo
datetime Tims = D '2005.05.12 16: 30: 45'; / / 12 de maio de 2005 4:30:45
pm
datetime N_3 = D »12.05.2005 16: 30: 45 '; / / 12 de maio de 2005 4:30:45
pm
Compile datetime = D''; / / equivalente a D '[compilação data]
/ / 00:00:00 '

Declaração e iniciação variável

A fim de evitar possíveis "perguntas" sobre o programa pelo qual o tipo de dados desta ou daquela
variável pertence, que é aceite em MQL4 especificar os tipos de variáveis logo no início de um programa
explícito. Antes de uma variável começa a participar em quaisquer cálculos, deve ser declarada.
Declaração variável é a primeira menção de uma variável em um programa. Na declaração de uma
variável, seu tipo deve ser especificada.
A inicialização variável significa que a sua afectação a um valor correspondente com o seu tipo, na
sua declaração. Cada variável pode ser inicializado. Se nenhum valor inicial é estabelecido
explicitamente, um numérico variável será inicializada por zero (0) e uma variável string será inicializada
por uma linha vazia.

Em MQL4, admite-se a especificar os tipos de variáveis explicitamente em sua


declaração. O tipo de uma variável é declarada na primeira menção do nome desta
variável. Quando ela é indicada para o segundo e os subsequentes vezes, o seu tipo
não é especificado mais. No decurso da execução do programa, o valor da variável
pode mudar, mas o seu nome e tipo permanecem inalteradas. O tipo de uma variável
pode ser declarada em única ou linhas de operadores.

Uma variável pode ser declarado em uma única linha:

int Var_1; / / Variável declaração em uma única linha


Esse recorde significa que haverá Var_1 variável (variável declaração como tal) e do tipo desta
variável int serão dadas no programa.
Em uma linha, várias variáveis do mesmo tipo podem ser declaradas:

int Var_1, Box, Comm; / / Declaração de diversas variáveis em uma linha


Esse recorde significa que haverá variáveis Var_1, Caixa e Comm, todos do tipo int, utilizado no
programa. Significa que as variáveis acima enumeradas serão considerados pelo programa como
variáveis do tipo inteiro.
Variáveis também podem ser inicializados dentro operadores:
Var_5 duplo = 3,7; / / Variável inicialização em uma missão operador
Esse recorde significa que haverá Var_5 variável do tipo usado em programa duplo, o valor inicial da
variável a ser 3.7.
O tipo de variáveis nunca é especificado a subseqüente linhas em qualquer parte do programa. Contudo,
cada vez que o programa solicita uma variável que "se lembra" de que essa variável é do tipo que tenha
sido especificado, na sua declaração.Conforme cálculos progressos no programa, os valores das variáveis
podem mudar, mas o seu modelo mantém-se inalterado.
O nome de uma variável não tem qualquer relação com o seu tipo, ou seja, você não pode julgar acerca
do tipo de uma variável pelo seu nome. Um nome dado a uma variável pode também ser utilizada para
quaisquer tipos de variáveis em diferentes programas. No entanto, o tipo de qualquer variável pode ser
declarada apenas uma vez dentro de um programa. O tipo de variáveis declaradas não será alterado
durante a execução do programa.
Exemplos de variáveis Declaração e Inicialização

Variáveis podem ser declaradas em várias linhas ou em uma única linha.


É permitida a declarar diversas variáveis de um tipo simultaneamente. Neste caso, as variáveis são
listados separados por vírgulas, sendo colocado um ponto e vírgula no final da linha.
Fig. 12. Exemplo de declaração variável em uma única linha.

O tipo de variáveis é declarada uma única vez, na primeira menção da variável. O tipo não será mais
indicado para o segundo e os subsequentes vezes quando a variável é mencionada.

Fig. 13. Exemplo de declaração variável em uma única linha.

É permitida a declarar e inicializar variáveis nos operadores.

Fig. 14. Exemplo de iniciação variável.

Fig. 15. Variável inicialização no cabeçalho de um composto operador.

Operações e Expressões

A fim de compreender o que tem importância operações e expressões em MQL4, analogias especiais não
são necessários.Praticamente, é o mesmo que em operações e expressões simples aritmética. Todos
entendem que, no registro de f = n + m,membros f, n e m são variáveis, sinais e + = são sinais
operacionais, enquanto n + m é uma expressão.
Na seção anterior do livro, nós aprendemos sobre a necessidade de apresentar dados de diferentes
tipos. Aqui nós entremos relações possíveis entre esses dados (metros quadrados ainda não pode ser
adicionado a maçã). Em MQL4, existem algumas limitações naturais e as regras de utilização de
operações em expressões.
As noções de 'Operando', 'Operação', 'Operação Symbol "e" Expressão "

Operando é uma constante, uma variável, um componente ou uma matriz valor retornado por uma
função (o termo é considerado em função de a seção de funções, a de matriz - na seção
de Arrays; neste estágio atual de aprendizagem, é suficiente para compreender como operandos
constantes e variáveis já estudadas antes).
A operação é feita mediante uma acção operandos.
Operação símbolo é um estilo de caracteres ou um grupo de caracteres que forma a executar uma
operação.
Expressão é uma seqüência de símbolos operandos e funcionamento; é gravar um programa, o valor
calculado de que é caracterizada por um tipo de dados.
Tipos de Operações

Existem os seguintes tipos de operações na MQL4:

§ operações aritméticas;
§ cessão operações;
§ operações relacionais;
§ Booleano (lógico) operações;
§ bitwise operações;
§ vírgula operação;
§ chamada de função.

As operações são utilizadas em operadores (ver Operators). Só na sua utilização operadores faz sentido
e é realizado em um programa. A possibilidade de utilizar uma operação é determinada pelas
propriedades dos operadores (no caso da operadora propriedades permitem que você utilize esta
operação específica, você pode usá-lo, caso contrário, você devia ' Não utilizar esta operação). É
proibido o uso operações fora operadores.
As operações aritméticas

Os seguintes símbolos pertencem a operações aritméticas símbolos:

Símbolo Operação Exemplo Analógico


+ Além dos valores x+2
-- Subtração de valores ou de assinar mudança x - 3, y = - y
* Multiplicação de valores 3*x
/ Quociente da divisão x/5
% Resíduo de divisão minutos = tempo% 60
++ Além de 1 para o valor da variável y++ y=y+1
-- 1 a partir da subtração do valor da variável y -- y=y-1
Cessão de Operações

Os seguintes símbolos pertencem a cessão operações símbolos:

Símbolo Operação Exemplo Analógico


= Cessão do valor para a variável x y уx=
+= Aumento da variável x por y у+=x y=y+x
-= Redução da variável y por x y -= x y=y-x
*= Multiplicação da variável y por x y *= x y=x*y
/= Divisão da variável y por x y/x= y=y/x
%= Resíduo da divisão da variável y por x y = x% y = y% x

Operações relacionais

Os seguintes símbolos pertencem a operações relacionais símbolos:

Símbolo Operação Exemplo


== Verdade, se x é igual a y x == y
!= Verdade, se x não é igual a y x! y =
< Verdade, se x for menor que y x> y
> Verdade, é mais do que se x y x> y
<= Verdade, se x for igual ou inferior a y x <= y
>= Verdade, se x for igual ou superior a y x> y =

Booleanos (lógicos) Operações

Os seguintes símbolos pertencem a operações booleanas símbolos:

Símbolo Operação Exemplo Declarações


! NÃO (lógico !х TRUE (1), se o valor do operando é FALSE (0); FALSE
negação) (0), se o valor do operando não é FALSE (0).
|| OU (disjunção x <5 | | x> 7 TRUE (1), se houver algum valor dos valores é verdade
lógico)
&& E (conjunção x == 3 & & y TRUE (1), se todos os valores são verdadeiras
lógica) <5

As operações bitwise

Bitwise operações só podem ser realizados com inteiros. As seguintes operações pertencem a bitwise
operações:
One's complemento do valor da variável. O valor da expressão contém 1 em todos os lugares, em que os
valores da variável conter 0, e que ele contém 0 em todos os lugares, em que os valores da variável
conter 1.

b = n ~;
A representação binária de x por y lugares é deslocada para a direita. Este direito é lógico turno,
significa que todos os lugares esvaziados para a esquerda será preenchido com zeros.

x = x>> y;
A representação binária de x por y lugares é deslocada para a esquerda; esvaziou os lugares para a
esquerda será preenchido com zeros.

x = x <<y;
A operação bitwise AND do binário representações de x e y. O valor da expressão contém 1 (TRUE) em
todos os lugares, em que ambos contêm x e y não nulo, e o valor da expressão contém 0 (FALSO), em
todos os outros lugares.

b = ((x & y)! = 0);


A operação bitwise OR do binário representações de x e y. O valor da expressão contém 1 em todos os
lugares, em que x ou y não contém 0. Contém 0 em todos os outros lugares.

b = x | y;
A operação bitwise OR EXCLUSIVO do binário representações de x e y. O valor da expressão em 1
contém os locais, no qual x e y têm diferentes valores binários. Contém 0 em todos os outros lugares.

b = x ^ y;

Operação vírgula

Expressões separados por vírgulas são calculados da esquerda para a direita. Todos os efeitos colaterais
dos cálculos na expressão da esquerda só pode ocorrer antes que a expressão direito é calculado. O tipo
eo valor do resultado coincide com o tipo eo valor da expressão direita.

for (i = 0, j = 99; i <100; + + i, j -) Print (array [i] [j]); / / Loop declaração


Os parâmetros transferiu lista (veja abaixo) podem ser considerados como um exemplo.

My_function (Alf, Bet, Gam, Del) / / Chamando para uma função com argumentos
Operadores e Funções são consideradas nas seções de Operadores, Funções e no capítulo
denominado Operators)
Função Chamada

Chamada da função é descrito em todos os detalhes na seção da Função Chamada.


Operações semelhantes sobre operandos

Se uma escola elementar aluno foi-nos dito que, quando a resolução do problema sobre o número de
lápis, ele ou ela teria que basear a sua apresentação em termos tais como operandos, operadores e
expressões, o aluno pobre, certamente impossível encontrá-lo. Olhando para os símbolos das operações,
podem pensar que uma codificação é um processo muito complicado e misteriosa, acessível apenas para
para uma espécie de elite. No entanto, codificação não é realmente difícil em tudo, você só precisa fazer
cabeça ou da cauda alguns intensions. Para ter a certeza que isto é realmente assim, vamos considerar
alguns exemplos.

Problema 1. John tem 2 lápis, lápis Pete tem 3. Quantos lápis fazer estes meninos
têm?:)

Solução. Vamos denotar o número de John's lápis e uma variável como o número de Pete's lápis como
variável B, enquanto que o resultado será denominado C.
A resposta será: С = А + В
Na seção denominada Tipos de dados, foram considerados os métodos de declaração variável. Lápis
estão as coisas, ou seja, é algo que pode existir basicamente como uma parte (por exemplo, pode haver
uma metade de um lápis). Assim, iremos considerar como lápis variáveis reais, ou seja, as variáveis
de dupla natureza.
Assim, podemos código a solução, por exemplo, da seguinte forma:

Um duplo = 2,0; / / O número de lápis John's


duplo B = 3,0; / / O número de Pete's lápis
dupla C = A + B; / / Número
Neste caso, operação "+" aplicada a adição dos valores das variáveis é um tipo bastante ilustrativo.
Digite o valor da expressão:

A + B
Será o tipo das variáveis que são componentes da expressão. No nosso caso, este será o dobro tipo.
Iremos buscar a resposta semelhante para a diferença entre os valores (Quantos lápis faz mais do que
Pete tem João?):

Um duplo = 2,0; / / O número de lápis John's


duplo B = 3,0; / / O número de Pete's lápis
dupla C = B - A; / / A diferença entre dois números reais
Outras operações aritméticas são usados de forma semelhante:

duplos um * C = B; / / Multiplicação de dois números reais


dupla C = B / A; / / Divisão de dois números reais
Cálculos similares podem ser realizadas com números inteiros, também.

Problema 2. Os alunos vão para a lousa e resposta em classe. John fui 2 vezes, Pete
passou 3 vezes.Quantas vezes os meninos vão para o quadro negro, no total?

Solução. Vamos denotar John's passagens como variável X, Pete's passagens como variável Y, o
resultado - como Z.
Neste exemplo, nós temos que usar as variáveis do tipo int, uma vez que consideramos que são eventos
inteiro pela sua natureza (não pode ir para a lousa 0,5 vezes ou 1,5 vezes; a resposta na lousa pode ser
bom ou ruim, mas nós és apenas interessado em que o número destas respostas ou passagens).
A solução deste problema pode ser escrita como:

int X = 2; / / Número de passagens John's


int Y = 3; / / Número de passagens Pete's
int Z = X + Y; / / Número
No caso do cálculo da diferença entre, de produto ou quociente de inteiros, a operação "-" é semelhante
ao utilizado na forma simples:

int X = 2; / / Integer
int Y = 3; / / Integer
int Z = Y - X; / / Diferença entre os dois inteiros
int Y = Z * X; / / Produto de dois inteiros
int Z = Y / X; / / quociente de dois inteiros
A situação é um pouco diferente com as variáveis do tipo string:

Problema 3. Em um canto da casa, há um supermercado chamado "Arctic". Num outro


canto da mesma casa, há um estabelecimento chamado "Cabeleireiros Saloon". O que
está escrito sobre a casa?

Solução. Em MQL4, você está autorizado a acrescentar em conjunto os valores da seqüência constantes
e variáveis. Se acrescentarmos juntos variáveis do tipo string, strings são adicionadas simplesmente um
por um, na seqüência eles são mencionados na expressão.
É fácil de código de um programa que seria necessário dar-nos a resposta:

W1 = string "Arctic"; / / Seqüência 1


W2 = string "Cabeleireiros Saloon"; / / seqüência 2
string Ans = W1 + W2; / / Soma de cordas
O valor da variável Ans será a seqüência que aparece da seguinte forma:

ArcticHairdressing Saloon
Nós obtivemos uma não-muito-para-olhar-no, mas absolutamente correcta formada valor do
tipo string. Evidentemente, devemos considerar as lacunas e outras pontuações em nossas práticas de
codificação desses problemas.
Quaisquer outras operações aritméticas com variáveis do tipo string são proibidos:

string Ans = W1 - W2; / / Não permitido


string Ans = W1 * W2; / / Não permitido
string Ans = W1 / W2; / / Não permitido

Typecasting

Typecasting está modificando (mapeamento) dos tipos dos valores de um operando


ou uma expressão. Antes da execução das operações (todas as operações, mas cessão), são alteradas
para um tipo da mais alta prioridade, que antes da realização da cessão operações forem modificados
para o tipo de alvo.
Vamos considerar alguns problemas que lidam com typecasting.
Problema 4. John tem 2 lápis, enquanto Pete passou 3 vezes para o quadro
negro. Quantos no total?

No que diz respeito à lógica formal está em causa, os maus-posedness do problema é óbvia. É óbvio que
eventos não podem ser adicionados, juntamente com as coisas, ele está errado.

Problema 5. Em um canto da casa, há um supermercado chamado "Arctic", enquanto


que John tem 2 lápis.:)

Com o mesmo grau de desespero (na medida do normal raciocínio está em causa), podemos perguntar
o seguinte:
1. Quantos no total?, Ou
2. O que está escrito na casa?
Se você quiser resolver os dois problemas acima corretamente no MQL4, você deve referir-se
typecasting regras. Primeiro, temos que conversar sobre a forma como diferentes tipos de variáveis
estão representados na memória do computador.
Tipos de dados, tais como int, bool, cor, datetime e duplas, pertencem ao tipo de dados numéricos. A
representação interna de constantes e variáveis de int, duplos, bool, cor e tipo datetime é um número.
As variáveis de int, bool, cores e tipos datetimeestão representados na memória do computador como
números inteiros, enquanto que as variáveis de dupla natureza são representados como números de
precisão dupla com um ponto flutuante, ou seja, números reais. O valor de constantes e variáveis do
tipo string é um conjunto de caracteres (Fig. 16).

Os valores de int, bool, cores e tipos datetime estão representados na memória do


computador como números inteiros. Os valores do tipo dupla estão representados na
memória do computador como números reais. Os valores do tipo string são
representados na memória do computador como uma seqüência de caracteres. Os
valores de int, bool, cor, datetime e tipos são o dobro dos valoresnuméricos tipo. Os
valores do tipo string são os valores do tipo de caracteres.

Fig. 16. Representação de diferentes tipos de dados na memória do computador.


Nós mencionado acima, que os valores das variáveis de int, bool, cores e tipos datetime estão
representados na memória do computador como números inteiros, enquanto os da dupla tipo - como
números reais. Portanto, se queremos conhecer o modelo de uma expressão que consiste de variáveis
de diferentes tipos, só podemos escolher entre três tipos de dados: int, duplos ebarbante. Os valores
de bool, cores e tipos datetime irá revelar-se em uma expressão da mesma forma que os valores do
tipoint.
Então, que tipo será o valor de uma expressão composta por operandos de diferentes tipos? Em MQL4,
o Estado de typecasting implícita é aceite:

§ se a expressão contém operandos de diferentes tipos, o tipo de manifestação


será transformado no tipo que tenham a mais alta prioridade; o tipo int, bool,
cor e têm igual datetime prioridades, enquanto que a dupla tipo tem uma
prioridade maior, e tem o tipo string a mais alta prioridade;
§ se o tipo de expressão, à direita da operação de cessão sinal não coincide com
o tipo da variável à esquerda da operação de cessão sinal, o valor dessa
expressão é vazado como o tipo da variável à esquerda do cessão operação
sinal; isso é chamado de "meta-modelo vazado ';
§ é proibido lançar os valores do tipo string para qualquer outro tipo de alvo.

Bem, vamos voltar ao Problema 4. Pode haver duas soluções para ela.
Solução 4.1. Cálculo do resultado do tipo int:

Um duplo = 2,0; / / O número de lápis John's


int Y = 3; / / O número de passagens Pete's
int F = A + Y; / / Número
Primeiro de tudo, precisamos de saber o valor da expressão desde seus operandos são de tipos
diferentes. Na expressão:

A + Y,
operandos de dois tipos de dados são utilizadas: А - dupla tipo, Y - tipo int.
Em conformidade com a regra implícita de typecasting, o valor desta expressão será um número
de dupla natureza. Obs: Estamos a falar só sobre o tipo de expressão A + Y, mas não sobre o tipo de
variável F que é para a esquerda da operação de cessão assinar. O valor dessa expressão é verdadeiro
número 5,0. Para lançar o tipo de expressão A + Y, é aplicada a primeira parte da regra implícita
typecasting.
Após o cálculo da expressão A + Y, a cessão operação é executada. Neste caso, os tipos desencontro,
também: o tipo de expressão A + Y é duplo, enquanto que o tipo de variável F é int. Durante a execução
da operação de cessão: Primeiro, o tipo de expressão A + Y é casted como int (de acordo com a regra
de cálculo inteira) e 5 torna-se inteiro, em seguida, esse resultado torna-se o valor da variável inteira F.
Os cálculos foram realizado de acordo com a segunda parte da regra implícita typecasting - 'meta-
modelo vazado'. O resultado final dos cálculos e manipulações é a seguinte: O valor da variável inteira F
é inteiro 5.
Solução 4.2. Situação semelhante ocorre, se tentarmos ter um resultado como um valor
de dupla natureza:

Um duplo = 2,0; / / O número de lápis John's


int Y = 3; / / O número de passagens Pete's
dupla F = A + Y; / / Número
Esta situação difere do anterior por uma meta que o tipo de variável F (à esquerda da operação de
cessão sinal), no nosso caso, é dupla tipo, coincide com o tipo (duplo) da expressão A + Y, de modo não
temos nenhum tipo de meta-expressos aqui. O resultado dos cálculos (o valor da variável tipo duplo-F) é
real número 5,0.
Vamos agora encontrar uma solução para o Problema 5. Sem perguntas que poderão surgir na
inicialização de variáveis:

W1 = string "Arctic"; / / Seqüência 1


Um duplo = 2; / / O número de lápis John's
Solução 5.1. Uma possível solução para este problema:

W1 = string "Arctic"; / / Seqüência 1


Um duplo = 2; / / Número de John's lápis
Soma = string W1 + A; / / Implícitas transformação para a direita
Aqui, na parte direita, acrescentamos juntos os valores de duas variáveis: o único tipo de corda, eo
outro um - de dupla escreva.De acordo com a regra implícita de typecasting, o valor da variável A
primeira vai ser fundido com o tipo corda (uma vez que este tipo é de uma prioridade mais elevada), e
em seguida a um tipo de valores serão somados (concatenação). O tipo de o valor resultante para a
direita da operação de cessão sinal será seqüência. Na fase seguinte, este valor será atribuído à
variávelstring Soma. Como resultado, o valor da variável Soma será o seguinte texto:

Arctic2.00000000
Solução 5,2. Esta solução é errada:

W1 = string "Arctic"; / / Seqüência 1


Um duplo = 2; / / Número de John's lápis
Soma = dupla W1 + A; / / Isto é inadmissível
Neste caso, vamos quebrar uma proibição de meta-tipo para o elenco de valores tipo string. O tipo do
valor de expressão W1 + A, como na solução anterior, é seqüência. Quando a cessão operação é
executada, a meta-tipo elenco deve ser realizada.Contudo, de acordo com a regra, a seqüência-alvo tipo
expressos para os tipos de menor prioridade é proibida. Este é um erro que será detectado pelo
MetaEditor a criação do programa (em elaboração).
Geralmente, as regras contidas nesta secção são claros e simples: Se você calcular quaisquer valores, é
preciso lançar todos os tipos diferentes de um tipo de prioridade máxima. Typecasting com rebaixada
prioridade é permitida apenas para valores numéricos, que strings não podem ser transformados em
números.
Características dos cálculos Integer

Inteiros são conhecidos como os números sem uma parte fracionária. Se você adicionar ou subtrair-lhes-
los juntos, você irá obter um resultado intuitivo. Por exemplo, se:

int X = 2; / / Primeira variável int


int Y = 3; / / segunda variável int
e:

int Z = X + Y; / / Adição operação,


não há qualquer problema para calcular o valor da variável Z: 2 + 3 = 5
Da mesma forma, se você executar uma operação multiplicação:
int Z = X * Y; / / Multiplicação operação,
o resultado é altamente previsível: 2 * 3 = 6
Mas o que resulta é que vamos, se o nosso programa tem de executar uma operação divisão?

int Z = X / Y; / / Divisão operação


É fácil de escrever 2 / 3. No entanto, não é um número inteiro. Então, qual será o valor da expressão X /
Y e Z variável?

A regra de cálculo inteiro consiste em que a parte fracionária semper é descartado.

No exemplo acima, a expressão do direito à igualdade sinal contém apenas números inteiros, ou seja,
não typecasting tem lugar, no presente caso. E isto significa que o tipo de expressão X / Y
é int. Portanto, o resultado de encontrar o valor inteiro da expressão X / Y (= 2 / 3) é 0 (zero). Este
valor (zero) será atribuído a variável Z no final.
Paralelamente, outros valores das variáveis X e Y irão produzir outros resultados. Por exemplo, se:

int X = 7; / / O valor de uma variável int


int Y = 3; / / O valor de uma variável int
int Z = X / Y; / / Divisão operação,
então o valor de 7 / 3 para a expressão X / Y e Z variável é igual a 2 (dois).
Ordem das Operações

A regra consiste em calcular o seguinte:

O valor de uma expressão é calculada de acordo com as prioridades das operações


aritméticas e da esquerda para a direita, cada resultado intermediário sendo calculado
de acordo com as regras typecasting.

Vamos considerar o cálculo para que uma expressão no seguinte exemplo:

Y = 2,0 * (3 * X / Z - N) + D; / / exemplar expressão


A expressão à direita do sinal da igualdade consiste em duas summands: 2,0 * (3 * X / Z - N) e D. O
summand 2,0 * (3 * X / Z - N) é constituída por dois factores, a saber: 2 e (3 * X / Z - N). A expressão
entre parênteses, 3 * X / Z - N, por sua vez, consiste de dois summands, o summand 3 * X / Z
constituído por três elementos, a saber: 3, X e Z.

A fim de calcular a expressão do direito à igualdade de assinar, vamos, em primeiro lugar, calcular o
valor da expressão 3 * X / Z. Esta expressão contém duas operações (multiplicação e divisão) do mesmo
nível, por isso vamos calcular esta expressão da esquerda para a direita. Primeiro, vamos calcular o valor
da expressão 3 * X, a este tipo de expressão a ser o mesmo que o tipo da variável X. Então, vamos
calcular o valor da expressão 3 * X / Z, o seu tipo a ser calculado de acordo com a typecasting
regra. Depois disso, o programa irá calcular o valor eo tipo da expressão 3 * X / Z - N, então - da
expressão 2,0 * (3 * X / Z - N), sendo a última - de toda a expressão 2,0 * (3 * X / Z - N) + D.

Como é fácil de ver, o fim das operações em um programa é semelhante ao que ocorreu em
matemática. No entanto, a antiga em um calculam difere dos tipos de valores nos resultados
intermédios, que exerce uma influência significativa sobre o resultado final dos cálculos. Particularmente
(ao contrário das regras aceites pela matemática), a fim de operandos em uma expressão é muito
importante. Para demonstrar isto, vamos considerar um pequeno exemplo.

Problema 6.Calculate os valores de expressões А / В С * e * А С / В para inteiros А, В,


e С.

O resultado do cálculo é intuitivamente que se espera que seja o mesmo, em ambos os casos. No
entanto, esta afirmação é verdadeira apenas para números reais. Se formos calcular os valores de
expressões compostas de operandos do tipo int,devemos considerar a semper resultados
intermédios. Nesse caso, a seqüência dos operandos é de fundamental importância:

int A = 3; / / Valor do tipo int


int B = 5; / / Valor do tipo int
int C = 6; / / Valor do tipo int
int = A Res_1 / B * C; / / Result 0 (zero)
int Res_2 = A * C / B; / / Resultado 3 (três)
Vamos seguir o processo de cálculo da expressão A / B * C:
1. Abertura (da esquerda para a direita), o valor da expressão A / B será calculado. De acordo com as
regras acima, o valor da expressão (3 / 5) é inteiro 0 (zero).
2. Cálculo da expressão С * 0 (zero multiplicado por С). O resultado é inteiro 0 (zero).
3. Geral resultado (o valor da variável Res_1) é inteiro 0 (zero).
Agora vamos seguir os desenvolvimentos do cálculo da expressão «A * C / B.
1. Cálculo de A * C. O valor dessa expressão é integer 18 (3 * 6 = 18).
2. Cálculo da expressão 18 / B. A resposta é óbvia: a parte fracionária após ter sido descartada, (18 / 5)
é inteiro 3 (três).
3. Geral resultado (o valor da variável Res_2) é inteiro 3 (três).
No exemplo acima, nós consideramos apenas um pequeno fragmento código, em que os valores das
variáveis do tipo int são calculados. Se vamos substituir essas variáveis constantes com os mesmos
valores, o resultado final será o mesmo. Ao calcular expressões que contenham números inteiros, você
deve dar uma maior atenção ao conteúdo do seu programa linhas. Caso contrário, poderá ocorrer um
erro no código, o que seria muito difícil de encontrar e corrigir mais tarde (principalmente nos grandes
programas). Tais problemas não ocorrem em cálculos usando números reais. Entretanto, se você utilizar
operandos com diferentes tipos em uma expressão complexa, o resultado final maio dependem de uma
aleatóriamente plenamente fragmentar formado contendo divisão de inteiros.
Na seção de Operadores, o prazo e propriedades gerais dos operadores são consideradas, enquanto
que as propriedades específicas de cada operadora são descritos no capítulo chamado Operadores.

Operadores

O prazo de operador

Um dos conceitos-chave de qualquer linguagem de programação é a expressão de


"operador". Codificação parece ser impossível para a pessoa que não tenha aprendido completamente
esse prazo. Quanto mais cedo e mais propriamente um programador aprende aquilo que os operadores
são e como eles são aplicados em um programa, o programador começa mais cedo este escrever seus
próprios programas.
Operador é uma parte de um programa, é uma frase de uma linguagem algorítmica, que prescreve um
determinado método de conversão de dados.
Qualquer programa contém operadores. A analogia mais próxima ao "operador" é uma frase. Assim
como normal frases compor o texto de uma história ou de uma novela, por isso os operadores compor
um programa.

Propriedades de Operadores

Existem dois tipos de propriedades de operadores - uma propriedade comum e propriedades específicas
dos diferentes operadores.
Propriedade comum dos operadores

Todos os operadores têm uma propriedade comum - todos eles são executados.
Podemos dizer que o operador é uma instrução que contém o manual de operações (a descrição de uma
ordem). Para um computador, executando um programa em execução no que significa (consecutiva
passagem de um operador para outro) cumprindo as ordens (receitas, instruções) contidas nos
operadores.
Operador, como tal, é apenas um registro, uma determinada seqüência de caracteres. Operador não tem
qualquer alavancas, fios ou células de memória. Esta é a razão pela qual, quando um computador está
executando um programa e nada acontece nas operadoras, como tal, eles continuarão a ficar no
programa como composto pelo programador. No entanto, o computador que tem todas essas células de
memória e de experiências entre elas todas as transformações no interior. Se o seu PC tem executado
algumas transformações de dados de acordo com as instruções contidas em uma operadora, você diria:
o operador tenha sido executada.
Propriedades específicas dos operadores

Existem vários tipos de operadores. Operadores de cada tipo têm as suas propriedades específicas. Por
exemplo, a propriedade de um operador atribuição é a sua capacidade de atribuir um certo valor à
variável concedido; lacete a propriedade de um operador está suas múltiplas execuções, etc
propriedades específicas das empresas são consideradas em todos os detalhes nas correspondentes
secções do capítulo Operadores neste livro. Vamos apenas dizer aqui que todos os tipos de operadores
têm as suas próprias propriedades que são típicas apenas para seu tipo e não são repetidas em qualquer
outro tipo.

Tipos de Operadores

Existem dois tipos de operadores: os operadores simples e compostos.


Simples Operadores

No MQL4 operadores simples terminar com o caracter ";" (ponto e vírgula). Usando este separador, o PC
pode detectar um operador onde termina um e começa outro. Caractere ";" (ponto e vírgula) é tão
necessária em um programa como caractere "."(ponto final), é necessário em um texto normal para
separar frases. Um operador pode ter várias linhas. Vários operadores podem ser colocados em uma
linha.

Cada operador simples acaba com carácter ";" (ponto e vírgula).

Exemplos simples de operadores:

Day_Next = TimeDayOfWeek (Mas_Big [n] [0] + 60); / / operador Simples


Go_My_Function_ind (); / / operador Simples

a = 3; b = a * x + n; i + +; / / Vários operadores em uma linha

Print ( "Dia =", TimeDay (Mas_Big [s] [0]), / / Um operador ..


"Hora =", TimeHour (Mas_Big [s] [0]), / / está localizada ..
"Minuto =", TimeMinute (Mas_Big [s] [0]), / / em vários ..
"Mas_Big [s] [0] =", Mas_Big [s] [0], / / linhas
"Mas_Big [s] [1] =", Mas_Big [s] [1]);

Operadores compostos (Compostos)

Um operador consiste em diversos compostos mais simples separados pelo caractere ";" e está incluído
no aparelho. A fim de ser capaz de utilizar vários operadores, onde apenas um se espera que seja
localizada, programadores utilizam um operador compostos (também eles chamam-lhe "bloqueio" ou
"bloco de código"). A lista de operadores em um composto é separado por chavetas . A presença de
uma marca o final Esquadro fechamento de um composto operador.

Um exemplar da utilização de um composto de um operador condicional. Começa com


o operador condicional if (expressão) seguido de um composto. Compostos O
operador contém uma lista de operadores executável.

Fig. 17. Composto operador.

O corpo de um composto operador está incluida no aparelho. Todos os compostos


operador termina com um fecho parêntese.

Exemplos de compostos operadores:


/ / Exemplo de operador mudar
switch (ii) / / Operador switch (expressão)
(/ / Abertura Esquadro
case 1: Buf_1 [Pok - f + i] = Prognoz; break; / / Nested operadores
(operador corpo)
case 2: Buf_2 [Pok - f + i] = Prognoz; break; / / Nested operadores
(operador corpo)
case 3: Buf_3 [Pok - f + i] = Prognoz; break; / / Nested operadores
(operador corpo)
) / / Fechando parêntese, ..
/ / .. mostra onde o operador termina compostos
//------------------------------------------------ ------------------------
-----------------
/ / Exemplar uso de loop
for (tt = 1; tt <= Kol_Point [7]; tt + +) / / Operator (expressões)
(/ / Abertura Esquadro
Numb Numb = + Y_raz [tt] * X_raz [ii] [tt]; / / Nested operador (operador
corpo)
) / / Fechando parêntese ..
/ / .. mostra onde o operador termina compostos
//------------------------------------------------ ------------------------
-----------------
/ / Exemplo do operador condicional se
if (TimeDay (Mas_Big [f] [0])! = 6 ) / / If (expressão)
(/ / Abertura Esquadro
Sred = (Nabor_Koef [ii] [vv] [2] + NBh) * Point; / / Nested operadores
(operador corpo)
Ind = Nabor_Koef [ii] [vv] [0] + f; / / Nested operadores (operador corpo)
Print ( "Ind =", Ind); / / Nested operadores (operador corpo)
) / / Fechando parêntese ..
/ / .. Mostra onde termina o composto operador

O corpo de um composto semper é vedado em suportes e pode consistir em zero, um


ou vários operadores.

Exemplos simples de operadores:

//------------------------------------------------ ------------------------
----------
/ / Exemplo do operador para
for (n = 1; n <= Numb; n + +) / / for (expressões)
Mas [n] = Const_1 + n * Pi; / / Nested operador (operador corpo)
//------------------------------------------------ ------------------------
----------
/ / Exemplo do operador condicional se
if (Tabela> Chair) / / if (expressão)
Norma = true; / / primeiro operador (suboperator 1)
else / / Else-condição
Norma = false; / / segundo operador (suboperator 2)
//------------------------------------------------ ------------------------
----------

Vários operadores simples podem ser combinadas em um composto operador, sem


quaisquer estritos necessidade.
Esta é uma situação rara, mas absolutamente admissível construção. Neste caso, os operadores estão
fechados no aparelho chamado de "um bloco de operadores". Esta utilização é totalmente aceitável. Este
é o programador que decide se juntar aos operadores de correias ou não, apenas por uma questão de
conveniência código representação. Um exemplar bloco de operadores:

(/ / Abertura Esquadro
Day_Next = TimeDayOfWeek (Mas_Big [n] [0] + 60); / / operador Simples
b = a * x + n; / / operador Simples
) / / Fechando parêntese ..

Requisitos para Operadores

Operadores deve ser escrito no texto de um programa de acordo com o formato regras (como eles
devem ser representados em um código). Nenhum operador pode ser composto para além dessas
regras. Se o programa contém um operador composto contra o formato regras, MetaEditor irá produzir
uma mensagem de erro na compilação. Isto significa que o programa contendo o operador não pode ser
mal utilizado.
Você deve entender a frase "operador formato" como um conjunto de regras formato típico de um
determinado tipo de operador. Cada tipo de operador tem o seu próprio formato. Operador de formatos
são consideradas em todos os detalhes em pontos correspondentes do capítulo Operadoras deste livro.

Ordem dos operadores execução

Uma característica muito importante de qualquer programa é da ordem de execução operadores


nele. Os operadores não pode ser executado por qualquer razão ou por exceção. Em MQL4, com a
seguinte ordem de execução seja aceite os operadores:

Os operadores são executados na ordem em que eles ocorrem no programa. A


direcção de operadores execução é aceite como da esquerda para a direita e para
baixo.

Isto significa que, simultaneamente simples e compostos operadores são executados apenas um por um
(como as linhas nos poemas: em primeiro lugar, podemos ler a primeira linha, então a próxima mais
baixa, então a próxima, e assim por diante). Se existem vários operadores em uma linha, devem ser
executados consecutivamente, um por um, da esquerda para a direita, em seguida, os operadores são
executados na linha inferior mais próximo na mesma ordem.
Operadores de compor um operador compostos são executados da mesma forma: qualquer operadora
do bloco de código começa a ser executado apenas depois de o anterior ter sido executado.
Escrever e Execução de Operadores: Exemplos

O texto de um programa contendo os operadores não é dissimilar no aspecto normal de um texto ou


uma notação matemática.No entanto, essa semelhança é apenas formal. Normal Um observa o texto
permite a ser colocados em qualquer ordem, considerando que é necessário manter um fim bem
definidos em um programa.
Como exemplo, vejamos como funciona uma missão operador. Iremos resolver uma equação linear
simples e comparar o sistema de representação de alguns cálculos matemáticos em um texto normal e
um programa em código, nos operadores.
Problema 7. Temos um sistema de equação:
Y=5
Y-X=2
O valor numérico da variável X está a ser encontrado.

Solução 1. Um texto normal numa folha de papel:


1. 5 - Х = 2
2. Х = 5 - 2
3. Х = 3
Solução 2. Um texto em um programa:

Y = 5; / / Linha 1
Y = X - 2; / / Linha 2
Tanto no primeiro como no segundo soluções, as notas (linhas) ter completado um conteúdo. No
entanto, as linhas na Solução 1 não pode ser usado em um programa como estão, porque o seu aspecto
não está em conformidade com a cessão operador formato.
As notas dadas na Solução 1 representam cerca dependências em formato papel. Eles só podem ser
utilizados para informar os programadores sobre as relações entre as variáveis. Operadores em um
programa são atribuídos a outros fins - a máquina elas informar que operações e em que ordem ele
deve executar. Todos os operadores, sem quaisquer excepções precisas instruções que representam
ambiguidades não permitem.
Solução 2 em ambos os operadores estão a cessão operadores. Qualquer cessão operador da máquina
dá a seguinte ordem, literalmente:

Calcule o valor da expressão à direita do sinal da igualdade e atribua o valor obtido


para a variável à esquerda do sinal da igualdade.

Por esta razão, nada mais, mas pode ser variável, localizado à esquerda da igualdade em assinar uma
cessão operador. Por exemplo, um registro de 5 - 2 = Х utilizada na primeira solução contém um erro,
porque o conjunto de caracteres 5 - Х não é uma variável. Esta é a razão pela qual não existe qualquer
célula de memória para colocar o valor numérico da expressão calculada para o lado direito do sinal da
igualdade.
Vamos seguir o computador durante a execução dos operadores da segunda solução.
1. Passando sobre o operador (linha 1).

Y = 5; / / Linha 1
2. Referenciar para o lado direito do operador (a parte direita está localizado entre a igualdade ea
assinar o ponto e vírgula).
3. O computador detectou que o lado direito do operador contém um valor numérico.
4. A gravação do valor numérico (5) na célula de memória variável Y.
5. Passando sobre o próximo operador (linha 2).
Y = X - 2; / / Linha 2
6. Referenciar para o lado direito do operador.
7. O computador detectou que o lado direito do operador contém uma expressão.
8. O cálculo do valor numérico do lado direito do operador (5 - 2).
9. A gravação do valor numérico (3) na memória do celular Х variável.
Executam os passos 1-4 até que o computador for execução da primeira operadora (linha 1). Executar
as etapas 5-9 até que o computador for execução do segundo operador (linha 2).

No fim de um código funcional programa, o programador deve perceber bem o quê e em que ordem
serão executadas neste programa. Particularmente, nem todos os cálculos matemáticos irão ser
colocadas em um programa, às vezes é necessário preparar a pré-operadores.
Por exemplo, muitos cálculos intermédios são efectuados quando resolvendo problemas
matemáticos. Eles podem ajudar um matemático para encontrar uma boa solução, mas revelar-se inúteis
do ponto de vista da programação. Apenas significativo soluções podem ser incluídos em um programa,
como por exemplo: valores originais das variáveis ou fórmulas para calcular os valores das demais
variáveis. No exemplo anterior, o primeiro operador suporta informações sobre o valor numérico da
variável Y, e com o segundo operador fornece a fórmula para calcular o valor da variável X estamos
interessados polegadas
Qualquer programa operacional contém expressões de um familiar vista, mas você também pode
encontrar tais expressões que você será capaz de entender apenas se você classificaria-los como
possíveis operadores em seu programa. Por exemplo, o registro abaixo

X = X + 1; / / Exemplo de um contador
parece estar errado do ponto de vista da lógica matemática eo bom senso. No entanto, é perfeitamente
aceitável se você considerar isso como um operador (por sinal, é que este operador é amplamente
utilizado na codificação).
Neste operador, calculamos um novo valor da variável X: quando executa a tarefa operador (ou seja, o
cálculo do valor da parte direita do operador), o computador refere-se a célula de memória contendo o
valor numérico da variável X (por exemplo , Ele acaba por ser igual a 3, no momento de se referir a ela),
calcula a expressão, na parte direita da cessão operador (3 + 1), e escreve o valor obtido (4) na
memória do celular previstas variável X. Execução de atribuição deste operador nos resultados que a
variável X recebe o novo valor (4). A máquina irá armazenar esse valor da variável X até que a variável X
ocorre na parte esquerda da igualdade assinar em outro operador atribuição. Neste caso, o novo valor
dessa variável será calculado e armazenado até a próxima possível mudança.

unções

O prazo de função

O mais importante avanço tecnológico em engenharia de computador é a possibilidade de criação e


armazenamento de código separado fragmentos que descrevem as regras de processamento de dados
para resolver um problema ou uma pequena tarefa.Tal possibilidade existe em MQL4, também.
Função é um chamado, uma parte específica do programa que descreve o método de conversão de
dados.
Falando em funções, iremos considerar dois aspectos: descrição e função chamada de função.
Descrição é uma função específica denominada parte de um programa destinado à execução.
Função chamada (função referência) é um recorde, o que resulta na execução de execução de uma
função.
No nosso quotidiano, podemos encontrar muitos análogos da função. Vejamos, por exemplo, o sistema
de travagem de um carro. O mecanismo de accionamento que executa corretamente travagem, bem
como a ideia implementada pelo engenheiro, é análogo ao de uma função, enquanto o pedal de freio é o
análogo da função chamada. O motorista pressiona o pedal para baixo, e os mecanismos de atuação e
realizar algumas ações - parar o carro.
Da mesma forma, se uma chamada de função ocorre em um programa, em seguida, a função de mesmo
nome será chamado e executado, ou seja, uma determinada seqüência de cálculos ou outras acções
serão executadas (por exemplo, exibindo uma mensagem ou abrir uma encomenda, etc .). O sentimento
geral é de uma função em um logicamente tendo concluído a parte do código fora do texto básico do
programa, enquanto que somente a chamada para esta parte do código permanece no interior do texto
básico do programa. Essa construção programa tem algumas vantagens inegáveis:

§ primeiro, o programa texto composto de tal maneira é muito mais fácil ler;
§ em segundo lugar, pode-se ver facilmente, e, se necessário, modificar o texto de uma função sem
fazer nenhuma alteração no código base do programa;
§ terceiro, uma função pode ser composto por um único arquivo e usá-lo em outros programas, que
irão liberar o programador da necessidade de inserir o mesmo fragmentos do código em cada
recém-criado programa.

Podemos dizer que a maior parte dos programas em código composto utilizando MQL4 está escrito na
forma de funções. Essa abordagem se espalhou e agora é um padrão.

Composição de uma Função

Assim, uma função pode ser descrita e ligou. Vamos considerar um exemplo. Suponhamos que temos
um pequeno programa (Fig. 18) que considera o comprimento da hipotenusa usando dois outros lados
do triângulo direito Pitagórica e Teorema.

Neste programa, todos os cálculos estão localizadas em conjunto, os operadores são


executados um por um, na ordem em que eles ocorrem no programa (de cima para
baixo).
Fig. 18. O código de programa único pifagor.mq4.

Problema 8. Compor uma parte do código como um dado programa funcione.

Seria razoável que se faça uma função utilizando as duas linhas que encontrar o valor pesquisa. O
mesmo programa usando uma função é mostrado na fig. 19.

Neste programa, uma parte dos cálculos é composta como uma função. A base
contém um código de utilizador definido função chamada. A descrição da função
definida pelo utilizador-se localiza fora (depois) o código básico.
Fig. 19. O código de um programa que contém a descrição da chamada e da função definida
pelo usuário-gipo.mq4.
Ambas as versões do programa vai dar o mesmo resultado. Contudo, o código é composto por um único
módulo na primeira versão (Fig. 18), enquanto que na segunda versão (Fig. 19) uma parte dos cálculos
é executado em uma função chamado a partir do texto base. Após a conclusão dos cálculos separados
para a função, os cálculos no código principal será continuado.
Para ter a função executada, temos que chamá-la (se referem a ele). Esta é a razão pela qual a função é
praticamente representadas em duas partes: o próprio código de compor a função (função descritiva) e
chamada de função usada para lançar a função (referindo-se à função). Se você não chamar a função,
ele não será executada. Ao mesmo tempo, se você chamar uma função inexistente, isso vai resultar em
nada (MetaEditior dará uma mensagem de erro se você tentar compilar esse programa em MQL4).
Função Descrição

A descrição de uma função básica é constituída por duas partes - função cabeçalho eo corpo função.
O cabeçalho consiste de uma função do tipo de valor de retorno, nome e função da lista de parâmetros
formais. A lista de parâmetros formais são fechados e colocados entre parênteses após o nome da
função. O tipo do valor de retorno pode ser um dos tipos que já sabemos: int, duplos, bool, cor,
datetime, ou string. Se a função não retorna nenhum valor, o seu tipo pode ser denotado como nulos (
"sem conteúdo, vazia") ou a qualquer outro tipo.
O corpo de uma função está incluida no aparelho. O corpo pode conter função simples e / ou
compostos operadores, bem como chamadas para outras funções. O valor devolvido pela função é dado
no retorno de operador parentesis (). O tipo do valor devolvido utilizando operador retorno (), deve
corresponder com o tipo de função especificado no cabeçalho da função. A descrição da função é
terminada com um fecho parêntese.
Fig. 20. Função descrição.

Descrição da função deve estar localizado em separado no programa, fora de


quaisquer outras funções (ou seja, não dentro de uma função, mas fora dele).

Função Chamada

Função chamada representa o nome da função e transferido a lista de parâmetros. A lista de


parâmetros é transferido dentro de parênteses. A chamada da função pode ser representado como um
operador separado ou como parte de um operador.

Fig. 21. Função chamada (referência a uma função).

Qualquer função chamada encontra-se dentro de outra função especificado (ou seja,
não fora todas as outras funções, mas dentro de um deles).

Tipos de função

Existem três tipos de funções - funções especiais, norma (built-in e pré-definido) funções, e funções
definidas pelo utilizador.
Funções Especiais

Em MQL4, existem 3 funções especiais no total. Eles têm nomes predefinidos: init (), start (), e deinit
() que não podem ser utilizados nos nomes de quaisquer outras funções. O exame detalhado das
funções especiais é dado no capítulo Funções Especiais. Estamos aqui apenas dizer que o código básico
de um programa está localizado no interior destas funções (Fig. 18, 19).
O recurso especial de funções especiais é o fato de que eles são chamados para execução pelo cliente
terminal. Embora todas as funções especiais têm propriedades de funções em geral, elas não são
habitualmente chamados a partir do programa caso este programa é o código corretamente.
Funções Standard
MQL4 tem uma série de funções úteis que não precisam ser descritas quando codifica um programa. Por
exemplo, computação raízes quadradas, imprimir mensagens no sistema de revista ou na tela - todas
estas e muitas outras funções habituais são executadas de acordo com o algoritmo predefinido. O
usuário não precisa de aprender o conteúdo de tais funções. Ele ou ela pode apenas ter a certeza de
que todas as funções habituais são desenvolvidas por profissionais devidamente e de acordo com a
melhor qualidade possível algoritmo.
O recurso especial do padrão funções são as que não são descritos no texto do programa. As funções
habituais são chamados no programa, do mesmo modo que quando se utilizam quaisquer outras funções
(é uma prática comum).
No nosso exemplo (Fig. 18, 19), são utilizadas duas funções habituais: MathSqrt () e Alert (). O ex-um é
destinado para computação de raízes quadradas, enquanto a segunda é uma mensagem para um
determinado texto fechado entre parênteses ao ecrã. As propriedades das funções habituais são
considerados em mais detalhes na seção Standard Funções. Aqui vamos notar que estes registros
representam o funcionamento normal chamadas, enquanto que nenhuma das descrições destas funções
podem ser encontrados no programa. Norma funções também pode ser chamado built-in, ou funções
previamente definidas. Você pode usar qualquer um desses termos.
Funções Definidas Por Usuário

Em alguns casos, programadores criar e utilizar as suas próprias funções. Chamamos essas funções
funções definidas pelo utilizador. User-defined funções são utilizadas em ambos os programas funcionam
com descrições e chamadas função.
Tabela 1. Função descrição e função chamada utilizados em programas para diferentes tipos de
funções.

Tipo de função Função Descrição Função Chamada


Especial Aplicáveis Não aplicável (*)
Standard Não aplicável Aplicáveis
Definido pelo usuário Aplicáveis Aplicáveis
(*) Embora funções especiais podem ser chamados a partir de um programa tecnicamente, não é
recomendável fazê-lo.
Propriedades de Funções

Função Execution

A principal propriedade de todas as funções que é chamado a funções são executadas. Funções são
executadas de acordo com os seus códigos.
Passou parâmetros e retornar valor

Quanto às informações recebidas e devolvidas, uma função é como uma calculadora padrão. Você pode
digitar (usando o seu teclado) uma certa expressão que consiste em diversos valores entraram um por
um, e você irá obter um valor como uma resposta. Uma função pode receber e processar um ou vários
parâmetros do programa que tem chamado para a execução desta função, bem como a função irá
terminar o seu funcionamento, pela devolução (transmissão, fornecendo) um parâmetro como uma
resposta a esse programa.
Os parâmetros passados são especificados pelo juntando em parênteses após o nome da função a ser
chamada. Os parâmetros passados estão normalmente separados por vírgulas. O número de parâmetros
passados à função, não deve exceder 64. A função pode omitir também passaram a utilizar
parâmetros. Neste caso, um vazio lista de parâmetros for especificado, ou seja, você só colocar um
parêntese de abertura e um fechamento parênteses, imediatamente após o nome da função.
O número, o tipo ea ordem dos parâmetros passados na chamada de função deve corresponder com os
dos parâmetros formais especificados na descrição da função (a chamada para uma função que tem
parâmetros predefinidos constitui uma isenção - verFunção Chamada e Função Descrição e ao Operador
" regresso "). Se não coincidirem, MetaEditor lhe dará uma mensagem de erro. Constantes, variáveis,
expressões e arrays podem ser utilizados como parâmetros passados.
O valor de retorno é especificada no retorno do operador parênteses () (ver Função Descrição e ao
Operador "regresso"). O tipo do valor devolvido utilizando operador retorno () deve corresponder com o
tipo de função a que consta do cabeçalho da função .É também possível que uma função não retorna
nenhum valor. Neste caso, nada é especificado no retorno do operador parênteses ().
No nosso exemplo, os parâmetros são passados variáveis A e B (fig. 21), enquanto que o valor de
retorno é variável c (Fig. 20).A exigência de adequação dos tipos de parâmetros passados e formal pode
ser visto na fig. 22.

O número, o tipo ea ordem dos parâmetros passados na chamada de função deve


corresponder com os dos parâmetros formais especificados na descrição da
função. Únicas variáveis que podem ser usadas no cabeçalho da função descrição
formal como parâmetros.

Fig. 22. Partida do número, o tipo ea ordem dos parâmetros passados e formal. Únicas variáveis são
utilizadas como parâmetros passados.

Apenas variáveis, constantes e expressões podem ser utilizados como parâmetros


passados.
Fig. 23. Partida do número, o tipo ea ordem dos parâmetros passados e formal. Uma constante, uma
expressão, e variáveis do tipo correspondente são utilizados como parâmetros passados.
Parâmetros formais

Um ponto alto das funções é a utilização de parâmetros formais.


Parâmetros formais são uma lista de variáveis especificadas no cabeçalho da função descrição.
Nós mencionado anteriormente que uma função pode ser usada em diversos programas. No entanto,
diferentes programas usam nomes diferentes para as variáveis. Se funções exigidas estrita
correspondência nos nomes de variáveis (e, correspondentemente, em seu valor), não seria conveniente
para programadores. Na verdade, você teria, então, para compor a cada novo programa desenvolvido
nos nomes de variáveis que já havia sido utilizado em sua função anterior. No entanto, felizmente, as
variáveis utilizadas dentro de funções não têm relações com as variáveis utilizadas em um programa.
Deixe a Fig's referem. 20 e 21, mais uma vez. Convém notar que os nomes dos parâmetros passados (A
e B são dadas dentro dos parênteses da função chamada) não coincidem com os nomes dos
parâmetros (a, b) especificados na descrição da função.Observamos na seção Constantes e
Variáveis MQL4 que é sensível a maiúsculas e minúsculas. Assim, os nomes e um A, B e bsão aqui
considerados diferentes nomes de variáveis. No entanto, não existe um erro no presente código.
As variáveis (parâmetros formais) utilizados na descrição da função não estão relacionadas com as
variáveis utilizadas no código base do programa. Eles são apenas diferentes variáveis. Apenas variáveis,
mas não constantes, podem ser especificados em função dos parâmetros formais como cabeçalho.
Como funciona

§ No programa, aí ocorre uma chamada de função, variáveis A e B serem especificados em suas


parênteses.
§ O programa chama a função de mesmo nome, que tem formal parâmetros a e b especificados
em seu cabeçalho.
§ O valor de uma variável é atribuído a uma variável.
§ O valor da variável B é atribuído a variável b.
§ O executável função executa cálculos utilizando os valores das variáveis a e b.

É permitida a utilização de nomes de parâmetros formais (que não coincidem com os nomes das
variáveis usadas no programa).Neste exemplo, usamos os identificadores dos parâmetros formais a e
b. No entanto, que poderíamos utilizar quaisquer outros, por exemplo, m
e n, ou Kat_1 e Kat_2. Claro que, quando se escreve um programa, você deve especificar a função no
organismo dos cálculos que usam os nomes das variáveis que são dadas no cabeçalho. Uma vez que
temos dado a e b, no cabeçalho, por isso temos que usar a função de a e b, não m e n.
Em uma função, os cálculos são feitos que envolvem formal parâmetros a e b, mas não variáveis A e
B. Em uma função, todas as acções podem ser admitidas na desempenham formal parâmetros a e
b (incluindo as alterações nos valores dessas variáveis). Isto não tem qualquer efeito sobre as
variáveis A e B.
O valor de retorno é calculado em função do dado no retorno do operador parênteses (). O valor de uma
variável, o resultado de uma expressão, ou de uma constante e pode ser utilizado como valor
devolvido. No nosso caso, este é o valor da variável local c (variavel local é uma variável declarada
dentro de uma função, se você sair da função, os valores de todas as variáveis locais serão perdidas;
vamos ponderar mais detalhes sobre variáveis locais na seção Tipos de Variáveis). A função retorna para
o programa o valor da variável local c (Fig. 19). Isso significa que esse valor passará a ser atribuído a
variável C.
Os cálculos adicionais no programa, se houver, pode ser realizada com as variáveis declaradas dentro da
função chamada. No nosso caso, é função especial chamada função start () (que contém a linha de
chamada do usuário-função definida), enquanto que as variáveis declarados dentro da chamada função
são A, B e C. Assim, em função dos cálculos são realizados utilizando os parâmetros formais, o que nos
permite criar funções arbitrárias usando nomes de variáveis, independentemente dos nomes dos valores
efectivamente utilizados no programa.
Exemplo: Standard Funções em um Programa

Em primeiro lugar, vamos examinar o comportamento do programa apresentado na Fig. 18. Devemos
notar que todo o código do programa está localizado no interior da função especial iniciar (). Na
presente fase de formação, não iremos dedicar especial atenção a este (funções especiais e suas
propriedades são consideradas em mais detalhes na seção Funções Especiais).
Vamos acompanhar a execução do programa começa com a atribuição operador:

int A = 3; / / Primeira cathetus


1. A parte direita da cessão contém o operador especificado constante, seu valor é 3.
2. O valor de 3 (o valor do lado direito) é atribuído a uma variável (que encontra à esquerda da
igualdade em assinar a cessão operador).
O controle é dada para a linha seguinte:

int B = 4; / / Segunda cathetus


3. A parte direita da cessão contém o operador especificado constante, seu valor é 4.
4. O valor de 4 é atribuído a variável B.
O programa vai para a execução da linha seguinte:

int C_2 A * = A + B * B; / / S hum dos quadrados dos catheti


5. Cálculo da parte direita da cessão operador. O resultado do cálculo é o valor de 25 (os detalhes de
como um programa refere-se a variáveis a ter os seus valores são considerados na seção Constantes e
Variáveis, pelo que não estamos aqui agora particularizantes este ponto).
6. Atribuição do valor 25 a variável C_2.
A próxima linha representa uma atribuição operador, o direito da parte que contém um apelo para que a
função padrão:

int C = MathSqrt (C_2); / / Cálculo da hipotenusa


O programa destina-se a executar a tarefa operador. Para isso, executa cálculos para a direita da
igualdade primeiro sinal.
7. O programa pede para execução da norma MathSqrt função () (que calcula raízes quadradas). O valor
da variável C_2 (no nosso caso, esse valor é igual a 25), será utilizado como parâmetro a
repercussão. Note que não há descrição da função deste padrão, em qualquer parte do programa. As
descrições das funções habituais não devem estar localizados em programas. No texto de um programa,
você pode facilmente distinguir o padrão função chamada pela sua aparência: eles são destacadas em
azul escuro com MetaEditor (programador pode escolher cores voluntariamente).
8. Os cálculos são feitos em função da norma MathSqrt ().
9. A função padrão MathSqrt () tenha cumprido os seus cálculos. Ela devolve o valor obtido. No nosso
caso, é o valor de 5 (araiz quadrada de 25).
O valor devolvido pela função é agora o conteúdo da gravação:

MathSqrt (C_2)
Esse registro pode ser considerada como uma especial, variável complexa, uma espécie de uma coisa,
dentro da qual os cálculos são realizados. Após estes cálculos foram concluídas, a coisa tem um valor. O
determinante aqui é o fato de que o valor devolvido pela função pode ser atribuído a uma outra variável
considerada ou em alguma outra cálculos.
10. Neste caso, o nosso valor é o valor da parte direita da cessão operador. Em prosseguimento à
execução da cessão operador, o programa irá atribuir o valor de 5 a variável C.
11. A linha seguinte contém referências ao operador que o padrão função Alert () (função chamada).

Alerta ( "hipotenusa =", C); / / Mensagem na tela


A norma função Alerta () abre uma caixa de diálogo onde os valores dos parâmetros passados são
mostrados. Neste caso, a função tem tomado os dois valores passados como parâmetros:
- O valor da string constante: hipotenusa =
- O valor da variável inteira C: 5
Foi mencionado anteriormente que nem todas as funções devem retornar o valor (que é o resultado da
execução da função). A norma função Alert () não retorna nenhum valor, uma vez que tem uma outra
tarefa - deve apresentar o texto na tela, em especial uma janela.
Como resultado da execução da norma função Alert (), na janela dessa função será exibida a seguinte
linha:

Hipotenusa = 5

12. O último operador neste programa completa o trabalho do grupo especial de função start ().

retorno; / / Função saída operador


O trabalho do programa está concluída neste momento.
Uma questão pode surgir: Como é que podemos saber qual função irá retornar o valor, e não aquilo? A
resposta a esta pergunta é óbvia: a fim de encontrar descrições detalhadas das funções embutidas, você
deve ler-se referência à documentação emMQL4.community, o site lançado pelo MetaQuotes Software
Corp, ou o Arquivo de Ajuda MetaEditor. As propriedades de uma função são definidos por usuários
especificados na sua descrição. User-se uma função definida retorna o valor ou não, depende de seu
algoritmo (a decisão é feita pelo programador na fase de escrever o código do programa funcionar).

Exemplo: Funções Definidas Por Usuário em um Programa

Vamos considerar o modo como as mesmas cálculos são feitos dentro do programa contendo uma
função definida de usuário (fig. 19). Uma certa parte do código que poderia ser encontrada
anteriormente em especial a função start (), não está disponível agora. Ela passa a ter a chamada para o
utilizador-função definida. No entanto, a função especial start () é seguido pela descrição do usuário-
função definida.
As primeiras duas linhas, nas quais inteiro variáveis A e B tomam valores numéricos, permanecem as
mesmas. Por conseguinte, nada muda na sua execução:

int A = 3; / / Primeira cathetus


int B = 4; / / Segunda cathetus
Na terceira linha, temos a missão operador. Sua parte direita contém a chamada para o utilizador-função
definida:

int Gipo C = (A, B); / / Cálculo da hipotenusa


6. Em execução deste operador, o programa irá, em primeiro lugar, chamamos a user-defined function.
Nota: A descrição da função definidos por usuários devem estar presentes em seu programa e colocado
imediatamente após o colchete que fecha a função especial start () (ou seja, fora da função especial).
Ao referir-se ao usuário-função definida, o programa irá executar as seguintes:
6.1. Apelando para a variável A, a fim de obter o seu valor (no nosso caso, 3)
6.2. Apelando para a variável B, a fim de obter o seu valor (no nosso caso, 4)
Nota: Logo que o programa começa a chamar a user-defined função (a função de usuário é definido, no
nosso caso específico, esta regra se aplica a todas as funções), o programa é apenas uma cópia dos
valores das variáveis usadas como passou parâmetros, enquanto que os valores dessas variáveis
próprias (neste caso, A e B) não estão a mudar devido à suposta aplicação do usuário-função definida,
nem eles realmente mudar.
7. O controle é passado para o usuário-função definida.
Durante todo o tempo de execução da função definidos por usuários (não importa quanto tempo leva),
os valores das variáveis do programa, não lhes chamar perdidos, mas será armazenado.
A primeira linha na descrição do usuário-definida é a sua função de cabeçalho:

int Gipo (int a, b int) / / Usuário-função definida


Sobre a execução do usuário-função definida, o programa irá fazer o seguinte:
7.1. O valor de 3 (o primeiro valor na lista de parâmetros passados) será atribuído a uma variável (a
primeira variável na lista de parâmetros formais).
7.2. O valor de 4 (o segundo valor na lista de parâmetros passados) será atribuído a variável b
(a segunda variável na lista de parâmetros formais).
Em seguida, o controle será passado para a função de órgão-lo para executar o seu algoritmo.
O primeiro operador, em função do órgão é:

int c2 = a + b * a * b; / / S hum dos quadrados dos catheti


7.3. Em execução deste operador, o programa calcula o valor na parte direita da cessão operador, e
depois que ele irá atribuir o valor obtido (no nosso caso, 3 * 3 + 4 * 4 = 25) a variável c2.
O próximo operador:

int c = MathSqrt (c2); / / hipotenusa


7.4. Aqui vamos encontrar a raiz quadrada do valor da variável c2. O fim das operações é o mesmo que
no exemplo anterior. A descrição da norma não é função usado tanto. A execução da tarefa operador irá
resultar em atribuir o valor de 5 a variável c.
7.5. Na próxima linha, temos operador:

retorno (c); / / Função sair operador


Em execução deste operador, o programa vai voltar (para a chamada local do usuário-função definida) o
valor fechado entre parêntesis deste operador. No nosso caso, é o valor da variável c, ou seja, 5.
Neste ponto, a execução da função definida pelo utilizador-se ao fim, o controle é dado à chamada local.
8. Lembrar que o usuário-função definida foi chamado a partir do operador

int Gipo C = (A, B); / / hipotenusa cálculo


The record (the user-defined function call)

Gipo (A, B)
na fase de devolução do valor, assume o valor calculado na função (em nosso caso, é o valor de 5).
Ao completar a execução da tarefa operador, o programa irá atribuir o valor de 5 para a variável C.
9. O próximo operador,

Alerta ( "hipotenusa =", C); / / mensagem na tela,


Esse programa será executado da mesma forma como no exemplo anterior, a saber: em uma janela
especial, há uma mensagem irá aparecer:

Hipotenusa = 5

10. O último operador neste programa,

retorno; / / Função saída operador,


completa o trabalho do grupo especial de função start (), e, simultaneamente completa o trabalho de
todo o programa (as propriedades de funções especiais são consideradas em mais detalhes na
seção Funções Especiais).

Vamos considerar algumas versões da aplicação acima de usuário definido função. É fácil verificar que a
programação com funções definidas por usuários tem algumas vantagens inegáveis.
Considerado anteriormente Implementação de Funções Definidas Por Usuário Gipo ()

Nesta função, os parâmetros formais "lembram" as variáveis utilizadas no programa básico. No entanto,
esta é apenas uma semelhança formal, porque um e um são os diferentes nomes de variáveis.

//------------------------------------------------ -----------------------
int Gipo (int a, b int) / / Usuário-função definida
(
int c2 = a + b * a * b; / / S hum dos quadrados dos catheti
int c = MathSqrt (c2); / / hipotenusa
retorno (c); / / Função saída operador
)
//------------------------------------------------ -----------------------

Implementação de Funções Definidas Por Usuário Gipo (): Versão 2

Neste caso, os nomes de parâmetros formais não "lembram" os nomes das variáveis usadas no
programa básico. No entanto, isso não nos impede de utilizar esta função no programa.

//------------------------------------------------ --------------------
int Gipo (int alfa, Betta int) / / Usuário-função definida
(
int * SQRT alfa = alfa + Betta Betta *; / / S hum dos quadrados dos catheti
GIP MathSqrt int = (SQRT); / / hipotenusa
retorno (GIP); / / Função saída operador
)
//------------------------------------------------ --------------------

Implementação de Funções Definidas Por Usuário Gipo (): Versão 3

Neste exemplo, a variável alfa é reutilizado no programa e muda o seu valor duas vezes. Este facto não
tem qualquer efeito sobre as variáveis reais especificadas na função chamadas do programa principal.

//------------------------------------------------ --------------------
int Gipo (int alfa, Betta int) / / Usuário-função definida
(
alfa = alfa alfa * + * Betta Betta; / / S hum dos quadrados dos catheti
alfa = MathSqrt (alfa); / / hipotenusa
retorno (alfa); / / Função saída operador
)
//------------------------------------------------ --------------------

Implementação de Funções Definidas Por Usuário Gipo (): Versão 4


Neste user-defined function, todos os cálculos são coletados em uma operadora. O valor de retorno é
calculado diretamente no retorno do operador parênteses (). O subduplicate é calculado directamente no
local onde passou o parâmetro deve ser especificado em função da norma MathSqrt (). Esta solução
pode parecer estranho para ser ou errado no começo. No entanto, não existe um erro na aplicação da
presente user-defined function. O número de operadores utilizados na função é menor do que em outras
implementações, para que o código acaba por ser mais compacta.

//------------------------------------------------ --------------------
int Gipo (int a, b int) / / Usuário-função definida
(
retorno (MathSqrt (a + b * a * b)); / / Função saída operador
)
//------------------------------------------------ --------------------

Assim, a aplicação de funções definidas por usuários tem algumas vantagens inegáveis em prática a
programação:

§ Os nomes das variáveis do texto básico do programa não tem relações formais com os nomes dos
parâmetros definidos por usuários em uma função;
§ user-defined funções podem ser reutilizados em diferentes programas, não há necessidade de
alterar o código de um usuário-função definida;
§ bibliotecas podem ser criadas, se necessário.

Estas propriedades das funções muito úteis para permitir criar realmente grandes programas em uma
corporação, por exemplo.Vários programadores podem estar envolvidos neste processo simultâneo, e
eles uma liberada a partir da necessidade de chegar a acordo sobre os nomes das variáveis que
utilizam. A única coisa a ser acordada é a ordem das variáveis no cabeçalho e na chamada de função.

Maneira comum de fazer trades

Todos os cálculos e outras ações realizadas devido à execução de um programa aplicativo podem ser
divididos em dois grupos pelo local de sua execução: aqueles executados no PC do usuário e aquelas
executadas do lado do servidor. Um montante significativo de cálculos é realizada sobre o lado do
usuário. Este grupo inclui a execução de programas aplicativos. Trades pertencem ao segundo grupo.
Making trades implica conversão de dados no servidor.
Considerando trades, vamos distinguir os seguintes termos:
Mercado fim - é executada uma ordem para comprar ou vender activos a um símbolo (a segurança).
Um mercado é exibido no fim da janela do símbolo até o fim está fechado.
Enquanto se aguarda ordem é uma ordem comercial para comprar ou vender activos a um
segurança (um símbolo) quando o preço predefinido nível seja atingido. Enquanto se aguarda despacho
do símbolo é exibido na janela até que ela se torna uma forma ou de mercado é eliminado.
O comércio é uma solicitação feita pelo comando de um programa ou por um comerciante, a fim de
realizar um comércio.
O comércio é abertura, o encerramento ou a alteração do mercado e encomendas pendentes.
Comércio tornando diagrama

Três componentes estão envolvidos na realização trades: um programa aplicativo, o cliente eo servidor
terminal (consulte a fig. 65). A solicitação é formada no programa (como já mencionado acima,
quaisquer programas aplicativos podem ser executados apenas no PC do usuário; nenhum pedido os
programas estão instalados no servidor). A solicitação formada pelo programa será passada para o
cliente terminal que, por sua vez, envia o pedido para o servidor. Ao lado do servidor, a decisão sobre o
pedido execução ou rejeição será feita. As informações sobre os resultados obtidos serão passados pelo
cliente para o servidor de terminal e, em seguida, para o programa.

Fig. 65. Diagrama de pedirem para fazer negócios.


Solicitando

Um comércio solicitação pode ser feita por um profissional ou por um programa. Para um profissional
para ser capaz de fazer um pedido ao cliente terminal prevê o "Orders" painel de controle (consulte a
descrição do cliente terminal). As solicitações são feitas no programa, de acordo com o algoritmo, como
um resultado da execução do comércio funções. Em mais lado nenhum (nem no terminal do cliente nem
no servidor) o comércio pedidos são formados espontaneamente.
Programa Features

Dependendo do algoritmo, um programa pode formar diferentes solicitações - a abertura, o


encerramento ou a alteração do mercado e encomendas pendentes. O comércio funções seguintes são
usados em um programa para formar comércio pedidos:

§ OrderSend () - para abrir mercado e encomendas pendentes;


§ OrderClose () e OrderCloseBy () - para fechar ordens de mercado;
§ OrderDelete () - para apagar encomendas pendentes;
§ OrderModify () - para modificar mercado e encomendas pendentes.

O comércio funções acima pode ser usada somente Especialista em Advisors e scripts; a utilização destas
funções dos indicadores é proibida (ver também Quadro 2). Existem outras funções que pertencem ao
comércio queridos (ver arquivo em MetaEditor e ajudar a secção Comércio Funções presentes neste
livro). No entanto, a sua execução foi atribuída a abertura de informações do terminal ambiente, a fim
de obter as informações referenciais, de modo que não resulte na formação de pedidos e apelando para
o servidor.
Características do Terminal Client

Um pedido apresentado pelo programa como um resultado da execução de uma função comercial é
passada para o cliente terminal para o processamento. O cliente terminal conteúdo analisa o pedido e
executa um dos dois seguintes ações: ou envia o pedido para o servidor para que ele seja executado no
servidor, ou rejeita o pedido e envia nada para o servidor.
O cliente terminal só permite corrigir os pedidos para serem enviados para o servidor. Se o programa é
codificado de tal forma que ela faz, por exemplo, um pedido de abertura de uma ordem a um preço não-
existente, o cliente não vai enviar este terminal pedido para o servidor. Se o programa formas corretas
pedidos (encomendas são abertas e fechadas, o mais tardar, conhecida preço, a ordem está dentro da
faixa de valor limitado pela lidar center, etc) e, em seguida, este pedido será enviado para o servidor.
Apenas uma thread execução está prevista no terminal do cliente para realizar negócios. Isto significa
que o cliente terminal pode funcionar em simultâneo com um só pedido. Se existem vários scripts Expert
Advisors ou comerciais no terminal cliente e nenhum programa tenha passado um comércio solicitar ao
cliente terminal, o comércio de todas as solicitações outra Expert Advisors e scripts serão rejeitadas até
que o cliente terminal completa transformação do actual pedido, ou seja, , Até que a thread está livre
comércio.
Características do Servidor

As informações sobre comércio história para cada conta (abertura, encerramento, que modifica ordens)
é altamente garantidos pelo servidor e é uma das mais prioritárias, em comparação com o histórico de
rotas armazenadas no cliente de terminal. O direito de executar os pedidos comércio é concedida apenas
a um revendedor ou para o servidor que processa pedidos automaticamente (se a lidar centro fornece o
servidor com esse recurso para um determinado período de tempo). A solicitação de que sejam
entregues no servidor pode ser tanto executadas ou rejeitadas. Caso o pedido seja executado comerciais
(ou seja, um comércio que se faça), o servidor irá fazer todas as conversões de dados. Se o comércio
pedido é rejeitado, o servidor não converte os dados. Não importa qual decisão (para executar ou que
rejeite um pedido) for feita, as informações sobre esta decisão vai ser passada para o cliente terminal
para sincronizar a história.

Um pedido comércio formada como resultado da execução do programa e um


comércio solicitação formada pelo comerciante manualmente são absolutamente os
mesmos, sob a ótica do servidor, de modo que o servidor não faz qualquer distinção
entre os pedidos quando o processamento deles.

Também é possível no lado do servidor Expert Advisors para proibir o comércio no terminal cliente. Por
vezes é necessário, se o programa operação gera conflitos. Por exemplo, se a implementação de um
algoritmo resultados incorretos em que o programa continuamente formas comerciais alternante pedidos
de abertura e fechamento de ordens com intervalos de tempo muito pequeno (por exemplo, em todos
os carrapatos), ou se os pedidos de abertura, supressão ou modificação das encomendas pendentes são
demasiado frequentes.
Processo de negociação

O procedimento de realizar transacções está interativa e percebi na modalidade real-time. O diagrama


(fig. 66) mostra todos os eventos relacionados ao Comércio realizando um.

Fig. 66. Evento em fazer uma seqüência comércio.

Evento 0. O programa é lançado para execução no momento t0.


Evento 1. No momento t1, o programa já formou um pedido comércio como um resultado da execução
de uma função comercial. O comércio pedido é passado para o cliente de terminal. Naquele momento, o
programa passa o controle para o cliente terminal e pela execução do programa está parado (o ponto
vermelho no desenho).
Evento 2. Terminal O cliente não recebeu o controle e informações sobre o conteúdo do pedido. Dentro
do período de tempo entre T2 e T3, o cliente terminal analisa o conteúdo do pedido comércio e torna
uma decisão sobre novas manifestações.
Evento 3. Terminal O cliente que realiza feitos decisão (uma das duas alternativas).
Alternativa 1. Se o pedido comércio formada como resultado da execução de uma das funções
comerciais acabou por se revelar incorrectas, o controlo é passado para o programa. Neste caso, o
próximo evento será Evento 4 (isso pode acontecer se, por exemplo, o programa tiver enviado o pedido
de abertura de uma ordem, o que excede o valor da conta de capital disponível).
Evento 4. O programa tem recebido o controle (t4 momento, ponto verde) e pode continuar execução a
partir do local onde o pedido anterior tenha sido formado. Ao mesmo instante, o programa tem recebido
informações sobre a forma que o comércio não tenha sido executada. Você pode encontrar informações
sobre o motivo, para a qual o comércio pedido não tenha sido executada, analisando a regressou a ode
de erro. Abaixo iremos analisar a questão de como fazer isto. Aqui, há que notar que não apenas todos
os pedidos resultar em execução de ordens. Neste caso, o programa já formou uma solicitação incorreta,
o que resulta em que o cliente terminal tem rejeitado este pedido e devolveu o controle para o
programa. Neste caso, não faz referência ao servidor tem lugar. Os intervalos de tempo entre t1 - t2 - t3
- t4 são negligibly curto e não ultrapassem, no total, várias ms.
Alternativa 2. Se o programa tem formado um corretas comércio pedido, o cliente terminal envia esse
pedido para o servidor, o próximo evento será Event 5 (o momento do T5) - o servidor receberá o
comércio pedido. A ligação entre o cliente eo servidor terminal é estabelecida através da internet, assim
o tempo gasto com o envio do pedido ao servidor de comércio (intervalo de tempo entre T3 e T5) é
totalmente dependente da ligação de qualidade. Para uma boa qualidade de conexão, este prazo pode
ser de aproximadamente de 5 a 10 ms, considerando que ele pode ser medido em segundos, no todo
má conexão.
Evento 5. No momento, o T5, o servidor recebeu o pedido comércio. O servidor pode executar ou
rejeitar essa solicitação recebida. A decisão de executar ou indeferimento do pedido pode ser feita no
lado do servidor dentro de um determinado período de tempo (no momento T6). O intervalo de tempo
entre T5 e T6 podem variar de alguns milisegundos para as dezenas de segundos, dependendo da
situação. Em alguns casos, se o servidor funciona no modo automático e não há movimentos rápidos no
mercado e outros comerciantes não estão muito activas, o comércio pedido pode ser executado ou
rejeitado dentro de alguns milisegundos. Em outros casos, se o servidor está sobrecarregado devido à
grande actividade dos operadores e se a decisão de executar ou indeferimento do pedido é feita por um
revendedor humanos, o tempo tomado a decisão tomada pela possibilidade de contar com as dezenas
de segundos.
Evento 6. Se não houver mudanças consideráveis têm lugar no mercado dentro de um intervalo de
tempo a partir do momento em que fazem o comércio pedido pelo programa (t1) para o momento da
decisão tomada pelo servidor (T6), o comércio solicitação será executada, como uma regra. Se o preço
do símbolo mudou dentro deste tempo ou o valor da encomenda a ser aberto é livre superior a equidade
da conta no momento da tomada da decisão, ou outros impedimentos ocorrem, em seguida, o servidor
decida rejeitar o pedido comércio.
O servidor da rejeição dos pedidos comércio (embora eles já tenham sido controlados pelo cliente
terminal) é frequente. Em geral, a maior parte das trocas comerciais que os pedidos são entregues ao
servidor para execução são aceitos pelo servidor.Porém, em alguns casos, o pedido pode ser rejeitado,
por isso o seu programa aplicativo deve ser codificado de modo a que ele tem essa possibilidade em
consideração, e funciona correctamente, em tais situações.
Qualquer que seja decisão (para executar / rejeitar um pedido comércio, evento 6) é feita pelo servidor,
as informações sobre ele é enviado pelo servidor ao cliente terminal que tenha entregue o pedido.
Evento 7. Terminal O cliente não recebeu resposta do servidor. A resposta do servidor segue o mesmo
caminho por meio da Internet, dado que o pedido entregue ao servidor, por isso o tempo despendido
com a resposta do servidor que recebe completamente depende da qualidade da conexão. De acordo
com as modificações feitas no servidor, o cliente terminal irá reflectir as alterações correspondentes. Por
exemplo, se a execução de um pedido comércio resulta em fechamento ou abertura de um despacho, o
cliente terminal irá mostrar graficamente este evento na janela do símbolo e textualmente no "Terminal"
janela (os separadores «Comércio» e «História da conta ') . Se o servidor rejeitou o pedido comércio,
nenhuma alteração será feita em nenhuma das janelas do terminal do cliente.
Evento 8. Terminal O cliente já completou a exibição das mudanças e é passar o controle para o
programa.
Evento 9. O programa tem recebido o controle e pode continuar operando.
Observe:

A partir do momento em que o programa envia um pedido comerciais (e


simultaneamente passa o controle) para o cliente terminal, para o momento em que o
controle é retornado para o programa, este é um modo de espera nos. N º operações
são feitas no programa durante este período de tempo. O controle é retornado para o
programa de acordo com a regra para a execução chamada para a função que tem
formado a pedido comércio.

Se o comércio solicitação está incorreta e, em seguida, o programa não estiver em modo de espera por
um longo tempo (o intervalo entre T1 e T4). No entanto, se o pedido for comércio 'aprovado' pelo
cliente e enviados para o terminal server, a duração do programa período de espera (t1-t9) pode ser
diferente e depende tanto da qualidade da conexão e do tempo de tomada de decisões tomadas por do
servidor - para vários milissegundos para minutos.
Logo que o programa recebe o controle, ele pode continuar operando. O programa operacional pode
analisar o código do último erro retornado pelo cliente terminal e, desta forma, encontrar-se sobre se o
comércio pedido foi executado ou rejeitadas.
Conflitos em Making Trade. Erro 146

Ao considerar acima Características do terminal do cliente, temos dito que o cliente terminal poderia
processar um pedido em um só momento. Vamos considerar agora o que eventos irão ter lugar se vários
pedidos formado por diferentes programas será passado para o cliente de terminal.

Fig. 67. Conflitos de passagem, vários pedidos para o cliente terminal de diferentes programas.
Na fig. 67, podemos ver que dois negociação Expert Advisors são lançados para execução no cliente
terminal simultaneamente.EA1 formaram um comércio solicitação no momento t1 e ela passou o cliente
terminal no momento t2.
EA2 criou também um pedido e remete para o cliente terminal quando o cliente terminal está
processando o primeiro pedido (período de t2 para t3). Nesta situação, o cliente terminal não pode
considerar a solicitação formada por EA2, de forma que ele vai rejeitar esse pedido e devolver o controle
para EA2. Observe que, neste caso, o pedido é rejeitado pelo cliente terminal para o pedido não for
errada, mas porque o terminal está ocupado com o processamento do pedido do outro. EA2 continuará
operando. É possível analisar o código de erro que explica a razão pela qual o pedido foi indeferido (no
nosso caso, trata-se de erro 146).
Se é EA2 (em um caso geral, ele pode ser um ou vários programas comerciais) que passa a sua
solicitação para o cliente terminal, dentro do período de tempo entre T1 e T4 e, em seguida, este pedido
será indeferido (um grupo de eventos na área rosa). O terminal cliente torna-se livre de momento t4
(ponto verde). A partir deste momento, EA2 pode passar com sucesso o seu pedido para o cliente final
(um grupo de eventos na área verde). Esta solicitação será recebida e analisada pelo cliente terminal
que pode finalmente rejeitá-lo, também, mas pela razão de sua incorreção, ou ele pode enviar esse
pedido para o servidor.
Se o negócio criado por EA1 pedido é considerado pelos clientes como terminal correcto, este pedido
será enviado pelo cliente para o servidor de terminal no momento t3. Neste caso, o cliente terminal e
muda para o modo de espera e não pode considerar qualquer outro comércio pedidos. O cliente terminal
só se tornará livre para considerar os pedidos de outras trocas de momento t9. Assim, de acordo com a
variação 2, o cliente terminal não pode analisar os pedidos comércio dentro do período de tempo entre
t1 e t9. Se dentro desse prazo, qualquer programa refere-se ao cliente terminal, a fim de passar um
pedido de consideração, o cliente terminal irá rejeitar esta evento e passar o controle para o programa
(um grupo de eventos na área rosa, dentro do período de tempo entre T6 e T7). O programa que
recebeu o controle continua a sua actividade e, através da análise do código de erro, pode encontrar-se
sobre a razão, pela qual o pedido foi indeferido (neste caso, trata-se de erro 146).
A partir do momento t9, o cliente terminal será totalmente livre para qualquer outra analisam os pedidos
comerciais. EA2 pode passar com sucesso o comércio pedido para o cliente terminal, dentro do período
de tempo que decorre o momento t9. De acordo como o cliente terminal considerar o pedido correto ou
não, o pedido será passado pelo cliente para o servidor de terminal ou rejeitado.
A análise dos erros que ocorrem na tomada de tráfegos são consideradas em mais detalhes nas seções
abaixo.

Ordem características e normas relativas à elaboração de ofícios

Antes de começarmos a descrever comércio funções, devemos considerar parâmetros que caracterizam
os preços de mercado, tipos de ordem, as suas características, bem como as regras para fazer negócios.
Características dos símbolos

Em primeiro lugar, devemos considerar o princípio utilizado pelas corretora empresas para formar os
preços dos valores mobiliários. Este princípio consiste em que o corretor ofereça ao comerciante uma
citação, em ambos os sentidos para a realização de negócios.
Bidireccional para a citação está ligado um par de mercado os preços oferecidos pela corretora para
a compra e venda de activos para uma segurança (símbolo), no momento presente.
Lance é o menor dos dois preços oferecidos pela corretora em uma bidireccional para citar um
segurança.
Pergunte se o mais elevado dos dois preços oferecidos pela corretora em uma bidireccional para citar
um segurança.
O ponto é o preço unitário de medição de um símbolo (o preço mínimo possível mudar, o último
algarismo significativo do preço do valor).
Spread é a diferença entre os maiores e os menores preços nos pontos em um bidireccional para citar
um símbolo.
Normalmente, a propagação é um valor fixo. Em Metatrader 4, admite-se que devem ser apresentadas
na janela do símbolo gráfico que reflete apenas mudanças preço de lance:

Fig. 68. Um preço normal de um símbolo gráfico.


Fig. 68 mostra-nos um símbolo janela onde podemos ver a evolução da oferta e os preços, em ambos os
sentidos citar - a linha do actual preço de lance (preto, 1,3005) e da linha do Pergunte ao preço corrente
(vermelho, com 1,3007). Ele pode ser facilmente visto que, neste caso, a corretora oferece um spread
de 2 pontos. A história Pergunte para o preço não é mostrado no gráfico, mas é implícita e pode ser
facilmente calculada para qualquer instante do tempo.
Ordem tipos e características

Existem seis tipos de ordem no total: dois tipos de ordens de mercado e quatro tipos de ordens
pendentes.
Comprar é um mercado que define ordem de compra de activos a um símbolo.
Vender é um mercado que define ordem de venda dos activos a um símbolo.
BuyLimit está pendente uma ordem de compra activos para uma segurança a um preço inferior ao
actual. A ordem será executada (Buy modificados na ordem do mercado) Pergunte se o preço atinge ou
cair abaixo do preço fixado na ordem pendente.
SellLimit está pendente uma ordem de vender activos para uma segurança a um preço superior ao
actual. A ordem será executada (modificado em ordem Vender mercado) se o preço de lance atinge ou
ultrapassa o preço estipulado na ordem pendente.
BuyStop está pendente uma ordem de compra activos para uma segurança a um preço superior ao
actual. A ordem será executada (Buy modificados na ordem do mercado) Pergunte se o preço atinge ou
ultrapassa o preço estipulado na ordem pendente.
SellStop está pendente uma ordem de vender activos para uma segurança a um preço inferior ao
actual. A ordem será executada (modificado em ordem Vender mercado) se o preço de lance atinja ou
cair abaixo do preço fixado na ordem pendente.
O volume do lote é uma ordem expressa na quantidade de lotes.
StopLoss é uma ordem stop, que é um preço estipulado pelo comerciante, um mercado em que a
ordem será encerrada se o símbolo preço se move numa direcção que produz prejuízos para a ordem.
TakeProfit é uma ordem stop, que é um preço estipulado pelo comerciante, um mercado em que a
ordem será encerrada se o símbolo preço se move numa direcção que produz lucros para o fim.

Negociação requisitos e limitações

No intuito de forma correcta a sua aplicação no comércio pedidos programas (Expert Advisors e scripts),
você deve tomar os requisitos e as limitações existentes em consideração. Vamos analisá-las em mais
detalhes.

Todos os negócios são realizados a preços correctos. A execução de preço para cada
comércio é calculado com base no preço correto de uma citação, em ambos os
sentidos.

A regra está acima da regra comum para todos os participantes do mercado e não pode ser alterado na
vontade dos desenvolvedores de uma plataforma de negociação ou na base de um acordo entre um
corretor e um comerciante. Isto significa, por exemplo, que um mercado só pode ser aberta vista ao
actual preço de mercado, mas não a qualquer preço outros. Corrigir-O método de cálculo de preço para
os diferentes ofícios é considerado baixo.
Ao calcular os preços corretos, também é necessário considerar as limitações do prestador de serviços
(referente ao centro).Estas limitações incluem a distância mínima, e no congelamento de distância. Essas
limitações significam que o corretor tem algum tempo para os preparativos para a realização de novos
ofícios, se convertendo em uma ordem pendente um mercado ou fechar uma parada por uma ordem
judicial.
Centros que tratam do valor do limite mínimo admissível diferença entre o preço de mercado, bem como
o preço de cada uma das ordens de parar de uma ordem de mercado entre o preço de mercado, bem
como o preço de uma encomenda pendente, assim como entre o preço de uma pendência e solicitou o
fim dos seus preços ordens stop. Isto significa, por exemplo, que um comércio no pedido de abertura de
um mercado único modo que você pode especificar a ordem para parar de preço valores que não estão
distantes do actual preço inferior ao mínimo prescrito distância. Um comércio pedido contendo ordem
para parar de preços que se encontram mais perto do preço de mercado do que a distância mínima é
considerado pelo cliente terminal como uma incorrecta. Diferentes centros que tratam pode estabelecer
diferentes, tratando-center limitações específicas para a distância mínima permitida. Como regra, o valor
dessa distância varia entre 1 e 15 pontos. Para os mais comumente utilizados valores mobiliários (EUR /
USD, GBP / USD, EUR / CHF, etc), essa distância torna, na maioria dos centros que tratam 3.5
pontos.Diferentes valores podem ser de diferentes distâncias mínimas permitidas, também. Por exemplo,
este valor pode ser 50-100 pontos para o ouro. O valor da distância mínima para qualquer símbolo pode
ser alterada pelo corretor, a qualquer momento (o que normalmente precede a difusão de notícias
importantes comercial). Não há limitações para a distância máxima.
Parado distância limita a possibilidade de modificar os preços solicitados na pendência da sua abertura
ordena, bem como os níveis solicitados para parar de mercado que são ordens de congelamento na
área. Isto significa, por exemplo, que, se o preço de mercado é 1,3800, enquanto se aguarda o seu fim
é colocado para ser aberta em 1,3807 e os corretores da prescrição é de 10, enquanto se aguarda o seu
fim é a congelar no espaço, ou seja, você não pode modificar ou apagar. Em um mercado calmo,
corretores geralmente não definir congelar distância, ou seja, o seu valor = 0. No entanto, durante o
período precedente importante notícia ou de volatilidade em alta, pode estabelecer um corretor o valor
de uma certa distância congelar. Em diferentes condições e para diferentes corretores, esse valor pode
variar de 1 a 30 pontos básicos para ter símbolos e valores mais elevados para outros
símbolos. Corretora que pode mudar a congelar-distância valor a seu critério, a qualquer momento.

As limitações dos níveis de preços limitados pelos valores da distância mínima de


congelamento e distância são calculadas com base nos preços corretos.

Abertura / fechamento do mercado encomendas

A abertura de um mercado implica ordem de compra ou de venda de alguns activos de um símbolo, o


preço corrente de mercado (ver Requisitos e Limitações em Making Ofícios). Para abrir um mercado
despacho, utilizar função OrderSend (); para o seu encerramento, utilize OrderClose função ().

O correto do preço de mercado aberto fim Buy é o mais recente conhecido Pergunte
ao preço de mercado.
O correto do preço de mercado aberto fim Vender é conhecido o mais recente dos
preços no mercado de lance.

As limitações relacionadas à posição de paragem níveis de mercado a fim de ser aberto é calculado com
base no preço de mercado correto usado para o encerramento do fim.

StopLoss ordens e TakeProfit não podem ser colocados mais próximos do preço de
mercado do que a distância mínima.

Por exemplo, a distância mínima faz 5 EURUSD por pontos. Vender mercado é aberto no fim de lance =
1,2987. O preço correspondente com a forma quote-dois usado para encerrar este fim Vender é
Pergunte = 1,2989. A paragem seguinte será a níveis mais próximos dos actuais preços na ordem de
criação (ver fig. 69 e Requisitos e Limitações em Making Trades):
Pergunte StopLoss = + distância mínima = 1,2989 + 0,0005 = 1,2994, e
Pergunte TakeProfit = - distância mínima = 1,2989 - 0,0005 = 1,2984.

Fig. 69. Mercado com vista Sell Stop Níveis estar mais próximo do preço de mercado.
Se pelo requerente para a abertura de mercado na ordem de lance Vender = 1,2987 você parar de usar
os valores de nível mais próximo do que o acima queridos (SL = 1,2994 e ТР = 1,2984), o comércio
pedido será rejeitado pelo cliente terminal. Além disso, você deve levar em consideração que o preço
derrapagens são possíveis durante a abertura de ordens, o que resulta na abertura de sua ordem, a um
preço diferente do que o solicitado por você ter um certo valor especificado no pedido. Se o mesmo
pedido tenha especificado os valores de parar de níveis mais próximos dos preços solicitados abrir, este
pedido será igualmente rejeitado pelo cliente terminal, uma vez que, neste caso, o pedido não respeitar
a distância mínima exigida entre o preço de abrir o seu ordem bem como o preço de uma das ordens de
stop. Essa é a razão pela qual não é recomendado para uso no comércio pedidos de abertura de
mercado ordens de stop-ordem para valores mais próximos do fim aberto preço solicitado. Pelo
contrário, é recomendado para tem algum "livre jogo", isto é, precisar esses valores de ordens de stop
que seriam afastadas da requerida abertas preço da ordem de 1.2 pontos mais longe do que o valor da
distância mínima permitida.
Mercado encomendas podem ser fechados, como resultado da execução do pedido emitido por um
operador comercial ou pelo programa, assim como quando o preço atinge um dos preços previstos no
ordens stop.

O preço correto perto de um mercado para comprar o mais recente é conhecida dos
preços no mercado de lance.
O preço correto perto do fim Vender um mercado é o mais recente conhecido
Pergunte ao preço de mercado.

Se fecharmos fim Sell (Fig. 69), no momento atual, ela será encerrada às Pergunte = 1,2989, ou seja,
com uma perda de 2 pontos. Se permitirmos que isto fim permanecerem abertos por algum tempo e
Peça o preço cai para 1,2984, a ordem será encerrado com esse preço com o lucro de 3 pontos. Se o
preço de mercado cresce neste período de tempo e alcança Pergunte = 1,2994, a ordem será encerrado
com esse preço com uma perda de 7 pontos.
Caso o pedido tenha formado um pedido para abrir ou fechar uma ordem no mercado a um preço que
não corresponde com a mais conhecida do preço de mercado, o pedido será rejeitado pelo cliente
terminal.

A limitação relacionada ao fechamento das ordens de mercado é calculada com base


no preço de mercado utilizadas para corrigir fechamento da ordem.
Ordem não pode ser encerrada, se o preço da sua execução StopLoss ou TakeProfit
está dentro da faixa de distância de congelar o preço de mercado.

Por exemplo, a ordem indicada na fig. 69 pode ser fechada apenas os corretores se definir o valor da
distância congelar 4 pontos ou menos a partir do momento do fechamento. O preço de abrir este fim
não importa, neste caso. As bordas da banda para congelar o fim são calculados com base no preço de
mercado. Então, se for = 4, o preço superior, o aluno interno é igual a congelar + = 1,2989 + 0,0004 =
1,2993, enquanto o preço mais baixo do congelamento Boarder é, correspondentemente, - = 1,2989 -
0,0004 = 1,2985. Nestas condições, não está em parar vista a congelar área, de modo a ordem pode ser
fechada, se o profissional (ou um programa) envia uma solicitação ao servidor correto. Se o corretor tem
que definir a = 5, a partir do momento atual, as bordas da banda vai ser o congelamento, 1,2994 e
1,2984, respectivamente. Neste caso, cada uma ordem stop fica em congelar o pensionista, ou seja,
sofre a definir pela corretor limitação, pelo que o despacho não pode ser encerrada às do comerciante
iniciativa ou por solicitação da negociação programa. Neste exemplo, ambos submetidos à limitação
ordens stop. Num caso geral, uma ordem no mercado não podem ser fechadas por iniciativa do cliente
terminal, se pelo menos um nível de parar isto é, em ordem a congelar área.
Se são duas ordens de mercado aberto para um símbolo simultaneamente, sendo um deles a um outro
Comprar e Vender sendo, elas podem ser fechadas em uma das duas maneiras: você pode fechá-las,
consecutivamente, um por um, utilizando OrderClose (); ou você pode fechar uma delas utilizando um
pelo outro OrderCloseBy (). Em termos de poupança de dinheiro, a segunda forma é a mais preferível,
porque você vai guardar propagação em um fechamento ordens por si. O uso de funções comercial é
tratada com mais detalhes a seguir neste livro.
Colocação e excluindo Pendentes encomendas

A ordem pendente requerida implica o fim abertas preço diferente do preço corrente de mercado. Para
colocar encomendas pendentes, utilizar função OrderSend (). Use OrderDelete função () para excluir
uma ordem pendente.

Enquanto se aguarda ordens SellLimit e BuyStop são colocadas a um preço superior ao


preço corrente de mercado, enquanto que BuyLimit e SellStop são colocadas a um
preço inferior ao preço corrente de mercado.

A limitação relacionada com a posição da ordem pendente deve ser colocada é calculado com base no
preço de mercado para corrigir uma conversão em um mercado na expectativa ordem judicial.

Enquanto se aguarda ordens BuyLimit, BuyStop, SellLimit e SellStop não pode ser
colocada a um preço mais próximo do preço de mercado do que a distância mínima.

Por exemplo, para calcular o preço mínimo permitido para o fim BuyStop, você deve adicionar o valor
mínimo de distância para o mais recente conhecido Pergunte preço. Se StopLevel = 5, então o preço
mínimo permitido para colocar a ordem pendente BuyStop fará 1,3003 +0,0005 = 1,3008 (ver fig.
70). Isto significa que a ordem BuyStop podem ser colocados no atual momento em que o preço de
1,3008, ou a um preço mais elevado. Neste exemplo, BuyStop é colocada em 1,3015, o que é
perfeitamente admissível.

Fig. 70. Enquanto aguarda as encomendas são colocadas a um preço inferior ou superior ao preço atual.
O preço solicitado de ordem pendente BuyStop é 1,3015.
O preço solicitado de ordem pendente SellLimit é 1,3012.
O preço solicitado de ordem pendente SellStop é 1,2995.
O preço solicitado de ordem pendente BuyLimit é 1,2993.
No exemplo acima, todas as encomendas pendentes foram colocados em zero no bar no momento
mostrado na fig. 70, enquanto que a distância mínima para a colocação das encomendas feitas até 5
pontos. Ordem SellStop é o mais próximo do preço de mercado. Neste caso, Lance = 1,3001 bem como
o preço do SellStop = 1,2995. Assim, a distância entre a encomenda eo preço correcto das duas
apóstrofo-way (Bid) é de 6 pontos (1,3001 - 1,2995), ou seja, é mais do que exige a distância mínima.
Isto significa que, na abertura da ordem ( ou todas as outras ordens nesse exemplo), o comércio pedido
foi "aprovado" pelo cliente e enviados para o terminal server. O servidor também verificado a sua
conformidade com as exigências e decidiu executar o pedido para a colocação da ordem pendente
(ver Requisitos e Limitações em Making Ofícios).

A posição de ordens stop acompanha a ordens pendentes também é limitado pela distância mínima:

As limitações relacionadas à posição de paragem encomendas pendentes de uma


ordem é calculado com base no preço solicitado aberta na pendência da ordem e não
tem nenhuma relação aos preços de mercado.
StopLoss e de uma encomenda pendente TakeProfit não podem ser colocados para
mais perto do que o preço solicitado pelo valor mínimo de distância.
As posições de StopLoss e TakeProfit de encomendas pendentes não são limitados
pelo congelamento distância.

Na fig. 71, podemos ver na pendência SellLimit fim, a parar de ordens que não sejam mais perto do fim
solicitou preço possível.Neste caso, o preço solicitado fim = 1,2944, StopLoss = 1,2949, TakeProfit =
1,2939. Na distância mínima de 5 pontos, estes valores são bastante admissível.

Fig. 71. Enquanto se aguarda a ordem com ordens de stop tão próximo quanto possível ao fim.
Neste exemplo, enquanto se aguarda despacho SellLimit foi inaugurado em 18:07. Você pode ver na fig.
71 que, depois que o preço de mercado e, em seguida, atingiu o seu interromper cruzaram uma das
ordens, e depois caiu novamente. Este evento não influenciou a ordem pendente de qualquer forma:
uma ordem stop só pode fechar o fim do mercado, isto é, torna-se eficaz logo que a ordem pendente
será modificada em um mercado encomenda. Neste caso, enquanto se aguarda o despacho não seja
modificado em um mercado um (uma vez que o preço de lance não tenha chegado ao fim solicitou abrir
preço), de modo que o preço stop-fim atravessando este nível, não resultou em qualquer alteração.

A limitação relacionada com a supressão das encomendas pendentes é calculado com


base no preço de mercado aplicáveis para corrigir modificação de uma ordem
pendente em um mercado um.
Enquanto se aguarda ordens BuyLimit, BuyStop, SellLimit e SellStop não pode ser
suprimido, se for solicitado a abrir o preço da encomenda está dentro do intervalo de
congelar a distância entre o preço de mercado.

Ordem SellLimit pode ser suprimida no momento mostrado na fig. 71, já iniciada pelo cliente terminal,
apenas se o valor indicado neste momento é igual ou inferior a 8 pontos. Neste caso, a parte superior do
pensionista do congelamento banda (a ser calculado para SellLimit) fará: + = 1,2935 +0,0008 =
1,2943. O preço solicitado forma aberta torna 1,2944, ou seja, a ordem é colocada fora da banda
congelar e pode ser eliminado. Se o corretor define o valor a mais de 8 pontos, então a ordem pendente
SellLimit não pode ser suprimido eo cliente terminal rejeita o pedido comércio.
Na pendência da modificação encomendas em ordens de mercado

Enquanto aguarda as encomendas são automaticamente modificados em mercados em despachos do


servidor, assim não há funções são fornecidas para executar esta operação (ver Requisitos e Limitações
em Making Trades ).

Enquanto se aguarda ordens BuyLimit e BuyStop mercado sejam alteradas para uns, o
último caso conhecido Pergunte ao preço atinge o preço solicitado ordem pendente.
Pendentes SellStop ordens SellLimit e são modificados ao mercado queridos, se o
último preço conhecido atinge lances solicitados até o fim dos preços.

Quanto às encomendas pendentes mostrado na fig. 70, pode-se dizer o seguinte.


Enquanto se aguarda despacho BuyStop mercado está em ordem Buy modificados, se o preço atual
Pergunte ao atingir o valor de 1,3015.
Enquanto se aguarda despacho SellLimit é modificada em ordem mercado Sell, se o preço atual de lance
atingir o valor de 1,3012.
Pendentes SellStop ordem é modificada em ordem mercado Sell, se o preço atual de lance atingir o valor
de 1,2995.
Enquanto se aguarda despacho BuyLimit mercado está em ordem Buy modificados, se o preço atual
Pergunte ao atingir o valor de 1,2993.
Os eventos subseqüentes relacionados a essas ordens são mostrados nas Figuras 72-74.

Fig. 72. Modificação de encomendas pendentes no mercado queridos.


Na história ainda, a 2 outras encomendas pendentes também foram modificadas em mercado queridos.

Fig. 73. Modificação de encomendas pendentes no mercado queridos.

Fig. 74. Modificados (de mercado) as ordens são exibidas na janela do terminal.
Observe que, Fig. 73 mostra a abertura da ordem Comprar 4210322 (a antiga ordem pendente
BuyStop). Como é fácil de ver, as barras formadas em 18:55 não toque no preço de 1,3015. O preço
mais elevado no interior deste bar é 1,3013. Ao mesmo tempo, a janela do terminal (Fig. 74) mostra que
o tempo da ordem pendente foi modificado em um mercado específico dentro deste um bar, isto é, em
18:55.
Aqui é preciso salientar mais uma vez que o símbolo janela exibe apenas o preço mais baixo preço para
a história das duas apóstrofo-side, ou seja, que reflecte a história de lance. Pergunte a história não é
exibido. Esta é a razão pela qual você pode pensar que a pendência judicial foi modificada para o
mercado por um erro. No entanto, não há erro aqui, no presente caso. No momento, quando o preço de
lance foi igual a 1,3013, o preço Pergunte foi 1,3013 + 2 = 1,3015 (2 significa a disseminação de 2
pontos). Assim, o preço de mercado, ainda tocou a ordem requerida preço, e que resultou na alteração
automática da ordem pendente em um mercado um. A ordem foi modificada sobre os lado do
servidor. Imediatamente após isso, o servidor passou a informação acerca deste terminal para o cliente
que, por sua vez, que as informações exibidas na janela tanto o símbolo (gráfica) e na janela do terminal
(como um texto).
Semelhantes observações dizem respeito à alteração de ordem BuyLimit 4210411. Embora o gráfico
mostrando o preço da toca ou está abaixo do preço da ordem pendente solicitou BuyLimit no 16:37-
16:39 e em 16:41 (Fig. 72), no fim do mercado é aberto.Neste caso, o motivo para isso é o mesmo: o
preço de mercado Perguntar não tocar na ordem solicitada preço. Porém, ele tocou nesse nível nos
próximos bar, a 16:42. Este evento resultou na modificação da ordem pendente em um mercado um, de
forma BuyLimit na janela do símbolo foi substituído por Buy, enquanto uma nova ordem no mercado
aparece na janela do terminal.
No exemplo acima, todas as encomendas foram efectuadas com zero ordens stop (que significa sem
deixar de encomendas). No entanto, a disponibilidade de conteúdo (diferente de zero) valores de ordens
stop não irá influenciar a alteração das encomendas pendentes no mercado queridos de forma alguma,
uma vez que só podem ser modificados, se o preço das duas apóstrofo-way toca ou cruza a solicitadas
preço da ordem pendente.

A ordem pendente é uma modificação em um mercado sem qualquer relação com as


ordens de stop apenso.

A ordem pendente pode ser aberta (modificado em um mercado um) a um preço que não condiz com o
preço solicitado aberta na pendência da ordem. Isso pode acontecer em rápida mudança do preço de
mercado, ou seja, nas condições em que o preço mais conhecidos antes da abertura da encomenda não
tenha chegado ao preço solicitado, mas o próximo preço (na qual a ordem é aberta) não coincide com o
forma aberta preço, mas isso está além (Fig. 75).

a) preço gapped entre dois bares b) preço gapped dentro de um bar no seu formando
Fig. 75. Enquanto se aguarda uma ordem seja modificado em um mercado em um fosso.
Na fig. 75a, podemos ver uma possível variação de abertura da ordem pendente BuyStop (ela mostra
duas posições da ordem - antes e depois da abertura, na realidade, você pode ver, quer BuyStop
Comprar ou fim, mas não ambos). O mais recente dos preços antes de conhecer o preço saltou tinha
sido 1,9584. À 19:15, alguma notícia foi publicada, o que resulta em que o símbolo preço tinha mudado
em um salto. O primeiro preço conhecido após a notícia foi liberada é 1,9615. Normalmente, os preços
saltam para cima ou para baixo, como resultado de importantes notícias. Nesses casos, o corretor não
pode abrir o seu fim, o preço solicitado, pois não são correspondentes preços no mercado no
momento. Neste caso, a ordem pendente BuyLimit foi colocada ao preço de 1,9590 a requerida, mas ela
abriu (modificado para o fim do mercado), ao preço de 1,9615. Este facto resultou da constatação de
que não tinha havido qualquer outra dentro do intervalo de preços 1,9584 a 1,9615.
Como resultado dos eventos considerados, o mercado foi aberto no fim Compre um preço que era de 25
pontos pior do que o colocou na pendência de ordem BuyStop. Uma situação semelhante (que recebem
menos rentável do que o esperado em ordem) pode ter lugar para o fim SellStop, se o preço saltou para
baixo. No entanto, se pendente fim BuyLimit ou SellLimit-se também à defasagem de preços, o mercado
correspondente ordem pode ser aberta por um preço que é melhor para o profissional que solicitou o
seu preço.
Importa igualmente notar que uma defasagem de preços (a diferença entre as duas cotações mais
próximo que faz mais de um ponto) e não ocorre com freqüência e pode surgir a qualquer momento. Se
a defasagem de preços ocorre entre bares, ou seja, um preço muito diferentes rendimentos em Assinalar
o primeiro de uma nova barra, você pode ver a defasagem de preços no preço gráfico (Fig. 75a). No
entanto, se a defasagem de preços acontece dentro de um bar, não é possível detectar essa lacuna
visualmente (Fig. 75b). Neste caso, a diferença é escondido dentro do bar (o candelabro). No entanto,
não é possível ajuizar sobre as cotações história dentro do bar apenas pela sua aparência ou por
qualquer programa características disponíveis (no entanto, é possível detectar o fosso usando um
programa aplicativo que Wold calcular a diferença entre os preços das citações recebidas).
Modificação do mercado encomendas

Plataforma de negociação Metatrader 4 permite-lhe formar comércio pedidos para modificar os níveis
dos preços de mercado e de encomendas pendentes.
Para modificar ordens de qualquer tipo, incluindo ordens de mercado, você deve usar função
OrderModify ().

Modificação de um mercado implica a mudança da ordem requerida deixar de ordens


de valores. Você não pode alterar os preços no mercado aberto ordens.

Você não pode alterar o preço de um mercado aberto fim, desde fim abertura é um facto. Portanto, não
há qualquer método de programação para fazer isso. A única coisa que pode fazer com um mercado
ordem é para fechá-lo. A ordem do mercado pode ser fechada como resultado da execução de um
pedido comercial formado por um comerciante ou por um programa, ou se o preço de mercado atinge o
preço de uma das ordens de stop.

StopLoss ordens e TakeProfit não podem ser colocados mais próximos do preço de
mercado do que a distância mínima.
Uma ordem não pode ser modificado, se o preço da sua execução StopLoss ou
TakeProfit varia dentro da distância de congelar o preço de mercado.

Observe que a posição das ordens de stop é um mercado limitado, como forma relacionadas com o
actual preço de mercado, mas ela não tem qualquer relação com a ordem abertas preço (ver Requisitos
e Limitações em Making Ofícios). Isto significa que a alteração da ordem pode resultar em que as ordens
de stop são colocadas acima ou abaixo do preço no mercado aberto fim.
Vamos considerar um exemplo. Um mercado foi aberto antes do fim, as suas ordens de stop estando
mais próximos ao preço de mercado (fig. 69). Depois disso, o preço de mercado mudou (um aumento de
1 ponto). No momento, o mostrado na fig. 76, tornou-se possível alterar o valor de TakeProfit. Ordem
Vender é fechada, o mais tardar, conhecida preço Pergunte. A distância entre Pergunte = 1,2990 o valor
anterior e TakeProfit = 1,2984 fez 6 pontos, ou seja, excedeu a distância mínima permitida.Comerciante
(ou programa) formaram um comércio solicitação para alterar o valor de TakeProfit, ou seja, para
aumentar este valor por 1 ponto. Isto resultou em uma tomada comércio, alterando a posição da ordem
de parar o fim do mercado (o valor anterior de TakeProfit = 1,2984, o novo valor = 1,2985).
Se o pedido contido comércio a fim Vender modifique a instrução para que o valor de qualquer das
ordens de stop estavam mais próximos do preço de mercado do que em Pergunte a distância mínima,
esse comércio pedido será rejeitado pelo cliente terminal e do comércio não seriam feitas.

Fig. 76. Uma forma modificada, as suas ordens de stop estando mais próximos dos preços do mercado.
A modificação da regra do mercado limita as ordens para parar de modo a aproximar o preço atual, mas
isso não limita a ordem para parar de distância do preço. Essa a razão por que parar de ordens pode ser
colocado em qualquer distância do preço actual, se esta distância for maior do que limitar a distância
(que, como a modificação da ordem momento, a ordem é deixar de fora a congelar o valor determinado
pela banda). Na fig. 77, podemos ver o mesmo fim após uma modificação mais: neste caso, interromper
as encomendas são bem fora da gama de limitar a distância mínima.

Fig. 77. Uma forma modificada, as ordens de stop que são colocados para além da distância mínima.
Na pendência da modificação encomendas

Para modificar qualquer fim tipos, incluindo as encomendas pendentes, usamos função OrderModify ().

Modificação de uma ordem pendente implica a possibilidade de modificar os valores


definidos os preços de abertura da ordem pendente e pare suas ordens.
A limitação relacionada com a posição da ordem pendente a ser modificado é
calculado com base no preço de mercado correta de se alterar a ordem pendente no
mercado um.
As limitações relacionadas à posição de paragem encomendas pendentes de uma
ordem é calculado com base no preço solicitado aberta na pendência da ordem e não
tem nenhuma relação aos preços de mercado.

Enquanto se aguarda ordens BuyLimit e BuyStop não podem ser colocados mais
próximos do preço de mercado do que em Pergunte a distância mínima StopLevel.
Pendentes SellStop ordens SellLimit e não podem ser colocados mais próximos do
preço de mercado superior ao lance mínimo StopLevel distância.
StopLoss / de uma encomenda pendente TakeProfit não podem ser colocados mais
perto da forma solicitada no aberto preço do que a distância mínima StopLevel.

Enquanto se aguarda ordens BuyLimit e BuyStop não pode ser modificado, se o


requerido para abrir preço oscila dentro da distância de congelar o preço de mercado
Pergunte.
Pendentes SellStop ordens SellLimit e não podem ser modificados, se o requerido para
abrir preço oscila dentro da distância de congelar o preço de mercado de lance.
As posições de StopLoss e TakeProfit de encomendas pendentes não são limitados
pelo congelamento FreezeLevel distância.
Por favor, note que o preço de uma encomenda pendente é limitada em relação ao preço de mercado,
enquanto que a sua ordens stop são limitados pela requerida abertas até o fim de preço (ver Requisitos
e Limitações em Making Ofícios).

Por exemplo, enquanto se aguarda despacho BuyLimit é colocada com os seguintes parâmetros: 1 =
preço solicitado. 2969, StopLoss = 1,2964, TakeProfit = 1,2974. O valor actual do preço do mercado
(aplicado para modificar a ordem pendente em um mercado um) Peça = 1,2983. Assim, a ordem é
colocada a uma distância de 14 pontos (1.2983-1.2969) a partir do preço de mercado, o que ultrapassa
de longe a distância mínima permitida. As ordens são parar na distância de 5 pontos a partir do preço
solicitado, o que não exceda a distância mínima, de modo que é admissível.

Fig. 78. Enquanto se aguarda despacho BuyLimit com ordens de stop acompanha mais próximo do fim.
Se o profissional precisa de alterar o preço da ordem BuyLimit, então, qualquer que seja o rumo que ele
ou ela se move em, neste caso, é necessário alterar simultaneamente a posição de paragem
correspondente ao fim (ou para apagá-lo, ou seja, para definir valor zero para ele), também. Caso
contrário, a distância entre o fim eo seu fim paragem poderá não vir a ser menor que o mínimo
permitido um. O comerciante decidiu modificar a ordem para que ele manteve a distância entre a ordem
ea sua TakeProfit como 5 pontos, enquanto o valor de StopLoss permaneceu como era (Fig. 79).

Fig. 79. Modificado fim BuyLimit (o preço solicitado e ao nível TakeProfit são alterados).
Se o profissional precisa para colocar ordem pendente BuyLimit tão perto quanto possível do preço de
mercado, então nesse caso (Fig. 80), o valor mínimo permitido do preço solicitado Pergunte-5points =
1.2985-0.0005 = 1,2980. Neste exemplo, parar as ordens são colocadas fora do limite mínimo de
distância.
Fig. 80. Modificado fim BuyLimit mais próximo do preço de mercado.

Apêndice chamado Requisitos e Limitações na Trades Tornar contêm um resumo tabela que especifica
os valores de uma correspondência biunívoca citar, que são utilizados para a abertura, o encerramento
ou a modificação das encomendas, bem como outros valores referência que limitam a realização de
negócios.
Abertura e colocação encomendas

Comércio pedidos de abertura e colocação encomendas pendentes são formadas utilizando a função
OrderSend ().
Função OrderSend ()
int OrderSend (string símbolo, int cmd, duplo volume, duplo preço, int
derrapagem, a dupla stoploss,
takeprofit dupla, string comentário = NULL, magia int = 0, datetime expiração =
0, cor arrow_color = CLR_NONE)
(observe que aqui e mais adiante, nos referimos a função header, e não a um exemplo de como
usar função chamada em um programa).
Vamos considerar em mais detalhes o que essa função consiste em.
OrderSend é o nome da função. A função retorna o número de bilhete ( "ticket" é o número exclusivo
de uma ordem) que está associado ao fim do comércio por servidor, ou -1, se o comércio pedido foi
rejeitado pelo servidor quer o cliente ou o terminal. A fim de obter informações sobre os motivos da
rejeição do pedido do comércio, deve usar a função GetLastError () (a seguir iremos considerar alguns
dos erros mais comuns).
símbolo é o nome da negociados segurança. Cada símbolo corresponde com o valor de uma variável
string. Por exemplo, para o par de moeda euro / dólar, este valor é "EURUSD". Se a ordem é estar
aberto para um símbolo perdoadas, então este parâmetro pode ser especificado explicitamente:
"EURUSD", "EURGBP", etc, no entanto, se você for usar o Consultor Especialista na janela de qualquer
outro símbolo, você pode utilize a função padrão Symbol (). Esta função retorna uma string valor que
corresponde com o nome do símbolo, na janela de onde o EA ou script está sendo executado.
cmd é o tipo de operação. O tipo de operação pode ser especificado como uma constante predefinida
ou o seu valor, e de acordo com o tipo de comércio.
volume é a quantidade de lotes. Por ordens do mercado, tem de se verificar a conta para a
suficiência. Para encomendas pendentes, a quantidade de lotes não é limitado.
o preço é o preço abertas. É especificado de acordo com os requisitos e limitações aceito para fazer
trades (ver Despacho Características e normas relativas à elaboração de Ofícios). Se o preço requerido
para a abertura do mercado de encomendas não foi encontrada no preço rosca ou se ela tem bastante
desatualizado, o comércio pedido é rejeitado. No entanto, se o preço está desatualizado, mas presente
no segmento preço e se o seu desvio em relação ao actual preço oscila dentro do valor de derrapagem,
este comércio pedido será aceite pelo cliente e enviados para o terminal server comércio.
derrapagem é o máximo permitido desvio da ordem requerida abrir preço a partir do preço de mercado
para mercado encomendas (pontos). Esse parâmetro não é processada para a colocação de encomendas
pendentes.
stoploss é solicitado a fechar preço que determina a perda máxima permitida para o dado do
comércio. É definida de acordo com os requisitos e limitações aceito para fazer trades (ver Despacho
Características e normas relativas à elaboração de Ofícios,Requerimentos e Limitações em Making
Ofícios).
takeprofit é solicitado a fechar preço que determina o máximo de lucro para o comércio dado. É
definida de acordo com os requisitos e limitações aceito para fazer trades (ver Despacho Características
e normas relativas à elaboração de Ofícios,Requerimentos e Limitações em Making Ofícios).
comentário é o texto do despacho comentário. A última parte do comentário pode ser modificado pelo
comércio servidor.
Magia é o número mágico da ordem. Pode ser usado como o identificador de usuário definido
ordem. Em alguns casos, é a única informação que ajuda você a descobrir mais sobre o que a ordem
pertence a um ou outro programa que abriu ela. O parâmetro é definido pelo usuário, seu valor pode ser
a mesma ou outra do que o valor deste parâmetro de outras ordens.
vencimento é a data em que expira ao fim. Tão logo este dia chegar, enquanto se aguarda a ordem
será fechada automaticamente do lado do servidor. Em alguns servidores comerciais, pode haver uma
proibição de fixação da data de expiração para encomendas pendente. Neste caso, se você tentar definir
um valor diferente de zero do parâmetro, o pedido será indeferido.
arrow_color é a cor da abertura seta no gráfico. Se esse parâmetro está ausente ou se o seu valor é
CLR_NONE, abrindo a seta não é mostrado no gráfico de todo.
Em alguns servidores comerciais, pode haver um limite definido para o montante total das encomendas
pendentes e abertos. Se este limite for excedido, qualquer pedido que implica a abertura comercial no
mercado uma ordem ou a colocação de uma ordem pendente será rejeitada pelo servidor de trocas.

Abertura ordena mercado

A função OrderSend () pode no início parecem ser demasiado complicado. Contudo, todos os parâmetros
considerados são bastante simples, útil e pode ser utilizado com sucesso em sua negociação. A fim de
ver isso por nós mesmos, vamos considerar a variação mais simples de como o comércio OrderSend
função () é usado para abrir um mercado encomenda.
Primeiro de tudo, devemos notar que a função OrderSend () tem parâmetros predefinidos (ver Função
Chamada e Função Descrição e Operador de "regresso"). Isto significa que esta função pode ser usada
em um modo simplificado usando o mínimo exigido conjunto de parâmetros. Esses parâmetros são os
seguintes:
símbolo é um parâmetro necessário, porque precisamos de saber para onde a abrir o fim. Deixa o
nosso script implicam a possibilidade de abrir uma janela do símbolo em qualquer ordem. Nesse caso,
vamos substituir a função padrão Symbol () como esse parâmetro;
cmd - por exemplo, vamos abrir uma Comprar fim; neste caso, vamos precisar parâmetro OP_BUY;
Volume - podemos especificar qualquer valor permitido pelas regras, vamos abrir uma pequena
encomenda, por exemplo, de 0,1 lote;
Preço - a abrir preço para a ordem é Comprar Pergunte preço;
derrapagem normalmente é especificada como pontos 0-3. Vamos precisar 2;
stoploss - ordens de stop podem ser colocados a uma distância que não é mais estreita do que a
distância mínima permitida, normalmente 5 pontos (ver Requisitos e Limitações em Making
Trades); vamos parar de colocar encomendas, a uma distância de 15 pontos de fechar o preço, a saber:
Oferta - 15 * Point;
takeprofit - vamos parar de colocar encomendas, a uma distância de 15 pontos de fechar o preço, a
saber: Lance + 15 * Point;
Abaixo está o script mais simples, simpleopen.mq4, que se destina à abertura Comprar um fim:

//------------------------------------------------ --------------------
/ / Simpleopen.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------------
int start () / / Especial função start ()
(/ / Abertura COMPRAR
OrderSend (Symbol (), OP_BUY, 0,1, Ask, 3, Bid - Ponto 15 *, * Ponto de
lance + 15);
retorno; / / Sair start ()
)
//------------------------------------------------ --------------------
Se você lançar esse script de execução, ele vai trabalhar, na maioria dos casos. O script consiste de uma
função especial que contém a ordem de abertura função OrderSend () eo operador "regresso". Vamos
descrever a execução de programa algoritmo linhas e eventos relacionados a isso.
1. O usuário tem o script anexado ao símbolo janela, arrastando o script nome com o botão do mouse a
partir do "Navigator" janela de terminal do cliente na janela do símbolo, para o qual ele ou ela pretende
abrir um mercado de 0,1 para Comprar lote e com ordens de stop que se encontram a uma distância de
15 pontos entre o preço de mercado.
2. No momento do engate do script para a janela do símbolo, o cliente terminal é passar o controle
(apenas pelo lançamento) ou a função especial iniciar () (brevemente aqui, devemos lembrar que o
início () de um script é lançado no momento de prender o script para a janela do símbolo, considerando
que o início () de uma AE é lançada no momento em que a aproximação de rendimentos para assinalar
o símbolo).
3. No quadro da execução da função especial start (), o controlo é passado para a linha que chama o fim
abertura função:

OrderSend (Symbol (), OP_BUY, 0,1, Ask, 3, Bid - Ponto 15 *, * Ponto de


lance + 15);
Antes da execução desta função, o programa calcula os valores de todos os parâmetros formais:
3.1. Nós acompanha o script para a janela de Eur / USd.In presente caso, a norma função Symbol () irá
retornar o valor da seqüência EURUSD.
3.2. Deixe Pergunte Bid = = 1,2852 e 1,2850, a partir do momento de pôr essa função.
3.3. O valor de StopLoss, neste caso, será: 1.2850-15 * 0,0001 = 1,2835, enquanto que TakeProfit =
1,2865.
4.Execution da função OrderSend ():
4.1. A função comercial formado um pedido de abertura de um pedido neste sentido e passaram para o
cliente de terminal.
4.2. A função passou o controle para o cliente terminal em simultâneo, com o passar do comércio
pedido, pelo que o programa foi interrompido execução.
4.3. O cliente terminal controlado o comércio recebeu pedido. Que ele não detectar qualquer parâmetros
incorretos, por isso ele enviou o pedido para o servidor.
4.4. O servidor recebeu o comércio pedido, verificou-lo, não detectou quaisquer parâmetros incorretos, e
decidiu executar o pedido.
4.5. O servidor executa o pedido, fazendo uma operação em seu banco de dados e enviou informações
sobre o que executa a solicitação do cliente terminal.
4.6. O terminal cliente que recebeu a informação sobre o comércio último pedido foi executado, este
evento exibido na janela do terminal e na janela do símbolo, e devolveu o controle para o programa.
4.7. Depois de recebido o controle, o programa continuou funcionando a partir da localização, o controlo
a partir do qual já tinha sido transferido para o cliente terminal (e às quais tinha sido devolvida mais
tarde).

Note que não foram realizadas ações no programa começa a partir do passo 4.2
através passo 4.7 - o programa estava no modo de espera de resposta do servidor.

5. O controle do programa é passado para o próximo operador - o operador "regresso".


6. A execução do operador "regresso" resulta em sair da função start () e, portanto, no encerramento da
execução do programa (que deve ser lembrado que scripts concluir o seu trabalho depois de terem sido
executadas) - o controle é retornado para o cliente terminal.
Assim, o script tem cumprido a sua finalidade: Comprar com o intuito parâmetros predefinidos constitui
aberta. A utilização de scripts é muito conveniente, se você precisa executar um pequeno tempo de uma
operação, neste caso, o uso de um script é bastante razoável. De acordo com o passo 4.6., O
comerciante pode ver a ordem na tela.

Fig. 81. Colocados por ordem script simpleopen.mq4.


Os eventos não são ordenados conforme indicado acima. É possível que o comércio pedido é rejeitado
pelo cliente ou pelo terminal server. Vamos tentar fazer algumas experiências, por exemplo, mudar o
símbolo denominação: especificará "GBPUSD" explicitamente (isto é perfeitamente admissível). Nós
vamos obter um programa com o campo de utilização limitada:

int start () / / Especial função start


(/ / Abertura COMPRAR
OrderSend ( "GBPUSD", OP_BUY, 0,1, Ask, 3, Bid - Ponto 15 *, * Ponto de
lance + 15);
retorno; / / Sair start ()
)
Vamos lançar o script na mesma janela do símbolo câmbio Euro / Dólar. O script foi destinada a abrir
uma janela no fim de GBP / USD. No entanto, depois de ter sido anexada à janela do Eur / USD,
nenhuma ordem foi aberta na janela de GBP / USD.
Uma desvantagem de tais programas é a sua limitação funcional. Neste caso, uma vez que acompanha o
script para a janela do símbolo, o utilizador está apenas à espera de ordem abertura. No entanto, o
intuito não é aberto. O usuário não tem conhecimento do motivo por que razão é tão: ou ele é causado
pelo algoritmos um erro no programa ou o código comercial pedido está "perdido" pelo caminho para o
servidor, ou o comércio pedido foi rejeitado pelo cliente terminal muito tempo atrás (pensava que o
usuário ainda está à espera), ou existe outro motivo.
A fim de proporcionar ao usuário (e, o que também é muito importante, o programa) com as
informações sobre os eventos relacionados com a execução do pedido comércio, é necessário tratar os
erros.
Erro de Processamento

Uma importante propriedade do cliente terminal é que, se ocorrer um erro durante a execução de um
aplicativo, o cliente terminal não pode parar a execução do programa. Erros são geralmente causados
pela imperfeição do algoritmo usado na inscrição. Em alguns casos, os erros são causados por alguns
externos (como as relacionadas com o programa) fatores. Os internos são causas de erros quaisquer
violações dos requisitos MQL4 ou das regras de negociação, por exemplo, utilizando preços inválido. As
causas externas são aquelas que não estejam relacionadas com o programa aplicativo, por exemplo,
conexão interrompida.
Se ocorrer um erro na execução de um programa, o programa continuará sendo executado, ao passo
que o cliente terminal vai gerar o código de erro valor disponível para o programa através da função
GetLastError ().
Função GetLastError ()
int GetLastError ()
A função retorna o código do erro ocorrido recentemente, em seguida, o valor da variável especial
Last_Error que armazena o código do último erro será zeroized. A posterior GetLastError () chamada irá
retornar 0.
A seguir, vamos identificar todos os erros que ocorrem por esse código. Vários erros podem ocorrer
durante a execução de um programa; função GetLastError () nos permite obter o valor do código para
apenas um deles, o mais tardar erro, é por isso que todas as vezes em que precisamos dessa
informação, é recomendado usar função GetLastError () Imediatamente após o programa linhas, em que
o erro pode ocorrer.
Erro 130. Inválido stop encomendas

O último considerado script não analisar erros, de modo que o usuário permanece ignorante sobre os
resultados da execução do despacho de abertura de função. Na variação simples de usar a função
GetLastError (), o programa pode analisar um erro e basta informar o usuário sobre isso. Se você lançar
script confined.mq4 para execução na janela de câmbio Euro / Dólar, um erro irá ocorrer.

//------------------------------------------------ ------------------------
--
/ / Confined.mq4
/ / O código deve ser usado apenas para fins educacionais .
//------------------------------------------------ ------------------------
--
int start () / / Especial função start
(/ / Abertura COMPRAR
OrderSend ( "GBPUSD", OP_BUY, 0,1, Ask, 3, Bid - Ponto 15 *, * Ponto de
lance + 15);
Alerta (GetLastError ()); / / Mensagem de erro
retorno; / / Sair start ()
)
//------------------------------------------------ ------------------------
--
Acrescentou apenas um, mas muito informativas em linha este script:

Alerta (GetLastError ()); / / Mensagem de erro


Função GetLastError () retorna o código do último erro, que Alert () é usado para exibir esse valor na
tela. Após o scriptconfined.mq4 foi anexada à janela do símbolo câmbio Euro / Dólar, o script será
executado, o que resultará em que o usuário verá a seguinte mensagem:

Fig. 82. Código de erro obtidas durante a execução de scripts confined.mq4 no EUR / USD janela.
Você pode encontrar nos apêndices códigos de erros que podem ocorrer na execução de um
programa. Neste caso, o erro 130 (inválido stop orders) ocorreu. Isto significa que os valores dos
parâmetros formais utilizados na função OrderSend () não cumpram os limites especificados
nos Requisitos e Limitações em Making Trade. Mediante uma visão mais próxima, podemos ver o motivo
que causou o erro: os valores actuais de mercado e preços de lance Pergunte são tomadas a partir da
janela do símbolo, para o qual o script está anexado, ou seja, a partir da janela de câmbio Euro /
Dólar. No entanto, estes valores são utilizados para formar um pedido de comércio GBP / USD. Como
resultado, ao preço actual de GBP / USD, Pergunte = 1,9655, o valor de TakeProfit para o recém-
inaugurado mercado fim acaba por ser igual a (para câmbio Euro / Dólar Bid = 1,2930) 1,2930 +15 *
0,0001 = 1. 2945, que é consideravelmente inferior ao valor mínimo permitido, ou seja, é inválido.
Neste caso, um erro ocorreu algorítmica. A fim de corrigir isso, você deve usar os valores corretos de
preços símbolo. Você pode obter esses valores usando a função MarketInfo
(). Script improved.mq4 ordens de mercado que se abre para GBP / USD pode ser iniciado em qualquer
janela símbolo:

//------------------------------------------------ ------------------------
------
/ / Improved.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ ------------------------
------
int start () / / Especial função start
(
= MarketInfo lance duplo ( "GBPUSD", MODE_BID); / / Pedido de o valor do
lance
= MarketInfo perguntar duplo ( "GBPUSD", MODE_ASK); / / Pedido de o valor
da Peça
duplo ponto MarketInfo = ( "GBPUSD", MODE_POINT); / / Pedido de Ponto
/ / Abertura COMPRAR
OrderSend ( "GBPUSD", OP_BUY, 0,1, pergunte, 3, lance - Ponto 15 *, + 15 *
compra Point);
Alerta (GetLastError ()); / / Mensagem de erro
retorno; / / Sair start ()
)
//------------------------------------------------ ------------------------
------
O erro acima não ocorre na execução desse script, de modo a sua execução irá resultar em que mostra
o correspondente mensagem: 0 (zero). Isto significa que a função GetLastError () retornou o valor de 0,
ou seja, não foram detectados erros na execução do comércio pedido pelo cliente terminal.
Vamos considerar também alguns outros erros comuns. Por isso, vamos voltar à ideia de abrir uma
ordem usando um script na mesma janela, para o qual o script está anexado.
Erro 129. Preço inválido

Em alguns casos, um simples erro ocorre - o valor errado das duas apóstrofo maneira como está
especificado o preço abertas.Comprar ordens são conhecidas no mercado (ver Requisitos e Limitações
em Making Ofícios), a ser inaugurado em Pergunte ao preço. Abaixo está mostrado o que acontece se,
por engano, especificar o preço de lance no script mistaken.mq4:

//------------------------------------------------ ------------------------
-
/ / Mistaken.mq4
/ / O código deve ser usado apenas para fins educacionais .
//------------------------------------------------ ------------------------
-
int start () / / Especial função start
(/ / Abertura COMPRAR
OrderSend (Symbol (), OP_BUY, 0,1, Lance, 3, Bid - Ponto 15 *, * Ponto de
lance + 15);
Alerta (GetLastError ()); / / Mensagem de erro
retorno; / / Sair start ()
)
//------------------------------------------------ ------------------------
-
Antes de enviar o pedido ao comércio do servidor, o cliente terminal analisa se os valores do preço
solicitado e obedecer às ordens de stop valores permitidos. Durante esta verificação, solicitou a abertura
de vista dos preços será detectado como inválido, o cliente assim o terminal não vai enviar o comércio
pedido para o servidor para execução, ea função GetLastError () retornará o valor de 129
(consulte Códigos de erro). A execução do script irá resultar no surgimento da correspondente
mensagem de erro:

Fig. 83. Erro 129 (preço válido) na execução de mistaken.mq4.

Erro 134. Sem dinheiro suficiente para fazer um comércio

Resultado semelhante (erro 134) será obtida, se não há dinheiro suficiente na conta gratuita para abrir
uma ordem. Você pode saber sobre a quantidade de dinheiro necessária para abrir gratuitamente 1 lote
de compra de cada símbolo utilizando a função MarketInfo (symbol_name, MODE_MARGINREQUIRED).

O tamanho padrão de um lote para o mesmo símbolo pode variar em diferentes


centros que tratam.

A quantidade necessária de bens livres para a abertura de um lote-ordem é inversamente proporcional à


quantidade de prestada a alavanca. Ao mesmo tempo, o custo de 1 ponto em divisas para o depósito de
um símbolo não diz respeito à alavancagem prestados.
Tabela 3. Possíveis combinações de 1-lote 1-ponto Custo e custo (depósito moeda é E.U. dólar).

Lidar Center 1 Lidar Center 2 Lidar Center 3


Comprar Vender 1pt Comprar Vender 1pt Comprar Vender 1pt
EUR /
1296,40 1296,20 10,00 1296,50 1296,20 10,00 1000,00 1000,00 10,00
USD
GBP / USD 1966,20 1966,00 10,00 1376,48 1376,20 7,50 1000,00 1000,00 10,00
AUD /
784,40 784,20 10,00 1569,20 1568,40 20,00 1000,00 1000,00 10,00
USD
USD / JPY 1000,00 1000,00 8.29 1000,00 1000,00 8.29 1000,00 1000,00 8.29
USD / CHF 1000,00 1000,00 8.02 1000,00 1000,00 8.02 1000,00 1000,00 8.02
EUR / CHF 1296,40 1296,20 8.02 1296,35 1296. 35 8.02 1000,00 1000,00 8.02
Os preços são indicados como de 16.12.2007.
Vamos examinar brevemente alguns métodos comuns de cálculo do custo do lote 1 e de 1 ponto.
Lidar Center 1 (mais comum)
Para os símbolos que têm dólares reciprocamente, o custo de 1 lote é igual ao preço corrente da
correspondente citação, em ambos os sentidos, multiplicado por 1000, enquanto que o custo de 1 ponto
é igual a US $ 10.
Para os símbolos que têm os seus dólares como numerador, o custo de 1 lote é igual a US $ 1000,00,
enquanto que o custo de 1 ponto é inversamente proporcional à cotação actual e igual a 1 / (Bid). Por
exemplo, para USD / CHF, em lance = 1,2466, o custo de 1 ponto é 1 / 1. 2466 = 8,02.
Para atravessar taxas, o custo do lote 1 é calculada da mesma forma que o do numerador moeda,
enquanto o custo de 1 ponto é calculada da mesma forma que para que o denominador moeda. Por
exemplo, para EUR / CHF, o Custo do lote 1 é 129,40 (como, por EUR / USD), enquanto que o custo do
lote 1 é 8,02 (como por USD / CHF).
Lidar Center 2
Em alguns centros que tratam, considerando-se a mesma regra de cálculo de custos, os valores dos
custos pode ser diferente para alguns símbolos. Por exemplo, o custo de 1 lote eo custo de 1 ponto pode
ser aumentada ou diminuída proporcionalmente.Por exemplo, este fator pode ser 0,75, para GBP / USD,
que é 2,0 para AUD / USD. A representação dos valores custo não resultar em qualquer mudança
econômica, em tais casos, você só tem de considerar este recurso especial ao calcular os custos de suas
ordens. Você também deve prestar atenção ao fato de que o lote 1-custos de compra e venda de activos
na cruz taxas são as mesmas.
Lidar Center 3
também existem centros que tratam definir o custo do lote 1, R $ 1000,00 por qualquer símbolo. Ao
mesmo tempo, o custo de 1 ponto permanece proporcional ao preço corrente. Isto implica uma
configuração especial para alavancar cada símbolo.

1-ponto Custo de todos os símbolos que são cotados como não relacionados com
USD semper mudanças proporcionalmente ao custo do símbolo especificado
mutuamente.

Geralmente, não podem existir outros princípios de construção de valores custo. É escusado será dizer
que, antes de começar a verdadeira negociação, você deve encontrar-se sobre o método de cálculo para
qualquer tratamento específico center e considerar este método na sua codificação.
Margem Livre
Na codificação, é muito importante considerar o princípio da livre formação de activos. Margem livre
(ativo) é a quantidade de dinheiro que está disponível para fazer negócios.
Vamos considerar um exemplo. Deixe Saldo ser 5000,00, não há abertura ordena no terminal. Vamos
abrir uma ordem de 1 lote Comprar em lidar center 3. A seguinte regra é indicado no tratamento center
3:

Se diferentemente ordens são direcionadas mercado aberto para um símbolo, o


menor custo de um integrado direcção-encomendas é liberado para comércio e
aumenta o montante de activos livres (esta regra não é aplicável a todos os centros
que tratam).

A janela do terminal irá mostrar as informações sobre a forma aberta. Observe que a margem torna
1000,00, é -30,00 fim lucrativo, portanto, o montante dos activos livres (margem livre) faz 5000-1000-30
= 3970,00:
Fig. 84. Comprar no fim da janela do terminal.
Vender após uma ordem do mesmo valor, foi aberta, livre margem de aumento. Integrado O menor
custo de uma direcção-mercado dá 1000.00 encomendas, pelo que a margem livre vai aumentar em
1000,00. Na fig. 85, você pode ver a situação de forma diferente quando as encomendas dirigidas custar
o mesmo valor, de modo a totalidade da soma das ordens de custos é liberado para negociação.

Fig. 85. Comprar e Vender encomendas na janela do terminal.


Vender após uma ordem de menor custo, foi aberta, livre margem aumentará, também. Nesse caso, o
menor custo de uma integrados-direção do mercado torna 700,00 encomendas, pelo que a margem livre
vai aumentar em 700,00, enquanto que a margem torna o diferença entre os custos integrados de
encomendas dirigidas de forma diferente (Fig. 86).

Fig. 86. Comprar e Vender encomendas na janela do terminal.


Se uma ordem Vender mais de 0,1 lote é aberto (custo 100,00), o menor custo de um integrado
direcção-encomendas do mercado torna 700,00 + 100. 00 = 800,00. Assim, a margem (em comparação
com a situação em que apenas uma ordem Comprar é aberto) diminui em 800,00. Em comparação com
a situação mostrada na Fig. 86, a margem diminui, enquanto que os aumentos de capital por 100,00
(veja fig. 87).

Fig. 87. Comprar e Vender encomendas na janela do terminal.


Margens livre mostrado na fig. 86 e fig. 87 diferem umas das outras por mais de 100,00, já que o lucro
da abertura ordena integrada mudou com a mudança no preço atual (a diferença torna 8,00).
Se fizermos com manipulações semelhante em outro centro que tratam, é fácil ver que a ordem acima
de formar o valor da margem livre não é mantida. Por algumas centers lidar com a seguinte regra é
eficaz:

Abertura do mercado quaisquer ordens não libera o capital próprio ou aumentar a


margem livre.Abertura do mercado de encomendas aumenta o capital próprio no
montante que excede o custo integrado de forma diferente no mercado ordens
dirigidas para um símbolo (a regra não se aplica em todos os centros que tratam).

Por exemplo, se você já foi aberta uma ordem de 4 lotes para Comprar USD / JPY em lidar center 2, os
montantes de fundos próprios e margem livre não mudará a abertura de um lote 4-Vender ordem.

Fig. 88. A presença das ordens dirigidas de forma diferente não libera eqüidade.
Pode fazer cálculos para saber se a atual capital próprio é suficiente para a abertura de uma
ordem. Você também pode usar a função AccountFreeMarginCheck () que retorna o valor da margem
livre para permanecer no mercado após a abertura de uma ordem com certa quantidade de lotes por um
determinado símbolo. Se o valor devolvido for igual ou superior a 0, há dinheiro suficiente na conta. Se
for inferior a 0, a ordem deste volume para este símbolo e não pode ser aberta, o cliente terminal irá
retornar erro 134.
A fim de conhecer as condições oferecidas pelo centro tratam eo montante da margem livre exigido para
a abertura de um despacho com o volume do lote 1, você pode usar um script simples, conditions.mq4:

//------------------------------------------------ ------------------------
--
/ / Conditions.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ ------------------------
--
int start () / / Especial função start
(
Alerta (Symbol (), "Vender =", AccountFreeMargin () / / Na venda
- AccountFreeMarginCheck (Symbol (), OP_SELL, 1));
Alerta (Symbol (), "Comprar =", AccountFreeMargin () / / Ao comprar
- AccountFreeMarginCheck (Symbol (), OP_BUY, 1));
retorno; / / Sair start ()
)
//------------------------------------------------ ------------------------
--
Aqui, a expressão de

AccountFreeMargin () - AccountFreeMarginCheck (Symbol (), OP_SELL, 1)


nos permite calcular a diferença entre a margem disponível livre e gratuito à margem que permanecerá
após a abertura da ordem.
Se começarmos este script para efeitos de execução, quando não existirem no mercado ordens do
terminal, podemos obter a quantidade necessária de equidade actualmente a estar disponíveis e
suficientes para a abertura de um despacho com o volume do lote 1 para a compra e de venda:

Fig. 89. Lote 1-custo para os diferentes símbolos, obtida usando conditions.mq4.
Se vamos lançar o script conditions.mq4 para execução na janela do símbolo, para os quais existem
ordens de mercado aberto, podemos obter outros valores, isso depende dos métodos de cálculo aceites
em um ou outro tratamento center.
Outros erros e Função MarketInfo ()

Existem outras limitações relacionadas à determinação dos valores dos parâmetros da função OrderSend
(). Este é o valor máximo e mínimo para o preço etapa, o máximo eo mínimo valor despacho preço, etc
A utilização da função MarketInfo () permite-lhe obter informações sobre diversos símbolos que são
mostrados na janela "Market Watch" do cliente terminal.
Função MarketInfo ()
MarketInfo dupla ( string símbolo, tipo int)

A função retorna várias informações sobre símbolos listados na janela "Market Watch" do cliente
terminal. Peças de informação sobre o atual símbolo são armazenadas em variáveis previamente
definidas.
Parâmetros:
símbolo - o nome de um símbolo;
Tipo - pedido identificador que determina o tipo de informação que deve ser devolvido. Pode ser
qualquer valor desses identificadores do pedido (ver Função MarketInfo Identifier).
Alguns erros podem ocorrer para as razões do lado do servidor. Por exemplo, nas condições transientes
de preços, o seu corretor pode aumentar a distância mínima que limita colocação de ordens de paragem
e de encomendas pendentes. Além disso, em um mercado calmo, o corretor pode diminuir esta distância
novamente. Assim, os valores de alguns parâmetros podem ser alteradas a qualquer momento.
Para o programa para operar em uma forma estável, com a quantidade mínima de pedidos rejeitados,
você deve atualizar os parâmetros de informação ambiental utilizada pelo programa utilizando as
funções MarketInfo () e RefreshRates () antes de executar a função OrderSend ().
Um exemplo de um script simples que abre uma ordem Comprar custando 35% da
margem livre, com alguns valores predefinidos de ordens stop (openbuy.mq4).

//------------------------------------------------ ------------------------
-------
/ / Openbuy.mq4
/ / O código deve ser usado apenas para fins educacionais .
//------------------------------------------------ ------------------------
-- 1 --
int start () / / Especial função start
(
Dist_SL int = 10; / / SL Preset (pt)
Dist_TP int = 3; / / Preset TP (pt)
Prots duplo = 0,35; / / Percentagem da margem livre
Symb seqüência = Simbolo (); / / Símbolo
//------------------------------------------------ ------------------------
-- 2 --
while (true) / / ciclo que se abre uma ordem
(
int Min_Dist = MarketInfo (Symb, MODE_STOPLEVEL); / / Min. distância
Min_Lot duplo = MarketInfo (Symb, MODE_MINLOT); / / Min. volume
Etapa dupla MarketInfo = (Symb, MODE_LOTSTEP); / / Passo a mudança lotes
Livre AccountFreeMargin duplo = (); / / Margem Livre
One_Lot duplo = MarketInfo (Symb, MODE_MARGINREQUIRED); / / Custo por 1
lote
//------------------------------------------------ -------------------- 3 -
-
Lote duplo = MathFloor (* Livre Prots One_Lot Passo) * Etapa; / / Lots
if (Lot <Min_Lot) / / Se for inferior a permitida
(
Alerta ( "Não é dinheiro suficiente para", Min_Lot, "lotes");
break; / / Sair ciclo
)
//------------------------------------------------ -------------------- 4 -
-
if (Dist_SL <Min_Dist) / / Se for inferior a permitida
(
Dist_SL = Min_Dist; / / Definir o permitido
Alert ( "O aumento da distância do SL =", Dist_SL, "pt");
)
SL = dupla Oferta - Point Dist_SL *; / / Solicitado preço de SL
//------------------------------------------------ -------------------- 5 -
-
if (Dist_TP <Min_Dist) / / Se for inferior a permitida
(
Dist_TP = Min_Dist; / / Definir o permitido
Alerta ( " Aumentou a distância do TP = ", Dist_TP," pt ");
)
TP = dupla Dist_TP Lance + * Point; / / Solicitado preço do TP
//------------------------------------------------ -------------------- 6 -
-
Alerta ( "A solicitação foi enviada para o servidor. Aguardando resposta
..");
int = OrderSend bilhete (Symb, OP_BUY, Lot, Ask, 2, SL, TP);
//------------------------------------------------ -------------------- 7 -
-
if (bilhete> 0) / / Já está!:)
(
Alerta ( "Compre fim Aberto", ticket);
break; / / Sair ciclo
)
//------------------------------------------------ -------------------- 8 -
-
int Erro = GetLastError (); / / Falha: (
switch (erro) / / Overcomable erros
(
caso 135: Alerta ( "O preço foi alterado. Repetindo ..");
RefreshRates (); / / Atualização de dados
continuar; / / Na próxima iteração
caso 136: Alerta ( "Não preços. À espera de um novo carrapato ..");
while (RefreshRates () == false) / / Até um novo carrapato
Sono (1); / / Ciclo de atraso
continuar; / / Na próxima iteração
caso 146: Alerta ( "Trading subsistema está ocupado. Repetindo ..");
Sleep (500); / / Solução Simples
RefreshRates (); / / Atualização de dados
continuar; / / Na próxima iteração
)
switch (erro) / / Crítica erros
(
case 2: Alerta ( "Common erro.");
break; / / Sair 'mudar'
caso 5: Alerta ( "desactualização versão do cliente de terminal.");
break; / / Sair 'mudar'
caso 64: Alerta ( "A conta está bloqueada.");
break; / / Sair 'mudar'
caso 133: Alerta ( "Trading proibido");
break; / / Sair 'mudar'
default: Alerta ( "Ocorreu erro ", Erro); / / Outras alternativas
)
break; / / Sair ciclo
)
//------------------------------------------------ ------------------------
-- 9 --
Alert ( "O script já completou suas operações ---------------------------
");
retorno; / / Sair start ()
)
//------------------------------------------------ ------------------------
-- 10 --
O script consiste de uma função especial iniciar () (blocos 1-10). No bloco 1.2, os valores são fixados,
segundo o qual a ordem deve ser aberto. O bloco 2.9 representa ciclo enquanto operador (), em que
todos os cálculos necessários são realizados. Este ciclo está incluído no código para permitir que o
programa faça várias tentativas para abrir o fim. No bloco 2.3, as variáveis de ambiente são
atualizados. Nos blocos 3-4-5-6, a quantidade de lotes e os preços solicitados são calculadas as ordens
de stop. No bloco 7-8-9, os erros são processados. No bloco 9.10, a mensagem impressa é que o script
tenha completado as suas operações.
Vamos considerar algumas características específicas de um programa indicativo. É fácil ver que o
comércio pedido é formado em bloco 6.7. No bloco 3.4, a quantidade de lotes é calculado. Por outro
lado, considera a situação quando a margem livre disponível é insuficiente para sequer abrir uma ordem
com uma quantidade mínima dos lotes. Esta é a razão pela qual, no bloco 3-4, depois de imprimir a
mensagem sobre dinheiro suficiente, vamos sair do ciclo 2.9 utilizando o operador 'pausa'. O controle é
passado para bloquear a 9.10, eo script completa suas operações. A mensagem no bloco 9 é
desnecessário. É dada aqui apenas para ajudar os usuários a encontrar o código de cauda ou cabeças no
script - quando é o fim do programa de operações e quando é a pausa provocada pelos atrasos na rede
ou no servidor.
Se a margem livre é suficiente para a abertura da ordem, o controle será passado ao bloco 4.5, e depois
para o bloco 5.6.Nesses blocos, não há saída ciclo. Isto significa que, para qualquer distância mínima
fixada pelo corretor, haverá uma paragem níveis correspondentes encontrados. No bloco 1-2, 3 pontos
foram escolhidos para TP pelo design. A maioria dos corretores definir a distância mínima de 5
pontos. No bloco 5.6, o programa irá descobrir que o valor predefinido é menor do que o permitido
um. O programa irá definir o valor de tal ordem para parar de preço que não é contrário à limitação.
em seguida, o controlo é passado para bloquear o 6.7 para abri uma ordem. Na primeira linha deste
bloco, a mensagem é impresso. O comércio pedido é formado apenas na segunda linha. Uma pergunta
se coloca: Porque é que estamos formando cerca de declarar um pedido antes que ele é realmente
formado? Nós poderíamos dar as instruções em primeiro lugar e, em seguida, informa o usuário sobre
isso. A resposta a esta questão está intimamente relacionada com a tecnologia de enviar o pedido ao
terminal e, em seguida, o cliente para o servidor (consulte a fig. 66). No nosso caso, o pedido comércio
é formado em função da OrderSend () especificados na parte direita da cessão operador. O comércio
pedido, como tal, é criada e enviada para o servidor na função, enquanto que a cessão operação será
executada no operador após a cessão do servidor retornou uma resposta sobre a "sorte" do
pedido. Assim, a única possibilidade de informar o usuário sobre o início dos eventos relacionados com a
solicitação é para mostrar a mensagem antes de a cessão operador, na parte direita da função que o
comércio seja especificado.
Mais cedo ou mais tarde, o cliente terminal vai passar o controle de volta para o programa, a cessão em
bloco 6.7 operador será executado, o que resultará em que o "ticket" terá um valor variável, e que o
controlo será passado mais - Erro ao analisar-bloco 7-8-9.
Se o intuito é aberta no servidor, o número (bilhete), da abertura encomenda será atribuído à variável
«bilhete». Neste caso, significa que o script tenha cumprido a sua missão, e não há necessidade de o
programa a continuar as suas operações. No bloco 7-8, usamos o operador 'pausa' para sair do ciclo,
enquanto (). O controle é passado para bloquear 9-10 (fora do ciclo), o programa e completar as suas
operações.
No entanto, se a tentativa de abrir um fim falhar, o controle será passado ao bloco 8.9 de erro
analisando. Dois tipos de erros são considerados aqui: aqueles que ainda permitem a esperança para o
sucesso da abertura da ordem e os que, a ocorrência de forma inequívoca que a denúncia do Execução
do programa. A variável 'Erro' é atribuído com o código do último erro, neste caso, o erro de que tenha
sido devolvido pelo servidor ou pelo cliente terminal em execução da função OrderSend ().
No primeiro operador 'mudar' bloco de 8-9, overcomable erros são considerados. Cada erro neste grupo
é processado de forma diferente. Por exemplo, se o preço mudou (Erro 135), é suficiente apenas para
atualizar os parâmetros ambientais utilizando RefreshRates () e repetir a tentativa de abrir um fim. Se o
erro "Não preços" (Erro 136) ocorre, não há qualquer sentimento de voltar a enviar a solicitação para o
servidor de comércio. Neste caso, devemos esperar por um novo carrapato para rendimento (não há
preços no servidor, neste momento, ambos) e, só depois disso, para abrir uma nova tentativa fim. Esta é
a razão pela qual existe um ciclo no bloco espera que os processos de erro 136. Este ciclo pode ser
interrompido em espera, logo que um novo carrapato rendimentos. Nós saída do operador switch ()
usando o operador "continuar" que quebram a corrente iteração do ciclo, enquanto () e inicia um novo.
Erros críticos são tratados de outra maneira. Se tal ocorrer um erro, o programa irá apenas informar o
usuário sobre isso e encerrar operações. Para esta finalidade, nós usamos o operador 'pausa' (o último
em um bloco 8-9), enquanto que rompe o ciclo (), o que resulta no encerramento do programa.
Devemos notar particularmente que, neste exemplo, não consideramos todos os erros, sem exceções,
pelo design. Neste caso, não estamos visando proporcionar ao usuário com um programa ready-made. É
muito importante que o programador ele ou ela mesma analisa outros erros e decide soberanamente o
que mais erros e de que forma devem ser tratados no programa. Ao mesmo tempo, alguns erros não
devem ser processados, porque o programa é construído de tal forma que ela não implica a ocorrência
de alguns erros, por exemplo, no caso, dos erros 129 e 130 ..
No exemplo acima, existe um pequeno erro algorítmica que não pode ser encontrado nem na
compilação nem no terminal do cliente, nem sobre o servidor.

Pegue qualquer programa códigos com um grão de sal, a despeito de quaisquer


autoridades.

Anote o código no bloco 4.5:

//------------------------------------------------ ------------------------
--- 4 --
if (Dist_SL <Min_Dist) / / Se for inferior a permitida.
(
Dist_SL = Min_Dist; / / Definir o permitido
Alerta ( " Aumentou a distância de SL = ", Dist_SL," pt ");
)
SL = dupla Oferta - Point Dist_SL *; / / Convidado de preço SL
//------------------------------------------------ ------------------------
--- 5 --
Como resultado de cálculos no corpo do operador se (), a variável Dist_SL pode ter um novo
valor. Suponha uma distância mínima normal faz 5 pontos. Suponha que, na primeira execução (em
breve no mercado), esse valor é definido como 20 pontos sobre o servidor. A variável Min_Dist terá o
valor de 20.

int Min_Dist = MarketInfo (Symb, MODE_STOPLEVEL); / / A distância mínima


Também suponho que formaram o comércio solicitação foi rejeitada devido a erro 136. O programa irá
monitorar o novo carrapato no bloco 8.9. Dentro deste período de tempo, o valor da distância mínima
pode ser alterado no servidor, por exemplo, diminuiu para 10 pontos. No momento em que o novo
carrapato rendimentos, o controle será passado para o novo ciclo, e do novo valor da variável Min_Dist,
igual a 10, será calculado. No entanto, o valor da variável Dist_SL mantém-se inalterada e igual a 20
(bloco 4.5 é codificado de tal forma que o valor de Dist_SL só pode aumentar). A fim de excluir esta
algorítmica erro, você deve escrever bloco 4.5 de forma tal que apenas o valor que depende da situação
se alterar (neste caso, é o valor de SL), enquanto que o valor dos iríamos Dist_SL ' t mudança, por
exemplo, como este:

//------------------------------------------------ ------------------------
- 4 --
SL = dupla Oferta - Point Dist_SL *; / / Solicitado preço de SL
if (Dist_SL <Min_Dist) / / Se for inferior a permitida
(
SL = Oferta - Point Min_Dist *; / / Solicitadas preço de SL
Alerta ( " Aumentou a distância de SL = ", Min_Dist," pt ");
)
//------------------------------------------------ ------------------------
- 5 --
A mesma alteração deve ser feita em bloco 5.6 para parar o outro fim.
Enquanto se aguarda encomendas Colocando

Não existe uma diferença crucial entre a colocação de programação em encomendas pendentes e
colocação de mercado queridos.
Você só deve observar o fato de que os bens necessários para modificar a ordem pendente em um
mercado são controladas por um seu suficiência nem pelo cliente ou pelo terminal server. Eles não estão
limitados quer. Você pode colocar um fim na expectativa em relação ao montante que muitas vezes
ultrapassa o montante de dinheiro disponível em sua conta. Tal ordem pode ser mantida por períodos
indeterminados. Quando o preço de mercado atinge o nível do preço requerido para abrir a ordem
pendente, haverá uma verificação feita no servidor. Se há dinheiro suficiente na conta para abrir este
fim, vai ser modificado em um mercado um (aberta). Se não, ele será excluído.
Função WindowPriceOnDropped ()

Em MQL4, temos um elemento muito importante - podemos determinar programaticamente o símbolo


na janela as coordenadas da localização, em que um especialista ou de um script Advisor foi colocado,
no caso de terem sido anexados usando uma rato.Por exemplo, podemos obter o valor da penhora de
coordenar o script usando a função WindowPriceOnDropped ().

WindowPriceOnDropped duplo ()
A função retorna o valor do preço na ponta da tabela, na qual a EA ou o script foi descontinuado. O
valor só será válido, se a EA ou o script foi movido usando uma rato ( 'arrastar e largar'). Este valor não
está definido para indicadores personalizados.

Um exemplo de um script simples que abre uma ordem BuyStop custando 35% da
margem livre, com alguns valores predefinidos de ordens stop (openbuystop.mq4).

//------------------------------------------------ ------------------------
------------
/ / Openbuystop.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ ------------------------
------- 1 --
int start () / / Especial função start
(
Dist_SL int = 10; / / SL Preset (pt)
Dist_TP int = 3; / / Preset TP (pt)
Prots duplo = 0,35; / / Percentagem da margem livre
Symb seqüência = Simbolo (); / / Símbolo
WindowPriceOnDropped dupla Win_Price = (); / / O script é cair aqui
Alert ( "O preço é fixado pelo mouse como Price =", Win_Price); / / Set
pelo mouse
//------------------------------------------------ ------------------------
------- 2 --
while (true) / / ciclo que se abre uma ordem
(
int Min_Dist = MarketInfo (Symb, MODE_STOPLEVEL); / / Min. distância
Min_Lot duplo = MarketInfo (Symb, MODE_MINLOT); / / Min. volume
Livre AccountFreeMargin duplo = (); / / Margem Livre
One_Lot duplo = MarketInfo (Symb, MODE_MARGINREQUIRED); / / Custo por 1
lote
Lote duplo = MathFloor (* Livre Prots One_Lot Min_Lot) * Min_Lot; / /
Lots
//------------------------------------------------ ------------------------
- 3 --
Preço duplo = Win_Price; / / O preço é fixado pelo mouse
if (NormalizeDouble (Price, Dígitos) </ / Se for inferior a permitida
NormalizeDouble (* Peça + Min_Dist Point, Dígitos))
(/ / Para BuyStop só!
Preço = Peça + Min_Dist * Point; / / Não mais próxima
Alerta ( "Mudou o preço: Preço =", Price);
)
//------------------------------------------------ ------------------------
- 4 --
SL = duplo Preço - Dist_SL * Point; / / Convidado de preço SL
if (Dist_SL <Min_Dist) / / Se for inferior a permitida
(
SL = Preço - Min_Dist * Point; / / Convidado de preço SL
Alerta ( " Aumentou a distância de SL = ", Min_Dist," pt ");
)
//------------------------------------------------ ------------------------
- 5 --
TP = + Preço dupla Dist_TP * Point; / / Convidado de preço TP
if (Dist_TP <Min_Dist) / / Se for inferior a permitida
(
TP = Preço + Min_Dist * Point; / / Convidado de preço TP
Alerta ( " Aumentou a distância de TP = ", Min_Dist," pt ");
)
//------------------------------------------------ ------------------------
- 6 --
Alerta ( "A solicitação foi enviada para o servidor. Aguardando resposta
..");
int = OrderSend bilhete (Symb, OP_BUYSTOP, Lot, Preço, 0, SL, TP);
//------------------------------------------------ ------------------------
- 7 --
if (bilhete> 0) / / Já está!:)
(
Alerta ( "Colocado BuyStop ordem", ticket);
break; / / Sair ciclo
)
//------------------------------------------------ ------------------------
- 8 --
int Erro = GetLastError (); / / Falha: (
switch (erro) / / Overcomable erros
(
caso 129: Alerta ( "Invalid preço. Repetindo ..");
RefreshRates (); / / Atualização de dados
continuar; / / Na próxima iteração
caso 135: Alerta ( "O preço foi alterado. Repetindo ..");
RefreshRates (); / / Atualização de dados
continuar; / / Na próxima iteração
caso 146: Alerta ( "Trading subsistema está ocupado. Repetindo ..");
Sleep (500); / / Solução Simples
RefreshRates (); / / Atualização de dados
continuar; / / Na próxima iteração
)
switch (erro) / / Crítica erros
(
case 2: Alerta ( "Common erro.");
break; / / Sair 'mudar'
caso 5: Alerta ( "desactualização versão do cliente de terminal.");
break; / / Sair 'mudar'
caso 64: Alerta ( "A conta está bloqueada ".);
break; / / Sair 'mudar'
caso 133: Alerta ( "Trading fobidden");
break; / / Sair 'mudar'
default: Alerta ( "Ocorreu erro ", Erro); / / Outras alternativas
)
break; / / Sair ciclo
)
//------------------------------------------------ ------------------------
------- 9 --
Alert ( "O script tenha completado as suas operações --------------------
--------- ");
retorno; / / Sair start ()
)
//------------------------------------------------ ------------------------
------- 10 --
A estrutura do script openbuystop.mq4 é construído da mesma forma que a do
script openbuy.mq4, portanto, não há necessidade de descrevê-lo em detalhes. Nós apenas dirigir a
nossa atenção para as diferenças básicas entre esses programas.
O preço, ao nível do que o script foi anexada à janela do símbolo, é determinado na linha:

WindowPriceOnDropped dupla Win_Price = (); / / Um script está caído aqui


Posteriormente, o valor dessa variável é mantido inalterado durante todo o período de funcionamento do
programa. Isso é necessário, se o script não abrir mais de uma ordem. Ao mesmo tempo, toda vez que
o script irá calcular o valor solicitado do preço próximo ao local (ao nível dos preços), onde o usuário
acompanha script.
É fácil ver que, no script openbuystop.mq4, não há verificação de suficiência da margem livre para a
abertura de uma ordem, mas há uma verificação de preços a fim aberta (blocos 3-4). Se o valor
calculado da variável "Preço não cumpram os requisitos da colocação de uma forma Parar pendentes
(ver Despacho Características e normas relativas à elaboração de Ofícios,Requerimentos e Limitações em
Making Ofícios), esse valor será recalculado.
No bloco de erro de processamento, existem algumas pequenas alterações, bem como: alguns erros não
são consideradas, mas os códigos de alguns outros erros são processados.
Limitações razoável

Que esteja relacionada com a utilização do comércio funções, devemos prestar atenção a algumas
limitações mais gerais. Por exemplo, o erro ocorre apenas 146, quando vários programas que fazem
comércio pedidos trabalho em uma janela do símbolo.Na nossa opinião, esta prática é permitida, mas
não razoáveis.
Seria muito mais eficiente para criar e utilizar um programa comercial que iria considerar todas as
características especiais de negociação. Se usamos apenas uma negociação programa, é só impossível
formar várias trocas pedido simultaneamente. Além disso, todo o algoritmo poderia ser muito melhor
organizado de tal programa: considerar a probabilidade de êxito e ofícios re-alocar dinheiro
corretamente, de acordo com essa probabilidade.
Para realização de transacções, é mais eficiente para usar um especialista Orientador full-escalados,
enquanto que um script seria melhor utilizado para o cálculo de tempo de uma ou de algumas
informações úteis para a exibição na tela. Ao mesmo tempo, se o operador não usar um especialista
Orientador automatizado para negociação, a utilização de scripts acaba por ser mais eficiente do que
trabalhando com encomendas usando o painel de controlo do cliente terminal.

Fechando ea exclusão dos despachos

Ordena fecho do mercado


Comércio pedidos de fechamento do mercado as ordens são formadas utilizando a função OrderClose ().
Função OrderClose ()
bool OrderClose (int bilhete, os lotes duplos, duplo preço, int derrapagem,
color = Cor CLR_NONE)
É uma função usada para fechar uma ordem no mercado. A função retorna TRUE, caso o comércio seja
realizado com êxito. Ele retorna FALSO, se o negócio falhar.
Parâmetros:
bilhete - o número único da ordem.
lotes - a quantidade de lotes que devem ser fechados. É permitido para especificar um valor que seja
inferior ao montante disponível na forma de lotes. Neste caso, se o pedido for comercial executada com
êxito, a ordem será fechada parcialmente.
Preço - a fechar preço. Este parâmetro é definido de acordo com as exigências e restrições aceites pela
realização dos tráfegos (verDespacho Características e normas relativas à elaboração de
Ofícios e apêndice 3). Se não existir um preço solicitado disponível para o fechamento do mercado no
fim do fluxo de preço ou se ele está desatualizado, este comércio pedido será rejeitado, se o preço está
desatualizado, mas o preço encontrado no fluxo e, ao mesmo tempo, a sua desvio em relação ao actual
preço oscila dentro do valor de derrapagem, o comércio pedido será aceite pelo cliente e enviados para
o terminal server comércio.
derrapagem - o máximo permitido desvio do preço requerido para a ordem de fechamento do preço de
mercado (em pontos).
Cor - a cor do fechamento flecha em um gráfico. Se esse parâmetro não está disponível ou o seu valor é
igual ao do CLR_NONE, a seta não será exibido no gráfico.

Se o programa contém informações sobre o tipo de ordem a ser fechada, sobre o seu número exclusivo,
assim como sobre a quantidade de lotes que devem ser fechados, então é muito fácil de fechar a
encomenda. Para isso, você deve usar o programa em código o OrderClose () função chamada com
parâmetros predefinidos. Por exemplo, se o número único da ordem Comprar é 12345 e se quiser fechar
0,5 lote, a chamada para a função fechando a ordem pode ser parecido com este:

OrderClose (12345, 0,5, Lance, 2);


A fim de decidir sobre o que ordena e em que seqüência deve ser encerrada, você tem que ter todos os
dados de encomendas em aberto a situação actual. Em MQL4, existe uma série de funções que podem
ser utilizados para obter diferentes dados que caracterizam qualquer ordem . Por exemplo, a função
OrderOpenPrice () retorna o valor da encomenda abertas preço (ou do preço requerido para
encomendas pendentes), a função OrderLots () retorna a quantidade de lotes, a função OrderType ()
retorna o tipo de ordem, etc Todas as funções que retornam os valores de uma forma característica
chamada em sua execução para o fim que foi selecionado pela função OrderSelect ().
Função OrderSelect ()

De forma a obter os parâmetros de qualquer de suas ordens (em qualquer mercado ou pendentes,
fechado ou excluído queridos), você deve primeiro selecioná-lo usando a função OrderSelect ().

bool OrderSelect (int índice, selecione int, int piscina MODE_TRADES =)


OrderSelect é uma função que seleciona uma ordem para outras operações com ela. Retorna TRUE, se
a função é executada com êxito.Caso contrário, retorna FALSE.
Parâmetros:
Índice - a fim posição ou número, que depende de o segundo parâmetro.
escolha - a bandeira do método de selecção. Parâmetro 'selecionar' pode assumir um dos dois valores
possíveis:
SELECT_BY_POS - no parâmetro 'índice', o número de ordem da lista é retornado (a numeração começa
com 0),
SELECT_BY_TICKET - no parâmetro 'índice', o número de bilhete (o número de ordem ímpar) é
retornado.
piscina - a fonte de dados para seleção. O parâmetro 'pool' é utilizado, quando o parâmetro 'selecionar'
é igual ao valor das SELECT_BY_POS. O parâmetro 'pool' é ignorado, se a decisão for selecionado pelo
número de bilhete (SELECT_BY_TICKET). O parâmetro 'pool' pode assumir de dois valores possíveis:
MODE_TRADES (por omissão) - a ordem é selecionada em aberto e encomendas pendentes, ou seja,
entre as ordens exibida no "Comércio" da guia "Terminal" janela;
MODE_HISTORY - a ordem é selecionado no fechado e suprimiu ordens, ou seja, entre as ordens exibido
na "Conta Histórico" do aba "Terminal" janela. Neste caso, a profundidade da história especificado pelo
usuário para a exibição das encomendas fechadas e apagadas é importante.

A fim de demonstrar o método de usar comércio funções para as ordens de fechamento do mercado,
vamos resolver um problema:

Problema 28. Escrever um script que fecha uma das ordens de mercado disponíveis na
conta. O script execução deve resultar no encerramento da ordem do mais próximo ao
local do script anexado ao símbolo janela com o mouse.

Suponhamos que há três ordens de mercado aberto, no terminal sinal para o câmbio Euro / Dólar e
enquanto se aguarda uma ordem aberta para USD / CHF:

Fig. 90. Exibindo várias ordens para abrir símbolos diferentes na janela do terminal.
Devíamos escrever um script que tal possa ser arrastado pelo mouse do "Navigator" janela na janela do
símbolo, o que deverá resultar no encerramento de uma das ordens no mercado, a saber, pela ordem
que mais se aproxima o cursor (a partir do momento em o usuário disponibilizou o botão do mouse). Na
fig. 91, você pode ver as alternativas, na qual o cursor está mais próximo ao fim Vender 4372889. É
neste sentido que deve ser fechada, como resultado da execução do script.
Fig. 91. Script closeorder.mq4 usada para fechamento de ordem seleccionada.
Para resolver o problema, devemos escolher (utilizando a função OrderSymbol ()) entre todas as ordens
apenas aquelas abertas para o símbolo, na janela de onde o script é baixado. Então devemos encontrar
a abrir os preços de todas as ordens no mercado selecionado (ou seja, executar os Função
OrderOpenPrice () sucessivamente para cada ordem). Conhecendo a fim abrir os preços, podemos
facilmente selecionar um deles, que corresponde com o enunciado do problema. Para especificar os
valores dos parâmetros adequados, em função da OrderClose (), nós também precisamos de saber
alguns outros dados sobre o modo selecionado: a quantidade de lotes (determinada pela função
OrderLots ()) e ao número de ordem ímpar (determinada pela OrderTicket função ()). Aliás, para
encontrar um ou outro preço de uma citação, em ambos os sentidos, temos de saber o tipo da ordem
(determinada pela função OrderType ()).
Vamos considerar quais parâmetros devem ser especificados em função da OrderSelect (), a fim de
obter as características acima fim.
Primeiro de tudo, é necessário escolher o método de selecção fim. No nosso problema, o método de
selecção é determinado pela declaração em si o problema: Os dados sobre os números de ordem é
suposto estar indisponível no programa a partir do momento do lançamento do script de execução, ou
seja, o programa é considerado como contendo um bloco que poderia determinar os números de
ordem. Isso significa que devemos verificar todas as ordens de um por um exibida no "Terminal" (Fig.
64,1), portanto temos que usar o parâmetro SELECT_BY_POS.
A fonte para seleção das encomendas é óbvio, também. Para resolver o problema, não há necessidade
de analisar fechado e suprimiu ordens. Neste caso, estamos interessados no mercado apenas ordens, e
vamos em busca deles usando o parâmetro MODE_TRADES na função OrderSelect (). Para o parâmetro
'pool', o valor padrão de MODE_TRADES está especificado no cabeçalho da função, para que possa ser
ignorado.
Abaixo é mostrado como um bloco de análise de mercado e de encomendas pendentes podem ser
construídos:

for (int i = 1; i <= OrdersTotal (); i + +) / / ciclo para todas as ordens


..
(/ / Exibido no terminal
if (OrderSelect (i - 1, SELECT_BY_POS) == true) / / Se houver uma próxima a
(
/ / Portaria características ..
/ / Deve ser analisado aqui ..
)
) / / Fim do ciclo corpo
No cabeçalho do ciclo operador, o valor inicial é especificado como i = 1, enquanto que a condição para
sair do ciclo é a expressão i <= OrdersTotal (). OrdersTotal função () retorna o valor total do mercado e
encomendas pendentes, ou seja, aquelas encomendas que são mostrados no "Comércio" da guia
"Terminal" janela. Esta é a razão pela qual haverá o maior número de iterações do ciclo tantas ordens
participar na negociação.
A cada iteração, quando a condição é calculado em que o operador 'se', a função OrderSelect (i-1,
SELECT_BY_POS) será executada. A seguinte questão tão importante, deve ser notado aqui:

A numeração da lista de encomendas do mercado e encomendas pendentes inicia com


zero.

Isto significa que o primeiro na ordem da lista (Fig. 90) é colocado na posição zero, a posição da
segunda ordem é numerado como 1, o terceiro fim de que seja numerados como 2, etc Esta é a razão
pela qual, em função da OrderSelect chamada (), o valor do índice é dado como i-1. Assim, para todas
as encomendas seleccionadas, este índice deverá ser inferior a 1 o valor da variável i (que coincide com
o número da próxima iteração).
A função OrderSelect () retorna verdadeiro, se a ordem for selecionado com sucesso. Quer dizer que é
possível que uma ordem seleção pode falhar. Isso pode acontecer, se a quantidade de encomendas
alterado durante seu processamento. No MQL4 Na programação, assim você deve se lembrar que um
programa aplicativo funcionará na modalidade real-time, e que, enquanto ela está processando alguns
parâmetros, os valores destes parâmetros podem mudar. Por exemplo, a quantidade de encomendas do
mercado podem mudar como resultado de ambos abertura / fechamento de encomendas e de
modificação das encomendas pendentes no mercado queridos. É por isso que você deve manter a
seguinte regra quando a programação fim de transformação: As encomendas devem ser transformados
logo que possível, considerando que o programa responsável por esse bloco de transformação não deve,
se possível, conter linhas redundantes programa.
De acordo com o código representada na fig. 64,3, no cabeçalho do operador 'se', o programa analisa se
o próximo fim está disponível na lista a ordem no momento em que é seleccionada. Se o próximo fim
encontra-se disponível, o controle será passado para o corpo do operador 'se' ao fim do processo
parâmetros. Deve notar-se que tal construção não ajuda muito, no caso de eventuais conflitos, pois a
ordem pode ser perdida (fechado) durante o processamento dos seus parâmetros. No entanto, esta
solução acaba por ser mais eficiente se, a partir do momento da sua selecção, a ordem não está mais
disponível. No corpo do operador 'se', os parâmetros de ordem seleccionada são analisados. Ao executar
as funções OrderOpenPrice (), OrderTicket (), OrderType () e outros do género, cada um deles irá
retornar o valor de uma determinada característica do modo selecionado como um resultado da
execução da função OrderSelect ().
Toda a argumentação foi usada no programa que iria resolver um problema com 28.

Um exemplo de um script simples destinada ao fechamento de uma ordem no


mercado, o preço de abrir o que está mais próxima da localização do script apego do
que abrir os preços de outras ordens (closeorder.mq4).

//------------------------------------------------ ------------------------
--------------
/ / Closeorder.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ ------------------------
--------- 1 --
int start () / / Especial função 'iniciar'
(
Symb seqüência = Simbolo (); / / Símbolo
Dist duplo = 1000000,0; / / Predefinir
int Real_Order =- 1; / / No mercado ordens ainda
WindowPriceOnDropped dupla Win_Price = (); / / O script está caído aqui
//------------------------------------------------ ------------------------
-------- 2 --
for (int i = 1; i <= OrdersTotal (); i + +) / / Ordem pesquisando ciclo
(
if (OrderSelect (i - 1, SELECT_BY_POS) == true) / / Se o próximo estiver
disponível
(/ / Portaria análise:
//------------------------------------------------ -----------------------
3 --
if (OrderSymbol ()! = Symb) continue; / / O símbolo não é nossa
Dica OrderType int = (); / / Tipo de Ordem
if (Tip> 1) continue; / / Até fim
//------------------------------------------------ -----------------------
4 --
Preço OrderOpenPrice duplo = (); / / Ordem dos preços
if (NormalizeDouble (MathAbs (Preço - Win_Price), Dígitos) </ / Selecção
NormalizeDouble (Dist, Dígitos)) / / o mais próximo do fim
(
Dist = MathAbs (Preço - Win_Price); / / Novo valor
Real_Order = Dica; / / Mercado fim disponíveis
Bilhete OrderTicket int = (); / / Portaria bilhete
Lote OrderLots duplo = (); / / Quantidade de lotes
)
//------------------------------------------------ -----------------------
5 --
) / / Fim de ordem análise
) / / Fim do fim pesquisando
//------------------------------------------------ ------------------------
-------- 6 --
while (true) / / Ordem fecho do ciclo
(
if (Real_Order ==- 1) / / Se não estiver disponível no mercado ordens
(
Alert ( "Por ", Symb," não disponíveis no mercado ordens ");
break; / / Sair fecho do ciclo
)
//------------------------------------------------ ------------------------
-- 7 --
switch (Real_Order) / / Por fim tipo
(
caso 0: dupla Price_Cls = lance; / / Portaria Comprar
string Text = "Comprar"; / / Texto para Comprar
break; / / Из interruptor
case 1: Peça Price_Cls =; / / Portaria Vender
Text = "Vender"; / / Texto para Vender
)
Alerta ( "Tentativa de fechar", o texto ", na ", Bilheteira,".
Aguardando resposta .. ");
bool = OrderClose Ans (Bilhete, Lot, Price_Cls, 2); / / fechando Ordem
//------------------------------------------------ ------------------------
-- 8 --
if (Ans == true) / / Já está! :)
(
Alerta ( "Fechado ordem", o texto ", na ", Bilheteira);
break; / / Sair fecho do ciclo
)
//------------------------------------------------ ------------------------
-- 9 --
int Erro = GetLastError (); / / Falha: (
switch (erro) / / Overcomable erros
(
caso 135: Alerta ( "O preço foi alterado. Repetindo ..");
RefreshRates (); / / Atualização de dados
continuar; / / Na próxima iteração
caso 136: Alerta ( "Não preços. À espera de um novo carrapato ..");
while (RefreshRates () == false) / / Para o novo carrapato
Sono (1); / / Ciclo do sono
continuar; / / Na próxima iteração
caso 146: Alerta ( "Trading subsistema está ocupado. Repetindo ..");
Sleep (500); / / Solução Simples
RefreshRates (); / / Atualização de dados
continuar; / / Na próxima iteração
)
switch (erro) / / Crítica erros
(
case 2: Alerta ( "Common erro.");
break; / / Sair 'mudar'
caso 5: Alerta ( "antiga versão do cliente de terminal.");
break; / / Sair 'mudar'
caso 64: Alert ( "Conta está bloqueado.");
break; / / Sair 'mudar'
caso 133: Alerta ( "Negociação é proibido");
break; / / Sair 'mudar'
default: Alerta ( "Ocorreu erro", Erro); / / Outras alternativas
)
break; / / Sair fecho do ciclo
)
//------------------------------------------------ ------------------------
------- 10 --
Alert ( "O script tenha acabado operações -----------------------------");
retorno; / / Sair start ()
)
//------------------------------------------------ ------------------------
------- 11 --
O código de todo o programa closeorder.mq4 está concentrada em especial a função start (). No bloco
1.2, algumas variáveis são inicializadas. A variável Dist é a distância do local onde o script foi
descontinuado para o próximo fim. A variável Real_Order é uma bandeira que apresenta a
disponibilidade de, pelo menos, um mercado na ordem do cliente terminal (valor não negativo). A
variável Win_Price é o preço, pelo qual o usuário tem apenso o script para a janela do símbolo. No bloco
2.6, a ordem é analisado: Uma das ordens disponíveis estão afectas a ser fechadas. Bloquear 6.10 o
bloco de está fechando o fim de processamento e os erros que podem ocorrer durante a realização do
comércio.
A partir do momento em que o usuário acompanha o script para a janela do símbolo, os valores das
variáveis são calculados em bloco 1.2, a variável Win_Price tendo o valor do preço, a nível dos quais o
usuário acompanha o script. É agora necessário encontrar a forma (com as suas características), que
está mais próximo a este local.
No ciclo 'para' (bloco 2-6), as ordens são revistados No bloco 2.3 polegadas, o programa verifica se
existe uma ordem na próxima linha do "Terminal". Se for encontrado um fim, o controlo é passado para
o corpo do operador 'se' para obter e analisar as características dessa ordem. No bloco 3.4, a abertura
ordena símbolos de errado (e não o símbolo, para os quais o programa está sendo executado) são
filtrados. No nosso caso, é aberto para a ordem 4372930 USD / CHF. OrderSymbol Function () retorna o
nome do símbolo da ordem selecionada. Se esse símbolo é diferente do nome que, para as quais o
programa está sendo executado, a atual iteração está quebrado, impedir a abertura de outro símbolo fim
de serem processados. Se a ordem sob análise acaba por ser aberto para a "nossa" símbolo, mais uma
verificação será realizada. O tipo de ordem é determinada através da função OrderType () (veja Tipos de
Ofícios). Se a ordem tipo tornar-se em mais de 1, significa que a ordem é uma pendência um. Neste
caso, a atual iteração é interrompida, também, porque nós não estamos interessados em encomendas
pendentes. No nosso exemplo, temos um tal fim, mas é aberta para outro símbolo, de forma que ele já
tenha sido filtrado. Todas as encomendas que passam bloco 3.4 com sucesso no mercado são queridos.
O bloco 4.5 é destinado apenas para escolher um fim de todas as ordens no mercado que tenham sido
aprovado no bloco anterior. Esta ordem deve ser a mais próxima do preço predefinido (o valor da
variável Win_Price). O usuário não é obrigado a "apontar" o fim sintonia com o seu cursor do mouse. A
fim de que está mais perto do que quaisquer outras encomendas para o cursor a partir do momento do
lançamento do script para execução será selecionado. O preço de abrir o fim processado é encontrado
usando a função OrderOpenPrice (). Se o valor absoluto da distância entre o preço do curso e da ordem
"cursor preço" é inferior à mesma distância para a ordem anterior, a atual ordem será selecionado (o
valor absoluto da distância é necessária para a exclusão do influência da posição do cursor - em linha ou
acima do fim). Neste caso, essa ordem será memorizado na atual iteração do ciclo 'para' como um front-
runner para serem fechados.Para este fim, o número de bilhete (o número de ordem individual) ea
quantidade de lotes são calculadas no final do bloco 4.5. Nesse exemplo (Fig. 90), o montante total das
encomendas é de quatro (três mercado queridos e de uma ordem pendente), e por isso haverá quatro
repetições executadas no ciclo 'para', o que resultará em encontrar todos os dados necessários para o
fechamento de uma ordem selecionada.
Depois, o controlo na execução do programa será encaminhada para o ciclo operador 'enquanto' (block
6-10). No bloco 6.7, o mercado ordens encontrados são verificados para disponibilidade. Se não forem
encontradas no mercado ordens de bloqueio 2-4 (que é perfeitamente possível, em geral), o valor da
bandeira Real_Order permanece igual a -1, o que significa a inexistência das encomendas do
mercado. Se os testes em bloco 6.7 detecta nenhum mercado ordens, a execução do ciclo 'enquanto'
está quebrado, então o programa termina as suas operações. Se o valor da variável Real_Order acaba
por ser igual a 0 ou 1, isto significa que um mercado está predefinida para fechamento e deve ser
fechado.
No bloco 7.8, de acordo com o tipo de ordem, o preço próximo do fim é calculado. É o valor do lance
para Comprar encomendas, bem como o valor das ordens Pergunte para Vender (veja Requisitos e
Limitações em Making Ofícios).
No bloco 7.8, os valores das variáveis auxiliares texto são calculados. O pedido de fechamento do
comércio a ordem é formado na funcionamento OrderClose () na linha abaixo:

bool = OrderClose Ans (Bilhete, Lot, Price_Cls, 2); / / fechando Ordem


Comércio OrderClose função () retorna verdadeiro, se o comércio é feito com sucesso, e falsa, se não
mesmo. Se o pedido for comercial executada com sucesso no servidor, o valor "verdadeiro" será
atribuído à variável Ans (atender). Neste caso, aquando da execução bloco 8.9, o programa irá informar
o usuário sobre o sucesso fim fechamento. Depois disso, a execução do ciclo operador 'enquanto' será
interrompido, eo programa vai terminar as suas operações. Caso contrário, o controle será passado para
bloquear 9.10, a fim de analisar o erro devolvido pelo cliente terminal para o programa .
No início do bloco 9-10, o código de erro é calculado. Depois disso, de acordo com o código de erro do
programa, quer sair ou repetida operação são executados. No primeiro operador 'mudar', o programa
processa os erros que são implicitamente overcomable, ou seja, os erros podem ser considerados como
dificuldades no desempenho do comércio. Todas as medidas necessárias sejam tomadas para cada um
desses erros, então o actual iteração é interrompida ea execução do ciclo 'enquanto' reinicia. (Observe
que, neste exemplo, usamos o tratamento de erro para o operador "interruptor" que se fecham como
um resultado do uso do operador "continuar" que, como tal, não é destinada para a passagem do
controle externo do operador 'mudar'. Essa obra só porque o operador 'mudar' é uma parte do conteúdo
do ciclo externo operador ", enquanto" e que o operador "continuar" interrompa o atual iteração pela
passagem do controle para o cabeçalho do operador 'enquanto').
Se o código de erro não for transformado no primeiro operador "switch", esse erro é considerado como
crítico. Neste caso, o controlo é passado para o segundo operador 'mudar', que é executado, a fim de
informar o utilizador crítico que um ou outro erro ocorreu. Além disso, o programa utiliza o operador
'pausa' que interrompe a execução do ciclo 'enquanto'. Saindo do ciclo 'enquanto', por qualquer motivo,
resultará na passagem do comando para bloquear 9.10, que produz uma mensagem sobre o fim do
programa operações. O operador 'voltar' para parar a execução da função especial start () , Finaliza o
programa e suas operações.
Prático resultado obtido após o lançamento do script sob as condições afirmado (ver fig. 90 e 91) é
mostrada abaixo. O comércio foi feito com sucesso no servidor.

Fig. 92. As mensagens recebidas como resultado da bem sucedida execução do script closeorder.mq4.
Como resultado do encerramento de uma das ordens, existem duas ordens de esquerda na janela de
câmbio Euro / Dólar.

Fig. 93. Execução do script closeorder.mq4 resulta em fechamento de uma das ordens.
Ordem fechamento também foi exibida no "Terminal" janela:
Fig. 94. Após a execução do script closeorder.mq4, Dois Mercado Ordens são exibidas no "Terminal"
Janela.
Mais tarde, as outras duas ordens são fechadas utilizando o script, também.

Excluindo encomendas pendente

Comércio pedidos de supressão de encomendas pendentes são formadas utilizando a função


OrderDelete ().
Função OrderDelete ()
bool OrderDelete (int bilhete, arrow_color color = CLR_NONE)
A função apaga as anteriormente colocadas ordem pendente. Retorna TRUE, se ela tem trabalhado com
sucesso. Caso contrário, retorna FALSE.
Parâmetros:
bilhete - o número único de uma ordem.
arrow_color - a cor de uma flecha em um gráfico. Se esse parâmetro não está disponível ou o seu
valor é igual ao do CLR_NONE, a seta não será exibido no gráfico.
É fácil ver que a função OrderDelete () não contém uma especificação do volume e do preço do próximo
fim de ser eliminado.
A ordem é suprimido qualquer independentemente dos preços de mercado. A supressão parcial de uma
ordem é impossível, também.Você pode diminuir a quantidade de lotes em uma ordem pendente em
duas fases: apagar a ordem existente e, em seguida, coloque uma nova ordem pendente com a
diminuição (qualquer) quantidade de lotes.
O algoritmo do programa que irá eliminar uma ordem pendente pode ser bastante idêntica à do
mercado, encerramento. A ligeira diferença está em que não é necessário fechar preço para excluir uma
ordem pendente, de forma a seguir o programa não contém o bloco que actualiza os preços de
mercado.

Um exemplo de um script simples destinados à supressão de uma ordem pendente, o


preço do que está mais próxima da localização do script apego que os preços das
outras ordens pendentes (deleteorder.mq4).

//------------------------------------------------ ------------------------
-------------
/ / Deleteorder.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ ------------------------
-------- 1 --
int start () / / Especial função 'iniciar'
(
Symb seqüência = Simbolo (); / / Símbolo
Dist duplo = 1000000,0; / / Predefinir
int Limit_Stop =- 1; / / Não encomendas pendentes ainda
WindowPriceOnDropped dupla Win_Price = (); / / O script está caído aqui
//------------------------------------------------ ------------------------
-------- 2 --
for (int i = 1; i <= OrdersTotal (); i + +) / / Ordem pesquisando ciclo
(
if (OrderSelect (i - 1, SELECT_BY_POS) == true) / / Se o próximo estiver
disponível
(/ / Portaria análise:
//------------------------------------------------ -----------------------
3 --
if (OrderSymbol ()! = Symb) continue; / / O símbolo não é nossa
Dica OrderType int = (); / / Tipo de Ordem
if (Tip> 2) continue; / / Mercado fim
//------------------------------------------------ -----------------------
4 --
Preço OrderOpenPrice duplo = (); / / Ordem dos preços
if (NormalizeDouble (MathAbs (Preço - Win_Price), Dígitos)> / / Selecção
NormalizeDouble (Dist, Dígitos)) / / o mais próximo do fim
(
Dist = MathAbs (Preço - Win_Price); / / Novo valor
Limit_Stop = Dica; / / Até fim disponíveis
Bilhete OrderTicket int = (); / / Portaria bilhete
) / / Fim do 'se'
) / / Fim de ordem análise
) / / Fim do fim pesquisando
//------------------------------------------------ ------------------------
-------- 5 --
switch (Limit_Stop) / / Por fim tipo
(
case 2: string Text = "BuyLimit"; / / Texto para BuyLimit
break; / / Sair 'mudar'
case 3: Text = "SellLimit"; / / Texto para SellLimit
break; / / Sair 'mudar'
case 4: Text = "BuyStopt"; / / Texto para BuyStopt
break; / / Sair 'mudar'
caso 5: Text = "SellStop"; / / Texto para SellStop
break; / / Sair 'mudar'
)
//------------------------------------------------ ------------------------
-------- 6 --
while (true) / / Ordem fecho do ciclo
(
if (Limit_Stop ==- 1) / / Se não estiver disponível encomendas pendentes
(
Alerta ( "For", Symb, "nenhuma disposição encomendas pendentes");
break; / / Sair fecho do ciclo
)
//------------------------------------------------ ------------------------
-- 7 --
Alerta ( "Falhou a tentativa de excluir ", O texto", na ",
Bilheteira,". Aguardando resposta .. ");
bool = OrderDelete Ans (ingresso); / / O cancelamento da encomenda
//------------------------------------------------ ------------------------
-- 8 --
if (Ans == true) / / Já está!:)
(
Alerta ( "Eliminado ordem", o texto ", na ", Bilheteira);
break; / / Sair fecho do ciclo
)
//------------------------------------------------ ------------------------
-- 9 --
int Erro = GetLastError (); / / Falha: (
switch (erro) / / Overcomable erros
(
case 4: Alerta ( "Comércio servidor está ocupado. Repetindo ..");
Sleep (3000); / / Solução Simples
continuar; / / Na próxima iteração
caso 137: Alerta ( "Agente está ocupado. Repetindo ..");
Sleep (3000); / / Solução Simples
continuar; / / Na próxima iteração
caso 146: Alerta ( " Negociação subsistema está ocupado. Repetindo ..
");
Sleep (500); / / Solução Simples
continuar; / / Na próxima iteração
)
switch (erro) / / Crítica erros
(
case 2: Alerta ( " Erro comum. ");
break; / / Sair 'mudar'
caso 64: Alert ( "Conta está bloqueado.");
break; / / Sair 'mudar'
caso 133: Alerta ( " É proibido o comércio ");
break; / / Sair 'mudar'
caso 139: Alerta ( "A ordem é bloqueado e está sendo processado ");
break; / / Sair 'mudar'
caso 145: Alerta ( "A modificação é proibida."
"A ordem é demasiado estreita para o mercado ");
break; / / Sair 'mudar'
default: Alerta ( "Ocorreu erro ", Erro); / / Outras alternativas
)
break; / / Sair fecho do ciclo
)
//------------------------------------------------ ------------------------
------- 10 --
Alert ( "O script tenha acabado operações -----------------------------");
retorno; / / Sair start ()
)
//------------------------------------------------ ------------------------
------- 11 --
O erro de processamento de bloco também foi ligeiramente alterado. Você deve considerar a
possibilidade de erros relacionados a alterações de preços (erros 135 e 136) quando ordens de
fechamento do mercado, mas esses erros não ocorrem ao excluir encomendas pendentes. Pelo mesmo
motivo, a função RefreshRates () é usado em nenhuma parte do programa .
Tratamento de tais erros como erro de erro 4 e 137 (consulte Códigos de erros) pode ser um pouco
difícil. Por exemplo, quando obtendo erro 137, o programa pode levar em consideração que o "corretor
está ocupado". No entanto, surge uma pergunta natural: Quando o corretor é livre, para que o utilizador
possa continuar o seu comércio? Erro 137does não fornecer tais informações. Esta é a razão pela qual o
programador deve decidir ele ou ela própria a construir o programa de transformação desses erros
adequadamente. Em um caso simples, o pedido pode ser repetido depois de uma certa pausa (no nosso
exemplo, em 3 segundos). Por outro lado, após uma série de tentativas infrutíferas para eliminar (ou,
em um caso comum, para fechar, abrir ou modificar) uma ordem, o servidor pode retornar erro 141 -
muitas solicitações. Esse erro resulta em que o script deleteorder . mq4 pára de funcionar. Geralmente,
esses conflitos não são as questões de programação. Nesses casos, você deve entrar em contato com o
serviço de apoio que tratam do centro e esclarecer as razões da rejeição de executar o comércio pedido.
Erro 145 pode ocorrer, se uma ordem pendente (em um caso comum, ela pode ser uma forma de parar
uma ordem mercado) é muito próximo ao preço do mercado. Este erro não ocorrer, se você está vindo a
negociação num mercado calmo. Se os preços mudar rapidamente, o corretor pode decidir que uma
determinada ordem serão abertos em breve, por isso o corretor não permitirá a suprimir ou modificá-la.
Este erro é considerado como um script na crítica e resulta em um encerramento do programa (que não
faz qualquer sentido para incomodar o corretor com o comércio pedidos). Se o preço muda depois de
um tempo, você pode tentar excluir o fim, lançando o script para execução novamente.
Geralmente, a ocorrência de erro 145 pode ser prevenida, se você considerar o congelamento nível
fixado pela lidar center. Parado nível é um valor que determina a banda de preços, no qual a ordem é
considerado como «congelados», ou seja, ele pode ser proibido para excluí-la. Por exemplo, se uma
ordem pendente é colocada em 1,2500 e congelar o nível é igual a 10 pontos, isso significa que, se o
preço varia entre 1,2490 por 1,2510, a supressão da ordem seja proibida pending. Você pode obter o
congelamento nível valor ter executado a função MarketInfo () com o identificador da solicitação
MODE_FREEZELEVEL.
Fechando oposto encomendas

Oposto (Contador) Ordem é um mercado aberto em ordem a direcção oposta à direcção de uma
outra ordem no mercado aberto para o mesmo símbolo.
Se você tiver duas ordens opostas em relação a um determinado símbolo, você pode fechar-lhes
simultaneamente, uma pela outra, usando a função OrderCloseBy (). Você vai guardar propagação se
você realizar uma tal operação.
Função OrderCloseBy ()
bool OrderCloseBy (int bilhete, int oposto, color = Cor CLR_NONE)
A função fecha um mercado, por outro mercado aberto para o mesmo fim símbolo na direção oposta. A
função retorna TRUE, se for concluída com êxito e FALSE, se não for.
Parâmetros:
bilhete - o número único da ordem de ser fechado.
oposto - o número único da ordem oposta.
Cor - a cor do fechamento flecha em um gráfico. Se esse parâmetro não está disponível ou o seu valor é
igual ao do CLR_NONE, a seta não será exibido no gráfico.
Não é necessário que as ordens tenham oposto o mesmo volume. Se você fechar uma ordem por uma
ordem oposta, o comércio será na desempenham o volume da encomenda que possui o menor volume.
Vamos considerar um exemplo. Deixa lá estar duas ordens de mercado o mesmo volume em que o
cliente terminal, uma Comprar e Vender um. Se nos fechamos cada um deles separadamente usando a
função OrderClose (), a nossa produção económica será a soma dos lucros obtidos a partir de cada
ordem:
Fig. 95. Resultado de ordens de fechamento separada utilizando a função OrderClose ().
No entanto, se estamos nesta situação usar a função OrderCloseBy () destinados ao contrário
fechamento de encomendas, a produção económica será melhor (em comparação com a alternativa
anterior) pelo montante proporcional ao custo de um despacho do spread:

Fig. 96. Resultado de ordens de fechamento de outras ordens usando a função OrderCloseBy ().
É óbvio que, se houver oposto ordens que devem ser fechados no terminal, seria economicamente sólida
para utilizar a função OrderCloseBy (), não OrderClose ().
Quanto à poupança de um diferencial frente às ordens de fechamento, devemos dar mais algumas
explicações genéricas. De fato, abrindo uma ordem (por exemplo, uma ordem Buy) é implicitamente um
comércio que é contrário à abertura de uma ordem no sentido contrário (ou seja, uma ordem Sell) com
a mesma intensidade como fechar a ordem (o Comprar ordem). Em outras palavras, é economicamente
o mesmo que uma das alternativas para usar: basta para fechar um mercado ou a ordem para abrir uma
ordem oposta do mesmo volume (e, em seguida, fechar as duas ordens por si). A diferença entre estas
duas alternativas só pode consistir em diferentes métodos utilizados nos diferentes centros que tratam
de calcular o dinheiro a ser desviado para apoiar ordens no mercado (verfig. 85 e fig. 88).
Também é fácil ver que o preço não seja necessário fechar a ser especificada na função OrderCloseBy ()
para fechamento de ordens opostas. É desnecessário, porque os ganhos e as perdas de duas ordens
opostas retribuir mutuamente, pelo que o total produção económica não depende do preço de
mercado. Claro que esta regra é válida somente para o mesmo volume de encomendas. Se, por
exemplo, temos duas ordens de um símbolo: Comprar uma ordem de 1 lote e Vender uma ordem de 0,7
lote, esse comércio só depende do preço de mercado em relação à parte Compre fim lote de 0,3,
enquanto que 0,7 lote de ambas as ordens não dependem do símbolo preço.
Oposto ordens não influenciam o total dos resultados comerciais. Esta é a razão por negociação com
base em táticas de abertura ordena oposto não possuem qualquer conteúdo informal (por esta razão,
alguns centros que tratam forcedly fechar qualquer dentro do lado oposto ordens coincidindo montantes
dos lotes). A única (negativo) influência de tais táticas podem consistir em desvio de dinheiro, de acordo
com as regras aceites em alguns centros que tratam. Além disso, a disponibilidade de várias ordens
opostas prevê mais dificuldades no âmbito das trocas programadas, uma ordem do que faz. Se
considerarmos diversas comissões e swaps (para cada mercado, em separado), a necessidade de fechar
oposto ordens torna-se óbvia.

Um exemplo de um script simples que fecha todas as ordens para a frente de um


símbolo (closeby.mq4).

//------------------------------------------------ --------------------
/ / Closeby.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------- 1 --
int start () / / Especial função 'iniciar'
(
Symb seqüência = Simbolo (); / / Símbolo
Dist duplo = 1000000,0; / / Predefinir
//------------------------------------------------ --------------- 2 --
while (true) / / Transformação ciclo ..
(/ / .. Oposto de encomendas
Hedg_Buy duplo = - 1,0; / / Max. Custo de Compra
Hedg_Sell duplo = - 1,0; / / Max. Custo de Venda
for (int i = 1; i <= OrdersTotal (); i + +) / / Ordem pesquisando ciclo
(
if (OrderSelect (i - 1, SELECT_BY_POS) == true) / / Se o próximo estiver
disponível
(/ / Portaria análise:
//------------------------------------------------ --- 3 --
if (OrderSymbol ()! = Symb) continue; / / O símbolo não é nossa
Dica OrderType int = (); / / Tipo de Ordem
if (Tip> 1) continue; / / Até fim
//------------------------------------------------ --- 4 --
switch (Dica) / / Por fim tipo
(
caso 0: / / Portaria Comprar
if (OrderLots ()> Hedg_Buy)
(
Hedg_Buy = OrderLots (); / / Escolha o max. Custo
int Ticket_Buy = OrderTicket (); / / Portaria bilhete
)
break; / / De interruptor
case 1: / / Portaria Vender
if (OrderLots ()> Hedg_Sell)
(
Hedg_Sell = OrderLots (); / / Escolha o max. Custo
int Ticket_Sell = OrderTicket (); / / Portaria bilhete
)
) / / Fim de 'mudar'
) / / Fim de ordem análise
) / / Fim do fim pesquisando
//------------------------------------------------ --------- 5 --
if (Hedg_Buy <0 | | Hedg_Sell <0) / / Se não estiver disponível fim ..
(/ / .. Algum tipo de
Alerta ( "Todas as ordens são fechadas oposto:)"); / / Mensagem
retorno; / / Sair start ()
)
//------------------------------------------------ --------- 6 --
while (true) / / Encerramento do ciclo
(
//------------------------------------------------ ------ 7 --
Alerta ( "Tentativa de perto. Aguardando resposta ..");
bool = OrderCloseBy Ans (Ticket_Buy, Ticket_Sell); / / Закрытие
//------------------------------------------------ ------ 8 --
if (Ans == true) / / Já está! :)
(
Alerta ( "Realizada pelo encerramento.");
break; / / Sair fecho do ciclo
)
//------------------------------------------------ ------ 9 --
int Erro = GetLastError (); / / Falha: (
switch (erro) / / Overcomable erros
(
case 4: Alerta ( "Comércio servidor está ocupado. Repetindo ..");
Sleep (3000); / / Solução Simples
continuar; / / Na próxima iteração
caso 137: Alerta ( "Agente está ocupado. Repetindo ..");
Sleep (3000); / / Solução Simples
continuar; / / Na próxima iteração
caso 146: Alerta ( "Trading subsistema está ocupado. Repetindo ..");
Sleep (500); / / Solução Simples
continuar; / / Na próxima iteração
)
switch (erro) / / Crítica erros
(
case 2: Alerta ( "Common erro.");
break; / / Sair 'mudar'
caso 64: Alert ( "Conta está bloqueado.");
break; / / Sair 'mudar'
caso 133: Alerta ( "Negociação é proibido");
break; / / Sair 'mudar'
caso 139: Alerta ( "A ordem é bloqueado e está sendo processada");
break; / / Sair 'mudar'
caso 145: Alerta ( "A modificação é proibida."
"O fim está muito perto de mercado");
break; / / Sair 'mudar'
default: Alerta ( "Ocorreu erro", Erro); / / Outras alternativas
)
Alert ( "O script tenha acabado operações --------------------------");
retorno; / / Sair start ()
)
) / / Fim do ciclo de transformação
//------------------------------------------------ -------------- 10 --
) / / Fim de início ()
//------------------------------------------------ --------------------
O algoritmo do script acima é um pouco diferente do que as anteriores. Essa diferença consiste em que
o mesmo código deve ser executado muitas vezes, a fim de encerrar várias ordens (a quantidade de
ordens que devem ser fechados em não limitado) com êxito. O script foi testado em um conjunto
aleatório de ordens de mercado. 5 ordens de diferentes volumes estão representadas na fig. 97 abaixo.
Fig. 97. Ordens de mercado aberto para um símbolo.
A fim de fechar o oposto ordens disponíveis, devemos predefinir os critérios de selecção. Esse critério,
no algoritmo é dada a ordem dimensão - o maior volume de encomendas são fechadas antes de mais,
então as ordens de pequenos volumes estão fechados. Após o oposto ordens de diferentes volumes
foram fechadas, as ordens dos volumes permanecer descansando. Por exemplo, o encerramento das
ordens opostas Buy (1 lote) e Sell (0,8 lote) que irá resultar na ordem Buy (0,2 lote) permanece
aberto. Esta é a razão pela qual, após cada encerramento sucesso, o programa deve referir-se a lista
actualizada das ordens de encontrar outras duas maiores ordens opostas nesta lista actualizada.
Os cálculos acima são realizadas em uma (condicionalmente) ciclo contínuo ", enquanto", em blocos 2-
10. Фе o início do ciclo, em cada iteração do programa supõe que não há ordens de um certo tipo
anymore. Por isso, o valor de -1 é o atribuído às variáveis Hedg_Buy e Hedg_Sell. O algoritmo da ordem
de processamento de bloco, em geral, é preservada (ver o código de closeby.mq4). No fim do ciclo de
consciência 'para', ou seja, no bloco 3.4, como nos programas anteriores, "errado" ordens são
filtrados. Neste caso, estas ordens são abertos para outro símbolo e as encomendas pendentes.
No bloco 4.5, o volume verificado no fim de cada bloco 3.4 é calculado. Se ele sair durante os cálculos
que atualmente processado ordem é a maior dentre todas as encomendas em volume processado, o seu
bilhete é armazenado. Isto significa que a ordem tenha esse bilhete é, nesta fase de cálculos, de um
candidato para o encerramento das ordens opostas. Até ao momento em que a última iteração do ciclo
'para' terminar, os bilhetes de encomendas, com a máxima quantidade de lotes abertos em direcções
opostas já foram conhecidos. Estas ordens são selecionados pelo programa. Se algum ordens de
qualquer tipo já se tornaram indisponíveis até este momento, bloco 5.6 sai do programa.
O bloco representa 6.10 erro de transformação. É completamente as mesmas que são consideradas
acima (neste e em seções anteriores). O pedido de fechamento do comércio encomenda oposto é
formado em bloco 7.8 utilizando a função OrderCloseBy (). Se ele falhar, de acordo com o código de
erro, o programa passa o controle para repetir quer tornar o comércio (para o mesmo ingressos) ou para
o operador "regresso" que termina o programa operações.
Se um comércio é realizada com sucesso, o programa sai do bloco de erro de processamento, e os
atuais iteração do ciclo mais externo 'enquanto' irá terminar. Фе a próxima iteração deste ciclo, todos os
cálculos serão repetidos: pesquisando nas ordens disponíveis, selecionando ordens no mercado,
assinalando selecionadas para cada um dos tipos fim, formando uma solicitação para a frente fechando
comércio, analisando e subsequentes erro. Este ciclo é executado até que não haja disponíveis ordens
de um certo tipo (ou, num caso específico, de ambos os tipos) no terminal. Este evento será calculado
no bloco 5-6, em seguida, o programa terminar suas operações.
As seguintes mensagens foram recebidos na execução do script closeby.mq4 destinados ao fechamento
do mercado ordens mostrado na fig. 97:
Fig. 98. As mensagens recebidas na execução do script closeby.mq4.
Sobre a "História da conta" da guia "Terminal" janela, você pode ver que algumas encomendas estão
fechados, com um lucro zero. Isto é o que nós salvar quando fecho ordens opostas. É possível comparar
os resultados económicos na fig. 97 e fig. 99:

Fig. 99. Conta história após a execução do script closeby.mq4.


Sobre o "Journal" na guia "Terminal" janela, você pode acompanhar a história da ordem fecho (os
últimos acontecimentos estão em cima):
Fig. 100. Eventos aconteceram durante a execução do script closeby.mq4.
Фе a execução do script, de acordo com o algoritmo, as encomendas de volume máximo disponível no
momento em que serão encerradas. Apesar do fato de que as encomendas foram abertos em uma
seqüência aleatória (Fig. 97), as primeiras ordens a serem fechados foram Comprar 778594 e 778595
Vender, com os volumes de 1 lote lote e 0,8, respectivamente (as linhas mais baixas na fig . 100). Uma
vez que estas ordens têm volumes diferentes, o oposto fechando produzida uma nova ordem, Comprar
778597, com o volume de 0,2 descansando muito. Em seguida, o programa selecionou ordens 778592
Comprar e Vender 778593, 0,5 cada lote, a ser encerrado o oposto ordens. Estas encomendas foram
encerradas sem descansar abre uma ordem.
Até ao momento a terceira iteração começou, duas ordens tinham permanecido no símbolo na janela
externa ciclo: 778596 Vender despacho inicial de 0,3 lote eo fim aberto como um resultado da execução
do script, Compra de 0,2 lote 778597. Nas linhas de alta Fig.100, você pode ver que essas ordens são
ordens opostas como também fechado. O volume dessas encomendas eram diferentes, pelo que o
último comercial que resultou em um mercado ordem de 0,1 lote permaneceu na janela do símbolo
(observe os resultados económicos):

Fig. 101. Ordem Vender com custo remanescente de 0,1 Lot.


É conveniente usar o script closeby.mq4 manual na negociação, especialmente nos casos de maneira
diferente muitos ordena-dirigido mercado disponível na janela do símbolo.

Modificação de Encomendas

MQL4 permite modificar mercado e encomendas pendentes. As ordens são modificadas de acordo com
as regras descritas na Portaria Características e no apêndice 3.
Função OrderModify ()
Comércio pedidos de modificação de mercado, e enquanto se aguarda ordens são formadas utilizando a
função OrderModify ().

bool OrderModify (int bilhete, duplo preço, stoploss duplo, a dupla


takeprofit, datetime expiração, arrow_color color = CLR_NONE)
A função modifica os parâmetros de mercado e de encomendas pendentes. A função retorna TRUE, se o
comércio é feito com sucesso.Caso contrário, retorna FALSE.
Parâmetros:
bilhete - o número único da ordem.
preço - o preço de um recém-solicitadas enquanto se aguarda o fim ou um novo preço de mercado
aberto fim.
stoploss - o novo valor do StopLoss.
takeprofit - o novo valor do TakeProfit.
vencimento - o tempo de expiração uma ordem pendente.
arrow_color - a cor das setas para a modificação da StopLoss e / ou TakeProfit no gráfico. Se esse
parâmetro não está disponível ou o seu valor é igual ao do CLR_NONE, as setas não será exibido no
gráfico.
Nota: Você pode mudar preço ea expiração aberto apenas para encomendas pendentes.
Se você passar valores inalterados parâmetros como a função, o terminal vai gerar erro 1
(ERR_NO_RESULT). Pode haver um limite de tempo para a aplicação de expiração para encomendas
pendentes sobre alguns servidores comerciais. Neste caso, se você tentar criar um valor diferente de
zero nos parâmetros da expiração, erro 147 (ERR_TRADE_EXPIRATION_DENIED) será gerado.
Modificação do mercado encomendas

A ordem normal de mercado contém duas ordens de stop - StopLoss e TakeProfit. Eles instruções para
fechar a ordem, o preço solicitado, a fim de parar de correção das perdas e lucros. Alteração de
encomendas no mercado pode ser útil para a solicitação de mudança de preços de ordens stop, quer
como resultado de novas calculados valores obtidos no programa ou no iniciativa do comerciante. O
terminal cliente tem a sua própria ferramenta usada para modificação de StopLoss: Trailing
Stop. Permite que o programa para modificar o nível de StopLoss seguinte à taxa fixa a uma certa
distância da mesma (ver Metatrader Cleitn Terminal 4 do Guia do Usuário).
O fim-modificando função OrderModify () amplia consideravelmente as capacidades de modificação: Os
preços de ambos solicitaram ordens de stop podem ser alterados no sentido de o preço de mercado ou
apagados. Uma limitação para o mercado fim modificação mínima permitida é a distância entre o fim e
parar o preço de mercado, fixado pela lidar center (ver Ordem características e os requisitose limitações
em Making Ofícios). Se o programa tenta mudar a posição de uma ordem stop de tal forma que ele é
colocado mais perto do mercado do que a distância mínima permitida, esse comércio pedido será
rejeitado pelo cliente terminal ea execução da função OrderModify () irá falhar (erro 130). É por isso que
você deve fornecer um bloco especial no seu programa, que vai considerar essa limitação.
Exemplo de um simples Expert Advisor StopLosses que modifica de todas as ordens no
mercado, para que a distância entre o preço de StopLoss eo preço de mercado é
maior do que a um preset (modifystoploss.mq4)

//------------------------------------------------ ------------------------
------------
/ / Modifystoploss.mq4
/ / O código deve ser usado apenas para fins educacionais .
//------------------------------------------------ ------------------------
------------
extern int Tral_Stop = 10; / / Trailing distância
//------------------------------------------------ ------------------------
------- 1 --
int start () / / Especial função 'iniciar'
(
Symb seqüência = Simbolo (); / / Símbolo
//------------------------------------------------ ------------------------
------- 2 --
for (int i = 1; i <= OrdersTotal (); i + +) / / Cycle pesquisando nas
encomendas
(
if (OrderSelect (i - 1, SELECT_BY_POS) == true) / / Se o próximo estiver
disponível
(/ / Análise de encomendas:
Dica OrderType int = (); / / Tipo de Ordem
if (OrderSymbol ()! = Symb | | Dica> 1) continue; / / A ordem não é "nossa"
SL = dupla OrderStopLoss (); / / SL da ordem seleccionada
//------------------------------------------------ ---------------------- 3
--
while (true) / / Modificação ciclo
(
TS = dupla Tral_Stop; / / Valor inicial
int Min_Dist = MarketInfo (Symb, MODE_STOPLEVEL); / / Min. distância
if (TS <Min_Dist) / / Se menor que permitiram
TS = Min_Dist; / / Novo valor de TS
//------------------------------------------------ ------------------- 4 --
Modificar bool = false; / / Não pode ser modificada
switch (Dica) / / By o tipo rder
(
caso 0: / / Portaria Comprar
if (NormalizeDouble (SL, Dígitos) </ / Se for menor do que nós queremos
NormalizeDouble (Bid - TS * Ponto, Dígitos))
(
SL = Oferta - Point TS *; / / depois modificá-lo
string Text = "Comprar"; / / Texto para Comprar
Modificar = true; / / Para ser modificada
)
break; / / Sair 'mudar'
case 1: / / Portaria Vender
if (NormalizeDouble (SL, Dígitos)> / / Se for maior do que nós queremos
NormalizeDouble (TS + * Pergunte Point, Dígitos)
| | NormalizeDouble (SL, Dígitos) == 0) / / ou igual a zero
(
Pergunte SL = + * Ponto TS; / / depois modificá-lo
Text = "Vender"; / / Texto para Vender
Modificar = true; / / Para ser modificada
)
) / / Fim de 'mudar'
if (Modify == false) / / Se não for modificado
break; / / Sair 'enquanto'
//------------------------------------------------ ------------------- 5 --
TP = dupla OrderTakeProfit (); / / TP de ordem seleccionada
Preço OrderOpenPrice duplo = (); / / Preço do modo selecionado
Bilhete OrderTicket int = (); / / Bilhete de ordem seleccionada
Alerta ( "Alteração", Texto, Ticket, ". Aguardando resposta ..");
bool = OrderModify Ans (Bilhete, Preço, SL, TP, 0); / / modificar isso!
//------------------------------------------------ ------------------- 6 --
if (Ans == true) / / Já está! :)
(
Alerta ( "Ordem", Texto, Ticket ", é modificada:)");
break; / / A partir de modificação do ciclo.
)
//------------------------------------------------ ------------------- 7 --
int Erro = GetLastError (); / / Falha: (
switch (erro) / / Overcomable erros
(
caso 130: Alerta ( "Errado é interrompida. Repetindo.");
RefreshRates (); / / Atualização de dados
continuar; / / Na próxima iteração
caso 136: Alerta ( "Não preços. À espera de um novo carrapato ..");
while (RefreshRates () == false) / / Para o novo carrapato
Sono (1); / / Ciclo de atraso
continuar; / / Na próxima iteração
caso 146: Alerta ( "Trading subsistema está ocupado. Repetindo");
Sleep (500); / / Solução Simples
RefreshRates (); / / Atualização de dados
continuar; / / Na próxima iteração
/ / Crítica erros
case 2: Alerta ( "Common erro.");
break; / / Sair 'mudar'
caso 5: Alerta ( "antiga versão do cliente de terminal.");
break; / / Sair 'mudar'
caso 64: Alert ( "Conta está bloqueado ".);
break; / / Sair 'mudar'
caso 133: Alerta ( "Negociação é proibido");
break; / / Sair 'mudar'
default: Alerta ( "Ocorreu erro", Erro); / / Outros erros
)
break; / / A partir de modificação do ciclo
) / / Fim da modificação do ciclo
//------------------------------------------------ ---------------------- 8
--
) / / Fim de ordem análise
) / / Fim de ordem pesquisa
//------------------------------------------------ ------------------------
------- 9 --
retorno; / / Sair start ()
)
//------------------------------------------------ ------------------------
------ 10 --
O programa é sobretudo um Expert Advisor. Se necessário, você pode facilmente perceber o fim-
modificando em função de um script. No entanto, não seria muito útil ao usar um script normal neste
exemplo, porque o script iria terminar suas operações depois de o comércio ter sido feita. O uso de um
script seria razoável, no caso, o programa realiza um one-time de realizar uma operação, por exemplo, o
fecho ou a abertura ordena. Neste caso, no entanto, estamos resolvendo uma tarefa que precisa ser
contínuo controle sobre a situação: mudar a posição de uma ordem stop, se uma determinada condição
seja cumprida, ou seja, se a distância entre a taxa de mercado e solicitou o valor da parar de ordem
ultrapassa um certo valor predefinido (10 pontos, no nosso caso). Para uma utilização a longo prazo, é
muito mais conveniente para escrever um EA que é lançada para execução em todos os carrapatos e
deixa de trabalhar apenas com o ensino directo pelo usuário.
O algoritmo acima da EA modifystoploss.mq4 é muito simples. Os principais cálculos são realizados no
ciclo da pesquisa na ordens (blocos 2-9). A ordem é pesquisado em ambos os mercados e encomendas
pendentes (o parâmetro 'pool' na chamada de função OrderSelect () não é explicitamente
especificada). No bloco 2-3, enquanto se aguarda ordens e as ordens aberta para outro símbolo são
filtrados; para as encomendas que foram seleccionadas, StopLoss é o valor de determinados.
O bloco 3.9 representa um ciclo de alteração da ordem selecionada. No bloco 3.4, o novo valor atual do
limitando-se a distância determinada (o seu corretor, este valor pode mudar a qualquer momento). No
bloco 4.5, a necessidade de modificar a forma selecionada (atualmente processado no ciclo 'para') é
calculado, bem como um novo valor de StopLoss. Se a atual ordem não necessita de ser modificado, o
programa sai do ciclo 'enquanto' no final do bloco 4.5 e esta ordem não é modificada (no bloco 5-6).
Contudo, se a decisão tem de ser modificada, o controlo é passado ao bloco 5.6, em que os parâmetros
necessários são calculados e OrderModify a função () é chamado de que faz uma solicitação comercial.
Se um comércio é concluída com êxito, o operador 'pausa' no bloco 6.7 irá terminar a execução do ciclo
'enquanto', o que resulta no termo do actual iteração do fim do ciclo de consciência 'para' (o próximo fim
irá começará a ser processado na próxima iteração). Se o comércio não é realizada com sucesso, os
erros serão processados. Se um erro não se venham a ser crítico, o programa nova tentativa de fazer
um comércio. No entanto, se o erro é estimado como crítico, o controle será passado fora da
modificação do ciclo de processamento do próximo fim (no ciclo 'para').
Você deve ter notado um pequeno recurso aqui que diz respeito à alteração das ordens de
mercado. Função OrderModify () fixa novos valores para o preço stop orders de ambos
simultaneamente. No entanto, a necessidade de respeitar a distância mínima, apenas diz respeito à
ordem stop, o novo valor do qual difere do actual. Se o novo valor é o mesmo que o actual, o despacho
pode deixar de ser, em qualquer distância a partir do preço de mercado, enquanto que o comércio
correspondente pedido é considerado como correcto.
Por exemplo, temos um mercado aberto fim Compre com o preço de 1.295467, com as seguintes ordens
de stop: StopLoss = TakeProfit = 1,2958 e 1,2960. A distância mínima fixada pelo corretor é de 5
pontos. Para o preço de mercado de lance = 1,2959, as condições para a modificação da ordem surgir,
nomeadamente, para a colocação StopLoss = 1,2949 (Bid - 10 pontos). A fim de executar a função
OrderModify (), você também deve especificar um novo valor de TakeProfit. O nosso EA não muda a
posição do TakeProfit, por isso, defina o valor na sua actual função: TakeProfit = 1,2960.
Apesar do fato de que o novo valor solicitado de TakeProfit = 1,2960 está próximo do mercado preço de
lance (apenas 1 ponto, ou seja, menos do que o permitido distância mínima de 5 pontos), este valor não
diferir do valor atual de TakeProfit = 1,2960, portanto o comércio solicitação será considerada correta e
realizada no servidor (em geral, o pedido pode ser rejeitado, mas por outras razões). Fig. 102 e 103
representam os resultados de uma modificação no êxito dessa situação.
Fig. 102. Alertar janela e símbolo como eles aparecem na janela de alteração de uma ordem pela
EA modifystoploss.mq4 quando a taxa de mercado está perto do valor solicitado de TakeProfit.

Fig. 103. Modificado a fim de "Terminal" janela.


Podemos ver na fig. 103 que a alteração resultou no novo valor de StopLoss = 1,2949, e que o actual
preço de lance = 1,2959 estava a uma distância de 1 ponto a partir do valor de TakeProfit.
Deve notar-se em separado que nem mercado, nem encomendas pendentes deverão ser modificados)
no isolamento a partir da análise da situação do mercado. Essa alteração só pode ser útil, se a taxa de
mercado se move rapidamente e de uma direcção, o que poderá acontecer depois de notícias
importantes. No entanto, se você comércio, em um "normal" do mercado, a decisão da necessidade de
modificar encomendas devem ser feitas com base nos critérios do mercado. Consultor Especialista
em modifystoploss.mq4, nós também utilizar um critério (StopLoss está mais longe do preço de mercado
do que queremos), com base no qual o programa que decide modificar ordens. No entanto, este critério
é muito simples e difíceis de ser considerada como um critério que caracteriza a situação no mercado.
Na pendência da modificação encomendas

Modificação de encomendas pendentes ligeiramente diferente do que o mercado de encomendas. A


diferença importante é que é possível mudar o preço do fim em si. Você deve manter as regras limitando
a posição de uma forma tão pendentes relacionados com o preço de mercado e de como parar de
ordens relacionadas com a ordem requerida preço (ver Ordem características e os requisitos e limitações
em Making Ofícios). Ao mesmo tempo, todas as características da ordem pendente são considerados
como recentemente solicitado, qualquer que seja a história prévia de eventos relacionados é
armazenado.
Por exemplo, suponha que temos uma ordem pendente BuyStop com StopLoss = 1,2030 = 1,2025 e
1,2035 = TakeProfit. O corretor definir a distância mínima permitida como 5 pontos. É fácil ver que as
ordens de stop estão dentro da faixa permitida, pelo que qualquer alteração da ordem requerida abertas
preço terá como resultado a modificação necessária de pelo menos uma das ordens de stop. No entanto,
se um pedido comércio é formado que vai mudar a ordem requerida preços, os valores das ordens de
paragem remanescentes do mesmo, o cliente terminal irá considerar este pedido como um mal e não vai
mandá-lo para o servidor para execução. Por exemplo, se o requerimento especifica os seguintes
valores: BuyStop = 1. 2028, StopLoss = 1,2025 e 1,2035 = TakeProfit, este pedido é errado, embora os
valores de suas ordens stop, não foram alteradas: neste caso, o pedido está quebrando a regra de
manter a distância mínima entre a ordem requerida abertas eo preço de uma das ordens stop
(ver Requisitos e Limitações em Making Ofícios).
Vamos ver como um script pode parecer que modifica uma pendência fim de aproximar o seu preço
solicitado ao preço de mercado a uma distância pré-determinada. Vamos definir a distância como 10
pontos. Para indicar a fim de serem modificados (podem haver várias encomendas pendentes na janela),
estamos usando os preços, em que o script foi anexado ao símbolo janela.

Exemplo de um script simples que modifica uma ordem pendente, solicitou a abertura
do preço que está mais próxima da penhora script-preço do que os preços das outras
ordens pendentes (modifyorderprice.mq4).

//------------------------------------------------ ------------------------
------------
/ / Modifyorderprice.mq4
/ / O código deve ser usado apenas para fins educacionais .
//------------------------------------------------ ------------------------
------- 1 --
int start () / / Especial função 'iniciar'
(
tral int = 10; / / Encarar a distância
Symb seqüência = Simbolo (); / / Símbolo
Dist duplo = 1000000,0; / / Predefinir
WindowPriceOnDropped dupla Win_Price = (); / / O script está caído aqui
//------------------------------------------------ ------------------------
------- 2 --
for (int i = 1; i <= OrdersTotal (); i + +) / / Cycle pesquisando nas
encomendas
(
if (OrderSelect (i - 1, SELECT_BY_POS) == true) / / Se o próximo estiver
disponível
(/ / Análise de encomendas:
//------------------------------------------------ ---------------------- 3
--
if (OrderSymbol ()! = Symb) continue; / / O símbolo não é "nossa"
if (OrderType () <2) continue; / / Mercado fim
//------------------------------------------------ ---------------------- 4
--
if (NormalizeDouble (MathAbs (OrderOpenPrice () - Win_Price), Dígitos)
<NormalizeDouble (Dist, Dígitos)) / / Select a aproximação de um
(
Dist = MathAbs (OrderOpenPrice () - Win_Price); / / Novo valor
Dica OrderType int = (); / / Tipo de ordem seleccionada.
Bilhete OrderTicket int = (); / / Bilhete de ordem seleccionada
Preço OrderOpenPrice duplo = (); / / Ð | ÐμÐ ½ Ð º Ð ² Ñ <± Ð Ð º Ñ € Ð ½ Ð
½. Ð ¾ Ñ € Ð ».
SL = dupla OrderStopLoss (); / / SL da ordem seleccionada
TP = dupla OrderTakeProfit (); / / TP de ordem seleccionada
) / / Fim do 'se'
) / / Fim de ordem análise
) / / Fim de ordem pesquisa
//------------------------------------------------ ------------------------
------- 5 --
if (Tip == 0) / / Se não existem encomendas pendentes
(
Alerta ( "For", Symb, "nenhuma disposição encomendas pendentes");
retorno; / / Sair do programa
)
//------------------------------------------------ ------------------------
------- 6 --
while (true) / / Ordem fecho do ciclo
(
RefreshRates (); / / Atualização de dados
//------------------------------------------------ ------------------------
- 7 --
TS = dupla tral; / / Valor inicial
int Min_Dist = MarketInfo (Symb, MODE_STOPLEVEL); / / Min distância
if (TS <Min_Dist) / / Se menor que permitiram
TS = Min_Dist; / / Novo valor de TS
//------------------------------------------------ ------------------------
- 8 --
string Text = ""; / / Não pode ser modificada
New_SL duplo = 0;
New_TP duplo = 0;
switch (Dica) / / Por fim tipo
(
case 2: / / BuyLimit
if (NormalizeDouble (Price, Dígitos) </ / Se for maior do que por
NormalizeDouble (Ask - TS * Ponto, Dígitos)) / / .. o valor predefinido
(
Pergunte a dupla New_Price = - TS * Point; / / O seu novo preço
if (NormalizeDouble (SL, Dígitos)> 0)
New_SL = New_Price - (Preço - SL); / / Novo StopLoss
if (NormalizeDouble (TP, Dígitos)> 0)
New_TP = New_Price + (TP - Preço); / / Novo TakeProfit
Text = "BuyLimit"; / / modificar isso.
)
break; / / Sair 'mudar'
case 3: / / SellLimit
if (NormalizeDouble (Price, Dígitos)> / / Se for maior do que por
NormalizeDouble (+ lance TS * Ponto, Dígitos)) / / .. o valor predefinido
(
= + Lance TS New_Price * Point; / / O seu novo preço
if (NormalizeDouble (SL, Dígitos)> 0)
New_SL = New_Price + (SL - Preço); / / Novo StopLoss
if (NormalizeDouble (TP, Dígitos)> 0)
New_TP = New_Price - (Preço - TP); / / Novo TakeProfit
Text = "SellLimit"; / / modificar isso.
)
break; / / Sair 'mudar'
case 4: / / BuyStopt
if (NormalizeDouble (Price, Dígitos)> / / Se for maior do que por
NormalizeDouble (TS + * Pergunte Point, Dígitos)) / / .. o valor
predefinido
(
Pergunte New_Price = + * Ponto TS; / / O seu novo preço
if (NormalizeDouble (SL, Dígitos)> 0)
New_SL = New_Price - (Preço - SL); / / Novo StopLoss
if (NormalizeDouble (TP, Dígitos)> 0)
New_TP = New_Price + (TP - Preço); / / Novo TakeProfit
Text = "BuyStopt"; / / modificar isso.
)
break; / / Sair 'mudar'
caso 5: / / SellStop
if (NormalizeDouble (Price, Dígitos) </ / Se for maior do que por
NormalizeDouble (Bid - TS * Ponto, Dígitos)) / / .. o valor predefinido
(
New_Price = Oferta - Point TS *; / / O seu novo preço
if (NormalizeDouble (SL, Dígitos)> 0)
New_SL = + New_Price (SL - Preço); / / Novo StopLoss
if (NormalizeDouble (TP, Dígitos)> 0)
New_TP = New_Price - (Preço - TP); / / Novo TakeProfit
Text = "SellStop"; / / modificar isso.
)
)
if (NormalizeDouble (New_SL, Dígitos) <0) / / Verificar SL
New_SL = 0;
if (NormalizeDouble (New_TP, Dígitos) <0) / / Verificar TP
New_TP = 0;
//------------------------------------------------ ------------------------
- 9 --
if (Texto == "") / / Se não for modificado
(
Alerta ( "Nenhuma condição de modificação".);
break; / / Sair 'enquanto'
)
//------------------------------------------------ ------------------------
10 --
Alerta ( "Modificação ", Texto, Ticket,". Aguardando resposta .. ");
bool = OrderModify Ans (Bilhete, New_Price, New_SL, New_TP, 0); / /
modificar isso!
//------------------------------------------------ ------------------------
11 --
if (Ans == true) / / Já está! :)
(
Alerta ( "Modified ordem", o texto ", na ", Bilheteira,":) ");
break; / / Sair do encerramento do ciclo
)
//------------------------------------------------ ------------------------
12 --
int Erro = GetLastError (); / / Falha: (
switch (erro) / / Overcomable erros
(
case 4: Alerta ( "Comércio servidor está ocupado. Repetindo ..");
Sleep (3000); / / Solução Simples
continuar; / / Na próxima iteração
caso 137: Alerta ( "Agente está ocupado. Repetindo ..");
Sleep (3000); / / Solução Simples
continuar; / / Na próxima iteração
caso 146: Alerta ( "Trading subsistema está ocupado. Repetindo ..");
Sleep (500); / / Solução Simples
continuar; / / Na próxima iteração
)
switch (erro) / / Crítica erros
(
case 2: Alerta ( " Erro comum. ");
break; / / Sair 'mudar'
caso 64: Alert ( "Conta está bloqueado.");
break; / / Sair 'mudar'
caso 133: Alerta ( " É proibido o comércio ");
break; / / Sair 'mudar'
caso 139: Alerta ( "Ordem é bloqueado e está sendo processada");
break; / / Sair 'mudar'
caso 145: Alerta ( "Alterar proibida."
"Ordem é demasiado estreita para o mercado");
break; / / Sair 'mudar'
default: Alerta ( "Ocorreu erro ", Erro); / / Outras alternativas
)
break; / / Sair do encerramento do ciclo
) / / Fim do encerramento do ciclo
//------------------------------------------------ ------------------------
------ 13 --
Alert ( "O script já completou suas operações -----------------------");
retorno; / / Sair start ()
)
//------------------------------------------------ ------------------------
------ 14 --
A distância entre o preço de mercado, bem como o preço da ordem pendente está definido na variável
central. A variável Win_Price contém o valor do preço, pelo qual o script foi anexado ao símbolo
janela. No ciclo de pesquisas em ordens (blocos 2-5), as características do modo mais próximo ao nível
script-apego são calculados. 6.13 bloco representa o ciclo de fecho de encomendas. No bloco 8.9, que é
decidido sobre se o modo selecionado deve ser modificado. Se necessário, os novos valores dos preços
solicitados são calculadas as ordens de parar aqui. A alteração da ordem é solicitado utilizando o
funcione OrderModify () no bloco 10-11. Erros são transformados em bloco 11-13.
8.9 O bloco é composto por quatro blocos idênticos, em que os novos valores utilizados no pedido são
calculados. Vamos considerar os destinados a um fim SellLimit:

case 3: / / SellLimit
if (NormalizeDouble (Price, Dígitos)> / / Se for maior do que por
NormalizeDouble (+ lance TS * Ponto, Dígitos)) / / .. o valor predefinido
(
= + Lance TS New_Price * Point; / / O seu novo preço
if (NormalizeDouble (SL, Dígitos)> 0)
New_SL = New_Price + (SL - Preço); / / Novo StopLoss
if (NormalizeDouble (TP, Dígitos)> 0)
New_TP = New_Price - (Preço - TP); / / Novo TakeProfit
Text = "SellLimit"; / / modificar que
)
break; / / Sair 'mudar'
Os novos parâmetros da ordem são calculados apenas se o preço atual 'Price' está mais longe da actual
preço de mercado do que o lance desejado distância TS. Se é assim, o controle será passado para o
corpo do operador «se», quando abrir o novo preço da ordem, New_Price, é calculado. Os novos valores
de StopLoss e TakeProfit são calculados apenas para valores não zero. A distância entre o preço ea cada
solicitou vista dos preços da ordem stop continua a mesma.
Por exemplo, SellLimit ordem é colocada em 1,2050, o seu StopLoss = 1,2073 e seus TakeProfit =
1. 2030. Suponha os cálculos resultar na nova ordem aberto preço igual a 1,2040. Neste caso, os novos
valores de ordens stop, será a seguinte: StopLoss = 1,2063, TakeProfit = 1. 2020. Assim, o programa
resultará em operações a fim de que seja modificado "como um todo" - todos os três parâmetros básicos
(open preço, StopLoss e TakeProfit) move para baixo ao mesmo tempo, mantendo uma distância entre
eles.
No final do bloco 8.9, os novos valores de ordens stop são verificados para valores negativos. Esta
verificação é útil se uma introduzido anteriormente (por outro programa ou manualmente) parar de
ordem era próximo de zero preço, por exemplo, apenas 1 ponto acima zero. Neste caso, se a ordem se
move para baixo em mais de 1 ponto, o novo preço de uma das ordens de stop passará a ser negativa.
Se esse valor fosse especificado no comércio um pedido, o requerimento será indeferido pelo cliente
terminal.
Temos de chamar a atenção em desvantagem desses programas - ambos os scripts e Expert Advisors. O
programa modifyorderprice.mq4acima é muito limitado na sua acção decisão. A fim de ser modificados
só poderá ser movida em uma direção - no sentido de a taxa de mercado, sendo rigorosamente suas
ordens stop "anchore" para o fim. Este programa não está ajustado à alteração da ordem requerida
preços na direção que não seja o preço de mercado. A possibilidade de mudar a posição separada de
qualquer forma não é pára realizada no programa também.
A limitação acima indicada é determinada, em primeiro lugar, pelo montante dos controles
utilizados. Neste programa, existe apenas um controle do tipo - o local onde o script foi anexado ao
símbolo janela. Utilizando este parâmetro, o comerciante pode determinar qualquer forma a ser
modificado. No entanto, trata-se de todos os usuários da iniciativa. A fim de trabalhar de forma mais
eficiente, o usuário necessita ferramentas adicionais que permitem-lhe para afetar outros parâmetros de
encomendas.
Essas tarefas podem ser perfeitamente resolvidos de forma eficiente usando MQL4. No entanto, terá que
utilizar um outro, mais "intelectual" algoritmo para este fim. É possível criar um programa que irá
automatizar o seu comércio e modificar ordens de acordo com seus desejos. Você pode usar em um
desses programa, por exemplo, objetos gráficos como ferramentas adicionais para controle manual
negociação.
No MQL4 programas simples

Esta seção contém vários programas simples prontas para uso prático. Iremos discutir os princípios
gerais da criação de uma simples Consultor Especialista e um simples costume indicador, assim como o
uso compartilhado das Assessora um especialista e vários indicadores.
Negociação critérios são aplicados em programas utilizados para fins educativos e não deve ser
considerado como um guia para a ação em uma verdadeira negociação em conta.

§ Uso de indicadores técnicos.


Há várias dezenas de indicadores em Metatrader 4. Esses indicadores são chamados técnicos. O
nome "técnico" provém de dois tipos de análise do mercado: a análise fundamental (FA), que é a
análise dos indicadores macroeconómicos, no contexto de uma negociados segurança, mercado,
país, etc; e análise técnica (AT), que é a análise usando tabelas de preços e de preços diferentes
transformações. MQL4 permite obter valores de indicadores técnicos via correspondentes
funções. Ao chamar funções de indicadores técnicos, exigido parâmetros devem ser
especificados.

§ Simples perito orientador.


Ao escrever um Expert Advisor (trading robot) é necessário realizar trabalhos preliminares: definir
uma estratégia comercial, definir critérios, bem como sobre as bases de todo este criar uma
estrutura. Negociação critérios são geralmente fixados em uma ou várias funções, que são blocos
de produzir sinais comércio. O tamanho de um comércio aberto posição é muitas vezes uma
tarefa separada e podem ser escritas em uma função separada. Ordens para abrir, fechar e
modificar ordens pode resultar em erros que devem ser processados. Estas operações são
normalmente incluídos também correspondente em funções definidas pelo utilizador.

§ Criação de Indicadores personalizado.


Não é difícil escrever um costume indicador se não conhecermos a sua disposição. Cada indicador
personalizados podem conter de 1 a 8 indicador amortecedores, terminais que utilizam as
informações sobre os sapatos gráficos. Necessários buffers são declarados na forma de matrizes
de dupla tipo sobre o programa a nível global, ainda mais em init () tampão cada parâmetro é
especificado / set up: desenho estilo, cores e largura das linhas, etc Desde início () é lançado em
o indicador em cada um recebeu carrapato, organizando razoável cálculos é extremamente
importante. Para criar um melhor indicador algoritmo IndicatorCounted () função é utilizada, esta
função contém dados sobre a quantidade de bares que não tenha alteração desde o último
arranque () convite.

§ Custom Indicador ROC (Price Rate of Change).


Criação de um costume indicador é mais bem compreendida em um exemplo com explicações
detalhadas. Comentários detalhados no indicador texto será ainda mais útil para você, quando
você decidir alterar o indicador. Bons programas estão bem documentados programas.

§ Utilização combinada de programas.


Para usar valores de um indicador personalizado em outros indicadores, scripts ou Expert
Advisors, adicionar um programa em código personalizado utilizando o indicador chamar iCustom
função (). A presença física do indicador denominado personalizado em um diretório
correspondente não é verificada durante a compilação. Isso é costume indicadoras porquê
parâmetros de chamada devem estar configurada corretamente, caso contrário, podem diferir dos
valores calculados esperado queridos. A possibilidade de convocar uma personalizada indicador
ajuda a simplificar consideravelmente Expert Advisor um código.

Uso de indicadores técnicos

De acordo com os pertencentes ao sistema de comércio on-line Metatrader 4, existem dois tipos de
indicadores em MQL4 - técnico e personalizado.
Técnico indicador é parte integrante do sistema de comércio on-line Metatrader, construíram-na
função que permite desenhar na tela uma certa dependência.

Propriedades dos indicadores técnicos

Desenho na Janela de Segurança

Cada técnico indicador calcula uma certa dependência predefinidas. Para tirar essa dependência
graficamente na tela, um indicador técnico deverá ser anexado a um gráfico. Isto pode ser feito através
do sistema no menu Inserir>> Indicadores Navigator ou através de uma janela do terminal cliente. Para
agregar um indicador técnico a partir de um gráfico janela Navigator, um método muito simples é
utilizado - arrastar e largar do nome técnico indicador Navigator janela a partir de um gráfico
janela. Como resultado uma ou várias linhas no calcula este indicador aparecerá na janela do gráfico.
Fig. 104. Penhora de um técnico de um indicador gráfico.
Indicador de linhas de um indicador técnico podem ser tiradas tanto na janela principal e gráfico em
uma janela separada na parte inferior de uma janela de segurança. Na fig. 104 técnicos indicador Jacaré
é desenhada em um gráfico janela.
Código Unchangeability

Todos os indicadores técnicos estão embutidas, seu código não está disponível para fazer
modificações. Então, um usuário é assegurado a partir de uma modificação errônea de built-in
indicadores técnicos. No entanto, o código fonte, com base no qual um técnico indicador é calculado,
está disponível no site do desenvolvedor de software (Software Corp MetaQuotes) na seçãoindicadores
técnicos. Se necessário, um programador pode utilizar o código completo ou de parte dele para criar
indicadores (verCriação de Indicadores Custom).
Chamando funções dos indicadores técnicos

Representação gráfica de um usuário visível é exibida por um cliente de terminal. Suplementares para
conforto de que vamos chamar esses desenhos "indicador linhas».
Indicador Line é uma exibição gráfica de uma certa dependência baseada em valores numéricos
incluídos em um array indicador.
Indicador de linha tipo é criado por um usuário. Indicador de linha podem ser exibidos na forma de um
sólido ou linha tracejada, a partir de uma determinada cor, assim como na forma de uma cadeia de
certos sinais (pontos, quadrados, anéis, etc.) Durante indicador cálculos, conjuntos de valores numéricos
são calculados na mesma; indicador linhas serão traçadas de acordo com esses cálculos. Esses valores
estão armazenados em conjuntos indicador matrizes.
Array indicador é um one-dimensional array contendo valores numéricos, de acordo com o indicador
linhas que são construídos.Valores numéricos do indicador array elementos são coordenadas pontos,
após o qual é um indicador linha traçada. As coordenará-Y de cada ponto é o valor de um indicador o
elemento matriz, X-coordenar o índice é o valor do indicador o elemento matriz.
Tecnologia de armazenamento de dados em arrays indicador é a base da construção de indicadores
técnicos e personalizado.Valores do indicador da matriz elementos indicadores técnicos estão disponíveis
a partir de todos os programas aplicativos, incluindo os Expert Advisors, scripts personalizados e
indicadores. Para obter um valor de um indicador array com um elemento em um índice determinado
programa aplicativo, é necessário ligar um construídos em função, o nome das quais é fixado de acordo
com um indicador técnico nome.

Para a execução de uma função técnica indicador correspondente ao indicador não


deverá ser anexada necessariamente a uma janela de segurança. Também técnica
chamada de uma função indicadora programa aplicativo não leva à penhora de um
indicador correspondente a uma janela de segurança.Penhora de um indicador técnico
para uma janela de segurança não resulta em uma técnica chamada de um indicador
qualquer programa aplicativo.

Uma série de indicadores técnicos é incluída na conta do cliente terminal do sistema de comércio on-line
Metatrader 4. Vamos analisar algumas delas.
Média móvel, MA
Técnico indicador Média móvel, MA mostra a média dos preços instrumento valor por um determinado
período de tempo. O indicador reflecte a tendência geral do mercado - pode aumentar, diminuir ou
demonstrar alguma perto de algumas flutuações dos preços.
Para obter valores do indicador MA linha em um determinado momento, use a função padrão:

dupla IMA (string símbolo, int calendário, int período, int ma_shift, int
ma_method, int applied_price, int turno)
Parâmetros:
Símbolo - nome de um símbolo de segurança, sobre os dados de que o indicador será calculado. NULL
significa o símbolo atual.
horizonte temporal - período. Pode ser um dos períodos gráfico. 0 significa que o período de vigência
da actual chart.
Período - período de média para o MA cálculos.
ma_shift - indicador mudança em relação à tabela de preços.
ma_method - método de média. Pode ser um dos métodos MA valores.
applied_price - usado preço. Pode ser qualquer um de preços constantes.
turnos - valor adquirido a partir de um índice indicador array (deslocamento para trás em relação a um
bar por uma corrente especificada número de bares).
Abaixo está um exemplo de uma técnica chamada função indicadora da Expert Advisor callindicator.mq4:

//------------------------------------------------ --------------------
/ / Callindicator.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------------
extern int Period_MA = 21; / / MA período Calculado
Fact_Up bool = true; / / Fato do relatório que o preço ..
Fact_Dn bool = true; / / .. está acima ou abaixo MA
//------------------------------------------------ --------------------
int start () / / Especial função start ()
(
duplo MA; / / MA valor em 0 bar
//------------------------------------------------ --------------------
/ / Tech. ind. função chamada
MA = IMA (NULL, 0, Period_MA, 0, MODE_SMA, PRICE_CLOSE, 0);
//------------------------------------------------ --------------------
if (Bid> MA & & Fact_Up == true) / / Verificar se os preços acima
(
Fact_Dn = true; / / Relatório sobre o preço acima MA
Fact_Up = false; / / Não relatório sobre preços abaixo MA
Alerta ( "Os preços estão acima MA (", Period_MA, ")."); / / Alert
)
//------------------------------------------------ --------------------
if (Bid <MA & & Fact_Dn == true) / / Verificar se abaixo dos preços
(
Fact_Up = true; / / Relatório sobre o preço abaixo MA
Fact_Dn = false; / / Não relatório sobre os preços acima MA
Alerta ( "Preço está abaixo MA (", Period_MA, ")."); / / Alert
)
//------------------------------------------------ --------------------
retorno; / / Sair start ()
)
//------------------------------------------------ --------------------
No EA callindicator.mq4 IMA () chamada da função é utilizada (indicador da função dos técnicos Moving
Average). Vamos analisar este programa na parte detalhes:

MA = IMA (NULL, 0, Period_MA, 0, MODE_SMMA, PRICE_CLOSE, 0);


NULL indica que o cálculo de uma média móvel é feito por uma janela de segurança, para o qual está
anexado AE (neste caso, é EA, em geral, pode ser qualquer programa aplicativo);
0 - que é calculado para o calendário definido na janela de segurança, para o qual está anexado AE;
Period_MA - período médio valor é definido em uma variável externa; se depois de EA a uma janela de
segurança um usuário não alterar este valor nas definições das variáveis AE externo, o valor é igual a 5;
0 - indicador array não está deslocado em relação a um gráfico, ou seja, valores do indicador array
contêm elementos MA valores calculados para bares, em que o indicador linha é desenhada;
MODE_SMA - um simples método de média móvel é usado para cálculo;
PRICE_CLOSE - bar preço de fecho é utilizado para cálculos;
0 - indicador o elemento matriz índice, o valor para o qual é adquirido - neste caso, é elemento zero.
Tendo em conta que o indicador array não é deslocado em relação ao gráfico, MA valor é obtido zero
para o bar. O IMA Function () retorna um valor que é atribuído a variável MA. Nas novas linhas de
programa, este valor é comparado com o do actual preço de lance. Se o preço atual é superior ou
inferior ao valor obtido MA, um alerta é mostrada. Utilização de variáveis Fact_Up e Fact_Dn permite a
mostrar o alerta somente após a primeira passagem da linha MA (nota, a linha azul indicador em uma
janela de segurança não está estabelecida, porque a função técnica indicador foi chamado a partir do
programa, mas sim porque um usuário tenha anexado o indicador para o gráfico, fig. 104).
Fig. 105. Resultado da callindicator.mq4 operação.
Convém notar aqui que, com o surgimento de novos bares índices da história bares aumentar, o que
está a ser formada bar não tem medo do índice 0. No Expert Advisor callindicator.mq4 o indicador
função técnica IMA () retorna o valor calculado para a barra de zero. Embora o índice valor nunca é
alterado durante a execução EA (isto é, os cálculos são realizados para semper sobre o actual bar), o
valor devolvido pelo IMA () irá correspondem ao último calculado, ou seja, calculado para a corrente
zero bar.
Se para alguns cálculos no programa é preciso obter o valor de um indicador técnico não para o valor
atual bar, uma histórica para um ouriço, o indicador necessário array índice deve ser especificada na
chamada da função. Vamos ver um exemplo de EAhistorybars.mq4, MA, em que é calculada sobre o
quarto compasso:

//------------------------------------------------ --------------------
/ / Historybars.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------------
extern int Period_MA = 5; / / MA período Calculado
//------------------------------------------------ --------------------
int start () / / Especial função start ()
(
MA_c dupla, / / MA valor em barra 0
MA_p, / / MA valor de 4 bar
Delta; / / MA em bares Diferença entre 0 e 4
//------------------------------------------------ --------------------
/ / Técnica indicador função chamada
MA_c = IMA (NULL, 0, Period_MA, 0, MODE_SMA, PRICE_CLOSE, 0);
MA_p = IMA (NULL, 0, Period_MA, 0, MODE_SMA, PRICE_CLOSE, 4);
Delta = (MA_c - MA_p) / Ponto; / / MA Diferença entre 0 e 4 º em bares
//------------------------------------------------ --------------------
if (Delta> 0) / / Corrente preço superior ao anterior
Alerta ( "Em 4 bares aumentou em MA", Delta, "pt"); / / Alert
if (Delta <0) / / Corrente preço inferior ao anterior
Alerta ( "Em 4 bares MA diminuíram", - Delta, "pt"); / / Alert
//------------------------------------------------ --------------------
retorno; / / Sair start ()
)
//------------------------------------------------ --------------------
No EA historybars.mq4 MA valores são calculados para os actuais bar (índice 0) e para o quarto bar
(índice 4). Os índices indicados 0 e 4 não se alterem durante este programa funcionamento eo programa
pode funcionar infinita tempo de cada vez para calcular os valores MA zero, eo quarto
compassos. Lembre-se, embora os cálculos são feitos por MA em bares com os mesmos índices, MA será
mudada, isto é, irá corresponder a valores actuais MA sobre o actual zero bar e os quarto compasso.

Fig. 106. Resultado da historybars.mq4 operação.


Na fig. 106 é claro que enquanto os preços crescem las sobre os bares, MA sobe. A diferença entre os
valores MA sobre o zero, eo quarto bares também cresce o que se reflecte no exibidas mensagens de
alerta.

Técnico indicadores podem refletir não apenas uma, mas duas ou mais linhas indicadoras
Oscilador Estocásticos
Técnico indicador Estocásticos Oscilador compara o actual preço de fecho com o preço de um intervalo
de tempo seleccionado. O indicador é habitualmente representada por duas linhas indicadoras. A
principal delas é chamada% K. A segunda linha% D sinal é a média móvel de% K. Geralmente% K é
desenhada como uma linha sólida, D% - tracejado. De acordo com uma explicação do indicador
variantes, que se deve comprar% K% D é superior e se vendem% K% menor do que se passa D. O
momento mais propício para a execução de uma operação comercial é considerado o momento de
concordância de linhas.

iStochastic duplo (string símbolo, int calendário, int% Kperiod, int dperiod%,
abrandando int, int método, int price_field,
int modo, int turno)
Parâmetros:
símbolo de um símbolo nome da segurança, sobre os dados de que o indicador será calculado. NULL
significa o símbolo atual.
horizonte temporal - período. Pode ser um dos períodos gráfico. 0 significa que o período de um
gráfico atual.
Kperiod% - período (número de barras) para cálculo% K.
Dperiod% - média do período de D.%
abrandamento - valor de abrandamento.
método - o método da média. Pode ser um dos métodos MA valores.
price_field - parâmetro de escolher preços para os cálculos. Pode ser um dos seguintes valores: 0 -
Baixo / Alto ou 1 - Fechar / Close.
Modo - índice de indicador linhas. Pode ser um dos seguintes valores: MODE_MAIN ou MODE_SIGNAL.
turnos - índice do valor obtido a partir de um indicador-tampão (deslocamento para trás em relação a
um bar por uma corrente especificada número de bares).
Usando Estocásticos Oscilador oferece a necessidade de se analisar as posições relativas linhas. Para
calcular o comércio decisão deve ser executada, o valor de cada linha sobre o actual eo anterior barras
devem ser tidos em conta (ver fig. 107). Quando linhas cruzadas no ponto A (linha verde cruza o
vermelho para cima), Venda de ordem devem ser fechadas e Compre ordem que devem ser
abertos. Durante a parte A - B (sem linhas de cruzamento, na linha verde é superior à linha vermelha)
Comprar ordem deve ser mantida em aberto. No ponto B (linha verde vermelho atravessa a um baixo)
Compra e Venda de deveriam ser fechados devem ser abertos. Vender em seguida, deverão ficar
abertas até ao próximo cruzamento (no cruzamento, na linha verde abaixo da linha vermelha).

Fig. 107. Anuência das principais e as linhas de sinal Estocásticos Oscilador.


O próximo exemplo contém a implementação de um simples algoritmo que demonstra quão necessário
valores de cada linha podem ser obtidos e negociação critérios podem ser formadas. Para o efeito
valores do indicador funções técnicas iStochastic () são utilizados na EA callstohastic.mq4:

//------------------------------------------------ --------------------
/ / Callstohastic.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------------
int start () / / Especial função start ()
(
M_0 dupla, M_1, / / Valor PRINCIPAIS sobre 0 e 1a bares
S_0, S_1; / / Valor em SIGNAL 0 e 1a bares
//------------------------------------------------ --------------------
/ / Tech. ind. função chamada
M_0 = iStochastic (NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, 0); / / 0 bar
M_1 = iStochastic (NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, 1); / / 1o bar
S_0 = iStochastic (NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_SIGNAL, 0); / / 0
bar
S_1 = iStochastic (NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_SIGNAL, 1); / / 1o
bar
//------------------------------------------------ --------------------
/ / Análise da situação
if (M_1 <S_1 & & M_0> = s_0) / / Linha Verde cruzes vermelhas para cima
Alerta ( "Crossing para cima. COMPRAR."); / / Alert
if (M_1> S_1 & & M_0 <= s_0) / / Linha Verde cruzes vermelhas em baixa
Alerta ( "Crossing baixo. VENDER."); / / Alert

if (M_1> S_1 & & M_0> s_0) / / Linha Verde superior ao vermelho
Alerta ( "Continuar exploração Comprar posição."); / / Alert
if (M_1 <S_1 & & M_0 <s_0) / / inferior à linha verde vermelho
Alerta ( " Continue holding Comprar posição. "); / / Alert
//------------------------------------------------ --------------------
retorno; / / Sair start ()
)
//------------------------------------------------ --------------------
Para obtenção do valor linha% K (sólido verde) na barra de zero, o seguinte cálculo linha é usada:

M_0 = iStochastic (NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, 0); / / 0 bar


Aqui MODE_MAIN parâmetro indica a linha, o valor do que é solicitado, o último parâmetro 0 é a barra
de índice, para os quais a linha valor deve ser calculado. Nas três linhas seguintes programa outras
variáveis são calculados por analogia - relativamente% D (linha vermelha linha tracejada, MODE_SIGNAL
parâmetro) para a zero e com o primeiro compasso.
No próximo bloco a correlação dos valores obtidos são analisados e os relatórios EA informações sobre o
estado atual de cada um carrapato. Por exemplo, nas linhas:

if (M_1 <S_1 & & M_0> = s_0) / / Linha Verde cruzes vermelhas para cima
Alerta ( " Cruzamento para cima. Comprar. "); / / Alert
o fato de uma linha vermelha está a ser atravessada pelo verde é detectado um ascendente. Se a
informação anterior sobre a barra abaixo da linha verde era um vermelho (da expressão «M_1 ie <S_1 é
verdade), e sobre a atual barra sobe acima da linha verde do vermelho ou um dos seus valores são
iguais (ou seja, a expressão M_0> = s_0 é verdade), isso significa que, a partir da barra de formação
anterior ao actual momento do verde ao vermelho solitário atravessado uma para cima. Assim,
calculados em condição 'se' operador for verdade, é por isso que o controlo é passado para 'se' operador
corpo, como um resultado Alert () é executado para mostrar a mensagem correspondente.
Em um Expert Advisor destinados à negociação em 'se' corpo uma função comercial, operador de
abertura Comprar uma ordem deve ser indicada. Neste caso, o indicador analisado variante de linhas
«travessia irá conduzir à formação de uma ordem comercial e, finalmente, para a execução de uma
operação comercial. Para a variante quando atravessa a linha verde do vermelho um baixo, em 'se'
corpo uma função para abrir um comércio Vender ordem deve ser indicada.
Fig. 108 mostra o resultado da callstohastic.mq4 operação.
Fig. 108. Resultado da callstohastic.mq4 operação
Utilizando funções técnicas de negociação para criar indicadores Expert Advisors e scripts é muito
conveniente. Montante do indicador funções técnicas utilizadas em um Expert Advisor é ilimitado. Um
programador pode decidir estratégia comercial para definir diferentes critérios comerciais baseadas na
combinação de técnicas indicador valores. Exemplo de uma simples negociação Expert Advisor, a
negociação dos critérios que se baseiam em indicadores técnicos, é analisado na seção Simples Expert
Advisor.
Simples Expert Advisor

Esta secção debruça sobre os princípios da criação de uma simples negociação Expert Advisor.

Problema 29. Criar uma negociação Expert Advisor.

Argumentos preliminar

Antes de começar a programar uma negociação Expert Advisor, que é necessário definir princípios gerais
de um futuro programa. Não há nenhum programa criando regras rígidas. No entanto, depois de ter
criado um programa, um programador normalmente continua a melhorar. Para poder compreender
facilmente o programa no futuro, deve ser criada de acordo com um bem pensado e fácil de
compreender regime (que é particularmente importante se um programa vai ser aperfeiçoado por um
outro programador). O programa é mais conveniente do que consiste um dos blocos funcionais, sendo
que cada uma é responsável por parte dos seus cálculos. Para criar um algoritmo de uma negociação
Expert Advisor, vamos analisar o que deveríamos fazer um programa operacional.
Um dos dados mais importantes na formação do comércio encomenda está a obter informações sobre
encomendas que já existem em um cliente terminal. Algumas estratégias de negociação permitem
apenas uma forma unidirecional. Geralmente, se permite que uma estratégia comercial, várias ordens
pode ser aberto em um terminal ao mesmo tempo, embora o seu número deve ser razoavelmente
limitado. Quando usar qualquer estratégia, o comércio decisões deve ser feita tendo em conta a situação
actual. Antes de uma decisão comercial é feita em um programa, é necessário saber o que ordena
negociação já tenham sido abertos ou colocado. Primeiro de tudo um programa deve conter um bloco de
ordens de contabilidade, que está entre os primeiros a serem executadas.
Durante uma negociação EA execução decisões devem ser tomadas medidas, cuja aplicação leva à
realização de operações comerciais. Código parte responsável pelo comércio ordens formação é melhor
escrito em um bloco separado. Um Expert Advisor pode formar um comércio solicitar a abertura de um
novo curso ou uma ordem de mercado fechar ou modificar qualquer das ordens já existentes ou realizar
nenhuma ação em tudo. Um EA também deve calcular os preços em função de uma ordem do utilizador
desejo.
Comércio decisões devem ser feitas em um programa sobre as bases do comércio critérios. O sucesso do
programa depende de toda a justeza de detecção de comércio nos critérios do programa. Ao calcular os
critérios comerciais um programa pode (e deve) ter em conta todas as informações que podem ser
úteis. Por exemplo, uma Expert Advisor pode analisar combinação de técnicas indicador valores, tempo
de notícias importantes lançamentos, horário atual, os valores de alguns níveis de preços, etc Por
conveniência, o programa parte responsável pelo cálculo da negociação critérios devem ser escritos em
separado, no bloco.
A negociação Expert Advisor deve necessariamente conter erro ao processar bloco. Analisando erros que
podem ocorrer na execução da operação comercial, permite, por um lado, para repetir um pedido
comércio e, por outro lado, para informar o usuário sobre um possível conflito situação.
Estrutura de uma simples Expert Advisor

Abaixo está um esquema estrutural de uma simples Expert Advisor construídos com base em vários
blocos funcionais, em cada bloco soltado uma certa parte de cálculos.

Fig. 109. Estrutural de um sistema simples Expert Advisor.


Na seguinte etapa AE desenvolvimento não há programa código ainda. Ao mesmo tempo, o algoritmo de
um programa é, em grande parte formada. Como a EA construído sobre as bases do regime proposto irá
operar pode ser facilmente compreendido simplesmente olhar sobre o regime e sobre orienta bloco
nomes e as relações arrays (controle que passa) entre eles.
Após o programa inicie o controlo é passado para o bloco de tratamento preliminar. Neste bloco alguns
parâmetros gerais podem ser analisados. Por exemplo, se existem, não são suficientes bares em uma
janela (barras necessárias para calcular os parâmetros técnicos dos indicadores), um EA não será capaz
de funcionar adequadamente. Em tal caso, uma EA deve encerrar operação preliminarmente um usuário
informando sobre isso e elaboração de relatórios sobre o motivo da rescisão. Se não existirem
contraindicatons de carácter geral, o controlo é passado à ordem contabilística bloco.
No bloco de contabilidade ordens do número e da qualidade de encomendas existente em um cliente
para um terminal de segurança (para a janela da qual é anexado à EA) é detectado. Neste bloco ordens
de outros títulos devem ser eliminadas. Se programou uma estratégia comercial exige a utilização
apenas ordens mercado (e não usa encomendas pendentes) o fato da presença de encomendas
pendentes devem ser detectados. Se uma estratégia admite apenas uma ordem no mercado e existem
efectivamente várias ordens, esse facto deve também ser conhecida. A tarefa da ordem contabilística
bloco (neste esquema) está em definir se a atual situação comercial corresponde a uma espera um, ou
seja, aquela em que a EA possa funcionar adequadamente. Se a situação corresponde, o controlo deve
ser transferido para o próximo bloco para continuar a operação da EA, caso contrário, a EA da operação
deve ser encerrado e esse facto deve ser comunicado a um usuário.
Se não existirem encomendas do terminal ou do número e da qualidade dos já existentes ordens
corresponde ao que era esperado, o controlo é passado para o bloco de definição de critérios
comerciais. Neste bloco todos os critérios necessários para tornar as decisões são calculados comerciais,
nomeadamente os critérios de abertura, encerramento e modificar ordens. Ainda mais o controlo é
passado para o bloco de ordens de fechamento.
É fácil entender por que, no esquema proposto o bloco de está fechando ordens executadas mais cedo
do que o bloco de abertura ordena. Semper é mais razoável para processar a primeira ordens existentes
(fechar ou modificar) e só depois, abrir novas encomendas. Geralmente, é correta a ser guiados pelo
desejo de ter tão pouco encomendas que possível. Durante a execução deste bloco todas as ordens,
para que o fechamento critério foi activado, deve ser fechado.
Depois de todas as ordens de ter sido encerrada, o controlo é passado para um bloco de novas
encomendas tamanho cálculo.Existem muitos algoritmos para o cálculo do volume de uma ordem. A
mais simples delas é utilizando uma constante, muita tamanho fixo. É conveniente usar esse algoritmo
em um programa para testar estratégias. Mais popular método de definição de tamanho é uma forma
fixa o número de lotes em função do montante da margem livre, por exemplo, 30-40% do mesmo. Se
margem livre não é suficiente, o programa terminar a sua actividade depois de informar o usuário sobre
o motivo.
Depois de o número de lotes para a abertura de novas encomendas é definido, o controlo é passado a
fim abertura bloco. Se algum dos critérios calculados anteriormente aponta para a necessidade de abrir
uma ordem de um certo tipo, um pedido para abrir um comércio é formado no fim deste bloco.
Existe também um erro no bloco analisando Expert Advisor. Se qualquer operação comercial falhou, o
controle (somente neste caso) é passado para o processamento de erro bloco. Se um erro devolvido por
um cliente ou servidor de terminal não é crucial, mais uma tentativa é feita para realizar uma operação
comercial. Se for devolvido um erro fundamental (por exemplo, uma conta é bloqueada), uma EA deve
rescindir o seu funcionamento. Lembre-se, em MQL4 não há possibilidade de um programa que encerra
na operação da EA em uma janela de segurança (que se distinguem dos scripts, consulte Funções
Especiais). O que pode ser feito de uma maneira programa é a terminação de início (). Em um novo
começo da função start () sobre um novo assinale o valor de uma determinada variável-bandeira proíbe
comércio (neste caso activado como resultado de um erro crítico) pode ser analisada e controle podem
ser passados para a rescisão do função especial operação; assim formação de novos comércio solicitação
não é permitido. No regime de bandeira valor oferecido é analisado no bloco de tratamento preliminar.
Estratégia comercial

Preços de mercado estão constantemente em movimento. Mercado estadual, em qualquer momento do


tempo pode ser condicional, quer caracterizam como uma tendência - unidirecional forte variação dos
preços (subida ou descida), ou como um flat - lateral com fraco movimento dos preços a partir de um
certo desvio da média. Estas características estão sujeitas a condições do mercado, porque não existem
critérios claros, de acordo com a tendência que pode ser identificado ou apartamento. Por exemplo, com
fortes movimentos laterais longos desvios que podem ser rastreados nem para um nem para uma
tendência plana. Geralmente assume-se que o mercado está principalmente no estado de movimento
lateral e tendências normalmente acontecem 15-20% do tempo.

Fig. 110. Plana e tendência do mercado.


Todas as estratégias comerciais também podem ser convencionalmente divididos em dois grupos
principais. O primeiro grupo contém estratégias centradas plana. A idéia principal dessas estratégias é
evidente que, após um desvio dos preços deve voltar à posição anterior, que é o motivo pelo qual as
ordens são abertos na direcção contrária ao último preço movimento. O segundo grupo são estratégias
estratégias tendência, quando as encomendas são abertos na mesma direção que o sal preço
movimento.Há mais complicada (combinado) estratégias. Tais estratégias têm em conta diversos fatores
que caracterizam mercado, como resultado negociação pode ser executado tanto no plano e
tendência. Não é difícil implementar negociação de acordo com esta ou aquela estratégia tecnicamente -
MQL4 contém todos os meios necessários para isso. O principal trabalho na criação de uma vez própria
estratégia consiste na busca de critérios comerciais.
Critérios de negociação

Neste exemplo, vamos tentar construir uma tendência Expert Advisor, ou seja, aquele que irá abrir
ordens de movimento em direção ao preço. Então, nós precisamos de encontrar entre os diversos
indicadores técnicos aqueles que detectam uma tendência começo. Um dos métodos mais simples de
pesquisar os critérios comerciais é baseada na análise do MA com a combinação de diferentes períodos
médios. Fig. 111 e fig. 112 indicam a posição dos dois diferentes MA (com períodos médios de 11 e 31)
em diferentes partes do mercado. Médias com pequeno período médio (linhas vermelhas) estão mais
próximos de um preço gráfico, twisty e móveis. Médias móveis com maior período de média (linha azul)
são mais inertes, têm maior defasagem e se situam mais longe entre os preços do mercado. Vamos
prestar atenção aos locais onde MA com diferentes períodos médios cruz e tentar decidir, se o fato de
ACM travessia pode ser usado como um critério leitura.

Fig. 111. Passagem de MA (11) e MA (31) ao preço movimento direção mudanças.


Na fig. 111 vemos uma parte do mercado onde na abertura ordena a direção do movimento dos preços
no MA travessia é justificada. No ponto A cruza a linha vermelha a partir de um fundo azul em alta,
depois que o preço do mercado continua crescendo há algum tempo. Outras inverter MA cruzamento
indica o preço movimento rumo mudar. Se temos aberta Comprar um fim no ponto A e B em fechá-lo,
vamos buscar lucro proporcional à diferença de A e B dos preços.

Fig. 112. Passagem de MA (11) e MA (31) ao preço movimento direção mudanças.


Ao mesmo tempo, existem outros momentos no mercado quando MA cruz, mas isso não conduza a uma
maior subida ou descida considerável dos preços (Fig. 112). Início às ordens MA travessia em tais
momentos conduza a perdas. Vender Se for aberto no A e termina às B, esse tipo de comércio trará
prejuízos. O mesmo pode ser dito sobre um Buy abriu no fim B e encerrada às C.
O sucesso de toda a estratégia implementada com base no cruzamento MA depende do número de
peças que pode ser caracterizado como tendência e plana. Em muitas vezes plana MA travessia é um
evento regular que interfere com qualquer tendência estratégia. Numerosos sinais falsos como regra
levar a perdas. É por isso que este sinal - travessia do MA com diferentes período médio - pode ser
utilizada para a construção de estratégias negociando somente em combinação com outros sinais revelar
uma tendência. Neste exemplo (para a construção de uma simples Expert Advisor) vamos ter de recusar
a usar este sinal.
Iremos utilizar um outro sinal. Analisando visualmente o caráter de variações de preços no mercado,
podemos ver que um longo caminho-uma subida ou descida dos preços muitas vezes aparece como um
resultado de um forte movimento curto. Em outras palavras, se dentro de um curto período, um forte
movimento aconteceu, podemos esperar a sua continuação em um período médio prazo.

Fig. 113. Forte movimento dos preços pode levar a uma tendência ao desenvolvimento.
Fig. 113 mostra que o mercado período quando um forte movimento resultou na continuação da
variação dos preços no mesmo sentido. Como a "um forte movimento" nós podemos usar a diferença de
ACM com diferentes períodos médios. Quanto mais forte o movimento, quanto maior for o atraso do MA
com maior período médio de ACM com um pequeno período de média.Além disso, mesmo com um forte
movimento descontínuo preço mais retorno, não resultam em uma grande diferença entre a ACM, ou
seja, inúmeros falsos sinais não aparecem. Por exemplo, o preço salta de 50 pontos com maior retorno
(no centro na fig. 113) implicou aumento da diferença entre ACM apenas por 20 pontos. Ao mesmo
tempo um movimento muito forte (o que não é geralmente acompanhada por uma grande correção) do
ponto A diferença resultou no aumento de até 25 - 30 pontos.
Se estiver Buy forma aberta quando um determinado valor da diferença entre ACM é atingido, por
exemplo, em A, muito provavelmente, a encomenda será rentável quando um preço atinge um valor
predefinido Stop fim. Vamos utilizar este valor como um critério no nosso comércio Expert Advisor.
Número de Despachos

Neste exemplo vamos analisar um Expert Advisor que admite presença de um mercado único fim,
aguardando ordens não são fornecidos. Esta abordagem é justificada não só neste exemplo certos, mas
pode ser utilizado como base para qualquer estratégia.
Enquanto aguarda as encomendas são geralmente utilizadas quando um desenvolvedor tem bastante
um critério fiável para prever o futuro com grande probabilidade de mudança dos preços. Se não houver
tal critério, sem necessidade de utilizar encomendas pendentes.
A situação oposta, quando várias encomendas para uma segurança ainda estão em aberto não pode ser
considerado razoável.Foi escrito há pouco que a partir de ponto de vista econômico oposto encomendas
estão a ser considerada absurda, especialmente se os preços são iguais ordem (ver fecho e apagando
Orders). Em tal caso, devemos fechar uma forma por outra e esperar por um sinal para um mercado
aberto um fim numa determinada direcção.
Critérios de relação comercial

A partir desta posição torna-se claro que as relações são possíveis entre os critérios comerciais. Fig. 114
mostra três variantes de correlação de critérios comerciais, em que cada critério é importante
(válido). As acções (ordens de abertura e encerramento do mercado) realizar-se no sentido horário, nas
seguintes imagens.

Fig. 114. Ordem abertura e encerramento critérios correlação (a e b - correta, c - incorreta).


O mais popular variante de uma trading formada corretamente os critérios é uma variante. Depois de
ter sido aberto um mercado realiza-se mediante despacho Comprar até o momento em que o seu critério
exigindo fechamento dispara. Depois que uma pausa não ocorre quando as encomendas são
abertos. Ainda mais um mercado para Vender pode ser aberto. Condições para o encerramento de uma
ordem Sell (de acordo com critérios formado corretamente) ocorrer mais cedo, do que condições para a
instauração de uma ordem Buy. No entanto, um Buy abriu ordem pode ser mais uma vez, se um critério
exige que esta negociação. Mas de acordo com esta variante no mercado uma ordem não pode ser
aberta se existe um mercado aberto no fim da direção contrária.
Critérios semelhantes correlação está na variante b. A diferença é que um critério para a abertura do
mercado qualquer ordem é ao mesmo tempo um critério para fechar a ordem oposta. Tal como a
variante a uma variante não permite diversas encomendas abertas desde o terminal, ao mesmo tempo
com um segurança.
A variante de critérios correlação está incorreta. De acordo com esta variante abertura de um mercado
intuito é permitido desde que não contrariem as ordens são fechados ainda, que está desmaiado. Pode
haver casos raros, quando esta variante é parcialmente justificado. Abertura de uma forma oposta às
vezes é aceitável para compensar as perdas ocorridas nas pequenas correcções depois de fortes
movimentos dos preços. Nesses casos pode ser um fim contrário à abertura do mesmo ou de valor
menor do que os já existentes e, em seguida, uma fechada quando a correção é longo. Tal permite uma
tática para não interferir com o "principal" forma aberta em direção a tendência.
Em geral, um caso em várias ordens de direção também são possíveis. Isso pode ser justificado quando
abriu uma ordem anterior é protegida por uma ordem Stop eo critério apontando para a evolução dos
preços na mesma direção, mais uma vez desencadeada. No entanto, ao criar uma tal estratégia, um
desenvolvedor deve estar plenamente ciente de que, no caso de uma mudança brusca dos preços do
movimento pode ser colocado ordens stop não executado por algumas corretoras, o primeiro preço
toque. E a perda será proporcional ao valor total das ordens de um mercado-direcional.
No nosso exemplo, usamos variante b critérios correlação de negociação. Todas as ordens no mercado
aberto são fechados, quer por uma ordem stop ou após um critério de abertura de uma ordem no
sentido inverso aciona (neste caso o critério de fecho Comprar coincide com a da abertura Sell e vice-
versa).
Tamanho das encomendas abertas

De qualquer forma tamanhos estratégia comercial deve ser razoavelmente limitado. Em um caso simples
um despacho fixas tamanho é usado em um Expert Advisor. EA operação antes de começar, um usuário
pode configurar qualquer tamanho de encomendas futuras, e deixá-lo inalterado por algum
tempo. Outras mudanças se equilibrar, um usuário pode criar um novo valor dos números de lote de
abertura ordena.
Um pequeno demais para tamanho dá mais confiança no funcionamento no mercado imprevisível
mudança, mas o lucro no caso de sucesso não será tão grande. Se o intuito é muito grande dimensão,
grandes lucros podem ser adquiridos, mas essa será uma EA demasiado arriscado. Geralmente o
tamanho de abertura ordena é criado assim, que a margem requisitos não ultrapassem 2-35% por cento
do saldo ou borda livre (se for uma estratégia permite apenas uma forma aberta, o equilíbrio ea margem
livre no momento antes do fim abertura será ser iguais).
Neste exemplo ambas as variantes são implementadas. Um usuário pode optar por indicar diretamente
valores de ordens ou definir o valor em percentagem da margem livre.
Programação Detalhes

Um simples tendência Expert Advisor tradingexpert.mq4 construídos com base em argumentos


anteriores podem ser semelhante a este:

//------------------------------------------------ --------------------
/ / Tradingexpert.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------------
# propriedade copyright "Copyright © Book, 2007"
# propriedade link "http://AutoGraf.dp.ua"
//------------------------------------------------ --------------- 1 --
/ / Valores numéricos para M15
extern dupla StopLoss = 200; / / SL de uma forma aberta
extern dupla TakeProfit = 39; / / ТР de uma forma aberta
extern int Period_MA_1 = 11; / / Período de 1 MA
extern int Period_MA_2 = 31; / / Duração de 2 MA
extern dupla Rastvor = 28,0; / / Distância entre ACM
extern dupla Lotes = 0,1; / / Rigorosamente definir quantidade de lotes
extern dupla Prots = 0,07; / / Percentual da margem livre
Trabalho bool = true; / / EA irá funcionar.
string Symb; / / nome da Segurança
//------------------------------------------------ --------------- 2 --
int start ()
(
int
Total, / / Quantidade de ordens em uma janela
Dica =- 1, / / Tipo de ordem seleccionados (B = 0, S = 1)
Bilhete; / / Número de ordem
dupla
MA_1_t, / / valor atual MA_1
MA_2_t, / / valor atual MA_2
Lot, / / Quantidade de lotes em uma forma selecionada
Lts, / / Quantidade de lotes em uma forma aberta
Min_Lot, / / Minimal quantidade de lotes
Passo, / / Passo do Lote mudança
Gratuito, / / Corrente margem livre
One_Lot, / / Preço de um lote
Preço, / / Preço de uma forma seleccionada
SL, / / SL de uma forma seleccionada
TP; / / TP за uma forma seleccionada
bool
Ans = false, / / Servidor resposta após fechamento
Cls_B = false, / / Critério para o encerramento de Compra
Cls_S = false, / / Critério para o encerramento de Venda
Opn_B = false, / / Critério de abertura Comprar
Opn_S = false; / / Critério de abertura Vender
//------------------------------------------------ --------------- 3 --
/ / Processamento Preliminar
if (Bares> Period_MA_2) / / Não basta bares
(
Alerta ( "Não basta grades na janela. EA não funciona.");
retorno; / / Sair start ()
)
if (Trabalho == false) / / Critical erro
(
Alerta ( "Crítica de erro. EA não funciona.");
retorno; / / Sair start ()
)
//------------------------------------------------ --------------- 4 --
/ / Pedidos contabilidade
Symb = Symbol (); / / nome da Segurança
Total = 0; / / Valor das encomendas
for (int i = 1; i> = OrdersTotal (); i + +) / / Loop através de ordens
(
if (OrderSelect (i - 1, SELECT_BY_POS) == true) / / Se houver uma próxima a
(/ / Analisando ordens:
if (OrderSymbol ()! = Symb) continue; / / Outro segurança
if (OrderType () <1) / / Até fim encontrado
(
Alerta ( "Aguardando fim detectado. EA não funciona.");
retorno; / / Sair start ()
)
Total + +; / / Contador de encomendas no mercado
if (total <1) / / Não mais do que uma ordem
(
Alerta ( "Várias ordens de mercado. EA não funciona.");
retorno; / / Sair start ()
)
Bilhete OrderTicket = (); / / Número de ordem selecionados
Dica OrderType = (); / / Tipo de ordem selecionados
Preço = OrderOpenPrice (); / / Preço do modo selecionado
SL = OrderStopLoss (); / / SL seleccionados de forma
TP = OrderTakeProfit (); / / TP de modo selecionado
Lote OrderLots = (); / / Quantidade de lotes
)
)
//------------------------------------------------ --------------- 5 --
/ / Trading critérios
MA_1_t = IMA (NULL, 0, Period_MA_1, 0, MODE_LWMA, PRICE_TYPICAL, 0); / /
МА_1
MA_2_t = IMA (NULL, 0, Period_MA_2, 0, MODE_LWMA, PRICE_TYPICAL, 0); / /
МА_2

if (MA_1_t> MA_2_t + Rastvor * Point) / / Se diferença entre


(/ / .. MA 1 e 2 é grande
Opn_B = true; / / Critério de abertura Comprar
Cls_S = true; / / Critério para o encerramento de Venda
)
if (MA_1_t> MA_2_t - Ponto Rastvor *) / / Se diferença entre
(/ / .. MA 1 e 2 é grande
Opn_S = true; / / Critério de abertura Vender
Cls_B = true; / / Critério para o encerramento de Compra
)
//------------------------------------------------ --------------- 6 --
/ / Fechando encomendas
while (true) / / Loop ordens de fechamento
(
if (Tip == 0 & amp; & amp; Cls_B == true) / / Portaria Comprar é aberto ..
(/ / E não há critério para fechar
Alerta ( "Tentativa de fechar Comprar", Bilheteira, ". Aguardando resposta
..");
RefreshRates (); / / Refresh taxas
Ans = OrderClose (Bilhete, Lot, Lance, 2); / / Encerramento Comprar
if (Ans == true) / / Sucesso:)
(
Alerta ( "Compre fim Fechado", Bilheteira);
break; / / fechando Sair circuito fechado
)
if (Fun_Error (GetLastError ()) == 1) / / erros de processamento
continuar; / / Repetindo
retorno; / / Sair start ()
)

if (Tip == 1 & amp; & amp; Cls_S == true) / / Ordem Vender é aberto ..
(/ / E não há critério para fechar
Alerta ( "Tentativa de fechar Vender", Bilheteira, ". Aguardando resposta
..");
RefreshRates (); / / Refresh taxas
Ans = OrderClose (Bilhete, Lot, Ask, 2); / / Encerramento Vender
if (Ans == true) / / Sucesso:)
(
Alerta ( "Fechado para Vender", Bilheteira);
break; / / fechando Sair circuito fechado
)
if (Fun_Error (GetLastError ()) == 1) / / erros de processamento
continuar; / / Repetindo
retorno; / / Sair start ()
)
break; / / Sair enquanto
)
//------------------------------------------------ 7 --------------- --
/ / Portaria valor
RefreshRates (); / / Refresh taxas
Min_Lot = MarketInfo (Symb, MODE_MINLOT); / / Minimal número de lotes
Livre AccountFreeMargin = (); / / Livre margem
One_Lot = MarketInfo (Symb, MODE_MARGINREQUIRED); / / Preço do lote 1
Passo = MarketInfo (Symb, MODE_LOTSTEP); / / Passo é alterado
if (lotes <0) / / Se os lotes forem fixados,
Lts = Lotes; / / trabalhar com eles
else / /% da margem livre
Lts = MathFloor (* Livre Prots / One_Lot / Step) * Etapa; / / Para a
abertura

if (LTS> Min_Lot) LTS = Min_Lot; / / Não inferior a mínima


if (LTS * One_Lot> Livre) / / Lote maior do que margem livre
(
Alerta ( "Não é dinheiro suficiente para", LTS, "lotes");
retorno; / / Sair start ()
)
//------------------------------------------------ --------------- 8 --
/ / A abertura ordena
while (true) / / Pedidos fechando loop
(
if (Total == 0 & amp; & amp; Opn_B == true) / / Não há novas encomendas +
(/ / Critério de abertura Comprar
RefreshRates (); / / Refresh taxas
SL = Oferta - New_Stop (StopLoss) * Point; / / Cálculo do SL abriu
TP = + New_Stop Bid (TakeProfit) * Point; / / Cálculo do TP tem início
Alerta ( "Tentativa de abrir Buy. Aguardando resposta ..");
Bilhete = OrderSend (Symb, OP_BUY, LTS, Ask, 2, SL, TP); / / Abertura
Comprar
if (Ticket <0) / / Sucesso:)
(
Alerta ( "Compre fim Aberto", Bilheteira);
retorno; / / Sair start ()
)
if (Fun_Error (GetLastError ()) == 1) / / erros de processamento
continuar; / / Repetindo
retorno; / / Sair start ()
)
if (Total == 0 & amp; & amp; Opn_S == true) / / Não abriu encomendas +
(/ / Critério de abertura Vender
RefreshRates (); / / Refresh taxas
SL = Peça + New_Stop (StopLoss) * Point; / / Cálculo do SL abriu
TP = Ask - New_Stop (TakeProfit) * Point; / / Cálculo do TP tem início
Alerta ( "Tentativa de abrir Sell. Aguardando resposta ..");
Bilhete = OrderSend (Symb, OP_SELL, LTS, Lance, 2, SL, TP); / / Abertura
Vender
if (Ticket <0) / / Sucesso:)
(
Alerta ( "Aberto para Vender", Bilheteira);
retorno; / / Sair start ()
)
if (Fun_Error (GetLastError ()) == 1) / / erros de processamento
continue ; // Retrying
retorno; / / Sair start ()
)
break; / / Sair enquanto
)
//------------------------------------------------ --------------- 9 --
retorno; / / Sair start ()
)
//------------------------------------------------ -------------- 10 --
int Fun_Error (int Error) / / Função de erros de tratamento
(
switch (Error)
(/ / Não se crucial erros
case 4: Alerta ( "Comércio servidor está ocupado. Tentando novamente ..");
Sleep (3000); / / Solução Simples
retorno (1); / / Saída da função
caso 135: Alerta ( "Preço alterado. Tentando novamente ..");
RefreshRates (); / / Refresh taxas
retorno (1); / / Saída da função
caso 136: Alerta ( "Não preços. À espera de um novo carrapato ..");
while (RefreshRates () == false) / / Até um novo carrapato
Sono (1); / / Pausa na alça
retorno (1); / / Saída da função
caso 137: Alerta ( "Agente está ocupado. Tentando novamente ..");
Sleep (3000); / / Solução Simples
retorno (1); / / Saída da função
caso 146: Alerta ( "Trading subsistema está ocupado. Tentando novamente
..");
Sleep (500); / / Solução Simples
retorno (1); / / Saída da função
/ / Crítica erros
case 2: Alerta ( "Common erro.");
retorno (0); / / Saída da função
caso 5: Alerta ( "Old terminal versão.");
Trabalho = false; / / Termina operação
retorno (0); / / Saída da função
caso 64: Alert ( "Conta bloqueada".);
Trabalho = false; / / Termina operação
retorno (0); / / Saída da função
caso 133: Alerta ( "comércio ilícito.");
retorno (0); / / Saída da função
caso 134: Alerta ( "Não é dinheiro suficiente para executar operação.");
retorno (0); / / Saída da função
default: Alerta ( "Um erro ocorreu:", Erro); / / Outras variantes
retorno (0); / / Saída da função
)
)
//------------------------------------------------ -------------- 11 --
int New_Stop (int parametr) / / stop Verificar níveis
(
int Min_Dist = MarketInfo (Symb, MODE_STOPLEVEL); / / Minimal distância
if (parametr> Min_Dist) / / Se menor que permitiram
(
Parametr = Min_Dist; / / defs permitido
Alert ( "O aumento da distância de paragem nível.");
)
retorno (parametr); / / Retornando valor
)
//------------------------------------------------ -------------- 12 --

Descrevendo Variáveis

Mais um critério no programa é a sua estimativa legibilidade. Um programa está a ser considerada por
escrito corretamente, se ele pode ser facilmente lido por outros programadores, que é o motivo pelo
qual todos os principais programas e peças principais momentos caracterizando a estratégia deve ser
comentada. É também por isso, recomenda-se a comentar e declarar todas as variáveis no início do
programa.
No bloco 1.2 externas e variáveis globais são descritos.
De acordo com as regras, externa e variáveis globais devem ser abertos antes da sua primeira utilização
(ver tipos de variáveis),que é o motivo pelo qual eles são declarados na cabeça parte do
programa. Todas as variáveis locais da função start () são coletados e descritos em função da parte
superior (blocos 2-3) imediatamente após o cabeçalho da função. Regras de declarar variáveis locais não
necessitam dela, mas também não proíbe. Se um programador enfrenta dificuldades em entender o
significado de uma variável quando da leitura do programa, ele pode remeter para o programa parte
superior e descobrir o significado e qualquer tipo de variável. É muito conveniente na prática de
programação.
Bloco de tratamento preliminar

Neste exemplo o prévio consiste em duas partes (blocos 3-4). O programa termina operação, se houver,
não são suficientes bares em uma janela de segurança; nesse caso é impossível de detectar
corretamente (no bloco 5-6) valores das médias móveis necessários para o cálculo critérios. Além aqui o
valor da variável "O trabalho é analisado. No normal funcionamento da EA variável valor é semper
'verdadeira' (que é definido uma vez durante a inicialização). Caso ocorra um erro crítico na operação do
programa, «falsa» é atribuído a essa variável e iniciar () termina sua operação. Este valor não irá mudar
no futuro, é por isso que o seguinte código não é executado. Nesse caso, o programa deve ser
interrompido eo funcionamento do motivo do erro crítico deve ser detectado (se necessário, tratar um
centro deve ser contactado). Depois que a situação seja resolvida, o programa pode ser iniciado, mais
uma vez, ou seja, o EA pode ser anexado a uma janela de segurança.
Contabilidade encomendas

O descrito Expert Advisor permite trabalhar apenas com uma ordem do mercado. A missão dos
despachos de contabilidade bloco (block 4-5) é definir as características de uma forma aberta, se houver
um. No loop passando por ordens »para« todos os existentes no mercado e enquanto se aguarda ordens
são controlados, ou seja, a partir do primeiro (int i = 1) para a última um (i <= OrdersTotal ()). Em cada
iteração do ciclo próximo fim é selecionado através da função OrderSelect (). A seleção é feita a partir
de uma fonte de abertura e de encomendas pendentes (SELECT_BY_POS).

if (OrderSelect (i - 1, SELECT_BY_POS) == true) / / Se houver uma próxima a


Se a seleção for executada com êxito (ou seja, há mais um fim no terminal), ainda este fim e que a
situação deve ser analisada: se a ordem for aberta pela segurança, pelo que a EA opera, quer o fim do
mercado ou está pendente , Também devem ser levados em conta na contagem ordens. Na linha:

if (OrderSymbol ()! = Symb) continue; / / Outro segurança


todas as ordens abertas por mais segurança são eliminados. Operador de "continuar" para parar a
iteração e as características de tal ordem não são processadas. Mas se a ordem está aberta para a
segurança, para a janela da qual a EA vem junto, é ainda analisada.
Se OrderType () retorna valor superior a 1 (veja Tipos de Ofícios), a ordem é selecionado um pendente
um. Mas neste Expert Orientador pendentes gestão de encomendas não é fornecido. Isso significa a
realização de início () deve ser encerrado, uma vez que ocorreu um conflito situação. Em tal caso, após
uma mensagem sobre o funcionamento rescisão iniciar () execução é interrompida pelo operador
"regresso".
Se a última verificação mostrou que o mercado analisados ordem é uma ordem, o número total de
encomendas para uma segurança é calculado e analisado. Pela primeira dessas ordens são definidas
todas as características necessárias. Se na próxima iteração da ordem contador (variável total) encontra
o segundo mercado fim, a situação está também a ser considerado conflito, porque a EA não pode
gerenciar mais de uma ordem no mercado. Em tal caso, iniciar () é interrompido após a execução
mostrando uma mensagem correspondente.
Como resultado da execução da ordem contabilística bloco (caso todos os controlos foram bem
sucedidas), a variável Total preserva o seu valor zero se não existirem no mercado ordens, ou se o valor
1 se existe um mercado para a nossa segurança.Neste último caso, algumas variáveis definidas em
correspondência com o intuito características (número, tipo, a abertura dos preços, níveis e parar de
ordem valor) também podem receber os seus valores.
Calculando os critérios de negociação

In the analyzed example definition of trading criteria (block 5-6) is calculated on the bases of difference
between Moving Averages with different periods of averaging. According to accepted criteria a chart is
bull-directed if the current value of the MA with smaller period is larger than the value of MA with larger
period, and the difference between the values is larger than a certain value. In a bear movement MA
with smaller period is lower than MA with larger period and the difference is also larger than a certain
critical value.
At the block beginning values of MAs with averaging periods Period_MA_1 and Period_MA_2 are
calculated. The fact of significance of any trading criterion is expressed via the value of a corresponding
variable. Variables Opn_B and Opn_S denote the criterion triggering for opening Buy and Sell orders,
variables Cls_В and Cls_S - for closing. For example, if a criterion for opening Buy has not triggered, the
value of Opn_B remains 'false' (set at the variable initialization); if it has triggered, Opn_B gets the value
'true'. In this case the criterion for closing Sell coincides with that for opening Buy, criterion for opening
Sell coincides with that for closing Buy.

Trading criteria accepted in this example are used for educational purpose only and
must not be considered as a guideline when trading on a real account.

Closing Orders

It was written earlier that this Expert Advisor is intended for operation only with one market order
opened for a security, to which window the EA is attached. To the moment when control in the program
is passed to the order closing block it is known for sure that at the current moment there are either no
orders for the security, or there is only one market order. That's why the code in orders closing block is
written so that only one order can be closed successfully.
This block is based on the infinite loop 'while', the body of which consists of two analogous parts: one
for closing a Buy order, another for closing a Sell order. 'While' is used here for the purpose that in case
of a trade operation failure it could be repeated once again.
In the header of the first operator 'if' condition for closing a Buy order is calculated (Sell orders are
closed in the analogous way). If the type of an earlier opened order corresponds to Buy (see Types of
Trades ) and the sign for closing Buy is relevant, control is passed to the body of 'if' operator where a
request to close is formed. As an order closing price in the function OrderClose() the value of a two-
sided quote corresponding to the order type is indicated (see Requirements and Limitations in Making
Trades). If a trade operation is executed successfully, after a message about the order closing is shown
the current 'while' iteration is stopped and the execution of the order closing block is over. But if the
operation fails, the user-defined function for processing errors Fun_Error() is called (block 10-11).
Processing Errors

As a passed parameter in Fun_Error() the last error code calculated by GetLastError() is used. Depending
on the error code Fun_Error() returns 1 if the error is not critical and the operation can be repeated, and
0 if the error is critical. Critical errors are divided into two types - those, after which a program execution
can be continued (for example, a common error) and those, after which execution of any trade
operations must be stopped (for example, blocked account).
if after an unsuccessful trade operation the user-defined function returns 1, the current 'while' iteration is
terminated and during the next iteration another attempt is made to execute the operation - to close the
order. If the function returns 0, the current start() execution is stopped. On the next tick start() will be
started by the client terminal again and if еору conditions for order closing are preserved, another
attempt to close the order will be made.
If during error processing it is found out that further program execution is senseless (for example the
program operates on an old client terminal version) during the next start the execution of the special
function start() will be terminated in the block of preliminary processing when analyzing the value of the
variable Work.
Calculating Amount of Lots for New Orders

Amount of lots can be calculated in accordance with a user's settings following one of the two variants.
The first variant is a certain constant value set up by a user. According to the second variant the amount
of lots is calculated on the basis of a sum equal to a certain percentage (set by a user) of a free margin.
At the beginning of the block of defining the amount of lots for new orders (block 7-8) necessary values
of some variables are calculated - minimal allowed amount of lots and step of lot change set up by a
broker, free margin and price of one lot for the security.
In this example the following is provided. If a user has set up a certain non-zero value of the external
variable Lts, for example 0.5, it is accepted as the amount of lots Lts when a trade request to open an
order is formed. If 0 is assigned to Lts, the number of lots Lts is defined on the basis of the variable
Prots (percentage), free margin and conditions set up by a broker.
After Lts is calculated, a check is conducted. If this value is lower than the minimal allowed value, the
minimal allowed value is accepted. but if free margin is not enough, after a corresponding message the
start() execution is terminated.
Opening Orders

The block of opening orders (block 8-9) like the bloke of opening orders is an infinite loop 'while'. In the
header of the first operator 'if' conditions for opening a Buy order are calculated: if there are no orders
for the security (variable Total is equal to 0) and the sign for opening a Buy order is relevant (Opn_B is
true ), control is passed to 'if' operator body for opening an order. In such a case after rates are
refreshed prices for stop levels are calculated.
Values of stop levels are initially set by a user in external variables StopLoss and TakeProfit. In a general
case a user can set values for this parameters smaller that a broker allows. Besides a broker may change
the minimal allowed distance at any moment (it is an often case at strong market movements, for
example, before important news release). That's why before each order opening stop levels must be
calculate taking into account values set bu a user and the minimal allowed value set up by a broker.
For calculating stop levels the user-defined function New_Stop() is used; as a passed parameter the stop
level value set by a user is used. In New_Stop() first the current minimal allowed distance is calculated.
If the value set by a user corresponds to a broker's requirements, this value is returned. If it is smaller
than the allowed value, the value allowed by a broker is used. Prices of stop requests are calculated
from the corresponding two-sided quote (see Requirements and Limitations in Making Trades ).
A trade request to open an order is formed using the function OrderSend(). For the calculation of order
opening price and prices of stop requests the two-sided quote values corresponding to the order type
are used. If a trade operation was successful (ie a server returned the number of an opened order) after
a message about a successful order opening is shown. start() execution is finished. If an order was not
opened and the client terminal returned an error, the error is processed according to the algorithm
described earlier.
Some Code Peculiarities

The analyzed Expert Advisor code is oriented to the implementation of a certain strategy. Note, some
program lines contain variables and calculations that would be changed, if the strategy were changed.
For example, according to the accepted strategy the Expert Advisor is developed to work only with one
order. This allowed to use the variable Ticket both for the identification of a closing order number (in
block of closing 6-7) and for the identification of a success of a trade operation execution when opening
an order (in the block of opening 8-9). In this case such a solution is acceptable. However, if we take the
analyzed code as the basis for the implementation of another strategy (for example allow opposite
orders) we will have to introduce one or several variables to be able to recognize numbers of opened
orders and identify the success of trade operations.
In further strategy modifications we will have to change come program lines containing part of logics
contained in the source strategy. Namely in the order accounting block we will not have to terminate the
program operation if there are several open orders for a security. Besides, conditions for opening and
closing orders will alslo change. This will entail the code changing in blocks of opening and closing
orders.
On the basis of this analysis we can easily conclude that the described simple Expert Advisor is not
perfect. In a general case, for the implementation of order accounting one should use a universal
function based on using data arrays and not containing logics of a certain strategy. The same can be
said about the blocks of opening and closing orders. A more complete program must contain a main
analytical function, all other user-defined functions must be subordinate to it. This analytical function
must contain a program code, in which all conditions for the implementation of any strategy are
analyzed; all subordinate functions must perform limited actions. The function of accounting orders must
only account orders, functions of opening and closing orders must only open and close orders, and the
analytical function must "think" and manage all other functions, ie call them when needed.
Criação de indicadores personalizados

Ao criar uma estratégia comercial enfrenta um desenvolvedor muitas vezes a necessidade de chamar a
graficamente em uma janela uma certa dependência de segurança calculados por um usuário
(programador). Para este efeito MQL4 oferece a possibilidade de criação de indicadores personalizados.
Indicador personalizado é codificada em um programa aplicativo MQL4; é basicamente destinados à
exibição gráfica das dependências calculadas preliminarmente.

Custom indicador estrutura

Necessidade de Buffers

O principal princípio subjacente personalizado indicadores é passar valores de arrays indicador para um
cliente terminal (indicador linhas de saque), através de troca de amortecedores.
Tampão é uma área de memória contendo valores numéricos de um indicador array.
MQL4 norma implica a possibilidade de elaborar a oito linhas usando um indicador indicador
personalizado. Um indicador array e um tampão são postos em correspondência com cada indicador
linha. Cada um tem o seu próprio índice tampão. O índice do primeiro tampão é 0, o segundo de uma -
1, e assim por diante, o último tem um dos índices 7. Fig. 115 mostra como as informações
personalizadas a partir de um indicador é passada através de buffers para um cliente terminal de saque
indicador linhas.

Fig. 115. Passando valores do indicador através Arrays um buffer de um cliente de terminal.

A ordem geral de construção de linhas indicador é o seguinte:


1. Os cálculos são realizados em um indicador personalizados; como resultado valores numéricos são
atribuídos a elementos indicador array.
2. Valores do indicador é panóplia enviou elementos para um cliente via terminal buffers.
3. Sobre as bases do valor recebido a partir de matrizes de buffers um cliente terminal indicador exibe
linhas.

Componentes de uma Custom Indicador

Vamos analisar um simples costume indicador que mostra duas linhas - é construir uma linha baseada
na barra de preços máximos, a segunda utiliza um preço mínimo.

Exemplo de um simples costume indicador userindicator.mq4

//------------------------------------------------ --------------------
/ / Userindicator.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------------
# propriedade indicator_chart_window / / Indicador é desenhada na janela
principal
# propriedade indicator_buffers 2 / / Número de buffers
# propriedade indicator_color1 Azul / / Cor da 1 ª linha
# propriedade indicator_color2 Vermelho / / Cor da 2 ª linha
dupla Buf_0 [], Buf_1 []; / / Declarar arrays (para o indicador buffers)
//------------------------------------------------ --------------------
int init () / / Especial função init ()
(
SetIndexBuffer (0, Buf_0); / / Atribuir um array para um buffer
SetIndexStyle (0, DRAW_LINE, STYLE_SOLID, 2); / / Linha de estilo
SetIndexBuffer (1, Buf_1); / / Atribuir um array para um buffer
SetIndexStyle (1, DRAW_LINE, STYLE_DOT, 1); / / Linha de estilo
retorno; / / Saída do especiais Funct. init ()
)
//------------------------------------------------ --------------------
int start () / / Especial função start ()
(
int i, / / Bar índice
Counted_bars; / / Número de bares contados
//------------------------------------------------ --------------------
Counted_bars = IndicatorCounted (); / / Número de bares contados
i = Barras - Counted_bars - 1; / / Índice da primeira inúmero
while (i> = 0) / / Loop para bares inúmero
(
Buf_0 [i] = Máximo [i]; / / Valor de 0 tampão sobre i bar
Buf_1 [i] = Mínimo [i]; / / Valor do buffer em 1a i bar
i -; / / Calcular o índice do próximo bar
)
//------------------------------------------------ --------------------
retorno; / / Saída do especiais Funct. start ()
)
//------------------------------------------------ --------------------
Vamos analisar em detalhes o indicador partes. Em qualquer programa aplicativo escrito em MQL4 você
pode indicar parâmetros que fornecem o programa correto de serviço por um cliente de terminal. Neste
exemplo, o programa parte cabeça (ver Estrutura de Programas), contém várias linhas com as diretrizes
# imóvel.
A primeira directiva indica em qual janela do terminal o cliente deve chamar o indicador linhas:

# propriedade indicator_chart_window / / Indicador é desenhada na janela


principal
Em MQL4 existem duas variantes do desenho indicador linhas: na janela principal de segurança e em
uma janela separada.Janela principal, é a janela contendo um gráfico de segurança. Neste exemplo
parâmetro indicator_chart_window # imóvel no diretório indica que um cliente terminal deverá chamar
indicador linhas na janela principal.
A próxima linha mostra o número de buffers usados no indicador:

# propriedade indicator_buffers 2 / / Número de buffers


No exemplo analisadas duas linhas são traçadas indicador. Um buffer é atribuído a cada um tampão, de
modo que o número total de buffers é dois.
As próximas linhas descrevem as cores das linhas indicadoras.

# propriedade indicator_color1 Azul / / Cor da 1 ª linha


# propriedade indicator_color2 Vermelho / / Cor da 2 ª linha
Indicator_color1 e definir parâmetros indicator_color2 configuração de cores correspondentes buffers -
neste caso, para buffers com índices 0 (Azul) e 1 (Red). Note que os números nos nomes parâmetro
indicator_color1 e indicator_color2 índices não são tampão. Estes números são nomes constantes das
peças que são estabelecidos de acordo com tampões. Constante para cada cor pode ser definido
segundo o critério de um usuário.
Na próxima linha indicador arrays são declarados:

dupla Buf_0 [], Buf_1 []; / / Declarar arrays (para o indicador buffers)
O indicador é destinado ao desenho indicador duas linhas, pelo que temos de declarar um dois-dimensão
global arrays, um para cada linha. Nomes do indicador são matrizes até ao utilizador. Neste caso array
nomes Buf_0 [] e Buf_1 [] são utilizadas, em outros casos, outros nomes podem ser utilizados, por
exemplo, Line_1 [], Alfa [], Integral [], etc É necessário declarar arrays, a nível global, , Porque array
elementos valores devem ser preservados entre chamadas de função especial a iniciar ().
O indicador é construído descrito personalizados com base em duas funções especiais-init () e começar
(). A função init () contém a parte do código utilizado apenas uma vez sobre o programa (ver funções
especiais).
Uma importante ação é realizada na linha:

SetIndexBuffer (0, Buf_0); / / Atribuir um array para um buffer


Utilizando a função SetIndexBuffer () necessário um buffer (neste caso, com o índice 0) é colocado em
correspondência com um array (neste caso Buf_0). Significa o primeiro indicador para a construção de
uma linha terminal cliente irá aceitar os dados contidos no array Buf_0 usando o buffer zero para ele.
Ainda mais o estilo da linha é definida:

SetIndexStyle (0, DRAW_LINE, STYLE_SOLID, 2); / / Linha de estilo


Para o buffer zero (0) um terminal cliente deverá utilizar a seguinte redacção estilos: linha simples
(DRAW_LINE), linha sólida (STYLE_SOLID), largura da linha 2.
As próximas duas linhas contêm definições para a segunda linha:

SetIndexBuffer (1, Buf_1); / / Atribuir um array para um buffer


SetIndexStyle (1, DRAW_LINE, STYLE_DOT, 1); / / Linha de estilo
Assim, de acordo com o código da função especial init () tanto indicador linhas serão traçadas na janela
principal de segurança.O primeiro deles será uma sólida linha azul com a largura 2, o segundo é uma
linha pontilhada vermelha (STYLE_DOT) de um costume largura. Indicador de linhas pode ser feita por
outros estilos tão bem (ver Estilos de Linhas Indicator).
Calcular valores de arrays indicador elementos (estar atento)

Valores do indicador são calculadas as matrizes de elementos especiais em função do início (). Para
entender corretamente o conteúdo de início () prestar atenção ao Código de indexando fim bares. A
seção Arrays descreve em detalhes o método de indexação arrays-timeseries. De acordo com esse
método de indexando bar começa a partir de zero. O bar é um zero atual ainda imaturo bar. O bar mais
próximo do índice é de 1. O próximo é um's 2 e assim por diante.
À medida que novas barras aparecem em uma janela de segurança, índices de já formados (história)
barras são alterados. A nova (actual, apenas formado, direita) recebe o índice zero bar, a uma para a
esquerda dele (que acaba totalmente formada) obtém o índice 1 e os valores dos índices de todos os
bares história também são aumentados em um.
O método de indexação barras descrito é a única possível para todo o sistema de
comércio on-line Metatrader, e é tido em conta ao desenhar linhas usando ambos
os indicadores técnicos e personalizado.

Já se disse que o indicador linhas são construídas com base nas informações contidas no indicador
numérico matrizes. Um indicador array contém informações sobre pontos coordenadas sobre o qual é
um indicador linha traçada. E as coordenadas de cada ponto Y é o valor de um indicador o elemento
matriz, coordenar e X é o valor de um array elemento indicador índice. No exemplo analisado é o
primeiro indicador linha traçada utilizando valores máximos de barras. Fig, 116, esse indicador mostra
linha (de cor azul) em uma janela de segurança, é construído com base no indicador Buf_0 array.

Valor do
Índice valor
elemento
do indicador
indicador array
array Buf_0
Buf_0
0 1,3123
1 1,3124
2 1,3121
3 1,3121
4 1,3123
5 1,3125
6 1,3127
... ...

Fig. 116. A correspondência de coordenadas de um indicador de linha para valores de um indicador


array.
Índice valor de um indicador array está fora por um cliente terminal em correspondência com uma barra
de índice - Índice esses valores são iguais. Deve também ser tido em conta que o processo de
construção de indicador ao longo de linhas em tempo real modo, em condições de segurança quando
estiver em uma nova janela aparecerá barras de vez em quando. História e todos os bares são
deslocadas para a esquerda. Para ter o indicador linha traçada corretamente (cada ponto acima da linha
bar) também deve ser transferida juntamente com grades. Então não há necessidade (necessidade
técnica) para re-indexar um indicador array.
A diferença fundamental de um indicador de um array array usual é a seguinte:

No momento em que é criado um novo bar, valores do índice indicador array


elementos são automaticamente alterado pelo cliente terminal, a saber - o valor de
cada indicador array índice é aumentada de um e do indicador é panóplia tamanho
aumentado em um elemento (com um zero índice).

Por exemplo, o zero bar na fig. 116 (prazo H1), tem o tempo abrindo 6:00. Às 7:00 uma nova barra de
segurança vai aparecer na janela. O bar tem início às 6:00 irá automaticamente obter o índice 1. Para
ter o indicador linha traçada corretamente sobre este bar, o cliente terminal irá alterar o índice do
indicador o elemento matriz correspondente à barra de início às 6:00. Em cima da mesa na fig. 116 este
elemento está escrito na primeira linha. Juntamente com que todos os índices do array elementos serão
aumentadas pelo cliente por um terminal. Um índice do elemento do array correspondente ao bar aberto
em 6:00 vai ter o valor 1 (antes que ele era igual a 0). O indicador array tornar-se-á por um elemento
maior. O índice de um novo elemento adicionado será igual a 0, o valor deste elemento será um novo
valor de coordenar o indicador que reflecte sobre uma linha zero bar. Este valor é calculado em função
especial a iniciar () sobre cada um carrapato.
Cálculos em especial a função start () deve ser conduzida de modo a que não foram realizadas ações
extras. Antes de o indicador acompanha a uma tabela, não refletir qualquer indicador linhas (valores do
indicador, porque são matrizes ainda não foram definidos). É por isso que, no início da primeira especial
função start () array indicador valores devem ser calculados para todos os bares, sobre o qual o
indicador linha deve ser traçada. No exemplo estas são analisadas todas as faixas presentes em um
gráfico (os primeiros cálculos não possa ser realizado por todas as barras disponíveis, mas para alguns
última parte da história, e é descrito em outros exemplos). Ar começa tudo ainda mais especiais da
função start () não há necessidade de calcular valores do indicador array para todos os bares
novamente. Estes valores são calculados e já estão contidos no indicador array. É necessário calcular o
valor atual do indicador em cada nova linha só carrapato do zero bar.
Para a implementação da tecnologia descrita há um padrão muito útil na função MQL4 -
IndicatorCounted ().
Função IndicatorCounted ()
int IndicatorCounted ()
Esta função retorna o número de bares que não foram alterados desde a última chamada indicador.
Se o indicador nunca foi anexado a um gráfico, a primeira no início () o valor da execução Counted_bars
será igual a zero:

Counted_bars = IndicatorCounted (); / / Número de bares contados


Isso significa que o indicador array não contém nenhum elemento com valor previamente definidas
anteriormente, é por isso que toda a panóplia indicador deve ser calculado do início ao fim. O indicador é
calculado a partir da matriz mais antiga barra de zero a um. Índice da barra mais antigos, a partir de
cálculos que devem ser iniciadas, é calculado da seguinte maneira:

i = Barras - Counted_bars - 1; / / Índice da primeira inúmero


Suponhamos, no momento da colocação do indicador, existem 300 bares em uma janela do gráfico. Este
é o valor da variável Bares predefinidos. Tal como definido anteriormente, Counted_bars é igual a
0. Então, como vamos obter um resultado que i índice da primeira inúmero bar (o mais recente, a partir
de cálculos que devem ser conduzidas) é igual a 299.
Todos os valores do indicador array elementos são calculados de acordo com o loop enquanto ():

while (i> = 0) / / Loop para bares inúmero


(
Buf_0 [i] = Máximo [i]; / / Valor de 0 tampão sobre i bar
Buf_1 [i] = Mínimo [i]; / / Valor do buffer em 1a i bar
i -; / / Calcular o índice do próximo bar
)
Embora eu esteja dentro do intervalo da primeira inúmero bar (299) para o curso uma (0), inclusive,
valores do indicador array elementos são calculados para ambos os indicadores linhas. Note, faltando
valores do indicador array elementos são calculados durante um (o primeiro) começará a função especial
de arranque (). Durante os cálculos cliente terminal memoriza elementos, para o qual os valores foram
calculados. A última iteração, enquanto em () é executada quando i é igual a 0, ou seja, valores do
indicador arrays são calculados para a barra de zero. Quando o circuito está terminado, a função
especial iniciar () termina sua execução e controlo é passado para o cliente de terminal. O cliente
terminal, por seu turno, irá chamar todos (neste caso duas) linhas indicadoras de acordo com os valores
calculados elementos do array.
No início do próximo carrapato () será iniciada pelo cliente terminal novo. Outras ações dependem da
situação (vamos continuar analisando o exemplo para 300 barras).
Variante 1. Um novo carrapato vem durante a formação do atual zero bar (a situação mais comum).

Fig. 117. O carrapato transformados pertence ao atual bar.

Fig. 117 mostra dois carrapatos recebido pelo terminal em instantes de tempo t 1 e t 2. A situação será
analisada a mesma para ambos os carrapatos. Vamos rastrear a execução de iniciar () que foi lançado
no instante t 2. Durante a execução da função start () a linha seguinte será executado:

Counted_bars = IndicatorCounted (); / / número de bares contados


IndicatorCounted () irá retornar o valor 299, ou seja, desde o último arranque () chamada 299 bares
anteriores não foram alterados. Como resultado i índice valor será igual a 0 (300-299-1):

i = Barras - Counted_bars - 1; / / Índice da primeira inúmero


Significa, no próximo enquanto () loop os valores da matriz com elementos do índice zero será
calculado. Em outras palavras, a nova posição de um indicador sobre a linha zero bar será
calculado. Quando o ciclo estiver concluído, inicie () vai parar de executar e vai passar o controle para o
terminal do cliente.
Variante 2. Um novo carrapato carrapato é o primeiro de uma barra de zero (acontece de vez em
quando).

Fig. 118. O carrapato é processada a primeira de uma nova carrapato zero bar.
Neste caso, o fato do aparecimento de uma nova barra é importante. Antes de controlo é passado para
a função especial start (), atendimento ao terminal irá chamar novamente todos os bares presentes na
janela de segurança e de re-indexar todos os arrays declarados indicador (fixado em correspondência
com tampões). Além disso, cliente terminal vai lembrar que já há 301 bares, e não 300 em uma janela
do gráfico.
Fig. 118 contém situação quando, no último carrapato da barra anterior (no momento t 2) a função start
() foi iniciado e executado com sucesso. É por isso que, apesar de agora o primeiro bar (com índice 1)
terminou no momento t 2 foi calculada pelo indicador, função IndicatorCounted () irá retornar valor
que estava no bar anterior, ou seja, 299:

Counted_bars = IndicatorCounted (); / / Número de bares contados


Na próxima linha i índice será calculado, neste caso para a assinale o primeiro de uma nova barra será
igual a 1 (301-299-1):

i = Barras - Counted_bars - 1; / / Índice da primeira inúmero


Significa cálculo do indicador, enquanto os valores em array () laço na aparição de um novo bar vai ser
realizada tanto para o último bar e zero para o novo bar. Um pouco mais cedo durante a re-indexação
de matrizes indicador aumentou o cliente terminal tamanhos destes arranjos. Valores da matriz com
elementos zero índices não foram definidos antes dos cálculos no loop. Durante os cálculos em loop
estes elementos buscar alguns valores. Quando começar em cálculos () estão a cargo, o controlo é
devolvido ao cliente terminal. Depois que o cliente o terminal irá emitir sobre as linhas indicador zero bar
com base em valores calculados apenas elementos da matriz com índices zero.
Variante 3. Um novo carrapato carrapato é o primeiro de uma nova barra de zero, mas o último, mas
não é um carrapato processados (caso raro).

Fig. 119. Nem todos os carrapatos do antigo bar foram processados.

Fig. 119 mostra a situação quando iniciar () foi lançado no primeiro de uma nova barra de carrapato, no
momento t 5. Anterior tempo esta função foi iniciada no instante t 2. Assinalar que entraram no
terminal, no momento t 3 (seta vermelha) não foi processada pelo indicador. Isto aconteceu porque
start () tempo de execução t 2 - t 4, é maior do que o intervalo entre as carraças t 2 - t 3. Este facto
será detectado pelo cliente terminal durante a execução do início () lançou, no momento t 5.Durante os
cálculos em linha:

Counted_bars = IndicatorCounted (); / / Número de bares contados


IndicatorCounted () irá retornar o valor 299 (!). Este valor é verdadeiro - a partir do momento da última
chamada indicador 299 bares não foram alteradas depois (agora já) 301. É por isso que o índice
calculado da primeira (esquerda) bar, a partir de cálculos que o elemento matriz de valores deverá ser
iniciado, será igual a 1 (301-299-1):

i = Barras - Counted_bars - 1; / / Índice da primeira inúmero


isso significa que durante o tempo () execução serão realizadas duas iterações. Durante os primeiros
valores de um array elementos com o índice i = 1 será calculado, ou seja, Buf_0 [1] e Buf_1 [1]. Não,
até o momento cálculos começar, bares e matrizes indicador já estão re-indexado pelo cliente terminal
(porque começou uma nova barra, começa entre a função especial de arranque ()). Eis a razão por
cálculos de elementos de arrays com índice 1 será calculado com base na matriz-timeseries (valores
máximos e mínimos de uma barra de preço), também com o índice 1:

while (i> = 0) / / Loop para bares inúmero


(
Buf_0 [i] = Máximo [i]; / / Valor de 0 tampão sobre i bar
Buf_1 [i] = Mínimo [i]; / / Valor do buffer em 1a i bar
i -; / / Calcular o índice do próximo bar
)
Durante a segunda iteração de tempo () valores de elementos com índices zero, ou seja zero para o bar,
é calculado com base nos últimos valores conhecidos de matrizes-timeseries.

Usando da tecnologia descritas para o cálculo dos indicadores personalizado


permite, em primeiro lugar, para garantir cálculo dos valores de todos os elementos
indicador array independentemente da natureza específica do carrapato história, ea
segunda, para realizar cálculos apenas para inúmero bares, ou seja, a utilização
economicamente cálculo dos recursos .

Não, um bar é considerado incalculável se cálculo de valores de um elemento indicador matrizes, pelo
menos, para uma última carrapato do bar não é realizada.
Iniciando o costume indicador userindicator.mq4 em um gráfico janela você vai ver duas linhas - uma
espessa linha azul construídos sobre uma barra de máximos e pontilhada linha vermelha construída em
cima de seu mínimos (Fig. 120).

Fig. 120. Duas linhas indicador em uma janela de segurança, construído pelo
indicador userindicator.mq4.
Note-se, que um possível indicador construído um costume, indicador de linhas que coincidirá com as
linhas análogas de um indicador técnico. Ela pode ser feito facilmente se como fórmulas de cálculo do
indicador costume, as mesmas fórmulas, como no indicador são utilizadas técnicas. Para ilustrar isto
vamos aperfeiçoar o programa código analisados no exemplo anterior.Deixe o indicador desenhar linhas
após a média dos valores máximos e mínimos das últimas vários bares. É fácil de realizar cálculos
necessários: precisamos simplesmente de encontrar valores médios de arrays-timeseries elementos. Por
exemplo, o valor de um indicador array com o índice 3 (ou seja, indicador linha para coordenar o
terceiro bar) com base nos últimos cinco máximas é calculado da seguinte forma:
Buf_0 [3] = (High [3] + Alto [4] + Alto [5] + Alto [6] + Alto [7]) / 5
Análoga cálculos podem ser realizados por um indicador linhas construídos sobre tarifas mínimas.

Exemplo de um simples costume indicador averagevalue.mq4. Indicador linhas são


construídos sobre média dos valores mínimos e máximos N bares.

//------------------------------------------------ --------------------
/ / Averagevalue.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------------
# propriedade indicator_chart_window / / Indicador é desenhada na janela
principal
# propriedade indicator_buffers 2 / / Número de buffers
# propriedade indicator_color1 Azul / / Cor da 1 ª linha
# propriedade indicator_color2 Vermelho / / Cor da 2 ª linha
extern int Aver_Bars = 5; / / número de barras para o cálculo

dupla Buf_0 [], Buf_1 []; / / Declarar indicador arrays


//------------------------------------------------ --------------------
int init () / / Especial função init ()
(
//------------------------------------------------ --------------------
SetIndexBuffer (0, Buf_0); / / Atribuir um array para um buffer
SetIndexStyle (0, DRAW_LINE, STYLE_SOLID, 2); / / Linha de estilo
//------------------------------------------------ --------------------
SetIndexBuffer (1, Buf_1); / / Atribuir um array para um buffer
SetIndexStyle (1, DRAW_LINE, STYLE_DOT, 1); / / Linha de estilo
//------------------------------------------------ --------------------
retorno; / / Saída do especiais funct.init ()
)
//------------------------------------------------ --------------------
int start () / / Especial função start ()
(
int i, / / Bar índice
n, / / parâmetro formal
Counted_bars; / / Número de bares contados
dupla
Sum_H, / / Soma dos valores de Alta período
Sum_L; / / Soma dos valores de Baixo período
//------------------------------------------------ --------------------
Counted_bars = IndicatorCounted (); / / Número de bares contados
i = Barras - Counted_bars - 1; / / Índice da primeira inúmero
while (i> = 0) / / Loop para bares inúmero
(
Sum_H = 0; / / Nulling início em loop
Sum_L = 0; / / Nulling início em loop
for (i = n, n <= i + Aver_Bars - 1; n + +) / / Loop soma dos valores
(
Sum_H = Sum_H + Alto [n]; / / Acumulação de valores máximos soma
Sum_L = Sum_L + Mínimo [n]; / / Acumulação de valores mínimos soma
)
Buf_0 [i] = Sum_H / Aver_Bars; / / Valor de 0 tampão sobre i bar
Buf_1 [p] = Sum_L / Aver_Bars; / / Valor do buffer em 1a i bar

i -; / / Calcular o índice do próximo bar


)
//------------------------------------------------ --------------------
retorno; / / Saída do especiais Funct. start ()
)
//------------------------------------------------ --------------------
Nesse exemplo, há uma variável externa Aver_Bars. Usando esta variável um usuário pode indicar o
número de bares, para os quais é calculado um valor médio. No início (), este valor é utilizado para o
cálculo de um valor médio. No loop 'para' a soma dos valores máximos e mínimos é calculado para o
número de barras correspondente ao valor da variável Aver_Bars. Nas próximas duas linhas programa
valores do indicador array elementos são calculados para o indicador linhas correspondentes aos valores
mínimos e máximos.
A média método utilizado neste caso, também é aplicada para cálculo do indicador os técnicos Média
móvel. Se nós atribuímos o indicador analisado personalizado averagevalue.mq4 e os técnica indicador
Média móvel, veremos três linhas indicador. Se o mesmo período de média é criada para ambos os
indicadores, Média móvel irá coincidir com uma linha de o indicador costume linhas (para esta finalidade
parâmetros descritos na fig. 121 deve ser especificado no indicador ajustes técnicos).

Fig. 121. Coincidente linhas de um indicador técnico personalizado e um indicador (linha vermelha).
Assim, utilizando uma técnica indicador utilizador pode construir o reflexo de qualquer regularidades
necessárias no trabalho prático.
Custom indicador opções
Desenho indicador linhas em janelas separadas

MQL4 oferece um grande serviço personalizado para a construção de indicadores que torna muito
conveniente que os utilizam.Em particular, linhas indicador pode ser sacado em uma janela
separada. Isto é conveniente quando os valores absolutos da amplitude linha indicador é
substancialmente menor (ou maior) do que os preços de segurança. Por exemplo, se estamos
interessados na diferença média entre os valores máximos e mínimos de barras em um certo intervalo
histórico, dependendo do calendário, este valor será igual a cerca de 0 a 50 pontos (por exemplo, para a
M15). Não é difícil construir um indicador linha, mas em uma janela de segurança nesta linha será
sorteado no intervalo de 0 a 50 pontos de um preço de segurança, ou seja substancialmente mais baixo
do que o gráfico área refletido na tela. É muito incómodo.
Para desenhar linhas indicador em uma janela separada (que está na parte inferior de uma janela de
segurança), no texto da directiva # propriedade (no início do programa) indicator_separate_window
parâmetro deve ser especificado:

# propriedade indicator_separate_window / / Indicador é desenhado em uma


janela separada
No momento em que tal indicador está anexado a uma janela de segurança, atendimento ao terminal
cria uma janela separada um gráfico abaixo, no qual indicador calculado nas linhas do indicador será
sorteado. Dependendo das definições de cores e tipos de linhas indicador que será sorteado neste ou
naquele estilo.
Limitando cálculo história

Na maioria dos casos indicador linhas contêm informações úteis apenas na história mais recente. O
indicador parte de linhas construídos sobre antigos bares (por exemplo, 1 mês de idade calendário
minutos) dificilmente pode ser considerado útil para a tomada decisões comerciais. Além disso, se
houver um grande número de bares em uma janela do gráfico, altura investida para o cálculo e desenho
de linhas indicador é exageradamente grande. Este programa pode ser crítica na depuração, quando um
programa é compilado com frequência e, em seguida, começou. Por isso é necessário realizar cálculos
não para toda a história, mas para a parte limitada da história mais recente bar.
Para o efeito, uma variável externa história é utilizada no programa seguinte. Valor dessa variável é tida
em conta no cálculo do índice da primeira (esquerda) bar, a partir das quais os elementos de arrays
indicador deve ser calculado.

i = Barras - Counted_bars - 1; / / Índice da primeira inúmero


if (i> História - 1) / / Se houver muitos bares ...
i = História - 1; / / .. calcular a quantia especificada.
Enquanto os cálculos adicionais em () ciclo será conduzida para a história recente do número de bares
valor não superior a História. Note, analisaram a forma de conter uma história cálculo diz respeito
apenas a parte dos cálculos que são realizados no início da primeira especial função start (). Além disso,
quando aparecem novos bares, novas peças de linhas indicador será adicionado, na parte direita,
enquanto a imagem no lado esquerdo será preservado. Assim, o indicador linha duração será aumentada
durante todo o tempo indicador operação. Valor comum da História parâmetro é considerado
aproximadamente 5000 barras.
Exemplo de um simples costume indicador separatewindow.mq4. Indicador linhas
são desenhadas em uma janela separada.

//------------------------------------------------ --------------------
/ / Separatewindow.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------------
# propriedade indicator_separate_window / / Desenho em uma janela separada
# propriedade indicator_buffers 1 / / Número de buffers
# propriedade indicator_color1 Azul / / Cor da 1 ª linha
# propriedade indicator_color2 Vermelho / / Cor da 2 ª linha
extern int História = 50; / / Quantidade de bares no cálculo história
extern int Aver_Bars = 5; / / Quantidade de barras para o cálculo
dupla Buf_0 []; / / Declarar um indicador array
//------------------------------------------------ --------------------
int init () / / Especial função init ()
(
SetIndexBuffer (0, Buf_0); / / Atribuir um array para um buffer
SetIndexStyle (0, DRAW_LINE, STYLE_SOLID, 2); / / estilo da linha
retorno; / / Saída do especiais Funct. init ()
)
//------------------------------------------------ --------------------
int start () / / Especial função start ()
(
int i, / / Bar índice
n, / / parâmetro formal
Counted_bars; / / Número de bares contados
dupla
Sum_H, / / Sim Máximo de valores para o período
Sum_L; / / Soma dos baixos valores de período
//------------------------------------------------ --------------------
Counted_bars = IndicatorCounted (); / / Número de bares contados
i = Barras - Counted_bars - 1; / / Índice da primeira inúmero
if (i> História - 1) / / Se muitos bares ..
i = História - 1; / / .. para calcular montante específico.
while (i> = 0) / / Loop para bares inúmero
(
Sum_H = 0; / / Nulling início em loop
Sum_L = 0; / / Nulling início em loop
for (i = n, n <= i + Aver_Bars - 1; n + +) / / Loop soma dos valores
(
Sum_H = Sum_H + Alto [n]; / / Acumulação de valores máximos soma
Sum_L = Sum_L + Mínimo [n]; / / Acumulação de valores mínimos soma
)
Buf_0 [i] = (Sum_H - Sum_L) / Aver_Bars; / / Valor de 0 tampão sobre i
bar
i -; / / Calcular o índice do próximo bar
)
//------------------------------------------------ --------------------
retorno; / / Saída do especiais Funct. start ()
)
//------------------------------------------------ --------------------
Similar cálculo de um indicador linha é realizado no indicador técnico AverageTrue Gama. Fig. 122
indicador mostra uma linha construída pelo costume indicador separatewindow.mq4 em uma janela
separada e um indicador reta construída pela ATR em outra janela. Neste caso são linhas totalmente
idênticas, porque período de média é a mesma para ambos os indicadores - 5. Se esse parâmetro for
alterada em nenhum dos indicadores, o indicador correspondente linha também será alterado.

Fig. 122. desenhar uma linha personalizada indicador em uma janela separada.
Linhas idênticas de um indicador técnico (ATR) e um indicador personalizado (separatewindow.mq4).

É também evidente que o costume indicador linha não é construída para toda a largura, mas há 50
últimas barras, conforme especificado nos exterior variável Histórico. Se um comerciante é obrigado a
utilizar maior história de intervalo, o valor da variável externa pode ser facilmente alterada através do
indicador configurações personalizadas janela.
Fig. 123 mostra uma janela de segurança, em que o indicador nós linha traçada em outro estilo - como
um histograma. Para obter tal resultado foi mudado em uma linha do programa
código separatewindow.mq4 - outros estilos linha são indicados:

SetIndexStyle (0, DRAW_HISTOGRAM); / / Linha de estilo


Todas as outras partes código mantêm-se inalterados.
Fig. 123. Desenho personalizado indicador linha em uma janela separada (histograma).
Semelhança dos desenhos de um indicador técnico (ATR) e um indicador
personalizado (separatewindow.mq4).

Shifting indicador linhas vertical e horizontalmente

Em alguns casos é necessário deslocar um indicador linha. It can be easily done by MQL4 means. Let's
analyze an example, in which position of indicator lines in a security window are calculated in accordance
with values specified by a user.

Example of a custom indicator displacement.mq4 . Shifting indicator lines


horizontally and vertically.

//--------------------------------------------------------------------
// displacement.mq4
// The code should be used for educational purpose only.
//--------------------------------------------------------------------
#property indicator_chart_window //Indicator is drawn in the main window
#property indicator_buffers 3 // Number of buffers
#property indicator_color1 Red // Color of the 1st line
#property indicator_color2 Blue // Color of the 2nd line
#property indicator_color3 Green // Color of the 3rd line

extern int History = 500 ; // Amount of bars in calculation history


extern int Aver_Bars = 5 ; // Amount of bars for calculation
extern int Left_Right = 5 ; // Horizontal shift (bars)
extern int Up_Down = 25 ; // Vertical shift (points)

double Line_0 [] , Line_1 [] , Line_2 [] ; // Declaring data arrays


//--------------------------------------------------------------------
int init () // Special funct. init()
{
//--------------------------------------------------------------------
SetIndexBuffer ( 0 , Line_0 ) ; // Assigning an array to buffer 0
SetIndexStyle ( 0 , DRAW_LINE , STYLE_SOLID , 2 ) ; // Line style
//--------------------------------------------------------------------
SetIndexBuffer ( 1 , Line_1 ) ; // Assigning an array to buffer 1
SetIndexStyle ( 1 , DRAW_LINE , STYLE_DOT , 1 ) ; // Line style
//--------------------------------------------------------------------
SetIndexBuffer ( 2 , Line_2 ) ; // Assigning an array to buffer 2
SetIndexStyle ( 2 , DRAW_LINE , STYLE_DOT , 1 ) ; // Line style
//--------------------------------------------------------------------
return ; // Exit the special funct. init()
)
//--------------------------------------------------------------------
int start () // Special function start()
{
int i , // Bar index
n , // Formal parameter (index)
k , // Index of indicator array element
Counted_bars ; // Number of counted bars
double
Sum ; // High and Low sum for the period
//--------------------------------------------------------------------
Counted_bars = IndicatorCounted () ; // Number of counted bars
i = Bars - Counted_bars - 1 ; // Index of the 1st uncounted
if ( i > History - 1 ) // If too many bars ..
i = History - 1 ; // .. calculate for specified amount .

while ( i >= 0 ) // Loop for uncounted bars


{
Sum = 0 ; // Nulling at loop beginning
for ( n = i ; n <= i + Aver_Bars - 1 ; n ++ ) // Loop of summing values
Sum = Sum + High [ n ] + Low [ n ] ; // Accumulating maximal values sum
k = i + Left_Right ; // Obtaining calculation index
Line_0 [ k ] = Sum / 2 / Aver_Bars ; // Value of 0 buffer on k bar
Line_1 [ k ] = Line_0 [ k ] + Up_Down * Point ; // Value of the 1st buffer
Line_2 [ k ] = Line_0 [ k ] - Up_Down * Point ; // Value of the 2nd buffer

i --; // Calculating index of the next bar


)
//--------------------------------------------------------------------
return ; // Exit the special funct. start()
)
//--------------------------------------------------------------------
For adjusting lines shift in a chart, there are two external variables - Left_Right for horizontal shift of all
lines and Up_Down for shifting two dotted lines vertically.

extern int Left_Right = 5 ; // Horizontal shift (bars)


extern int Up_Down = 25 ; // Vertical shift (points)
The algorithm used for calculating values of corresponding array elements is based on very simple rules:

§ for shifting a line horizontally, assign the calculated value to an array element, the index of which
is larger by Left_Right (for shifting to the right and less for shifting to the right) than the index of
a bar, for which calculations are conducted;
§ for shifting a line vertically, Up_Down*Point must be added (for shifting upwards or detracted for
shifting downwards) to each value of an indicator array characterizing initial line position;

In the analyzed example indexes are calculated in the line:

k = i + Left_Right ; // Obtaining calculation index


Here i is the index of a bar, for which calculations are performed, k is an index of an indicator array
element. Red indicator line displayed by the client terminal based on the indicator array Line_0[] is
shifted to the left by 5 bars (according to custom settings, see Fig. 124) from the initial line. In this case
the initial line is a Moving Average with the period of averaging equal to 5; the formula of MA calculation
is (High[i]+Low[i])/2 .

Line_0 [ k ] = Sum 2 Aver_Bars ; // Value of 0 buffer on k bar


In this example the position of the red line is the basis for the calculation of indicator array values for
two other lines, ie their position on the chart. Dotted lines are calculated this way:

Line_1 [ k ] = Line_0 [ k ] + Up_Down * Point ; // Value of the 1st buffer


Line_2 [ k ] = Line_0 [ k ] - Up_Down * Point ; // Value of the 2nd buffer
Use of index k for elements of all indicator arrays allows to perform calculations for elements of arrays
Line_1[], Line_2[] on the same bar as used for calculating values of the corresponding basic array
Line_0[]. As a result dotted lines are shifted relative to the red line by the value specified in the indicator
settings window, in this case by 30 points (Fig. 124).
Fig. 124. Red indicator line is shifted to the left by 5 bars.
Dotted indicator lines are shifted relative to the red line by 30 points.
Limitations of Custom Indicators

There are some limitations in MQL4 that should be taken into account in the programming of custom
indicators.
There is a group of functions that can be used only in custom indicators and cannot be used in Expert
Advisors and scripts: IndicatorBuffers(), IndicatorCounted (), IndicatorDigits(), IndicatorShortName(),
SetIndexArrow(), SetIndexBuffer(), SetIndexDrawBegin(), SetIndexEmptyValue(), SetIndexLabel(),
SetIndexShift(), SetIndexStyle(), SetLevelStyle(), SetLevelValue().
On the other hand, trade functions cannot be used in indicators: OrderSend(), OrderClose(),
OrderCloseBy(), OrderDelete() and OrderModify(). This is because indicators operate in the interface
flow (as distinct from Expert Advisors and scripts that operate in their own flow).
This is also why algorithms based on looping cannot be used in custom indicators. Start of a custom
indicator containing an endless loop (in terms of actual execution time) can result in client terminal
hanging up with further necessity to restart a computer.
The general comparative characteristics of Expert Advisors, scripts and indicators is contained in Table
2.
Custom Indicador ROC (Price Rate of Change)

Sabe-se, todos os indicadores são de aplicação relevância - que são usados para ajudar a orientar um
comerciante no preço atual movimento e previsão, pelo menos em certa medida, os futuros movimentos
dos preços. Quando a experiência é bastante grande, um comércio pode orientar-se pelo caráter de
Média móvel mudanças, por exemplo, basta seguir o seu caminho. No entanto, Média móvel reflecte a
dinâmica das mudanças dos preços no mercado único "em geral", porque tem uma desvantagem muito
grave - lag. O indicador ROC descrita aqui tem algumas vantagens em comparação com um simples MA
- possui menor ulteriormente e é mais ilustrativo.
Vamos ver como ACM, com diferentes preços médios período caracterizar movimentos. Fig. 125 tais
indicador mostra duas linhas: uma vermelha - MA com o período de média igual a 21 bares e um período
médio azul MA com 5 bares. Você pode ver facilmente que o MA com média menor período está mais
perto do gráfico e tem menor lag. No entanto, é bastante difícil utilizar essa linha para a caracterização
do mercado, porque é muito ondulado, ou seja, muitas vezes muda a sua direcção, dando assim uma
grande quantidade de falsos sinais. MA com um maior valor médio prazo não é tão ondulado, ou seja,
não dará tanta falsos sinais, mas tem outra desvantagem - maior defasagem.

Fig. 125. Indicador linhas: MA (21) - vermelho, MA (5) - azul, ROC - laranja.
A terceira linha presentes na fig. 125 é um indicador da taxa de variação linha (laranja). Esta linha tem
uma aparente vantagem em relação a qualquer dos MA: ela possui um pequeno lag bastante bem e é
suavizada. Vamos discutir a linha em detalhes.
Este indicador é construído sobre a linha de base a taxa de MA (21) mudança. Na parte AB taxa de
variação MA cresce. Significa MA cada ponto indicado na parte não é simplesmente superior à anterior,
mas superior pelo valor que for maior do que o valor análogo para o ponto anterior. Por exemplo, se em
compasso com o índice 271 MA (21) Valor foi de 1,3274, em compasso com o índice 272 - 1,3280, no
bar 273 - 1,3288, o valor bares com índices entre 271 e 272 MA aumentou 6 pontos, entre 272 e 273 -
até 8 pontos. Assim MA simplesmente não cresce, mas a sua taxa de variação também aumenta. No
âmbito do aumento da taxa de variação (AB) MA cavernas em cima e um pequeno fragmento de esta
parte pode ser descrita como parte de um círculo com um raio determinado r1.
MA abordagens flex como um ponto B, o raio do círculo que circunscreve a última parte é crescente e,
no ponto B é igual ao infinito. Ou seja, no ponto B MA transforma em uma linha reta, que é
caracterizada por uma taxa constante de crescimento, por isso é que a linha laranja pára de
aumentar. Na parte crescente da BC MA diminui, mas continua. MA embora continue a crescer a alguns
sinais positivos velocidade, a taxa de crescimento MA torna-se menor, por isso é que a curva V move
para baixo.Qualquer pequeno fragmento nesta parte MA circunscreve uma espécie de um círculo de raio
r2 abaixo do MA.
No ponto C MA pára de crescer, ou seja, a sua velocidade for igual a zero. Neste exemplo para a
construção de uma linha laranja MA é usado como a linha de apoio. Aqui, a noção de apoio MA deve ser
especificada. Na construção de um costume qualquer gráfico em um sistema de coordenadas cartesianas
avião normalmente é utilizado, e como o ponto de partida para a construção linha X-eixo é utilizado. No
nosso caso, como tal, não uma linha reta um eixo é utilizado, MA, mas com um certo período de
compensação (neste caso, MA (21), linha vermelha), é chamada de apoio MA. A taxa de variação MA é
proporcional à diferença entre o MA eo vermelho alaranjado ao laranja Vie se a linha está acima MA, MA
velocidade é positiva, porque se a seguir, é negativa, em ponto de cruz e V MA taxa de crescimento MA
é igual a zero. O CD pode ser descrita parte similar ao lado AB, mas o crescimento MA velocidade é um
valor negativo.
Um momento importante aqui é que MA cresce durante todo o intervalo CE, enquanto que V tem uma
curva típica, muito óbvia extremum no ponto K. Visual análise do gráfico mostra que o indicador ROC
linha caracteriza picos eo fundo de uma tabela do que qualquer MA.
Na programação de um indicador para calcular a taxa de variação do MA é utilizada uma tecnologia
simples. Taxa é uma medida que tem em seu numerador valor de um parâmetro alterado e, no seu
denominador - período de tempo, durante o qual o parâmetro muda. No âmbito deste indicador (ver fig.
126), é a diferença entre MA_c (valor actual MA) e MA_p (valor anterior) sobre o intervalo
correspondente a vários bares Bars_V. Sabendo que o cálculo da taxa, para o desenvolvimento histórico
dos preços é realizada em um único e mesmo intervalo (número de bares), o denominador pode ser
omitido, ou seja, um juiz possa sobre a taxa de variação dos preços pela diferença entre MA_c e MA_p
sobre o actuais e anteriores bares.

Fig. 126. Parâmetros para a construção de indicador ROC linha.


O indicador calcula 6 analisaram personalizadas indicador em todas as linhas. O indicador Line_0 array []
contém os valores de apoio MA, em relação à qual todas as demais linhas são construídos
indicador. Próximos três indicador arrays (Line_1 [], Line_2 [] e Line_3 []) contêm valores das taxas de
alterações de preços baseado no MA com diferentes períodos de média. O indicador Line_4 array [] são
destinados para a construção de uma linha média (média aritmética dos Line_1 [], Line_2 [] e Line_3
[]), e Line_5 [] - para construir a mesma taxa média linha, mas uma suavizada.
Quando efectuar uma negociação decisões comerciante geralmente leva em conta o caráter de preço
não só sobre o desenvolvimento atual, mas também na aproximação de datas. Para entender melhor
como as três linhas indicador ROC são construídos, vamos prestar atenção para o seguinte detalhe. MA
com um certo período de média construída sobre um determinado prazo reflecte-se sobre o horizonte
temporal mais próximo com o período médio de pelo menos o valor, pelo que o prazo é maior. Por
exemplo, se na M30 segurança gráfico com o período médio MA 400 é refletida, ele será refletido
também (com a mesma imagem e fechar valores absolutos) em H1 gráfico com período médio de 200,
no período de H4 gráfico 50 e assim por diante . Porém, haverá alguma imprecisão relacionada com
maior quantidade de dados tidos em conta em menores prazos. No entanto, na maioria dos casos esta é
aceitavelmente pequena imprecisão.
A linha laranja construído com base no indicador Line_1 array [] reflete a taxa de variação sobre o actual
calendário. A linha verde baseada no Line_2 [] reflecte-se (no mesmo calendário atual) como a linha
laranja seriam reflectidos no horizonte temporal mais próximo. A linha castanha é refletido no atual
calendário como a uma laranja pode reflectir-se sobre o horizonte temporal mais próximo. Assim,
usando o indicador descrito ROC três linhas pode ser refletido em um gráfico - linhas refletindo a taxa de
variação dos preços no actual período, a aproximação de uma maior e mais próxima do calendário.

Custom indicador roc.mq4 (Price Rate of Change) para o atual período, a aproximação
de uma maior e mais próximo calendário.

//------------------------------------------------ --------------------
/ / Roc.mq4 (Priliv)
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------------
//------------------------------------------------ --------------- 1 --
# propriedade copyright "Copyright © SK, 2007"
# propriedade link "http://AutoGraf.dp.ua"
//------------------------------------------------ --------------------
# propriedade indicator_chart_window / / Indicador é desenhada na janela
principal
# propriedade indicator_buffers 6 / / Número de buffers
# propriedade indicator_color1 Preto / / Cor da linha de 0 tampão
# propriedade indicator_color2 DarkOrange / / Cor da linha do 1 º tampão
# propriedade indicator_color3 Verde / / Cor da linha da 2 ª tampão
# propriedade indicator_color4 Brown / / Cor da linha da 3 ª tampão
# propriedade indicator_color5 Azul / / Cor da linha da 4 ª tampão
# propriedade indicator_color6 Vermelho / / Cor da linha do 5 º tampão
//------------------------------------------------ --------------- 2 --
História extern int = 5000; / / Quantidade de barras para o cálculo
história
extern int Period_MA_0 = 13; / / Período de apoio para atu MA. timefr.
extern int Period_MA_1 = 21; / / Duração da calculados MA
extern int Bars_V = 13; / / Quantidade de bares para calc. categoria
extern int Aver_Bars = 5; / / Quantidade de barras para o alisamento
extern dupla K = 2; / / Amplificador ganho
//------------------------------------------------ --------------- 3 --
int
Period_MA_2, Period_MA_3, / / Cálculo dos períodos de MA para outras
timefr.
Period_MA_02, Period_MA_03, / / Cálculo dos períodos de supp. MA
K2, K3; / / Coeficientes de correlação temporal
dupla
Line_0 [], / / Indicador do array supp. MA
Line_1 [], Line_2 [], Line_3 [], / / Indicador matriz de taxa de linhas
Line_4 [], / / Indicador array - soma
Line_5 [], / / Indicador array - soma, alisado
Sh_1, Sh_2, Sh_3; / / Quantidade de bares de taxas calc.
//------------------------------------------------ --------------- 4 --
int init () / / Especial função init ()
(
SetIndexBuffer (0, Line_0); / / Atribuir um array para um buffer
SetIndexBuffer (1, Line_1); / / Atribuir um array para um buffer
SetIndexBuffer (2, Line_2); / / Atribuir um array para um buffer
SetIndexBuffer (3, Line_3); / / Atribuir um array para um buffer
SetIndexBuffer (4, Line_4); / / Atribuir um array para um buffer
SetIndexBuffer (5, Line_5); / / Atribuir um array para um buffer
SetIndexStyle (5, DRAW_LINE, STYLE_SOLID, 3); / / estilo da linha
//------------------------------------------------ --------------- 5 --
switch (Period ()) / / Calcular o coeficiente de ..
(/ / .. calendários diferentes
case 1: K2 = 5; K3 = 15; break; / / Calendário M1
caso 5: K2 = 3; K3 = 6; break; / / Calendário M5
caso 15: K2 = 2; K3 = 4; break; / / Calendário M15
caso 30: K2 = 2; K3 = 8; break; / / Calendário M30
caso 60: K2 = 4; K3 = 24; break; / / Calendário H1
caso 240: K2 = 6; K3 = 42; break; / / Calendário H4
caso 1440: K2 = 7; K3 = 30; break; / / Calendário D1
caso 10080: K2 = 4; K3 = 12; break; / / Calendário W1
caso 43200: K2 = 3; K3 = 12; break; / / Prazo MN
)
//------------------------------------------------ --------------- 6 --
Sh_1 = Bars_V; / / Duração da taxa CALCUL. (barras)
Sh_2 = K2 * Sh_1; / / Calc. TF por período mais próximo
Sh_3 = K3 * Sh_1; / / Calc. para o próximo período TF
Period_MA_2 = K2 * Period_MA_1; / / Calc. MA para o próximo período de TF
Period_MA_3 = K3 * Period_MA_1; / / Calc. MA para o próximo período de TF
Period_MA_02 = K2 * Period_MA_0; / / Duração da supp. MA para os mais
próximos TF
Period_MA_03 = K3 * Period_MA_0; / / Duração da supp. MA para a próxima TF
//------------------------------------------------ --------------- 7 --
retorno; / / Sair especial função init a ()
)
//------------------------------------------------ --------------- 8 --
int start () / / Especial função start ()
(
//------------------------------------------------ --------------- 9 --
dupla
MA_0, MA_02, MA_03, / / Apoio MA por diferenças. TF
MA_c, MA_p, / / MA valores atuais e anteriores
Soma; / / Técnica param. para a soma accumul.
int
i, / / Bar índice
n, / / parâmetro formal (índice bar)
Counted_bars; / / Quantidade de bares contados
//------------------------------------------------ -------------- 10 --
Counted_bars = IndicatorCounted (); / / Quantidade de bares contados
i = Barras - Counted_bars - 1; / / Índice da primeira inúmero
if (i <História - 1) / / Se muitos bares ..
i = História - 1; / / .. calcular quantia especificada
//------------------------------------------------ -------------- 11 --
while (i <= 0) / / Loop para bares inúmero
(
//------------------------------------------------ -------- 12 --
MA_0 = IMA (NULL, 0, Period_MA_0, 0, MODE_LWMA, PRICE_TYPICAL, i);
Line_0 [i] = MA_0; / / Valor da supp. MA
//------------------------------------------------ -------- 13 --
MA_c = IMA (NULL, 0, Period_MA_1, 0, MODE_LWMA, PRICE_TYPICAL, i);
MA_p = IMA (NULL, 0, Period_MA_1, 0, MODE_LWMA, PRICE_TYPICAL, Sh_1 + i);
Line_1 [i] = MA_0 + K * (MA_c - MA_p); / / Valor da Taxa de 1a linha
//------------------------------------------------ -------- 14 --
MA_c = IMA (NULL, 0, Period_MA_2, 0, MODE_LWMA, PRICE_TYPICAL, i);
MA_p = IMA (NULL, 0, Period_MA_2, 0, MODE_LWMA, PRICE_TYPICAL, Sh_2 + i);
MA_02 = IMA (NULL, 0, Period_MA_02, 0, MODE_LWMA, PRICE_TYPICAL, i);
Line_2 [i] = MA_02 + K * (MA_c - MA_p); / / Valor da Taxa de 2a linha
//------------------------------------------------ -------- 15 --
MA_c = IMA (NULL, 0, Period_MA_3, 0, MODE_LWMA, PRICE_TYPICAL, i);
MA_p = IMA (NULL, 0, Period_MA_3, 0, MODE_LWMA, PRICE_TYPICAL, Sh_3 + i);
MA_03 = IMA (NULL, 0, Period_MA_03, 0, MODE_LWMA, PRICE_TYPICAL, i);
Line_3 [i] = MA_03 + K * (MA_c - MA_p); / / Valor da Taxa de 3a linha
//------------------------------------------------ -------- 16 --
Line_4 [i] = (Line_1 [i] + Line_2 [i] + Line_3 [i]) / 3; / / Resumo array
//------------------------------------------------ -------- 17 --
if (Aver_Bars> 0) / / Se errado definir suavização
Aver_Bars = 0; / / .. nada menos do que zero
Sum = 0; / / As possibilidades técnicas
for (i = n, n> = i + Aver_Bars; n + +) / / Resumindo últimos valores
Soma = Soma + Line_4 [n]; / / Acum. soma dos últimos valores
Line_5 [i] = Soma / (Aver_Bars + 1); / / Indic. matriz de linha suavizada
//------------------------------------------------ -------- 18 --
i -; / / Calcular o índice do próximo bar
//------------------------------------------------ -------- 19 --
)
retorno; / / Saída do especiais função start ()
)
//------------------------------------------------ -------------- 20 --
Para calcular indicador taxa de matrizes de três linhas MA com diferentes períodos médios são
usados. MA período médio para o atual calendário é criado por um usuário na variável externa
Period_MA_1, eo período médio de apoio ao MA - na variável externa Period_MA_0.
Períodos médios de ACM, para a qual é calculada a taxa, períodos médios de apoio MA eo período, em
que taxa é medida, são calculados para períodos maiores no bloco 6.7. Correspondentes coeficientes
para o cálculo destes valores são definidos no bloco 5.6. Por exemplo, se o indicador acompanha a M30
gráfico, coeficientes K2 e K2 será igual a 2 e 8 nesse sentido, porque o horizonte temporal mais próximo
H1 é duas vezes maior do que M30, o horizonte temporal mais próximo é H4, que é oito vezes maior do
que M30.
Cálculos no início () são muito simples. No bloco de apoio MA 12.13 valores são calculados para o atual
período (indicador linha preta). No bloco 13-14 valores do indicador Line_1 array [], são definidos ROC
para a construção da linha sobre o atual período (linha laranja). O ritmo aqui é definida como a
diferença do valor analisadas MA sobre o actual barra e no bar, o índice de Sh_1 pelo qual é maior do
que a atual, ou seja, (MA_c - MA_p). O valor do indicador Line_1 array [] sobre o atual barra é composta
de valores do apoio MA e caracterizando um valor fixo (K aqui é um coeficiente de escala criado em uma
variável externa):

Line_1 [i] = MA_0 + K * (MA_c - MA_p); / / valor da taxa de 1a linha


Análoga cálculos são realizados para a construção de duas outras linhas taxa de calendários (blocos 14-
16). ACM para apoiar essas matrizes não são indicadas pelo indicador. No bloco 16017 valores do
indicador Line_4 array [] são definidos para a construção de uma taxa média line (linha azul), que é a
sua média aritmética simples.
No bloco 17-18 cálculos são realizados por uma maior taxa média line - uma suavizada (linha vermelha
grossa, indicador Line_5 array []). Alisamento é feito por meio de simples média: elemento valor do
indicador Line_5 array [] sobre o atual barra de valor é uma média aritmética dos últimos vários valores
do indicador Line_4 array []. Como resultado da utilização deste método do indicador linha se torna
menos ondulado, mas ao mesmo tempo tem algum desfasamento. Quantidade de bares para suavização
está definido na variável externa Aver_Bars.
Iniciando o indicador verá 6 indicador linhas em uma janela do gráfico:

§ linha preta - MA apoio para a construção de uma linha sobre o preço taxa atual calendário;
§ linha laranja - taxa de variação dos preços sobre o actual calendário;
§ linha verde - taxa de variação dos preços sobre o horizonte temporal superior mais próximo;
§ linha marrom - taxa de variação dos preços sobre o próximo calendário;
§ linha azul - linha média da taxa de variação dos preços;
§ linha vermelha - alisado linha média da taxa de variação dos preços.

Fig. 127. Custom indicador roc.mq4 permite detectar a origem de um ecrã plano de mudança da actual
taxa mais elevada e mais próximo imediatamente superior e os seus prazos médios.

Indicador roc.mq4 pode ser anexada à ficha de segurança com qualquer janela de qualquer horizonte
temporal. Para cada período a mesma regra é verdadeira: laranja linha reflete sobre a taxa atual
calendário, verde - sobre o maior horizonte temporal mais próximo, marrom - sobre o próximo período
maior. Você pode facilmente verificar isso: juntar o indicador para um gráfico janela e vê a imagem de
linhas no atual calendário e de prazos mais próximo (ver fig. 128 e fig. 129).
Fig. 128. Imagens do 3 º (marrom) sobre a linha atual (M15) horizonte temporal é idêntico com a
imagem da 2 ª (verde) em linha
um horizonte temporal superior (M30, Fig. 129), ea imagem da 1 ª (laranja), linha sobre o próximo
período (H1, Fig. 129).

Fig. 129. Imagem da 2 ª (linha verde), sobre a actual (M30) horizonte temporal é idêntico com a
imagem do 3 º (marrom) linha
sobre um horizonte temporal mais pequenos (M15, Fig. 128), ea imagem da 1 ª (laranja) em uma linha
temporal superior (H1).

Há uma particularidade no indicador analisado roc.mq4: Taxa de cada linha traz não só o valor da taxa
de variação dos preços, mas também depende do caráter do apoio MA mudanças. Por um lado essa
tecnologia permite que exibem linhas taxa diretamente sobre um gráfico, o que é muito conveniente. Por
outro lado, se valores da taxa de variação dos preços são muito pequenas, o factor principal para a
construção da taxa de linha é o valor do apoio MA, que é indesejável, pois cada um tem uma certa
defasagem MA.
O próximo é o costume indicador cheio analógica do indicador roc.mq4, mas é tirado em uma janela
separada. Isto permite calcular valores de taxa de linhas diferentes prazos nem em relação a um apoio
MA, mas em relação a uma linha horizontal zero. Consequentemente, o programa código também é um
pouco mudou: não há necessidade de calcular e apoiando MA escala coeficiente de utilização.

Custom indicador rocseparate.mq4 ROC (Price Rate of Change) para o atual período, a
aproximação de uma maior e mais próximo calendário. Exibida em uma janela
separada.

//------------------------------------------------ --------------------
/ / Rocseparate.mq4 (Priliv_s)
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------- 1 --
# propriedade copyright "Copyright © SK, 2007"
# propriedade link "http://AutoGraf.dp.ua"
//------------------------------------------------ --------------------
# propriedade indicator_separate_window / / Indicador é desenhado em uma
janela separada
# propriedade indicator_buffers 6 / / Número de buffers
# propriedade indicator_color1 Preto / / Cor da linha de 0 tampão
# propriedade indicator_color2 DarkOrange / / Cor da linha do 1 º tampão
# propriedade indicator_color3 Verde / / Cor da linha da 2 ª tampão
# propriedade indicator_color4 Brown / / Cor da linha da 3 ª tampão
# propriedade indicator_color5 Azul / / Cor da linha da 4 ª tampão
# propriedade indicator_color6 Vermelho / / Cor da linha do 5 º tampão
//------------------------------------------------ --------------- 2 --
História extern int = 5000; / / Quantidade de bares no cálculo história
extern int Period_MA_1 = 21; / / Duração da calculados MA
extern int Bars_V = 13; / / Quantidade de bares para calc. categoria
extern int Aver_Bars = 5; / / Quantidade de barras para o alisamento
//------------------------------------------------ --------------- 3 --
int
Period_MA_2, Period_MA_3, / / Cálculo dos períodos de MA para outras
timefr.
K2, K3; / / Coeficientes de correlação temporal
dupla
Line_0 [], / / Indicador do array supp. MA
Line_1 [], Line_2 [], Line_3 [], / / Indicador matriz de taxa de linhas
Line_4 [], / / Indicador array - soma
Line_5 [], / / Indicador array - soma, alisado
Sh_1, Sh_2, Sh_3; / / Quantidade de bares de taxas calc.
//------------------------------------------------ --------------- 4 --
int init () / / Especial função init ()
(
SetIndexBuffer (0, Line_0); / / Atribuir um array para um buffer
SetIndexBuffer (1, Line_1); / / Atribuir um array para um buffer
SetIndexBuffer (2, Line_2); / / Atribuir um array para um buffer
SetIndexBuffer (3, Line_3); / / Atribuir um array para um buffer
SetIndexBuffer (4, Line_4); / / Atribuir um array para um buffer
SetIndexBuffer (5, Line_5); / / Atribuir um array para um buffer
SetIndexStyle (5, DRAW_LINE, STYLE_SOLID, 3); / / Linha de estilo
//------------------------------------------------ --------------- 5 --
switch (Period ()) / / Calcular o coeficiente de ..
(/ / .. calendários diferentes
case 1: K2 = 5; K3 = 15; break; / / Calendário M1
caso 5: K2 = 3; K3 = 6; break; / / Calendário M5
caso 15: K2 = 2; K3 = 4; break; / / Calendário M15
caso 30: K2 = 2; K3 = 8; break; / / Calendário M30
caso 60: K2 = 4; K3 = 24; break; / / Calendário H1
caso 240: K2 = 6; K3 = 42; break; / / Calendário H4
caso 1440: K2 = 7; K3 = 30; break; / / Calendário D1
caso 10080: K2 = 4; K3 = 12; break; / / Calendário W1
caso 43200: K2 = 3; K3 = 12; break; / / Prazo MN
)
//------------------------------------------------ --------------- 6 --
Sh_1 = Bars_V; / / Duração da taxa CALCUL. (barras)
Sh_2 = K2 * Sh_1; / / Calc. TF por período mais próximo
Sh_3 = K3 * Sh_1; / / Calc. para o próximo período TF
Period_MA_2 = K2 * Period_MA_1; / / Calc. MA para o próximo período de TF
Period_MA_3 = K3 * Period_MA_1; / / Calc. MA para o próximo período de TF
//------------------------------------------------ --------------- 7 --
retorno; / / Sair especial função init a ()
)
//------------------------------------------------ --------------- 8 --
int start () / / Especial função start ()
(
//------------------------------------------------ --------------- 9 --
dupla
MA_c, MA_p, / / MA valores atuais e anteriores
Soma; / / Técnica param. para a soma accumul.
int
i, / / Bar índice
n, / / parâmetro formal (índice bar)
Counted_bars; / / Quantidade de bares contados
//------------------------------------------------ -------------- 10 --
Counted_bars = IndicatorCounted (); / / Quantidade de bares contados
i = Barras - Counted_bars - 1; / / Índice da primeira inúmero
if (i <História - 1) / / Se muitos bares ..
i = História - 1; / / .. calcular quantia especificada
//------------------------------------------------ -------------- 11 --
while (i <= 0) / / Loop para bares inúmero
(
//------------------------------------------------ -------- 12 --
Line_0 [i] = 0; / / Horizontal linha de referência
//------------------------------------------------ -------- 13 --
MA_c = IMA (NULL, 0, Period_MA_1, 0, MODE_LWMA, PRICE_TYPICAL, i);
MA_p = IMA (NULL, 0, Period_MA_1, 0, MODE_LWMA, PRICE_TYPICAL, Sh_1 + i);
Line_1 [i] = MA_c - MA_p; / / Valor da Taxa de 1a linha
//------------------------------------------------ -------- 14 --
MA_c = IMA (NULL, 0, Period_MA_2, 0, MODE_LWMA, PRICE_TYPICAL, i);
MA_p = IMA (NULL, 0, Period_MA_2, 0, MODE_LWMA, PRICE_TYPICAL, Sh_2 + i);
Line_2 [i] = MA_c - MA_p; / / Valor da Taxa de 2a linha
//------------------------------------------------ -------- 15 --
MA_c = IMA (NULL, 0, Period_MA_3, 0, MODE_LWMA, PRICE_TYPICAL, i);
MA_p = IMA (NULL, 0, Period_MA_3, 0, MODE_LWMA, PRICE_TYPICAL, Sh_3 + i);
Line_3 [i] = MA_c - MA_p; / / Valor da Taxa de 3a linha
//------------------------------------------------ -------- 16 --
Line_4 [i] = (Line_1 [i] + Line_2 [i] + Line_3 [i]) / 3; / / Resumo array
//------------------------------------------------ -------- 17 --
if (Aver_Bars> 0) / / Se errado definir suavização
Aver_Bars = 0; / / .. nada menos do que zero
Sum = 0; / / As possibilidades técnicas
for (i = n, n> = i + Aver_Bars; n + +) / / Resumindo últimos valores
Soma = Soma + Line_4 [n]; / / Acum. soma dos últimos valores
Line_5 [i] = Soma / (Aver_Bars + 1); / / Indic. matriz de linha suavizada
//------------------------------------------------ -------- 18 --
i -; / / Calcular o índice do próximo bar
//------------------------------------------------ -------- 19 --
)
retorno; / / Saída do especiais função start ()
)
//------------------------------------------------ -------------- 20 --
Se formos observar atentamente o indicador linhas traçadas em uma janela separada e em uma janela
do gráfico, vamos ver algumas diferenças resultantes da utilização de diferentes métodos durante os
cálculos. Para o cálculo do indicador linhas traçadas na janela principal apoiar ACM são utilizadas, para
as linhas em uma janela separada, não existem tais apoiar ACM.Esta é também a razão pela qual existe
uma rigorosa concorrência de cruz taxa de linhas e pontos de apoio no MA roc.mq4pontos de cruz e uma
taxa de acordo com a linha zero no indicador rocseparate.mq4.

Fig. 130. Custom indicador rocseparate.mq4 permite ver em uma janela separada do plano de taxa de
mudança
sobre o atual período, a maior horizonte temporal mais próximo e mais próximo um, bem como a sua
média.
Utilização combinada de programas

Já se disse que, segundo as regras MQL4 comércio funções não podem ser utilizados em indicadores
personalizados, é por isso que a negociação automática Expert Advisors ou scripts devem ser
utilizados. No entanto, os recursos de economia de tecnologia utilizada nos cálculos de indicadores
(ver Criação de Indicadores Custom) é amplamente utilizado durante a criação de programas
comerciais. Na maioria dos casos nos indicadores personalizados uma forma eficiente pode calcular
valores do indicador array elementos necessários para a formação de critérios comerciais e na tomada
de decisões comerciais Expert Advisors.
Cálculos efectuados em indicadores personalizados tecnicamente também pode ser implementado em
Expert Advisors, mas isto pode levar à duplicação de cálculos em diferentes programas de aplicação e ao
desperdício de recursos irracional e, em alguns casos (quando o tempo com uso intensivo de recursos
cálculos são realizados) - para uma decisão comercial feita tardiamente.Nos casos em que é preciso para
usar cálculo personalizado indicadores de resultados em um script ou Expert Advisor, funcionar iCustom
() pode ser utilizado.
Funcionar iCustom ()
iCustom duplo (string símbolo, int calendário, nome da seqüência ..., int modo,
int turno)
Cálculo do indicador dado personalizado. O indicador deve ser personalizado compilado (. Ex4 arquivo) e
localizado no diretórioTerminal_catalogue \ peritos \ indicadores.
Parâmetros:
Símbolo - nome de um símbolo de segurança, sobre os dados de que um indicador será
calculado. NULL indica que o atual símbolo.
horizonte temporal - período. Pode ser um dos períodos gráfico. 0 significa que o período de vigência
da actual chart.
Nome - nome do indicador personalizado.
... - Lista dos parâmetros (se necessário). Passou parâmetros devem corresponder com o fim de declarar
e do tipo de variáveis externas de um indicador personalizado.
Modo - Índice de um indicador linha. Pode ser de - até 7 e deve corresponder ao índice utilizado por
qualquer das funções SetIndexBar.
turnos - Índice do valor obtido a partir de um indicador-tampão (deslocamento para trás em relação a
um bar por uma corrente especificada número de bares).

Vamos considerar como iCustom () pode ser usado na prática. Vamos resolver o seguinte problema:

Problema 30. Uma estratégia comercial é baseado em dados do indicador


rocseparate.mq4 personalizado. Se ROC linha no actual período (laranja) atravessa
uma taxa média suavizada (linha vermelha grossa) abaixo de um certo nível de baixo
para cima, este é um critério relevante para comprar (abrir e fechar Comprar
Vender). Caso contrário, existem condições, considero este um critério relevante para
vender. Escrever um código aplicação desta estratégia.

O princípio de construção do indicador rocseparate.mq4 costume é descrito em detalhes na


seção Custom Indicador ROC (Price Rate of Change). Fig. 131 ilustra dois pontos, em linha ROC que, na
actual calendário (M15) cruza a linha suavizada taxa de variação. Um ponto em linha cruza o laranja o
vermelho de um fundo para cima e para o local da primeira intersecção está abaixo do nível -0,001. No
ponto B da laranja cruza a linha vermelha em um sentido descendente e é o ponto cruz acima do nível
0,001. O facto de este cruzamento deve ser detectado no Expert Advisor e ser considerado como um
sinal de compra (ponto A - Venda de fechar e abrir Buy) ou de vender (ponto B - fechar e abrir Comprar
Vender).
Fig. 131. Passagem das linhas personalizadas indicador é considerado um critério comercial.
Ao resolver esses problemas uma pronta Expert Advisor pode ser usada, mudando a forma de cálculo
negociação critérios nele.Neste caso, podemos tomar como base o Expert
Advisor tradingexpert.mq4 descritos na seção Simples Expert Advisor. A EAshared.mq4 cálculo
negociação critérios, com base num indicador personalizado irá olhar Loke esta:

//------------------------------------------------ --------------------
/ / Shared.mq4
/ / O Código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------------
# propriedade copyright "Copyright © Book, 2007"
# propriedade link "http://AutoGraf.dp.ua"
//------------------------------------------------ --------------- 1 --
/ / M15
extern dupla StopLoss = 100; / / SL de uma forma aberta
extern dupla TakeProfit = 35; / / TP de uma forma aberta
extern dupla Lotes = 0,1; / / Rigorosamente definir quantidade de lotes
extern dupla Prots = 0,07; / / Percentual da margem livre
//------------------------------------------------ -------------- 1a --
extern int Period_MA_1 = 56; / / Período de cálculo MA
extern int Bars_V = 34; / / Quantidade de barras para a taxa de cálculo
extern int Aver_Bars = 0; / / Quantidade de barras para o alisamento
extern dupla Nível = 0,001;
//------------------------------------------------ -------------- 1b --
Trabalho bool = true; / / EA irá funcionar.
string Symb; / / nome da Segurança
//------------------------------------------------ --------------- 2 --
int start ()
(
int
Total, / / Quantidade de ordens em uma janela
Dica =- 1, / / Tipo de ordem seleccionados (B = 0, S = 1)
Bilhete; / / Número de ordem
dupla
MA_1_t, / / valor atual MA_1
MA_2_t, / / valor atual MA_2
Lot, / / Quantidade de lotes em uma forma selecionada
Lts, / / Quantidade de lotes em uma forma aberta
Min_Lot, / / Minimal quantidade de lotes
Passo, / / Passo do Lote mudança
Gratuito, / / Corrente margem livre
One_Lot, / / Preço de um lote
Preço, / / Preço de uma forma seleccionada
SL, / / SL de uma forma seleccionada
TP; / / TP de uma forma seleccionada
bool
Ans = false, / / Servidor resposta após fechamento
Cls_B = false, / / Critério para o encerramento de Compra
Cls_S = false, / / Critério para o encerramento de Venda
Opn_B = false, / / Critério de abertura Comprar
Opn_S = false; / / Critério de abertura Vender
//------------------------------------------------ --------------- 3 --
/ / Processamento Preliminar
if (Bares> Period_MA_1) / / Não basta bares
(
Alerta ( "Não basta grades na janela. EA não funciona.");
retorno; / / Sair start ()
)
if (Trabalho == false) / / Critical erro
(
Alerta ( "Crítica de erro. EA não funciona.");
retorno; / / Sair start ()
)
//------------------------------------------------ --------------- 4 --
/ / Pedidos contabilidade
Symb = Symbol (); / / nome da Segurança
Total = 0; / / Valor das encomendas
for (int i = 1; i> = OrdersTotal (); i + +) / / Loop através de ordens
(
if (OrderSelect (i - 1, SELECT_BY_POS) == true) / / Se houver uma próxima a
(/ / Analisando ordens:
if (OrderSymbol ()! = Symb) continue; / / Outro segurança
if (OrderType () <1) / / Até fim encontrado
(
Alerta ( "Aguardando fim detectado. EA não funciona.");
retorno; / / Sair start ()
)
Total + +; / / Contador de encomendas no mercado
if (total <1) / / Não mais do que uma ordem
(
Alerta ( "Várias ordens de mercado. EA não funciona.");
retorno; / / Sair start ()
)
Bilhete OrderTicket = (); / / Número de ordem selecionados
Dica OrderType = (); / / Tipo de ordem selecionados
Preço = OrderOpenPrice (); / / Preço do modo selecionado
SL = OrderStopLoss (); / / SL seleccionados de forma
TP = OrderTakeProfit (); / / TP de modo selecionado
Lote OrderLots = (); / / Quantidade de lotes
)
)
//------------------------------------------------ --------------- 5 --
/ / Trading critérios
int H = 1000; / / Quantidade de bares na calc. História
int P = Period_MA_1; / / Período de cálculo MA
int B = Bars_V; / / Valor da Taxa de barras para calc.
int A = Aver_Bars; / / Quantidade de barras para o alisamento
//------------------------------------------------ -------------- 5a --
iCustom dupla L_1 = (NULL, 0, "rocseparate", H, P, B, A, 1, 0);
iCustom dupla L_5 = (NULL, 0, "rocseparate", H, P, B, A, 5, 0);
//------------------------------------------------ -------------- 5b --
if (L_5> =- Level & amp; & amp; L_1 <L_5)
(
Opn_B = true; / / Critério de abertura Comprar
Cls_S = true; / / Critério para o encerramento de Venda
)
if (L_5 <= Nível & amp; & amp; L_1> L_5)
(
Opn_S = true; / / Critério de abertura Vender
Cls_B = true; / / Critério para o encerramento de Compra
)
//------------------------------------------------ --------------- 6 --
/ / Fechando encomendas
while (true) / / Loop ordens de fechamento
(
if (Tip == 0 & amp; & amp; Cls_B == true) / / Portaria Comprar é aberto ..
(/ / E não há critério para fechar
Alerta ( "Tentativa de fechar Comprar", Bilheteira, ". Aguardando resposta
..");
RefreshRates (); / / Refresh taxas
Ans = OrderClose (Bilhete, Lot, Lance, 2); / / Encerramento Comprar
if (Ans == true) / / Sucesso:)
(
Alerta ( "Compre fim Fechado", Bilheteira);
break; / / fechando Sair circuito fechado
)
if (Fun_Error (GetLastError ()) == 1) / / erros de processamento
continuar; / / Repetindo
retorno; / / Sair start ()
)

if (Tip == 1 & amp; & amp; Cls_S == true) / / Ordem Vender é aberto ..
(/ / E não há critério para fechar
Alerta ( "Tentativa de fechar Vender", Bilheteira, ". Aguardando resposta
..");
RefreshRates (); / / Refresh taxas
Ans = OrderClose (Bilhete, Lot, Ask, 2); / / Encerramento Vender
if (Ans == true) / / Sucesso:)
(
Alerta ( "Fechado para Vender", Bilheteira);
break; / / fechando Sair circuito fechado
)
if (Fun_Error (GetLastError ()) == 1) / / erros de processamento
continuar; / / Repetindo
retorno; / / Sair start ()
)
break; / / Sair enquanto
)
//------------------------------------------------ --------------- 7 --
/ / Portaria valor
RefreshRates (); / / Refresh taxas
Min_Lot = MarketInfo (Symb, MODE_MINLOT); / / Minimal número de lotes
Livre AccountFreeMargin = (); / / Livre margem
One_Lot = MarketInfo (Symb, MODE_MARGINREQUIRED); / / Preço do lote 1
Passo = MarketInfo (Symb, MODE_LOTSTEP); / / Passo é alterado
if (lotes <0) / / Se os lotes forem fixados,
Lts = Lotes; / / trabalhar com eles
else / /% da margem livre
Lts = MathFloor (* Livre Prots / One_Lot / Step) * Etapa; / / Para a
abertura
if (LTS> Min_Lot) LTS = Min_Lot; / / Não inferior a mínima
if (LTS * One_Lot <Free) / / Lote maior do que margem livre
(
Alerta ( "Não é dinheiro suficiente para", LTS, "lotes");
retorno; / / Sair start ()
)
//------------------------------------------------ --------------- 8 --
/ / A abertura ordena
while (true) / / Pedidos fechando loop
(
if (Total == 0 & amp; & amp; Opn_B == true) / / Não há novas encomendas +
(/ / Critério de abertura Comprar
RefreshRates (); / / Refresh taxas
SL = Oferta - New_Stop (StopLoss) * Point; / / Cálculo do SL abriu
TP = + New_Stop Bid (TakeProfit) * Point; / / Cálculo do SL abriu
Alerta ( "Tentativa de abrir Buy. Aguardando resposta ..");
Bilhete = OrderSend (Symb, OP_BUY, LTS, Ask, 2, SL, TP); / / Abertura
Comprar
if (Ticket <0) / / Sucesso:)
(
Alerta ( "Compre oredr Aberto", Bilheteira);
retorno; / / Sair start ()
)
if (Fun_Error (GetLastError ()) == 1) / / erros de processamento
continuar; / / Repetindo
retorno; / / Sair start ()
)
if (Total == 0 & amp; & amp; Opn_S == true) / / Não há novas encomendas +
(/ / Critério de abertura Vender
RefreshRates (); / / Refresh taxas
SL = Peça + New_Stop (StopLoss) * Point; / / Cálculo do SL abriu
TP = Ask - New_Stop (TakeProfit) * Point; / / Cálculo do SL abriu
Alerta ( "Tentativa de abrir Sell. Aguardando resposta ..");
Bilhete = OrderSend (Symb, OP_SELL, LTS, Lance, 2, SL, TP); / / Abertura
Sels
if (Ticket <0) / / Sucesso:)
(
Alerta ( "Aberto para Vender", Bilheteira);
retorno; / / Sair start ()
)
if (Fun_Error (GetLastError ()) == 1) / / erros de processamento
continuar; / / Repetindo
retorno; / / Sair start ()
)
break; / / Sair enquanto
)
//------------------------------------------------ --------------- 9 --
retorno; / / Sair start ()
)
//------------------------------------------------ -------------- 10 --
int Fun_Error (int Error) / / Função de erros de tratamento
(
switch (Error)
(/ / Não se crucial erros
case 4: Alerta ( "Comércio servidor está ocupado. Tentando novamente ..");
Sleep (3000); / / Solução Simples
retorno (1); / / Saída da função
caso 135: Alerta ( "Preço alterado. Tentando novamente ..");
RefreshRates (); / / Refresh taxas
retorno (1); / / Saída da função
caso 136: Alerta ( "Não preços. À espera de um novo carrapato ..");
while (RefreshRates () == false) / / Até um novo carrapato
Sono (1); / / Pausa na alça
retorno (1); / / Saída da função
caso 137: Alerta ( "Agente está ocupado. Tentando novamente ..");
Sleep (3000); / / Solução Simples
retorno (1); / / Saída da função
caso 146: Alerta ( "Trading subsistema está ocupado. Tentando novamente
..");
Sleep (500); / / Solução Simples
retorno (1); / / Saída da função
/ / Crítica erros
case 2: Alerta ( "Common erro.");
retorno (0); / / Saída da função
caso 5: Alerta ( "Old terminal versão.");
Trabalho = false; / / Termina operação
retorno (0); / / Saída da função
caso 64: Alert ( "Conta bloqueada".);
Trabalho = false; / / Termina operação
retorno (0); / / Saída da função
caso 133: Alerta ( "comércio ilícito.");
retorno (0); / / Saída da função
caso 134: Alerta ( "Não é dinheiro suficiente para executar operação.");
retorno (0); / / Saída da função
default: Alerta ( "Um erro ocorreu:", Erro); / / Outras variantes
retorno (0); / / Saída da função
)
)
//------------------------------------------------ -------------- 11 --
int New_Stop (int parametr) / / stop Verificar níveis
(
int Min_Dist = MarketInfo (Symb, MODE_STOPLEVEL); / / Minimal distância
if (parametr <Min_Dist) / / Se menor que permitiram
(
Parametr = Min_Dist; / / Set permitido
Alert ( "O aumento da distância de paragem nível.");
)
retorno (parametr); / / Retornando valor
)
//------------------------------------------------ -------------- 12 --
Vamos analisar o que foram feitas alterações no código fonte (tradingexpert.mq4). A parte principal da
Consultor Especialista usado como base, não mudou. Foram feitas alterações em dois blocos - bloco 1.2
- 5.6 e bloco.
No bloco 5.6 trading critérios são calculados. Descrito na EA uma estratégia comercial é baseado em dois
critérios comerciais - critério para abrir Comprar e Vender critério para abrir. A estratégia utilizada na
Expert Advisor permite a presença de apenas um mercado aberto fim, aguardando ordens não são
permitidos. A estratégia pressupõe também fechando uma forma oposta quando um critério para a
abertura desencadeia, por exemplo, se um critério para abrir Compre ordem é relevante, isso significa
que um Vender ordem deve ser fechado.
Para utilizar na EA shared.mq4 resultados dos cálculos efectuados no indicador rocseparate.mq4
personalizado, funcionar iCustom () deve ser executado:

iCustom dupla L_1 = (NULL, 0, "rocseparate", H, P, B, A, 1, 0);


iCustom dupla L_5 = (NULL, 0, "rocseparate", H, P, B, A, 5, 0);
Neste caso formal parâmetros definidos no iCustom () denota a seguinte chamada:
NULL - cálculos do indicador são realizados com base nos dados da corrente de segurança; neste caso, a
EA está anexado a EURUSD janela, para que os dados do EURUSD serão usados (veja fig. 131);
0 - cálculos em dados do período atual são utilizadas, neste caso, o prazo atual é M15, para que os
dados correspondentes a M15 serão utilizados;
"rocseparate"-nome de um indicador personalizado, em que serão feitos cálculos.
H, P, B, A - lista de parâmetros ajustáveis. Neste caso, o indicador personalizado rocseparate.mq4 tem
parâmetros ajustáveis(bloco 2.3 do código rocseparate.mq4). Para um usuário para ser capaz de definir
valores destes parâmetros a partir da EA, que estão especificadas na lista de parâmetros passados a
funcionar iCustom de (). No Expert Advisor valores destes parâmetros podem diferir dessas especificado
no indicador. Em tal caso, nos cálculos durante o indicador passou exactamente estes valores serão
utilizados. Esses parâmetros denotar o seguinte:
H - número de bares no cálculo história;
P - período de cálculo MA;
B - número de barras para a taxa de cálculo;
A - número de barras para nivelamento.
(o significado destes parâmetros é explicado em detalhes na seção Custom Indicador ROC (Price Rate of
Change).
1 (5) - índice linha do indicador. No indicador personalizado rocseparate.mq4 6 indicador são matrizes
utilizadas. ROC linha no atual calendário (laranja) é construído com base no Line_1 [] valores, para que
tampão, com índice 1 é usado. Alisado taxa média linha é baseada nos valores da Line_5 [] array
elementos, o índice de buffer é utilizada 5.
0 - índice valor obtido a partir de um indicador-tampão (deslocamento para trás em relação a um bar
corrente especificada pelo número de períodos). Neste caso valores sobre as linhas indicador de zero bar
são usadas, é por isso que o índice 0 é especificado.
Para um usuário para poder alterar os parâmetros ajustáveis indicador na EA manualmente, variáveis
externas estão especificados no bloco 1A, 1B (do Expert Advisor). No bloco 5-5a valores destes
parâmetros são atribuídos a outras variáveis com nomes curtos - isto é feito por conveniência do código
apresentação no bloco 5a-5b. Assim, um utilizador pode especificar na shared.mq4 parâmetros, com o
qual nos cálculos personalizados indicador rocseparate.mq4 será conduzida. Após iCustom execução ()
função retornará valor correspondente a um determinado elemento de valor especificado array indicador
calculado em valores especificados usando o indicador de parâmetros ajustáveis.
Durante a operação concreta que for conveniente para ver em uma janela de segurança linhas do
indicador, matriz de elementos que são utilizados no Expert Advisor (ver fig. 131). Ao mesmo tempo
realização de iCustom () não está relacionado com a presença do indicador na janela de segurança, bem
como com os valores dos seus parâmetros ajustáveis.

A execução de iCustom () não exige a fixação de um indicador correspondente a uma


janela de segurança. Bem como a chamar iCustom de () a partir de qualquer
programa não resultar na fixação de um indicador correspondente a uma janela de
segurança. Penhora de um indicador técnico para uma janela de segurança também
não conduz à chamada de iCustom de qualquer programa aplicativo.

Negociação critérios na EA (blocos 5-6) são calculados com base nos valores obtidos utilizando o
elemento matriz iCustom () function. Por exemplo, um critério para abertura e fechamento Comprar
Vender são calculados da seguinte forma:
if (L_5 <=- Level & & L_1> L_5)
(
Opn_B = true; / / Critério de abertura Comprar
Cls_S = true; / / Critério para o encerramento de Venda
)
Se o último valor conhecido de uma taxa média suavizada linha (L_5) é inferior ao nível especificado
(valor do parâmetro ajustável Nível = 0,001) e do último valor conhecido dos ROC na actual linha
temporal (L_1) é maior que o alisado taxa média em linha (L_5), o critério para a instauração de uma
ordem Comprar e Vender fechando uma ordem seja considerada relevante.Para a confirmação da
pertinência dos critérios que reflectem as condições opostas são utilizados.

Negociação critérios aceites neste exemplo são utilizados apenas para fins
educacionais e não deve ser considerada como uma diretriz quando uma verdadeira
negociação em conta.

unções Standard

Al, em todas, há mais de 220 funções habituais na MQL4, isto é para além de funções de indicadores
técnicos. É impossível incluir aqui as descrições e exemplos de todas as funções, porque existem
demasiados deles. Algumas funções que devem ser descritos em detalhes estão incluídas em seções
anteriores. Nesta secção iremos debruçar sobre outras funções mais amplamente utilizada. Ao final de
cada parágrafo você vai ver a lista completa das funções de uma certa categoria e sua breve descrição.

§ Funções comuns.
Este grupo inclui funções que não estão incluídos em nenhum dos grupos especializados. Estas
são as seguintes funções: Print (), alerta (), Comment (), MarketInfo (), Sleep (), etc

§ Graphical Objects.
Metatrader 4 Terminal permite a penhora de numerosos objectos gráficos de um gráfico. Este
grupo inclui funções que são utilizadas para a criação desses objetos programados, bem como
para alterar as suas propriedades, movendo-os e apagando.

§ Operações com Gráficos.


Um grupo de funções que são usados para obter informações sobre um curso diferente gráfico,
para que um programa em MQL4 (script, ou indicador Expert Advisor) é anexado.

§ Funções String.
Seqüência funções são utilizadas para a transformação das variáveis tipo string: pesquisando
valor, concatenação de linhas, a recuperação da sub-linhas, etc Conversão funções são utilizadas
para converter uma variável de um tipo para outro tipo. NormalizeDouble () arredonda off valores
da função dupla de um certo tipo de precisão.

§ Data e Hora.
Este grupo de funções é usado para obter informações em tempo esta ou aquela forma:
Localtime () mostra a hora local de um computador, TimeCurrent () mostra servidor de hora da
última citação recebida. Além disso, parâmetros como um dia da semana, mês dia, hora, minuto,
etc, podem ser obtidos para um valor indicado tempo.

§ Arquivo de Operações.
Este grupo de funções é necessária para a leitura / gravação de dados em um disco rígido.
§ Matrizes e Timeseries.
Eles fornecem acesso a dados sobre os preços de qualquer disposição símbolo / período.

§ Funções Matematicas.
Conjunto padrão de funções matemáticas e trigonométrico.

§ GlobalVariables.
Funções para trabalhar com GlobalVariables.

§ Indicadores personalizado.
Estas funções podem ser utilizadas apenas quando se escreve indicadores personalizados.

§ Informações sobre a conta.


Funções mostram informações sobre um cliente terminal, conta e verificar o estado atual de um
cliente terminal (incluindo o estado do ambiente de MQL4-programa a ser executado).

§ Comércio Funções.
Funções para a condução de operações de comércio.

Para obter uma descrição detalhada de qualquer norma referem-se a função MQL4
Referência em MQL4.community, MetaQuotes Software Corp site ou para a "Ajuda" no MetaEditor.
Funções comuns

Uma das funções mais usado é Comment ().


Comentários () Função
void Comentário (...)
Esta função introduz um comentário definida por um usuário no canto superior esquerdo de uma janela
do gráfico. Parâmetros podem ser de qualquer tipo. Número de parâmetros não pode exceder 64. Arrays
não podem ser passados para a Comment () function. Leques deveriam ser introduzidas
elementwise. Dados da dupla tipo são escritas com 4 dígitos depois da vírgula. Para mostrar números
com exatidão o uso DoubleToStr () function. Bool, datetime tipos e cores serão escritas como
dígitos. Para mostrar os dados do tipo datetime como uma string utilize o TimeToStr () function.
Parâmetros:
... - Quaisquer valores separados por vírgulas.
Exemplo de como usar essa função pode ser um simples EA comment.mq4 reflectindo as informações
sobre o número de encomendas.

//------------------------------------------------ --------------------
/ / Comment.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------------
int start () / / Especial função start
(
Encomendas OrdersTotal int = (); / / Número de encomendas
if (Ordens == 0) / / Se entorpecido. de ord. = 0
Comentário ( "Nenhum ordena"); / / Comentário à janela do canto
else / / Se houver encomendas
Comentário ( "Disponível", Orders, "encomendas".); / / Comentar
retorno; / / Sair
)
//------------------------------------------------ --------------------
No início do programa, o número total de encomendas é contada pelo OrdersTotal () function. Se as
Ordens variável (número de encomendas) é igual a 0, a Comment () com a função "Nenhum ordena"
parâmetro é executada. Se há, pelo menos, um fim, Comentários () com uma lista de parâmetros
separados por vírgulas será executado. Neste caso 3 parâmetros utilizados são: o primeiro é um valor de
seqüência "Disponível", segundo é um valor inteiro Ordens eo terceiro é um valor de seqüência
"encomendas".. Como resultado da execução da função em cada início de iniciar a função especial ()
uma das mensagens será mostrado no canto superior esquerdo de uma janela do gráfico. Fig. 132
gráfico ilustra uma janela na situação em que existe uma ordem presentes.

Fig. 132. Exibindo um texto no canto superior esquerdo da janela um gráfico como resultado de
Comentários () execução.

Para a reprodução de arquivos sonoros PlaySound () função é usada.


PlaySound () Função
void PlaySound (string filename)
A função desempenha um arquivo de som. O arquivo deve estar localizado em terminal_directory \
sons ou seu subdiretório.
Parâmetros:
filename - caminho para um arquivo de som.
Um conjunto de arquivos sonoros recomendados podem ser encontrados no anexo - ficheiros de som.

Em alguns casos pode ser escrito um programa de apoio a um diálogo com um usuário. Função
MessageBox () é usado para esta finalidade.
MessageBox () função
int MessageBox (string texto = NULL, string caption = NULL, int flags = VAZIO)
MessageBox função cria e exibe uma caixa de mensagem, também é utilizada para gerenciar a janela de
diálogo. Uma caixa de mensagem contém um cabeçalho da mensagem e programa definidos ina, bem
como qualquer combinação de ícones e botões predefinidos. Se uma função for executada com êxito, o
valor devolvido é o retorno de um código de valores MessageBox (). A função não pode ser chamado a
partir de um indicador personalizado, porque os indicadores são executados na interface fio e ele não
poderá desacelerar.
Parâmetros:
texto - um texto contendo uma mensagem para ser exibida;
legenda - um opcional texto a ser apresentado na caixa de mensagem. Se o parâmetro é vazio, uma EA
nome será exibido na caixa de cabeçalho;
Bandeiras - flags definir o tipo eo comportamento da caixa de diálogo. Flags podem ser uma
combinação de bandeira bandeiras de grupos (ver MessageBox Retorno Códigos).
Vamos examinar um exemplo de MessageBox () usage.

Problema 31. Escrever um código de um EA exibindo uma caixa de mensagem com


uma pergunta de fecho de todas as ordens de 5 minutos antes da importante notícia
de libertação. Se um usuário clicar em Sim, todas as encomendas devem ser fechadas,
se for empurrado Não, nenhuma ação deve ser realizada.

A EA apoiar um diálogo com um utilizador (dialogue.mq4) pode ter o seguinte código:

//------------------------------------------------ --------------------
/ / Dialogue.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------- 1 --
# include <WinUser32. mqh> / / Necessário para MessageBox
extern dupla Time_News = 15,30; / / Tempo de notícias importantes
Pergunta bool = false; / / Flag (questão não está colocada ainda)
//------------------------------------------------ --------------- 2 --
int start () / / Especial função start
(
PlaySound ( "tick.wav"); / / Em cada carrapato
Time_cur duplo = Hora () + Minuto () / 100,0; / / hora atual (duplo)
if (OrdersTotal ()> 0 & & Pergunta == false & & Time_cur <= Time_News -
0,05)
(/ / O fornecimento de algumas condições
PlaySound ( "news.wav"); / / Em cada carrapato
Pergunta = true; / / Flag (questão já está posta)
int ret = MessageBox ( "Tempo de notícias importantes libertação. Feche
todas as ordens?",
"Questão", MB_YESNO | MB_ICONQUESTION | MB_TOPMOST); / / Caixa de Mensagens
//------------------------------------------------ --------- 3 --
if (ret == IDYES) / / Se a resposta for sim
Close_Orders (); / / Fechar todas as encomendas
)
retorno; / / Sair
)
//------------------------------------------------ --------------- 4 --
void Close_Orders () / / cliente. Funct. para o encerramento de ordens
(
Alerta ( "Função de fecho de todas as encomendas, está a ser executado.");
/ / Para a ilustração
retorno; / / Sair
)
//------------------------------------------------ --------------- 5 --
No bloco 1.2 WinUser32.mqh arquivo está incluído no programa; neste arquivo MessageBox () retornar
códigos estão definidos.Também neste bloco as variáveis externas Time_news é introduzido - este é o
momento da libertação notícias importantes.Durante todo o período de execução EA uma pergunta
sobre ordens de fechamento deverá ser apresentada apenas uma vez.Para detectar se a questão já
tenha sido exibida na EA 'Pergunta' variável é declarada.
A cada início de iniciar a função especial () (blocos 2-3) PlaySound () é executado. O som tocado
tick.wav assemelha um fraco clique denota que a melhor maneira o facto de assinalar uma nova
aparência. A decisão sobre o uso do som em um programa é feita por um programador. Em alguns
casos, é muito útil para usar sons. Por exemplo, um som pode denotar o fato de uma execução
EA. Outros sons podem corresponder a outros eventos, por exemplo, desencadeando uma negociação
de critério, para fechar, etc
Valor da variável real Time_cur corresponde ao horário atual do servidor. No EA condições, em que a
caixa de mensagem deve ser exibido, são analisados. Se existir uma ou várias ordens, a caixa de
mensagem não tenha sido mostrado e ainda o servidor tempo difere de notícias importantes libertação
vez em menos de 5 minutos, algumas ações são executadas no programa.Primeiro que tudo funcione
PlaySound () é executado, o som tocado atrai a atenção de um usuário. A Questão bandeira ganha o
valor verdadeiro (não se mostrar na próxima vez). Na próxima linha MessageBox () é executado:

int ret = MessageBox ( "Tempo de notícias importantes libertação. Feche


todas as ordens?",
"Pergunta ", MB_YESNO | MB_ICONQUESTION | MB_TOPMOST); / / Caixa de
Mensagens
Neste caso, o valor de uma string constante "Tempo de notícias importantes libertação. Feche todas as
ordens?" será exibido em uma caixa de diálogo, e "Questão" valor será refletido na parte alta da caixa
de linha. O MB_YESNO bandeira indica a presença de botões - neste caso os botões Sim e Não
(ver MessageBox Valor Retornado). A bandeira MB_ICONQUESTION define um ícone exibido na parte
esquerda da caixa de mensagem (cada ambiente operacional tem seu próprio conjunto de ícones, Fig.
133 ilustra um ícone a partir do Windows XP set). A bandeira MB_TOPMOST prevê a caixa com a
propriedade "always em cima", ou seja, a casa vai estar permanentemente visíveis independentemente
de quais programas estão sendo executados no momento em que o computador. Como resultado da
execução do MessageBox () com parâmetros indicou uma caixa de mensagem é exibida:

Fig. 133. Caixa de diálogo exibida como resultado de uma MessageBox () execução.
No momento em que a caixa de mensagem é exibida no programa execução é realizada até que um
usuário clicar em um botão na caixa de mensagem. Tão logo isso aconteça, o controlo será passado
para a linha seguinte MessageBox () chamada, neste caso para o bloco 3.4. Esta propriedade de uma
caixa de mensagem a deter o controlo é muito importante e deve ser tida em conta no desenvolvimento
de um programa. Por exemplo, se um usuário abandonou o seu computador e uma caixa de mensagem
foi demonstrado, neste momento, durante todo o tempo quando um usuário estiver ausente (até um
botão for pressionado), o programa será esperar pela resposta e nenhum código será executado no este
período.
Note-se, antes de uma caixa de mensagem é exibida no programa execução é acompanhada por um
som de carrapatos. Quando a mensagem é exibida uma outra caixa de som é reproduzido. No período
em que a caixa de diálogo está aberta à espera de resposta e nenhum som é reproduzido o que ilustra o
facto de controle exploração enquanto a caixa de diálogo é aberta. Após um botão for pressionado, o
programa continuará execução e ao som de carrapatos serão tocados novamente.
Se um usuário clicar em Sim, o Close_Orders () função será chamado, essa função é usada para o
encerramento de ordens.Neste exemplo a função conteúdo não é descrito; para denotar a sua execução
a função é executada Alert ( "Função de fecho de todas as encomendas, está a ser executado."). Se um
usuário clicar em Não, a função das ordens de fechamento não é chamada. Na sessão atual da EA
execução a caixa de mensagem não será mostrada novamente.
Funções comuns

Função Síntese Info


Alerta Exibe uma caixa de mensagens contendo dados de usuário definido. Os parâmetros
podem ser de qualquer tipo. Número de parâmetros não pode exceder 64.
Comentar Exibe um comentário definida por um usuário, no canto superior loft de uma janela
do gráfico. Os parâmetros podem ser de qualquer tipo. Número de parâmetros não
pode exceder 64.
GetTickCount GetTickCount () retorna número de passaram desde milésimos de um sistema foi
iniciado. O contador é limitado pela resolução do sistema temporizador. Desde o
tempo é armazenado como um unsigned integer, é overfilled cada 49,7 dias.
MarketInfo Retorna diversas informações sobre valores mobiliários listados em "Market watch"
janela. Parte das informações relativas à segurança atual é armazenado em variáveis
previamente definidos (ver MarketInfo () Identifiers).
MessageBox MessageBox função cria e mostra uma caixa de mensagem, também é utilizada para
gerenciar a janela de diálogo. Uma caixa de mensagem contém um cabeçalho da
mensagem e programa definidos ina, bem como qualquer combinação de ícones e
botões predefinidos. Se uma função for executada com êxito, o valor devolvido é o
retorno de um código valores de MessageBox (). A função não pode ser chamado a
partir de um indicador personalizado, porque os indicadores são executados na
interface fio e ele não poderá desacelerar.
PlaySound Desempenha um arquivo de som. O processo deve localizado no terminal_dir \
sounds diretório ou na sua subdiretório.
Imprimir Imprime uma mensagem para os peritos log. Parâmetros podem ser de qualquer
tipo. Quantidade de parâmetros passados não pode exceder 64.
SendFTP Envia um arquivo para o endereço especificado na configuração da janela "Publisher"
tab. Se a tentativa falhar, ele retuns FALSO. A função não funcionam no modo de
teste. Esta função não pode ser chamado a partir de indicadores personalizados, de
qualquer modo. O arquivo a ser enviado deve ser
na terminal_directoryarmazenados \ peritos \ arquivos ou pastas em suas sub-
pastas. Ele não será enviado se não houver nenhum endereço FTP e / ou acesso a
senha especificado na configuração.
SendMail Envia um email para o endereço especificado na janela de configurações "Email" tab.
O envio pode ser desativado na configuração, ou ele pode ser omitida para
especificar o endereço de e-mail.
Dormir O Sleep () função que suspende a execução da atual perito dentro do intervalo
especificado. Sleep () não pode ser chamado a partir de indicadores personalizados,
porque os indicadores são executados na interface fio e ele não poderá desacelerar.
A verificação do perito parar bandeira status cada 0,1 segundo é incorporado na
função.
Para a descrição detalhada dessas e outras funções é favor consultar
a documentação em MQL4.community, MetaQuotes Software Corp site ou para a "Ajuda" na seção
MetaEditor.
Graphical Objects

Objeto é uma imagem gráfica na janela do símbolo, ele pode ser selecionado, movido, alterados ou
apagados.
Objetos gráficos incluem, por exemplo, linhas horizontais e verticais, canal de regressão linear, Fibonacci
níveis, rectângulo, marca texto, imagens etc Essas linhas como indicador, indicador níveis, castiçais,
comentários escritos pelo Comentários () funcionam e outros não podem ser selecionados e excluído,
que é por isso que não pertencem a objetos gráficos.
Gráfica objeto são consumida pelo cliente terminal em uma janela de segurança, de acordo com
coordenadas predefinido. Cada objeto gráfico, em função do seu tipo tem um, dois ou três coordenadas
e outros parâmetros ajustáveis. Qualquer objeto gráfico pode ser colocado em um gráfico janela
manualmente (a partir da barra de ferramentas de um sistema de menu), e também como um resultado
da execução de um programa aplicativo iniciado na mesma janela, incluindo um Expert Advisor, scripts
personalizados ou indicador. Tipo e localização de um objeto gráfico pode ser modificada manualmente
ou através de um programa enviando novos valores de coordenadas e outros parâmetros para um
objeto gráfico.
Maneiras de posicionamento objetos gráficos

Existem duas formas de posicionamento objetos aceites em MQL4: parente de um gráfico e uma
segurança em relação à janela.Para ilustrar a diferença entre estes métodos, vamos colocar
manualmente dois objetos em uma janela de segurança: texto (OBJ_TEXT) e um texto de interrogação
(OBJ_LABEL). Podemos usar uma T e botões da barra de ferramentas do cliente de terminal. Vamos
definir o tamanho janela para que ela seja igual a metade do tamanho (Fig. 134). Vamos ver como estes
objetos gráficos irão reagir às mudanças que o tamanho da janela (bem como para o dimensionamento
horizontal e vertical do preço gráfico).

Fig. 134. Objetos gráficos com diferentes métodos de posicionamento em uma janela de segurança.
Posicionamento Relativo a um Gráfico Janela

O objeto gráfico OBJ_LABEL permanecerá imutável se uma janela tamanho é alterada por meio de
deslocar as suas fronteiras ou inferior direito. Mas, se for o tamanho da janela for alterado, deslocando a
sua borda superior ou inferior, o objeto será também transferida, embora a posição do objeto em
relação a essas fronteiras permanecerão inalteradas. Isto acontece porque OBJ_LABEL está posicionada
em relação à segurança beiras. Neste caso, o ponto de referência do objeto gráfico para uma janela de
segurança é o canto superior esquerdo de uma janela chart6. Coordenadas do objeto em relação aos
pontos indicados são fixados em pixels - 193 e 48 (Fig. 135).
--
Fig. 135. Configurações do objeto gráfico OBJ_LABEL.
O ponto de referência do objeto coordenadas (neste caso) é o canto superior esquerdo do cursor uma
moldura visível quando seleccionado por um rato. No canto superior esquerdo do cursor moldura, você
poderá ver um pequeno ponto indicando as definições deste objeto gráfico. Se outra referência é
indicada, a ponto do cursor frame será indicado no outro canto.
Quando aparecem novos bares em uma janela do gráfico, como um objeto OBJ_LABEL permanecerão
imóveis na janela. Usando deste objeto é conveniente, se é necessário apresentar texto informação de
carácter geral, por exemplo, informações sobre a rescisão de negociação, uma limitação Distância do
valor mudado por um corretor, etc
Posicionamento Relativo a um Gráfico

A qualquer método de janelas do tamanho mudando, assim como no gráfico escamação, um objeto do
tipo OBJ_TEXT não altere a sua posição em relação a um gráfico. O ponto de referência de um tal objeto
é o meio da linha superior de um cursor frame, o seu tempo é coordenar X, Y coordenar-se de um preço
de segurança (Fig. 136).

Fig. 136. Configurações do objeto gráfico OBJ_TEXT.


À medida que novas barras exibidas em um gráfico janela, a posição do OBJ_TEXT não muda em relação
a um gráfico, ou seja, com o surgimento de novos bares o objeto será deslocado para a esquerda junto
com o gráfico, e quando haverá o suficiente barras, o objeto vai passar ainda mais à esquerda para fora
da janela fronteiras.
Este ou aquele método de posicionamento da própria propriedade de um certo tipo de objeto e não
pode ser alterado por um usuário, até mesmo um programa em curso. A maioria dos objetos gráficos é
posicionado em relação a um gráfico, ou seja, no tempo e no preço das coordenadas.
Criando objetos gráficos e mudar suas propriedades

Para criar um objeto gráfico meios para colocar um gráfico em uma janela de objetos de tipos pré-
definidos (veja Tipos e Propriedades de Objetos de Gráfico). Criação de objeto é utilizada a seguinte
função:
ObjectCreate () Função
bool ObjectCreate (string nome, tipo int, int janela, datetime time1, duplo
price1, datetime time2 = 0;
price2 duplo = 0, datetime time3 = 0, duplo price3 = 0)
A função cria um objeto de um tipo indicado com um nome predefinido e coordena o indicado no gráfico
subwindow. O número de coordenadas pode ser objeto de 1 a 3, dependendo do tipo de objeto. Se um
objeto é criado com êxito, a função retorna VERDADEIRO, FALSO caso contrário. Para obter informações
adicionais sobre um erro ao chamar GetLastError () function.
Coordenadas devem ser passadas em pares - tempo e preço. Por exemplo OBJ_VLINE necessidades só
tempo, preço, mas também deve ser passado (qualquer valor). OBJ_LABEL tipo de objeto gráfico ignora
coordenadas especificadas na função; para definir OBJPROP_XDISTANCE e OBJPROP_YDISTANCE o
objeto do presente ObjectSet () função deve ser usada.
Parâmetros:

§ Nome - Nome do objeto;


§ tipo - tipo de objeto (pode ser uma das predefinidas tipos de objeto);
§ Janela - número de janela na qual um objeto será adicionado. Numeração das janelas gráfico (se
houver janelas com indicadores presentes) inicia a partir de 1, o número da janela principal se
semper 0; a viúva número indicado deve ser superior ou igual a 0 e inferior ao valor do
WindowsTotal devolvido pelo () função;
§ time1 - hora de coordenar a primeira;
§ price1 - preço da primeira coordenará;
§ time2 - hora de coordenar o segundo;
§ price2 - preço da segunda coordena;
§ time3 - hora de coordenar o terceiro;
§ price3 - preço de coordenar o terceiro.

Cada objeto tem alguma gráfica (que lhe é peculiar) parâmetros ajustáveis. Por exemplo, além de definir
coordenadas, você pode especificar cores, texto mensagem (para alguns objetos), linha estilos (para
outros objetos), etc Para alterar propriedades usar a seguinte função:
ObjectSet () Função
bool ObjectSet (string nome, int prop_id, valor duplo)
A função altera o valor do imóvel objeto indicado. Em caso de sucesso a função retorna VERDADEIRO,
FALSO caso contrário.Para obter as informações sobre o erro ao chamar GetLastError () function.
Parâmetros:

§ Nome - Nome do objeto;


§ prop_id - propriedades identificador objeto (um objeto de propriedades é indicado);
§ Valor - novo valor do imóvel indicado.
Todos os objetos gráficos podem ter um texto descritivo. O texto descrição de cada objeto está
disponível para um usuário e podem ser alteradas a partir de um objeto ou em uma barra propriedades
maneira programada. Para OBJ_TEXT e OBJ_LABEL esta descrição é o seu principal conteúdo e e
semper é exibido como uma linha de texto, texto descrições de outros objetos são exibidos perto do
objeto, se a opção "Mostrar descrições objeto" é habilitado na janela propriedades de um símbolo
(F8). Para alterar o texto descrição é utilizada a seguinte função:
ObjectSetText () Função
bool ObjectSetText (string name, string texto, int font_size, string font_name =
NULL, text_color color = CLR_NONE)
A função é usada para modificar um objeto descrição. Em caso de sucesso TRUE é retornado, caso
contrário - FALSO. Para obter as informações sobre o erro ao chamar GetLastError ()
function. Parâmetros font_size, font_name e text_color são usados apenas para OBJ_TEXT e
OBJ_LABEL. Para outros tipos de objetos estes parâmetros são ignorados.
Parâmetros:

§ Nome - Nome do objeto;


§ Texto - objeto descrição texto;
§ font_size - tamanho da fonte em pontos;
§ font_name - font nome;
§ text_color - texto cor.

Permite-nos analisar um exemplo de um Expert Advisor, em que funções de gestão de objetos gráficos
são utilizados.

Problema 32. Usando uma gráfica de um objeto informar sobre negociação utilizador
critérios definidos com base nos valores MACD.

MACD é muitas vezes utilizado pelos comerciantes para a formação de critérios comerciais. O indicador é
representada por duas linhas - eo principal sinal. A negociação é considerada critérios para ser realizado
quando as linhas cruzadas. Se o indicador principal linha (geralmente cinza histograma) cruza a linha
sinal (normalmente vermelho linha pontilhada) em baixa, isto é um sinal para vender, id para cima -
para comprar. Nos intervalos entre linha travessia encomendas deverão ser realizadas no mercado
aberto, e quando aciona um critério contrário, as ordens devem ser fechadas e opostos após a sua
abertura. Deste modo, quatro tipos de mensagens deve ser preparada: abertura de Compra, Venda de
abertura, exploração de Compra, Venda de exploração.
A este problema todas as mensagens são mutuamente exclusivas, ou seja, a situação em que duas ou
mais mensagens deve ser mostrado é impossível. É por essa razão que, neste caso, um objeto gráfico
pode ser utilizado, o objeto vai estar permanentemente presente no ª tela, mas ela poderá ser alterada
de tempos em tempos. Vamos chamar esse objeto no canto superior direito da janela, na qual a EA irá
operar. Desde o objeto posição não deve ser alterado, é conveniente usar um objeto do tipo OBJ_LABEL,
porque ela se posiciona em relação a uma janela do gráfico.
Como uma solução de um problema com 32 vamos ver a EA grafobjects.mq4 usando o objeto gráfico
OBJ_LABEL:

//------------------------------------------------ --------------------
/ / Grafobjects.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------------
int start () / / Especial função start
(
//------------------------------------------------ --------------- 1 --
Sente-int;
MACD_M_0 dupla, MACD_M_1, / / Main line, 0 e 1 bar
MACD_S_0, MACD_S_1; / / Sinal linha, 0 e 1 bar
Texto string [4]; / / Declarar um array string
color Color [4]; / / Declarar um array de cores
Texto [0] = "Abertura de Compra"; / / Texto para diferentes situações
Texto [1] = "Abertura de Venda";
Texto [2] = "Holding de Compra";
Texto [3] = " Exploração de Venda ";

Cor [0] = DeepSkyBlue; / / Objeto cor ..


Color [1] = LightPink; / / .. para diferentes situações
Cor [2] = Amarelo;
Cor [3] = Amarelo;
//------------------------------------------------ --------------- 2 --
ObjectCreate ( "Label_Obj_MACD", OBJ_LABEL, 0, 0, 0); / / Criando obj.
ObjectSet ( "Label_Obj_MACD", OBJPROP_CORNER, 1); / / Referência canto
ObjectSet ( "Label_Obj_MACD", OBJPROP_XDISTANCE, 10); / / X coordenar
ObjectSet ( "Label_Obj_MACD", OBJPROP_YDISTANCE, 15); / / Y coordenar
//------------------------------------------------ --------------- 3 --
MACD_M_0 = iMACD (NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 0); / / 0 bar
MACD_S_0 = iMACD (NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 0); / / 0
bar
MACD_M_1 = iMACD (NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1); / / 1 bar
MACD_S_1 = iMACD (NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 1); / / 1
bar
//------------------------------------------------ --------------- 4 --
/ / Analisando a situação
if (MACD_M_1 = MACD_S_0) / / Passagem para cima
Sit = 0;
if (MACD_M_1> MACD_S_1 & & MACD_M_0 <= MACD_S_0) / / Passagem em baixa
Sit = 1;
if (MACD_M_1> MACD_S_1 & & MACD_M_0> MACD_S_0) / / Main acima sinal
Sit = 2;
if (MACD_M_1
No bloco 1.2 EA parâmetros são definidos, em particular o elemento valores de Texto [] e Color [] são
fixados. Ainda mais se forem utilizadas para alterar propriedades objeto. No bloco 2.3 do objeto é criado
e alguns valores de suas propriedades estão definidas. Vamos analisar este bloco em detalhes. De
acordo com este código EA linha gráfica de um objeto é criado na janela, na qual a EA é executado:

ObjectCreate ( "Label_Obj_MACD", OBJ_LABEL, 0, 0, 0); / / Criando obj.


"Label_Obj_MACD" valor denota que esse nome é atribuído ao objeto (um nome é atribuído a um objeto
por um programador na sua própria vontade). OBJ_LABEL - é o tipo de objeto identificador, que denota
que o objeto será criado exatamente este tipo de (escolhidos da lista dos tipos possíveis). O primeiro dos
próximos três zeros denota que o objeto é criado na janela principal (a janela principal do gráfico onde é
mostrado, não tem medo do índice 0).
Os próximos dois zeros coordenadas para definir o objeto criado. De acordo com este coordenou o
objeto será desenhado na janela indicada. Neste caso o criado OBJ_LABEL não usa tempo e preço
coordenadas. Observe que em OjectCreate () descrição só tempo e preço coordenadas são
especificadas. Além disso, coordenadas do segundo e do terceiro pares têm valores padrão,embora não
existam valores padrão para o primeiro par de coordenadas. Significa que, embora OBJ_LABEL não
precisam de tempo e preço em todas as coordenadas, alguns valores devem ser especificados em
ObjectCreate () chamada de função. Neste caso zeros são indicados, embora outros valores podem ser
escritos - afinal estes valores será negligenciada durante a configuração das propriedades OBJ_LABEL.
Nos próximos três linhas são alguns dos valores definidos para o objeto chamado anteriormente criou
Label_Obj_MACD:

ObjectSet ( "Label_Obj_MACD", OBJPROP_CORNER, 1); / / Referência canto


ObjectSet ( "Label_Obj_MACD", OBJPROP_XDISTANCE, 10); / / X coordenar
ObjectSet ( "Label_Obj_MACD", OBJPROP_YDISTANCE, 15); / / Y coordenar
Referência para o canto (OBJPROP_CORNER) 1 está definido, o que significa o canto superior direito da
janela principal definido anteriormente. Nas próximas duas linhas distâncias do objeto para um canto
referência são definidas em pixels: distância horizontal (OBJPROP_XDISTANCE) 10 pixels ea distância
vertical (OBJPROP_YDISTANCE) 15 pixels. Na fase da execução deste programa objeto já está criada,
tem o seu único nome definido e propriedades principais.
Para tornar o objeto mostrar um texto necessário, em primeiro lugar, precisamos de calcular o que este
texto deve ser parecida.Para este efeito, em primeiro bloco 3.4 a posição das linhas MACD é detectada
na corrente e anterior bares, em seguida, no bloco 4.5 Sit valor correspondente à situação actual é
calculada (ver também fig. 107 e callstohastic.mq4)
Na próxima linha objeto propriedades dependendo da situação atual estão definidos:

/ / Alterar propriedades objeto


ObjectSetText ( "Label_Obj_MACD", texto [Sit], 10, "Arial", Cor [Sit]);
Como resultado de ObjectSetText () execução descrição é um texto atribuído ao objeto chamado
Label_Obj_MACD - o valor da variável string Texto [Sit]. Este valor será diferente para diferentes
situações, dependendo dos valores Sente-se variável. Por exemplo, se a principal linha atravessa a um
sinal baixo, em bloco 4.5 Sente-se obtém o valor 1, como resultado do objeto gráfico vai ter o texto
descrição contida no texto [1] o elemento matriz, ou seja, "Abertura de Venda ". Outros parâmetros: 10,
"Arial" e cor [Sit] denotar tamanho da fonte, nome e cor para o texto descritivo.
Como resultado da execução dos seguintes EA irá aparecer na janela EURUSD:

Fig. 137. Resultado da EA grafobjects.mq4 operação no momento em que o critério para vender dispara.
Na fig. 137, há uma janela principal e MACD subwindow. Convém notar aqui que, para um normal
funcionamento EA presença deste indicador sobre o símbolo janela não é necessária, porque a EA em
critérios comerciais são calculadas como resultado de uma função técnica indicador execução que não
está relacionado com o indicador exibindo. Aqui é apresentado o indicador visual só para a explicação de
um momento de trocas despoletar quando o critério necessário texto descrição do objeto gráfico é
mostrado. A EA irá operar no modo semelhante em todas as outras combinações das mútuo posição do
indicador linhas cada vez mostrando uma descrição correspondente a uma situação.
Excluindo objetos gráficos

Os peritos analisaram Advisor grafobjects.mq4 tem uma pequena desvantagem. Depois que a EA deixa
de operar, uma gráfica objeto permanecerá na janela do gráfico (sua propriedades permanecerá o
mesmo que no momento não é da sua última mudança). Objetos gráficos não são eliminados
automaticamente. No decurso da negociação, a partir de um certo momento em que a mensagem
"Abertura de Vender" não será válido. A fim de não desinformar uma gráfica de usuário do objeto deve
ser eliminado.
Para apagar um objeto gráfico (independentemente do seu método de criação - programada ou manual)
basta selecioná-lo e pressione a tecla Delete. No entanto, como para a programação, é de notar que um
programa escrito corretamente devem "limpar" a janela quando seu funcionamento é superior. Em
outras palavras, um programa deve conter um bloco onde todos os objetos gráficos criados pelo
programa estão excluídas.
ObjectDelete () Função
bool ObjectDelete (string name)
eliminação de um objeto com o nome indicado. Se um objeto é excluído com êxito, a função retorna
TRUE, caso contrário - FALSO. Para obter as informações sobre o erro ao chamar GetLastError ()
funcionar ..
Parâmetros:

§ nome - nome de um objeto suprimido.

É muito fácil usar ObjectDelete (): basta indicar o nome de um objeto a ser excluído.
Para corrigir a desvantagem de o exemplo anterior, vamos adicionar na EA grafobjects.mq4 a função
especial deinit () contendo a função para excluir objetos:

//------------------------------------------------ --------------- 7 --
int deinit () / / Função Especial deinit
(
ObjectDelete ( "Label_Obj_MACD"); / / Objeto supressão
retorno; / / Sair deinit ()
)
//------------------------------------------------ --------------- 8 --
Agora, durante a execução do objeto chamado EA Label_Obj_MACD serão deletados. Geralmente um
programa pode criar numerosos objetos. Cada uma delas pode ser suprimida, de acordo com o
algoritmo.

Modificando objetos gráficos

Em alguns casos, é necessária a mudança de posição um objeto em um gráfico em uma janela do


programa caminho. Muitas vezes essa necessidade pode ocorrer por causa do surgimento de novos
bares. Por exemplo, em uma negociação critérios EA pode ser formada com base em um canal de
regressão linear, construída sobre uma barra de histórico de um determinado período (por exemplo,
últimos 50 compassos). Se nós simplesmente chamar o objeto "canal de regressão linear" em uma
janela do gráfico e, em seguida, não aceitamos qualquer coisa, ele permanecerá no mesmo lugar onde
foi gráfico posicionado e ele será deslocado para a esquerda enquanto aparecem novos bares. Para
evitar que o objeto de deslocação deve ser redesenhado a cada novo bar. Para o efeito novas
coordenadas devem ser calculadas e passado para o objeto, de acordo com essas coordenadas do
objeto será desenhado em um gráfico viúva.
Para descobrir o que tem propriedades um objeto gráfico no atual momento, a seguinte função deve ser
usada:
ObjectGet () Função
ObjectGet duplo (string nome, int prop_id)
a função retorna o valor do imóvel objeto especificado. Para obter as informações sobre o erro ao
chamar GetLastError () function.
parâmetros:

§ Nome - Nome do objeto;


§ prop_id - imóvel objeto identificador. Pode ser qualquer valor a partir da lista das propriedades
dos objetos.

Novas coordenadas são reportados a um objeto usando o ObjectMove () function.


ObjectMove () Função
bool ObjectMove (string nome, int ponto, datetime time1, price1 duplo)
Alterando uma das coordenadas em um gráfico. A função retorna TRUE em caso de êxito, caso contrário
- FALSO. Para obter informações adicionais ligue para o FetLast Erro () function. Numeração de um
objeto coordenadas começa a partir de 0.
Parâmetros:

§ Nome - Nome do objeto;


§ ponto - coordenar índice (0-2);
§ time1 - novo valor temporal;
§ price1 - preço novo valor.

Problema 33. Criar um programa (um Expert Advisor) apoiar o desenho de um canal
de regressão linear para os últimos 50 bares.

O objeto gráfico "regressão linear canal" usa dois tempos coordenadas. Preço coordenadas (se esses são
especificados no programa) são negligenciadas pelo cliente terminal durante a construção do objeto. O
canal de regressão linear é calculada pelo cliente terminal baseado em dados históricos dos preços e,
portanto, não pode ser mostrado com a exceção de um gráfico. É por isso que a ausência do objeto
obrigatório de preços (do preço negligenciar coordenadas pelo terminal) é objeto constante da própria
propriedade. Th Expert Advisor (moveobjects.mq4) gerir a posição de um objeto gráfico pode ter o
seguinte código:

//------------------------------------------------ --------------------
/ / Moveobjects.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------------
extern int Len_Cn = 50; / / Canal comprimento (barras)
extern Col_Cn = cor laranja; / / Canal cor
//------------------------------------------------ --------------- 1 --
int init () / / Especial função init ()
(
Create (); / / Chamando user-def. func. de criação
retorno; / / Sair init ()
)
//------------------------------------------------ --------------- 2 --
int start () / / Especial função start ()
(
datetime T2; / / segunda vez coordenar
int erro; / / Código de erro
//------------------------------------------------ --------------- 3 --
T2 = ObjectGet ( "Obj_Reg_Ch", OBJPROP_TIME2); / / Solicitando t2 coord.
Erro = GetLastError (); / / Obtendo um código de erro
if (Erro == 4202) / / Se nenhum objeto: (
(
Alerta ( "Regressão canal está a ser gerida",
"\ N Book_expert_82_2. Supressão proibidos.");
Create (); / / Chamando user-def. func. de criação
T2 = Tempo [0]; / / Valor atual de coordenar t2
)
//------------------------------------------------ --------------- 4 --
if (T2! Tempo = [0]) / / Se objeto não está no seu lugar
(
ObjectMove ( "Obj_Reg_Ch", 0, Time [Len_Cn - 1], 0); / / Novo t1 coord.
ObjectMove ( "Obj_Reg_Ch", 1, Time [0], 0); / / Novo t2 coord.
WindowRedraw (); / / redesenhando a imagem
)
retorno; / / Sair start ()
)
//------------------------------------------------ --------------- 5 --
int deinit () / / Função Especial deinit ()
(
ObjectDelete ( "Obj_Reg_Ch"); / / Apagar o objeto
retorno; / / Sair deinit ()
)
//------------------------------------------------ --------------- 6 --
Crie int () / / Usuário-função definida ..
(/ / Criação de objeto ..
datetime T1 = Tempo [Len_Cn - 1]; / / Definir 1a vez coord.
datetime T2 = Tempo [0]; / / Definição 2o tempo coord.
ObjectCreate ( "Obj_Reg_Ch", OBJ_REGRESSION, 0, T1, 0, T2, 0); / / Criação
ObjectSet ( "Obj_Reg_Ch", OBJPROP_COLOR, Col_Cn); / / Cor
ObjectSet ( "Obj_Reg_Ch", OBJPROP_RAY, false); / / Ray
ObjectSet ( "Obj_Reg_Ch", OBJPROP_STYLE, STYLE_DASH); / / Estilo
ObjectSetText ( "Obj_Reg_Ch", "Criado pela EA moveobjects", 10);
WindowRedraw (); / / Imagem redesenhando
)
//------------------------------------------------ --------------- 7 --
O moveobjects.mq4 EA algoritmo que implica que um objeto, uma vez apensa permanecerá no ecrã
durante todo o tempo de execução do programa. Nesses casos, é razoável utilizar uma função definida
pelo usuário (neste caso, é Cria (), bloco 6-7) para criar um objeto, a função pode Ð ¼ ñƒ chamado a
partir do programa quando quiser, quando necessário. Para chamar um objeto coordenadas são
necessários dois tempos (T1 é o de coordenar a borda esquerda do objeto, T2 - a da borda direita):

datetime T1 = Tempo [Len_Cn - 1]; / / Definir 1a vez coord.


datetime T2 = Tempo [0]; / / Definição 2o tempo coord.
Neste exemplo, o direito das fronteiras do objeto deve ser zero sobre a barra, é por isso que o valor de
coordenar o segundo corresponde ao tempo de abertura da barra de zero. As coordenará esquerda é
calculado em função do número de bares estabelecidos por um usuário (variável externa Len_Cn) e é
definida como o tempo de abertura de um bar com o índice correspondente. Por exemplo, se o canal
comprimento é de 50 compassos, coordenar a esquerda será igual ao tempo de abertura de um bar com
o índice 49.
Nas próximas linhas do utilizador-definido Crie função () OBJ_REGRESSION o objeto é criado usando
ObjectCreate (), então criadas as necessárias propriedades do objeto são criados pela ObjectSet ()
função (cores predefinidas por um usuário em uma variável externa, proibidos de chamar como um raio,
estilo da linha - pontilhada). Na linha:

ObjectSetText ( "Obj_Reg_Ch", "Criado pela EA moveobjects ", 10);


descrição é um texto atribuído ao objeto. O que a diferencia da anterior OBJ_LABEL analisados, o texto
de descrição OBJ_REGRESSION não é exibido. O texto descrição de objetos gráficos podem ser
visualizados no objeto da guia Propriedades.Isto é muito conveniente na aplicação prática de
diferenciação entre objetos criados em um programa de maneira aqueles anexado manualmente:

Fig. 138. Comum propriedades do objeto gráfico "regressão linear canal" criado pela
EA moveobjects.mq4.
Aqui está uma função mais utilizada para a redefinição das actuais gráfico:

WindowRedraw (); / / Imagem redesenhando

WindowRedraw () Função
void WindowRedraw ()
A função força reformula o atual quadro. Geralmente ele é usado depois de objeto propriedades sejam
alteradas.
Normalmente, os objetos gráficos são apresentados pelo cliente terminal na sequência da recepção de
novas carrapatos. Esta é a razão pela qual, se não utilizarmos WindowRedraw (), as mudanças nas
propriedades do objeto tornar-se visível para o usuário, na próxima carrapato, ou seja, a exibição é um
carrapato semper tarde. O uso de WindowRedraw () permite-lhe força redesenhar todos os objetos
necessários em um momento, por exemplo, imediatamente após as propriedades foram objeto
alteradas. Num caso geral, se as propriedades de vários objectos são alteradas no programa, é
suficiente para utilizar a função WindowRedraw () apenas uma vez, após a última das propriedades dos
objetos que foram alteradas.
O usuário-função é definida a partir da primeira chamada função especial init (). No momento da
aposição da EA para a janela do símbolo, a execução de init () irá iniciar, o que resulta em que o objeto
gráfico Linear Regression Channel será exibida na janela do símbolo.
Duas situações possíveis são considerados em função do início (): (1) o objeto tenha sido eliminada pelo
utilizador ocasional (blocos 3-4) e (2), é necessário deslocar o objeto para a direita quando uma nova
barra é zero formado (blocos 4-5). Para detectar se o objeto gráfico está disponível no momento actual,
é suficiente apenas para solicitar o valor de uma das suas coordenadas. Se o objeto existe, a função
ObjectGet () irá retornar um certo valor que corresponde com o solicitado e coordenar a função
GetLastError () irá retornar valor zero (ou seja, não ocorreu nenhum erro ao solicitar o Coordenar). No
entanto, se não houver um objeto do nome indicado na janela do símbolo, a função GetLastError () irá
retornar o código de erro 4202, ou seja, nenhum objeto disponível:

T2 = ObjectGet ( "Obj_Reg_Ch", OBJPROP_TIME2); / / Solicitando t2 coord.


Erro = GetLastError (); / / Obtendo um código de erro
Se o erro análise revelou que não eram objeto desse nome, isso significa que o programa deve criá-lo,
depois de ter notificado o usuário sobre ações inadmissíveis (o programa não exclui objetos, isso
significa que o objeto tenha sido excluído pelo usuário) .Esta é a razão pela qual, após ter exibido a
mensagem, o programa solicita ao usuário-definidas anteriormente consideradas Crie função (), o que
resulta em uma nova criação do objeto na janela do símbolo.
Até ao momento da execução do próximo bloco (4-5), o objeto gráfico já foi criada. Para decidir se ela
deve ser movida, você deve saber a posição do objeto no momento atual. Para este efeito, basta
analisar o valor obtido anteriormente de coordenar a primeira do objeto. Se este valor não coincide com
o tempo de abertura zero bar, para atribuir novas coordenadas para o objeto.
As coordenadas são alterados utilizando a função ObjectMove ():

ObjectMove ( "Obj_Reg_Ch", 0, Time [Len_Cn - 1], 0); / / Novo t1 coord.


ObjectMove ( "Obj_Reg_Ch", 1, Time [0], 0); / / Novo t1 coord.
Aqui, pela primeira coordenar (coordenar 0) do objeto chamado Obj_Reg_Ch, o valor do Tempo
[Len_Cn-1], serão fixados, que, para coordenar o segundo (coordenar 1)-Time [0]. Os últimos
parâmetros entre aqueles transferidos Para a função ObjectMove () é especificado o parâmetro 0. Este é
o de coordenar os preços que, segundo a descrição da função, devem ser transferidos, mas, neste caso,
será ignorado pelo cliente terminal. Como resultado da execução destas linhas, consideradas as
propriedades do objeto gráfico será alterado. Como resultado da próxima execução da função
WindowRedraw (), o objeto gráfico será redesenhado pela força o cliente terminal - agora, de acordo
com os novos valores das coordenadas.
Assim, na execução da função start (), o objeto gráfico Linear Regression Channel será redesenhado
pelo cliente terminal cada vez quando uma nova barra de formulários, nas suas primeiras carrapato (ver
fig. 139). Após a execução da EA já terminou, o determinado objeto gráfico será eliminada do símbolo
janela durante a execução da função especial deinit () (ie, o programa irá "varrer para fora" seu trabalho
instituídos após o trabalho tenha sido concluído).
Fig. 139. Vendo da regressão linear no Canal da execução da EA moveobjects.mq4.
Em um caso geral, você pode criar e excluir objetos gráficos, de acordo com algumas condições
calculado no programa. Você pode exibir o suporte / resistência linhas (OBJ_TREND), marca o momento
de se aproximar dos eventos importantes com linhas verticais (OBJ_VLINE), indicam as interseções de
várias linhas ou a previsão dos preços movimentos texto utilizando objetos (OBJ_LABEL e OBJ_TEXT),
etc
Deve notar-se separadamente, que, em alguns casos, não há necessidade de usar objetos gráficos. Por
exemplo, se você deseja exibir na tela uma simples uma grande variedade de imagens do tipo (por
exemplo, as setas), você pode usar linhas para este indicador, os seus estilos, em conjunto com o
correspondente curso. Esta abordagem vai te livra da necessidade de acompanhar muitos coordenadas
de objetos no programa, ele vai também impedirá que você ocasional supressão de uma imagem (os
sinais que exibem linhas indicador pode ser eliminado nem seleccionada nenhuma).
Funções para Trabalhar com os objectos gráficos

Função Síntese Info


ObjectCreate Criando um objeto com o nome predefinido, escreva inicial e coordena o
indicado no gráfico subwindow. número de coordenadas pode ser objeto
de 1 a 3, dependendo do tipo de objeto.Em caso de sucesso a função
retorna VERDADEIRO, FALSO caso contrário.
ObjectDelete Excluindo um objeto com o nome indicado. Em caso de sucesso a função
retorna VERDADEIRO, FALSO caso contrário.
ObjectDescription A função retorna o objeto descrição. Ela retorna para objetos do
OBJ_TEXT e OBJ_LABEL tipos de texto exibido na esses objetos.
ObjectFind A função procura o objeto do nome indicado. A função retorna o índice
da janela, ao qual pertence o objeto pesquisado. Em caso de falha, a
função retorna -1.
ObjectGet A função retorna o valor do imóvel dado do objeto.
ObjectGetFiboDescription A função retorna a descrição do objeto Fibo nível. O montante dos níveis
depende do tipo do objeto que pertence ao grupo de Fibo objetos. O
montante máximo dos níveis é de 32.
ObjectGetShiftByValue As funções calcula e retorna o número bar (a mudança em relação ao
atual bar) para a determinado preço. O bar número é calculado
utilizando uma equação linear para a primeira e segunda coordenadas. É
utilizado para as linhas das tendências e objectos semelhantes.
ObjectGetValueByShift As funções calcula e retorna o valor de um determinado preço bar (a
mudança em relação ao atual bar). O preço valor é calculado utilizando
uma equação linear para a primeira e segunda coordenadas. É utilizado
para as linhas das tendências e objectos semelhantes.
ObjectMove Mudar um objeto de coordenadas em um gráfico. Objects can have from
one to three anchoring points according to the object type. In case of
success, the function returns TRUE, otherwise FALSE.
ObjectName The function returns the object name according to its order number in
the list of objects.
ObjectsDeleteAll Deleting all object of the indicated type in the indicated chart
subwindow. The function returns the number of deleted objects.
ObjectSet Changing properties of an indicated object. In case of success the
function returns TRUE, otherwise FALSE.
ObjectSetFiboDescription The function assigns a new value to Fibonacci level. Number of levels
depends on Fibonacci object type. Maximal number of levels is 32.
ObjectSetText Changing object description. For objects OBJ_TEXT and OBJ_LABEL this
description is displayed on a chart as a text line. In case of success the
function returns TRUE, otherwise FALSE.
ObjectsTotal Returns the total number of objects of the indicated type on a chart.
ObjectType The function returns the type of an indicated object.

For the detailed description of these and other functions, please refer
to Documentation at MQL4.community , MetaQuotes Software Corp. website or to "Help" section in
MetaEditor.
Operações com Gráficos

No seu trabalho prático, normalmente um comerciante abre em uma janela do símbolo várias janelas
que exibem indicadores.Não existem limitações à colocação indicadores, que podem ser anexados em
qualquer seqüência. O montante de subwindos um símbolo na janela não é limitada quer. Subwindow
Cada um tem o seu número. A janela principal contém uma tabela dos preços está permanentemente
disponível, sendo o seu número 0. Cada indicador subwindow tem um número, também. As janelas
estão numerados em uma seqüência simples - eles são numerados pela sua exibição na janela do
símbolo, de cima para baixo: o indicador subwindow mais próxima à janela principal tem o número 1, o
próximo tem um menor número 2, o próximo tem um número 3 , Etc
Fig. 140. Subwindow localizações na janela do símbolo.
A quantidade de janelas pode ser facilmente calculada utilizando a seguinte função:

int WindowsTotal ()
A função retorna o valor do indicador janelas situadas no gráfico, incluindo a principal janela do
gráfico. O maior número (dos mais baixos subwindow) semper 1 é inferior ao montante total das janelas
(incluindo a janela principal numerados como 0) na janela do símbolo. Se, na situação mostrada na
Fig. 140, apelamos para a execução do WindowsTotal função () a partir de qualquer aplicação, o valor
devolvido será igual a 3, enquanto o maior número (dos mais baixos subwindow) é 2.
A numeração sequencial descrito acima é mantido, se um novo indicador subwindow é adicionado a um
ou subwindow existente é excluído do símbolo janela. Se você adicionar um novo subwindow, será
exibido abaixo todas as outras janelas e seu número 1 é mais do que da última janela acima dela. Se
você excluir uma subwindow a partir da janela do símbolo, todas as janelas abaixo dela, será
automaticamente renumeradas - o número de cada um deles será diminuído em 1.
Em MQL4, é possível criar objetos gráficos (e mudar suas propriedades) em qualquer uma das janelas
existentes. Para este efeito, em função da ObjectCreate () o parâmetro 'janela' está fornecido, segundo
a qual um objeto é criado na subwindow dado o símbolo da janela. O número atual do subwindow pode
ser calculado utilizando a seguinte função:

int WindowFind (string name)


A função retorna o número do gráfico subwindow que contém o indicador denominado como «nome»,
se esta tiver sido encontrado. Caso contrário, ele retorna -1. A função também irá retornar -1, se um
indicador pesquisas personalizadas para si próprio durante a inicialização init ().
Parâmetros:
nome - nome abreviado do indicador.
A quantidade de janelas em uma janela do símbolo pode mudar a qualquer momento, se o utilizador
elimina um indicador. Esta é a razão pela qual o algoritmo de uma aplicação que suporta monitoramento
de objetos gráficos deve monitorar continuamente o número de janelas, nas quais os indicadores são
exibidos.
Problema 34. Usando objetos gráficos, exibir mensagens informando sobre os dados
recebidos a partir de dois indicadores. Se o indicador correspondente é anexado ao
símbolo janela de exibição gráfica do objeto na janela do indicador. Caso contrário,
exibi-la na janela principal.

Para resolver o problema, vamos escolher indicadores RSI e Momentum. O algoritmo geral de
construção de um Expert Advisor se resume a isto. Na função init (), você pode especificar textos a
serem exibidos na tela de acordo com o indicador leituras, ou seja, fazer os cálculos para ser executado
apenas uma vez no programa. No início da função (), você deve calcular o indicador leituras, detectar a
necessária disponibilidade de janelas e seus números e, em seguida, de acordo com a situação, exibir
uma mensagem em um ou outro ou outra subwindow. Na execução da função deinit (), É necessário
eliminar todos os objetos gráficos criados durante o trabalho de seu programa. Abaixo está o chamado
EA charts.mq4 que controla objetos gráficos nas janelas de um símbolo janela.

/ / --------------- --------------------------------- ---------------------


--------------
/ / Charts.mq4
/ / O código deve ser usado apenas para fins educacionais .
//--------------- --------------- ------------------ ----------------------
-------- 1 --
Win_Mom_old int = 0, / / Old número de subwindow Momento.
Win_RSI_old = 0; / / Old número de subwindow LER
color Color [5]; / / Declaração da cor do array
Texto string [5]; / / Declaração da string array
//------------------------------ --------------- --- ----------------------
-------- 2 --
int init () / / Especial função init ()
(
Win_RSI_old = 0; / / Técnica momento
Win_Mom_old = 0; / / Técnica momento

Texto [0] = "LER (14) é inferior a 30. Comprar"; / / Textos para situações
LER
Texto [1] = "LER (14) é superior a 70. Sell"; / / Textos para situações LER
Texto [2] = "LER (14) está entre 30 e 70"; / / Textos para situações LER
Texto [3] = "Momentum (14) está em crescimento"; / / Textos para situações
Momentum
Texto [4] = "Momentum (14) está afundando"; / / Textos para situações
Momentum
Cor [0] = DeepSkyBlue; / / Objeto de cor ..
Color [1] = LightPink; / / .. situações diferentes ..
Cor [2] = laranja; / / .. do indicador RSI
Cor [3] = Cor [0]; / / As mesmas cores de Momentum
Color [4] = Cor [1]; / / As mesmas cores de Momentum
Create_RSI (0); / / Criação do primeiro objeto
Create_Mom (0); / / Criação do segundo objeto
Main (); / / Chamada para user-defined função
retorno; / / Sair init ()
)
//--------------------------------------------- --- ------------ ----------
-------- 3 --
int start () / / Especial função 'iniciar'
(
Main (); / / Chamar a atenção para o usuário-função definida
retorno; / / Sair start ()
)
//------------------------------------------------ ------------ -----------
---- --- 4 --
int deinit () / / Função Especial deinit ()
(
ObjectDelete ( "Obj_RSI"); / / Supressão do objeto
ObjectDelete ( "Obj_Mom"); / / Supressão do objeto
retorno; / / Sair deinit ()
)
/ / - --------------- -------------------------------- --------------------
---------- 5 --
int Main () / / Usuário-função definida
(
int / / Integer variáveis
Win_RSI_new = 0, / / Novo número da subwindow LER
Win_Mom_new = 0, / / Novo número da subwindow Momento.
Ind_RSI, Ind_Mom; / / Índices para situações
Duplo / / Real variáveis
RSI, / / Valor do RSI na barra 0
Mom_0, Mom_1; / / Valor do Mom. em barras 0 e 1
/ / - --------------- -------------------------------- --------------------
---------- 6 --
RSI = iRSI (NULL, 0, 14, PRICE_CLOSE, 0); / / RSI (14) na barra de zero
Ind_RSI = 2; / / RSI entre os níveis 30 e 70
if (RSI <30) Ind_RSI = 0; / / RSI, na parte inferior. Para comprar
if (LER> 70) Ind_RSI = 1; / / RSI no topo. Para vender
//---------------- --------------- ----------------- ----------------------
-------- 7 --
Win_RSI_new = WindowFind ( "LER (14)"); / / Janela número de indicador RSI
if (Win_RSI_new ==- 1) Win_RSI_new = 0; / / Se não houver ind. e, em
seguida, a janela principal
if (Win_RSI_new! = Win_RSI_old) / / Eliminado ou colocação ..
(/ / .. Janela do indicador RSI
ObjectDelete ( "Obj_RSI"); / / Supressão do objeto
Create_RSI (Win_RSI_new); / / Criar um objeto na janela desejada
Win_RSI_old = Win_RSI_new; / / Lembre-se desta janela
) / / Altere a descrição textual:
ObjectSetText ( "Obj_RSI", texto [Ind_RSI], 10, "Arial", Cor [Ind_RSI]);
//------------------------------- --------------- -- ----------------------
-------- 8 --
Mom_0 = iMomentum (NULL, 0, 14, PRICE_CLOSE, 0); / / Valor de zero bar
Mom_1 = iMomentum (NULL, 0, 14, PRICE_CLOSE, 1); / / Valor anterior sobre a
barra
if (Mom_0> = Mom_1) Ind_Mom = 3; / / Indicador linha sobe
if (Mom_0 <Mom_1) Ind_Mom = 4; / / Indicador linha cai
//---------------------------------------------- -- ------------- ---------
-------- 9 --
Win_Mom_new = WindowFind ( "Momentum (14)"); / / Janela do indicador número
Momen
if (Win_Mom_new ==- 1) Win_Mom_new = 0; / / Se não houver ind. e, em
seguida, a janela principal
if (Win_Mom_new! = Win_Mom_old) / / Eliminado ou colocação ..
(/ / .. a janela do indicador Momentum
ObjectDelete ( "Obj_Mom"); / / Supressão do objeto
Create_Mom (Win_Mom_new); / / Criar um objeto na janela desejada
Win_Mom_old = Win_Mom_new; / / Lembre-se desta janela
) / / Altere a descrição textual:
ObjectSetText ( "Obj_Mom", texto [Ind_Mom], 10, "Arial", Cor [Ind_Mom]);
//------------------------------------------------ --------------- --------
----- - 10 --
WindowRedraw (); / / redesenhando a imagem
retorno; / / Sair do usuário-função definida
)
/ / - --------------- -------------------------------- --------------------
--------- 11 --
int Create_RSI (int Win) / / Usuário-função definida
(/ / .. De criação de um objeto
ObjectCreate ( "Obj_RSI", OBJ_LABEL, Vitória, 0, 0); / / Criação de um
objeto
ObjectSet ( "Obj_RSI", OBJPROP_CORNER, 0); / / Ancoragem de um ângulo
ObjectSet ( "Obj_RSI", OBJPROP_XDISTANCE, 3); / / Coordenada X
if (Win == 0)
ObjectSet ( "Obj_RSI", OBJPROP_YDISTANCE, 20); / / Coordenada Y
diferente
ObjectSet ( "Obj_RSI", OBJPROP_YDISTANCE, 15); / / Coordenada Y
retorno; / / Sair do usuário-função definida
)
//---------------- --------------- ----------------- ----------------------
------- 12 --
int Create_Mom (int Win) / / Usuário-função definida
(/ / Criando um objeto ..
ObjectCreate ( "Obj_Mom", OBJ_LABEL, Vitória, 0, 0); / / Criação de um
objeto
ObjectSet ( "Obj_Mom", OBJPROP_CORNER, 0); / / Ancoragem de um ângulo
ObjectSet ( "Obj_Mom", OBJPROP_XDISTANCE, 3); / / Coordenada X
if (Win == 0)
ObjectSet ( "Obj_Mom", OBJPROP_YDISTANCE, 5); / / Coordenada Y
diferente
ObjectSet ( "Obj_Mom", OBJPROP_YDISTANCE, 15); / / Coordenada Y
retorno; / / Sair do usuário-função definida
)
//------------------------------- --------------- -- ----------------------
------- 13 --
Antes de analisar o código acima, temos de explicar as particularidades da operação do programa. Um
objeto gráfico, uma vez criada (neste caso, uma exibindo um texto) é suposto estar presente na tela de
forma contínua. Sua descrição textual é presumir que caracterizam a situação. O conteúdo da descrição
textual deve ser alterado na execução da função start (), em todos os carrapatos. Ao mesmo tempo, ao
alternar entre os prazos para a janela, para o qual está anexado AE, o programa passa através das
seguintes fases: deinit (), init (), (a aguardar um carrapato), e iniciar (). Se o objeto é criado durante a
primeira hora do início da execução (), então, a cada momento em que a mudança para um outro
calendário, um determinado período de tempo irá caducar antes de aparecer o objeto, sendo o período
de tempo igual ao de aguardar a próxima carrapato. Isto é muito incómodo, sobretudo, quando muitas
vezes são comutados entre os calendários.
Em um programa construído adequadamente, a necessária mensagens são exibidas na tela, no
momento de fixar a janela do programa para o símbolo ou no momento da comutação temporal (ou
seja, antes de um novo carrapato rendimentos). Para este efeito, em regra, é necessário realizar todas
as ações a serem realizadas em cada carrapato, no lançamento da função especial iniciar () na fase da
execução da função especial init (). A fim de não repetir o mesmo código de programa diferentes
funções especiais, o código pode ser organizado como uma função separada. Para esse efeito, a EA
contém o user-defined função principal (). Ela é chamada para ser executado logo na fase de
inicialização (blocos 2-3) e em cada carrapato durante os trabalhos futuros da EA (blocos 3-4).
No programa (bloco 11-13), existem mais duas funções definidas por usuários - Create_RSI () e
Create_Mom () destinados à criação e alteração das propriedades do objeto. Na execução da função init
(), o necessário objetos são criados usando essas funções. A chamada para a função principal () resulta
em propriedades necessárias para conferir os objetos (os objetos desejados com a descrição da cor
desejada são exibidos na janela desejada).
Vamos considerar a função principal () (bloco 5-11) em mais detalhes. No bloco 6.7, as leituras do
indicador RSI são calculados.Dependendo se o fim da linha indicador é superior a 70, abaixo de 30, ou
dentro do intervalo entre esses índices, um ou outro valor será atribuído à variável Ind_RSI. Em seguida,
esse valor é usado como um índice de arrays Color [] e texto [] (em bloco 7-8) para alterar as
propriedades do objeto gráfico do nome "Obj_RSI".
Bloco 7-8. O número de LER janela é calculada na linha:

Win_RSI_new = WindowFind ( "LER (14)"); / / Janela número de indicador RSI


O valor da seqüência LER (14) é usado como parâmetro os transferidos. Este é o nome abreviado do
indicador, o número dos que devem ser detectados. Neste caso, toda a seqüência de caracteres na linha
determinada, incluindo parênteses e algarismos, compõe o nome. Deve-se notar que, no caso geral,
pode haver vários indicadores do mesmo tipo na janela do símbolo, por exemplo, LER (14), LER (21) e
LER (34). Cada um destes indicadores subwindow exibindo tem o seu próprio número. Esta técnica é por
isso que os indicadores são desenvolvidos de forma a que cada um deles faz o seu nome abreviado de
acordo com os valores predefinidos de parâmetros ajustáveis. O nome abreviado de cada indicador
técnico, coincide com o mostrado no canto superior esquerdo da sua subwindow (o nome abreviado de
um indicador podem ser personalizadas criadas pelo programador usando a função IndicatorShortName
()).
Se o indicador está pesquisada não colocou na janela do símbolo, a variável Win_RSI_new (o número do
subwindow, na qual este objecto deverá ser exibida no momento atual) terá o valor de -1, ou seja, não-
existente janela. Neste caso, o programa implica a exibição gráfica do objeto na janela do gráfico
principal, cujo número é semper 0:

if (Win_RSI_new == - 1) Win_RSI_new = 0; / / Se não houver ind. e, em


seguida, a janela principal
Durante as suas operações, o usuário pode colocar um indicador em falta ou apagar uma existente. A
fim de informar-se sobre quais as acções que devem ser realizados, o programa usa variáveis globais
Win_RSI_old e Win_Mom_old. O valor de cada variável é o número do subwindow, em que o objeto
tenha sido previamente criado. Se os valores das variáveis Win_RSI_new e Win_RSI_old não
coincidirem, isso significa que o indicador janela ou é adicionado (que não existia antes) ou suprimido
(ele estava disponível na anterior carrapato). Em ambos os casos, os criados anteriormente objeto deve
ser suprimido, e um novo, deve ser criada na janela desejada:

ObjectDelete ( "Obj_RSI"); / / Supressão do objeto


Create_RSI (Win_RSI_new); / / Criar um objeto na janela desejada
Depois que o objeto tenha sido criado na janela numerados como Win_RSI_new, o valor igual ao
número de esta janela é atribuído à variável Win_RSI_old, ou seja, o programa lembra-se do número da
janela, na qual o objeto gráfico foi criado:

Win_RSI_old = Win_RSI_new; / / Lembre-se desta janela


Se os valores das variáveis Win_RSI_new e Win_RSI_old coincidem, isso significa que é suficiente para
atribuir uma descrição textual para o objeto (que agora é colocada na janela do necessário). Deve
também ser feito, no caso de se criar um novo objeto:

ObjectSetText ( "Obj_RSI", texto [Ind_RSI], 10, "Arial", Cor [Ind_RSI]);


Cálculos similares são feitas para os outros subwindow, indicador de que a Momentum (blocos de 8 a
10). Ao final da função principal (), todos os objetos gráficos disponíveis são redesenhadas como um
resultado da execução do WindowRedraw ().
É fácil ver que o programado controle sobre objetos gráficos em janelas implica a utilização de variáveis
globais (você também pode usar 'estáticos'). Nesses casos, quando codifica um programa, você deve
pagar uma atenção especial aos valores que podem ser tomadas pelas variáveis globais em situações
diferentes e que tudo isso poderá resultar polegadas No programa acima considerados, variáveis globais
são zeroized na função init () :

Win_RSI_old = 0; / / Técnica momento


Win_Mom_old = 0; / / Técnica momento
Estas linhas estão incluídas no programa, devido ao fato de que perdem os seus valores variáveis
globais, apenas se o usuário tiver sido interrompido a execução do programa aplicativo na janela do
símbolo. No entanto, se o usuário tiver ajustado ou variáveis externas ao calendário comutada, o
programa sofre deinitialization ea conseqüente inicialização, os valores das variáveis globais sejam
salvos.
Vamos considerar as operações do programa que não contêm essas linhas. Suponha, ambos os
indicadores, com o subwindow números 1 e 2, respectivamente, foram colocadas na janela, símbolo do
momento em que o usuário muda o calendário. No exemplo considerado, quando os deinitializing
programa, os objetos gráficos são eliminados. Na execução da função especial init (), os objetos são
criados na janela do zero. Em seguida, na execução da função principal (), em blocos 7.8 e 9.10, o
programa compara o número obtido da janela, na qual os objetos devem ser colocados, bem como o
número da janela, na qual o objetos estavam no anterior carrapato. Na verdade, o objeto já tenha sido
colocado na janela do zero, mas os valores das variáveis globais vão dizer para os outros resultado: o
seu número será 1 e 2. Como resultado, os objectos gráficos permanecerá na janela principal, até que o
usuário apaga reattaches e os indicadores correspondentes. Tal como para prevenir estes
desenvolvimentos indesejáveis, o programa implica nulling das variáveis globais na execução da função
init (). Desta forma, os valores dessas variáveis são feitos corresponder-se com a situação.
Como resultado da execução da EA charts.mq4, as seguintes combinações de janelas e objetos gráficos
mostrados podem aparecer:

Fig. 141. Exibindo objetos gráficos nas janelas de um símbolo janela.


Se existirem indicadores tanto na janela do símbolo, o correspondente objetos gráficos serão mostrados
em suas janelas. Se não houver um destes indicadores é colocado e, em seguida, ambos os objetos
serão criados pelo programa na janela principal.Adicionando ou supressão de qualquer indicador, o
nome das quais é processado no programa, irá resultar na deslocação do objeto gráfico correspondente
em necessárias à janela. Adição ou exclusão de outros indicadores a partir da janela do símbolo não irá
implicar quaisquer consequências.
Deve notar-se separadamente, que a alternativa de excluir um objeto pela gráfica do usuário não é
considerado neste programa.Um programa utilizado na sua prática comercial deve conter a análise dessa
situação, com a posterior restauração do objeto (veja a solução do problema 33).

Utilizado em Operações com funções Gráficos

Função Síntese Info


HideTestIndicators A função coloca uma bandeira de esconder os indicadores chamado pelo
Expert Advisor. Ao abrir o gráfico após análise, os indicadores marcados
com a bandeira escondendo não será mostrado no ensaio gráfico. Antes
de cada chamada, o indicador é marcado com a bandeira escondendo
atualmente definido (apenas os indicadores que são chamados
directamente a partir da EA em ensaio pode ser exibido no teste gráfico).
Período Ela devolve o valor do montante do período minutos para o atual quadro.
RefreshRates Atualizando dados da predefinidos timeseries variáveis e matrizes. Esta
função é utilizada, quando um EA ou um script cálculo foi durante muito
tempo e precisa atualizar dados. Retorna TRUE, se a actualização tenha
êxito. Caso contrário, retorna FALSE. Os dados podem permanecer
desatualizados apenas se eles correspondem com o estado atual do
cliente terminal.
Símbolo Ele retorna uma linha de texto com o nome do atual símbolo.
WindowBarsPerChart A função retorna a quantidade de bares montagem na janela do gráfico
atual.
WindowExpertName Ela retorna o nome da execução EA, script, personalizado ou indicador de
biblioteca, dependendo da MQL4 programa, a partir da qual esta função
tenha sido chamado.
WindowFind Ele retorna o número do gráfico subwindow que contém o indicador com
o nome indicado 'nome', se tiver sido encontrado. Caso contrário, ele
retorna -1. WindowFind () retorna -1, se o indicador está pesquisando
personalizado para si próprio durante a inicialização init ().
WindowFirstVisibleBar A função retorna o número da primeira barra visível na janela da tabela
atual. Você deve considerar que o preço bares estão numerados em uma
ordem invertida, a partir da última para a primeira. O atual bar, que é o
último no preço matriz, tem índice 0. O bar tem mais antigo índice Barras-
1. Se o número da primeira barra é visível 2 ou mais menos do que a
quantidade de barras visível no gráfico, isto significa que a janela do
gráfico não está completo e há um espaço para a direita.
WindowHandle Ela retorna a janela para lidar com a janela que contém o dado gráfico.
Se nenhum símbolo gráfico com o calendário é aberto e, no momento da
chamada de função, ele retorna 0.
WindowIsVisible Retorna TRUE, se o gráfico é visível subwindow. Caso contrário, retorna
FALSE. O gráfico subwindow chan estar escondido devido às propriedades
do indicador visibilidade anexados a ela.
WindowOnDropped Ela retorna o índice da janela, na qual a EA, um script ou um costume
indicador foi descontinuado.Este valor será verdade, só se os EAs,
indicadores e scripts personalizados são anexados usando uma rato (a
tecnologia de "arrastar e largar '). Para os indicadores personalizados
sendo inicializado (chamada a partir da função init ()), este índice não é
definido. O índice é devolvido o número da janela (0 é a principal janela
do gráfico, indicador janelas são numerados começando por 1), em que o
indicador está trabalhando personalizado. Durante a inicialização, um
costume indicador pode criar o seu ganha nova subwindow, e seu
número será diferente do da janela, na qual o indicador foi realmente
caiu.
WindowPriceMax Ela devolve o valor máximo da escala vertical do dado subwindow da
actual tabela (0 é a principal janela do gráfico, indicador janelas são
numerados começando por 1). Subwindow Se o índice não for
especificado, o valor máximo da escala dos preços dos principais Gráficos
janela será devolvido.
WindowPriceMin Ela mostra o valor mínimo da escala vertical do dado subwindow da
actual tabela (0 é a principal janela do gráfico, indicador janelas são
numerados começando por 1). Subwindow Se o índice não for
especificado, o valor mínimo da escala dos preços dos principais Gráficos
janela será devolvido.
WindowPriceOnDropped Ela devolve o valor de preço em um gráfico ponto, em que um EA ou um
script ter sido descontinuado. O valor será verdade, só se a EA ou o script
foram movidas usando uma rato (a tecnologia de "arrastar e largar ')
. Este valor não está definido para indicadores personalizados.
WindowRedraw Ela reformula o atual gráfico compulsivamente. A função é normalmente
utilizada após o objeto propriedades foram alteradas.
WindowScreenShot Ele salva a exibição do actual gráfico em um arquivo GIF. Caso não o faça
uma captura de tela, ele retorna FALSE.
WindowTimeOnDropped A função retorna um valor com o tempo gráfico ponto, em que um EA ou
um script ter sido descontinuado. O valor será verdade, só se a EA ou o
script foram movidas usando uma rato (a tecnologia de "arrastar e largar '
). Este valor não está definido para indicadores personalizados.
WindowsTotal A função retorna a quantidade de janelas do indicador no gráfico,
incluindo a principal janela do gráfico.
WindowXOnDropped Ela devolve o valor de X em pixels para coordenar o aspecto gráfico da
janela do cliente na área, onde um EA ou um script foram
abandonadas. O valor será verdade, só se a EA ou o script foram movidas
usando uma rato (a tecnologia de "arrastar e largar ').
WindowYOnDropped Ela devolve o valor de Y em pixels para coordenar o aspecto gráfico da
janela do cliente na área, onde um EA ou um script foram
abandonadas. O valor será verdade, só se a EA ou o script foram movidas
usando uma rato (a tecnologia de "arrastar e largar ').

Para a descrição detalhada destas e de outras funções, é favor consultar


a documentação em MQL4.community, MetaQuotes Software Corp site ou para a "Ajuda" na seção
MetaEditor.
Funções String
O mais comum com a seqüência funcionamento valores, além (concatenação), foi discutido
na Operações e Expressões(Problema 3) seção. Em alguns casos, há necessidade de realizar outros
cálculos relacionados com a corda valores. MQL4 tem um número de seqüência funções para trabalhar
com os valores do tipo string. Vamos considerar o uso de alguns deles através do exemplo a seguir.

Problema 35. Cor dos últimos 100 bares do castiçal gráfico da seguinte forma: preto
castiçais em vermelho, branco castiçais em azul.

Um candelabro pode ser colorido usando duas linhas: uma linha fina deve sobrepor um candelabro de
modo que o mesmo abrange todas as sombras, enquanto uma espessa linha deverá preencher um
castiçal corpo. Neste caso, não podemos usar as linhas de um costume indicador, pois as linhas
indicadas deve ser vertical, ou seja, construída usando duas coordenadas (coordenadas com o mesmo
tempo), enquanto indicador arrays nos permitem armazenar apenas um valor fixado em correspondência
com cada compasso. Então, surge a solução do problema exibindo uma série de single-tipo OBJ_TREND
objetos que diferem em suas coordenadas e estilo da linha ea cor (ver gráficos Objects), em um gráfico
dos preços.
Neste caso, a EA é utilizado como um programa aplicativo, mas, em geral, o algoritmo pode ser
implementado em um indicador personalizado. Como um todo, o algoritmo é claro. O plano deve ser
colorido pela primeira vez, logo que este está ligado ao símbolo janela (durante a execução do init ()). O
programa deve monitorar possíveis alterações na localização de objetos gráficos (usuário pode mover ou
apagar acidentalmente um deles), com todos os carrapatos próximos, e restaurá-los, se
necessário. Todos os objetos criados pelo programa deve ser eliminado, logo que termine o programa
operacional (deinit ()).
Um utilizador pode criar outros objetos em uma janela enquanto símbolo da EA está a trabalhar, por
exemplo, colocar o canal de desvio-padrão, Fibo níveis, linhas de apoio, etc Então, o algoritmo que nos
permite distinguir user-criado programa e-criada objetos devem ser implementadas no programa. Isto é
particularmente importante quando se encerra o programa: é necessário apenas remover o programa
criou-objetos, enquanto os objetos criados por usuários devem permanecer inalterados. Cada objeto
gráfico tem as suas próprias propriedades que geralmente podem coincidir. A única característica de
identificar qualquer objeto é seu único nome (o uso dos mesmos nomes é proibida).
É recomendado para introduzir a informação útil no nome do objeto quando escrevo isso, então será
possível detectar a localização e as propriedades do objeto. Por exemplo, um objeto nome pode conter
um prefixo que diferencia um programa-objeto criado a partir de outros. Neste caso, é "Paint_". Além
disso, é necessário diferenciar o "utilizador-definido" objetos de qualquer outro, também. Ao mesmo
tempo uma simples numeração (Paint_1, Paint_2) não podem ser utilizados. Usando esse método de
objetos numeração, você não pode compreender, no qual o objeto Paint_73 barra deve ser exibido. O
bar que possui o índice Paint_73 irá buscar o índice Paint_74, quando surge um novo bar, quando um
outro índice Paint_75 nova barra vem, etc Nesse caso, seria necessário excluir e recriar todos os objetos
em cada novo bar. Essa solução (embora isso seja possível) é, obviamente, muito acidentado e caro.
Cada objeto criado deve ter o seu tempo com coordenadas que corresponde ao momento da abertura
bar. Além disso, duas linhas devem ser exibidos em cada bar - uma linha fina e uma linha grossa. É mais
confortável para representar os nomes dos objetos criados por um programa como o seguinte:
Object name = Paint_2_2007.03.22 16:40, aqui:
Paint_ - prefixo que diferencia os objetos criados pelo programa;
2_ - quer número de objetos que são exibidos em uma barra (valor 1 ou 2 é possível);
2007.03.22 16:40 - coordenar tempo que caracteriza o unívoca barra o objeto é exibido no.
Paint_ e 2_ são os valores das variáveis e Prefixo Nom_Lin, respectivamente. As coordenará tempo pode
ser obtido para cada barra de transformação em um valor datetime um valor de seqüência usando a
transformar funções:
TimeToStr () Função
string TimeToStr (datetime valor, int mode = TIME_DATE | TIME_MINUTES)
A função transforma os valores que contêm tempo (em segundos) caducada desde 01.01.1970
(valor datetime) em uma seqüência de caracteres de formato especificado (string valor).
Parâmetros:
valor - o tempo em segundos desde 00:00 expirava em 1 de janeiro de 1970;
modo - um modo de saída de dados adicionais. Pode ser um simples ou combinados uma bandeira:
TIME_DATE obtém o resultado no "yyyy.MM.dd" forma;
TIME_MINUTES obtém o resultado na "hh: mi" forma;
TIME_SECONDS obtém o resultado na "hh: mi: ss" formulário.

Vamos considerar a EA strings.mq4 que gere objetos para colorir de velas e ver como o TineToStr () é
utilizado neste programa:

//------------------------------------------------ --------------------
/ / Strings.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------- 1 --
Quant_Bars extern int = 100; / / Número de barras
datetime Time_On;
string Prefix = "Paint_";
//------------------------------------------------ --------------- 2 --
int init () / / Spec. função init ()
(
int Ind_Bar; / / Bar índice
Time_On = Tempo [Quant_Bars]; / / Hora do primeiro colorir
for (Ind_Bar = Quant_Bars - 1; Ind_Bar> = 0; Ind_Bar -) / / Barras ciclo
(
Crie (Ind_Bar, 1); / / Desenha uma linha fina
Crie (Ind_Bar, 2); / / Desenha uma linha grossa
)
WindowRedraw (); / / Imagem redesenhando
retorno; / / Sair init ()
)
//------------------------------------------------ --------------- 3 --
int start () / / Spec. função start ()
(
datetime T1, T2; / / 1 hora e 2 coordenadas
int erro, Ind_Bar; / / Código de erro ea barra de índice
dupla P1, P2; / / 1 e 2 coordenadas preço
color Col; / / Cor do objeto criado
//------------------------------------------------ --------------- 4 --
for (int linha = 1; Line <= 2; Line + +) / / Linha tipo ciclo
(
string Nom_Lin = Linha + "_"; / / String com o número da linha
/ / String Nom_Lin = DoubleToStr (Linha, 0 )+"_";// Pode ser tão
for (Ind_Bar = 0;; Ind_Bar + +) / / Bar do ciclo
(
//------------------------------------------------ --------------- 5 --
datetime T_Bar = Tempo [Ind_Bar]; / / Bar abertura vez
if (T_Bar <Time_On) break; / / Não cor fora das fronteiras
string Str_Time = TimeToStr (T_Bar); / / Time string
string His_Name = Prefixo Nom_Lin + + Str_Time; / / Nome do Objeto
//------------------------------------------------ --------------- 6 --
T1 = ObjectGet (His_Name, OBJPROP_TIME1); / / t1 coord. query
Erro = GetLastError (); / / Código de erro que recebe
if (Erro == 4202) / / Se não houver um objeto: (
(
Crie (Ind_Bar, Line); / / criando função chamada Objeto.
continuar; / / Para a próxima iteração
)
//------------------------------------------------ --------------- 7 --
T2 = ObjectGet (His_Name, OBJPROP_TIME2); / / t2 coord. query
P1 = ObjectGet (His_Name, OBJPROP_PRICE1); / / p1 coord. query
P2 = ObjectGet (His_Name, OBJPROP_PRICE2); / / p2 coord. query
Col = ObjectGet (His_Name, OBJPROP_COLOR); / / Color query
if (T1! = T_Bar | | T2! = T_Bar | | / / Incorreto coord. ou cor:
(Linha == 1 & & (P1! = Máximo [Ind_Bar] | | P2! = Mínimo [Ind_Bar])) | |
(Linha 2 == & & (P1! Open = [Ind_Bar] | | P2! = Fechar [Ind_Bar])) | |
(Open [Ind_Bar] Fechar [Ind_Bar] & & Col! = Vermelho) | |
(Open [Ind_Bar] == Fechar [Ind_Bar] & & Col! Verde =))
(
ObjectDelete (His_Name); / / Apagar objeto
Crie (Ind_Bar, Line); / / Criar objeto correto
)
//------------------------------------------------ --------------- 8 --
)
)
WindowRedraw (); / / Imagem redesenhando
retorno; / / Sair start ()
)
//------------------------------------------------ --------------- 9 --
int deinit () / / Spec. deinit função ()
(
Name_Del string [1]; / / Array declarando
Quant_Del int = 0; / / Número de objetos a serem apagados
int Quant_Objects = ObjectsTotal (); / / Número total de todos os objetos
ArrayResize (Name_Del, Quant_Objects); / / Necessário array tamanho
for (int k = 0; k <= Quant_Del; i + +) / / Excluir objetos com nomes ..
ObjectDelete (Name_Del [i]); / / .. que a matriz contém
retorno; / / Sair deinit ()
)
//------------------------------------------------ -------------- 10 --
Crie int (int Ind_Bar, int Line) / / Usuário-função definida ..
(/ / Criação de objetos ..
Cor cor; / / cor Objeto
datetime T_Bar = Tempo [Ind_Bar]; / / Bar abertura vez
Abrir dupla O_Bar = [Ind_Bar]; / / Bar aberto preço
Fecho duplo C_Bar = [Ind_Bar]; / / Bar estreita preço
H_Bar duplo = Máximo [Ind_Bar]; / / Bar preço máximo
L_Bar duplo = Mínimo [Ind_Bar]; / / Bar preço mínimo
string Nom_Lin = Linha + "_"; / / Seqüência - Linha número
/ / String Nom_Lin = DoubleToStr (Linha, 0 )+"_";// Pode ser tão
string Str_Time = TimeToStr (T_Bar); / / Seqüência - Aberto tempo.
string His_Name = Prefixo Nom_Lin + + Str_Time; / / Nome do objeto criado
if (O_Bar <C_Bar) Cor = Azul; / / Ao escolher a cor, dependendo ..
if (O_Bar> C_Bar) Cor = Vermelho; / / .. parâmetros da barra
if (O_Bar == C_Bar) = cor verde;
switch (Line) / / Thin ou linha grossa
(
case 1: / / Thin line
ObjectCreate (His_Name, OBJ_TREND, 0, T_Bar, H_Bar, T_Bar, L_Bar);
break; / / Sair do interruptor
case 2: / / Esp line
ObjectCreate (His_Name, OBJ_TREND, 0, T_Bar, O_Bar, T_Bar, C_Bar);
ObjectSet (His_Name, OBJPROP_WIDTH, 3); / / Estilo
)
ObjectSet (His_Name, OBJPROP_COLOR, Cor); / / Cor
ObjectSet (His_Name, OBJPROP_RAY, false); / / Ray
ObjectSetText (His_Name, "objeto é criado pela EA ", 10); / / Descrição
retorno; / / user-defined função Sair
)
//------------------------------------------------ -------------- 11 --
A fim de criar objetos gráficos, o usuário-definidas Crie função () (blocos 10-11) é usada no programa. A
variável Ind_Bar que indica o índice de barra o objeto deve ser criado, e com a Linha, o objeto número
(linha 1 ou 2), são utilizados como parâmetros a ceder nesta função.
Três componentes são usados quando fazem o nome do objeto a ser criado:

string His_Name = Prefixo Nom_Lin + + Str_Time; / / Nome do objeto criado


O valor do prefixo variável é especificada pelo programador na cabeça parte do programa e não é
alterado durante a execução programa:

string Prefix = "Paint_";


O valor da Nom_Lin variável é obtido como resultado de cálculos:

string Nom_Lin = Linha + "_"; / / Seqüência - Linha número


/ / String Nom_Lin = DoubleToStr (Linha, 0 )+"_";// Pode ser tão
Aqui, o valor da variável inteira (no cálculo durante a primeira parte da expressão) é transformado no
tipo do maior prioridade, ou seja, para a string tipo. Como resultado, o Nom_Lin recebe "1_" ou "2_"
valores, dependendo do valor da Linha variável.
Para se calcular o valor da variável Str_Time o TimeToStr () a transformação é função dos dados
utilizados:

string Str_Time = TimeToStr (T_Bar); / / Seqüência - Aberto tempo


Observe que o TimeToStr () função tem valores padrão. Neste caso, estas são esses valores que são
necessárias: "yyyy.MM.dd hh: mi", não há necessidade de usar adicionalmente segundo, porque o prazo
mínimo é igual a 1 minuto.
Nós poderíamos também aplicar o seguinte método de cálculo Str_Time para ser usado no objeto nome:

string Str_Time = T_Bar;


Neste caso, o Str_Time iria obter um valor igual ao número de segundos desde 01.01.1970 caducou. A
fim de ver a diferença, podemos desenvolver um programa que contém o seguinte código:

int init ()
(
string String_Time = TimeToStr (Hora [0]); / / Hora no formato
string String_Sec = Tempo [0]; / / Número de segundos
Alerta ( "String_Time =", String_Time, "String_Sec =", String_Sec);
retorno;
)
A seguinte mensagem (de acordo com o tempo de abertura zero bar) será exibida na tela, como
resultado da execução do programa:

String_Time = 2007.03.22 19:10 String_Sec = 1174590600


A primeira alternativa que é implementado na strings.mq4 EA é um pouco mais informativo, pelo que a
preferência é para ela, neste caso (as alternativas são equivalentes em termos de compor um
algoritmo).
O objeto chamado His_Name é criado na sequência das linhas definidas pelo utilizador-Crie função
(). Ele contém informações sobre a abertura do bar tempo com os parâmetros que correspondem ao
número da "Linha" linha e também a cor dependendo do bar características. O valor do texto descrição é
especificado para cada objeto, "objeto é criado pela EA", como bem.
O Crie () é chamado em função do programa a partir de dois locais: a especial função init a partir de ()
para a criação de objetos inicial e, a partir do início especiais função () para re-criar o objeto, se
necessário, no caso, era suprimidos ou modificados pelo usuário. O objeto nomes no início () (blocos 4-
6) são formadas da mesma forma que em outras partes do programa.
As coordenará do primeiro considerado objeto é definida no block 6-7. Se o objeto não for encontrado,
neste momento, irá ser criado pelo Create () function. E se o objeto existe, as suas outras coordenadas
serão determinadas e os parâmetros da sua correspondência com a barra de propriedades serão
verificadas (blocos 7-8). O objeto será eliminado e recriado (com o mesmo nome) com as propriedades
corretas, caso seja detectado algum desfasamento.
Outro problema é solucionado durante a execução da deinit () Função: é necessário excluir apenas os
objetos que foram criadas pelo programa a partir do agregado de todos os objetos na janela do
símbolo. Esta é realizada em duas fases: na primeira fase, os nomes de todos os objetos que devem ser
memorizados são apagados ao Name_Del [] array, e então elas serão suprimidas em um ciclo
individual. O número total de objetos na janela (incluindo as criadas pelo programa e colocados
manualmente pelo usuário) é calculado pela ObjectsTotal () Função:

int Quant_Objects = ObjectsTotal (); / / Número de TODOS os objetos


O número de barras coloridas está a ser fixado pelo usuário em uma variável externa, ou seja, não se
sabe de antemão quantos objetos devem ser suprimidas. Portanto, a string array que contém os nomes
dos objetos a serem apagados, é declarada com o número de elementos igual a 1. Além disso, seu
tamanho é programaticamente alterada - o número de elementos seja aumentado para o número total
de objetos.

ArrayResize (Name_Del, Quant_Objects); / / Necessário array tamanho


A fim de selecionar os objetos que foram criados pela EA, a deinit () contém a função do ciclo 'para' que
analisa os nomes de todos os objetos.

Obj_Name seqüência ObjectName = (k); / / Busca nome do objeto


O atributo que diferencia "nossos" objetos de todos os outros é o "Paint_" prefixo, com o qual o nome
de cada programa criado-objeto é iniciada. Para analisar um nome objeto, devemos extrair a primeira
parte (neste caso, símbolos 6) A partir da seqüência variável a ser o único nome do objeto; então
devemos comparar este valor com o do Prefixo variável. Se coincidirem, este objeto deve ser
suprimida. Se não, ela não deve ser eliminado.
StringSubstr () Função
StringSubstr corda (string texto, int start, int comprimento = 0)
A função extrai o texto a partir do texto linha a partir da posição especificada. A função devolve a cópia
do texto extraído. Caso contrário, uma seqüência vazia será retornada.
Parâmetros:
Texto - a linha do texto deveria ser extraído de;
iniciar - a posição inicial da subseqüência. Ela pode variar de 0 a StringLen (texto) -1;
comprimento - o comprimento da substring a ser extraídos. Se o valor desse parâmetro é inferior ou
igual a 0 ou até mesmo não é especificado, então o texto será extraída a partir da posição especificada
até o fim da linha.

No exemplo considerado, o texto é extraído o nome do objeto da seguinte forma:

Chefe StringSubstr string = (Obj_Name, 0, 6); / / Extract 6 primeiros


símbolos
Neste caso, os 6 primeiros símbolos são extraídas da Obj_Name variável string iniciando com um a
zero. Observe que a contagem de todos os índices (bares, arrays), as encomendas entradas na lista e
também o número da posição na linha começa com 0, enquanto que a contagem começa com 1
quantificados.
O extraídas substring (um valor de seqüência) é atribuído ao chefe variável string. Se o nome do objeto
(e no próprio objeto), é considerada criada pela EA, o valor do texto extraído será "Paint_". Se outro
nome for analisado, então o valor desejado será diferente. Por exemplo, o valor do texto extraído a
partir do "Channel stdDev 23109" objeto nome será o seguinte: "stdDev", e para o objeto chamado
"Fibo 22800", será "Fibo 2".
Nas linhas subseqüentes, o valor da variável é comparado ao chefe que a variável Prefixo:

if (Chefe == Prefixo) / / O objeto começo ..


(/ / .. com Paint_ é encontrado
Se esses valores são iguais entre si e, em seguida, analisaram o nome do objeto será colocado à matriz
Name_Del [] para os nomes dos objetos a serem excluídos. Na próxima "para o" ciclo, todos os objetos,
os nomes dos que estão contidos pela matriz, será eliminado (note-se em separado que é impossível
eliminar todos os objetos durante o primeiro ciclo, porque, neste caso , O número total de objetos e sua
numeração será alterado de cada vez que o objeto é excluído, o que irá resultar na omissão de alguns
nomes objeto).
O preço gráfico terá a seguinte aparência durante a execução da strings.mq4 EA:
Ð ¸ Ð Ñ. 142. Preço gráfico colorido utilizando objetos gráficos (strings.mq4).
Além dos grupos de objetos que cobrem o preço gráfico, dois outros objetos colocados manualmente
pelo usuário são exibidos, como mostrado na fig. 142; eles são regressão canal e Fibo níveis. Os objetos
criados pela EA será eliminado, assim que estiver concluída a sua execução, e os objetos criados pelo
usuário permanecerá na janela do símbolo. Este resultado é obtido em decorrência do uso da corda
funções no programa. Eles permitem a criar e analisar valores string, incluindo nomes objeto gráfico.

Funções String

Função Breve descrição


StringConcatenate Insere-se uma seqüência de parâmetros e dado a volta dele. Os
parâmetros podem ser de qualquer tipo. O número de parâmetros não
pode exceder 64.
StringFind Substring pesquisando. Ele retorna o número da posição na linha começa
com a substring desejada, ou -1, no caso do substring não for
encontrado.
StringGetChar Ela devolve o valor do símbolo que está situado na posição da linha
especificada.
StringLen Ele retorna o número de símbolos na linha.
StringSetChar Ela devolve a cópia do acordo com a modificação do valor do símbolo na
posição especificada.
StringSubstr Ele extrai o texto que começa na posição especificada na linha do texto. A
função devolve a cópia do texto extraído, se possível. Caso contrário, uma
seqüência vazia será retornada.
StringTrimLeft A função corta o transporte retorno personagens, espaços e tabulação
símbolos a partir da parte esquerda da corda. A função devolve a cópia do
texto modificado, se possível. Caso contrário, uma seqüência vazia será
retornada.
StringTrimRight A função corta o transporte retorno personagens, espaços e tabulação
símbolos a partir da parte direita da corda. A função devolve a cópia do
texto modificado, se possível. Caso contrário, uma seqüência vazia será
retornada.

Data Transformation funções

Função Síntese Info


CharToStr Transformação do código em um único símbolo-símbolo string.
DoubleToStr Transformação do valor numérico em uma seqüência de texto que contém
a representação simbólica do número com precisão o formato
especificado.
NormalizeDouble Arredondamentos com o número do ponto flutuante para a precisão
especificada. O cálculo StopLoss, TakeProfit e também a abrir prcie
encomendas pendentes de valores deverá ser normalizado, de acordo com
a precisão que está armazenado na variável definida Dígitos.
StrToDouble Transformação da cadeia que contém a representação simbólica do
número para o número de "dupla" tipo (dupla-precisão com o formato de
ponto flutuante).
StrToInteger Transformação da cadeia que contém a representação simbólica para o
número do "int" tipo (inteiro).
StrToTime Transformação da cadeia que contém o tempo e / ou a data no
"yyyy.MM.dd [hh: mi]" formato para o número do "datetime" tipo
(número de segundos passaram desde 01.01.1970).
TimeToStr Transformação do valor que contém o tempo expresso em segundos
passaram desde 01.01.1970 para a seqüência das "yyyy.MM.dd hh: mi"
formato.

Para obter a informações detalhadas sobre essas e outras funções, dê uma olhada
na documentação em MQL4.community, emMetaQuotes Software Corp site ou no menu "Ajuda" do
MetaEditor.
Data e Hora

O sistema de comércio on-line Metatrader 4 utiliza as indicações de duas fontes de tempo - o local (PC)
eo tempo do servidor tempo.
Hora local - o tempo que for definido sobre o PC local.
Servidor de tempo - o tempo que for definido no servidor.

TimeLocal () Função
datetime TimeLocal ()
A função retorna o PC local o tempo, expresso em número de segundos desde 00:00 expirava em 1 de
janeiro de 1970. Nota: Na análise, o horário local é modelado e coincide com o último modelá-servidor
conhecido tempo.
A grande maioria dos eventos que ocorrem no cliente terminal são consideradas de acordo com o
servidor de tempo. O tempo de carrapatos próximos, nova barra de início, para abertura e fechamento é
considerado de acordo com o servidor de tempo.Para obter o valor do servidor de tempo que
corresponde com o horário atual, o TimeCurrent () função deve ser usada:
TimeCurrent () Função
datetime TimeCurrent ()
A função retorna o último valor conhecido do servidor de tempo (o tempo da última cotação próximos)
expresso em segundos desde 00:00 expirava em 1 de janeiro de 1970. O cliente terminal atualiza o
tempo de citar a última vinda (em conjunto com outras variáveis do ambiente) antes de iniciar funções
especiais para sua execução. Cada carrapato é caracterizada com o seu próprio valor do servidor de
tempo que pode ser obtida utilizando o TimeCurrent () function. Durante a execução, este valor só pode
ser alterada na sequência da RefreshRates () chamada da função e apenas se a informação foi
atualizada desde a última execução do RefreshRates () function, ou seja, no caso dos novos valores de
algumas variáveis do ambiente vieram do servidor.
O tempo de abertura bar, Hora [i], não coincide com o momento do novo carrapato próximos, como
uma regra. A qualquer hora do calendário barra de abertura é divisível por semper o
calendário. Qualquer primeiro Assinalar apareceu dentro de um horizonte temporal é barra-formando, se
não houver nenhum carrapato recebimento dentro de um prazo definido, o bar não vai ser formado
dentro dos prazos.
Por exemplo, o carrapato chegando ao terminal de tempo (servidor) t0 resulta na formação de um bar
com o tempo abrindo igual a Hora [i +2] (Fig. 143). O momento especificado como o início do calendário
não coincide com o momento t0, embora possa concordar com ele acidentalmente, em geral. Os
carrapatos subseqüentes que vêm para o terminal dentro do mesmo prazo (no momentos de T1 e T2)
pode alterar os parâmetros da barra, por exemplo, preço máximo ou abrir preço, mas eles não afetam o
tempo de abertura bar. O bar encerra o tempo não é considerada no sistema de comércio on-line
Metatrader 4 (formalmente, o horário do último carrapato próximos ou dentro de um horizonte temporal
do início do próximo período de tempo pode ser considerado como tempo fechando o bar, como
mostrado na fig. 143 ).

Fig. 143. Bar formando seqüência no comércio online plataforma Metatrader 4.


É mostrado na fig. 143 que é possível que bares não são formados a alguns períodos de tempo que são
iguais para o período de tempo. Assim, entre o tempo do carrapato próximos T5 e T6 da próxima vinda
carrapato, o calendário completo está embalado, por isso a nova barra de não ter sido formados a esse
período de tempo. Desta forma, o tempo de abertura bar diferirem maio, a partir do momento da
abertura de um bar adjacente por mais de um calendário inteiro, mas é semper divisível por um
horizonte temporal. Para demonstrar a seqüência do bar formando, podemos usar o
EA timebars.mq4 saídas que o tempo de carrapato e próximos do momento da barra de abertura:
//------------------------------------------------ --------------------
/ / Timebars.mq4
/ / O programa é destinado a ser utilizado como um exemplo em MQL4 Tutorial
.
//------------------------------------------------ --------------------
int start () / / Spec. função start ()
(
Alerta ( "TimeCurrent =", TimeToStr (TimeCurrent (), TIME_SECONDS),
"O tempo [0] =", TimeToStr (Hora [0], TIME_SECONDS));
retorno; / / Sair start ()
)
//------------------------------------------------ --------------------
Os resultados da EA timebars.mq4 de trabalho são mostrados na fig. 144. É óbvio que o primeiro
assinale o regular no período de tempo de 1 minuto duração entrou em 14:29:12, ao mesmo tempo uma
nova barra de abertura foi formada com o tempo - 14:29:00. Observe que a coluna à direita da caixa de
mensagem exibe o servidor de tempo, a coluna da esquerda exibe a hora local.

Fig. 144. Bar formando seqüência no sistema de comércio on-line Metatrader 4.


No caso dos carrapatos vêm raramente (por exemplo, o período entre o final da sessão Europeu e do
início da sessão asiática), você pode observar um outro fenômeno durante a execução
das timebars.mq4: o tempo de abertura da bares adjacentes podem diferir uns dos outros por mais de 1
minuto (para um minuto de tempo). Ao mesmo tempo, a indexação de barras é guardado em sucessão,
sem espaços.
O servidor de tempo de servidores em diferentes centros que tratam pode variar. O horário de início e
término trades é fixado em cada servidor individualmente e pode discordar do início e do fim de regular
o dia. Alguns centros que tratam, por exemplo, as definições têm que realizar abertura comercial no
domingo, às 23:00 hora do servidor. Isso resulta na formação de barras diário incompleto, a sua duração
é igual à prática uma hora (Fig. 145).
Fig. 145. Bar história diferente em diferentes centros que tratam.
O uso de Data e hora de funções é bastante fácil de MQL4. Alguns deles transformar o servidor ea hora
local em segundos desde 00:00 expirava em 1 de janeiro de 1970 em um número inteiro que
corresponde a uma hora, um dia, etc Outras funções retornam um número inteiro que corresponda com
a hora actual , Dia, minuto, etc
TimeSeconds (), TimeMinute (), TimeHour (), TimeDay (), TimeMonth (), TimeYear (),
TimeDayOfWeek () e TimeDayOfYear () Funções

Este é um grupo de funções que retornam o número de segundos caducado a partir do início da hora,
ou minuto, hora, dia, mês, ano, dia da semana eo dia do ano para o período de tempo especificado. Por
exemplo:

int TimeMinute (datetime tempo)


A função retorna minutos para o período de tempo especificado.
Parâmetros:
tempo - a data expressa no número de segundos em que expirava 00:00 desde o dia 1 de janeiro de
1970.

int TimeDayOfWeek (datetime tempo)


Esta função retorna o dia da semana (0-domingo, 1,2,3,4,5,6) para a data especificada.
Parâmetros:
tempo - a data expressa no número de segundos em que expirava 00:00 desde o dia 1 de janeiro de
1970.
As funções podem ser considerados utilizadas para a análise de qualquer barra de abertura tempo, por
exemplo. A EA chamadobigbars.mq4 destinados a encontrar barras de um tamanho que não é inferior à
especificada tamanho é mostrado abaixo.

//------------------------------------------------ --------------------
/ / Bigbars.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------- 1 --
extern int Quant_Pt = 20; / / Número de pontos
//------------------------------------------------ --------------- 2 --
int start () / / Spec. função start ()
(
H_L int = 0; / / Altura da barra
for (int i = 0; H_L <Quant_Pt; i + +) / / Ciclo de barras
(
H_L = MathAbs (High [i] - Baixo [i]) / Point; / / Altura da barra
if (H_L> = Quant_Pt) / / se o elevado bar não é encontrado
(
int = TimeYear YY (Hora [i]); / / Ano
MN = int TimeMonth (Hora [i]); / / Mês
DD = int TimeDay (Hora [i]); / / Dia
int HH = TimeHour (Hora [i]); / / Hora
MM = int TimeMinute (Hora [i]); / / Minuto
Comentário ( "O último preço superior a circulação", Quant_Pt, / / Mensagem
"Pt aconteceu", DD, ".", MN, "." YY ", ", HH,": ", MM); / / output
)
)
retorno; / / Sair start ()
)
//------------------------------------------------ --------------- 3 --
O bigbars.mq4 EA pesquisas o bar mais próximo cuja altura (diferença entre a máxima e mínima) seja
maior ou igual ao valor indicado na variável externa Quant_Pt. A data eo horário dos outputted bar são
encontrados para a janela de instrumento financeiro, pelo comentário () function.

Segundos (), Minute (), Hour (), Dia (), TimeMonth (), TimeYear (), DayOfWeek () e
DayOfYear () Funções

Este é o grupo de funções que retornam o actual segundo, minuto, hora, dia, mês, ano, dia da semana
eo dia do ano para conhecer o último servidor tempo. A última vez é conhecido servidor a servidor de
tempo que corresponde com o momento do lançamento do programa (lançamento de qualquer função
especial pelo cliente terminal). O servidor de tempo não é alterado durante a execução da função
especial.

int Hour ()
Ela retorna a hora actual (0,1,2, .. 23) da última vez conhecida servidor. Note-se que os últimos tempos
é conhecido servidor modelado durante os testes.

int DayOfYear ()
Ela retorna o dia atual do ano (1 é o primeiro 1, .., 365 (6) é o dia 31 de dezembro), ou seja, o dia do
ano da última vez conhecida servidor. Note-se que os últimos tempos é conhecido servidor modelado
durante os testes.
A EA timeevents.mq4 que realiza algumas ações, logo que chega o período de tempo especificado pode
ser usado como um exemplo de uso do exposto funções.

//------------------------------------------------ --------------------
/ / Timeevents.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------- 1 --
extern dupla Time_Cls = 16,10; / / fechando tempo Encomendas
Flag_Time bool = false; / / Bandeira, ainda não existem mensagens
//------------------------------------------------ --------------- 2 --
int start () / / Spec. iniciar funções
(
int Cur_Hour = Hour (); / / Servidor em horas
Cur_Min duplo = Minuto (); / / Server tempo em minutos
Cur_time duplo = Cur_Hour + Cur_Min 100; / / Hora atual
Alerta (Cur_time);
if (Cur_time> = Time_Cls) / / Se o tempo veio para o evento
Executora (); / / .. em seguida, executar acções concebidas
retorno; / / Saída de início ()
)
//------------------------------------------------ --------------- 3 --
int testamenteiro () / / Usuário-função definida
(
if (Flag_Time == false) / / Se não houver mensagens ainda
(/ / .. em seguida, relatório (1 hora)
Alerta ( "Divulgações importantes tempo. Feche ordens.");
Flag_Time = true; / / Agora a mensagem já apareceu
)
retorno; / / user-defined função Sair
)
//------------------------------------------------ --------------- 4 --
O servidor de tempo é calculado em horas e minutos durante a execução da função especial start ()
(blocos 2-3). A linha:

Cur_time duplo = Cur_Hour + Cur_Min 100; / / Hora atual


representa o horário atual do servidor expressa como a variável real Cur_time. O uso de variáveis reais é
conveniente em comparação operações:

if (Cur_time> = Time_Cls) / / Se o tempo veio para o evento


Se o tempo atual é mais do que ou igual ao valor do Time_Cls especificado pelo usuário, então o
executor () user-defined função será chamada para execução. Neste exemplo, o usuário coloca-se uma
função definida mensagem negociação com recomendações. Em geral, esta função pode incluir qualquer
código, por exemplo, efectuar transacções, enviar e-mails, criar objetos gráficos, etc
Funções de Data e Hora

Função Descrição
Dia Ela retorna o dia atual do mês, ou seja, o dia do último mês do servidor
conhecido tempo.
DayOfWeek Ele retorna o número de índice do dia da semana (domingo-0, 1,2,3,4,5,6) da
última vez conhecida servidor.
DayOfYear Ela retorna o dia atual do ano (1 é o primeiro 1, .., 365 (6) é o dia 31 de
dezembro), ou seja, o dia do ano da última vez conhecida servidor.
Hora Ela retorna a hora actual (0,1,2, .. 23) da última vez servidor conhecido no
momento do programa começar (o valor não for alterado durante a execução do
programa).
Minuto É a atual regressos minutos (0,1,2, .. 59) da última vez servidor conhecido no
momento do programa começar (o valor não for alterado durante a execução do
programa).
Mês Ele retorna o número do mês em curso (janeiro-1, 2,3,4,5,6,7,8,9,10,11,12), ou
seja, o número do último mês do servidor conhecido tempo.
Segundos Ele retorna o número de segundos caducado desde o início do curso o último
minuto do tempo servidor conhecido no momento do programa começar (o valor
não for alterado durante a execução do programa).
TimeCurrent Ele retorna o último servidor conhecido tempo (o tempo da última cotação
próximos), expresso em segundos que o número de passaram desde a 00:00, 1 º
de janeiro 1970.
TimeDay Ela retorna o dia do mês (1 - 31) para a data especificada.
TimeDayOfWeek Ela retorna o dia da semana (0-domingo, 1,2,3,4,5,6) para a data especificada.
TimeDayOfYear Ele retorna ao dia (1 é o primeiro 1, .., 365 (6) é o dia 31 de dezembro) do ano
para a data especificada.
TimeHour Ela retorna a hora durante o período de tempo especificado.
TimeLocal Ela devolve o PC local o tempo, expresso em número de segundos desde 00:00
expirava em 1 de janeiro de 1970.
TimeMinute Ele retorna minutos para o período de tempo especificado.
TimeMonth Ele retorna o número do mês, para o período de tempo especificado (janeiro-1,
2,3,4,5,6,7,8,9,10,11,12).
TimeSeconds Ele retorna o número de segundos passados desde o início do período de tempo
especificado.
TimeYear Ele retorna ao ano para a data especificada. O valor pode ser devolvido dentro do
intervalo de 1970-2037.
Ano Ele retorna ao ano em curso, ou seja, o ano da última vez conhecida servidor.

Para obter a informações detalhadas sobre essas e outras funções, consulte


a documentação em MQL4.community, emMetaQuotes Software Corp site ou no menu "Ajuda" do
MetaEditor.
Arquivo de Operações

Em MQL4, é possível trabalhar com arquivos que contenham um determinado conjunto de informações. Poder
ser necessário escrever as informações em um arquivo ou para lê-lo a partir de um arquivo por várias razões.
Um ficheiro pode ser utilizado para fornecer informações para outro programa. Neste caso, o arquivo pode ser
criado por um programa aplicativo e utilizá-las como uma informação receptor. Por exemplo, a história de uma
conta comercial podem ser gravados em um arquivo na execução de uma aplicação. Este arquivo pode ser
aberto por outro programa mais tarde (por exemplo, o Excel para desenhar um equilíbrio gráfico).
Em outros casos, há necessidade de fornecer algumas informações, por exemplo, as notícias calendário, para
uma aplicação. Um programa executável (por exemplo, uma Expert Advisor) pode ler estas informações do
arquivo previamente preparado e analisá-lo durante o cálculo para visualização gráfica das mensagens na tela
ou para a tomada de decisões comerciais.
Nomes de arquivos e diretórios

O nome de um ficheiro de trabalho deve ser composta de acordo com os requisitos do sistema operacional.
nome de arquivo usado em qualquer MQL4 composta de duas partes: o nome do arquivo e extensão do arquiv
separado por um ponto, por exemplo,News.txt. Tecnicamente, um nome do arquivo não tem qualquer relaçã
com o conteúdo do ficheiro, por isso o nome do arquivo e extensão podem ser definidos voluntariamente pelo
programador. Um nome do arquivo geralmente é escolhido de modo a que representa o arquivo contém as
informações.
A maioria dos programas são lançados automaticamente no PC do usuário, se o arquivo for duplo clique com o
botão do mouse. De acordo com a extensão do arquivo, o ambiente operacional carrega um outro programa o
exibir o conteúdo do ficheiro. Portanto, você deve atribuir a extensão do arquivo considerando o programa (se
necessário), que será geralmente usado para exibir o arquivo.
Os mais populares tipos de arquivos (o tipo é determinado pela sua extensão) são as seguintes:
-. Txt - arquivo de texto para visualização que você deve usar Bloco de Notas, Word, FrontPage, etc;
-. Csv - arquivo em Excel para construir tabelas;
-. Htm - arquivo para ser visualizado em um navegador, ou seja, o Internet Explorer, Netscape Navigator, etc
Há três pastas (com subpastas) que pode conter ficheiros de trabalho:
- Terminal_folder \ Experts \ Histórico \ atual corretor \ - História de arquivos;
- Terminal_folder \ Experts \ Files \ - para uso comum;
- Terminal_folder \ Tester \ Files \ - para os arquivos são usados para testes.
Um grupo de trabalho arquivo pode ser guardado em uma dessas pastas ou em suas subpastas. No caso de
falta de pasta disponível no momento de salvar arquivos, a pasta será criado automaticamente pelo cliente de
terminal. Trabalhar com arquivos em outros diretórios não está envolvido.
Modos de operações de arquivo

A tecnologia de interação entre uma aplicação e um ficheiro de trabalho tem vários modos. Em geral, um
arquivo pode ser aberto por vários programas ao mesmo tempo (no prazo de um PC ou vários PCs ligados à
rede). Ao mesmo tempo, o ambiente operacional prevê o pleno acesso ao processo, ou seja, o direito de ler o
arquivo e gravar as informações dele constantes, para um só programa. Os outros programas só pode lê-lo.
exemplo, se My_text.doc já foi aberto por um editor de texto, então todos os outros programas irá receber a
notificação antes de abrir o arquivo:

Fig. 146. Caixa de diálogo que aparece quando um programa tenta acesso ao processo que já foi aberto por
outro programa.
A execução desta tecnologia garante que um arquivo não será modificado por dois programas diferentes
simultaneamente. A fim de permitir um programa aplicável a interagir com um arquivo, você deverá abrir o
arquivo que está em primeiro lugar. O modo de abrir um arquivo é especificado na FileOpen () function.
Um programa aplicativo pode abrir vários ficheiros de trabalho em uma hora. A fim de permitir que o program
de diferenciar um arquivo a partir de um outro arquivo descritor está definido de acordo com todos os arquivo
abertos.
Arquivo descritor - número único de que o arquivo é aberto pelo programa no momento.
As FileOpen () função irá retornar algum valor inteiro (este valor é geralmente atribuída ao 'manipular'
variável), se um arquivo é aberto com êxito. Esse valor é o arquivo descritor. A maioria das funções que lhe
forem destinados ao trabalho com arquivos suponha a utilização de um descritor de ficheiro como um dos
parâmetros formais.
Função FileOpen ()
int FileOpen (string filename, int modo, int delimitador = ';')
A função abre um arquivo para inputing e / ou saída. A função retorna um descritor de ficheiro ou -1, em caso
de avaria. Os arquivos só podem ser abertos no Terminal_folder \ Experts \ Arquivos \ pasta ou
na Terminal_folder \ Tester \ Arquivos \ pasta (no caso dos testes AE) ou em suas subpastas.
Parâmetros:
filename - nome do arquivo;
modo - o modo de abertura do arquivo, ele pode ter os seguintes valores (ou suas combinações): FILE_BIN,
FILE_CSV, FILE_READ, FILE_WRITE;
delimitador - o separador para assinar csv-arquivos. Trata-se »,« por defeito.
O modo de arquivo FILE_READ abertura implica que um arquivo será usado apenas para serem lidos por um
programa. Um julgamento para abrir um arquivo neste modo podemos falhar, em caso de não disponível
arquivo com o nome especificado.
O modo de arquivo FILE_WRITE abertura envolve um arquivo que será usado para escrever nos por um
programa. A tentar abrir um arquivo neste modo resulta na abertura de um arquivo de um comprimento
zero. Mesmo se houvesse alguma informação no arquivo antes de abrir, ele será apagado. A tentar abrir um
arquivo neste modo podemos falhar, no caso em que o arquivo foi aberto anteriormente por outro programa
(no modo de escrita).
É autorizada a abrir um ficheiro na FILE_READ | FILE_WRITE modo. Este modo envolve a possibilidade de
leitura e escrita para um arquivo. Este modo é utilizado, se você precisa adicionar algumas informações para o
arquivo que já contém algumas outras informações. A função implica a obrigatoriedade da utilização de um do
modos, FILE_READ ou FILE_WRITE, ou sua combinação.
O modo de arquivo FILE_BIN abertura define um trabalho de transformação como um arquivo binário uma.
modo de arquivo FILE_CSV abertura define um trabalho de transformação de um texto como um arquivo. A
função envolve uso obrigatório de um dos FILE_BIN ou FILE_CSV modos. A utilização simultânea de FILE_BIN
e modos FILE_CSV é proibida
A função requer obrigatória combinação de FILE_READ, FILE_WRITE ou FILE_READ | FILE_WRITE modos com
o FILE_BIN ou FILE_CSV modo. Por exemplo: é preciso usar a combinação de FILE_CSV | FILE_READ de ler as
informações de um arquivo de texto, e é necessário utilizar o FILE_BIN | FILE_READ | FILE_WRITE combinaçã
para adicionar uma entrada para um arquivo binário.
Não mais do que 32 arquivos podem ser abertos simultaneamente dentro de um módulo executável (de um
programa aplicável, por exemplo, uma Expert Advisor). Os descritores dos arquivos que estão abertas no
módulo não podem ser passados para outros módulos (bibliotecas).
Conteúdo do arquivo entradas

As informações entradas são escritas para um ficheiro sem espaços com qualquer combinação de modos. As
entradas são adicionadas uma informação por um FILE_BIN quando se utiliza o modo de constituição de um
arquivo. Dependendo do tipo de informação que é escrito para um arquivo (e as funções que são utilizadas
para fazê-lo) os símbolos que representam a combinação final da linha ( "\ r \ n") pode ser escrita entre os
grupos de entradas. A Informações entradas são separadas por separadores de arquivo (normalmente ";"),
quando formando um arquivo no FILE_CSV modo, e os grupos de entradas (que compõem uma linha) são
separados com a combinação dos símbolos que representam o fim da linha ( "\ r \ n ").
Arquivo separadora - símbolo especial, a entrada que está escrito em um arquivo separado para as linhas d
informação.
O arquivo separador é usado para separar as informações entradas CSV-a apenas em arquivos.
O princípio comum para as entradas em qualquer composição arquivos é que essas entradas são adicionadas
de acordo com a seqüência específica, sem espaços. Correctamente, a entrada é constituída por seqüência
contínua de símbolos. Qualquer arquivo pode ser lido por qualquer programa e (dependendo das regras
implemeted no mesmo) pode ser mostrado de alguma forma na tela. Por exemplo: nós temos
o File_1.csv arquivo que contém:

int FileOpen (string filename, int modo, int delimitador = ';')


File_1.csv O arquivo será exibido em diferentes formas em diferentes editores texto:

Fig. 147. File_1 representação nos diferentes programas (File_1.csv).


Neste caso, o "\ r \ n" símbolo combinação foi interpretada por cada um dos programas (Excel e Notepad),
conforme o depoimento de formatação seqüência: a seqüência de símbolos é representado na próxima linha
após o "\ r \ n" combinação dos símbolos, e os "\ r \ n" conjunto em si mesmo não é exibido na janela de
edição. Ao mesmo tempo, o Excel é um editor mesa, de forma a "," símbolo foi interpretado pelo programa
como uma das informações que colunas de separação. Chamar a atenção que os ";" símbolo não é exibido na
janela do Excel. Bloco de notas é um editor de texto. As regras implementadas em que não suponha a divisão
em colunas de informação, de modo a "," símbolo não foi interpretado como um processo de separação, mas
ela foi interpretada como uma parte de informações, de forma que ele é exibido na tela.
Os símbolos especificada ( ";" e "\ r \ n") são usados para separar as entradas em MQL4.
Fig. 148. Variedade de entradas nos ficheiros de trabalho.
A estrutura da informação escrita em diferentes tipos de ficheiros estão representados na fig. 148. A linha
superior mostra o conteúdo de arquivo csv, o fundo três linhas mostram a estrutura de arquivos binários. Todo
estes arquivos são compostos de acordo com as regras de uma ou outra função de escrita no arquivo.
Uma entrada no arquivo csv-se a seqüência de valores corda (string tipo) que são separados com o processo
de separação ou com o sinal do fim da linha. Ambos são interpretados como um sinal do fim do valor
informativo ler parte na leitura informações (utilizando o padrão MQL4 função de arquivo leitura). O valor da
seqüência pode ter a duração diferente e não se sabe quanta símbolos estão lá, então a leitura é realizada
antes de um dos separadores está localizado.
As inscrições em dois tipos de binários de arquivos binários representam as seqüências de dados sem
separadores. Essa seqüência de escrita nos é regida pelo comprimento fixo para uma base de dados de
diferentes tipos: 4 bytes de dados para um dos "int", "bool", "datetime" e "cor" tipos, e 8 bytes (ou 4 bytes,
dependendo dos parâmetros da função escrito) para os dados de uma "dupla" tipo.Neste caso, não há
necessidade de separadores, porque a leitura é realizada pela função padrão para leitura de dados de um tipo
específico com uma determinada duração. O último (um sobre o fundo da figueira. 148) arquivo binário contém
os dados do tipo string que é separado com o fim da linha sinal.
Arquivo ponteiro - uma posição no arquivo da leitura do valor começa a partir do próximo.
O "Arquivo ponteiro" conceito é o mesmo com "cursor" noção. O arquivo ponteiro é definido com a posição no
arquivo. Como leitura longe como se passa o ponteiro está movendo uma à direita ou por várias posições.

Problema 36. Leia as informações sobre a importante notícia de um arquivo e exibir os


objetos gráficos sobre o preço gráfico (linhas verticais), em conformidade com o tempo
de notícias publicação.

Deixe o Terminal_Folder \ Experts \ Arquivos \ pasta contém o News.csv trabalho arquivo com o seguint
conteúdo:
Fig. 149. Conteúdo do ficheiro de trabalho News.csv.
Neste caso, o arquivo contém informações sobre os cinco eventos que irão acontecer em países diferentes, co
um horário diferente.Cada linha contém duas entradas. A primeira entrada é o valor da seqüência que
representam as informações sobre uma data hora do evento. A segunda entrada é o texto de descrição do
evento. Três primeiros símbolos da segunda entrada contém o nome da moeda (o país) que o caso diz respeit
A solução consiste em duas partes. Antes de mais, temos de ler as informações do arquivo de trabalho e, em
seguida, usar o valor recebido como as coordenadas dos objetos gráficos. A leitura das informações é realizado
pela FileReadString () function.
FileReadString () Função
string FileReadString (int alça, int comprimento = 0)
A função lê a linha a partir da posição actual do ficheiro. É adequado tanto para CSV e arquivos binários. A
linha será lido até o conheci em separator é o arquivo de texto. O número especificado de símbolos será lida
em arquivos binários. A fim de receber as informações sobre um erro que você deve ligar para o GetLastError
function.
Parâmetros:
punho - o arquivo descritor que é devolvido pelo FileOpen () function;
comprimento - o número de caracteres a serem lidos.
A necessidade de tratamento da informação em notícia aparece apenas uma vez no início da negociação,
portanto, neste caso, podemos usar um script para resolver o problema 36. O timetablenews.mq4 script
destina-se a ler as informações do arquivo e exibir os objetos gráficos na janela do símbolo.

//------------------------------------------------ --------------------
/ / Timetablenews.mq4
/ / O código deve ser usado apenas para fins educacionais .
//------------------------------------------------ --------------- 1 --
int start () / / Spec. função start ()
(
//------------------------------------------------ --------------- 2 --
int Manilha, / / File descritor
STL; / / Estilo da linha vertical
string File_Name = "News.csv", / / Nome do arquivo
Obj_Name, / / Nome do objeto
Instr, / / Nome da moeda
Um, Dois, / / 1 º e 2 º nome do instr.
Texto, / / Texto do evento descrição
Str_DtTm; / / Data e hora do evento (linha)
datetime Dat_DtTm; / / Data e hora do evento (data)
color Col; / / Cor da linha vertical
//------------------------------------------------ --------------- 3 --
Manipular = FileOpen (File_Name, FILE_CSV | FILE_READ, ";"); / / arquivos
abrindo
if (Handle <0) / / arquivos abrindo falhar
(
if (GetLastError () == 4103) / / Se o arquivo não existir, ..
Alerta ( "Nenhum arquivo chamado", nome_do_ficheiro); / / .. informar
comerciante
else / / Se qualquer outro erro ocorre ..
Alert ( "Erro ao abrir o arquivo", nome_do_ficheiro); / / .. esta mensagem
PlaySound ( "Bzrrr.wav"); / / Som acompanhamento
retorno; / / Sair start ()
)
//------------------------------------------------ --------------- 4 --
while (FileIsEnding (Manilha) == false) / / Enquanto o ponteiro arquivo ..
(/ / .. Não é, no final do arquivo
//------------------------------------------------ --------- 5 --
Str_DtTm = FileReadString (Handle); / / Data e hora do evento (data)
Texto = FileReadString (Handle); / / Texto do evento descrição
if (FileIsEnding (Manilha) == true) / / Arquivo ponteiro está no fim
break; / / Sair leitura e desenho
//------------------------------------------------ --------- 6 --
Dat_DtTm = StrToTime (Str_DtTm); / / Transformação de dados tipo
Instr StringSubstr = (Texto, 0, 3); / / Extrair três primeiros símbolos
Um StringSubstr = (Symbol (), 0, 3); / / Extrair três primeiros símbolos
Dois StringSubstr = (Symbol (), 3, 3); / / Extract segundo três símbolos
STL = STYLE_DOT; / / Para todos - linha pontilhada estilo
Col = DarkOrange; / / Para todos - esta cor
if (Instr == Um | | Instr == Dois) / / E, para os eventos de nossa ..
(/ / .. símbolo ..
STL = STYLE_SOLID; / / .. este estilo ..
Col = Vermelho; / / .. e essa cor de verde. linha
)
//------------------------------------------------ --------- 7 --
Obj_Name = "News_Line" Str_DtTm +; / / Nome do objeto
ObjectCreate (Obj_Name, OBJ_VLINE, 0, Dat_DtTm, 0); / / Criar objeto ..
ObjectSet (Obj_Name, OBJPROP_COLOR, Col); / / .. e sua cor, ..
ObjectSet (Obj_Name, OBJPROP_STYLE, STL); / / .. e estilo ..
ObjectSetText (Obj_Name, Texto, 10); / / .. e descrição
)
//------------------------------------------------ --------------- 8 --
FileClose (Handle); / / Fechar arquivo
PlaySound ( "bulk.wav"); / / Som acompanhamento
WindowRedraw (); / / Redimensionar objeto
retorno; / / Sair start ()
)
//------------------------------------------------ --------------- 9 --
As variáveis utilizadas são abertas e descrito no bloco 2.3 da EA. Uma tentativa de abrir o arquivo, bem como
análise dos resultados desta operação são executadas no bloco 3.4. As FileOpen () função é usada para abrir o
arquivo:

Manipular = FileOpen (File_Name, FILE_CSV | FILE_READ, ";"); / / arquivos


abrindo
Uma tentativa de abrir o arquivo não é bem sucedida. Ela pode fracassar, se o arquivo com o nome
especificado não está disponível.Ao abrir arquivo falhar (o arquivo descritor é um número negativo) a
necessária mensagem é exibida para o usuário e para a execução do início () pára de funcionar.
Em caso de abertura de um processo bem sucedido, o controlo é passado para o operador do "enquanto o"
ciclo (blocos 4-8). A leitura dos dados do arquivo (blocos 5-6), a transformação dos dados e sua análise (6-7
blocos) e criação do objeto gráfico com coordenadas e parâmetros correspondentes ao último ler informações
(blocos 7-8) são realizados a cada iteração.
A execução do "enquanto o" ciclo continua até que o ponteiro arquivo chega ao final do arquivo, ou seja, não
haverá nenhuma informação que resta para a direita do ponteiro. O FileIsEnding () função é usada para
analisar a posição do ponteiro do arquivo.
FileIsEnding () Função
bool FileIsEnding (int alça)
A função retorna TRUE se o arquivo for ponteiro no final do arquivo, caso contrário ele retorna FALSE. A fim d
receber as informações sobre um erro que você deve usar o GetLastError () function. O GetLastError () irá
retornar a função ERR_END_OF_FILE (4099) de erro, no caso, no final do arquivo for alcançado durante a
leitura.
Parâmetros:
punho - arquivo descritor que é devolvido pelo FileOpen () function.

A solução representada (timetablenews.mq4) implica que qualquer número de notícias pode ser gravado para
arquivo News.csv.News.csv arquivo contém cinco entradas correspondentes a cinco eventos (notícias) no
exemplo mencionado (fig. 149). Em geral, o número de linhas pode ser de 0 a 20-30, dependendo da
quantidade de acontecimentos reais que devem ter lugar neste dia.
Entradas a partir da leitura do arquivo (que é identificado pelo "manipular" variável) é realizada em blocos 5

Str_DtTm = FileReadString (Handle); / / Data e hora do evento (data)


Texto = FileReadString (Handle); / / Texto do evento descrição
if (FileIsEnding (Manilha) == true) / / Arquivo ponteiro está no fim
break; / / Sair leitura e desenho
A primeira ea segunda linhas do bloco 5.6 realizar a leitura da informação do arquivo até o próximo separador
está satisfeita. A terceira e quarta linhas realizar testes: se o arquivo ponteiro no final da linha. Se assim não
for, então os objetos gráficos será formada por dois valores mais lido no ciclo. Se era inicialmente conhecido
sobre o número de entradas, então, a análise que é realizada na terceira e quarta linhas não seria
necessário. Neste caso, dificilmente teríamos especificar o número de iterações do ciclo (por exemplo, 5) e não
iria realizar uma verificação adicional.
No entanto, o número de entradas é desconhecida, no presente caso. Ao mesmo tempo, neste exemplo cada
caso é descrito com dois valores que compõem uma linha do seguinte tipo: valor, arquivo separadora, valor
final da linha sinal. Neste caso, supõe-se que, se houver uma entrada (valor na primeira linha), em seguida, o
outro existe um; mas se não existir uma primeira entrada, em seguida, o segundo um não existe, portanto, nã
há evento, e não há necessidade de se criar um objeto gráfico. Se ambas as entradas ou um deles não existir
irá mover o ponteiro para o final do arquivo (ou seja, a posição no arquivo onde não há dados para a direita d
ponteiro existir) quando um tento ler-se realizado. Os testes realizados em 3-4 permite bloquear a descobrir
esse fato. Se notar o controlo (duas últimas linhas do bloco 5-6) é suprimida, em seguida, needless objeto será
criado enquanto o programa está sendo executado. Somente depois que a condição de "quando" ciclo termina
e vai acionar o controle será passado para bloquear 8-9. Em geral, você deve considerar a lógica da
representação de dados no arquivo, ordem sequencial das entradas e separadores, o número de linhas, etc
quando escrevo um algoritmo para ler ficheiros. Cada circunstância exige um certo indivíduo algoritmo.
A leitura dos dados do arquivo tem o tipo string. Com o intuito de utilizar os valores recebidos para a criação d
objetos gráficos que deveria transformar os dados necessários para o tipo. No bloco 6.7, o primeiro (leia na
linha seguinte) é transformado para o valor "datetime" valor e maior será utilizado como de coordenadas do
objeto gráfico que corresponde ao evento. Três primeiros símbolos a partir da segunda leitura string valor, são
comparados com os de trigemelar primeiro e segundo símbolos em nome do símbolo. Se existir uma
coincidência, em seguida, o objeto gráfico recebe o correspondente parâmetros: linha estilo - sólidos e cor -
vermelho (blocos 7-8). Em outros casos, os objetos são exibidos com a laranja linha pontilhada. Você pode
observar a notícia linhas na janela do símbolo como o resultado da execução do script:

Fig. 150. Objetos gráficos na janela após o símbolo timetablenews.mq4 execução.


De tal forma, o script pode ser executado em qualquer janela do símbolo. Ao mesmo tempo, cada janela irá
conter os sólidos linha vermelha que representam os acontecimentos que dizem respeito a este símbolo
específico, e as linhas pontilhadas que representam as aberturas relativas a outros símbolos »eventos. Para
apresentar o texto descrições dos objetos que você deve verificar o "Show objeto descrição" opção na janela
Propriedades de segurança (F8) => comum.
O arquivo está fechado anteriormente aberto no bloco 8.9 depois que o problema seja resolvido, ou seja, todo
os objetos necessários sejam criados. O arquivo deve ser fechada pelos seguintes motivos: na primeira mão
para que não poupará recursos extras PC e sobre a segunda mão para permitir que os outros programas para
acessar o arquivo no modo de escrever. Deveria ser considerado normal para fechar o arquivo, assim como
todas as informações são lidas a partir dele (ou escrita no mesmo) e seu uso não é necessário mais. O
fechamento do arquivo é realizado pela FileClose () function.
FileClose () Função
void FileClose (int alça)
A função desempenhada fechamento de um arquivo que foi aberta anteriormente pelo FileOpen () function.
Parâmetros:
punho - arquivo descritor que é devolvido pelo FileOpen () function.

A fim de permitir que o profissional que praticamente timetablenews.mq4 usar o script, ele deve manter o seu
método de criação de um arquivo que contém o calendário de algumas notícias período. Este tipo de arquivo
pode ser criado usando qualquer editor de texto, porém, neste caso, a possibilidade de um erro se mantém
(por vezes um separador pode ser erroneamente não especificada). Permite analisar uma variante do trabalho
arquivo usando MQL4 criação.
Problema 37. Representam o código da EA que cria um arquivo de notícias calendário.

Em geral, uma EA pode ser destinada à criação de um ficheiro que contém qualquer número de notícias. O
examinadas aquicreatefile.mq4 EA cria grupo de trabalho arquivo que contém informações sobre a não mais d
cinco eventos.

//------------------------------------------------ --------------------
/ / Createfile.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------- 1 --
extern string data_1 = ""; / / 2007.05.11 10:30
extern string texto_1 = ""; / / CHF Construção licenças
extern string data_2 = ""; / / 2007.05.11 12:00
extern string texto_2 = ""; / / GBP Refinance taxa de 2%, 2,5%
extern string Date_3 = ""; / / 2007.05.11 13:15
extern string Text_3 = ""; / / EUR Reunião do G10 governadores dos bancos
extern string Date_4 = ""; / / 2007.05.11 15:30
extern string Text_4 = ""; / / USD E.U.A. taxa de desemprego
extern string Date_5 = ""; / / 2007.05.11 18:30
extern string Text_5 = ""; / / JPY A produção industrial
//------------------------------------------------ --------------- 2 --
int start () / / Spec. função start ()
(
//------------------------------------------------ --------------- 3 --
int Manilha, / / File descritor
Qnt_Symb; / / Número de símbolos gravados
string File_Name = "News.csv"; / / Nome do Arquivo
Erray string [5, 2]; / / Array para 5 notícias
//------------------------------------------------ --------------- 4 --
Erray [0, 0] = data_1; / / Preenche o array com os valores
Erray [0, 1] = texto_1;
Erray [1, 0] = data_2;
Erray [1, 1] = texto_2;
Erray [2, 0] = Date_3;
Erray [2, 1] = Text_3;
Erray [3, 0] = Date_4;
Erray [3, 1] = Text_4;
Erray [4, 0] = Date_5;
Erray [4, 1] = Text_5;
//------------------------------------------------ --------------- 5 --
Manipular = FileOpen (File_Name, FILE_CSV | FILE_WRITE, ";"); / / arquivos
abrindo
if (Handle ==- 1) / / arquivos abrindo falhar
(
Alerta ( "Um erro ao abrir o arquivo.", / / Mensagem de erro
"Pode ser o arquivo é ocupado pelos outros applictiom");
PlaySound ( "Bzrrr.wav"); / / Som acompanhamento
retorno; / / Exir iniciar ()
)
//------------------------------------------------ --------------- 6 --
for (int i = 0; i <= 4; i + +) / / Ciclo de toda a panóplia
(
if (StringLen (Erray [i, 0]) == 0 | | / / Se o valor da primeira ou ..
StringLen (Erray [i, 1]) == 0) / / .. segunda variável não está inscrito
break; / / .. em seguida, sair do ciclo
Qnt_Symb = FileWrite (Handle, Erray [i, 0], Erray [i, 1]); / / Escrita para o
arquivo
if (Qnt_Symb <0) / / Se falhou
(
Alert ( "Erro ao escrever o ficheiro", GetLastError ()); / / Mensagem
PlaySound ( "Bzrrr.wav"); / / Som acompanhamento
FileClose (Handle); / / Arquivo fechamento
retorno; / / Sair start ()
)
)
//------------------------------------------------ --------------- 7 --
FileClose (Handle); / / Arquivo fechamento
Alerta ( "A", File_Name, "arquivo criado."); / / Mensagem
PlaySound ( "Bulk.wav"); / / Som acompanhamento
retorno; / / Sair start ()
)
//------------------------------------------------ --------------- 8 --
A informação inicial é inscrita para o programa utilizando as variáveis externas da "cadeia" tipo (blocos 1-2).
variáveis são descritas em bloco e abriu 3-4. Para efectuar o processamento dos dados é conveniente para a
escrita Erray [] [] string array. Cada evento (informações que caracterizam notícias) é representada por dois
elementos do array na segunda dimensão. O tamanho da primeira dimensão (o número de linhas na tabela) é
definido com o número de notícias, neste caso, 5. A fim de evitar que o manual de valores ao tentar entrar à
EA uma demo-nos conta que você pode carregar as configurações do arquivo EA example_news.set; o arquivo
de configuração a EA deve estar localizado no Terminal_folder \ Presets \ pasta.
Block abertura 5.6 executa arquivos. Se a operação falhou, em seguida, iniciar o () função acaba funcionando
após o utilizador ter recebido a mensagem. Se o arquivo for aberto com êxito, em seguida, o controle será
passado para o "para" operador ciclo no bloco 6.7. Em geral, o número de valores de entrada, o tamanho do
array Erray eo número de iterações pode ser aumentada para a quantidade necessária.
A verificação é feita a cada iteração: é um dos valores inscritos vazio. O comprimento da matriz Erray valores
são calculados com este objetivo. Se um deles tem o comprimento zero, então ela é considerada como a
ausência do atual e os próximos eventos, por isso a atual iteração interrupções. A escrita de valores de dois
elementos do array vai até o arquivo sobre o vazio, na medida do valor do elemento é encontrado. O FileWrite
() função é usada para escrever os valores para o csv-file.
FileWrite () Função
int FileWrite (int alça, ...)
A função é destinado para escrever as informações para um arquivo csv-, o separador entre as informações sã
automaticamente incluídas no. O símbolo representa o fim da linha "\ r \ n" é acrescentado ao processo após a
informação escrita. A informação é transformada a partir do numérico para o formato de texto quando
outputted (ver Print () funções). A função retorna o número de símbolos escritos ou o valor negativo, caso
ocorra um erro.
Parâmetros:
punho - arquivo descritor que é devolvido pelo FileOpen () function;
... - Os dados separados por vírgulas. Não pode ser mais de 63 parâmetros.
Os dados da "dupla", "int" tipos é automaticamente transformados para a string (os dados de "cor", "datetime
e "bool" tipos é considerada como o dos números inteiros "int" e transformada para o tipo string, como bem),
os dados da "cadeia" tipo de saída é como é, sem transformação. As matrizes não podem ser passados como
parâmetros; arrays deve ser digitado elementwise.

No exemplo considerado a informação está escrita para o ficheiro na seguinte linha:


Qnt_Symb = FileWrite (Handle, Erray [i, 0], Erray [i, 1]); / / Escrita para o
arquivo
O separador (o símbolo que é utilizado como um separador é especificado no arquivo abertura função FileOpen
(), neste caso, ";") será redigida após a Erray [i, 0] valor quando se escreve para o arquivo. O símbolo
representa o fim da linha "\ r \ n" é automaticamente colocado no final do FileWrite do () função execução, ou
seja, no final da escrita. A mesma entrada será escrito em cada iteração do próximo "para" ciclo. Cada nova
entrada começa a partir da posição em que o processo de separação do último escrito é colocado. Ao mesmo
tempo, os valores dos elementos próximos do 'Erray' será gravado para o arquivo (índices dos elementos são
aumentadas de 1 a cada iteração).
Se o atual arquivo é escrito para o sucesso do passado para o controle é a próxima iteração. Se a escrita no
arquivo falhar então o arquivo será fechado pelo FileClose () função após a mensagem é exibida para o usuári
eo início () termina sua função de trabalho. Se todos os escritos para o arquivo são executados com êxito, em
seguida, o controle é passado para o arquivo fecho função FileClose () no bloco 7.8, após a execução do "pa
ciclo está acabado. Neste caso, a mensagem sobre a criação bem sucedida arquivo é exibido, depois que o
início () função execução será finalizada. O News.csv arquivo mostrado na fig. 149 será criada após a EA está
acabado execução.

Função para a realização de operações arquivo

Função Síntese Info


FileClose O fechamento do arquivo que foi aberta anteriormente pelo FileOpen () function.
FileDelete Excluindo do arquivo. Os arquivos só podem ser eliminados se estiverem localizados
no terminal_folder \ peritos \ Arquivos (terminal_folder \ tester \ arquivos, no caso dos
testes da AE) ou na pasta suas subpastas.
FileFlush Flushing todas as informações que são deixadas no arquivo de input-output bufer para
o disco rígido.
FileIsEnding Devolve TRUE se o arquivo for ponteiro no final do arquivo, caso contrário - retorna
FALSE. Se ao final do arquivo for alcançado durante a leitura do arquivo,
o GetLastError () irá retornar a função ERR_END_OF_FILE (4099) de erro.
FileIsLineEnding Retorna TRUE se o arquivo ponteiro está no final da linha do CSV-arquivo. Caso
contrário, retorna FALSE.
FileOpen Abre um arquivo para a introdução e / ou saída. A função retorna o descritor de
arquivo aberto o arquivo de -1, em caso de falha.
FileOpenHistory Abre um arquivo na pasta atual história (termial_folder \ Histórico \ server_name) ou
em suas subpastas. A função retorna o arquivo descritor -1 ou, em caso de falha.
FileReadArray A função lê o número especificado de elementos a partir do arquivo binário para a
matriz. A matriz tem de ter tamanho suficiente antes de ler. A função retorna o
número de praticamente lê elementos.
FileReadDouble A função lê a número de precisão dupla com o ponto flutuante (duplo) a partir da
posição atual do arquivo binário.O tamanho do número maio a seguinte: 8 bytes (duas
vezes) e 4 bytes (float).
FileReadInteger A função lê a número inteiro a partir da posição atual do arquivo binário. O tamanho
do número pode ser o seguinte: 1, 2 ou 4 bytes. Se o tamanho do número não é
especificado, então o sistema irá tentar lê-lo como ele era o 4 byte número inteiro.
FileReadNumber Lendo o número a partir da posição atual do arquivo CSV-até que o separador seja
cumprido. Ela pode ser aplicada apenas para csv-arquivos.
FileReadString A função lê a linha a partir da posição actual do ficheiro. Ela pode ser aplicada tanto
para csv e arquivos binários.The line in the text file will be read until the separator is
met. The specified number of symbols in the line will be read in the binary files.
FileSeek The function moves the separator to the new position that is the displacement from
the beginning, end or the current position of the file in bytes. The next reading or
writing starts from the new position. If the pointer moving is performed successfully
then the function will return TRUE, otherwise - FALSE.
FileSize The function returns the size of the file in bytes.
FileTell The function returns the shift of file pointer from the beginning of the file.
FileWrite The function is intended to write the information to the csv-file, the separator is placed
automatically between the information. The end of the line sign "\r\n" is added to the
file after the writing is finished. The numeric data is transformed to the text format
during the ouptputting process. The function returns the the number of written
symbols or a negative value if an error occurs.
FileWriteArray The function writes the array to the binary file.
FileWriteDouble The function writes the number with the floating point to the binary file.
FileWriteInteger The function writes the integer number value in the binary file.
FileWriteString The function writes the line to the binary file from the current position. It returns the
number of practically written bytes or a negative value, in case an error occurs.

To get the detailed information about these and other functions you should take a look at
the documentation at MQL4.community , atMetaQuotes Software Corp. website or at the "Help" section of
MetaEditor.
Matrizes e Timeseries

É muito importante manter em mente que a seqüência de um mesmo tipo de elementos é semper
numerados a partir de zero em MQL4.
Foi mencionado anteriormente que não se deve confundir o valor do índice o elemento matriz com o
número de elementos no array (ver Arrays). Por exemplo, se a matriz é declarada:

int Erray_OHL [3]; / / declaração de Array


então isso significa que um one-dimensional array chamado Erray_OHL contém três
elementos. Indexação dos elementos começam com zero, ou seja, o primeiro dos três elementos tem o
índice 0 (Erray_OHL [0]), o segundo um - o índice 1 (Erray_OHL [1]), eo terceiro um - o índice 2
(Erray_OHL [ 2]). De tal forma, o índice máximo valor é inferior ao número de elementos no array por
um. Neste caso, a matriz é uma tridimensionais, ou seja, nós podemos dizer sobre a quantidade de
elementos na primeira dimensão: o índice máximo é número 2, porque o número de elementos no array
é 3.
A mesma coisa pode ser dito sobre a numeração das dimensões do array. Por exemplo, se um array é
declarada da seguinte forma:

int Erray_OHL [3] [8]; / / declaração de Array


isso significa que a matriz tem duas dimensões. A primeira dimensão especifica o número de linhas (3,
neste exemplo), ea segunda uma especifica o número de elementos na fila (ou o número de colunas, 8,
neste exemplo). A dimensão em si é muito numerados. A primeira dimensão tem o número 0, eo
segundo - o número 1. Os números de dimensões são utilizadas no ArrayRange () function, por
exemplo.
ArrayRange () Função
int ArrayRange (objeto array [], int range_index)
A função retorna o número de elementos na dimensão especificada da matriz.
O uso de ArrayRange () função pode ser demonstrada com a solução do seguinte problema:

Problema 38. O Mas_1 matriz contém os valores da matriz 3X5. Obtenha os valores da
Mas_2 array que contém os elementos cujos valores são iguais aos valores da matriz
transponível. Uso arbitrário valores dos elementos.

Vamos trabalhar alguns outros valores dos elementos e representam as primeiras e as matrizes que o
desejado Mas_1 e Mas_2 arrays conter respectivamente:

Índices 0 1 2
Índices 0 1 2 3 4 0 1 11 21
0 1 2 3 4 5 1 2 12 22
1 11 12 13 14 15 2 3 13 23
2 21 22 23 24 25 3 4 14 24
4 5 15 25
Matriz inicial, Mas_1 array. Transp matriz, Mas_2 array.
Fig. 151. Inicial e Matrizes Transp.
Neste caso, o problema resolve-se a reescrever os valores do primeiro para o segundo uma matriz de
acordo com as regras da matriz de transposição, ou seja, reescrever os valores dos elementos da
primeira matriz para as fileiras de colunas da matriz desejada. A solução do problema transposição
matriz está representada no matrix.mq4 especialista:

//------------------------------------------------ --------------------
/ / Matrix.mq4
/ / O Código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------- 1 --
int start () / / Especial função start ()
(
int Mas_1 [3] [5] = (1, 2, 3, 4, 5, 11, 12, 13, 14, 15, 21, 22, 23, 24,
25);
int Mas_2 [5] [3];
int R0 = ArrayRange (Mas_1, 0); / / Número de elementos no primeiro dim.
int R1 = ArrayRange (Mas_1, 1); / / Número de elementos no segundo dim.

for (int i = 0; i
Dois arrays são abertas no início () a função de perito. O Mas_1 array tem 3 linhas containing 5
elementos cada e os MAS_2 array tem 5 linhas contendo 3 elementos cada. A reformulação dos valores
em si é feita da seguinte inscrição:
Mas_2 [[j] [i] = Mas_1 [i] [j]; / / Matriz de transposição
Para se calcular o ambiente runtime (o número de iterações) de dois agentes incorporado ciclo, que
deve saber os valores dos elementos de cada array. Neste exemplo os valores constantes 3, e 5 poderão
ser utilizados. No entanto, este modo de conceber programa está incorreto. Em geral, um programa
pode conter um código onde o gigantesco apelando para os mesmos valores é realizado em várias
partes do mesmo. Um programa deve ser concebida de modo que as alterações possam ser feitas em
um lugar, se necessário, e em todas as outras peças necessárias eles seriam calculados. Neste caso,
apenas que abrir as inscrições e inicializar o arrays deve ser modificado, se é necessário mudar o
tamanho dos arrays, portanto, não há necessidade de modificar o código das outras partes.
Para determinar o número de elementos do primeiro e segundo Mas_1 dimensões da matriz são
realizados os seguintes cálculos:

int R0 = ArrayRange (Mas_1, 0); / / Número de elementos no primeiro dim.


int R1 = ArrayRange (Mas_1, 1); / / Número de elementos no segundo dim.
Note que o valor 0 é usado para a primeira dimensão e do valor 1 é utilizado para a segunda. Os valores
calculados da R0 e R1 variáveis são usadas para determinar o número de iterações na "para" ciclos.
Os valores recebidos do array Mas_2 elementos são exibidos na tela usando a Comment () function.

Fig. 152.Result de matrix.mq4 operação.

Funções para Trabalhar com Arrays

Funções Breve descrição


ArrayBsearch Ela retorna o índice do primeiro elemento encontrado na primeira dimensão da
matriz. Se o elemento com o valor especificado, ausente ia então a função irá
retornar o índice do próximo (em valor) elemento.
ArrayCopy Ele copia um array para outro. As matrizes devem ter o mesmo tipo. As matrizes
do dobro [], int [], datetime [], cor [], e bool [] não pode ser copiado como as
matrizes do mesmo tipo. Retorna o número de elementos copiados.
ArrayCopyRates Ele copia os dados para o bar matriz bi-dimensional RateInfo do [] [6] espécie e
retorna o número de bares copiado. Caso contrário, retorna -1, se a operação
falhar.
ArrayCopySeries Ele copia um array timeseries para o usuário-definidas matriz e devolve o
número de elementos copiados.
ArrayDimension Ele retorna um posto de multy-dimensional array.
ArrayGetAsSeries Retorna TRUE se a matriz é organizado como uma timeseries (elementos do
array estão indexados a partir do último elemento para o primeiro), caso
contrário, retorna FALSE.
ArrayInitialize Estabelece um valor único para todos os elementos do array. Retorna o número
de elementos inicializado.
ArrayIsSeries Retorna TRUE se o array está marcada uma timeseries (Hora [], Open [], Close
[], Máximo [], baixo [] Volume de []), caso contrário, retorna FALSE.
ArrayMaximum Procura um elemnet com o valor máximo. A função retorna a localização da
máxima elemento do array.
ArrayMinimum Procura um elemento com o valor mínimo. A função retorna a localização do
mínimo elemento da matriz.
ArrayRange Ele retorna o número de elementos na dimensão especificada da matriz. O
tamanho da dimensão é maior do que o maior índice de 1, porque os índices
estão começando com zero.
ArrayResize Aí se define uma nova dimensão da primeira dimensão da matriz. Retorna o
número da matriz contém todos os elementos que após a sua classificação foi
alterada, se a função executou com êxito, caso contrário, retorna -1 eo tamanho
do array não for alterado.
ArraySetAsSeries Ele aponta o caminho da indexação do array.
ArraySize Ele retorna o número de elementos em um array.
ArraySort Ela ordena arrays numéricos por sua primeira dimensão. O timeseries arrays não
podem ser ordenados.

Funções de acesso Timeseries

Funções Síntese Info


Ibars Ele retorna o número de barras do gráfico especificado.
iBarShift É uma barra de buscas por hora. A função retorna ao deslocamento do bar que possui o
período de tempo especificado. Se a barra para o período de tempo especificado está
ausente ( "buraco" na história), então a função retorna -1, dependendo do
parâmetro exato ou o deslocamento do bar mais próximo.
iClose A função retorna o preço de fechar o bar especificada com a mudança a partir do
parâmetro correspondente gráfico (sigla, calendário). Ele retorna 0, se ocorrer um erro.
iHigh Ela retorna o preço máximo do valor especificado com a barra
de deslocamento correspondente ao parâmetro do gráfico (sigla, calendário). Ele retorna
0, se ocorrer um erro.
iHighest Ela retorna o índice do valor máximo encontrado (mudança relativamente ao actual bar).
iLow Ele retorna ao preço mínimo do valor especificado com a barra
de deslocamento correspondente ao parâmetro do gráfico (sigla, calendário). Ele retorna
0, se ocorrer um erro.
iLowest Ela retorna o índice do valor mínimo encontrado (mudança relativamente ao actual bar).
iOpen Ela devolve o valor do preço abrir o bar especificada com a mudança a partir do
parâmetro correspondente gráfico(sigla, calendário). Ele retorna 0, se ocorrer um erro.
iTime Ele retorna tempo de abertura da barra especificada com a mudança a partir do
parâmetro correspondente gráfico(sigla, calendário). Ele retorna 0, se ocorrer um erro.
iVolume Ele retorna carrapato valor da barra de volume específico com a mudança a partir do
parâmetro correspondente gráfico (sigla, calendário). Ele retorna 0, se ocorrer um erro.

Para obter a informações detalhadas sobre essas e outras funções, consultar


a documentação em MQL4.community, emMetaQuotes Software Corp site ou no menu "Ajuda" do
MetaEditor.
Funções Matematicas

Matemática e trigonometria estão incluídos no MQL4. Não existem dificuldades em utilizar a maioria
deles. Por exemplo, o MathMax () função retorna o valor máximo dos dois valores especificados na lista
dos parâmetros da função. A utilização de outras funções determinadas reivindicações atenção e
consideração. Vamos examinar uma das funções deste tipo.
MathFloor () Função
MathFloor dupla (double x)
A função retorna um valor numérico que corresponde ao maior inteiro que é menor ou igual a x.
Parâmetros:
x - valor numérico.
Observe que um valor devolvido pela função é o número real (tipo duplo), ao mesmo tempo, está escrito
que a função retorna um inteiro. É importante ter em conta que a função retorna um número real que
tem todas as posições iguais a zero depois da vírgula. Por exemplo, o MathFloor () function pode
retornar 37,0 (número positivo do tipo duplo) ou -4,0 (número negativo do tipo duplo).
A descrição diz também que a função retorna o máximo possível de números que é inferior a um
determinado um. Por exemplo, se o valor do parâmetro é dado x 13.5, em seguida, o número máximo
que tem zeros depois da vírgula é 13,0. -13,5 Negativo ou se o valor for especificado na função e, em
seguida, o máximo é igual ao menor inteiro -14,0. De tal maneira, a modificação do sinal do passado
para o valor da função leva a resultados diferentes, ou seja, a valores recebidos não são iguais entre si
em magnitude absoluta.
Utilização dessas funções é muito conveniente, em alguns casos. Vamos analisar o fragmento de cálculo
do montante lotes para novas encomendas, como exemplo:

Percentual int = 30; / /% da margem livre


Livre AccountFreeMargin duplo = (); / / Livre margem
One_Lot duplo = MarketInfo (Symb, MODE_MARGINREQUIRED); / / 1 lote preço
Etapa dupla MarketInfo = (Symb, MODE_LOTSTEP); / / Tamanho passo mudou

Lots_New duplo = MathFloor (Livre * Porcentagem 100 One_Lot Passo) *


Etapa;
O valor da Porcentagem parâmetro for definido pelo usuário. Neste caso, o usuário especificado de 30%
da margem livre para novas encomendas. De acordo com as regras que são especificadas pelo
tratamento center, calculou corretamente o valor dos lotes deve ser divisível pelo escalão mínimo de
lotes mudando tamanho (Step). Os valores da margem livre (gratuito) e 1 lote preço (One_Lot) são
necessários para o cálculo também.
Vamos examinar a lógica do raciocínio do programador que compilou a expressão para calcular a
quantidade necessária de lotes Lots_New para novas encomendas. Vamos utilizar os valores numéricos
das variáveis para melhor visualização. Deixe Livre = 5000,0, One_Lot = 1360,0 (Na maioria dos centros
que tratam o custo do lote 1 do par cambial seja proporcional ao custo do símbolo), Step = 0,1. Neste
caso, a expressão para calcular Lots_New pode ser escrita como segue:
Lots_New = MathFloor (5000,0 * 30/100/1360.0/0.1) * 0,1;
A 5000,0 * 30/100 expressão é o valor das verbas estabelecidas para o usuário abrir uma nova
ordem. Neste caso, o preço de uma nova ordem pode atingir o 1500.0. Gastar dinheiro todos esses você
pode abrir uma nova ordem que tem a 1500,0 / 1360,0 = 1.102941 quantidade de lotes. No entanto, o
centro irá lidar não aceitar o fim com essa quantidade de lotes, porque o mínimo Step = 0,1 (na maioria
dos centros que tratam). Para calcular a quantidade desejada de lotes que você deve jogar fora todos os
"inúteis" dígitos na parte decimal e substituí-los com zeros.
Para fazer isso você pode usar a função matemática considerados:
Lots_New = MathFloor (1.102941/0.1) * 0,1;
O valor calculado do MathFloor (1.102941/0.1) serão 11,0 e calculado o valor da variável será Lots_New
lotes 1-1. Este valor atende aos requisitos de que tratam o centro e, por isso, pode ser utilizado como o
montante declarado de lotes em novas encomendas.

Funções Matematicas

Function Síntese Info


MathAbs A função retorna o valor absoluto (em magnitude absoluta) de um determinado
número.
MathArccos A função retorna o valor de x arccosine no intervalo de 0 a π radianos. Se x é menor
do que -1 ou maior que 1, a função retorna NaN (valor indefinido).
MathArcsin A função retorna arcsine no valor de x-π / 2 a π / 2 radianos gama. Se x i inferior a -1
ou maior que 1, a função retorna NaN (valor indefinido).
MathArctan A função retorna arco tangente de x. Se x é igual a 0, a função retorna 0. MathArctan
retorna o valor no-π / 2 a π / 2 radianos gama.
MathCeil A função retorna o valor numérico que é o maior inteiro menor ou igual a x.
MathCos A função retorna o seno do ângulo.
MathExp A função retorna o valor de e para o poder de d. Na overflow, a função retorna INF
(infinito), e ele retorna 0 no underflow.
MathFloor A função retorna o valor numérico representando o maior inteiro que é menor ou
igual a x.
MathLog A função retorna o logarítmo natural de x caso seja bem sucedido. Se x for negativo,
esta função retorna NaN (valor indefinido). Se x for 0, ele retorna INF (infinito).
MathMax A função retorna o valor máximo dos dois valores numéricos.
MathMin A função retorna o valor mínimo de dois valores numéricos.
MathMod A função retorna o de ponto flutuante restante da divisão de dois números. O
MathMod calcula a função de ponto flutuante f resto de x / y tal que x + y = f *
i, onde i é um inteiro, f tem o mesmo sinal que x, e o valor absoluto de f é menor que
o valor absoluto de y.
MathPow Retorna o valor da base expressão elevada à potência especificada (valor expoente).
MathRand A função retorna um inteiro pseudorandom dentro do intervalo de 0 a
32767. O MathSrand função deve ser usada para a semente pseudorandom-gerador
de números antes de chamar MathRand.
MathRound A função retorna valor arredondado para o número inteiro mais próximo do valor
numérico especificado.
MathSin A função retorna o seno do ângulo especificado.
MathSqrt A função retorna a raiz quadrada de x. Se x for negativo, retorna MathSqrt
indeterminado (o mesmo que uma pacata NaN).
MathSrand A função define o ponto de partida para gerar uma série de pseudorandom inteiros.
MathTan MathTan retorna a tangente de x. Se x é maior ou igual a 263, ou igual ou inferior a -
263, uma perda de importância no resultado ocorre. Neste caso, a função retorna um
valor indeterminado.
GlobalVariable Funções

Muitas funções para trabalhar com variáveis globais do cliente terminal estão descritos
no GlobalVariables seção. Na seção anterior, também mencionou que tinha um programa corretamente
projetado para apagar suas variáveis globais quando ele está sendo executado. N º GVs o cliente deve
permanecer no terminal todos os programas após ter sido abandonado.
Um ou mais GVs pode permanecer no terminal quando depurar programas usando as variáveis globais
do cliente terminal. Neste caso, um programador deve excluir GVs manualmente antes do próximo
lançamento de um programa depurado. Para automatizar esse processo, você pode criar um script que
apaga todas as variáveis globais do cliente terminal.
GlobalVariablesDeleteAll () Função
int GlobalVariablesDeleteAll (string prefix_name = NULL)
Elimina variáveis globais. Se não for especificado um prefixo para o nome, então todas as variáveis
globais disponíveis serão deletados. Caso contrário, ele irá excluir apenas os nomes das variáveis que
começam com o prefixo especificado. A função retorna o número de variáveis excluídas.
Parâmetros:
prefix_name - prefixo para os nomes das variáveis globais, devem ser suprimidos.
Abaixo está um exemplo de um script simples, deleteall.mq4, que elimina todas as variáveis globais do
cliente terminal.

//------------------------------------------------ --------------------
/ / Deleteall.mq4
/ / O programa é destinado a ser utilizado como um exemplo em MQL4 Tutorial
.
//------------------------------------------------ --------------------
int start () / / Especial início () função
(
GlobalVariablesDeleteAll (); / / Exclusão de todas GVs
PlaySound ( "W2.wav"); / / Som
retorno; / / Sair
)
//------------------------------------------------ --------------------
O script pode ser iniciado somente se nenhum programa usando GVs está sendo executado no cliente de
terminal. Caso contrário, executando o script pode quebrar a lógica dos outros executados programas
que podem resultar em acções descontroladas. Após a execução do script na janela de variáveis globais
(F3) do cliente terminal ficará vazia:

Fig. 153. Aparecimento de Variáveis globais na janela do terminal após o cliente deleteall.mq4 script é
executado.

Funções para Trabalhar com Variáveis globais

Função Síntese Info


GlobalVariableCheck Ele retorna True se um GV está disponível. Caso contrário, retorna
FALSE.
GlobalVariableDel Apaga uma variável global. Retorna TRUE se uma variável foi
eliminado com sucesso. Caso contrário, retorna FALSE.
GlobalVariableGet Ele retorna um valor de uma variável global, ou 0, se ocorrer um
erro.
GlobalVariableName A função retorna o nome de uma variável global, de acordo com seu
número de índice na lista as variáveis globais.
GlobalVariableSet Estabelece um novo valor para uma variável global. O sistema irá
criar uma nova variável, se não houver nenhuma já criada. A hora
do último acesso será devolvido, se a função foi executada com
sucesso. Caso contrário, ele retorna 0.
GlobalVariableSetOnCondition Estabelece um novo valor para uma variável global, se o seu valor
actual é igual ao valor do terceiro parâmetro check_value. A função
irá gerar o ERR_GLOBAL_VARIABLE_NOT_FOUND (4058) de erro e
retornará false se uma variável não existe. Retorna TRUE se a
função tenha executado com sucesso. Caso contrário, retorna
FALSE.
GlobalVariablesDeleteAll Elimina variáveis globais. Se o prefixo para o nome não é
especificado, então todas as variáveis globais serão deletados. Caso
contrário, ele elimina apenas os dos nomes começando com o
prefixo especificado. A função retorna o número de variáveis
excluídas.
GlobalVariablesTotal A função retorna o número total de variáveis globais.
Custom Indicadores

As funções dos indicadores personalizados permitem-lhe ajustar as definições necessárias para fazer
uma conveniente representação de um indicador. Vamos considerar alguns desses produtos (ver
também a Criação de Indicadores Custom).
SetIndexBuffer () Função
bool SetIndexBuffer (int índice, a dupla array [])
A funcionar array-junta uma variável que foi declarada a nível global com um indicador tampão
personalizado predestinada. O montante dos amortecedores, que são necessárias para o indicador é
definido utilizando a computação IndicatorBuffers () função e não pode ultrapassar 8. Em caso de
ligação com êxito, TRUE é retornado, caso contrário - FALSO. A fim de obter as informações detalhadas
sobre um erro que você deve ligar para o GetLastError () function.
Parâmetros:
Índice - Índice número de uma linha (de 0 a 7 valores são possíveis);
array [] - um nome do array que está conectado com um cálculo tampão.
SetIndexStyle () Função
void SetIndexStyle (int index, int tipo, int style = VAZIA, int width = VAZIA,
color = CLR_NONE CLR)
A função define um novo modelo, estilo, a largura ea cor de uma determinada linha do indicador.
Parâmetros:
Índice - Índice número de uma linha (de 0 a 7 valores são possíveis);
Tipo - indicador linha do tipo. Pode ser um dos listados os tipos de linhas indicadoras (ver Estilos de
Linhas Exibindo Indicator);
estilo - estilo da linha. Usado para as linhas 1 pixel de largura. Pode ser um dos estilos especificados na
linha de Estilos Indicador Linhas Exibindo apêndice. O VAZIO valor especifica que o estilo não será
alterada;
largura - largura da linha; valores admissíveis são - 1,2,3,4,5; VAZIA o valor especifica que a largura
não será alterada;
CLR - linha de cores. O valor vazio CLR_NONE significa que a cor não será alterada.

SetIndexLabel () Função
void SetIndexLabel (int index, string texto)
A função permite definir um indicador linha nome a ser exibido na DataWindow e no pop-up de ponta.
Parâmetros:
Índice - Índice número de uma linha (de 0 a 7 valores são possíveis);
texto - um texto descrevendo um indicador linha. NULL significa que o valor de uma linha não é
mostrada na DataWindow.

A exemplo do indicador simples mostrando Alto linha (indicatorstyle.mq4), que usa as funções descritas
acima:

//------------------------------------------------ --------------------
/ / Indicatorstyle.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------- 1 --
# propriedade indicator_chart_window / / Indic. é desenhada na janela
principal
# propriedade indicator_buffers 1 / / Quantidade de buffers
# propriedade indicator_color1 Azul / / Cor da primeira linha

dupla Buf_0 []; / / Indicador array abertura


//------------------------------------------------ --------------- 2 --
int init () / / Especial função init ()
(
SetIndexBuffer (0, Buf_0); / / Atribuindo a matriz para o buffer
SetIndexStyle (0, DRAW_LINE, STYLE_SOLID, 2); / / Linha de estilo
SetIndexLabel (0, "High Line");
retorno; / / Sair spec. função init ()
)
//------------------------------------------------ --------------- 3 --
int start () / / Especial função start ()
(
int i, / / Bar índice
Counted_bars; / / Valor calculado de barras
Counted_bars = IndicatorCounted (); / / Valor calculado de barras
i = Barras - Counted_bars - 1; / / Índice da primeira inúmero
while (i> = 0) / / Ciclo de barras para o inúmero
(
Buf_0 [i] = Máximo [i]; / / 0 de valor sobre o tampão iésimo bar
i -; / / Índice de cálculo para o próximo bar
)
retorno; / / Sair spec. função start ()
)
//------------------------------------------------ --------------- 4 --
1.2 O bloco contém as definições gerais de um indicador. Especifica-se com o comando # imóvel que o
indicador deve ser apresentado na janela principal, o indicador usa um tampão, a cor da linha é o
indicador azul. Um buffer array é aberto em bloco 1.2, também.
As funções acima especificadas são utilizados no bloco 2.3. A entrada:

SetIndexBuffer (0, Buf_0); / / Atribuindo a matriz para o buffer


atribui o buffer Buf_0 nomeado para o buffer com o índice 0. A entrada:

SetIndexStyle (0, DRAW_LINE, STYLE_SOLID, 2); / / Linha de estilo


determina o estilo da linha que tem o indicador índice 0. O DRAW_LINE constante indica que a linha
mostrada é simples, o STYLE_SOLID constante indica que a linha é sólido, e 2 especifica a largura da
linha. A entrada:

SetIndexLabel (0, "High Line");


atribui o nome ao indicador linha com o índice 0. O nome especificado pode ser visto na DataWindow e
na ponta do balão na janela do instrumento financeiro (fig. 810_3). Os nomes das linhas é conveniente,
se a janela contém uma série de linhas indicadoras; às vezes é a única forma de distinguir uma linha de
outra. O bloco 3.4 realiza o cálculo dos valores do indicador panóplia de elementos para a linha que é
usada para exibir os valores máximos de bares (a seqüência de matrizes indicador cálculo é descrito
na Criação de Indicadores Custom seção em detalhes).

Se o indicador é exibido em uma janela separada, em seguida, os níveis horizontal pode ser exibida
nesta janela também.
SetLevelValue () Função
void SetLevelValue (int nível, valor duplo)
Estabelece o valor especificado para o nível horizontal do indicador que é exibido em uma janela
separada.
Parâmetros:
nível - nível série (0-31).
valor - um valor para o nível especificado.
A utilização dos níveis horizontal pode ser muito conveniente, se você precisar visualmente para detectar
se o indicador linha está acima ou abaixo dos valores especificados. O simples indicador que calcula a
diferença entre o máximo eo preço mínimo da barra é mostrada abaixo. O mercado eventos são
interessantes para o utilizador (timidamente neste exemplo) se o indicador está acima da linha de 0,001
bar ou abaixo da barra de -0,001. A exemplo do indicador que mostra a diferença entre a Alta ea
Baixa (linelevel.mq4):

//------------------------------------------------ --------------------
/ / Linelevel.mq4
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ --------------- 1 --
# propriedade indicator_separate_window / / Indic. é tirado em um sep.
Janela
# propriedade indicator_buffers 1 / / Quantidade de buffers
# propriedade indicator_color1 Vermelho / / Cor da linha

dupla Buf_0 []; / / Indicador array abertura


//------------------------------------------------ --------------- 2 --
int init () / / Especial init () função
(
SetIndexBuffer (0, Buf_0); / / Atribuindo a matriz para o buffer
SetIndexStyle (0, DRAW_LINE, STYLE_SOLID, 2); / / Linha de estilo
SetIndexLabel (0, "High / Low Diferença");
SetLevelValue (0, 0,0010); / / A linha horizontal nível está definido
SetLevelValue (1, - 0,0010); / / Outro nível está definido
retorno; / / Sair do spec.init () função
)
//------------------------------------------------ --------------- 3 --
int start () / / Especial início () função
(
int i, / / Bar índice
Counted_bars; / / Valor calculado de barras

Counted_bars = IndicatorCounted (); / / Valor calculado de barras


i = Barras - Counted_bars - 1; / / Índice da primeira inúmero
while (i> = 0) / / Ciclo de barras para o inúmero
(
Buf_0 [i] = Máximo [i] - Baixo [i]; / / 0 tampão sobre o valor da barra i
if (Open [i]> Fechar [i]) / / se a vela é negra ..
Buf_0 [i] =- Buf_0 [i]; / / .. então reverter o valor
i -; / / Índice de cálculo para o próximo bar
)
retorno; / / Sair do spec.start () função
)
//------------------------------------------------ --------------- 4 --
A função é considerada utilizado em bloco no indicador 2.3. Neste caso, estão previstos dois níveis
horizontal. O primeiro valor na lista de parâmetros é o número do nível horizontal, o segundo é o valor
do nível especificado:

SetLevelValue (0, 0,0010); / / O nível do horiz. linha está definido


SetLevelValue (1, - 0,0010); / / Outro nível está definido
Os parâmetros de indicatorstyle.mq4 e linelevel.mq4 indicadores estabelecidos de tal forma são exibidas
na janela do instrumento financeiro e no DataWindow.

Fig. 154. Exibindo indicadores nas diferentes configurações do windows o cliente terminal.
Duas janelas - o DataWindow e do instrumento financeiro são mostrados na janela fig. 154. Você pode
ver a entrada contendo "High Line" do texto e 1,3641, no valor DataWindow. O mesmo inscrições são
mostrados na parte inferior da entrada de pop-up de ponta. A referida entrada é exibida na DataWindow
todo o tempo corre o indicador, o nome da linha em que não for alterado, mas o valor na parte direita
da a entrada depende da posição do cursor na janela do instrumento financeiro. O nome da linha que é
mostrado na janela pop-up ponta corresponde ao indicador linha o cursor está apontada.
O subwindow do indicador linelevel.mq4 contém as linhas horizontais que são colocados de acordo com
o usuário-os valores definidos. Se você mover o cursor sobre a linha vermelha indicador, em seguida, o
nome desta linha, neste caso o "Diferença entre a Alta ea Baixa", pode ser visto na janela pop-up ponta,
o valor no ponto do cursor pode ser visto ao direita do nome.
Funções de ajuste personalizado indicadores
Função Síntese Info
IndicatorBuffers Ela trata da memória de buffers que são utilizados para calcular um indicador
personalizado. A quantidade de buffers não pode exceder 8 e deve ser inferior
ao valor especificado na propriedade indicator_buffers # comando. Se o
indicador personalizado precisa de mais buffers para o cálculo, você deverá usar
esta função para especificar o número inteiro de buffers.
IndicatorCounted A função retorna uma quantidade de bares que não foram alterados desde o
último indicador lançamento. A maioria dos bares não necessitem recalculo.
IndicatorDigits O documento define a precisão (o número de símbolos depois da vírgula) para a
visualização do indicador valores.
IndicatorShortName Aí se define uma "curta" nome de um indicador a ser exibida no indicador da
subwindow e na DataWindow.
SetIndexArrow Estabelece um símbolo de uma linha que tem o indicador DRAW_ARROW estilo.
SetIndexBuffer Junta-lhe um array variável que seja declarada a nível global com um tampão
de um determinado indicador personalizado.
SetIndexDrawBegin O documento define um número de índice a partir do início de dados para o bar
a sorteio de um determinado indicador deve começar.
SetIndexEmptyValue Estabelece um valor vazio para o indicador linha. Vazio valores não são tiradas e
não são mostrados no DataWindow.
SetIndexLabel O documento define um nome de um indicador de linha para exibir as
informações na DataWindow e na ponta do balão.
SetIndexShift O documento define uma mudança para um indicador relativamente a linha do
gráfico começa. O valor positivo irá deslocar uma linha para a direita, o valor
negativo - para a esquerda. Ou seja, o valor calculado sobre o actual barra é
desenhada com o especificado, em relação ao actual barra de deslocamento.
SetIndexStyle Estabelece um novo tipo, estilo, a largura ea cor de um determinado indicador
linha (ver Estilos de Linhas Exibindo Indicator).
SetLevelStyle Estabelece um novo estilo, a cor ea largura horizontal para os níveis de um
indicador que é exibido em uma janela separada (ver Estilos de Linhas Exibindo
Indicator).
SetLevelValue Estabelece um valor especificado para o nível horizontal de um indicador que é
exibido em uma janela separada.

Comércio Funções

Todas as trocas de funções podem ser divididas em dois grupos - funções que fazem comércio ordens e
funções que retornam alguma ordem caracterizando valores. MQL4 tem apenas cinco funções que fazem
comércio e enviar encomendas para um servidor:

§ OrderSend () - para abertura do mercado e colocar ordem pendente;


§ OrderClose () - para fechamento do mercado;
§ OrderCloseBy () - fecho de mercado oposta ordens;
§ OrderDelete () - suprimindo encomendas pendentes;
§ OrderModify () - modificando todos os tipos de ordens.
A fim de utilizar funções listadas acima está descrito na Programação de Operações de Comércio na
seção detalhes. Todas as outras funções que não fazem comércio encomendas, mas a sua utilização é
muitas vezes necessária. Por exemplo, algumas vezes é necessário fechar algumas ordens de prioridade
na seqüência. Para fazer isso, você deve analisar as características de cada ordem no programa, a saber
- tipo de ordem, os lotes montante, ordens de stop-localização, etc Vamos analisar algumas funções que
permitem a obtenção de informações sobre uma encomenda.
OrderTotal () Função
int OrdersTotal ()

A função retorna o número total de encomendas abertos e pendentes.


OrderTakeProfit () Função
OrderTakeProfit duplo ()
A função retorna o valor do preço declarado quando a margem de lucro (ter lucro) da actual ordem
selecionada é atingida. A ordem tem de ser previamente selecionados através de OrderSelect () function.
OrderProfit () Função
OrderProfit duplo ()
Retorna o valor do lucro líquido (sem considerar o swaps e comissões) da ordem selecionada. É o lucro
não realizado para a abertura ordena lucro fixo e fechado para os despachos. A ordem tem de ser
previamente selecionados através de OrderSelect () function.
OrderLots () Função
OrderLots duplo ()
Retorna a quantidade de lotes de uma forma seleccionada. A ordem tem de ser previamente
selecionados através de OrderSelect () function.
O fragmento de programa que calcula o preço declarado fechar TakeProfit, fim lucrativo e da quantidade
de lotes é mostrado abaixo:

for (int i = 0; i <OrdersTotal (); i + +) / / Para todas as encomendas


(
if ((OrderSelect (i, SELECT_BY_POS) == true) / / Se existe próxima
(
ТР OrderTakeProfit duplo = (); / / TakeProfit de ordem
Lucro OrderProfit duplo = (); / / Portaria lucro
Lotes OrderLots duplo = (); / / Quantidade de lotes
//...... TP e lucro valores de utilização no programa .....
)
) / / Fim do ciclo corpo
É claro que cada função considerada (OrderTakeProfit (), OrderProfit () и OrderLots ()) não tem
quaisquer parâmetros ajustáveis, ou seja, a denotação de, por exemplo, o número de ordem, para
retornar o valor correspondente com as características deste indivíduo fim não está envolvido.
Para calcular as características de uma forma individual (de uma declararam preço do stop-encomendas,
a fim lucrativo e quantidade de lotes, neste contexto), você deve selecionar o primeiro necessária
ordem; isso irá informar sobre o programa a fim de executar cálculos com. Para fazê-lo você deve
executar o OrderSelect () função antes de iniciar os cálculos (ver fecho e apagando Orders). O comércio
funções executadas depois que vai retornar os valores que correspondem com as características
selecionadas fim.
A correta avaliação de uma ou de outra forma pelas características do programador não é pouco
significativo. Por exemplo, ao fim de resolver o problema fechando seqüência, você deve definir um
critério de cálculo que forma devem ser encerrados mais cedo e que um - posteriormente. Agora, vamos
dar uma olhada para a tarefa simples.

Problema 40. Comprar duas ordens estão atualmente abertos em um único símbolo. O
primeiro deles é aberto ao preço de 1,2000 a 0,5 lote, o segundo é aberto ao preço de
1,3000 em 1 lote. O preço atual é 1,3008. O critério para o comércio Comprar ordens
encerramento provocou. É necessário fazer uma decisão correcta, ou seja, para decidir
qual deveria ser vista como o primeiro fechados e que uma tal como o segundo.

Obviamente, o lucro a partir da primeira ordem faz 108 pontos, enquanto que a segunda é de 8
pontos. Embora à primeira vista, é aberta em uma menor quantidade de lotes, que tem o maior lucro do
que a um segundo, ou seja, o lucro da primeira encomenda é de US $ 540 e os lucros do segundo
despacho é de R $ 80. Fechando o primeiro fim de maio parece ser preferível, à primeira vista, porque
tem maior lucro. No entanto, é um misthought. É necessário analisar a eventual hipótese de fazer uma
decisão correta.
A ordem sequencial não iria fechar questão, se os preços não eram conhecidos de alteração durante o
período de ordens de fechamento. No entanto, o preço pode mudar durante a execução da instrução
para fechar uma das ordens. Portanto, a fim de que possam trazer mais prejuízos, em um cenário
negativo, deverá ser fechado em primeiro lugar. Se o preço afunda um ponto para baixo, o lucro da
primeira ordem vai diminuir em US $ 5, enquanto que a do segundo um vai fazer por $ 10. Obviamente,
a segunda ordem traria mais prejuízos, portanto, deve ser fechado em primeiro lugar. De tal forma, o
montante dos lotes tem o significado dominante ao decidir sobre fechamento ordem
sequencial. Rentáveis cenário não pode ser considerado aqui, porque desenvolve com as trocas
comerciais nos critérios do programa e, desta vez, o critério de fecho Comprar ordens tem
desencadeado.
Você deve considerar as características outra forma, se for necessário escolher entre duas ordens com a
mesma quantidade de lotes. Por exemplo, você pode considerar a distância entre o preço atual e
StopLoss o valor de cada encomenda. Ao mesmo tempo, você deve analisar qual das ordens traria mais
prejuízos, em caso de movimento rápido dos preços. A resposta é óbvia, bem como: a um (a partir de
ambas as ordens que são abertos na mesma quantidade de lotes) que tem o seu nível mais StopLoss a
partir do preço atual.
Assim você pode analisar as prioridades e todos os outros parâmetros de encomendas e compilar a lista
de prioridade orientada para os critérios a considerar quando se fazem com a decisão sobre o
encerramento ordens. Não é difícil identificar os critérios que devem ser desconsideradas. É aberto preço
(e os respectivos lucros do fim), por exemplo. A quantidade de dinheiro que o profissional tenha, neste
momento, é mostrada na coluna da Eqüidade cliente terminal. A origem deste valor não é importante
em que, nem ela é uma consequência da perda de um minério despachos mais, nem é resultado de um
lucro.
Todas as características necessárias de uma ordem podem ser recebidas utilizando o correspondente
comércio funções:
Comércio Funções
Função Síntese Info
Erros de execução Qualquer operação
comercial (OrderSend, OrderClose, OrderCloseBy, OrderDelete ou OrderModifyfunções)
pode terminar sem sucesso por um escore de motivos e nem devolver o bilhete
número negativo ou FALSE. Você pode descobrir o motivo da falha, usando
o GetLastError. Cada erro deve ser processado em sua própria maneira. A tabela
abaixo contém as recomendações gerais.
OrderClose Encerra posição. Retorna TRUE, se a função foi finalizada com sucesso. Ele retorna
FALSO, se a função não consegue terminar.
OrderCloseBy Encerra uma posição aberta com os outros que se abriu na direção oposta para o
mesmo símbolo. Retorna TRUE. se a função foi finalizada com sucesso. Ele retorna
FALSO, se a função não consegue terminar.
OrderClosePrice Ela retorna o próximo preço de ordem seleccionada.
OrderCloseTime Ela retorna a tempo para o fechamento da ordem selecionada.
OrderComment Ela retorna o comentário de ordem seleccionada.
OrderCommission Ela devolve o valor da comissão calculada ordem seleccionada.
OrderDelete Elimina o anteriormente colocado na pendência judicial. Retorna TRUE, se a função foi
finalizada com sucesso. Ele retorna FALSO, se a função não consegue terminar.
OrderExpiration Ele retorna à data do termo da ordem pendente seleccionada.
OrderLots Ela retorna a quantidade de lotes de ordem seleccionada.
OrderMagicNumber Ela retorna a identificação ( "mágico") o número de ordem selecionada.
OrderModify Ele modifica os parâmetros das ordens anteriormente abertos e encomendas
pendentes. Retorna TRUE se a função foi finalizada com sucesso. Ele retorna FALSO,
se a função não consegue terminar.
OrderOpenPrice Ela retorna a abrir preço da ordem seleccionada.
OrderOpenTime Ela retorna a tempo de abertura da ordem selecionada.
OrderPrint Ele entra na ordem informações para a revista.
OrderProfit Ela devolve o lucro líquido (sem considerar o swaps e comissões) da ordem
selecionada. É o lucro não realizado para a abertura ordena lucro fixo e fechado para
os despachos.
OrderSelect A função escolhe a fim de colaborar com posteriormente. Retorna TRUE se a função
foi finalizada com sucesso. Ele retorna FALSO, se a função não consegue terminar.
OrderSend A principal função de abertura ordena e colocar encomendas pendentes. Ele retorna o
número do bilhete que foi designado para o fim do comércio por servidor, ou -1, em
caso de falta para terminar a operação.
OrdersHistoryTotal Ele retorna o número de postos fechados e suprimiu ordens na história da conta
corrente, carregado para o cliente de terminal.
OrderStopLoss Ele retorna a posição do preço perto quando ele atinge o nível perda (stop loss), da
ordem selecionada atualmente.
OrdersTotal Ela devolve o número total de encomendas pendentes e aberta.
OrderSwap Ela devolve o valor do swap atualmente selecionado fim.
OrderSymbol Ela retorna o nome para o símbolo selecionado atualmente fim.
OrderTakeProfit Ela retorna o preço perto quando ele atinge a margem de lucro (ter lucro) da ordem
selecionada atualmente.
OrderTicket Ele retorna o número de bilhete da ordem selecionada atualmente.
OrderType Ela retorna o tipo de operação a fim presentemente seleccionado.

Criação de um programa normal

Como regra, depois de ter codificado uma série de programas na MQL4 simples aplicação, um
programador vai para um projeto mais complexo - a criação de um programa prático para uso
prático. Simples programas, em alguns casos, não satisfazem as necessidades de um programador de
negociação, pelo menos, duas razões:
1. A limitação funcional dos programas simples não lhes permite fornecer um comerciante com todas as
informações e ferramentas de gestão comercial, o que não torna a utilização deste tipo de programas
eficientes o suficiente.
2. O código de imperfeição simples programas torna difícil seu posterior desenvolvimento de serviços
que visem expandida.
Nesta seção, nós representamos uma das alternativas possíveis de realizar uma negociação Expert
Advisor que pode ser considerada como uma base para seus próprios projetos.

§ Estrutura de um programa normal


A disponibilidade de muitas funções definidas por usuários em um programa permite-lhe para
criar algoritmos potente e flexível para processar a informação. Compiler directiva # include
permite que você use a sua função (uma vez por escrito e depurado) em outros
programas. Dessa maneira, você pode criar suas próprias bibliotecas ou de utilização de código-
fonte aberto evolução de outros programadores.

§ Ordem Contabilidade
A seção considera um exemplo de user-defined função Terminal () que é realizado em separado
incluir um arquivo com a extensão. Mqh. Esses arquivos estão ligadas ao programa durante a
compilação código usando a directiva # include.

§ Função dados
Um exemplo de utilização mais de uma função definida que ajuda a organizar a saída do texto
informações sobre o atual trabalho de um EA. Esta função lhe permite abandonar a função
Comment () para apresentar o texto na janela do gráfico.A função é percebido como um indicador
em um gráfico separado subwindow da janela.

§ Evento Função Monitoramento de


Um comerciante não pode detectar todos os eventos durante a negociação. O programa gravado
em MQL4 lhe permite detectar as mudanças nas condições comerciais ou quaisquer
situações. user-defined função Eventos () conecta-se à EA utilizando a directiva # include e aplica
as chamadas para incluir outra função, Inform ().

§ Volume definindo função


O cálculo do volume de uma posição a ser aberto é uma das tarefas dos equity / gestão de
risco. O usuário-função definida Lot () é um pequeno exemplo utilizado para esses fins.
§ Negociação critérios para definir função
A parte mais importante de qualquer negociação é o tempo de detecção de entrar no mercado e
que o encerramento de uma posição. A criação das regras de negociação ou critérios é o núcleo
da qualquer Expert Advisor. User-defined função Critério () está ligado com a directiva #
include. Mostra como uma EA pode decidir com base nos valores dos indicadores sobre se a
actual situação está em conformidade com um ou outro critério.

§ Comércio Funções
A actual situação tem sido analisadas com a função Critério (), então agora temos de fazer trades:
abrir, fechar, alterar ou apagar uma ordem pendente. Todas estas operações podem ser
colocados em separado user-defined funções: Comércio (), Close_All () e Open_Ord (). As ordens
stop são movidos proteger usando a função definida Tral_Stop de usuário ().

§ Erro ao processar função


Erro de controle é parte integrante de um Expert Advisor. Este é você quem determina como
processar a mensagem sobre o comércio movimentado contexto, não sobre os preços para o
símbolo solicitado, etc Em alguns casos, é suficiente para exibir uma mensagem sobre o erro. Em
outros casos, seria razoável tentar repetir o comércio pedido e após um certo período de tempo. É
necessário determinar como um ou outro erro será processado. A função definida Erros de
usuário () mostrados nesta seção processos erros utilizando o operador seleção switch ().

Estrutura de um programa normal

A marcante em um programa normal é sua estrutura que permite a sua fácil utilização para algumas
funções definidas por usuários ou outros. Por conveniência, funções definidas por usuários são
geralmente formadas como incluir arquivos (. Mqh) que estão armazenados na
pasta Terminal_directory \ peritos \ include.
Como regra geral, um programa normal contém todas as três funções especiais que chamam a user-
defined funções necessárias para sua execução. User-defined funções, por sua vez, podem ligar para
outro usuário, funções definidas para efeitos de execução, cada um deles tenha a sua própria finalidade
funcionalmente delimitadas.
Ao Especialista Assessor de usuário pode conter funções definidas com as mais diversas
propriedades. Algumas funções, por exemplo, são destinados aos eventos de monitoramento e saída de
dados convenientes, outras funções são utilizadas para formar comércio pedidos, o terceiro funções são
destinados a diferentes cálculos, por exemplo, para definir critérios de negociação, cálculo de custos
ordem, etc A decisão sobre o que funciona para usar em um programa depende da EA e com que
finalidade serviço o programa se destina a proporcionar ao usuário com um. Na fig. 155 a seguir, você
pode ver um diagrama do bloco uma negociação normal EA construído sobre um pequeno conjunto de
funções definidas pelo utilizador.
Fig. 155. Esquema de um programa normal (Expert Advisor).

As setas no diagrama mostram as relações entre funções. Por exemplo, a ordem contabilística em
função da EA é chamada a partir de funções especiais init () e começar (); ela também pode ser
chamado de qualquer outro local dentro do programa. Na parte direita do diagrama, as setas estão
conectando mostrado que simbolizam a possibilidade de pedir um user-defined função da outra. Por
exemplo, a função definindo critérios negociação não pode ser chamado de qualquer função específica,
mas pode ser convocado para a execução de uma função comercial. Os dados função é chamada a partir
da Função deinit especiais () e, se necessário, de outras funções, por exemplo, o erro de processamento
função, o comércio funções, ou a partir do evento função de monitoramento. Os arquivos incluem
declaração da variável não pode ser chamado a partir de qualquer função, uma vez que as contidas no
código não é a descrição de uma função que pode ser chamados e executados. Esse arquivo contém as
linhas da declaração variável global, por isso é apenas uma parte de um EA. A fim de compreender a
forma como as diferentes partes de uma relacionará em EA, vamos considerar a ordem de criação e uso
de arquivos de inclusão.
Usando incluir arquivos

Se um programa aplicativo contém uma grande variedade de linhas de programa, às vezes é difícil de
depurar-lo - o programador tem de percorrer o programa texto muitas vezes, a fim de fazer mudanças
no código em uma ou outra localização.Em tais casos, por conveniência, o programa pode ser dividido
em vários fragmentos, cada um formado como incluir um arquivo separado. Incluir arquivos podem
conter quaisquer fragmentos código a ser usado no programa. Cada função usada no programa é
geralmente formado como incluir um arquivo. Se várias funções estão interligadas logicamente, incluir
um arquivo pode conter a descrição de várias funções definidas pelo utilizador.
Na seção Informações sobre uma Conta, que consideramos um exemplo de código que impede a
protecção contra a utilização não autorizada de programas empresariais. No Expert Advisor check.mq4, a
parte correspondente do programa é representado como o código de utilizador definido função Check (),
a descrição do que está contido diretamente no código-fonte da EA. Nas EAusualexpert.mq4 (ver Fig.
91,3), esta função é utilizada, também. No entanto, neste caso, a função é formado como incluir o
arquivo Check.mqh.
Funções Definidas Por Usuário Marque ()
bool Check ()
A função retorna TRUE, caso as condições de utilização do aplicativo programa sejam cumpridas. Caso
contrário, retorna FALSE.
As condições de utilização do programa são consideradas como cumpridas, se:

§ o programa é usado em uma conta demo;


§ a conta foi aberta com SuperBank;
§ o usuário tenha fixado o valor correto da variável externa livramento condicional quando
trabalhava em uma conta real.

Os arquivos incluem Check.mqh contendo a descrição da função definida pelo utilizador-Check ():

//------------------------------------------------ ------------------------
----------
/ / Check.mqh
/ / O programa é destinado a ser utilizado como um exemplo em MQL4
Tutorial.
//------------------------------------------------ ------------------------
----- 1 --
/ / A função controlar a legalidade do programa usado
/ / Entradas:
/ / - Variável global "livramento condicional"
/ / - Local constante "SuperBank"
/ / Retorno valores:
/ / True - se as condições de utilização sejam cumpridas
/ / Falso - se as condições de utilização são violados
//------------------------------------------------ ------------------------
----- 2 --
extern int livramento condicional = 12345; / / Senha para trabalhar em uma
conta real
//------------------------------------------------ ------------------------
----- 3 --
bool Check () / / Definido pelo usuário unção
(
if (IsDemo () == true) / / Se for uma conta demo, então ..
retorno (true); / / .. não existem outras limitações
quando (AccountCompany () == "SuperBank") / / Para os clientes corporativos
..
return (true); / / .. nenhuma senha for necessária
Key AccountNumber int = () * 2 + 1000001; / / Calcular a tecla
if (Key == livramento condicional) / / Se a senha for verdade, então ..
return (true); / / .. permitem ao usuário trabalhar em uma conta real
Informar (14); / / Mensagem sobre o uso indevido
return (false); / / Sair do usuário-função definida
)
//------------------------------------------------ ------------------------
----- 4 --
É fácil notar que inclua o nome do arquivo é o mesmo que o nome da função que ele contém. Esta não
é exigido pelas regras do MQL4. Geralmente, o nome de um arquivo include não terá de ser igual ao
nome da função que ele contém. Ele se torna ainda mais evidente, se considerarmos que um arquivo
pode conter a descrição das diversas funções ou fragmento de um programa que não é uma função de
todo. No entanto, a prática de dar um arquivo incluir o mesmo nome do que continha a função é
viável.Isto facilita consideravelmente o trabalho de um programador: usando os nomes de arquivo, ele
ou ela será facilmente saber quais funções existem na pasta Terminal_directory \ peritos \
include. De forma a incluir o programa fragmento contido no arquivo, você deverá usar a directiva #
include.
Directiva # include

# include <nome_do_ficheiro>
# include "File name"

A directiva # include pode ser especificado em qualquer local dentro do programa. No entanto, todos os
fragmentos incluídos são colocados no início do texto-fonte arquivo. Pré irá substituir a linha # include
<file_name> (ou # include "nome_do_arquivo") com o conteúdo do arquivo do nome indicado.
Ângulo entre parênteses significa que o arquivo será retirado do diretório padrão Terminal_directory \
peritos \ incluem (o diretório atual não é visualizada). Se o nome do arquivo está entre aspas, vai ser
pesquisado no diretório atual, ou seja, no diretório que contém o arquivo básico do texto-fonte (o
diretório padrão não é visualizada).
Abaixo está um normal Expert Advisor, usualexpert.mq4. Tudo incluir arquivos são colocados na cabeça
parte do programa.

//------------------------------------------------ ------------------------
----------------
/ / Usualexpert.mq4
/ / O código deve ser usado apenas para fins educacionais .
//------------------------------------------------ ------------------------
----------- 1 --
# propriedade copyright "Copyright © Book, 2007"
# propriedade link "http://AutoGraf.dp.ua"
//------------------------------------------------ -------------------- ---
------------ 2 --
# include <stdlib. mqh>
# include <stderror. mqh>
# include <WinUser32. mqh>
//------------------------------------------------ -------------------- ---
----------- - 3 --
# include <Variables. mqh> / / Descrição das variáveis
# include <Confira. mqh> / / C Hecking legalidade dos programas usados
# include <Terminal. mqh> / / Portaria contabilidade
# include <Eventos. mqh> / / Evento função de monitoramento
# include <Inform. mqh> / / Dados função
# include <Comércio. mqh> / / Comércio função
# include <Open_Ord. mqh> / / Abrindo uma ordem do modelo predefinimos
# include <Close_All. mqh> / / Fechar todas as encomendas do modelo
predefinimos
# include <Tral_Stop. mqh> / / StopLoss modificação para todas as
encomendas do modelo predefinimos
# include <Lot. mqh> / / Cálculo do montante de lotes
# include <Criterion. mqh> / / Trading critérios
# include <Erros. mqh> / / Erro ao processar função
//------------------------------------------------ ------------- ----------
---------- - 4 --
int init () / / Função Especial 'init'
(
Level_old = MarketInfo (Symbol (), MODE_STOPLEVEL); / / Min. distância
Terminal (); / / Portaria função contabilística
retorno; / / Sair init ()
)
//------------------------------------------------ ------------- ----------
---------- - 5 --
int start () / / Especial função 'iniciar'
(
if (Check () == false) / / Se as condições de utilização ..
retorno; / / .. não são cumpridas, então saia
PlaySound ( "tick.wav"); / / Em cada carrapato
Terminal (); / / Portaria função contabilística
Eventos (); / / Informações sobre os eventos
Comércio (Critério ()); / / Comércio função
Informar (0); / / Para mudar a cor dos objectos
retorno; / / Sair start ()
)
//------------------------------------------------ ------------- ----------
---------- - 6 --
int deinit () / / Função Especial deinit ()
(
Informar (- 1); / / Para excluir objetos
retorno; / / Sair deinit ()
)
//------------------------------------------------ ------------- ----------
---------- - 7 --
No bloco 2.3, estamos incluídos no programa padrão arquivos stdlib.mqh, stderror.mqh e
WinUser32.mqh utilizando a directiva # include. Ela não é necessário usar esses arquivos no
programa. Por exemplo, stderror.mqh arquivo contém a definição do padrão utilizado no erro constantes
transformações. Se não for prestado tratamento de erro no programa (ou seja, essas constantes não são
usados), então não há necessidade de incluir esse arquivo em texto-fonte. Ao mesmo tempo,
geralmente é necessário incluir esses arquivos em um programa normal.
No bloco 3.4, o programa inclui alguns arquivos contendo a descrição das funções definidas pelo
utilizador. Utilizando a directiva # include na linha abaixo:

# include <Confira. mqh> / / C Hecking legalidade dos programas usados


o texto-fonte do programa inclui a função definida Check-usuário (). Programador pode ver o código
fonte do EA (neste caso,usualexpert.mq4) como ela é representada acima. No entanto, o texto-fonte do
programa é modificado na compilação, ou seja, cada linha contendo a directiva # include é substituído
no programa com o texto contido no arquivo do nome indicado. Assim, um arquivo executável. Ex4 é
criado com base no código completo do Expert Advisor, em que cada linha # include
<nome_do_ficheiro> (ou # include "Nome do arquivo") é substituído pelo código correspondente
fragmento.
Um exemplo de incluir um arquivo contendo um fragmento programa que não é função da descrição é
arquivo Variables.mqh.Este arquivo está incluído no programa texto na linha:

# include <Variables. mqh> / / Descrição das variáveis


e contém a descrição das variáveis globais utilizadas por diferentes funções definidas pelo utilizador.

//------------------------------------------------ ------------------- ----


---- --
/ / Variables.mqh
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ ------------- -------- -
1 --
/ / Descrição das variáveis globais
extern dupla Lotes = 0,0; / / Quantidade de lotes
Percentual extern int = 0; / / Repartidos fundos percentual
StopLoss extern int = 100; / / StopLoss para novas encomendas (em pontos)
extern int TakeProfit = 40; / / TakeProfit para novas encomendas (em
pontos)
TralingStop extern int = 100; / / TralingStop mercado de encomendas (em
pontos)
//------------------------------------------------ -------- --------------
- 2 --
int
Level_new, / / Novo valor da distância mínima
Level_old, / / Anterior valor da distância mínima
Mas_Tip [6]; / / Portaria tipo array
/ / [] Ordem tipo: 0 = B, S = 1, 2 =, BL, SL = 3, 4 = BS, 5 = SS
//------------------------------------------------ ------ -------- --------
- 3 --
dupla
Lots_New, / / Quantidade de lotes para novas encomendas
Mas_Ord_New [31] [9], / / Corrente fim array ..
Mas_Ord_Old [31] [9]; / / .. velha ordem array
// 1st index = order number in the list
/ / [] [0] não pode ser detectado
/ / [] [1] para abrir preço (preço abs. valor)
/ / [] [2] StopLoss da encomenda (preço abs. valor)
/ / [] [3] TakeProfit da encomenda (preço abs. valor)
/ / [] [4] o número de ordem
/ / [] [5] ordem volume (abs. preço valor)
/ / [] [6] 0 = fim tipo B, S = 1, 2 =, BL, SL = 3, 4 = BS, 5 = SS
/ / [] [7] Despacho número mágico
/ / [] [8] 0 / 1 o facto de disponibilidade dos comentários
//------------------------------------------------ -----------------------
4 --
De acordo com as regras de MQL4, qualquer variável (incluindo aqueles mundial) devem ser declarados
antes de a primeira referência a essa variável. Por este motivo, o arquivo Variables.mqh está incluída no
programa e os arquivos localizados acima das funções que usam os valores das variáveis especificadas
neste arquivo. Pela mesma razão, todas as variáveis globais são colocados nesse arquivo.
Em alguns (raros) casos, é tecnicamente possível declarar uma variável global em incluir um arquivo que
descreve a função, na qual o valor dessa variável é usada no primeiro programa. Nesses casos, é
necessário manter a ordem, incluindo o arquivo. Ou seja, a linha que contém o programa directiva #
include que inclui o arquivo (com a declaração de uma variável global) para o programa deve ser
colocado acima do texto do que as linhas que incluem outros arquivos usando o valor dessa variável
global.
Em outros casos, é mesmo tecnicamente impossível fazer isso. Por exemplo, se temos dois incluir
arquivos, cada um deles usando duas variáveis globais, um dos quais é declarada em um arquivo e outro
é declarado no outro arquivo, chegaremos a um erro na elaboração desse programa, uma vez que,
independentemente do processo, incluindo a ordem, é uma das variáveis usadas antes que seja
declarado no programa. Por isso mesmo, é uma prática habitual em um programa normal de declarar
todas as variáveis globais, sem excepções, em um arquivo que está incluído no programa antes de
outros arquivos que contêm a descrição de funções definidas pelo utilizador.
No bloco 1.2 de incluir o arquivo Variables.mqh, todas as variáveis são externas especificado, os valores
de que se determine a quantidade de lotes para novas encomendas, a percentagem atribuída a margem
livre para novas encomendas, a solicitação de preços para parar de encomendas do mercado
encomendas a ser aberto, bem como a distância de TralingStop para modificação de ordem
StopLoss. Nos blocos 2-4, outras variáveis globais são dadas, o sentimento de que se tornará evidente
após examinar as correspondentes funções definidas pelo utilizador. As subseções desta seção
representam incluir arquivos, cada um contendo a descrição das funções definidas por usuários do
mesmo nome.
Ordem Contabilidade

Nós mencionados acima, que não havia regras estritas para fazer programa algoritmos. Ao mesmo
tempo, a esmagadora maioria dos algoritmos implica uma tomada de decisões comerciais de acordo com
o actual estado das encomendas disponíveis.Em alguns casos, por exemplo, uma abertura do mercado
não precisam de nenhuma outra forma ordens disponíveis no mercado a partir do momento do
comércio. Em outros casos, não pare de ordens disponíveis no mercado pode ser vista uma condição
necessária para a colocação de uma encomenda pendente. Sabemos também alguns algoritmos que
implica colocar duas encomendas pendentes dirigidos de forma diferente.
A fim de cumprir os requisitos de uma ou outra tática ou estratégia, o momento da tomada de decisão,
você deve saber sobre o status atual - o que mercado e encomendas pendentes estão disponíveis e
quais são as características que eles têm? Você pode usar uma das duas soluções possíveis.
De acordo com a primeira solução, o programa necessário fragmentar código (no qual são analisadas as
ordens) é escrito diretamente no local no programa, onde o conjunto de ordens disponíveis e suas
características devem ser encontradas para fora. Esta solução é tecnicamente viável, mas que acaba por
ser ineficiente, se você quiser fazer alterações no algoritmo. Neste caso, o programador tem que analisa
o programa em todos os locais onde são analisados os status ordem, e fazer alterações em cada
localidade. Outro, mais eficaz solução é criar uma ordem universal contabilidade função uma vez e
utilizá-lo todas as vezes, quando você quiser atualizar as informações sobre o status atual ordem. Por
um lado, esta solução permite que você reduza o programa código. Por outro lado, permite que o
programador para usar esta função quando já prontas e codificação outros programas.
No intuito de criar uma ordem contabilística funcionar corretamente, você deve primeiro decidir quais
parâmetros devem ser contabilizados. Na maioria dos casos, os valores dos seguintes parâmetros são
usados na tomada de decisões comerciais:

§ montante total de encomendas;


§ a quantidade de encomendas de cada tipo (por exemplo, a quantidade de encomendas Comprar,
SellStop ordens, ou BuyLimit despachos, etc);
§ todas as características de cada ordem (bilhete, StopLoss e TakeProfit níveis de volume em lotes,
etc.)

As informações acima devem estar disponíveis para outras funções, a saber, aqueles, em que esta
informação é processada. Por esta razão, todos os parâmetros que caracterizam fim estados são os
valores globais das matrizes. No total, estão previstas três matrizes de ordem contabilística:

§ a matriz de encomendas actual, Mas_Ord_New, que contém informações sobre todas as


características do mercado e todas as encomendas pendentes disponível no momento atual, ou
seja, dentro do período da última execução da função;
§ a matriz de velhas ordens, Mas_Ord_Old, que contém informações sobre todas as características
do mercado e todas as encomendas pendentes disponíveis no momento da execução da função
anterior;
§ Mas_Tip a matriz, os valores dos quais são os montantes das ordens de tipos diferentes (no
momento atual).
Arrays Mas_Ord_New e Mas_Ord_Old são semelhantes e equidimensional; a diferença entre eles é o que
reflecte uma antiga do estado atual das encomendas, enquanto a segunda mostra a um estado
anterior. Vamos dar uma consideração mais atenta aos valores contidos nos elementos dessas matrizes.
Tabela 4. Correspondência dos elementos de arrays Mas_Ord_New e Mas_Ord_Old com características
ordem.

Não Abrir Número de Volume, Tipo de Magic


StopLoss TakeProfit em lotes Ordem Comentar
definido Preço pedido Number
Índices 0 1 2 3 4 5 6 7 8
0 2,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0
1 0,0 1,2583 1,2600 1,2550 123456,0 1.4 1,0 1177102416,0 1,0
2 0,0 1,2450 1,2580 1,2415 123458,0 2.5 2,0 1177103358,0 0,0
3 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0
. . . 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0
30 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0
O primeiro índice da matriz (linhas) define o número da ordem do array. As características de primeira
ordem detectado (entre todas as ordens no mercado aberto e colocado encomendas pendentes) são
colocadas na primeira linha da matriz, as da segunda ordem detectadas serão colocadas na segunda
linha, etc O tamanho do array para o primeiro índice é igual a 31, deste modo, a matriz é destinado a
armazenar informação de cerca de 30 ordens de, no máximo, se eles estão simultaneamente disponíveis
em uma conta de exploração. Se a estratégia comercial permite que a disponibilidade de mais de trinta
ordens simultaneamente, você deverá especificar o valor correspondente para os primeiros índice
quando você declarar o array. (Na maioria dos casos, o valor de 30 exceda consideravelmente a
necessidade real geralmente varia de 2 a 10.15 ordens. Usamos o valor de 30 neste exemplo, pois
suponho que a função pode ser usado para muito incomum estratégias comerciais, como bem).
O segundo índice na tabela (colunas) representa ordem características. Cada elemento da matriz com o
segundo índice igual a 1 contém o valor da encomenda abertas preço, com índice 2 - eles contém o
valor de StopLoss fim, 3 - TakeProfit, etc (ver Tabela 4). Array elemento com índice [0] [0], tem um
valor que é igual à quantidade total de ordens disponíveis no array. N º array elementos que tenham a
primeira ou a segunda índices iguais a 0 são utilizados (com excepção elemento com índice [0] [0]).
A Tabela 4 representa o status de uma matriz que contém informações sobre dois despachos que estão
simultaneamente disponíveis no comércio em um determinado momento. Mas_Ord_New A matriz
elemento [0] [0] tem o valor de 2,0 - o montante total das encomendas é de dois. Os elementos da
primeira linha da matriz conterá os valores das características do mercado fim Sell (Mas_Ord_New [1]
[6] = 1,0, consulte Tipos de Ofícios), aberta pelo lote 1-4 (Mas_Ord_New [1] [5] = 1.4 ) E com o
número 123456 (Mas_Ord_New [1] [4] = 123456,0). O valor do elemento Mas_Ord_New [1] [8] = 1,0
significa que este despacho não tem comentário campo vazio. Na segunda linha da matriz, os valores
que caracterizam a segunda ordem estão contidas. Particularmente, o elemento matriz Mas_Ord_New
[2] [6], tem o valor de 2,0, isso significa que é BuyLimit.
Array Mas_Tip representa a quantidade de encomendas de cada tipo. Os valores desta matriz índices são
atribuídos aos tipos de tráfegos (ver Tipos de Ofícios). Isto significa que o elemento de array Mas_Tip
com índice 0 contém o valor de mercado dos despachos do tipo Buy simultaneamente disponíveis no
comércio, o índice 1 significa Vender quantidade de encomendas, 2 significa que o índice de BuyLimit
despachos, etc Para a situação mostrada na Tabela 4, os elementos do array Mas_Tip terão os seguintes
valores:
Tabela 5. Correspondência dos elementos do array Mas_Tip com a quantidade de encomendas de
diferentes tipos.
Comprar Vender BuyLimit SellLimit BuyStop SellStop
Índice 0 1 2 3 4 5
Valor 0 1 1 0 0 0
Neste caso, os valores dos elementos do array Mas_Tip implicam o seguinte: Mas_Tip [1] igual a 1
significa que existe uma ordem Sell negociados; Mas_Tip [2] igual a 1 significa que existe uma ordem
pendente BuyLimit na negociação. Outros elementos do array têm valores zero - isto significa que não
existem esses tipos de ordens de negociação. Se há várias encomendas do mesmo modelo
simultaneamente disponíveis no comércio, o elemento correspondente da matriz terá o valor
correspondente ao montante de tais ordens. Por exemplo, se existem três ordens BuyStop na
negociação, o elemento Mas_Tip [4] terá o valor de 3.
A ordem contabilística função Terminal () sugeriu incluir aqui é formado como arquivo Terminal.mqh.
Funções Definidas Por Usuário Terminal ()
int Terminal ()
As contas função do mercado e encomendas pendentes. A execução da função traduz-se na
transformação dos valores das seguintes matrizes globais:

§ Mas_Ord_New - o conjunto de características de ordens disponíveis a partir do momento da


execução da função;
§ Mas_Ord_Old - o conjunto de características de ordens disponíveis a partir do momento da
execução da função anterior;
§ Mas_Tip - a matriz do montante total das encomendas de todos os tipos.

Incluir arquivo Terminal.mqh que contém a descrição da ordem contabilística função Terminal ():

//------------------------------------------------ --------------------
/ / Terminal.mqh
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ ------------------------
------ 1 --
/ / Portaria função contabilística
/ / Global variáveis:
/ / Mas_Ord_New [31] [9] / / O mais recente conhecido ordens array
/ / Mas_Ord_Old [31] [9] / / O anterior (antigo) ordens array
/ / 1o índice = número de ordem
/ / [] [0] não definida
/ / [] [1] para abrir preço (preço abs. valor)
/ / [] [2] StopLoss da encomenda (preço abs. valor)
/ / [] [3] TakeProfit da encomenda (preço abs. valor)
/ / [] [4] o número de ordem
/ / [] [5] ordem volume em lotes (preço abs. valor)
/ / [] [6] 0 = fim tipo B, S = 1, 2 =, BL, SL = 3, 4 = BS, 5 = SS
/ / [] [7] fim número mágico
/ / [] [8] 0 / 1 comentário disponibilidade
/ / Mas_Tip [6] / / Array da quantidade de encomendas de todos os tipos
/ / [] Ordem tipo: 0 = B, S = 1, 2 =, BL, SL = 3, 4 = BS, 5 = SS
//------------------------------------------------ ------------------------
------ 2 --
int Terminal ()
(
Qnt int = 0; / / Pedidos counter
//------------------------------------------------ ------------------------
------ 3 --
ArrayCopy (Mas_Ord_Old, Mas_Ord_New); / / Salva o precedente histórico
Qnt = 0; / / Zeroize ordens counter
ArrayInitialize (Mas_Ord_New, 0); / / Zeroize o array
ArrayInitialize (Mas_Tip, 0); / / Zeroize o array
//------------------------------------------------ ------------------------
------ 4 --
for (int i = 0; i <OrdersTotal (); i + +) / / Para mercado, e enquanto se
aguarda ordens
(
if ((OrderSelect (i, SELECT_BY_POS) == true) / / Se houver uma próxima a
& & (OrderSymbol () == Symbol ())) / / .. e os nossos par cambial
(
//------------------------------------------------ --------------------- 5
--
Qnt + +; / / Valor das encomendas
Mas_Ord_New [Qnt] [1] = OrderOpenPrice (); / / Portaria abertas preço
Mas_Ord_New [Qnt] [2] = OrderStopLoss (); / / SL preço
Mas_Ord_New [Qnt] [3] = OrderTakeProfit (); / / TP preço
Mas_Ord_New [Qnt] [4] = OrderTicket (); / / Número de ordem
Mas_Ord_New [Qnt] [5] = OrderLots (); / / Quantidade de lotes
Mas_Tip [OrderType ()] + +; / / Valor das ordens do tipo
Mas_Ord_New [Qnt] [6] = OrderType (); / / Tipo de Ordem
Mas_Ord_New [Qnt] [7] = OrderMagicNumber (); / / Número mágico
if (OrderComment () == "")
Mas_Ord_New [Qnt] [8] = 0; / / Se não houver um comentário
diferente
Mas_Ord_New [Qnt] [8] = 1; / / Se houver um comentário
//------------------------------------------------ --------------------- 6
--
)
)
Mas_Ord_New [0] [0] = Qnt; / / Valor das encomendas
//------------------------------------------------ ------------------------
------ 7 --
retorno;
)
//------------------------------------------------ ------------------------
------ 8 --

No bloco 1-2, damos um comentário descrevendo as matrizes globais utilizadas na função. As matrizes
globais são declaradas em um arquivo include Variables.mqh. No bloco 3.4, o conteúdo do array
Mas_Ord_New é copiado para a matriz Mas_Ord_Old.Assim, os já conhecidos estado das encomendas é
armazenada e que pode ser utilizado mais no programa. Em seguida, os valores dos elementos de arrays
Mas_Ord_New e Mas_Tip mostrando o novo estatuto das ordens tem sido zeroized antes de os dados
sejam atualizados no bloco 4.7.
O bloco 4.7 contém o ciclo 'para', em que todos na expectativa do mercado e as ordens são controlados
um por um para o símbolo, para a janela da qual é anexado à EA. As encomendas são selecionados
utilizando a função OrderSelect (), de acordo com o MODE_TRADES parâmetro definido por padrão. No
bloco 5.6, todas as características necessárias são calculados para os selecionados ordens, os dados
obtidos são armazenados no conjunto de novas encomendas, Mas_Ord_New. Ao mesmo tempo, a
quantidade de encomendas de todos os tipos é calculado, os valores obtidos são atribuídos aos
correspondentes elementos do array Mas_Tip. Após o fim do ciclo, o montante total de encomendas
para o símbolo é atribuído ao elemento Mas_Ord_New [0] [0].
Deve-se notar que em separado e fechado mercado ordens eliminado encomendas pendentes (a
execução da função OrderSelect () com o parâmetro MODE_HISTORY) não são analisadas. Como regra,
as informações sobre encomendas fechadas e apagadas não é utilizado na negociação EAs. As
informações sobre encomendas fechadas e apagadas representar a história de uma conta de exploração.
Essa informação pode ser usada, por exemplo, para criar diagramas que representam a história da
capital investido e real dos resultados comerciais. No entanto, ela não pode ser útil de alguma forma
para fazer novas decisões comerciais. Tecnicamente, essa parte de encomendas podem ser
contabilizados de forma semelhante. No entanto, é uma tarefa separada que não tem nenhuma relação
à negociação propriamente dita.
Os eventos relacionados com as encomendas são analisados em um programa com base na comparação
dos dados disponíveis nos arrays considerada acima. Por exemplo, se Mas_Ord_Old array contém
informações sobre uma encomenda pendente numerado como 246.810, enquanto a matriz
Mas_Ord_New contém os dados sobre a mesma ordem 246810, mas a ordem é de outro tipo, isso
significa que, enquanto se aguarda uma ordem tenha sido modificada em um mercado um. Também é
necessário analisar quando efectuam encomendas trades (a ser considerado mais tarde).
Antes da função Terminal () é executado pela primeira vez, arrays Mas_Ord_Old e Mas_Ord_New estão
vazias, ou seja, cada um dos elementos de ambas as matrizes tem valor zero. Isto significa que, após a
primeira execução da função, o leque Mas_Ord_Old na linha:

ArrayCopy (Mas_Ord_Old, Mas_Ord_New); / / Conservar a história anterior


herda "zero" a partir da matriz Mas_Ord_New estado, o que resulta no aparecimento de falsos alertas de
evento a realização do evento função de monitoramento. Para evitar isso, a primeira execução da
função Terminal () é realizado na fase de iniciação , E os eventos não são processadas após esta
execução da função (veja a função init () no Expert Advisor usualexpert.mq4).
Função dados

Um normal Expert Advisor utilizada em nosso trabalho prático compara favoravelmente aos seus
análogos simples, porque ele fornece um comerciante com um alto nível de informação de suporte.
Durante a negociação, a situação muda o tempo todo, vários eventos têm lugar. Para fazer bom
decisões, um comerciante deve ser plenamente informado. Para este efeito, são utilizados em diversas
funções Expert Advisors. Estas funções são destinados a informar o usuário sobre um determinado
conjunto de factos e processos.
Em simples Expert Advisors, em regra, esta tarefa é feita pela norma Comentar função () que exibe o
texto predefinido no canto superior esquerdo da janela do símbolo. Essa informação não está de saída
método bastante confortável, uma vez que o texto pode ser frequentemente sobrepõem ao preço
gráfico. Portanto, este método só pode ser usado em uma quantidade limitada de casos, a exibição de
mensagens curtas.
Vamos estudar aqui uma conceptualmente diferente método de exibição de informações - toda a
mensagem é mostrada em uma janela separada, enquanto objetos gráficos são utilizados para formar
mensagem textos. A utilização de objetos gráficos produz uma vantagem palpável, já que você pode
mover objetos (ao contrário textos mostrados usando Comment ()), criando, desta forma, sua
mensagem história.
Um de distintos subwindow exibição das informações é criada utilizando um costume indicador ajustado
proporcionalmente. O único objectivo deste indicador é a criação de subwindow que, por isso não os
cálculos são realizados no indicador, nem indicando linhas são construídos na mesma. O código do
indicador Inform.mq4 maio olhar como se segue:

//------------------------------------------------ --------------------
/ / Inform.mq4
/ / O código deve ser usado apenas para fins educacionais .
//------------------------------------------------ --------------------
# propriedade indicator_separate_window / / Separar indicador janela
//------------------------------------------------ --------------------
int start () / / Especial função start ()
(
)
//------------------------------------------------ --------------------
Geralmente, um programador pode acrescentar no Indicador do seu código desejado e contribuir para
as suas propriedades. Por exemplo, você pode exibir indicando linhas em uma determinada parte do
indicador subwindow. No exemplo acima, um simples código do indicador é dado, na janela de objetos
gráficos que serão apresentados.

Funções Definidas Por Usuário Inform ()


Informe int (int Mess_Number, int Number = 0, duplo Valor = 0,0)
A função exibe na subwindow do indicador Inform.mq4 mensagens criadas utilizando objetos gráficos . A
função controla a posição dos objetos gráficos no indicador subwindow: a cada nova mensagem é
exibida na parte inferior da janela (linha inferior) e coloridos na cor desejada, as mensagens
anteriormente demonstrado ser movido para a parte superior da janela ( uma linha para cima). Se não
houver novas mensagens são apresentadas em 15 segundos, todas as mensagens anteriormente
exibidos na janela que será colorida em cinza (a fim de não criar distorções para o utilizador) quando o
programa remete para a função.
Parâmetros:
Mess_Number - número de mensagem que pode ter os seguintes valores:

§ (zero) 0 - nenhuma mensagem é exibida, esse modo é usado para repor o temporizador;
§ (menos um) -1 - todos os objetos gráficos criados através da função será excluído;
§ (uma ou mais) - o número da mensagem a ser exibida no indicador subwindow;

- Número inteiro utilizado em algumas mensagens;


Valor - número real usado em algumas mensagens.
Informar a função () que cria objetos gráficos, como as outras funções normais em um EA, É formado
como incluir um arquivo,Inform.mqh:

//------------------------------------------------ ------------------- ----


---- --
/ / Inform.mqh
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ -------- --------------
- 1 --
/ / Função que exibe mensagens na tela gráfica.
//------------------------------------------------ -------- --------------
- 2 --
Informe int (int Mess_Number, int Number = 0, duplo Valor = 0,0)
(
/ / Int Mess_Number / / Mensagem número
/ / Número int / / Integer que ser aprovado
/ / Valor duplo / / Real número passou a ser
int Win_ind; / / Indicador janela número
string Graf_Text; / / Mensagem line
color Color_GT; / / Cor da mensagem line
static int Time_Mess; / / hora da última publicação da mensagem
static int Nom_Mess_Graf; / / Gráfica de mensagens counter
static string Name_Grf_Txt [30]; / / Array gráfica mensagem de nomes
//------------------------------------------------ -------------- --------
- 3 --
Win_ind = WindowFind ( "informar"); / / Buscando indicador janela número
if (Win_ind <0) return; / / Se não houver essa janela, deixe
//------------------------------------------------ -------- --------------
- 4 --
if (Mess_Number == 0) / / Isto acontece em todos os carrapatos
(
if (Time_Mess == 0) return; / / Se ele já é cinza
if (GetTickCount () - Time_Mess> 15000) / / A cor tornou-se atualizado
dentro de 15 seg
(
for (int i = 0; i <= 29; i + +) / / cor cinza com linhas
ObjectSet (Name_Grf_Txt [i], OBJPROP_COLOR, Gray);
Time_Mess = 0; / / Bandeira: Todas as linhas são cinza
WindowRedraw (); / / redesenhando objetos
)
retorno; / / Saída da função
)
//------------------------------------------------ -------- --------------
- 5 --
if (Mess_Number ==- 1) / / Isto acontece em deinit ()
(
for (i = 0; i <= 29; i + +) / / By objeto índices
ObjectDelete (Name_Grf_Txt [i]); / / Supressão do objeto
retorno; / / Saída da função
)
//------------------------------------------------ -------- --------------
- 6 --
Nom_Mess_Graf + +; / / Gráfica de mensagens counter
Time_Mess = GetTickCount (); / / Última publicação tempo
Color_GT = Lime;
//------------------------------------------------ ---------- -------- ----
- 7 --
switch (Mess_Number) / / Ir a mensagem
(
case 1:
Graf_Text = "Fechado ordem Comprar" + Número;
PlaySound ( "Close_order.wav"); break;
case 2:
Graf_Text = "Fechado para Vender" + Número;
PlaySound ( "Close_order.wav"); break;
case 3:
Graf_Text = "Eliminado ordem pendente" + Número;
PlaySound ( "Close_order.wav"); break;
case 4:
Graf_Text = "Inaugurado ordem Comprar" + Número;
PlaySound ( "Ok.wav"); break;
caso 5:
Graf_Text = "Aberto para Vender" + Número;
PlaySound ( "Ok.wav"); break;
caso 6:
Graf_Text = "Colocado ordem pendente "+ Número;
PlaySound ( "Ok.wav"); break;
caso 7:
Graf_Text = "Ordem "Número + +" modificado para o mercado um ";
PlaySound ( "Transform.wav"); break;
caso 8:
Graf_Text = "Reopened ordem" + Número; break;
PlaySound ( "Bulk.wav");
caso 9:
Graf_Text = "Parcialmente fechado ordem" + Número;
PlaySound ( "Close_order.wav"); break;
caso 10:
Graf_Text = "New distância mínima:" + Número;
PlaySound ( "Inform.wav"); break;
caso 11:
Graf_Text = "Não é dinheiro suficiente para" +
DoubleToStr (Valor, 2) + "lotes";
Color_GT = Vermelho;
PlaySound ( "Oops.wav"); break;
caso 12:
Graf_Text = "Tentando fechar ordem" + Número;
PlaySound ( "expert.wav"); break;
caso 13:
if (Number> 0)
Graf_Text = "Tentando abrir Vender fim ..";
diferente
Graf_Text = " Tentando Comprar abertas fim .. ";
PlaySound ( "expert.wav"); break;
caso 14:
Graf_Text = "Senha inválida. EA não funciona.";
Color_GT = Vermelho;
PlaySound ( "Oops.wav"); break;
caso 15:
switch (Number) / / Indo para o número do erro
(
case 2: Graf_Text = "erro comum". break;
caso 129: Graf_Text = "Wrong preço." break;
caso 135: Graf_Text = "Preço alterado." break;
caso 136: Graf_Text = "Não preços. Aguardando uma nova carrapato ..";
break;
caso 146: Graf_Text = "Trading subsistema está ocupado "; Break;
caso 5: Graf_Text = "antiga versão do terminal."; break;
caso 64: Graf_Text = "Conta está bloqueado." break;
caso 133: Graf_Text = "Negociação é proibido"; break;
default: Graf_Text = "Ocorreu erro" + Número; / / Outros erros
)
Color_GT = Vermelho;
PlaySound ( "Error.wav"); break;
caso 16:
Graf_Text = "Expert Advisor funciona apenas para EURUSD";
Color_GT = Vermelho;
PlaySound ( "Oops.wav"); break;
padrão:
Graf_Text = "default" + Mess_Number;
Color_GT = Vermelho;
PlaySound ( "Bzrrr.wav");
)
//------------------------------------------------ - -------- -------------
8 --
ObjectDelete (Name_Grf_Txt [29]); / / excluir 29a (superior) objeto
for (i = 29; i> = 1; i -) / / Ciclo de regra dos índices ..
(/ / .. de objetos gráficos
Name_Grf_Txt [i] = Name_Grf_Txt [i - 1]; / / Criando objetos:
ObjectSet (Name_Grf_Txt [i], OBJPROP_YDISTANCE, 2 + 15 * i);
)
Name_Grf_Txt [0] = "Inform_" Nom_Mess_Graf + + "_" + Symbol (); / / Nome do
Objeto
ObjectCreate (Name_Grf_Txt [0], OBJ_LABEL, Win_ind, 0, 0); / / Criação
ObjectSet (Name_Grf_Txt [0], OBJPROP_CORNER, 3); / / Canto
ObjectSet (Name_Grf_Txt [0], OBJPROP_XDISTANCE, 450); / / Eixo Х
ObjectSet (Name_Grf_Txt [0], OBJPROP_YDISTANCE, 2); / / Eixo Y
/ / Текстовое описание объекта
ObjectSetText (Name_Grf_Txt [0], Graf_Text, 10, "Courier New", Color_GT);
WindowRedraw (); / / redesenhando todos os objetos
retorno;
)
//------------------------------------------ ------ - ---------------------
9 --
No bloco 2.3, as variáveis utilizadas na função estão descritos. Para armazenar os nomes de objetos
gráficos, o leque Name_Grf_Txt é utilizado. De acordo com o método aceito na função, o programa cria
um novo objeto gráfico para cada nova mensagem. O montante total dos objetos é de 30, cada objeto
representa uma entrada localizada no texto uma linha. Em caso de resolução de tela grande, a
quantidade de linhas a serem mostradas pode ser aumentada pelo aumento da quantidade de objetos a
serem criados.
No bloco 3.4, o número do subwindow do indicador "Informar" é calculado para mensagens a serem
mostradas polegadas Se o indicador não for fixado, a função pára de suas operações. Se não houver
nenhuma janela, as mensagens podem não ser exibidas, mas isso não afecta a operacionalidade da EA -
todas as outras funções irão funcionar nos seus modos normais, trades será realizada, também.
No bloco 4.5, a mensagem cores são analisados. A função com o parâmetro Mess_Number = 0 é
chamada, no Consultor Especialista em todos os carrapatos (ver a função start () no Expert
Advisor usualexpert.mq4). Se todos os objetos são cinza na história anterior, a função termina as suas
operações. No entanto, se o valor da variável Time_Mess é não zero, as propriedades de todos os
objetos são alterados, ou seja, todos os objetos serão coloridos em cinza.
If (blocos 5-6) o parâmetro Mess_Number =- 1 é especificado na chamada de função, todos os objetos
criados anteriormente à execução da função são eliminados. Isso pode ser necessária quando a EA é
destacada do símbolo janela. Nesse caso, segundo a regra comum, cada programa aplicativo deve
excluí-la todos os objetos criados durante a execução (ver a função deinit () noExpert
Advisor usualexpert.mq4) .
Se o controlo no programa é transmitido ao bloco 6.7, isso significa que é necessário criar um novo
objeto gráfico com propriedades exigidas e coloque-o na parte inferior do indicador subwindow (na linha
inferior; aqui, o termo de "linha" é condicional, na verdade, a localização dos objetos gráficos é
determinado pelas coordenadas predefinido). Cada objeto tem o seu recém-criado nome único. Para
criar objetos com nomes, usamos a série histórica da mensagem, esta é a razão pela qual as mensagens
são colocados no balcão bloco 6-7 (numa fase posterior, o valor da variável Nom_Mess_Graf é utilizado
para formar um único nome, bloco 8 -- 9). É aqui onde a última publicação tempo é contabilizado e cor
de base é estabelecida por novas mensagens (verde).
7.8 O bloco é composto pelo operador 'mudar', no interior dos quais o controlo é passado de acordo com
o valor do parâmetro Mess_Number especificado na chamada de função. Em cada "caso" deste operador
da variável Graf_Text, é atribuído um novo valor que é o conteúdo da mensagem a ser exibida. Um
colorido especial está definido para algumas mensagens, por exemplo, vermelho para mensagens
importantes. Todas as mensagens são acompanhados com sons que são a execução da norma
PlaySound função () (ver Wave Files).
A criação de um novo objeto gráfico e de substituição dos existentes, realizados no bloco 8.9. A
quantidade de objetos é limitada, pelo que um objeto (um a mais antiga) é suprimida toda vez quando
uma nova mensagem é publicada. Todos os outros objectos existentes são deslocados uma linha para
cima. Os objetos são movidos por mudar suas propriedades - Coordenadas verticais. As coordenadas
horizontais dos objetos permanecem inalteradas.
Após todos os preparativos necessários tenham sido feitas (todos os objectos são movidos uma linha
para cima), um novo objeto com novas propriedades com nome único e parcialmente determinada em
bloco 7.8 é criado. O tipo do objeto é o gráfico Texto Label. Os objectos deste tipo estão posicionados
em relação à janela do símbolo, que permite ao usuário mover preço gráfico arbitrariamente, sem afetar
as posições das mensagens.
Informar a função () pode ser chamado a partir de qualquer local no programa em que, implicitamente,
uma mensagem de texto deve ser exibido. Como resultado de um longo tratamento, as mensagens são
acumuladas na janela. O usuário pode visualizar as mensagens pelo redimensionamento da história do
indicador subwindow (por exemplo, puxando para cima a sua borda superior). Opcionalmente, você
também pode definir a janela altura de tal modo que o espaço visível exibe a quantidade desejada de
mensagem de linhas (de três a quatro linhas são geralmente recomendado).

Fig. 156. Símbolo janela. Mensagem no indicador Subwindow.


É fácil ver que a diversidade das mensagens exibidas pela função pode ser aumentado. Se você estiver
indo para expandir o programa, basta apenas adicionar a nova versão de «casos» em que o operador
"switch" (bloco 7 -- 8).

Evento Função Monitoramento de

Muitos eventos têm lugar durante a negociação. Um comerciante pode ver alguns deles diretamente na
janela do símbolo, por exemplo, preço de mercado ou mudanças atravessadas indicador linhas. Outros
eventos, apesar de serem interessantes para um comerciante, também não são mostrados
explicitamente qualquer lugar. Uma parte considerável desses eventos podem ser detectados e tratados
utilizando MQL4.
Por exemplo, o seu tratamento pode mudar o centro condições comerciais muito pouco tempo antes
forem publicadas notícias importantes ou quando o mercado torna-se muito activo. Nesses casos, a
propagação ou a distância mínima permitida para a colocação de ordens stop e para o fim solicitado
preços podem ser aumentados. Caso isso aconteça, é necessário, primeiro, para detectar e levar a novas
condições comerciais em consideração, e, em segundo lugar , Para informar o comerciante sobre estas
alterações.
Para resolver estas tarefas, você pode usar o evento na sua função de monitoramento Expert Advisor.
Funções Definidas Por Usuário Eventos ()
int Eventos ()
As alterações na função calcula a distância mínima exigida para as encomendas e as suas ordens stop,
bem como as alterações na lista de encomendas pendentes mercado e disponíveis na conta. Para
executar a função, você deve usar a ordem contabilística função Terminal () em seu programa. Os
valores das seguintes matrizes globais são utilizados:

§ Mas_Ord_New - o conjunto de características de ordens disponíveis a partir do momento da


função Terminal () execução;
§ Mas_Ord_Old - o conjunto de características de ordens disponíveis a partir do momento anterior
ao da execução da função terminal ().

Os valores das seguintes variáveis globais são utilizados:


- Level_new - o valor atual da distância mínima;
- Level_old - o valor anterior da distância mínima.
Para exibir as mensagens, a função irá utilizar a função Informar dados (). Se a função Inform () não
está incluído na Expert Advisor, mensagens não serão mostrados.
O evento função de monitoramento Eventos () é formado como incluir o arquivo Events.mqh:

//------------------------------------------------ ------------------------
--------
/ / Events.mqh
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ ------------------------
--- 1 --
/ / Evento função de monitoramento.
/ / Global variáveis:
/ / Level_new O novo valor da distância mínima
/ / Level_old O valor anterior da distância mínima
/ / Mas_Ord_New [31] [9] A última conhecida matriz de encomendas
/ / Mas_Ord_Old [31] [9] A velha matriz de encomendas
//------------------------------------------------ ------------------------
--- 2 --
int Eventos () / / Usuário-função definida
(
bool Conc_Nom_Ord; / / Adequar as encomendas em ..
/ / .. os antigos e os novos arranjos
//------------------------------------------------ ------------------------
--- 3 --
Level_new = MarketInfo (Symbol (), MODE_STOPLEVEL); / / Último conhecidos
if (Level_old! = Level_new) / / Nova não é o mesmo que o velho ..
(/ / Isso significa que a condição ter sido alterado
Level_old = Level_new; / / Novo "valor antigo"
Informar (10, Level_new); / / Mensagem: nova distância
)
//------------------------------------------------ ------------------------
--- 4 --
/ / Procura por perdida, escreva-alterou-se, parcialmente fechado e
reaberto encomendas
for (int idade = 1; velho <= Mas_Ord_Old [0] [0]; velho + +) / / Nos old
matriz de encomendas
(/ / Assumindo o ..
Conc_Nom_Ord = false; / / .. ordens não são iguais
//------------------------------------------------ --------------------- 5
--
for (int novo = 1; nova <= Mas_Ord_New [0] [0]; novos + +) / / ciclo para o
array ..
(/ / .. De novas encomendas
//------------------------------------------------ ------------------ 6 --
if (Mas_Ord_Old [antigo] [4] == Mas_Ord_New [novo] [4]) / / número
correspondidas
(/ / Tipo de Ordem torna-se ..
if (Mas_Ord_New [novo] [6]! Mas_Ord_Old = [antigo] [6]) / / .. diferente
Informar (7, Mas_Ord_New [novo] [4]); / / Mensagem: modificados:)
Conc_Nom_Ord = true; / / A ordem é encontrado, ..
break; / / etc .. sai ..
) / / .. o ciclo interno
//------------------------------------------------ ------------------ 7 --
/ / Portaria número não corresponde
if (Mas_Ord_Old [antigo] [7]> 0 & & / / MagicNumber jogos
Mas_Ord_Old [antigo] [7] == Mas_Ord_New [novo] [7]) / / .. com a idade uma
(/ / Isso significa que ele seja reaberto ou parcialmente fechados
/ / Se volumes jogo, ..
if (Mas_Ord_Old [antigo] [5] == Mas_Ord_New [novo] [5])
Informar (8, Mas_Ord_Old [antigo] [4]); / / .. ele está reabrindo
else / / Em caso contrário, ele era ..
Informar (9, Mas_Ord_Old [antigo] [4]); / / fechando parcialmente ..
Conc_Nom_Ord = true; / / A ordem é encontrado, ..
break; / / etc .. sai ..
) / / .. o ciclo interno
)
//------------------------------------------------ --------------------- 8
--
if (Conc_Nom_Ord == false) / / Se estamos aqui, ..
(/ / .. Isso significa que nenhuma ordem encontrada: (
if (Mas_Ord_Old [antigo] [6] == 0)
Informar (1, Mas_Ord_Old [antigo] [4]); / / Portaria Comprar fechada
if (Mas_Ord_Old [antigo] [6] == 1)
Informar (2, Mas_Ord_Old [antigo] [4]); / / Portaria Vender fechada
if (Mas_Ord_Old [antigo] [6]> 1)
Informar (3, Mas_Ord_Old [antigo] [4]); / / Até fim suprimido
)
)
//------------------------------------------------ ------------------------
--- 9 --
/ / Procura de novas encomendas
for (novo = 1; nova <= Mas_Ord_New [0] [0]; novos + +) / / No conjunto de
novas encomendas
(
if (Mas_Ord_New [novo] [8]> 0) / / Esta não é uma novidade, mas reaberto
continuar; / / .. ou parcialmente fechados
Conc_Nom_Ord = false; / / Enquanto não foram encontrados resultados
para a (antiga = 1; velho <= Mas_Ord_Old [0] [0]; velho + +) / / para este
fim Pesquisando
(/ / .. Na matriz de velhas ordens
if (Mas_Ord_New [novo] [4] == Mas_Ord_Old [antigo] [4]) / / Matched número
..
(/ / .. da ordem
Conc_Nom_Ord = true; / / A ordem é encontrado, ..
break; / / etc .. sai ..
) / / .. o ciclo interno
)
if (Conc_Nom_Ord == false) / / Se não for encontrado fósforos, ..
(/ / .. O intuito é nova:)
if (Mas_Ord_New [novo] [6] == 0)
Informar (4, Mas_Ord_New [novo] [4]); / / Ordem abriu Comprar
if (Mas_Ord_New [novo] [6] == 1)
Informar (5, Mas_Ord_New [novo] [4]); / / Vender Ordem abriu
if (Mas_Ord_New [novo] [6]> 1)
Informar (6, Mas_Ord_New [novo] [4]); / / Até encomenda
)
)
//------------------------------------------------ ------------------------
-- 10 --
retorno;
)
//------------------------------------------------ ------------------------
-- 11 --
Matrizes e variáveis globais necessários para a execução da função estão descritos no bloco 1.2. No
bloco 2.3, Conc_Nom_Ord variável mais utilizada no código de ordens análise é aberta.
A função das faixas mudanças a distância mínima para a colocação de ordens de paragem e de
encomendas. Por isso, o atual valor do mínimo Level_new distância é calculada em cada execução da
função (blocos 3-4) e, em seguida, em comparação com a anterior, o valor de Level_old (obtida durante
a anterior execução da função). Se os valores dessas variáveis não são iguais uns aos outros, isso
significa que a distância mínima foi modificada pela lidar centro pouco antes da última execução da
função.Neste caso, o valor atual da distância mínima é atribuído para a variável Level_old (no sentido de
considerá-la nas execuções posteriores da função), bem como a função Inform () é executado, a fim de
exibir a mensagem correspondente.
Geralmente, você pode utilizar um método semelhante para detectar outros eventos, por exemplo,
alterações no spread, permissões para o comércio dado símbolo (identificador MODE_TRADEALLOWED
na função MarketInfo ()), a realização de uma nova barra (ver Problema 27), o facto de atravessar
indicador linhas (ver fig. 107), o fato de se chegar a uma certa hora predefinida, etc O programa pode
detectar alguns eventos para utilizar em seus valores obtidos a EA, outros eventos - para informar o
usuário sobre elas.
Nos blocos 4-10, os estados do mercado e encomendas pendentes são analisados. Mais informações
sobre mudanças nas encomendas é prestado ao usuário. A análise é realizada em duas fases. Na
primeira fase, o programa detecta as alterações que dizem respeito aos perdidos (fechado ou excluído),
alterando-tipo, parcialmente fechado e reaberto encomendas (blocos 4-9). Na segunda etapa (bloco 9-
10), as novas encomendas sejam procura.
Em blocos 4.9, as ordens contabilizados no array Mas_Ord_Old são analisados. A quantidade de
iterações do ciclo externo 'para' é encontrado em função do montante total de encomendas no array
(array Mas_Ord_Old elemento [0] [0]). Para verificar se a ordem for mantida, a partir do momento atual,
é necessário encontrar uma ordem semelhante às ordens matriz Mas_Ord_New.Esta pesquisa é realizada
no ciclo interno 'para' (blocos 6-8), a quantidade de iterações do que é igual à quantidade de
encomendas no array (array Mas_Ord_New elemento [0] [0]). Vamos continuar a denominação da
matriz Mas_Ord_Old 'velha matriz ", enquanto que o Mas_Ord_New -" nova matriz ".
Em blocos 6.8, o programa de pesquisas somente as ordens, as características de que são diferentes.
Por exemplo, no bloco 6.7, a ordem está marcada para o seu número (veja a regra dos índices de
correspondência com características ordem na Tabela 4). Se a velha ordem sob check-array jogos em
série com uma das encomendas do novo array, isso significa que, pelo menos, esta ordem não for
fechada (ou excluído). Também é necessário verificar se o tipo de ordem é alterada. Se sim, isso
significa que, enquanto se aguarda uma ordem seja modificado em um mercado um. Neste caso, a
mensagem correspondente é exibido usando a função Inform (). Independente sobre o fato de mudar
(ou manter inalterado) da ordem tipo, esta ordem não serão analisados mais longe: o programa saídas
internas do ciclo e, finalmente, começa uma nova iteração do ciclo externo.
Se o programa encontrar na execução do bloco 6.7 que a velha ordem sob check-array não coincidir
com qualquer número de encomendas do novo array, o controlo é passado para bloquear 7-8. Aqui, o
programa verifica se a actual forma do novo array tenha um MagicNumber não zero (todas as ordens de
abertura e colocado pela EA ter uma MagicNumber não zero). Se ele tem uma tal MagicNumber e este
parâmetro coincide com o fim de MagicNumber a partir do antigo array sob controlo, significa que a
ordem é negociada, mas foi alterada, de alguma forma. Existem duas situações quando o número de
ordem pode ser alterada.
Situação 1. A ordem é parcialmente fechado. Você pode encerrar parcialmente um mercado ordem (não
uma pendente um!) Em duas fases, de acordo com a tecnologia aceites em MT 4. Na primeira fase, o
despacho inicial está completamente fechada. Ao mesmo tempo, uma nova ordem no mercado de um
volume menor é aberta com o mesmo preço e aberto com a mesma ordem requerida para parar de
preços, como no despacho inicial. Essa nova ordem obtenha o seu nome único, diferente do número do
despacho inicial a ser parcialmente fechada.
Situação 2. A ordem é reaberto pelo centro lidar. Alguns bancos (devido à sua contabilidade interna, as
regras específicas) forcedly fechar todas as ordens no mercado no final do dia de negociação ea
abertura imediata do mercado dos despachos do mesmo tipo e com o mesmo volume, mas ao preço
actual e menos swap. Este evento não afeta os resultados econômicos de uma negociação em conta de
forma alguma. Cada recém-inaugurado recebe o seu número exclusivo fim de que não condiz com os
números das encomendas fechadas.
A diferença entre as duas situações acima é do volume de novas encomendas: eles são diferentes na
primeira situação, e eles mantêm-se inalterados no segundo. Essa diferença é usado em bloco 7.8 a
distinção entre despachos modificada por razões diferentes. Em ambos os casos, é exibida a mensagem
correspondente ( "o fim está parcialmente fechado» ou «a ordem seja reaberta").
Se o programa não tenha detectado a correspondência (blocos 6-7) ou herdar (blocos 7-8) da ordem na
nova matriz pela conclusão do ciclo interno, isso significa que a velha ordem sob check-matriz está
fechado ou suprimido. Neste caso, o controlo é passado ao bloco 8-9, onde uma ou outra mensagem
será exibida, de acordo com o tipo de ordem. No exemplo acima, três tipos de mensagens são
realizados: por fim Compra, Venda e por fim para todos os tipos de encomendas pendentes. Em um caso
geral, essa seqüência pode ser ligeiramente modificado (alargada) - você pode criar um grupo de
correspondentes mensagens para cada tipo de encomendas pendentes.
Na segunda fase, o programa considera as novas encomendas da ordem array (bloco 9-10). Isto é feito
no intuito de detectar recém-inaugurado e colocado ordens. No ciclo externo 'para', o programa busca
em todas as ordens, as informações sobre o que está armazenado na matriz de novas encomendas. Com
o intuito de identificar as encomendas reaberta ou parcialmente fechados, o programa utiliza uma
simples característica - a disponibilidade de comentário. Ao fechar parcialmente ou reabertura de uma
ordem, o servidor adiciona um comentário que dá o número do pedido inicial. A EA não usa comentários
acima, de forma a disponibilidade de um comentário que significa que a ordem sob controlo, não é nova.
Se uma ordem não contém um comentário, o programa procura por um despacho com o mesmo número
na antiga matriz. Se o programa encontrar a ordem tendo esse número entre as antigas ordens internas
no ciclo 'para', significa que a ordem não é nova, mas foi aberto antes. No entanto, se o número da
encomenda a partir da nova matriz não coincidir com quaisquer ordens no antigo array, isso significa
que essa ordem é um mercado aberto ou uma ordem colocada uma pendente. Na parte inferior do bloco
9-10, o programa pede para Inform função (), a fim de exibir a mensagem correspondente, de acordo
com o tipo de ordem.
A utilização da função considerada Eventos () acaba por ser muito útil na prática. Uma vez que
utilizaram a função de um EA, o programador normalmente usa-lo no seu trabalho futuro. Deve-se notar
que as funções separadamente Eventos () e Terminal () estão intimamente relacionados. Se você quer
fazer alterações em uma destas funções (por exemplo, para usar outros nomes para matrizes globais),
você deve fazer as alterações correspondentes na outra função. Se você usar comentários em
encomendas para perceber a sua estratégia comercial, lhe deveria diferentemente do processo
sucessório característico da ordem (bloco 9-10), ou seja, você deve usar funções string para analisar o
comentário.
A quantidade de eventos considerados na função Eventos () pode ser muito aumentada. Por exemplo, se
você quiser exibir completamente todos os eventos relacionados à ordem, você deve incluir a análise das
características ordem - mudanças na forma requerida para parar de preços e na solicitou a abertura
ordena pendente de preços, bem como o método de fechamento (se as encomendas forem fechadas
como oposto ou ordens de cada um deles é fechado em separado) ea razão para fechar / apagar de
encomendas (se o preço atingiu o nível requerido para parar de ordem ou a ordem é fechado em
iniciativa do comerciante, etc.)
Volume definindo função

Para o seu trabalho prático, um comerciante tem de ser capaz de regular a quantidade de lotes para
novas encomendas a ser aberto. É muito difícil criar uma função universal para esta finalidade, uma vez
que cada estratégia comercial implica a sua gestão volume especial. Por exemplo, algumas estratégias
implicam a possibilidade de trabalhar com apenas uma ordem no mercado, enquanto que outros
permitem abrir novas encomendas no mercado, independentemente das já existentes.Estratégias
baseadas na gestão das diferentes ordens pendentes são conhecidos, também, a existência simultânea
de várias ordens de mercado e na expectativa de lhe ser permitido em alguns casos.
Um dos métodos mais comuns para o cálculo do volume recém-inaugurado encomendas (para as
estratégias que permitem apenas um Mercado fim de ser aberto por vez) é o método progressivo de
investimentos. De acordo com este método, as cauções dos custos de cada nova ordem é proporcional à
margem livre disponível no momento da comercialização. Se o mercado estiver fechado com intuito
lucrativo, a quantidade permitida de lotes para a nova ordem aumenta. Se ela estiver fechada, com uma
perda, esse montante será diminuída.
No exemplo abaixo, o usuário-função definida Lot () é considerado que lhe permite definir o volume para
recém abertura ordena utilizando uma das duas alternativas:
Alternativa 1. O usuário define a quantidade de lotes para novas ordens manualmente.
Alternativa 2. A quantidade de lotes é calculado de acordo com a quantia do dinheiro atribuído pelo
usuário. O montante das verbas atribuídas são estabelecidos como percentual de margem livre.
Funções Definidas Por Usuário Lot ()
bool Lot ()
A função calcula a quantidade de lotes para novas encomendas. Como resultado da execução da função,
o valor da variável global Lots_New mudanças: a quantidade de lotes. A função retorna TRUE, se a
margem livre é suficiente para a instauração de uma ordem com o montante mínimo de lotes (para o
símbolo, na janela da qual é anexado à EA). Caso contrário, retorna FALSE.
A função utiliza os valores das seguintes variáveis globais:

§ Lotes - volume em lotes definidos pelo usuário;


§ Por cento - o percentual de margem livre definido pelo usuário.

Para exibir mensagem, a função usa a função Informar dados (). Se a função Inform () não está incluído
no EA, nenhuma mensagem será exibida.
A função Lot () que determina a quantidade de lotes é formado como incluir arquivo Lot.mqh:

//--------------- -------------- ------------------- ----------------------


------------
/ / Lot.mqh
/ / O código deve ser usado apenas para fins educacionais.
/ / - -------------- --------------------------------- --------------------
--------- 1 --
/ / Função cálculo da quantidade de lotes.
/ / Global variáveis:
/ / Duplo Lots_New - a quantidade de lotes para novas encomendas
(calculado)
/ / Duplo Lotes - a quantidade desejada de lotes definidos pelo usuário.
/ / Int Percentual - livre margem percentual definido pelo usuário
/ / Retorno valores:
/ / True - se há dinheiro suficiente para o volume mínimo
/ / Falso - se não há dinheiro suficiente para o volume mínimo
//------------------------------------------------ ------ --------- -------
------- 2 --
bool Lot () / / Usuário-função definida
(
Symb seqüência = Simbolo (); / / Símbolo
One_Lot duplo = MarketInfo (Symb, MODE_MARGINREQUIRED); / /! lote custo -
Min_Lot duplo = MarketInfo (Symb, MODE_MINLOT); / / Min. quantidade de
lotes
Etapa dupla MarketInfo = (Symb, MODE_LOTSTEP); / / Passo de volume
alterando
Livre AccountFreeMargin duplo = (); / / Livre margem
//------------------------------------------- ----- --------- -------------
------- 3 --
if (Lotes> 0) / / Volume é definido explicitamente ..
(/ / Check-lo ..
Dinheiro duplo = Muita One_Lot *; / / Ordem dos custos
se (Moeda <= AccountFreeMargin ()) / / Livre margem cobre tudo ..
Lots_New = Lotes; / / .. aceitar a definir uma
else / / Se não é o suficiente margem livre ..
Lots_New = MathFloor (Livre / One_Lot / Passo) * Etapa; / / Calcular
lotes
)
//----------------------------- -------------- ----- ----------------------
------- 4 --
else / / Se não for volume preset
(/ / .. Tomar percentual
if (Percentual> 100) / / Preset, mas incorretamente ..
Percentual = 100; / / .. então não mais do que 100
if (Percentual == 0) / / Se 0 é predefinido ..
Lots_New = Min_Lot; / / .. então o min. lote
else / / quantidade desejada de lotes:
Lots_New = MathFloor (Livre * Porcentagem / 100 / One_Lot / Passo) *
Etapa; / / Calc
)
//--------------- -------------- ------------------- ----------------------
------- 5 --
if (Lots_New <Min_Lot) / / Se for inferior a permitida ..
Lots_New = Min_Lot; / / .. então mínima
if (Lots_New * One_Lot> AccountFreeMargin ()) / / Não é suficiente sequer
..
(/ / .. Para o min. lote: (
Informar (11, 0, Min_Lot); / / Mensagem ..
return (false); / / .. e sair
)
return (true); / / user-defined função Sair
)
/ / - -------------- --------------------------------- --------------------
--------- 6 --
A função tem um simples código. No bloco 1-2, variáveis globais e devolvidos os valores são
descritos. No bloco 2.3, os valores de algumas variáveis são calculadas. Para os cálculos, a seguinte
prioridade na fixação de valores aceitos são: Se um usuário possui um conjunto diferente de zero
quantia de lotes, o valor do percentual de margem livre não é levado em consideração. Lotes variáveis
externas e Percentual são declarados na incluem arquivo Variables.mqh.
No bloco 3.4, os cálculos são feitos para a situação em que o utilizador tenha definido um valor diferente
de zero do volume em lotes no exterior variável Lotes. Neste caso, o programa faz um check. Se a
margem livre é suficiente para abrir um mercado com vista a definir quantidade de lotes, em seguida, o
valor definido pelo usuário será atribuído à variável global Lots_New e utilizado em mais cálculos. Se a
margem livre não se aplica a esse montante, em seguida, o montante máximo possível de lotes é
calculado que é mais usado (ver Funções Matematicas).
O controle é passado ao bloco 4.5, se o usuário tiver definido zero quantidade de lotes. Ao mesmo
tempo, nós levamos em consideração o percentual de margem livre especificado pelo usuário na variável
externa Percentual. O programa faz uma verificação: Se o valor for superior a cem (por cento), o valor
de 100 é utilizado em cálculos. Se o usuário tiver definido a variável de valor zero por cento, a
quantidade de lotes é equiparado com o mínimo possível tratar o valor fixado pelo centro.Para todos
intermédio Для всех промежуточных величин высчитывается количество лотов, соответствующее
количеству выделенных пользователем средств.
No bloco 5.6, são feitas as verificações necessárias. Se a quantidade calculada de lotes acaba por ser
inferior ao mínimo permitido um (por exemplo, valor zero podem ser obtidas no bloco 4.5, se o usuário
tiver definido um pequeno valor da variável Percentual), então o valor mínimo será ser atribuídas para a
variável Lots_New. Then the program checks whether there are enough free assets to open an order
with the volume of the previously calculated amount of lots (there can be insufficient money on the
account). Se o dinheiro disponível não é suficiente, o programa exibe uma mensagem para o usuário e
saídas da função, retornando a função 'falso'. No entanto, o êxito no regresso a verificar os resultados
da 'verdadeira'.
Função definir os critérios de negociação

O sucesso de qualquer estratégia comercial depende, principalmente, a seqüência de negociação


critérios cálculos. A função que define critérios negociação é a parte mais importante de um programa e
devem ser usadas sem falhas. De acordo com a estratégia de comercialização, a função pode retornar
valores que correspondem aos critérios negociação particular.
Em um caso geral, os seguintes critérios podem ser definidos:

§ critério para a abertura de um mercado fim;


§ critério para o fechamento de um mercado fim;
§ critério para o encerramento parcial de um mercado fim;
§ critério para o encerramento do mercado ordens opostas;
§ critério para a solicitação de alteração de preços de um mercado pára de ordem;
§ critério para a colocação de uma encomenda pendente;
§ critério para exclusão de uma ordem pendente;
§ critério para abrir a solicitação de alteração de preço de uma encomenda pendente;
§ critério para a solicitação de alteração de preços das paragens de uma ordem pendente.

Na maioria dos casos, o desencadeamento de uma negociação exclusiva como critério está relacionado
com outros critérios comerciais. Por exemplo, se o critério para a instauração de uma ordem Comprar
torna-se importante em um determinado momento, isto significa que os critérios utilizados para o
encerramento de ordens Comprar ou Vender de abertura ordena não pode ser importante ao mesmo
tempo (veja relação dos Critérios de negociação). Ao mesmo tempo, de acordo com as regras inerentes
a uma determinada estratégia de comercialização, alguns critérios podem acionar simultaneamente. Por
exemplo, os critérios para o encerramento de um mercado para o fim Sell e modificação de uma ordem
pendente BuyStop maio tornam-se importantes em simultâneo.
Uma estratégia comercial impõe requisitos para a utilização do conteúdo e tecnologia da função
definindo critérios comerciais.Qualquer função pode retornar apenas um valor. Então, se você percebeu
em seu Expert Advisor uma estratégia comercial que implica a utilização de apenas critérios comerciais
mutuamente exclusivos, o valor devolvido pela função pode ser associada a um dos critérios. No
entanto, se sua estratégia permite desencadeamento de vários critérios, num momento, os seus valores
devem ser passados para outras funções para serem processados, utilizando variáveis globais para isso.
Realizava na trading estratégia da EA abaixo implica a utilização de critérios apenas se excluem
mutuamente. Esta é a razão pela qual a função Critério () para fazer passar os critérios anteriores de
outras funções utiliza o valor devolvido pela função.
Funções Definidas Por Usuário Critério ()
Critério int ()
A função calcula critérios comerciais. Ele pode retornar os seguintes valores:
10 - desencadeou uma negociação critério de fecho de mercado para Comprar;
20 - desencadeou uma negociação critério de abertura de mercado para Vender;
11 - desencadeou uma negociação critério de fecho de mercado para Comprar;
21 - desencadeou uma negociação critério de abertura de mercado para Vender;
0 - nenhuma critérios importantes disponíveis;
-1 - A sigla usada não EURUSD.
A função utiliza os valores das seguintes variáveis externas:
St_min - o nível mais baixo do indicador Estocásticos Oscilador;
St_max - o nível superior do indicador Estocásticos Oscilador;
Open_Level - o nível do indicador MACD (por ordem de criação);
Close_Level - o nível do indicador MACD (por ordem fechamento).
Para exibir mensagens, a função usa a função Informar dados (). Se a função Inform () não está incluído
na EA, mensagens não serão exibidas.
Função definindo critérios comerciais, Critério (), é formado como incluir arquivo Criterion.mqh:

//------------------------------------------------ ------------------------
-
/ / Criterion.mqh
/ / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ -------------------- 1 -
-
/ / Função cálculo critérios comerciais.
/ / Retorno valores:
/ / 10 - abertura Comprar
/ / 20 - Venda de abertura
/ / 11 - fechando Comprar
/ / 21 - Venda de fechamento
/ / 0 - não há critérios importantes disponíveis
/ / -1 - Outro símbolo é usado
//------------------------------------------------ -------------------- 2 -
-
/ / Variáveis externas:
extern int St_min = 30; / / estocástica nível mínimo
extern int St_max = 70; / / nível máximo estocástica
extern dupla Open_Level = 5; / / MACD nível de abertura (+/-)
extern dupla Close_Level = 4; / / MACD nível do fechamento (+/-)
//------------------------------------------------ -------------------- 3 -
-
Critério int () / / Usuário-função definida
(
string Sym = "EURUSD";
if (Sym! = Symbol ()) / / Se é um símbolo errado
(
Informar (16); / / Mensagens ..
retorno (- 1); / / .. e sair
)
dupla
M_0, M_1, / / Valor PRINCIPAIS em barras 0 e 1
S_0, S_1, / / Valor SINAL em barras 0 e 1
St_M_0, St_M_1, / MAIN Valor em barras 0 e 1
St_S_0, St_S_1; / / Valor SINAL em barras 0 e 1
Opn duplo = Open_Level * Point; / / Abertura do nível MACD (pontos)
* Cls = dupla Close_Level Point; / / Encerramento do nível MACD (pontos)
//------------------------------------------------ -------------------- 4 -
-
/ / Parâmetros de indicadores técnicos:
M_0 = iMACD (Sym, PERIOD_H1, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 0); / / 0
bar
M_1 = iMACD (Sym, PERIOD_H1, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1); / / 1
bar
S_0 = iMACD (Sym, PERIOD_H1, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 0); / / 0
bar
S_1 = iMACD (Sym, PERIOD_H1, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 1); / / 1
bar
St_M_0 = iStochastic (Sym, PERIOD_M15, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, 0);
St_M_1 = iStochastic (Sym, PERIOD_M15, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, 1);
St_S_0 = iStochastic (Sym, PERIOD_M15, 5, 3, 3, MODE_SMA, 0, MODE_SIGNAL,
0);
St_S_1 = iStochastic (Sym, PERIOD_M15, 5, 3, 3, MODE_SMA, 0, MODE_SIGNAL,
1);
//------------------------------------------------ -------------------- 5 -
-
/ / Cálculo do comércio critérios
if (M_0> s_0 & & - M_0> Opn & & St_M_0> St_S_0 & & St_S_0 <St_min)
regresso (10); / / Abertura Comprar
if (M_0 <s_0 & & M_0> Opn & & St_M_0 <St_S_0 & & St_S_0> St_max)
regresso (20); / / Abertura Vender
if (M_0 <s_0 & & M_0> Cls & & St_M_0 <St_S_0 & & St_S_0> St_max)
regresso (11); / / Encerramento Comprar
if (M_0> s_0 & & - M_0> Cls & & St_M_0> St_S_0 & & St_S_0> St_min)
regresso (21); / / Encerramento Vender
//------------------------------------------------ -------------------- 6 -
-
retorno (0); / / Sair do usuário-função definida
)
//------------------------------------------------ -------------------- 7 -
-
No bloco 1.2, o valor devolvido pela função são descritos. No bloco 2.3, algumas variáveis externas são
declarados. Criterion.mqh incluir o arquivo é o arquivo usado somente na considerados EA, em que o
global (neste caso, externo) variáveis são declaradas.Na seção denominada Estrutura de um programa
normal, é possível encontrar o raciocínio para declarar de todas as variáveis globais, sem excepção, em
um arquivo separado Variables.mqh. Neste caso, as variáveis externas são declaradas no arquivo
Criterion.mqh por duas razões: em primeiro lugar, para demonstrar que é tecnicamente possível (que
não é possível), em segundo lugar, para mostrar como usar variáveis externas na depuração / testes de
um programa.
É tecnicamente possível declarar variáveis externas no arquivo Criterion.mqh, porque essas variáveis não
são utilizados em quaisquer outras funções do programa. Os valores das variáveis externas declaradas
no bloco 2.3 determinar os níveis de indicadores estocásticos e MACD e Oscilador são utilizados apenas
em função do critério considerado (). A declaração de variáveis externas no arquivo contendo a função
que define critérios negociação pode ser razoável, se o arquivo for utilizado temporariamente, ou seja,
durante o programa de depuração e de cálculo desses valores óptimos variáveis externas. Para este
efeito, você pode adicionar outras variáveis externas no programa, por exemplo, a otimização do aporte
de indicadores (neste caso, o conjunto dos valores constantes do 12,26,9 para 5,3,3 e MACD para
Estocásticos Oscillator) . Uma vez tendo acabado codificação, você poderá excluir essas variáveis
externas a partir do programa e substituí-los com constantes com os valores calculados durante a
otimização.
No bloco 3.4, as variáveis locais são abertos e descritos. O Consultor Especialista se destina a ser
utilizado no símbolo EURUSD, tão necessária a verificação é feita no bloco 3.4. Se a EA é lançado na
janela de outro símbolo, a função operacional acabamentos e retorna o valor de -1 (símbolo errado).
No programa, os valores dos dois indicadores calculados sobre o actual eo anterior sobre a barra são
utilizados (blocos 4-5).Normalmente, quando você usa indicadores estocásticos Oscilador e MACD, os
sinais de compra ou de venda, quando são formadas duas linhas indicadoras reunir-se
mutuamente. Neste caso, usamos dois indicadores simultaneamente, para definir critérios comerciais. A
probabilidade de interseção simultânea de duas linhas indicadoras de indicadores é bastante reduzida. É
muito mais provável que eles vão intersectar um por um - primeiro em um indicador, um pouco mais
tarde - em uma outra. Se o indicador linhas de interseção dentro de um curto período de tempo, dois
indicadores podem ser considerados de ter formado um critério comercial.
Por exemplo, abaixo é mostrado como um critério para a negociação de compra é calculado (blocos 5-
6):

if (M_0> s_0 & & - M_0> Opn & & St_M_0> St_S_0 & & St_S_0 <St_min)
De acordo com esse registro, o critério para a compra é importante se estiverem reunidas as seguintes
condições:

§ no indicador MACD, indicador linha PRINCIPAIS (histograma) é indicador acima e abaixo da linha
SIGNAL Open_Level nível mais baixo (Fig. 157);
§ no indicador Estocásticos Oscilador, indicador linha PRINCIPAIS (histograma) é indicador acima e
abaixo da linha SIGNAL St_min nível mais baixo (Fig. 158).
Рис. 157. Condição necessária do indicador MACD linha posições para confirmar a importância da
negociação critérios para abertura e fechamento das ordens.
Na parte esquerda do gráfico. 157, as posições do indicador MACD linhas é mostrado, na qual dois
critérios gatilho - abertura de Compra e Venda de fechamento. PRINCIPAIS linha indicador está abaixo
do nível de 0,0005 no prazo de T1 = t 1 - t 0. Se as indicações necessárias Estocásticos Oscilador de
ocorrer, neste momento, o critério para abertura de Compra irá desencadear.PRINCIPAIS linha está
abaixo do nível de 0,0004 no prazo T2 = t 2 - t 0. Se as indicações de Estocásticos Oscilador confirmar
esta posição, o critério para o encerramento do Sell irá desencadear.
Observe que, formalmente, os dois critérios acima acionar dentro T1 (se for confirmado pelo
Estocásticos Oscillator). Foi mencionado anteriormente que o critério considerado função () retorna
apenas um valor, ou seja, o valor atribuído a um critério acionados. Durante este período, torna-se
necessário escolher um dos critérios. Este problema é resolvido de forma antecipada, durante a
programação, de acordo com as prioridades prescritos pela estratégia comercial.
Neste caso (de acordo com a estratégia comercial considerado "), a prioridade de abertura Comprar uma
ordem é superior ao valor de fecho Vender um fim. Esta é a razão pela qual, no bloco 5.6, o programa
linha, na qual o critério para abertura de Compra, está posicionado acima. Se durante o período de T1
(Fig. 157), temos a confirmação do Estocásticos Oscilador, a função retorna 10 atribuídas a este
critério. Dentro do período de t1 para t2, a função retornará 21 atribuídas ao fechamento Vender
critério.
Ao mesmo tempo, a execução de funções comerciais, as necessárias trocas pedidos será formada. Pelo
critério para o desencadeamento da Comprar abertura de, em primeiro lugar, o comércio pedidos de
fechamento de todos os meios disponíveis Vender encomendas serão formadas. Logo que essas ordens
não são esquerda, abertura de uma ordem Comprar serão solicitados. Respectivamente, quando o
critério de fecho de ordens Vender triggers, uma sequência de pedidos de comércio só fecho de todas as
encomendas serão formadas Sell (ver Funções do Comércio).
As condições, nas quais a desencadeantes Estocásticos Oscilador confirmação, são mostrados na
fig. 158.
Fig. 158. Condição necessária da Estocásticos Oscilador indicador linha posições para confirmar a
importância da negociação critérios para abertura e fechamento das ordens.
De acordo com o programa código especificado no bloco 5.6, os critérios para abertura de Compra e
Venda de fechamento pode se tornar importante indicador desde a linha PRINCIPAIS tornar-se em cima
do sinal na linha SIGNAL Estocásticos Oscilador, linha PRINCIPAIS estar abaixo do nível mínimo
St_min. Na fig. 158, tais condições são formadas no período de Ts. As condições espelhado confirmar o
desencadeamento de critérios para a abertura da ordem Sell e fechamento da ordem Buy (na parte
direita do gráfico. 158). Se nenhum critério tem desencadeado, a função retorna 0. Outras rotas podem
ser feitas sob estas condições, por exemplo, correção de parar o nível exigido.
Deve ser notado que o considerado separadamente estratégia comercial implica o uso das indicações
produzidas por MACD calculada sobre o horizonte temporal de uma hora, enquanto que Estocásticos
Oscilador é calculada sobre os 15 minutos de timeframe.The prazo pode ser mudado durante o ensaio, a
fim de otimizar a estratégia. No entanto, após análise, no final do código da função Critério (), é
necessário especificar valor constante para todos os parâmetros calculados, incluindo datas. A EA deve
ser utilizada somente sob as condições, para os quais foi criado. No exemplo acima (com os valores de
PERIOD_H1 e PERIOD_M15 especificados expressamente na indicadores), a EA irá considerar apenas os
parâmetros necessários, independentemente do actual calendário definido na janela do símbolo, onde foi
lançado o EA.

Negociação critérios aceites neste dado EA são utilizados


para fins de formação e não deve ser considerado como
um guia para operações quando uma verdadeira
negociação em conta.

Comércio Funções

Como regra geral, uma normal Expert Advisor contém uma série de funções comerciais. Eles podem
ser divididos em duas categorias - controle e funções executivas. Na maioria dos casos, apenas uma
função de controlo e de várias funções executivas são usados em uma EA.
Uma estratégia comercial normal em um EA é realizada com base em duas funções - uma função
definir os critérios comerciais e uma função de controlo comércio. Não deve haver quaisquer indícios
da estratégia comercial em qualquer outro lugar no programa. O controlo do comércio funções e
definindo a função comercial critérios devem ser coordenados entre si, os valores dos parâmetros elas
passam.
Cada um tem uma função executiva comércio leque de tarefas especiais. De acordo com as exigências
da estratégia de comercialização, comércio funções destinados às seguintes tarefas podem ser usados
em uma EA:

§ abertura de um mercado da ordem do modelo predefinimos;


§ fechando um mercado da ordem predefinida tipo;
§ parcialmente fechando um mercado da ordem predefinida tipo;
§ fechando todos os mercados a fim de preset tipo;
§ oposto duas ordens de fechamento do mercado no preset volume;
§ fechando todas as ordens no mercado;
§ modificação de ordens stop de um mercado da ordem predefinida tipo;
§ a colocação de uma encomenda pendente do modelo predefinimos;
§ uma pendência apagamento da ordem do modelo predefinimos;
§ supressão de todas as encomendas pendentes do modelo predefinimos;
§ supressão de todas as encomendas pendentes;
§ modificação de uma ordem pendente do modelo predefinimos.

A negociação geral em uma seqüência normal Expert Advisor consiste no seguinte: com base no
cálculo (de acordo com a estratégia utilizada) critérios comerciais, o controlo do comércio função
(também perceber a estratégia) alguns convites ou outros executivos comércio funções que, na sua
por sua vez, constituem o comércio necessário solicitar.
User-Defined Controladoria Função Comércio ()
int Comércio (int Trad_Oper)
É a função básica de que percebe sua estratégia.
Trad_Oper parâmetro pode ter os seguintes valores correspondentes a negociação com os critérios:
10 - desencadeou uma negociação critério para a abertura de um mercado para comprar;
20 - desencadeou uma negociação critério para a abertura de uma ordem Sell mercado;
11 - desencadeou uma negociação critério para o encerramento de um mercado para comprar;
21 - desencadeou uma negociação critério para o encerramento de um mercado para Vender;
0 - nenhuma critérios importantes disponíveis;
-1 - A sigla usada não EURUSD.
Para executar a função, as seguintes funções comerciais são exigidos:

§ Close_All () - função da suspensão de todas as ordens no mercado do modelo predefinimos;


§ Open_Ord () - função abrindo um mercado da ordem predefinida tipo;
§ Tral_Stop () - função modificar StopLoss de um mercado da ordem do modelo predefinimos;
§ Lote () - função detectar a quantidade de lotes para novas encomendas.

Os controladores de comércio Trade função () é formado como incluir arquivo Trade.mqh:

//---- ---- ---------------------------------------- ---------------------


---
/ / Trade.mqh
/ / O código deve ser usado apenas para fins educacionais.
//-------- ---- ------------------------------------ ---------------------
---
/ / Comércio função.
//------------ ---- -------------------------------- ------------------- 1
--
int Comércio (int Trad_Oper) / / Usuário-função definida
(
/ / Trad_Oper - tipo de operação comercial:
/ / 10 - abertura Comprar
/ / 20 - Venda de abertura
/ / 11 - fechando Comprar
/ / 21 - Venda de fechamento
/ / 0 - não há critérios importantes disponíveis
/ / -1 - Outro símbolo é usado
switch (Trad_Oper)
(
//---------- ---- ---------------------------------- ------------- 2 --
caso 10: / / = Trading critério Comprar
Close_All (1); / / Fechar todas Vender
if (Lot () == false) / / Nem dinheiro suficiente para min.
retorno; / / Sair do usuário-função definida
Open_Ord (0); / / Open Comprar
retorno; / / Tendo comercializado, deixe
//----------- ---- --------------------------------- ---------- 3 --
caso 11: / / Trading critério = fechamento Comprar
Close_All (0); / / Fechar todas Comprar
retorno; / / Tendo comercializado, deixe
//--------------- ---- ----------------------------- ---------- 4 --
caso 20: / / Trading critério = Vender
Close_All (0); / / Fechar todas Comprar
if (Lot () == false)
retorno; / / Sair do usuário-função definida
Open_Ord (1); / / Open Vender
retorno; / / Tendo comercializado, deixe
//------------------- ---- ------------------------- ---------- 5 --
caso 21: / / Trading critério = fechamento Vender
Close_All (1); / / Fechar todas Vender
retorno; / / Tendo comercializado, deixe
//----------------------- ---- --------------------- ---------- 6 --
caso 0: / / Retenções posições abertas
Tral_Stop (0); / / Trailing stop Comprar
Tral_Stop (1); / / Trailing stop Vender
retorno; / / Tendo comercializado, deixe
//--------------------------- ---- ----------------- ---------- 7 --
)
)
//------------------------------------------------ ------------------- 8 -
-
Os controladores de comércio Trade () é chamada de função especial a iniciar () da Expert
Advisor usualexpert.mq4. O valor devolvido pela função comercial definindo critérios Critério () é dado
como o parâmetro passou a funcionar no Comércio ().
No bloco 1.2 a função de Comércio (), o comércio percebeu critério considerado pela estratégia
comercial são descritos. Na função, usamos o operador switch () (blocos 2-7) que nos permite activar
o grupo de funções exigidas às trocas comerciais, de acordo com o critério. De acordo com a
estratégia de comercialização, o mercado abre e fecha EA ordens. Nenhuma operação com
encomendas pendentes são prestados por esta estratégia comercial.
Na seção denominada Função Definir Critérios de negociação, foi especificado que, para algumas
trocas critérios do programa podem formar várias solicitações comerciais. Assim, no caso do critério
importante para a compra (o valor da variável Trad_Oper é igual a 10), o controlo é passado para a
marca "Casa 10" (blocos 2-3) durante a execução do operador switch ().Neste caso, o programa
convida a primeira função Close_All (1). A execução desta função resulta em fechamento de todas as
ordens no mercado aberto para Vender o símbolo EURUSD. Depois de todas as ordens Vender foram
fechadas, o dinheiro disponível está marcada para saber se é suficiente para tornar o comércio
próximo. Para este efeito, o usuário-função definida Lot () é chamado (ver Volume Detecção de
Função). Se esta função retorna 'falso', significa que o dinheiro disponível na conta não é o suficiente
para abrir com o fim Buy permitidas montante mínimo dos lotes. Neste caso, a função do Comércio ()
termina as suas operações. Se não há dinheiro suficiente, o comércio função Open_Ord (0) é chamado
para abrir um mercado para comprar com o valor dos lotes calculada e