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:
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.
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.
§ 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.
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.
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 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
As propriedades de constantes
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
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.
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).
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
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:
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
É 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:
É 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:
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:
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:
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:
Tipo string
Tipo de cor
§ 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
§ 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.
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:
Tipo datetime
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.
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.
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
§ 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
Operações relacionais
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;
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.
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
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:
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?):
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; / / 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:
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:
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:
Typecasting
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.
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).
Bem, vamos voltar ao Problema 4. Pode haver duas soluções para ela.
Solução 4.1. Cálculo do resultado do tipo int:
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:
Arctic2.00000000
Solução 5,2. Esta solução é errada:
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:
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:
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.
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:
Operadores
O prazo de operador
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
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.
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.
//------------------------------------------------ ------------------------
----------
/ / 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)
//------------------------------------------------ ------------------------
----------
(/ / Abertura Esquadro
Day_Next = TimeDayOfWeek (Mas_Big [n] [0] + 60); / / operador Simples
b = a * x + n; / / operador Simples
) / / Fechando parêntese ..
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.
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
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:
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
§ 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.
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.
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.
Função Chamada
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.
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.
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.
É 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:
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).
Hipotenusa = 5
12. O último operador neste programa completa o trabalho do grupo especial de função start ().
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:
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,
Hipotenusa = 5
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
)
//------------------------------------------------ -----------------------
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
)
//------------------------------------------------ --------------------
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
)
//------------------------------------------------ --------------------
//------------------------------------------------ --------------------
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.
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.
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
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.
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
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.
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:
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.
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.
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.
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.
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:
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.
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 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.
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 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 ().
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 ().
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.
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.
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:
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.
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:
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:
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).
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:
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.
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
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.
//------------------------------------------------ ------------------------
--- 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.
//------------------------------------------------ ------------------------
- 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 ()
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:
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.
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:
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 ().
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:
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.
//------------------------------------------------ ------------------------
--------------
/ / 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:
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.
//------------------------------------------------ ------------------------
-------------
/ / 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.
//------------------------------------------------ --------------------
/ / 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:
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 ().
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.
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.
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.
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.
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:
//------------------------------------------------ --------------------
/ / 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.
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).
//------------------------------------------------ --------------------
/ / 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:
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.
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.
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. 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.
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
//------------------------------------------------ --------------------
/ / 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 (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
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).
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.
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.
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.
//------------------------------------------------ --------------------
/ / 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:
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:
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
... ...
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:
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:
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:
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:
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.
//------------------------------------------------ --------------------
/ / 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
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:
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.
//------------------------------------------------ --------------------
/ / 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:
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.
//--------------------------------------------------------------------
// 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
§ 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;
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.
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):
§ 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:
//------------------------------------------------ --------------------
/ / 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:
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.
§ 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.
§ 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
//------------------------------------------------ --------------------
/ / 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.
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.
//------------------------------------------------ --------------------
/ / 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:
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
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).
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:
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:
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 ";
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:
É 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.
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):
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 () 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:
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:
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.
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:
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:
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:
Funções String
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 ).
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:
//------------------------------------------------ --------------------
/ / 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:
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.
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:
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:
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
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.
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:
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:
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:
Funções Matematicas
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.
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
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
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:
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.
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.
§ 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.
§ 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 ().
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:
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:
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:
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:
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:
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.
§ (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;
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:
//------------------------------------------------ ------------------------
--------
/ / 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:
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:
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.
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:
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:
Para manter a seqüência de fechamento acima fim, no bloco 3.4, o ciclo 'para' é utilizado, em que a
maior parte (em volume) é selecionado dentre fim de todas as ordens do mesmo tipo. Esta ordem é
procurado a partir da análise dos valores da matriz global Mas_Ord_New contendo todas as
informações sobre negociação em disponíveis ordem. Após a passagem deste modo tenha sido
detectada, de acordo com o tipo de ordem, solicitou a fechar preço será calculado que é igual ao
correspondente valor da última cotação conhecida, em ambos os sentidos. Se as encomendas estão a
ser fechadas do tipo Buy, feche o preço deve ser pedida com base no valor de lance. Se eles forem
Vender ordens, então use Pergunte valores.
Directamente antes de formar um pedido comércio, as informações sobre a tentativa de encerrar a
ordem é exibida. O programa usa função chamada Inform () para esse fim. O pedido de fechamento
do comércio a ordem é formada na linha:
§ Mas_Tip - a matriz do montante total das encomendas de todos os tipos a partir do momento
da última execução da função Terminal ();
§ StopLoss - o valor de StopLoss (quantidade de pontos);
§ TakeProfit - o valor de TakeProfit (quantidade de pontos).
Bilhete = OrderSend (Symbol (), 0, Lots_New, Ask, 2, SL, TP, "", MN);
comércio de modo a formar um pedido de abertura de um mercado para comprar. Similar cálculos são
feitos, se o valor do parâmetro é Dica 1, ou seja, uma ordem Sell devem ser abertos.
Erros em todos definidos por usuários comércio funções executivas são tratados de forma
semelhante. Se um comércio é feito com sucesso, a função termina as suas operações (porque
nenhum próxima iteração do ciclo 'enquanto' será realizada, uma vez que o valor do elemento do array
Mas_Tip [Dica] será igual a 1 após a execução da função Terminal ()). No entanto, se o comércio
pedido não for executada, os erros são analisados (blocos 4-5). Neste caso, o erro detectar erros
função () é chamado. Se ele retorna "falso" (o erro é crítico), a execução da função Open_Ord ()
termina, o controlo é passado para o controle consecutivamente comércio função Comércio () , Com a
função especial iniciar () e depois para o cliente de terminal. Contudo, se o erro é overcomable, em
seguida, depois de actualização das matrizes de ordem em função do Terminal (), o controlo é passado
para o consecutivos iteração do ciclo 'enquanto ', O que resulta em mais uma tentativa de abrir um
fim.
Assim, a função Open_Ord () detém o controle até que uma ordem seja aberta ou se tem um erro
crítico na execução do comércio pedido.
bool = OrderModify Ans (Bilhete, Preço, SL, TP, 0); / / modificar isso!
Notou-se antes que a estratégia comercial considerada aqui implícita a existência de um mercado único
fim. No entanto, a função Tral_Stop () prevê a possibilidade de modificar várias ordens de um tipo de
mercado. Se o operador não intervir em negociação durante os trabalhos da EA, sem necessidade de
modificar várias ordens ocorre. No entanto, se o comerciante abre um mercado para manualmente
(para além dos já abertas), temos de decidir qual das ordens disponíveis devem ser alterados, como o
primeiro e porquê.
Ao estudar a seqüência de fecho de várias ordens, temos dito que o critério que define a prioridade
das ordens de fechamento foi o valor dos lotes. Esta solução é óbvia - o mais lotes (do total) estão
fechados, quanto mais cedo a EA vai resposta ao desencadeamento do fechamento critério. O
problema de ordem sequencial modificação não tem solução sem ambiguidades. Em todos os casos, o
critério de ordem modificação seqüência é determinada pela essência da estratégia comercial. Este
critério pode ser tanto a quantidade de lotes, o fato de não StopLoss em uma das ordens, sendo a
distância entre StopLoss ao preço actual. Em vários casos, este critério pode ser expresso através de
um índice global - o tamanho das perdas que podem resultar de alterações de preços acentuadas, ou
seja, quando todas as ordens no mercado são fechadas automaticamente pelo StopLoss ao mesmo
tempo.
No exemplo acima da função Tral_Stop (), uma ordem aleatória de modificação é realizada - as ordens
são modificados na seqüência, em que ocorrem na perda de mercado aberto e de encomendas
colocadas encomendas pendentes. Em cada caso específico, a função deve ser refinado mediante - a
ordem sequencial modificação deve ser programado de acordo com as regras específicas de sua
estratégia comercial.
Deve ser dada especial atenção para o facto de todos os negócios são feitos na modalidade real-
time. Se houver muitos pedidos, a EA vai gerar uma grande variedade de comércio
pedidos. Obviamente, o mercado pode virar-se enquanto os pedidos estão sendo executados. No
entanto, a função não devolverá o controle para a função Comércio () que tem chamado a ele até que
todas as ordens que devem ser modificados são modificadas. Isto significa que o perigo de um
comércio omitindo pedido de abertura ou fechamento de ordens pode ocorrer. Por esta razão,
qualquer estratégia deve ser codificado de modo a que não se permita uma quantidade considerável
de ordens no mercado a estar disponíveis em um momento.
No bloco 5.6, tenho os erros durante a execução do comércio solicitações são analisadas. Se o erro é
crítico, a função vai terminar as suas operações. No entanto, caso tenha sido um erro overcomable
tenho, o valor do contador 'i' é diminuído em 1.Assim será feito, a fim de produzir mais uma tentativa
de modificar o mesmo fim, na próxima iteração do ciclo 'para'.
Na maioria dos casos, o código acima irá cumprir-se a necessidade de modificar várias ordens. Ao
mesmo tempo, se houver mudanças têm lugar na ordem (por exemplo, uma ordem será fechada
quando o preço de mercado chega a uma paragem dos níveis), dentro do período de várias tentativas
falhadas para modificar ordens, a seqüência de ordens no array Mas_Ord_New também pode
mudar. This will result in that an order may be omitted and not modified within the period of the last
launching of the special function start(). This situation can be improved at the next tick, at the next
launch of the function start().
Erro ao processar função
Os erros que aparecem durante a execução comércio encomendas podem ser divididos em dois grupos -
overcomable (não-críticos) erros e erros críticos. Overcomable erros são aqueles que ocorrem falhas no
servidor. Depois de terem sido eliminados, pode continuar a negociação. Por exemplo, um pedido pode
ser rejeitado pelo corretor, se não há informações sobre as atuais cotações no momento. Este tipo de
situação pode aparecer em um mercado lento, ou seja, quando não carrapatos renda com
freqüência. Ou, pelo contrário, o corretor não pode executar uma das muitas solicitações dos
comerciantes de um mercado activo, onde muitas aspas são próximos. Em seguida aparece a pausa
antes de a ordem seja executada ou - por vezes - uma negação. Nesses casos, o Expert Advisor
continuar o seu trabalho e maio, por exemplo, repetir o pedido um pouco mais tarde, após a execução
de algum código relacionada com o código de erro.
Erros críticos incluem todos os erros que alerta sobre grave perturbação. Por exemplo, se uma conta
está bloqueada, então não vale a enviar solicitações comerciais. Nesse caso, a EA deve exibir a
mensagem correspondente e não deverá repetir o pedido. O erro ao processar função deve ser usada
em uma indispensably normal EA.
//------------------------------------------------ --------------------
/ / Errors.mqh
/ / O código deve ser usado apenas para fins educacionais .
//------------------------------------------------ --------------- 1 --
/ / Erro ao processar função.
/ / Retorno valores:
/ / True - se o erro é overcomable (ou seja, trabalho pode ser continuado)
/ / Falso - se o erro é crítico (ou seja, é impossível negociação)
//------------------------------------------------ --------------- 2 --
bool Erros (Error int) / / Custom função
(
/ / Error / / Erro número
if (erro == 0)
return (false); / / Nenhum erro
Informar (15, Erro); / / Mensagem
//------------------------------------------------ --------------- 3 --
switch (Error)
(/ / Overcomable erros:
caso 129: / / Errado preço
caso 135: / / Preço alterado
RefreshRates (); / / Renew dados
return (true); / / O erro é overcomable
caso 136: / / Não há citações. Esperando pelo carrapato para vir
while (RefreshRates () == false) / / Antes novo carrapato
Sono (1); / / Atraso no ciclo
return (true); / / O erro é overcomable
caso 146: / / O comércio subsistema está ocupado
Sleep (500); / / Solução Simples
RefreshRates (); / / Renew dados
return (true); / / O erro é overcomable
/ / Crítica erros:
case 2: / / erro comum
caso 5: / / antiga versão do cliente terminal
caso 64: / / Conta bloqueada
caso 133: / / Trading é proibida
default: / / Outras variantes
return (false); / / Critical erro
)
//------------------------------------------------ --------------- 4 --
)
//------------------------------------------------ --------------------
Uma das perguntas que surgem quando escrevo os algoritmos de processamento de erro Erros função ()
é: O que deve voltar a funcionar, se o valor de um determinado parâmetro é 0 (ou seja, não há
erros). Este tipo de situação não deveria aparecer em um corretamente codificados EA. No entanto, o
código pode ser modificado diversas vezes, reforçando o programa, por isso às vezes o valor de um erro
pode ser igual a 0. Portanto, seria razoável para adicionar algumas linhas para a função em fase de
desenvolvimento do primitivo (blocos 2-3), para situações em que o erro é igual a 0.
A reação dos Erros () a função do valor do erro zero variável depende do algoritmo usado para o
tratamento dos valores devolvidos pela função. O valor devolvido pela função é tomado em consideração
para o executável comércio função do acima exposto EA. Se os erros () função retorna 'verdadeira' (erro
é overcomable), em seguida, o programa irá fazer uma nova tentativa para o comércio. Se ele retorna
"falso" e, em seguida, o comércio deixa de funcionar e que o controlo é passado para o seqüencialmente
chamando função, em seguida, ao iniciar () function, e depois para o cliente de terminal. Se a escolha é
entre estas duas alternativas, então a situação em que não há erros (Error = 0) corresponde com a
segunda alternativa, ou seja, com o «falso» valor devolvido. Ele garante que uma vez executado um
pedido não será repetida.
Depois que a mensagem sobre o erro é exibido pela Inform () function, o controlo é passado para
bloquear 3-4, para o operador "switch". A variante específica para cada caso esteja envolvida
considerado código de erro. Por exemplo, caso ocorra erro 136, significa que o corretor não tem
corrente aspas para uma adequada tomada decisão. Isto significa que a situação não vai mudar se um
novo carrapato vem, então não há necessidade de repetir o envio do mesmo comércio pedido porque ele
não será executado, de qualquer maneira. A solução acertada nesta situação é a pausa - a ausência de
iniciativa por parte da EA. Um método simples para a detecção de um novo carrapato é usado para esta
finalidade - a análise do valor devolvido pela RefreshRates () function. O controle será devolvido para o
chamado função, em que o pedido é repetido comércio (após a análise correspondente, caso seja
necessário), logo que o novo carrapato vem.
Se houver um erro o programador considera ser um crítico, a função retorna "falso". O pedido não será
repetido, em tal caso, portanto, não há necessidade de fazer alguma coisa na Erros () function. Todos os
erros não processados são consideradas essenciais por omissão. Você pode expandir a lista de erros
processáveis (ver Códigos de erro).
As características gerais de programas complexos
Não existe uma única característica que distingue formal de um programa habitual de um complexo
um. Em geral, os programas complexos positivamente diferem entre si em uma variedade de
ferramentas fornecidas e quantidade das informações tratadas.Apenas alguns dos adjectivos qualitativos
que são peculiares para os programas complexos podem ser denotado.
Programa execução fim
Como regra geral, um costume programa contém o seu código em especial a função start () que a
execução é iniciada pelo cliente terminal. Na maioria dos casos função start () tempo de execução é
consideravelmente menor do que o carrapato período. Isto significa que a maior parte do tempo, o
programa está esperando por um carrapato que se avizinham. Este tipo de processos são caracterizados
pelo on-off rácio prazo. Ratio on-off é o rácio de repetição de um processo para o período de duração do
processo em si. O tempo de execução de início () Т1 é quase de 10 a 100 milisegundos, e entre o
tempo Т2carrapatos é de 5 segundos, em média. Assim, a on-off de uma relação de trabalho está a
atingir Т2/Т1 EA = 1000 e mais (ver fig. 159). Isto quer dizer que a duração normal de uma efectiva
capacidade de funcionamento da EA é 0,1% de todo o tempo, o resto do tempo que está em pé.
Às vezes cálculos complexos podem ser executados por um EA e, como resultado da duração do início ()
execução pode ser mais longo alcance e de dezenas de segundos. Nesses casos inicia () função não será
iniciado em todos os carrapatos, mas apenas sobre os carrapatos que vieram ao passo que o início ()
está esperando por eles. A fig. 159 revela que carrapatos o que veio a iniciar a execução do () function
período (no momento t4) não vai causar uma nova função especial do começo. A próxima vez que o
início () vai começar a funcionar no momento T5. A pausa entre o final do atual execução eo início da
próxima execução do início () irá aparecer com função desta disposição.
Fig. 159 Diferentes on-off, enquanto o rácio start () função é executada pelo cliente terminal
e ciclada a iniciar () function.
Existe um método eficaz para aumentar a capacidade do programa essencialmente, diminuindo assim o
on-off rácio do comércio processo de gestão. Para o efeito vamos implementar um algoritmo, segundo o
qual o código principal é muitas vezes (infinitamente) repetida durante o arranque () execução (EAs e
permitido apenas em scripts). A exemplo do início anelada () é mostrado abaixo:
//------------------------------------------------ --------------------
start () / / Especial função start ()
(
while (! IsStopped ()) / / Até usuário ..
(/ / .. Pára execução do programa
RefreshRates (); / / Dados renovação
//...................... O código principal do programa é especificado aqui
Sono (5); / / Breve pausa
)
retorno; / / O controle é retornado para o terminal
)
//------------------------------------------------ --------------------
Todo o código é especificado no corpo do "enquanto o" ciclo operador, e que o único caminho para sair
do ciclo é para receber um comando a partir do terminal cliente para finalizar a execução do
programa. Se o início () construídos em função deste princípio especificado é iniciado, ele será
executado infinitamente longo e vai retornar controle para o cliente terminal apenas quando um usuário
manualmente remove a EA a partir de uma janela de segurança ou de fornecer algumas outras
condições (ver Funções Especiais) .
A execução do ciclada iniciar () função é correr ininterruptamente, e é por isso que não existe um
período em que o programa está no modo de espera de um novo carrapato (ver fig. 159), de modo a
on-off razão do processo de ciclada execução do programa é igual a 1. O início () função que se baseia
no princípio especificado é iniciada pelo cliente terminal apenas uma vez.Isto significa que a actualização
da informação (por exemplo, mercado aspas) deve ser realizada utilizando-se obrigatória RefreshRates ()
function. A fim de evitar o grande consumo de recursos muito uma curta pausa no final do ciclo pode ser
especificado.
O desenvolvimento de enlaçar o programa exige muita atenção, enquanto que compõem o
algoritmo. Por exemplo, a reacção de um programa em um costume recebido críticas de erro é começar
a quebrar () função execução e retornando o controle para o terminal do cliente. Um programa ciclada
mantém controle permanente enquanto executa-lo a outra deve ser reacção previsível, como por
exemplo a proibição do comércio encomenda geração durante algum período. No entanto, a proibição
temporária não devem impedir o programa execução. Durante todo o período execução, o programa
deve tratar todas as informações disponíveis sobre os eventos, incluindo o controlador de ações de um
usuário. Em geral, essas incomensuráveis programa possui uma potência em comparação com uma
usual.
Ferramentas disponíveis
Apêndices
§ Glossário.
Conceitos e termos utilizados.
§ Tipos de Trades.
Tipos de ordens que podem ser utilizados em Metatrader Cliente Terminal 4.
§ Códigos de erro.
Existe uma possibilidade de um erro que aparecem enquanto o programa é executado. É
necessário definir a movimentação dos mais importantes erros de antecedência. Você pode obter
o código de erro usando o GetLastError () function.
§ Wave Files.
Você pode redefinir o conjunto da onda arquivos que são utilizados em Metatrader 4. Para fazer
isso abra o "Tools" - "Opções" janela e vaga necessário especificar os arquivos em "Eventos"
tab. Você pode jogar os arquivos anexados em seus próprios programas utilizando o PlaySound ()
function.
§ Lista de Programas.
Todos os programas que foram utilizados neste livro.
Glossário
§ Algoritmo é preciso uma instrução para completar uma sequência predefinida agir; controle
em um programa executável é transferida de acordo com o algoritmo.
§ Array - é um conjunto organizado dos valores de um tipo de variáveis que têm um nome
comum. Arrays podem ser one-dimensional e multidimensional. O montante máximo admissível
de dimensões em um array é quatro. Matrizes de quaisquer tipos de dados são permitidos.
§ Array Componente é uma parte de um array, é uma variável indexada com o mesmo nome e
um valor.
§ Pergunte se o mais elevado dos dois preços oferecidos pela corretora em uma Frase Two-
Way para uma Segurança.
§ Bar é uma representação gráfica de um preço de tabela. Bar é caracterizada por Abrir, Fechar,
Alta, Baixa dos preços, bem como pelo volume e tempo (ver também Castiçal).
§ Lance é o menor dos dois preços oferecidos pela corretora em uma Frase Two-Way para
uma Segurança.
§ 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.
§ 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.
§ A variável é uma variável externa, cujo valor está disponível a partir das propriedades do
programa janela, que tem as propriedades de uma variável global.
§ Ponteiro um arquivo local em um arquivo onde a leitura do próximo valor inicia. Como os dados
são lidos, o ponteiro desloca-se para a direita por uma ou várias posições.
§ Bandeira é uma variável cujo valor é colocado em correspondência com alguns fatos ou
eventos.
§ Parâmetros formais representam uma lista de variáveis que consta do cabeçalho da Função
Descrição (ver tambémFunções e Função Descrição e Operador de "regresso").
§ Função é um chamado, uma parte específica do programa que descreve o método de conversão
de dados. A utilização de uma função em um programa envolve Função Descrição e Função
Chamada. Não pode ser especial, a norma (built-in) e funções personalizadas
(ver também Funções e Funções Especiais).
§ Corpo é uma função ou vários operadores do executável a ser parte da Função Descrição.
§ Cabeçalho da função é uma parte da função descrição, consiste do tipo do valor de retorno,
nome e função da lista de parâmetros formais. A lista de parâmetros formais é fechado e
colocados entre parênteses após o nome da função.
§ Referência função é a mesma chamada da função.
§ Variável global é uma variável declarada fora todas as funções. O Âmbito de variáveis globais é
o programa inteiro.
§ Variável global do Terminal Client é uma variável, cujo valor está disponível em todas as
aplicações do cliente lançada no terminal (abreviadamente: GV).
§ Objeto de Gráfico - é uma forma na janela do símbolo, a forma pode ser selecionado, movido,
alterados ou apagados.
§ Array indicador é um one-dimensional array contendo valores numéricos que são a base para a
construção doIndicador Line.
§ Indicador Line é uma exibição gráfica de uma certa dependência baseada em valores
numéricos incluídos em umIndicador Array.
§ Iteração é repetida uma execução de alguns cálculos, ele é usado para constatar que o
programa linhas que compõem o ciclo operador corpo (ver também Ciclo do Operador ",
enquanto" e Ciclo de Operador "para") são executados.
§ Variável local é uma variável declarada dentro de uma função. O Âmbito de variáveis locais é o
corpo da função, no qual a variável é declarada.
§ Despacho do mercado é 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 e no 'Terminal' janela até que o
fim está fechado (ver também a Ordem Pendente).
§ Operando é uma constante, uma variável, um componente array ou um valor retornado por uma
função (ver Função Chamada).
§ A operação é feita mediante uma acção Operandos (veja também Operação Símbolo).
§ Operação Símbolo é um estilo de caracteres ou um grupo de caracteres que forma a executar
uma operação.
§ Operador é uma parte de um programa, é uma frase de uma linguagem algorítmica, que
prescreve um determinado método de conversão de dados. Não pode ser simples e compostos
operadores.
§ Pendente Ordem é um comércio para comprar ou vender activos a um segurança (um símbolo)
quando o preço predefinido nível seja atingido. A ordem pendente é exibido na janela do símbolo
e no 'Terminal' janela até que ela se torna uma forma ou de mercado é suprimido (ver também
o Mercado Order).
§ O ponto é a unidade de medição, para um preço de segurança (o preço mínimo possível mudar,
o último algarismo significativo do preço do valor).
§ Predefinidos variável é uma variável com um nome predefinido, o valor dessa variável é
definida pelo cliente terminal e não podem ser alterados pela codificação (ver também Predefinida
Variables).
§ Saída é transferência regular Loop de controle fora do ciclo operador, como resultado da
execução de uma condição colocada no cabeçalho operador ciclo (ver também Especial Loop
Exit).
§ Vender é um mercado que define ordem de venda de activos para uma segurança .
§ 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.
§ 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.
§ Função Especial é uma função que possui um dos nomes predefinidos (init (), start
() e deinit ()) e é chamada para ser executado pelo cliente terminal, mas também tem suas
próprias características especiais (ver Funções Especiais).
§ Saída é transferência Loop especiais de controle fora do ciclo operador, como resultado da
execução do operador "quebrar" o ciclo operador incluído no organismo (ver também Regular
Loop Exit).
§ Spread é a diferença entre os maiores e os menores preços nos dois pontos em uma citação de
um caminho-de segurança.
§ Função padrão é o mesmo que foi construída em função, que é uma função criada pelos
programadores do MQL4, tem um nome predefinido e propriedades predefinidas, a descrição das
funções habituais em um programa não é especificado; funções habituais são propriedades de
descrita no Detalhes no MQL4 Referência (ver Funções e Funções Standard).
§ 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.
§ Calendário é um período de tempo, dentro do qual um preço bar é formado; existem vários
calendários padrão: М1, М5, М15, М30, Н1, Н4, D1, W1 e MN (1 min, 5 min, 15 min, 30 min , 1
h, 4 h, 1 dia, 1 semana e 1 mês, respectivamente)
§ Time-Series Array é um array com um nome predefinido (Abrir, Fechar, Máximo, Mínimo,
volume ou tempo); seus componentes contêm os valores correspondentes das características
históricas das grades.
§ Trader é uma pessoa que negocía dos mercados financeiros para fins de lucro.
§ Two-Way Citações são ligados um par de mercado os preços oferecidos pela corretora para a
compra e venda de activos para uma segurança no momento.
§ Funções Definidas Por Usuário é uma função criada pelo programador (ver também
a função).
§ Âmbito variável é um local em um programa em que o valor da variável está disponível. Cada
variável tem o seu âmbito (ver também o Variável Local e Global Variável).
§ Zero Bar é o atual bar ainda não completamente formado. Em uma janela do símbolo, o zero é
exibido na barra à direita posição.
ipos de Trades
Um tipo de comércio no OrderSend () função pode ser indicada como uma constante predefinidos ou
como seu valor de acordo com um tipo de comércio:
Tabelas abaixo mostram que o cálculo valores-limite da realização de transacções quando abrir, fechar, a
colocação, suprimindo ou modificando ordens.
Para obter a distância mínima para StopLevel e congelamento distância FreezeLevel o MarketInfo
() função deve ser chamado.
Requisitos.
Corretos os preços utilizados quando realizar operações comerciais.
Tipo de Abrir Preço Preço de abrir Enquanto aguarda um decreto
Ordem Preço fechar uma Ordem transformando em aMarket
Pendente Ordem
Comprar Perguntar Bid
Vender Bid Perguntar
BuyLimit Abaixo do preço Pergunte preços chega a abrir
corrente Pergunte preço
SellLimit Acima do preço Proposta de preço chega a abrir
actual de lance preço
BuyStop Acima do preço Pergunte preços chega a abrir
actual Pergunte preço
SellStop Abaixo do preço Proposta de preço chega a abrir
corrente de oferta preço
A possibilidade de exclusão de uma ordem pendente é regulamentada pela FreezeLevel parâmetro.
Códigos de erro
GetLastError () - a função que retorna códigos de erro. Código constantes dos erros são determinados
em stderror.mqh arquivo.Para tirar as mensagens de texto utilizar o ErrorDescription () stdlib.mqh
função descrita no arquivo.
Gráfica tipo de objeto usado com identificadores ObjectCreate (), ObjectsDeleteAll () e ObjectType
() funções. Pode ser qualquer um dos seguintes valores:
Objeto gráfico usado com propriedades identificadores ObjectGet () и ObjectSet (), e pode ser qualquer
um dos seguintes valores:
O conjunto dos ficheiros wav recomendada para usar no trabalho prático em EAs, indicadores e scripts:
Se uma caixa de mensagem tem um botão Cancelar, a função retorna o valor IDCANCEL se quer a
tecla ESC for pressionado ou o botão Cancelar for selecionado. Se uma caixa de mensagem não tem
nenhum botão Cancelar, pressionando a tecla ESC não tem nenhum efeito.
Estes códigos são definidos no regresso a WinUser32.mqh arquivo, para que este ficheiro cabeçalho
deve ser incluído nos programas por # include <WinUser32.mqh>.
Expert Advisors:
bigbars.mq4 EA para procurar um bar que não seja inferior a uma determinada
altura
timeevents.mq4 EA que realiza alguma ação em um período de tempo especificado
createfile.mq4 EA notícias calendário para a criação de arquivo
matrix.mq4 EA para transpor matriz
сheck.mq4 Direitos limitação ao utilizar programas que são distribuídos numa
base comercial
usualexpert.mq4 EA usual que usa arquivos incluem
Scripts:
Indicadores:
Os arquivos incluem: