No MQL4 linguagem de programação algorítmica Curso Introdutório
Atualmente, um computador pessoal se tornou indispensável para todos. O rápido desenvolvimento da Internet e do desempenho dos computadores modernos abriu novos horizontes em vários campos da atividade humana. Logo em dez anos atrás, o mercado financeiro comércio estava disponível apenas para os bancos e para uma comunidade limitada de especialistas. Hoje em dia, qualquer pessoa pode participar do mundo dos comerciantes e profissionais independentes iniciar negociação em qualquer momento. Centenas de milhares de comerciantes no mundo inteiro já julgada Metatrader 4 Terminal Client pelos seus méritos. O uso de sua linguagem de programação embutida, MQL4, elevadores comerciantes a um novo nível de negociação - a negociação automática. Agora, um comerciante pode executar as suas ideias, como um programa aplicativo escrever um indicador personalizado, um script para executar operações simples, ou criar um Expert Advisor - um sistema automatizado negociação (trading robot). Um Expert Advisor (EA) pode trabalhar em um 24 / 7, sem qualquer intervenção - faixa de segurança preços, enviar mensagens eletrônicas, SMS de seu telefone celular, assim como fazem muitas outras coisas úteis. A principal vantagem das aplicações é a possibilidade de fazer rotas de acordo com o algoritmo fixado pelo comerciante. Qualquer idéias que podem ser descritos em uma linguagem algorítmica (intersecção de duas médias móveis ou de processamento digital de sinais, três telas por Elder Peters ou «análise fractal, uma rede neural ou construções geométricas) pode ser codificado em um aplicativo e depois utilizadas na prática negociação. Desenvolvimento de aplicações para Metatrader 4 Terminal Client requer o conhecimento de MQL4. O presente livro didático vai ajudá-lo a criar seu próprio Expert Advisors, scripts e indicadores e encarnar-los em suas idéias o seu rentável algoritmos de negociação. O manual é destinado a um grande número de leitores sem experiência em programação que querem aprender a desenvolver aplicações comerciais automatizados para Metatrader Cliente Terminal 4. O livro didático é concebido de tal modo que, para tornar o aprendizado MQL4 como convenientes e conseqüente possível. Prefácio É uma espécie de dificuldade para começar a escrever um livro sobre programação para iniciantes, porque a área de conhecimento em apreço envolve alguns novos conceitos que não são baseados em qualquer coisa previamente conhecida ou costume. De modo geral, um problema deste tipo pode ocorrer em qualquer outro campo do conhecimento. Por exemplo, o ponto é conhecido na matemática como infinitesimal círculo, que o círculo em si é definida como um conjunto de pontos ordenados de uma certa forma. Como é fácil de ver, esses termos são definidos através de cada uma das outras. Ao mesmo tempo, este "descuido" não se tornou um obstáculo para a matemática. Ambos os círculos, pontos, bem como outros termos aprovados em matemática ir bem em conjunto. Além disso, toda a gente percebe pela visão que é um ponto eo que é um círculo. É fácil descobrir que a grande maioria dos termos ordinários têm fronteiras indeterminadas. Alguns desses limites são tão nebulosos que estas auxiliem algumas dúvidas sobre a existência do próprio fenômeno ou objeto definido pela expressão. No entanto, a natureza do homem é que este estranho (em termos de lógica normal) situação não vem entre um homem e de sua fecunda existência e actividades. Após um termo tem sido utilizado por um determinado período de tempo, leva-se em completar o seu sentido para nós. É difícil responder à pergunta de como e por que isso acontece por aqui. Mas ela faz. Nós apenas sabemos que várias referência a um prazo desempenha um papel importante em termos do processo de aprendizagem notável.
Foram
estabelecidas
as
seguintes
tarefas
presentes
neste
trabalho:
desdobra o sentimento de novo usando termos bem conhecidos analogias; tornando o significado de cada termo intuitivamente claro quando ele ocorre pela primeira vez; fornecendo os leitores com a quantidade de informação necessária para caracterizar programas e programação. Para este efeito, o livro contém muitos exemplos e figuras. O texto inclui referências cruzadas que permitem ao leitor a obter informações sobre temas afins. Algumas palavras sobre a apresentação dos materiais. Alguns livros didáticos sobre programação convidar os seus leitores sobre as primeiras páginas para imprimir "Olá, mundo!" usando um programa simples. Seus autores consideram que, logo que os seus leitores início da aprendizagem de programação, deve remeter ao programa textos e gradualmente se acostumar com a forma como os programas podem olhar, que mais tarde irão facilitar a sua aprendizagem. No entanto, esta abordagem resulta em que o leitor tenha de lidar com vários desconhecidos termos, ao mesmo tempo, e só para adivinhar o conteúdo e as propriedades de algumas linhas do programa. Isso pode resultar em um equívoco e, consecutivamente, na vaga no conhecimento do leitor. A meu ver, seria mais eficaz a utilização de um método em que o leitor vai para a próxima seção do livro didático só depois que ele ou ela teve uma profunda compreensão das matérias anteriores. No âmbito deste método, o primeiro programa será oferecido ao leitor apenas depois que ele ou ela tem dominado todas as condições necessárias e ganhou alguns insights sobre os princípios básicos da codificação. Este é o método atual é baseada no livro didático. Para dominar o conhecimento dado no livro, o leitor tem de ser um usuário PC e ter uma certa experiência em trabalhar com Metatrader 4 produzidos pela MetaQuotes Software Corp. Introdução à Programação MQL4 Antes de começar a estudar MQL4 programação, iremos definir o escopo de nosso estudo. Em primeiro lugar devese notar que os programas discutidos neste livro pode ser usado apenas como aplicações para trabalhar em Metatrader Cliente Terminal 4. Fig. 1 abaixo mostra o papel do comércio na gestão destes programas. Para uma melhor compreensão da importância do comércio na gestão destes programas, vamos olhar para Fig. 1.
Se você está interessado em MQL4 programação, você deve ter conseguido familiarizar com o cliente terminal. Cliente terminal é uma parte do sistema de comércio on-line. Este sistema também inclui um servidor instalado em um centro lidar. O centro que tratam, por seu turno, está relacionada com outros participantes do mercado - os bancos e instituições financeiras. O cliente terminal inclui ambiente informacional - um conjunto de parâmetros que informam sobre o estado do mercado e das relações entre um profissional e de lidar center. Contém informações sobre preços correntes, limitações em relação aos máximos e mínimos para tamanho, distância mínima de ordens stop, abono / proibição do comércio automatizado e muitos outros parâmetros úteis caracterizando o estado atual. O ambiente informacional são atualizados quando novas carrapatos são recebidos pelo terminal (linha verde na fig. 1). Built-in ferramentas O cliente terminal built-in contém ferramentas que permitem realizar uma análise técnica do mercado e executar manual de gestão comercial. Para uma análise do mercado podem utilizar técnicas diferentes indicadores e estudos linha - suporte / resistência linhas de tendência canais, etc níveis Fibonacci Manual de gestão para a negociação da ordem de ferramentas de gestão é utilizado. Usando esta barra um comerciante pode abrir, fechar e modificar ordens. Além disso, o terminal tem a opção de parar de modo automatizado de gestão de posição. Um comerciante ações do built-in com ferramentas de gestão comercial resulta a formação do comércio encomenda, que são enviadas para um servidor. Para obter mais informações sobre o cliente terminal por favor consulte o "UserGuide" (ClientTerminal_folder \ Terminal.chm). Ferramentas de programação
Análise do mercado e do comércio na gestão Metatrader 4 Terminal Client é implementado com a ajuda de ferramentas de programação. MQL4 linguagem permite a criação de tais programas. Existem três tipos de aplicações criadas em MQL4 e destinados a trabalhar no terminal do cliente: personalizado indicador - um programa para visualização gráfica de mercado, de acordo com regularidades escrito um algoritmo do autor; Consultor Especialista - um programa que permite automatizar uma grande parte das operações comerciais e torna possível automatizar totalmente a negociação; script - um programa para executar um tempo de execução das acções, incluindo as operações comerciais. Fig. 1 revela que o pedido tem a mesma via de acesso ao cliente terminal ambiente informacional como built-in para ferramentas manuais negociação (setas azuis). Ele também pode formar gestora influências (setas vermelhas), passaram para o cliente de terminal. Programas de diferentes tipos podem ser utilizados simultaneamente e intercâmbio de dados. Usando esses aplicativos um programador pode automatizar uma grande parte das operações comerciais ou criar um robô que será um comércio sem interferência do operador. Os pedidos e manuais dos instrumentos de gestão podem ser utilizadas em simultâneo o cliente terminal complementando-se mutuamente. A característica fundamental técnicas de negociação on-line utilizando o sistema de comércio Metatrader é que todas as acções de gestão são produzidas no terminal cliente e, em seguida, enviada para um servidor. Programas aplicativos (Expert Advisor, script, indicador) pode trabalhar apenas como parte do cliente terminal, desde que esteja conectado a um servidor (que tratam centro). Nenhum dos programas aplicativos estão instalados no servidor. O servidor permite apenas para processar sinais provenientes de um cliente de terminal. Se um cliente terminal está desconectado da Internet ou de um programa aplicativo (Expert Advisor ou script) em execução em que não geram qualquer gerir as acções, nada irá acontecer no servidor. O escopo de nosso estudo inclui programas (Expert Advisors, scripts personalizados e indicadores) que permitam a realização parcial ou totalmente automatizada alargar significativamente o comércio e manutenção de trocas informativas (ver fig. 1). Neste livro você encontrará a descrição do programa e os componentes principais regras de criação e utilizando programas. Também vamos considerar em detalhes exemplos de programas e parâmetros do ambiente informacional do cliente terminal, que estão disponíveis para um programa durante a sua execução. Programas para a negociação automática possuem potencial muito mais possibilidades do que ferramentas manuais de gestão comercial. Na maioria dos casos, um programa permite fazer um trabalho mais fácil do comerciante eliminando a necessidade de um monitoramento constante da situação no mercado antes da sessão um computador por um longo período de tempo. Poderá também contribuir para aliviar a tensão nervosa e diminuir o número de erros que aparecem nos períodos de extrema tensão emocional. Mas o principal é que a utilização do programa de comércio método permite desenvolver uma gestão própria do idéias e testá-las em dados históricos, escolha óptima parâmetros de aplicação dessas idéias e, finalmente, para implementar uma estratégia comercial bem articulada.
Noções básicas de MQL4 Esta seção representa termos básicos subjacentes MQL4 linguagem de programação: §
Alguns conceitos básicos Expressões como 'carrapato' (uma alteração de preços), «controlo» em algoritmos, 'comentário' nos programas são descritos. O principal evento quando negociação em mercados financeiros é a mudança de preço. Esta é a razão por carrapato é um importante acontecimento que torna os mecanismos básicos de MQL4 programas veiculados. O que fazer quando um novo carrapato
rendimentos? Quais as acções a tomar? Este controle é que se muda para a frente aqui. Mas não se esqueça de comentar o seu código. §
Constantes e Variáveis Os termos de constantes e variáveis são introduzidas, a diferença entre esses termos são explicados. Como o termo sugere, é uma coisa constante, contínua, definir de uma vez por todas. Ao contrário da constante, uma variável é um objeto que o código de programação pode modificar o seu conteúdo. É impossível escrever um programa sem utilizar objetos imutáveis (constantes) e / ou objetos que podem ser modificados durante a execução do programa (variáveis).
§
Tipos de dados Certos tipos de dados são usados em qualquer linguagem de programação. O tipo de uma variável é escolhido de acordo com a sua finalidade. Como é que podemos declarar uma variável, como podemos inicializá-lo (preset seu valor inicial)? Uma má escolha do tipo de uma variável pode abrandar o programa ou mesmo resultar na sua acção errada.
§
Operações e Expressões Operações operar sobre operandos. Quais são os tipos de operações que existem? O que é utilizada para typecasting?Quais são as características especiais das operações sobre inteiros? Porque é importante lembrar que cerca de precedences de dados de diferentes tipos? Sem saber sobre as características de algumas operações, você pode fazer erros sutis.
§
Operadores Simples e compostos operadores. Uma ação necessária não deve ser executado por um simples operador. Se for necessário que um grupo de operadores é executado como um grande operador, este grupo deve ser incluído em um composto operador. Requisitos específicos e exemplos de utilização de operadores estão dadas.
§
Funções A necessidade de se obter um simples código remete-nos para o prazo de Função. Para utilizar a função de locais diferentes no programa, é necessário prestar-lhe-Function Parameters. Iremos considerar o processo de criação da função personalizada. Os exemplos de utilização de funções normalizadas são dadas.
§
Tipos de Programas Scripts, indicadores e Expert Advisors são os tipos de MQL4 programas que lhe permitem cobrir praticamente toda a classe dos problemas relativos à negociação em mercados fincancial. É necessário compreender os efeitos de cada tipo de programas, a fim de utilizar Metatrader Cliente Terminal 4, da melhor forma.
Alguns conceitos básicos Assim, o tema do nosso interesse, é um programa escrito em MQL4. Antes de darmos início a uma apresentação detalhada das regras de escrever programas, é necessário descrever os conceitos básicos que caracterizam um programa e de suas interrelações com informação ambiental. O Metatrader 4 Terminal Client for conhecida a trabalhar on-line. A situação dos mercados financeiros muda
continuamente, o que afecta os símbolos gráficos no cliente de terminal. Carrapatos terminal fornecer ao cliente, com informações sobre a evolução dos preços no mercado.
A noção de carrapato Assinale-se de um evento que se caracteriza por um novo preço do símbolo em algum instante. Carrapatos são entregues a cada cliente através de um terminal instalado em um servidor central que tratam. Conforme adequado à situação actual dos mercados, carrapatos podem ser recebidas mais ou menos freqüentes, mas cada um deles traz uma nova citação - o custo de uma moeda expresso em termos de outra moeda. Um pedido que operam com o cliente terminal pode funcionar dentro de um período longo de tempo, por exemplo, vários dias ou semanas. Cada pedido é executado de acordo com as regras estabelecidas para os programas de um certo tipo. Por exemplo, uma Expert Advisor (EA) não funciona continuamente o tempo todo. Um Expert Advisor é normalmente lançado no momento em que surge um novo carrapato. Por este motivo, não se caracterizar como apenas um carrapato nova citação, mas sim como um evento para ser processado pelo cliente terminal. A duração do Expert Advisor da operação depende de qual programa está incluído no código-la. Normal EAs completar um ciclo de processamento de informação durante alguns décimos ou centésimos de segundo. Dentro desse prazo, o EA pode ter processado alguns parâmetros, fazer uma decisão comercial, forneça o profissional com algumas informações úteis, etc Após ter terminado esta parte do seu trabalho, a EA vai para o modo de espera até que um novo carrapato vem. Este novo carrapato lança o Expert Advisor novamente, o programa faz o seu adequado funcionamento novamente e volta ao modo de espera. A descrição detalhada de como o aparecimento de um novo programa carrapato influências operação segue abaixo.
A noção de controle Falando sobre o código em execução um programa de fluxo, bem como sua interação com o cliente terminal, vamos usar o termo de «controlo». O controle é um processo de realização de ações predeterminadas pelo programa algoritmo eo cliente terminal funcionalidades. Controle pode ser transferida dentro do programa a partir de um código de linha para um outro, bem como o programa de terminal para o cliente. O controle é transferido de uma forma semelhante à de alguém que dá a palavra para falar numa reunião. Tal como oradores abordar uma reunião e, em seguida, dar a palavra a outros, o programa cliente do terminal e transferência de controle entre si.Pelo que, o cliente terminal domina. Seu estado é maior do que a do programa, como a autoridade do presidente de uma reunião, é maior do que as de um vulgar coluna. Antes do programa é lançado, o controle está sob a supervisão do cliente terminal. Quando um novo carrapato é recebida, o terminal cliente transfere o controle para o programa. O código do programa começa a ser executado neste momento. O cliente terminal, depois de ter transferido o controle para o programa, não pode parar o seu funcionamento. Ela continua trabalhando com o máximo desempenho durante todo o período de tempo que é lançado no PC. O programa só poderá começar a funcionar no momento em que o cliente tenha transferido o controlo terminal para ele (como o presidente de uma reunião a reunião controla o tempo
todo que está acontecendo, enquanto que o atual orador toma a palavra por apenas um período limitado de tempo ). Depois de ter completado o seu funcionamento, o programa retorna controle para o cliente terminal e não pode ser lançado por sua própria iniciativa. No entanto, quando o controlo já foi transferida para o programa, ele retorna controle para o cliente terminal, por si só. Em outras palavras, o cliente terminal não poderá retornar controle a partir do programa, por si só. Dynamic ações do usuário (por exemplo, forçou o encerramento do programa) são uma isenção. Ao discutir os assuntos de desempenho dos programas e estruturas internas, estamos interessados principalmente na parte do controle que são transferidos dentro de um programa. Deixe a Fig's referem. 2 mostra que a natureza global da transferência de controle para, a partir e dentro de um programa. Círculos apresentados na figura caracterizar algumas pequenas, logicamente concluído fragmentos de um programa, enquanto que as setas entre os círculos mostram como controle é transferido de um fragmento para outro.
Fig. 2. Transferindo o controle de um programa Um programa que aceitou o controle do cliente terminal (executando o programa) começa a fazer algumas ações de acordo com a sua inerente algoritmo. O programa contém linhas programa; geral ordem de execução programa consiste na transferência do controle seqüencial a partir de uma linha para outra na direção de cima para baixo. O que, segundo as quais as regras podem ser escritos nestas linhas serão consideradas inferiores, em todos os detalhes. Aqui, é importante apenas para enfatizar que cada fragmento é executado logicamente concluído - por exemplo, alguns cálculos matemáticos são feitas, uma mensagem é exibida na tela, uma ordem comercial é formada, etc Até o fragmento actual do programa é executado , Que mantém o controle. Depois de ter sido integralmente cumpridos, o controle é transferido para um outro fragmento. Assim, o controlo dentro de um programa é transferido de um fragmento para outro logicamente concluído que eles são executados. Logo que o último fragmento é executado, o programa fará a transferência (retorno) para controlar o terminal cliente.
A noção de comentário Um programa consiste em dois tipos de registros: aqueles que apresenta o programa em si e que são textos explicativos para o programa código. Um comentário é opcional e nonexecutable parte de um programa. Então, é um comentário opcional parte de um programa. Isso significa que um programa pronto funcionará de acordo com o seu código independentemente de saber se existem comentários nos ou não. No entanto, as observações facilitar a compreensão do programa código muito. Verificou-se uma linha e multi-line comentários. A uma linha de comentário é qualquer seqüência de caracteres após duas barras oblíquas (//). O sinal de um uma linha de comentário é terminada por linha alimentação. Um comentário multi-linha começa com os caracteres de / * e é terminada por * / (ver fig. 3). Os comentários são utilizadas para explicar o programa código. Um bom programa contém semper comentários.
Fig. 3. Exemplo de comentários em um programa. Os comentários são amplamente utilizadas na codificação. Eles normalmente são exibidas em cinza nos códigos. Iremos utilizar comentários, também, a fim de explicar os nossos códigos e torná-los mais inteligíveis. Constantes e Variáveis Os termos de 'constante' e 'variável' são consideradas em uma seção, uma vez que estes termos são muito próximos de si mesmas. A noção de constante Constante é uma parte de um programa, um objeto que tem um valor. A duração do programa é uma constante na semelhantes para o mesmo termo usado em equações matemáticas. É um valor invariável. Para descrever a natureza de um constante utilizada em uma linguagem algorítmica em tantos detalhes quanto possível, vamos remeter ao bem-conhecido físico e matemático constantes. A raça humana tem descoberto as constantes, os valores dos quais não dependem de nós, de qualquer maneira. Essas são, por exemplo, na física: a queda livre que a aceleração é semper igual a 9,8 m / s /
s; em matemática: Pi = 3.14. Constantes do tipo não pode ser considerado semelhante aos constantes, de uma linguagem algorítmica. O prazo de constante também é usado em equações matemáticas. Por exemplo, na equação de Y = 3 * X + 7, números 3 e 7 são constantes. Os valores dessas constantes são totalmente dependentes da vontade da pessoa que fez a equação. Esta é a mais próxima de constantes analogia usados em programas MQL4. Uma constante (como um valor) é colocada por um programador no código na fase da sua criação. A única constante é caracterizada pelo seu valor, pelo que a perspectiva da "constante" e "o valor de uma constante" são sinônimos completo. Constantes exemplar: 37, 3.14, verdade, "Kazan"
Fig. 4. Uma constante na memória de um PC.
As propriedades de constantes A propriedade de uma constante é o seu poder de reter durante o tempo de funcionamento do programa o valor fixado pelo programador e definir este valor para o programa quando o programa solicita deste (Fig. 5). Para cada constante no programa, o computador aloca uma parte da sua memória do tamanho necessário. O valor de uma constante não pode ser mudado durante a execução do programa nem por um programador, nem pelo computador (Fig. 6).
O valor da constante semper permanece a mesma.
Fig. 5. O estado da memória celular de uma constante quando se define o valor para o programa.
O valor de uma constante não pode ser mudado durante a operação do programa.
Fig. 6. É impossível alterar o valor de um programa constante durante a operação.
A noção de variável Parte variável é um programa que tem um valor e um nome. O prazo da variável em MQL4 é semelhante à que foi aceite pela matemática. A diferença entre eles consiste apenas na medida em que o valor de uma variável em matemática é semper implícita, enquanto que o valor da variável em execução um programa é armazenado em uma cela especial na memória do computador. O termo de "variável identificador 'é a plena sinônimo de" variável nome'. A variável é colocado no texto do código, pelo seu autor, na fase de codificação como uma variável nome. O nome (identificador) de uma variável pode ser composta por letras, dígitos, sublinhado. No entanto, ele deve começar com uma letra. MQL4 é sensível a maiúsculas e minúsculas, ou seja, S e snão são os mesmos. Exemplar variável nomes: Alfa, alfa, beta, o número, Num., A_37, A37, qwerty_123 Os seguintes identificadores de variáveis representam os nomes das diferentes variáveis: А_22 ea a_22; Massa, MASSA. Exemplar valores das variáveis: 37, 3.14, verdadeiro, "Kazan". As propriedades da variável A propriedade de uma variável é a sua capacidade de se obter um certo valor a partir do programa, retê-los durante o período de funcionamento do programa e definir este valor para o programa quando solicitado pelo programa. Para cada variável do programa, o computador aloca uma parte da sua memória do tamanho necessário. Vamos referir-se a Fig. 7 e estudar a construção de uma variável.
Fig. 7. Uma variável na memória de um computador. Existe um valor de uma variável na memória do celular no computador. Esse valor pode ser solicitada para a transformação e modificado pelo programa. O nome de uma variável nunca é alterado. Ao escrever um código, o programador pode definir qualquer nome para a variável. No entanto, logo que o programa está pronto lançado, nem o programador nem computador, nem o programa tem qualquer viabilidade técnica para mudar o nome da variável. Se um programa enquanto está a ser executado reúne o nome de uma variável, o programa remete para essa variável, a fim de obter o seu valor para a transformação. Se um programa se referiu a uma variável, este último apresenta um valor para o seu programa. Pelo que, o valor da variável permanece o
mesmo, considerando que o programa se torna a cópia do valor contido na célula de memória alocado para essa variável (Fig. 8).
Quando o valor de uma variável é definida para um programa, este valor permanece inalterado. O nome de uma variável nunca será mudado.
Fig. 8. O estado da célula de memória de uma variável quando se define o valor para o programa. Uma variável não está relacionada com a execução do programa durante um certo período de tempo. Durante este período, o programa pode referir-se a outras variáveis ou fazer cálculos necessários. Entre as "sessões" de comunicação com o programa, a variável retém o seu valor, ou seja, mantendo-se inalterada. De acordo com o algoritmo do programa, ele pode tornar-se necessário alterar o valor de uma variável. Neste caso, o programa apresenta ao seu novo valor variável, a variável que recebe este valor a partir do programa. Todas as modificações são feitas na memória celular. Isso resulta em que o valor anterior da variável é eliminada, enquanto que um novo valor da variável definida pelo programa toma o seu lugar (Fig. 9).
O valor de uma variável pode ser alterado pelo programa. O nome da variável é semper inalterada.
Fig. 9. O estado da célula de memória de uma variável quando a receber o valor do programa. Constantes e Variáveis exemplar em um Programa Em um programa, constantes e variáveis podem ser encontrados na operadores. No código abaixo, A e B são variáveis, 7 e 3 são constantes: A = 7; / / Linha 1 B = A + 3; / / Linha 2 Vamos estudar como o programa funciona com constantes e variáveis. Execução dessas linhas, o programa irá fazer os seguintes passos: Linha 1: 1. 7 apresenta o seu valor constante para o programa.
2. Um valor variável recebe 7 do programa. Linha 2: 1. O programa tem encontrado uma expressão para a direita a partir do sinal da igualdade e está a tentar calculá-lo. 2. Constant 3 apresenta o seu valor para o programa. 3. O programa refere-se a uma variável pelo nome. 4. Uma variável define o seu valor (7) para o programa. 5. O programa faz cálculos (7 + 3). 6. В variável recebe valor 10 através do programa. O Valor de uma variável pode ser mudado durante a operação do programa. Por exemplo, pode haver uma rubrica no programa que contém o seguinte: В = 33; / / Linha 3 Neste caso, o seguinte será feito na execução do programa: 1. 33 conjuntos constante o seu valor para o programa. 2. Variável B gets (nova) valor 33 através do programa. É fácil notar que o valor variável B recebe 10, a certa altura da execução do programa, e então ele recebe o valor de 33. O nome da variável B mantém-se inalterado durante todos estes acontecimentos, enquanto que o valor da variável irá mudar. Fig. 10 mostra constantes e variáveis do programa código:
Fig. 10. Uma constante e uma variável em um programa. Tipos de dados É um conhecimento comum que só equitype valores podem ser acrescentadas ou subtraídas. Por exemplo, maçãs pode ser adicionado à maçãs, maçãs, mas não pode ser adicionado à metros quadrados ou a temperatura. Limitações semelhantes podem ser encontrados na maioria das línguas modernas algorítmica. Tal como objetos de vida normal ter alguns tipos caracterizando as suas cores (vermelho, azul, amarelo, verde), o seu sabor (amargo, ácido, doce), montante (um e meio, dois, sete), MQL4 usa dados de diferentes tipos. Falando sobre o tipo de dados, vamos dizer o tipo do valor de uma constante, de uma variável eo valor retornado por uma função (a noção de função é considerado na seção de Funções). Em MQL4, são distinguidos os seguintes tipos (para os valores de constantes, variáveis, e os valores devolvidos pelas funções): § § § § §
int - inteiros; duplo - números reais; bool - booleanos (lógicos) valores; string - valores do tipo string; cor - valores de cor tipo;
§
datetime - valores de data e hora.
Tipo int Os valores do tipo int são inteiros. Este tipo inclui valores que são inteiro pela sua natureza. Os seguintes valores são inteiros, por exemplo: quantidade de bares na janela do símbolo (16000 bares), abriu e quantidade de encomendas pendentes (3 ordens), na distância entre os pontos actuais dos preços e símbolo da ordem Open Preço (15 pontos). Montantes representam objetos tais como eventos também pode ser apenas inteiros. Por exemplo, a quantidade de tentativas para abrir um despacho não pode ser igual a uma e meia, mas só para um, dois, três, etc Existem 2 tipos de valores inteiros: § §
Valores decimais pode ser composta por algarismos de 0 a 9 e ser positivos ou negativos: 10, 11, 12, 1, 5, -379, 25, -12.345, -1, 2. Hexadecimal valores podem consistir de latim letras de A a F ou a partir de um f, algarismos de 0 a 9. Eles devem começar com 0x ou 0x e ter valores positivos ou negativos: 0x1a7b, 0xff340, 0xAC3 0X2DF23, 0X13AAB, 0x1.
Valores do tipo int deve estar dentro da faixa de -2 147 483 648 para 2 147 483 647. Se o valor de uma constante ou uma variável está fora do intervalo acima, o resultado da operação programa será nulo. Os valores de constantes e variáveis do tipoint ter 4 bytes da memória de um computador. Um exemplo de utilização de uma variável do tipo int em um programa: Arte int = 10; / / Exemplo variável inteira int B_27 = - 1; / / Exemplo variável inteira Num int = 21; / / Exemplo variável inteira Max int = 2147483647; / / Exemplo variável inteira int = Min - 2147483648; / / Exemplo variável inteira
Tipo dupla O valor real da dupla tipo são números que contêm uma parte fracionária. Exemplo valores deste tipo podem ser quaisquer valores que têm uma parte fracionária: inclinação da linha de apoio, símbolo preço, valor médio de abertura ordena dentro de um dia. Às vezes você pode enfrentar problemas designando variáveis ao escrever o seu código, ou seja, ele não é claro para um programador que tipo (int ou dupla), a variável pertence. Vamos considerar um pequeno exemplo: Um programa abriu 12 ordens dentro de uma semana. Qual é o tipo da variável A, que considera a quantidade média diária de ordens abertas por esse programa? A resposta é óbvia: A = 12 ordens / 5 dias. Significa que a variável A = 2.4 deveria ser considerada no programa como dupla, uma vez que este valor tem uma parte fracionária. Que tipo deve ser a mesma variável A se o valor total das encomendas abertos dentro de uma semana é 10? Você pode pensar que, se 2 (10 encomendas / 5 dias = 2) não tem nenhuma parte fracionária, uma variável pode ser considerada como int. No entanto, esse raciocínio está errada. O actual valor de uma variável pode ter uma fração parte constituído por apenas zeros. É importante que esse valor dessa variável é real, pela sua natureza. Neste caso, a variável A tem também de ser do tipo dupla. O ponto separa também devem ser inscritas no registo constante no programa: А = 2,0
Os valores reais das variáveis constantes e constituído por uma parte inteira, um ponto decimal, e uma parte fracionária. Os valores podem ser positivos ou negativos. A parte inteira e da parte fracionária são constituídos por algarismos de 0 a 9. A quantidade de algarismos significativos depois da vírgula pode chegar ao valor de 15. Exemplo: 27,12 -1,0 2,5001 -765456,0 198732,07 0,123456789012345 Os valores do tipo dupla pode variar entre -1,7 * e-308 a 1.7 * e308. Na memória do computador, os valores de constantes e variáveis do tipo dupla ter 8 bytes. Um exemplo de utilização de uma variável do tipo dupla em um programa: Arte duplo = 10,123; / / Exemplo variável real B_27 duplo = - 1,0; / / Exemplo variável real Num duplo = 0,5; / / Exemplo variável real MMM = duplo - 12.07; / / Exemplo variável real Price_1 duplo = 1,2756; / / Exemplo variável real
Tipo bool Os valores do tipo bool são valores de Boolean (logical) Tipo ou que contenham desmentistes verdade. Com o objectivo de aprender a noção de Boolean tipo, vamos considerar um pequeno exemplo do nosso quotidiano. Digamos, um professor precisa de conta a presença dos livros didáticos dos alunos. Nesse caso, o professor irá listar todos os alunos, sobre uma folha de papel e, em seguida, irá assinalar, em uma linha direita se um aluno tem um livro didático ou não. Por exemplo, o professor pode usar marcas e traços em cima da mesa: Lista de Alunos
Livros Didáticos em Física
Livro Didático em Biologia
Livro Didático em Química
1
Smith
V
--
--
2
Jones
V
--
V
3
Marrom
--
V
V
...
...
...
...
...
25
Thompson
V
V
V
Os valores nas colunas direito só pode ser de 2 tipos: verdadeiro ou falso. Estes valores não podem ser atribuídas a qualquer dos tipos acima, uma vez que são considerados não em todos os números. Eles não são os valores de cor, sabor, volume, etc, de qualquer modo. No entanto, que assume assim um importante sentido. Em MQL4, tais valores booleanos são nomeadas, ou lógico, de valores. Constantes e variáveis do tipo bool são caracterizados através de que podem ter apenas 2 possíveis valores: true (verdadeiro, TRUE, 1) ou falsa (falso, FALSE, 0). Os valores de constantes e variáveis do tipo bool ter 4 bytes na memória do computador. Um exemplo de utilização de uma variável do tipo bool em um programa: bool aa = True; / / Boolean аа variável tem o valor de verdade bool B17 = TRUE; / / Boolean B17 variável tem o valor de verdade Hamma bool = 1; / / Boolean Hamma variável tem o valor de verdade
Asd bool = False; / / Boolean Asd variável tem o valor de um falso Nol bool = FALSE; / / variável Booleana Nol tem o valor de um falso Prim bool = 0; / / variável Booleana Prim tem o valor de um falso
Tipo string O valor do tipo string é um valor representado como um conjunto de caracteres ASCII. No nosso quotidiano, pertence a um conteúdo semelhante, por exemplo, armazenar nomes, carro faz, etc Uma seqüência de tipo valor é gravado como um conjunto de caracteres colocados em aspas (não deve ser misturado com o dobro única aspas!).Aspas são usadas apenas para marcar o início eo fim de uma string constante. O valor em si é o conjunto de caracteres emoldurado pelas cotações. Se existe uma necessidade de introduzir um aspas duplas ( "), você deve colocar um reverso barra (\) antes dela. Qualquer caractere especial constantes no verso seguinte barra (\) pode ser introduzido em uma seqüência. O comprimento de uma string constante varia de 0 a 255 caracteres. Se o comprimento de uma string constante ultrapassa o seu máximo, o excesso de personagens o lado direito será truncado e compilador dará o correspondente aviso. Uma combinação de dois caracteres, a primeira das quais é a reverso barra (\), é comummente aceite pela maioria dos programas e percebida como uma instrução para executar um determinado texto de formatação. Essa combinação não é exibido no texto. Por exemplo, a combinação de \ n indica a necessidade de uma alimentação de linha; \ t demandas tabulação, etc O valor do tipo string é gravada como um conjunto de personagens emoldurado por aspas duplas: "Metatrader 4", "Stop Loss", "Ssssstop_Loss", "stoploss", "10 sementes". O valor da cadeia, como tal, é o conjunto de caracteres. As aspas são usadas apenas para marcar o valor das fronteiras. A representação interna é uma estrutura de 8 bytes. Um exemplo de utilização de uma variável do tipo string em um programa: string Prefix = "Metatrader 4"; string Postfix = "_of_my_progr. string Name_Mass = "History"; / string texto = "Linha de Alta \ caracteres line feed
/ / Exemplo variável string OK"; / / Exemplo variável string / Exemplo variável string n Baixa Line", / / o texto contém
Tipo de cor O valor da cor é um tipo de valor cromático. O significado de "cor" (azul, vermelho, branco, amarelo, verde, etc) é um conhecimento comum. É fácil imaginar o que uma variável ou uma constante de cor tipo pode significar. É uma constante ou uma variável, cujo valor é uma cor. Pode parecer a ser um tanto incomum, mas é muito simples, de modo geral. Tal como o valor de uma constante é um número inteiro, o valor de uma cor é uma cor constante. Os valores constantes da cor e variáveis pode ser representado como um dos três tipos: §
Literais O valor de cor tipo representado como um literal é constituído por três partes que representam os valores numéricos da intensidade das três cores fundamentais: vermelho, verde e azul (RGB). O valor deste tipo começa com 'C' e é citada por aspas simples.
Os valores numéricos de RGB intensidade variam de 0 a 255 e podem ser registradas tanto decimalmente e hexadecimally. Exemplos: C'128128128 '(cinza), C'0x00, 0x00, 0xFF' (azul), C'0xFF, 0x33, 0x00 '(vermelha). §
Integer Representação Integer é registados como uma representação hexadecimal ou um número decimal. Um número hexadecimal é apresentado como 0xRRGGBB onde TR é o valor da intensidade vermelho, GG verde, e BB - azul. Decimal constantes não são reflectidas directamente em RGB. Representam o valor decimal de uma representação hexadecimal inteiro. Representação dos valores de cor e tipo como inteiros literais hexadecimal como é muito fácil de utilizar. A maioria dos modernos editores de texto e gráficos fornecem informações sobre a intensidade do vermelho, verde e azul componentes selecionados no valor de cor. Você acabou de seleccionar uma cor em seu editor e copiar os valores encontrados em sua descrição para a cor correspondente valor representação no código. Exemplos: 0xFFFFFF (branco), 0x008000 (verde), 16777215 (branco), 32768 (verde).
Fig. 11. Cor parâmetros para literal inteiro e representação do valor constante cor pode ser tomada nos modernos editores.
§
Color Names A forma mais fácil de se definir uma cor para indicar o seu nome, de acordo com a tabela de cores da web. Neste caso, o valor de uma cor é representada como uma palavra correspondente com a cor, por exemplo, vermelho - a cor vermelha.
DarkGreen
DarkSlateGray
Olive
Indigo
MidnightBlue
DarkBlue
DarkGoldenrod
DarkSlateBlue
Sienna
DarkViolet
Tijolo refratário
MediumSpringGreen
LawnGreen
CadetBlue
Laranja
Ouro
Azul
Verde
Teal
DarkOliveGreen SaddleBrown MediumBlue
Marinha ForestGreen
Marrom
DarkTurquoise
Chocolate
Crimson
DarkOrchid
YellowGreen
LimeGreen
Amarelo
Chartreuse
Lime
SpringGreen
Magenta
Vermelho
Gray
SlateGray
Peru
DeepPink
MediumTurquoise
DodgerBlue
Turquesa
RoyalBlue
SlateBlue
MediumOrchid
GreenYellow
MediumAquamarine
DarkSeaGreen
Tomate
RosyBrown
PaleVioletRed
Coral
CornflowerBlue
DarkGray
BurlyWood
HotPink
Salmão
Violet
LightCoral
SkyBlue
Khaki
LightGreen
Aquamarine
Prata
LightSkyBlue
LightSteelBlue
Thistle
PowderBlue
PaleGoldenrod
PaleTurquoise
LightGray
Trigo
LightPink
Gainsboro
PeachPuff
Rosa
Bisque
Beige
AntiqueWhite
PapayaWhip
Cornsilk
LightYellow
LightCyan
MistyRose
OldLace
WhiteSmoke
Concha marinha
Marfim
Melada
MediumVioletRed MediumSeaGreen
SandyBrown MediumSlateBlue
LightGoldenrod Blan
MintCream
Neve
Branco
Constantes e variáveis de cor tipo tomar 4 bytes na memória do computador. Um exemplo de como usar essa variável em um programa: Paint_1 color = C '128, 128, 128'; / / O valor de cinza foi atribuído à variável Colo cor C = '0 x00, 0 x00, 0 xFF "; / / O valor de azul foi atribuído à variável BMP_4 color = C '0 xFF, 0 x33, 0 x00' / / O valor do vermelho foi atribuído à variável K_12 color = 0 xFF3300; / / O valor do vermelho foi atribuído à variável N_3 color = 0 x008000; / / O valor do verde foi atribuído à variável Cor cor = 16777215; / / O valor do branco foi atribuído à variável Alfa color = 32768; / / O valor do verde foi atribuído à variável A = cor vermelha; / / O valor do vermelho foi atribuído à variável B = cor amarela; / / O valor de cor amarela foi atribuído à variável color = Colorit Negro; / / O valor dos negros foi atribuído à variável B_21 color = White; / / O valor do branco foi atribuído à variável
Tipo datetime O valor é do tipo datetime os valores de data e hora. Os valores deste tipo podem ser usados em programas para analisar o momento do início ou cessação de alguns eventos, incluindo os lançamentos de importantes notícias, horários start / acabamento, etc As constantes de data e hora pode ser representado como uma linha literal consistindo de 6 peças que representam o valor numérico do ano, mês, dia (ou dia, mês, ano), hora, minuto e segundo. A única constante é enquadrado em cotações e começa com 'D'. É permitido o uso truncado valores: ou sem data ou sem tempo, ou apenas um valor vazio. O intervalo de valores: a partir de 1 º de janeiro de 1970, a 31 de dezembro de 2037. Os valores de constantes e variáveis do tipo datetime ter 4 bytes na memória do computador. Um valor representa a quantidade de segundos decorridos a partir das 00:00 do dia 1 de janeiro 1970. Um exemplo de utilização de uma variável do tipo datetime em um programa: Alfa datetime = D '2004.01.01 00: 00 "; / / Ano Novo Tim datetime = D "01.01.2004"; / / Ano Novo datetime Tims = D '2005.05.12 16: 30: 45'; / / 12 de maio de 2005 4:30:45 pm datetime N_3 = D »12.05.2005 16: 30: 45 '; / / 12 de maio de 2005 4:30:45 pm Compile datetime = D''; / / equivalente a D '[compilação data] / / 00:00:00 '
Declaração e iniciação variável A fim de evitar possíveis "perguntas" sobre o programa pelo qual o tipo de dados desta ou daquela variável pertence, que é aceite em MQL4 especificar os tipos de variáveis logo no início de um programa explícito. Antes de uma variável começa a participar em quaisquer cálculos, deve ser declarada.
Declaração variável é a primeira menção de uma variável em um programa. Na declaração de uma variável, seu tipo deve ser especificada. A inicialização variável significa que a sua afectação a um valor correspondente com o seu tipo, na sua declaração. Cada variável pode ser inicializado. Se nenhum valor inicial é estabelecido explicitamente, um numérico variável será inicializada por zero (0) e uma variável string será inicializada por uma linha vazia. Em MQL4, admite-se a especificar os tipos de variáveis explicitamente em sua declaração. O tipo de uma variável é declarada na primeira menção do nome desta variável. Quando ela é indicada para o segundo e os subsequentes vezes, o seu tipo não é especificado mais. No decurso da execução do programa, o valor da variável pode mudar, mas o seu nome e tipo permanecem inalteradas. O tipo de uma variável pode ser declarada em única ou linhas de operadores. Uma variável pode ser declarado em uma única linha: int Var_1; / / Variável declaração em uma única linha Esse recorde significa que haverá Var_1 variável (variável declaração como tal) e do tipo desta variável int serão dadas no programa. Em uma linha, várias variáveis do mesmo tipo podem ser declaradas: int Var_1, Box, Comm; / / Declaração de diversas variáveis em uma linha Esse recorde significa que haverá variáveis Var_1, Caixa e Comm, todos do tipo int, utilizado no programa. Significa que as variáveis acima enumeradas serão considerados pelo programa como variáveis do tipo inteiro. Variáveis também podem ser inicializados dentro operadores: Var_5 duplo = 3,7; / / Variável inicialização em uma missão operador Esse recorde significa que haverá Var_5 variável do tipo usado em programa duplo, o valor inicial da variável a ser 3.7. O tipo de variáveis nunca é especificado a subseqüente linhas em qualquer parte do programa. Contudo, cada vez que o programa solicita uma variável que "se lembra" de que essa variável é do tipo que tenha sido especificado, na sua declaração.Conforme cálculos progressos no programa, os valores das variáveis podem mudar, mas o seu modelo mantém-se inalterado. O nome de uma variável não tem qualquer relação com o seu tipo, ou seja, você não pode julgar acerca do tipo de uma variável pelo seu nome. Um nome dado a uma variável pode também ser utilizada para quaisquer tipos de variáveis em diferentes programas. No entanto, o tipo de qualquer variável pode ser declarada apenas uma vez dentro de um programa. O tipo de variáveis declaradas não será alterado durante a execução do programa. Exemplos de variáveis Declaração e Inicialização Variáveis podem ser declaradas em várias linhas ou em uma única linha. É permitida a declarar diversas variáveis de um tipo simultaneamente. Neste caso, as variáveis são listados separados por vírgulas, sendo colocado um ponto e vírgula no final da linha.
Fig. 12. Exemplo de declaração variável em uma única linha. O tipo de variáveis é declarada uma única vez, na primeira menção da variável. O tipo não será mais indicado para o segundo e os subsequentes vezes quando a variável é mencionada.
Fig. 13. Exemplo de declaração variável em uma única linha. É permitida a declarar e inicializar variáveis nos operadores.
Fig. 14. Exemplo de iniciação variável.
Fig. 15. Variável inicialização no cabeçalho de um composto operador.
Operações e Expressões A fim de compreender o que tem importância operações e expressões em MQL4, analogias especiais não são necessários.Praticamente, é o mesmo que em operações e expressões simples aritmética. Todos entendem que, no registro de f = n + m,membros f, n e m são variáveis, sinais e + = são sinais operacionais, enquanto n + m é uma expressão. Na seção anterior do livro, nós aprendemos sobre a necessidade de apresentar dados de diferentes tipos. Aqui nós entremos relações possíveis entre esses dados (metros quadrados ainda não pode ser
adicionado a maçã). Em MQL4, existem algumas limitações naturais e as regras de utilização de operações em expressões. As noções de 'Operando', 'Operação', 'Operação Symbol "e" Expressão " Operando é uma constante, uma variável, um componente ou uma matriz valor retornado por uma função (o termo é considerado em função de a seção de funções, a de matriz - na seção de Arrays; neste estágio atual de aprendizagem, é suficiente para compreender como operandos constantes e variáveis já estudadas antes). A operação é feita mediante uma acção operandos. Operação símbolo é um estilo de caracteres ou um grupo de caracteres que forma a executar uma operação. Expressão é uma seqüência de símbolos operandos e funcionamento; é gravar um programa, o valor calculado de que é caracterizada por um tipo de dados. Tipos de Operações Existem os seguintes tipos de operações na MQL4: § § § § § § §
operações aritméticas; cessão operações; operações relacionais; Booleano (lógico) operações; bitwise operações; vírgula operação; chamada de função.
As operações são utilizadas em operadores (ver Operators). Só na sua utilização operadores faz sentido e é realizado em um programa. A possibilidade de utilizar uma operação é determinada pelas propriedades dos operadores (no caso da operadora propriedades permitem que você utilize esta operação específica, você pode usá-lo, caso contrário, você devia ' Não utilizar esta operação). É proibido o uso operações fora operadores. As operações aritméticas Os seguintes símbolos pertencem a operações aritméticas símbolos: Símbolo
Operação
Exemplo
Analógico
+
Além dos valores
x+2
--
Subtração de valores ou de assinar mudança
x - 3, y = - y
*
Multiplicação de valores
3*x
/
Quociente da divisão
x/5
%
Resíduo de divisão
minutos = tempo% 60
Além de 1 para o valor da variável
y++
y=y+1
1 a partir da subtração do valor da variável
y --
y=y-1
++ --
Cessão de Operações Os seguintes símbolos pertencem a cessão operações símbolos: Símbolo =
Operação
Exemplo
Analógico
Cessão do valor para a variável x y
уx=
+=
Aumento da variável x por y
у+=x
y=y+x
-=
Redução da variável y por x
y -= x
y=y-x
*=
Multiplicação da variável y por x
y *= x
y=x*y
/=
Divisão da variável y por x
y/x=
y=y/x
%=
Resíduo da divisão da variável y por x
y = x%
y = y% x
Operações relacionais Os seguintes símbolos pertencem a operações relacionais símbolos: Símbolo
Operação
Exemplo
==
Verdade, se x é igual a y
x == y
!=
Verdade, se x não é igual a y
x! y =
<
Verdade, se x for menor que y
x> y
>
Verdade, é mais do que se x y
x> y
<=
Verdade, se x for igual ou inferior a y
x <= y
>=
Verdade, se x for igual ou superior a y
x> y =
Booleanos (lógicos) Operações Os seguintes símbolos pertencem a operações booleanas símbolos: Símbolo !
Operação
Exemplo
Declarações
NÃO (lógico negação)
!х
TRUE (1), se o valor do operando é FALSE (0); FALSE (0), se o valor do operando não é FALSE (0).
||
OU (disjunção lógico)
x <5 | | x> 7 TRUE (1), se houver algum valor dos valores é verdade
&&
E (conjunção lógica)
x == 3 & & y TRUE (1), se todos os valores são verdadeiras <5
As operações bitwise Bitwise operações só podem ser realizados com inteiros. As seguintes operações pertencem a bitwise operações:
One's complemento do valor da variável. O valor da expressão contém 1 em todos os lugares, em que os valores da variável conter 0, e que ele contém 0 em todos os lugares, em que os valores da variável conter 1. b = n ~; A representação binária de x por y lugares é deslocada para a direita. Este direito é lógico turno, significa que todos os lugares esvaziados para a esquerda será preenchido com zeros. x = x>> y; A representação binária de x por y lugares é deslocada para a esquerda; esvaziou os lugares para a esquerda será preenchido com zeros. x = x <
para uma espécie de elite. No entanto, codificação não é realmente difícil em tudo, você só precisa fazer cabeça ou da cauda alguns intensions. Para ter a certeza que isto é realmente assim, vamos considerar alguns exemplos.
Problema 1. John tem 2 lápis, lápis Pete tem 3. Quantos lápis fazer estes meninos têm?:) Solução. Vamos denotar o número de John's lápis e uma variável como o número de Pete's lápis como variável B, enquanto que o resultado será denominado C. A resposta será: С = А + В Na seção denominada Tipos de dados, foram considerados os métodos de declaração variável. Lápis estão as coisas, ou seja, é algo que pode existir basicamente como uma parte (por exemplo, pode haver uma metade de um lápis). Assim, iremos considerar como lápis variáveis reais, ou seja, as variáveis de dupla natureza. Assim, podemos código a solução, por exemplo, da seguinte forma: Um duplo = 2,0; / / O número de lápis John's duplo B = 3,0; / / O número de Pete's lápis dupla C = A + B; / / Número Neste caso, operação "+" aplicada a adição dos valores das variáveis é um tipo bastante ilustrativo. Digite o valor da expressão: A + B Será o tipo das variáveis que são componentes da expressão. No nosso caso, este será o dobro tipo. Iremos buscar a resposta semelhante para a diferença entre os valores (Quantos lápis faz mais do que Pete tem João?): Um duplo = 2,0; / / O número de lápis John's duplo B = 3,0; / / O número de Pete's lápis dupla C = B - A; / / A diferença entre dois números reais Outras operações aritméticas são usados de forma semelhante: duplos um * C = B; / / Multiplicação de dois números reais dupla C = B / A; / / Divisão de dois números reais Cálculos similares podem ser realizadas com números inteiros, também.
Problema 2. Os alunos vão para a lousa e resposta em classe. John fui 2 vezes, Pete passou 3 vezes.Quantas vezes os meninos vão para o quadro negro, no total? Solução. Vamos denotar John's passagens como variável X, Pete's passagens como variável Y, o resultado - como Z. Neste exemplo, nós temos que usar as variáveis do tipo int, uma vez que consideramos que são eventos inteiro pela sua natureza (não pode ir para a lousa 0,5 vezes ou 1,5 vezes; a resposta na lousa pode ser bom ou ruim, mas nós és apenas interessado em que o número destas respostas ou passagens).
A solução deste problema pode ser escrita como: int X = 2; / / Número de passagens John's int Y = 3; / / Número de passagens Pete's int Z = X + Y; / / Número No caso do cálculo da diferença entre, de produto ou quociente de inteiros, a operação "-" é semelhante ao utilizado na forma simples: int int int int int
X Y Z Y Z
= = = = =
2; / / 3; / / Y - X; Z * X; Y / X;
Integer Integer / / Diferença entre os dois inteiros / / Produto de dois inteiros / / quociente de dois inteiros
A situação é um pouco diferente com as variáveis do tipo string: Problema 3. Em um canto da casa, há um supermercado chamado "Arctic". Num outro canto da mesma casa, há um estabelecimento chamado "Cabeleireiros Saloon". O que está escrito sobre a casa? Solução. Em MQL4, você está autorizado a acrescentar em conjunto os valores da seqüência constantes e variáveis. Se acrescentarmos juntos variáveis do tipo string, strings são adicionadas simplesmente um por um, na seqüência eles são mencionados na expressão. É fácil de código de um programa que seria necessário dar-nos a resposta: W1 = string "Arctic"; / / Seqüência 1 W2 = string "Cabeleireiros Saloon"; / / seqüência 2 string Ans = W1 + W2; / / Soma de cordas O valor da variável Ans será a seqüência que aparece da seguinte forma: ArcticHairdressing Saloon Nós obtivemos uma não-muito-para-olhar-no, mas absolutamente correcta formada valor do tipo string. Evidentemente, devemos considerar as lacunas e outras pontuações em nossas práticas de codificação desses problemas. Quaisquer outras operações aritméticas com variáveis do tipo string são proibidos: string Ans = W1 - W2; / / Não permitido string Ans = W1 * W2; / / Não permitido string Ans = W1 / W2; / / Não permitido
Typecasting Typecasting está modificando (mapeamento) dos tipos dos valores de um operando ou uma expressão. Antes da execução das operações (todas as operações, mas cessão), são alteradas para um tipo da mais alta prioridade, que antes da realização da cessão operações forem modificados para o tipo de alvo. Vamos considerar alguns problemas que lidam com typecasting.
Problema 4. John tem 2 lápis, enquanto Pete passou 3 vezes para o quadro negro. Quantos no total? No que diz respeito à lógica formal está em causa, os maus-posedness do problema é óbvia. É óbvio que eventos não podem ser adicionados, juntamente com as coisas, ele está errado. Problema 5. Em um canto da casa, há um supermercado chamado "Arctic", enquanto que John tem 2 lápis.:) Com o mesmo grau de desespero (na medida do normal raciocínio está em causa), podemos perguntar o seguinte: 1. Quantos no total?, Ou 2. O que está escrito na casa? Se você quiser resolver os dois problemas acima corretamente no MQL4, você deve referir-se typecasting regras. Primeiro, temos que conversar sobre a forma como diferentes tipos de variáveis estão representados na memória do computador. Tipos de dados, tais como int, bool, cor, datetime e duplas, pertencem ao tipo de dados numéricos. A representação interna de constantes e variáveis de int, duplos, bool, cor e tipo datetime é um número. As variáveis de int, bool, cores e tipos datetimeestão representados na memória do computador como números inteiros, enquanto que as variáveis de dupla natureza são representados como números de precisão dupla com um ponto flutuante, ou seja, números reais. O valor de constantes e variáveis do tipo string é um conjunto de caracteres (Fig. 16). Os valores de int, bool, cores e tipos datetime estão representados na memória do computador como números inteiros. Os valores do tipo dupla estão representados na memória do computador como números reais. Os valores do tipo string são representados na memória do computador como uma seqüência de caracteres. Os valores de int, bool, cor, datetime e tipos são o dobro dos valoresnuméricos tipo. Os valores do tipo string são os valores do tipo de caracteres.
Fig. 16. Representação de diferentes tipos de dados na memória do computador.
Nós mencionado acima, que os valores das variáveis de int, bool, cores e tipos datetime estão representados na memória do computador como números inteiros, enquanto os da dupla tipo - como números reais. Portanto, se queremos conhecer o modelo de uma expressão que consiste de variáveis de diferentes tipos, só podemos escolher entre três tipos de dados: int, duplos ebarbante. Os valores de bool, cores e tipos datetime irá revelar-se em uma expressão da mesma forma que os valores do tipoint. Então, que tipo será o valor de uma expressão composta por operandos de diferentes tipos? Em MQL4, o Estado de typecasting implícita é aceite: §
§
§
se a expressão contém operandos de diferentes tipos, o tipo de manifestação será transformado no tipo que tenham a mais alta prioridade; o tipo int, bool, cor e têm igual datetime prioridades, enquanto que a dupla tipo tem uma prioridade maior, e tem o tipo string a mais alta prioridade; se o tipo de expressão, à direita da operação de cessão sinal não coincide com o tipo da variável à esquerda da operação de cessão sinal, o valor dessa expressão é vazado como o tipo da variável à esquerda do cessão operação sinal; isso é chamado de "meta-modelo vazado '; é proibido lançar os valores do tipo string para qualquer outro tipo de alvo.
Bem, vamos voltar ao Problema 4. Pode haver duas soluções para ela. Solução 4.1. Cálculo do resultado do tipo int: Um duplo = 2,0; / / O número de lápis John's int Y = 3; / / O número de passagens Pete's int F = A + Y; / / Número Primeiro de tudo, precisamos de saber o valor da expressão desde seus operandos são de tipos diferentes. Na expressão: A + Y, operandos de dois tipos de dados são utilizadas: А - dupla tipo, Y - tipo int. Em conformidade com a regra implícita de typecasting, o valor desta expressão será um número de dupla natureza. Obs: Estamos a falar só sobre o tipo de expressão A + Y, mas não sobre o tipo de variável F que é para a esquerda da operação de cessão assinar. O valor dessa expressão é verdadeiro número 5,0. Para lançar o tipo de expressão A + Y, é aplicada a primeira parte da regra implícita typecasting. Após o cálculo da expressão A + Y, a cessão operação é executada. Neste caso, os tipos desencontro, também: o tipo de expressão A + Y é duplo, enquanto que o tipo de variável F é int. Durante a execução da operação de cessão: Primeiro, o tipo de expressão A + Y é casted como int (de acordo com a regra de cálculo inteira) e 5 torna-se inteiro, em seguida, esse resultado torna-se o valor da variável inteira F. Os cálculos foram realizado de acordo com a segunda parte da regra implícita typecasting - 'metamodelo vazado'. O resultado final dos cálculos e manipulações é a seguinte: O valor da variável inteira F é inteiro 5. Solução 4.2. Situação semelhante ocorre, se tentarmos ter um resultado como um valor de dupla natureza: Um duplo = 2,0; / / O número de lápis John's int Y = 3; / / O número de passagens Pete's dupla F = A + Y; / / Número
Esta situação difere do anterior por uma meta que o tipo de variável F (à esquerda da operação de cessão sinal), no nosso caso, é dupla tipo, coincide com o tipo (duplo) da expressão A + Y, de modo não temos nenhum tipo de meta-expressos aqui. O resultado dos cálculos (o valor da variável tipo duplo-F) é real número 5,0. Vamos agora encontrar uma solução para o Problema 5. Sem perguntas que poderão surgir na inicialização de variáveis: W1 = string "Arctic"; / / Seqüência 1 Um duplo = 2; / / O número de lápis John's Solução 5.1. Uma possível solução para este problema: W1 = string "Arctic"; / / Seqüência 1 Um duplo = 2; / / Número de John's lápis Soma = string W1 + A; / / Implícitas transformação para a direita Aqui, na parte direita, acrescentamos juntos os valores de duas variáveis: o único tipo de corda, eo outro um - de dupla escreva.De acordo com a regra implícita de typecasting, o valor da variável A primeira vai ser fundido com o tipo corda (uma vez que este tipo é de uma prioridade mais elevada), e em seguida a um tipo de valores serão somados (concatenação). O tipo de o valor resultante para a direita da operação de cessão sinal será seqüência. Na fase seguinte, este valor será atribuído à variávelstring Soma. Como resultado, o valor da variável Soma será o seguinte texto: Arctic2.00000000 Solução 5,2. Esta solução é errada: W1 = string "Arctic"; / / Seqüência 1 Um duplo = 2; / / Número de John's lápis Soma = dupla W1 + A; / / Isto é inadmissível Neste caso, vamos quebrar uma proibição de meta-tipo para o elenco de valores tipo string. O tipo do valor de expressão W1 + A, como na solução anterior, é seqüência. Quando a cessão operação é executada, a meta-tipo elenco deve ser realizada.Contudo, de acordo com a regra, a seqüência-alvo tipo expressos para os tipos de menor prioridade é proibida. Este é um erro que será detectado pelo MetaEditor a criação do programa (em elaboração). Geralmente, as regras contidas nesta secção são claros e simples: Se você calcular quaisquer valores, é preciso lançar todos os tipos diferentes de um tipo de prioridade máxima. Typecasting com rebaixada prioridade é permitida apenas para valores numéricos, que strings não podem ser transformados em números. Características dos cálculos Integer Inteiros são conhecidos como os números sem uma parte fracionária. Se você adicionar ou subtrair-lheslos juntos, você irá obter um resultado intuitivo. Por exemplo, se: int X = 2; / / Primeira variável int int Y = 3; / / segunda variável int e: int Z = X + Y; / / Adição operação, não há qualquer problema para calcular o valor da variável Z: 2 + 3 = 5 Da mesma forma, se você executar uma operação multiplicação:
int Z = X * Y; / / Multiplicação operação, o resultado é altamente previsível: 2 * 3 = 6 Mas o que resulta é que vamos, se o nosso programa tem de executar uma operação divisão? int Z = X / Y; / / Divisão operação É fácil de escrever 2 / 3. No entanto, não é um número inteiro. Então, qual será o valor da expressão X / Y e Z variável?
A regra de cálculo inteiro consiste em que a parte fracionária semper é descartado. No exemplo acima, a expressão do direito à igualdade sinal contém apenas números inteiros, ou seja, não typecasting tem lugar, no presente caso. E isto significa que o tipo de expressão X / Y é int. Portanto, o resultado de encontrar o valor inteiro da expressão X / Y (= 2 / 3) é 0 (zero). Este valor (zero) será atribuído a variável Z no final. Paralelamente, outros valores das variáveis X e Y irão produzir outros resultados. Por exemplo, se: int X = 7; / / O valor de uma variável int int Y = 3; / / O valor de uma variável int int Z = X / Y; / / Divisão operação, então o valor de 7 / 3 para a expressão X / Y e Z variável é igual a 2 (dois). Ordem das Operações A regra consiste em calcular o seguinte: O valor de uma expressão é calculada de acordo com as prioridades das operações aritméticas e da esquerda para a direita, cada resultado intermediário sendo calculado de acordo com as regras typecasting. Vamos considerar o cálculo para que uma expressão no seguinte exemplo: Y = 2,0 * (3 * X / Z - N) + D; / / exemplar expressão A expressão à direita do sinal da igualdade consiste em duas summands: 2,0 * (3 * X / Z - N) e D. O summand 2,0 * (3 * X / Z - N) é constituída por dois factores, a saber: 2 e (3 * X / Z - N). A expressão entre parênteses, 3 * X / Z - N, por sua vez, consiste de dois summands, o summand 3 * X / Z constituído por três elementos, a saber: 3, X e Z. A fim de calcular a expressão do direito à igualdade de assinar, vamos, em primeiro lugar, calcular o valor da expressão 3 * X / Z. Esta expressão contém duas operações (multiplicação e divisão) do mesmo nível, por isso vamos calcular esta expressão da esquerda para a direita. Primeiro, vamos calcular o valor da expressão 3 * X, a este tipo de expressão a ser o mesmo que o tipo da variável X. Então, vamos calcular o valor da expressão 3 * X / Z, o seu tipo a ser calculado de acordo com a typecasting regra. Depois disso, o programa irá calcular o valor eo tipo da expressão 3 * X / Z - N, então - da expressão 2,0 * (3 * X / Z - N), sendo a última - de toda a expressão 2,0 * (3 * X / Z - N) + D. Como é fácil de ver, o fim das operações em um programa é semelhante ao que ocorreu em matemática. No entanto, a antiga em um calculam difere dos tipos de valores nos resultados
intermédios, que exerce uma influência significativa sobre o resultado final dos cálculos. Particularmente (ao contrário das regras aceites pela matemática), a fim de operandos em uma expressão é muito importante. Para demonstrar isto, vamos considerar um pequeno exemplo. Problema 6.Calculate os valores de expressões А / В С * e * А С / В para inteiros А, В, e С. O resultado do cálculo é intuitivamente que se espera que seja o mesmo, em ambos os casos. No entanto, esta afirmação é verdadeira apenas para números reais. Se formos calcular os valores de expressões compostas de operandos do tipo int,devemos considerar a semper resultados intermédios. Nesse caso, a seqüência dos operandos é de fundamental importância: int int int int int
A = 3; / / Valor do tipo B = 5; / / Valor do tipo C = 6; / / Valor do tipo = A Res_1 / B * C; / / Res_2 = A * C / B; / /
int int int Result 0 (zero) Resultado 3 (três)
Vamos seguir o processo de cálculo da expressão A / B * C: 1. Abertura (da esquerda para a direita), o valor da expressão A / B será calculado. De acordo com as regras acima, o valor da expressão (3 / 5) é inteiro 0 (zero). 2. Cálculo da expressão С * 0 (zero multiplicado por С). O resultado é inteiro 0 (zero). 3. Geral resultado (o valor da variável Res_1) é inteiro 0 (zero). Agora vamos seguir os desenvolvimentos do cálculo da expressão «A * C / B. 1. Cálculo de A * C. O valor dessa expressão é integer 18 (3 * 6 = 18). 2. Cálculo da expressão 18 / B. A resposta é óbvia: a parte fracionária após ter sido descartada, (18 / 5) é inteiro 3 (três). 3. Geral resultado (o valor da variável Res_2) é inteiro 3 (três). No exemplo acima, nós consideramos apenas um pequeno fragmento código, em que os valores das variáveis do tipo int são calculados. Se vamos substituir essas variáveis constantes com os mesmos valores, o resultado final será o mesmo. Ao calcular expressões que contenham números inteiros, você deve dar uma maior atenção ao conteúdo do seu programa linhas. Caso contrário, poderá ocorrer um erro no código, o que seria muito difícil de encontrar e corrigir mais tarde (principalmente nos grandes programas). Tais problemas não ocorrem em cálculos usando números reais. Entretanto, se você utilizar operandos com diferentes tipos em uma expressão complexa, o resultado final maio dependem de uma aleatóriamente plenamente fragmentar formado contendo divisão de inteiros. Na seção de Operadores, o prazo e propriedades gerais dos operadores são consideradas, enquanto que as propriedades específicas de cada operadora são descritos no capítulo chamado Operadores.
Operadores O prazo de operador Um dos conceitos-chave de qualquer linguagem de programação é a expressão de "operador". Codificação parece ser impossível para a pessoa que não tenha aprendido completamente
esse prazo. Quanto mais cedo e mais propriamente um programador aprende aquilo que os operadores são e como eles são aplicados em um programa, o programador começa mais cedo este escrever seus próprios programas. Operador é uma parte de um programa, é uma frase de uma linguagem algorítmica, que prescreve um determinado método de conversão de dados. Qualquer programa contém operadores. A analogia mais próxima ao "operador" é uma frase. Assim como normal frases compor o texto de uma história ou de uma novela, por isso os operadores compor um programa.
Propriedades de Operadores Existem dois tipos de propriedades de operadores - uma propriedade comum e propriedades específicas dos diferentes operadores. Propriedade comum dos operadores Todos os operadores têm uma propriedade comum - todos eles são executados. Podemos dizer que o operador é uma instrução que contém o manual de operações (a descrição de uma ordem). Para um computador, executando um programa em execução no que significa (consecutiva passagem de um operador para outro) cumprindo as ordens (receitas, instruções) contidas nos operadores. Operador, como tal, é apenas um registro, uma determinada seqüência de caracteres. Operador não tem qualquer alavancas, fios ou células de memória. Esta é a razão pela qual, quando um computador está executando um programa e nada acontece nas operadoras, como tal, eles continuarão a ficar no programa como composto pelo programador. No entanto, o computador que tem todas essas células de memória e de experiências entre elas todas as transformações no interior. Se o seu PC tem executado algumas transformações de dados de acordo com as instruções contidas em uma operadora, você diria: o operador tenha sido executada. Propriedades específicas dos operadores Existem vários tipos de operadores. Operadores de cada tipo têm as suas propriedades específicas. Por exemplo, a propriedade de um operador atribuição é a sua capacidade de atribuir um certo valor à variável concedido; lacete a propriedade de um operador está suas múltiplas execuções, etc propriedades específicas das empresas são consideradas em todos os detalhes nas correspondentes secções do capítulo Operadores neste livro. Vamos apenas dizer aqui que todos os tipos de operadores têm as suas próprias propriedades que são típicas apenas para seu tipo e não são repetidas em qualquer outro tipo.
Tipos de Operadores Existem dois tipos de operadores: os operadores simples e compostos. Simples Operadores No MQL4 operadores simples terminar com o caracter ";" (ponto e vírgula). Usando este separador, o PC pode detectar um operador onde termina um e começa outro. Caractere ";" (ponto e vírgula) é tão
necessária em um programa como caractere "."(ponto final), é necessário em um texto normal para separar frases. Um operador pode ter várias linhas. Vários operadores podem ser colocados em uma linha.
Cada operador simples acaba com carácter ";" (ponto e vírgula). Exemplos simples de operadores: Day_Next = TimeDayOfWeek (Mas_Big [n] [0] + 60); / / operador Simples Go_My_Function_ind (); / / operador Simples a = 3; b = a * x + n; i + +; / / Vários operadores em uma linha Print ( "Dia =", TimeDay (Mas_Big [s] [0]), / / Um operador .. "Hora =", TimeHour (Mas_Big [s] [0]), / / está localizada .. "Minuto =", TimeMinute (Mas_Big [s] [0]), / / em vários .. "Mas_Big [s] [0] =", Mas_Big [s] [0], / / linhas "Mas_Big [s] [1] =", Mas_Big [s] [1]); Operadores compostos (Compostos) Um operador consiste em diversos compostos mais simples separados pelo caractere ";" e está incluído no aparelho. A fim de ser capaz de utilizar vários operadores, onde apenas um se espera que seja localizada, programadores utilizam um operador compostos (também eles chamam-lhe "bloqueio" ou "bloco de código"). A lista de operadores em um composto é separado por chavetas . A presença de uma marca o final Esquadro fechamento de um composto operador. Um exemplar da utilização de um composto de um operador condicional. Começa com o operador condicional if (expressão) seguido de um composto. Compostos O operador contém uma lista de operadores executável.
Fig. 17. Composto operador. O corpo de um composto operador está incluida no aparelho. Todos os compostos operador termina com um fecho parêntese. Exemplos de compostos operadores:
/ / Exemplo de operador mudar switch (ii) / / Operador switch (expressão) (/ / Abertura Esquadro case 1: Buf_1 [Pok - f + i] = Prognoz; break; / / Nested operadores (operador corpo) case 2: Buf_2 [Pok - f + i] = Prognoz; break; / / Nested operadores (operador corpo) case 3: Buf_3 [Pok - f + i] = Prognoz; break; / / Nested operadores (operador corpo) ) / / Fechando parêntese, .. / / .. mostra onde o operador termina compostos //------------------------------------------------ ---------------------------------------/ / Exemplar uso de loop for (tt = 1; tt <= Kol_Point [7]; tt + +) / / Operator (expressões) (/ / Abertura Esquadro Numb Numb = + Y_raz [tt] * X_raz [ii] [tt]; / / Nested operador (operador corpo) ) / / Fechando parêntese .. / / .. mostra onde o operador termina compostos //------------------------------------------------ ---------------------------------------/ / Exemplo do operador condicional se if (TimeDay (Mas_Big [f] [0])! = 6 ) / / If (expressão) (/ / Abertura Esquadro Sred = (Nabor_Koef [ii] [vv] [2] + NBh) * Point; / / Nested operadores (operador corpo) Ind = Nabor_Koef [ii] [vv] [0] + f; / / Nested operadores (operador corpo) Print ( "Ind =", Ind); / / Nested operadores (operador corpo) ) / / Fechando parêntese .. / / .. Mostra onde termina o composto operador
O corpo de um composto semper é vedado em suportes e pode consistir em zero, um ou vários operadores. Exemplos simples de operadores: //------------------------------------------------ --------------------------------/ / Exemplo do operador para for (n = 1; n <= Numb; n + +) / / for (expressões) Mas [n] = Const_1 + n * Pi; / / Nested operador (operador corpo) //------------------------------------------------ --------------------------------/ / Exemplo do operador condicional se if (Tabela> Chair) / / if (expressão) Norma = true; / / primeiro operador (suboperator 1) else / / Else-condição Norma = false; / / segundo operador (suboperator 2) //------------------------------------------------ ---------------------------------
Vários operadores simples podem ser combinadas em um composto operador, sem quaisquer estritos necessidade.
Esta é uma situação rara, mas absolutamente admissível construção. Neste caso, os operadores estão fechados no aparelho chamado de "um bloco de operadores". Esta utilização é totalmente aceitável. Este é o programador que decide se juntar aos operadores de correias ou não, apenas por uma questão de conveniência código representação. Um exemplar bloco de operadores: (/ / Abertura Esquadro Day_Next = TimeDayOfWeek (Mas_Big [n] [0] + 60); / / operador Simples b = a * x + n; / / operador Simples ) / / Fechando parêntese .. Requisitos para Operadores Operadores deve ser escrito no texto de um programa de acordo com o formato regras (como eles devem ser representados em um código). Nenhum operador pode ser composto para além dessas regras. Se o programa contém um operador composto contra o formato regras, MetaEditor irá produzir uma mensagem de erro na compilação. Isto significa que o programa contendo o operador não pode ser mal utilizado. Você deve entender a frase "operador formato" como um conjunto de regras formato típico de um determinado tipo de operador. Cada tipo de operador tem o seu próprio formato. Operador de formatos são consideradas em todos os detalhes em pontos correspondentes do capítulo Operadoras deste livro.
Ordem dos operadores execução Uma característica muito importante de qualquer programa é da ordem de execução operadores nele. Os operadores não pode ser executado por qualquer razão ou por exceção. Em MQL4, com a seguinte ordem de execução seja aceite os operadores: Os operadores são executados na ordem em que eles ocorrem no programa. A direcção de operadores execução é aceite como da esquerda para a direita e para baixo. Isto significa que, simultaneamente simples e compostos operadores são executados apenas um por um (como as linhas nos poemas: em primeiro lugar, podemos ler a primeira linha, então a próxima mais baixa, então a próxima, e assim por diante). Se existem vários operadores em uma linha, devem ser executados consecutivamente, um por um, da esquerda para a direita, em seguida, os operadores são executados na linha inferior mais próximo na mesma ordem. Operadores de compor um operador compostos são executados da mesma forma: qualquer operadora do bloco de código começa a ser executado apenas depois de o anterior ter sido executado. Escrever e Execução de Operadores: Exemplos O texto de um programa contendo os operadores não é dissimilar no aspecto normal de um texto ou uma notação matemática.No entanto, essa semelhança é apenas formal. Normal Um observa o texto permite a ser colocados em qualquer ordem, considerando que é necessário manter um fim bem definidos em um programa. Como exemplo, vejamos como funciona uma missão operador. Iremos resolver uma equação linear simples e comparar o sistema de representação de alguns cálculos matemáticos em um texto normal e um programa em código, nos operadores.
Problema 7. Temos um sistema de equação: Y=5 Y-X=2 O valor numérico da variável X está a ser encontrado. Solução 1. Um texto normal numa folha de papel: 1. 5 - Х = 2 2. Х = 5 - 2 3. Х = 3 Solução 2. Um texto em um programa: Y = 5; / / Linha 1 Y = X - 2; / / Linha 2 Tanto no primeiro como no segundo soluções, as notas (linhas) ter completado um conteúdo. No entanto, as linhas na Solução 1 não pode ser usado em um programa como estão, porque o seu aspecto não está em conformidade com a cessão operador formato. As notas dadas na Solução 1 representam cerca dependências em formato papel. Eles só podem ser utilizados para informar os programadores sobre as relações entre as variáveis. Operadores em um programa são atribuídos a outros fins - a máquina elas informar que operações e em que ordem ele deve executar. Todos os operadores, sem quaisquer excepções precisas instruções que representam ambiguidades não permitem. Solução 2 em ambos os operadores estão a cessão operadores. Qualquer cessão operador da máquina dá a seguinte ordem, literalmente: Calcule o valor da expressão à direita do sinal da igualdade e atribua o valor obtido para a variável à esquerda do sinal da igualdade. Por esta razão, nada mais, mas pode ser variável, localizado à esquerda da igualdade em assinar uma cessão operador. Por exemplo, um registro de 5 - 2 = Х utilizada na primeira solução contém um erro, porque o conjunto de caracteres 5 - Х não é uma variável. Esta é a razão pela qual não existe qualquer célula de memória para colocar o valor numérico da expressão calculada para o lado direito do sinal da igualdade. Vamos seguir o computador durante a execução dos operadores da segunda solução. 1. Passando sobre o operador (linha 1). Y = 5; / / Linha 1 2. Referenciar para o lado direito do operador (a parte direita está localizado entre a igualdade ea assinar o ponto e vírgula). 3. O computador detectou que o lado direito do operador contém um valor numérico. 4. A gravação do valor numérico (5) na célula de memória variável Y. 5. Passando sobre o próximo operador (linha 2).
Y = X - 2; / / Linha 2 6. Referenciar para o lado direito do operador. 7. O computador detectou que o lado direito do operador contém uma expressão. 8. O cálculo do valor numérico do lado direito do operador (5 - 2). 9. A gravação do valor numérico (3) na memória do celular Х variável. Executam os passos 1-4 até que o computador for execução da primeira operadora (linha 1). Executar as etapas 5-9 até que o computador for execução do segundo operador (linha 2). No fim de um código funcional programa, o programador deve perceber bem o quê e em que ordem serão executadas neste programa. Particularmente, nem todos os cálculos matemáticos irão ser colocadas em um programa, às vezes é necessário preparar a pré-operadores. Por exemplo, muitos cálculos intermédios são efectuados quando resolvendo problemas matemáticos. Eles podem ajudar um matemático para encontrar uma boa solução, mas revelar-se inúteis do ponto de vista da programação. Apenas significativo soluções podem ser incluídos em um programa, como por exemplo: valores originais das variáveis ou fórmulas para calcular os valores das demais variáveis. No exemplo anterior, o primeiro operador suporta informações sobre o valor numérico da variável Y, e com o segundo operador fornece a fórmula para calcular o valor da variável X estamos interessados polegadas Qualquer programa operacional contém expressões de um familiar vista, mas você também pode encontrar tais expressões que você será capaz de entender apenas se você classificaria-los como possíveis operadores em seu programa. Por exemplo, o registro abaixo X = X + 1; / / Exemplo de um contador parece estar errado do ponto de vista da lógica matemática eo bom senso. No entanto, é perfeitamente aceitável se você considerar isso como um operador (por sinal, é que este operador é amplamente utilizado na codificação). Neste operador, calculamos um novo valor da variável X: quando executa a tarefa operador (ou seja, o cálculo do valor da parte direita do operador), o computador refere-se a célula de memória contendo o valor numérico da variável X (por exemplo , Ele acaba por ser igual a 3, no momento de se referir a ela), calcula a expressão, na parte direita da cessão operador (3 + 1), e escreve o valor obtido (4) na memória do celular previstas variável X. Execução de atribuição deste operador nos resultados que a variável X recebe o novo valor (4). A máquina irá armazenar esse valor da variável X até que a variável X ocorre na parte esquerda da igualdade assinar em outro operador atribuição. Neste caso, o novo valor dessa variável será calculado e armazenado até a próxima possível mudança.
unções O prazo de função O mais importante avanço tecnológico em engenharia de computador é a possibilidade de criação e armazenamento de código separado fragmentos que descrevem as regras de processamento de dados para resolver um problema ou uma pequena tarefa.Tal possibilidade existe em MQL4, também.
Função é um chamado, uma parte específica do programa que descreve o método de conversão de dados. Falando em funções, iremos considerar dois aspectos: descrição e função chamada de função. Descrição é uma função específica denominada parte de um programa destinado à execução. Função chamada (função referência) é um recorde, o que resulta na execução de execução de uma função. No nosso quotidiano, podemos encontrar muitos análogos da função. Vejamos, por exemplo, o sistema de travagem de um carro. O mecanismo de accionamento que executa corretamente travagem, bem como a ideia implementada pelo engenheiro, é análogo ao de uma função, enquanto o pedal de freio é o análogo da função chamada. O motorista pressiona o pedal para baixo, e os mecanismos de atuação e realizar algumas ações - parar o carro. Da mesma forma, se uma chamada de função ocorre em um programa, em seguida, a função de mesmo nome será chamado e executado, ou seja, uma determinada seqüência de cálculos ou outras acções serão executadas (por exemplo, exibindo uma mensagem ou abrir uma encomenda, etc .). O sentimento geral é de uma função em um logicamente tendo concluído a parte do código fora do texto básico do programa, enquanto que somente a chamada para esta parte do código permanece no interior do texto básico do programa. Essa construção programa tem algumas vantagens inegáveis: § § §
primeiro, o programa texto composto de tal maneira é muito mais fácil ler; em segundo lugar, pode-se ver facilmente, e, se necessário, modificar o texto de uma função sem fazer nenhuma alteração no código base do programa; terceiro, uma função pode ser composto por um único arquivo e usá-lo em outros programas, que irão liberar o programador da necessidade de inserir o mesmo fragmentos do código em cada recém-criado programa.
Podemos dizer que a maior parte dos programas em código composto utilizando MQL4 está escrito na forma de funções. Essa abordagem se espalhou e agora é um padrão.
Composição de uma Função Assim, uma função pode ser descrita e ligou. Vamos considerar um exemplo. Suponhamos que temos um pequeno programa (Fig. 18) que considera o comprimento da hipotenusa usando dois outros lados do triângulo direito Pitagórica e Teorema. Neste programa, todos os cálculos estão localizadas em conjunto, os operadores são executados um por um, na ordem em que eles ocorrem no programa (de cima para baixo).
Fig. 18. O código de programa único pifagor.mq4.
Problema 8. Compor uma parte do código como um dado programa funcione. Seria razoável que se faça uma função utilizando as duas linhas que encontrar o valor pesquisa. O mesmo programa usando uma função é mostrado na fig. 19. Neste programa, uma parte dos cálculos é composta como uma função. A base contém um código de utilizador definido função chamada. A descrição da função definida pelo utilizador-se localiza fora (depois) o código básico.
Fig. 19. O código de um programa que contém a descrição da chamada e da função definida pelo usuário-gipo.mq4. Ambas as versões do programa vai dar o mesmo resultado. Contudo, o código é composto por um único módulo na primeira versão (Fig. 18), enquanto que na segunda versão (Fig. 19) uma parte dos cálculos é executado em uma função chamado a partir do texto base. Após a conclusão dos cálculos separados para a função, os cálculos no código principal será continuado. Para ter a função executada, temos que chamá-la (se referem a ele). Esta é a razão pela qual a função é praticamente representadas em duas partes: o próprio código de compor a função (função descritiva) e chamada de função usada para lançar a função (referindo-se à função). Se você não chamar a função, ele não será executada. Ao mesmo tempo, se você chamar uma função inexistente, isso vai resultar em nada (MetaEditior dará uma mensagem de erro se você tentar compilar esse programa em MQL4). Função Descrição A descrição de uma função básica é constituída por duas partes - função cabeçalho eo corpo função. O cabeçalho consiste de uma função do tipo de valor de retorno, nome e função da lista de parâmetros formais. A lista de parâmetros formais são fechados e colocados entre parênteses após o nome da função. O tipo do valor de retorno pode ser um dos tipos que já sabemos: int, duplos, bool, cor, datetime, ou string. Se a função não retorna nenhum valor, o seu tipo pode ser denotado como nulos ( "sem conteúdo, vazia") ou a qualquer outro tipo. O corpo de uma função está incluida no aparelho. O corpo pode conter função simples e / ou compostos operadores, bem como chamadas para outras funções. O valor devolvido pela função é dado no retorno de operador parentesis (). O tipo do valor devolvido utilizando operador retorno (), deve corresponder com o tipo de função especificado no cabeçalho da função. A descrição da função é terminada com um fecho parêntese.
Fig. 20. Função descrição. Descrição da função deve estar localizado em separado no programa, fora de quaisquer outras funções (ou seja, não dentro de uma função, mas fora dele). Função Chamada Função chamada representa o nome da função e transferido a lista de parâmetros. A lista de parâmetros é transferido dentro de parênteses. A chamada da função pode ser representado como um operador separado ou como parte de um operador.
Fig. 21. Função chamada (referência a uma função). Qualquer função chamada encontra-se dentro de outra função especificado (ou seja, não fora todas as outras funções, mas dentro de um deles). Tipos de função Existem três tipos de funções - funções especiais, norma (built-in e pré-definido) funções, e funções definidas pelo utilizador. Funções Especiais Em MQL4, existem 3 funções especiais no total. Eles têm nomes predefinidos: init (), start (), e deinit () que não podem ser utilizados nos nomes de quaisquer outras funções. O exame detalhado das funções especiais é dado no capítulo Funções Especiais. Estamos aqui apenas dizer que o código básico de um programa está localizado no interior destas funções (Fig. 18, 19). O recurso especial de funções especiais é o fato de que eles são chamados para execução pelo cliente terminal. Embora todas as funções especiais têm propriedades de funções em geral, elas não são habitualmente chamados a partir do programa caso este programa é o código corretamente. Funções Standard
MQL4 tem uma série de funções úteis que não precisam ser descritas quando codifica um programa. Por exemplo, computação raízes quadradas, imprimir mensagens no sistema de revista ou na tela - todas estas e muitas outras funções habituais são executadas de acordo com o algoritmo predefinido. O usuário não precisa de aprender o conteúdo de tais funções. Ele ou ela pode apenas ter a certeza de que todas as funções habituais são desenvolvidas por profissionais devidamente e de acordo com a melhor qualidade possível algoritmo. O recurso especial do padrão funções são as que não são descritos no texto do programa. As funções habituais são chamados no programa, do mesmo modo que quando se utilizam quaisquer outras funções (é uma prática comum). No nosso exemplo (Fig. 18, 19), são utilizadas duas funções habituais: MathSqrt () e Alert (). O ex-um é destinado para computação de raízes quadradas, enquanto a segunda é uma mensagem para um determinado texto fechado entre parênteses ao ecrã. As propriedades das funções habituais são considerados em mais detalhes na seção Standard Funções. Aqui vamos notar que estes registros representam o funcionamento normal chamadas, enquanto que nenhuma das descrições destas funções podem ser encontrados no programa. Norma funções também pode ser chamado built-in, ou funções previamente definidas. Você pode usar qualquer um desses termos. Funções Definidas Por Usuário Em alguns casos, programadores criar e utilizar as suas próprias funções. Chamamos essas funções funções definidas pelo utilizador. User-defined funções são utilizadas em ambos os programas funcionam com descrições e chamadas função. Tabela 1. Função descrição e função chamada utilizados em programas para diferentes tipos de funções. Tipo de função
Função Descrição
Função Chamada
Especial
Aplicáveis
Não aplicável (*)
Standard
Não aplicável
Aplicáveis
Definido pelo usuário
Aplicáveis
Aplicáveis
(*) Embora funções especiais podem ser chamados a partir de um programa tecnicamente, não é recomendável fazê-lo. Propriedades de Funções Função Execution A principal propriedade de todas as funções que é chamado a funções são executadas. Funções são executadas de acordo com os seus códigos. Passou parâmetros e retornar valor Quanto às informações recebidas e devolvidas, uma função é como uma calculadora padrão. Você pode digitar (usando o seu teclado) uma certa expressão que consiste em diversos valores entraram um por um, e você irá obter um valor como uma resposta. Uma função pode receber e processar um ou vários parâmetros do programa que tem chamado para a execução desta função, bem como a função irá terminar o seu funcionamento, pela devolução (transmissão, fornecendo) um parâmetro como uma resposta a esse programa.
Os parâmetros passados são especificados pelo juntando em parênteses após o nome da função a ser chamada. Os parâmetros passados estão normalmente separados por vírgulas. O número de parâmetros passados à função, não deve exceder 64. A função pode omitir também passaram a utilizar parâmetros. Neste caso, um vazio lista de parâmetros for especificado, ou seja, você só colocar um parêntese de abertura e um fechamento parênteses, imediatamente após o nome da função. O número, o tipo ea ordem dos parâmetros passados na chamada de função deve corresponder com os dos parâmetros formais especificados na descrição da função (a chamada para uma função que tem parâmetros predefinidos constitui uma isenção - verFunção Chamada e Função Descrição e ao Operador " regresso "). Se não coincidirem, MetaEditor lhe dará uma mensagem de erro. Constantes, variáveis, expressões e arrays podem ser utilizados como parâmetros passados. O valor de retorno é especificada no retorno do operador parênteses () (ver Função Descrição e ao Operador "regresso"). O tipo do valor devolvido utilizando operador retorno () deve corresponder com o tipo de função a que consta do cabeçalho da função .É também possível que uma função não retorna nenhum valor. Neste caso, nada é especificado no retorno do operador parênteses (). No nosso exemplo, os parâmetros são passados variáveis A e B (fig. 21), enquanto que o valor de retorno é variável c (Fig. 20).A exigência de adequação dos tipos de parâmetros passados e formal pode ser visto na fig. 22. O número, o tipo ea ordem dos parâmetros passados na chamada de função deve corresponder com os dos parâmetros formais especificados na descrição da função. Únicas variáveis que podem ser usadas no cabeçalho da função descrição formal como parâmetros.
Fig. 22. Partida do número, o tipo ea ordem dos parâmetros passados e formal. Únicas variáveis são utilizadas como parâmetros passados. Apenas variáveis, constantes e expressões podem ser utilizados como parâmetros passados.
Fig. 23. Partida do número, o tipo ea ordem dos parâmetros passados e formal. Uma constante, uma expressão, e variáveis do tipo correspondente são utilizados como parâmetros passados. Parâmetros formais Um ponto alto das funções é a utilização de parâmetros formais. Parâmetros formais são uma lista de variáveis especificadas no cabeçalho da função descrição. Nós mencionado anteriormente que uma função pode ser usada em diversos programas. No entanto, diferentes programas usam nomes diferentes para as variáveis. Se funções exigidas estrita correspondência nos nomes de variáveis (e, correspondentemente, em seu valor), não seria conveniente para programadores. Na verdade, você teria, então, para compor a cada novo programa desenvolvido nos nomes de variáveis que já havia sido utilizado em sua função anterior. No entanto, felizmente, as variáveis utilizadas dentro de funções não têm relações com as variáveis utilizadas em um programa. Deixe a Fig's referem. 20 e 21, mais uma vez. Convém notar que os nomes dos parâmetros passados (A e B são dadas dentro dos parênteses da função chamada) não coincidem com os nomes dos parâmetros (a, b) especificados na descrição da função.Observamos na seção Constantes e Variáveis MQL4 que é sensível a maiúsculas e minúsculas. Assim, os nomes e um A, B e bsão aqui considerados diferentes nomes de variáveis. No entanto, não existe um erro no presente código. As variáveis (parâmetros formais) utilizados na descrição da função não estão relacionadas com as variáveis utilizadas no código base do programa. Eles são apenas diferentes variáveis. Apenas variáveis, mas não constantes, podem ser especificados em função dos parâmetros formais como cabeçalho. Como funciona
§ § § § §
No programa, aí ocorre uma chamada de função, variáveis A e B serem especificados em suas parênteses. O programa chama a função de mesmo nome, que tem formal parâmetros a e b especificados em seu cabeçalho. O valor de uma variável é atribuído a uma variável. O valor da variável B é atribuído a variável b. O executável função executa cálculos utilizando os valores das variáveis a e b.
É permitida a utilização de nomes de parâmetros formais (que não coincidem com os nomes das variáveis usadas no programa).Neste exemplo, usamos os identificadores dos parâmetros formais a e b. No entanto, que poderíamos utilizar quaisquer outros, por exemplo, m e n, ou Kat_1 e Kat_2. Claro que, quando se escreve um programa, você deve especificar a função no
organismo dos cálculos que usam os nomes das variáveis que são dadas no cabeçalho. Uma vez que temos dado a e b, no cabeçalho, por isso temos que usar a função de a e b, não m e n. Em uma função, os cálculos são feitos que envolvem formal parâmetros a e b, mas não variáveis A e B. Em uma função, todas as acções podem ser admitidas na desempenham formal parâmetros a e b (incluindo as alterações nos valores dessas variáveis). Isto não tem qualquer efeito sobre as variáveis A e B. O valor de retorno é calculado em função do dado no retorno do operador parênteses (). O valor de uma variável, o resultado de uma expressão, ou de uma constante e pode ser utilizado como valor devolvido. No nosso caso, este é o valor da variável local c (variavel local é uma variável declarada dentro de uma função, se você sair da função, os valores de todas as variáveis locais serão perdidas; vamos ponderar mais detalhes sobre variáveis locais na seção Tipos de Variáveis). A função retorna para o programa o valor da variável local c (Fig. 19). Isso significa que esse valor passará a ser atribuído a variável C. Os cálculos adicionais no programa, se houver, pode ser realizada com as variáveis declaradas dentro da função chamada. No nosso caso, é função especial chamada função start () (que contém a linha de chamada do usuário-função definida), enquanto que as variáveis declarados dentro da chamada função são A, B e C. Assim, em função dos cálculos são realizados utilizando os parâmetros formais, o que nos permite criar funções arbitrárias usando nomes de variáveis, independentemente dos nomes dos valores efectivamente utilizados no programa. Exemplo: Standard Funções em um Programa Em primeiro lugar, vamos examinar o comportamento do programa apresentado na Fig. 18. Devemos notar que todo o código do programa está localizado no interior da função especial iniciar (). Na presente fase de formação, não iremos dedicar especial atenção a este (funções especiais e suas propriedades são consideradas em mais detalhes na seção Funções Especiais). Vamos acompanhar a execução do programa começa com a atribuição operador: int A = 3; / / Primeira cathetus 1. A parte direita da cessão contém o operador especificado constante, seu valor é 3. 2. O valor de 3 (o valor do lado direito) é atribuído a uma variável (que encontra à esquerda da igualdade em assinar a cessão operador). O controle é dada para a linha seguinte: int B = 4; / / Segunda cathetus 3. A parte direita da cessão contém o operador especificado constante, seu valor é 4. 4. O valor de 4 é atribuído a variável B. O programa vai para a execução da linha seguinte: int C_2 A * = A + B * B; / / S hum dos quadrados dos catheti 5. Cálculo da parte direita da cessão operador. O resultado do cálculo é o valor de 25 (os detalhes de como um programa refere-se a variáveis a ter os seus valores são considerados na seção Constantes e Variáveis, pelo que não estamos aqui agora particularizantes este ponto). 6. Atribuição do valor 25 a variável C_2.
A próxima linha representa uma atribuição operador, o direito da parte que contém um apelo para que a função padrão: int C = MathSqrt (C_2); / / Cálculo da hipotenusa O programa destina-se a executar a tarefa operador. Para isso, executa cálculos para a direita da igualdade primeiro sinal. 7. O programa pede para execução da norma MathSqrt função () (que calcula raízes quadradas). O valor da variável C_2 (no nosso caso, esse valor é igual a 25), será utilizado como parâmetro a repercussão. Note que não há descrição da função deste padrão, em qualquer parte do programa. As descrições das funções habituais não devem estar localizados em programas. No texto de um programa, você pode facilmente distinguir o padrão função chamada pela sua aparência: eles são destacadas em azul escuro com MetaEditor (programador pode escolher cores voluntariamente). 8. Os cálculos são feitos em função da norma MathSqrt (). 9. A função padrão MathSqrt () tenha cumprido os seus cálculos. Ela devolve o valor obtido. No nosso caso, é o valor de 5 (araiz quadrada de 25). O valor devolvido pela função é agora o conteúdo da gravação: MathSqrt (C_2) Esse registro pode ser considerada como uma especial, variável complexa, uma espécie de uma coisa, dentro da qual os cálculos são realizados. Após estes cálculos foram concluídas, a coisa tem um valor. O determinante aqui é o fato de que o valor devolvido pela função pode ser atribuído a uma outra variável considerada ou em alguma outra cálculos. 10. Neste caso, o nosso valor é o valor da parte direita da cessão operador. Em prosseguimento à execução da cessão operador, o programa irá atribuir o valor de 5 a variável C. 11. A linha seguinte contém referências ao operador que o padrão função Alert () (função chamada). Alerta ( "hipotenusa =", C); / / Mensagem na tela A norma função Alerta () abre uma caixa de diálogo onde os valores dos parâmetros passados são mostrados. Neste caso, a função tem tomado os dois valores passados como parâmetros: - O valor da string constante: hipotenusa = - O valor da variável inteira C: 5 Foi mencionado anteriormente que nem todas as funções devem retornar o valor (que é o resultado da execução da função). A norma função Alert () não retorna nenhum valor, uma vez que tem uma outra tarefa - deve apresentar o texto na tela, em especial uma janela. Como resultado da execução da norma função Alert (), na janela dessa função será exibida a seguinte linha: Hipotenusa = 5 12. O último operador neste programa completa o trabalho do grupo especial de função start (). retorno; / / Função saída operador O trabalho do programa está concluída neste momento.
Uma questão pode surgir: Como é que podemos saber qual função irá retornar o valor, e não aquilo? A resposta a esta pergunta é óbvia: a fim de encontrar descrições detalhadas das funções embutidas, você deve ler-se referência à documentação emMQL4.community, o site lançado pelo MetaQuotes Software Corp, ou o Arquivo de Ajuda MetaEditor. As propriedades de uma função são definidos por usuários especificados na sua descrição. User-se uma função definida retorna o valor ou não, depende de seu algoritmo (a decisão é feita pelo programador na fase de escrever o código do programa funcionar).
Exemplo: Funções Definidas Por Usuário em um Programa Vamos considerar o modo como as mesmas cálculos são feitos dentro do programa contendo uma função definida de usuário (fig. 19). Uma certa parte do código que poderia ser encontrada anteriormente em especial a função start (), não está disponível agora. Ela passa a ter a chamada para o utilizador-função definida. No entanto, a função especial start () é seguido pela descrição do usuáriofunção definida. As primeiras duas linhas, nas quais inteiro variáveis A e B tomam valores numéricos, permanecem as mesmas. Por conseguinte, nada muda na sua execução: int A = 3; / / Primeira cathetus int B = 4; / / Segunda cathetus Na terceira linha, temos a missão operador. Sua parte direita contém a chamada para o utilizador-função definida: int Gipo C = (A, B); / / Cálculo da hipotenusa 6. Em execução deste operador, o programa irá, em primeiro lugar, chamamos a user-defined function. Nota: A descrição da função definidos por usuários devem estar presentes em seu programa e colocado imediatamente após o colchete que fecha a função especial start () (ou seja, fora da função especial). Ao referir-se ao usuário-função definida, o programa irá executar as seguintes: 6.1. Apelando para a variável A, a fim de obter o seu valor (no nosso caso, 3) 6.2. Apelando para a variável B, a fim de obter o seu valor (no nosso caso, 4) Nota: Logo que o programa começa a chamar a user-defined função (a função de usuário é definido, no nosso caso específico, esta regra se aplica a todas as funções), o programa é apenas uma cópia dos valores das variáveis usadas como passou parâmetros, enquanto que os valores dessas variáveis próprias (neste caso, A e B) não estão a mudar devido à suposta aplicação do usuário-função definida, nem eles realmente mudar. 7. O controle é passado para o usuário-função definida. Durante todo o tempo de execução da função definidos por usuários (não importa quanto tempo leva), os valores das variáveis do programa, não lhes chamar perdidos, mas será armazenado. A primeira linha na descrição do usuário-definida é a sua função de cabeçalho: int Gipo (int a, b int) / / Usuário-função definida Sobre a execução do usuário-função definida, o programa irá fazer o seguinte:
7.1. O valor de 3 (o primeiro valor na lista de parâmetros passados) será atribuído a uma variável (a primeira variável na lista de parâmetros formais). 7.2. O valor de 4 (o segundo valor na lista de parâmetros passados) será atribuído a variável b (a segunda variável na lista de parâmetros formais). Em seguida, o controle será passado para a função de órgão-lo para executar o seu algoritmo. O primeiro operador, em função do órgão é: int c2 = a + b * a * b; / / S hum dos quadrados dos catheti 7.3. Em execução deste operador, o programa calcula o valor na parte direita da cessão operador, e depois que ele irá atribuir o valor obtido (no nosso caso, 3 * 3 + 4 * 4 = 25) a variável c2. O próximo operador: int c = MathSqrt (c2); / / hipotenusa 7.4. Aqui vamos encontrar a raiz quadrada do valor da variável c2. O fim das operações é o mesmo que no exemplo anterior. A descrição da norma não é função usado tanto. A execução da tarefa operador irá resultar em atribuir o valor de 5 a variável c. 7.5. Na próxima linha, temos operador: retorno (c); / / Função sair operador Em execução deste operador, o programa vai voltar (para a chamada local do usuário-função definida) o valor fechado entre parêntesis deste operador. No nosso caso, é o valor da variável c, ou seja, 5. Neste ponto, a execução da função definida pelo utilizador-se ao fim, o controle é dado à chamada local. 8. Lembrar que o usuário-função definida foi chamado a partir do operador int Gipo C = (A, B); / / hipotenusa cálculo The record (the user-defined function call) Gipo (A, B) na fase de devolução do valor, assume o valor calculado na função (em nosso caso, é o valor de 5). Ao completar a execução da tarefa operador, o programa irá atribuir o valor de 5 para a variável C. 9. O próximo operador, Alerta ( "hipotenusa =", C); / / mensagem na tela, Esse programa será executado da mesma forma como no exemplo anterior, a saber: em uma janela especial, há uma mensagem irá aparecer: Hipotenusa = 5 10. O último operador neste programa, retorno; / / Função saída operador,
completa o trabalho do grupo especial de função start (), e, simultaneamente completa o trabalho de todo o programa (as propriedades de funções especiais são consideradas em mais detalhes na seção Funções Especiais). Vamos considerar algumas versões da aplicação acima de usuário definido função. É fácil verificar que a programação com funções definidas por usuários tem algumas vantagens inegáveis. Considerado anteriormente Implementação de Funções Definidas Por Usuário Gipo () Nesta função, os parâmetros formais "lembram" as variáveis utilizadas no programa básico. No entanto, esta é apenas uma semelhança formal, porque um e um são os diferentes nomes de variáveis. //------------------------------------------------ ----------------------int Gipo (int a, b int) / / Usuário-função definida ( int c2 = a + b * a * b; / / S hum dos quadrados dos catheti int c = MathSqrt (c2); / / hipotenusa retorno (c); / / Função saída operador ) //------------------------------------------------ -----------------------
Implementação de Funções Definidas Por Usuário Gipo (): Versão 2 Neste caso, os nomes de parâmetros formais não "lembram" os nomes das variáveis usadas no programa básico. No entanto, isso não nos impede de utilizar esta função no programa. //------------------------------------------------ -------------------int Gipo (int alfa, Betta int) / / Usuário-função definida ( int * SQRT alfa = alfa + Betta Betta *; / / S hum dos quadrados dos catheti GIP MathSqrt int = (SQRT); / / hipotenusa retorno (GIP); / / Função saída operador ) //------------------------------------------------ --------------------
Implementação de Funções Definidas Por Usuário Gipo (): Versão 3 Neste exemplo, a variável alfa é reutilizado no programa e muda o seu valor duas vezes. Este facto não tem qualquer efeito sobre as variáveis reais especificadas na função chamadas do programa principal. //------------------------------------------------ -------------------int Gipo (int alfa, Betta int) / / Usuário-função definida ( alfa = alfa alfa * + * Betta Betta; / / S hum dos quadrados dos catheti alfa = MathSqrt (alfa); / / hipotenusa retorno (alfa); / / Função saída operador ) //------------------------------------------------ --------------------
Implementação de Funções Definidas Por Usuário Gipo (): Versão 4
Neste user-defined function, todos os cálculos são coletados em uma operadora. O valor de retorno é calculado diretamente no retorno do operador parênteses (). O subduplicate é calculado directamente no local onde passou o parâmetro deve ser especificado em função da norma MathSqrt (). Esta solução pode parecer estranho para ser ou errado no começo. No entanto, não existe um erro na aplicação da presente user-defined function. O número de operadores utilizados na função é menor do que em outras implementações, para que o código acaba por ser mais compacta. //------------------------------------------------ -------------------int Gipo (int a, b int) / / Usuário-função definida ( retorno (MathSqrt (a + b * a * b)); / / Função saída operador ) //------------------------------------------------ -------------------Assim, a aplicação de funções definidas por usuários tem algumas vantagens inegáveis em prática a programação: § § §
Os nomes das variáveis do texto básico do programa não tem relações formais com os nomes dos parâmetros definidos por usuários em uma função; user-defined funções podem ser reutilizados em diferentes programas, não há necessidade de alterar o código de um usuário-função definida; bibliotecas podem ser criadas, se necessário.
Estas propriedades das funções muito úteis para permitir criar realmente grandes programas em uma corporação, por exemplo.Vários programadores podem estar envolvidos neste processo simultâneo, e eles uma liberada a partir da necessidade de chegar a acordo sobre os nomes das variáveis que utilizam. A única coisa a ser acordada é a ordem das variáveis no cabeçalho e na chamada de função.
Maneira comum de fazer trades Todos os cálculos e outras ações realizadas devido à execução de um programa aplicativo podem ser divididos em dois grupos pelo local de sua execução: aqueles executados no PC do usuário e aquelas executadas do lado do servidor. Um montante significativo de cálculos é realizada sobre o lado do usuário. Este grupo inclui a execução de programas aplicativos. Trades pertencem ao segundo grupo. Making trades implica conversão de dados no servidor. Considerando trades, vamos distinguir os seguintes termos: Mercado fim - é executada uma ordem para comprar ou vender activos a um símbolo (a segurança). Um mercado é exibido no fim da janela do símbolo até o fim está fechado. Enquanto se aguarda ordem é uma ordem comercial para comprar ou vender activos a um segurança (um símbolo) quando o preço predefinido nível seja atingido. Enquanto se aguarda despacho do símbolo é exibido na janela até que ela se torna uma forma ou de mercado é eliminado. O comércio é uma solicitação feita pelo comando de um programa ou por um comerciante, a fim de realizar um comércio. O comércio é abertura, o encerramento ou a alteração do mercado e encomendas pendentes. Comércio tornando diagrama Três componentes estão envolvidos na realização trades: um programa aplicativo, o cliente eo servidor terminal (consulte a fig. 65). A solicitação é formada no programa (como já mencionado acima,
quaisquer programas aplicativos podem ser executados apenas no PC do usuário; nenhum pedido os programas estão instalados no servidor). A solicitação formada pelo programa será passada para o cliente terminal que, por sua vez, envia o pedido para o servidor. Ao lado do servidor, a decisão sobre o pedido execução ou rejeição será feita. As informações sobre os resultados obtidos serão passados pelo cliente para o servidor de terminal e, em seguida, para o programa.
Fig. 65. Diagrama de pedirem para fazer negócios. Solicitando Um comércio solicitação pode ser feita por um profissional ou por um programa. Para um profissional para ser capaz de fazer um pedido ao cliente terminal prevê o "Orders" painel de controle (consulte a descrição do cliente terminal). As solicitações são feitas no programa, de acordo com o algoritmo, como um resultado da execução do comércio funções. Em mais lado nenhum (nem no terminal do cliente nem no servidor) o comércio pedidos são formados espontaneamente. Programa Features Dependendo do algoritmo, um programa pode formar diferentes solicitações - a abertura, o encerramento ou a alteração do mercado e encomendas pendentes. O comércio funções seguintes são usados em um programa para formar comércio pedidos: § § § §
OrderSend () - para abrir mercado e encomendas pendentes; OrderClose () e OrderCloseBy () - para fechar ordens de mercado; OrderDelete () - para apagar encomendas pendentes; OrderModify () - para modificar mercado e encomendas pendentes.
O comércio funções acima pode ser usada somente Especialista em Advisors e scripts; a utilização destas funções dos indicadores é proibida (ver também Quadro 2). Existem outras funções que pertencem ao comércio queridos (ver arquivo em MetaEditor e ajudar a secção Comércio Funções presentes neste livro). No entanto, a sua execução foi atribuída a abertura de informações do terminal ambiente, a fim de obter as informações referenciais, de modo que não resulte na formação de pedidos e apelando para o servidor. Características do Terminal Client Um pedido apresentado pelo programa como um resultado da execução de uma função comercial é passada para o cliente terminal para o processamento. O cliente terminal conteúdo analisa o pedido e executa um dos dois seguintes ações: ou envia o pedido para o servidor para que ele seja executado no servidor, ou rejeita o pedido e envia nada para o servidor. O cliente terminal só permite corrigir os pedidos para serem enviados para o servidor. Se o programa é codificado de tal forma que ela faz, por exemplo, um pedido de abertura de uma ordem a um preço nãoexistente, o cliente não vai enviar este terminal pedido para o servidor. Se o programa formas corretas pedidos (encomendas são abertas e fechadas, o mais tardar, conhecida preço, a ordem está dentro da faixa de valor limitado pela lidar center, etc) e, em seguida, este pedido será enviado para o servidor.
Apenas uma thread execução está prevista no terminal do cliente para realizar negócios. Isto significa que o cliente terminal pode funcionar em simultâneo com um só pedido. Se existem vários scripts Expert Advisors ou comerciais no terminal cliente e nenhum programa tenha passado um comércio solicitar ao cliente terminal, o comércio de todas as solicitações outra Expert Advisors e scripts serão rejeitadas até que o cliente terminal completa transformação do actual pedido, ou seja, , Até que a thread está livre comércio. Características do Servidor As informações sobre comércio história para cada conta (abertura, encerramento, que modifica ordens) é altamente garantidos pelo servidor e é uma das mais prioritárias, em comparação com o histórico de rotas armazenadas no cliente de terminal. O direito de executar os pedidos comércio é concedida apenas a um revendedor ou para o servidor que processa pedidos automaticamente (se a lidar centro fornece o servidor com esse recurso para um determinado período de tempo). A solicitação de que sejam entregues no servidor pode ser tanto executadas ou rejeitadas. Caso o pedido seja executado comerciais (ou seja, um comércio que se faça), o servidor irá fazer todas as conversões de dados. Se o comércio pedido é rejeitado, o servidor não converte os dados. Não importa qual decisão (para executar ou que rejeite um pedido) for feita, as informações sobre esta decisão vai ser passada para o cliente terminal para sincronizar a história. Um pedido comércio formada como resultado da execução do programa e um comércio solicitação formada pelo comerciante manualmente são absolutamente os mesmos, sob a ótica do servidor, de modo que o servidor não faz qualquer distinção entre os pedidos quando o processamento deles. Também é possível no lado do servidor Expert Advisors para proibir o comércio no terminal cliente. Por vezes é necessário, se o programa operação gera conflitos. Por exemplo, se a implementação de um algoritmo resultados incorretos em que o programa continuamente formas comerciais alternante pedidos de abertura e fechamento de ordens com intervalos de tempo muito pequeno (por exemplo, em todos os carrapatos), ou se os pedidos de abertura, supressão ou modificação das encomendas pendentes são demasiado frequentes. Processo de negociação O procedimento de realizar transacções está interativa e percebi na modalidade real-time. O diagrama (fig. 66) mostra todos os eventos relacionados ao Comércio realizando um.
Fig. 66. Evento em fazer uma seqüência comércio. Evento 0. O programa é lançado para execução no momento t0. Evento 1. No momento t1, o programa já formou um pedido comércio como um resultado da execução de uma função comercial. O comércio pedido é passado para o cliente de terminal. Naquele momento, o
programa passa o controle para o cliente terminal e pela execução do programa está parado (o ponto vermelho no desenho). Evento 2. Terminal O cliente não recebeu o controle e informações sobre o conteúdo do pedido. Dentro do período de tempo entre T2 e T3, o cliente terminal analisa o conteúdo do pedido comércio e torna uma decisão sobre novas manifestações. Evento 3. Terminal O cliente que realiza feitos decisão (uma das duas alternativas). Alternativa 1. Se o pedido comércio formada como resultado da execução de uma das funções comerciais acabou por se revelar incorrectas, o controlo é passado para o programa. Neste caso, o próximo evento será Evento 4 (isso pode acontecer se, por exemplo, o programa tiver enviado o pedido de abertura de uma ordem, o que excede o valor da conta de capital disponível). Evento 4. O programa tem recebido o controle (t4 momento, ponto verde) e pode continuar execução a partir do local onde o pedido anterior tenha sido formado. Ao mesmo instante, o programa tem recebido informações sobre a forma que o comércio não tenha sido executada. Você pode encontrar informações sobre o motivo, para a qual o comércio pedido não tenha sido executada, analisando a regressou a ode de erro. Abaixo iremos analisar a questão de como fazer isto. Aqui, há que notar que não apenas todos os pedidos resultar em execução de ordens. Neste caso, o programa já formou uma solicitação incorreta, o que resulta em que o cliente terminal tem rejeitado este pedido e devolveu o controle para o programa. Neste caso, não faz referência ao servidor tem lugar. Os intervalos de tempo entre t1 - t2 - t3 - t4 são negligibly curto e não ultrapassem, no total, várias ms. Alternativa 2. Se o programa tem formado um corretas comércio pedido, o cliente terminal envia esse pedido para o servidor, o próximo evento será Event 5 (o momento do T5) - o servidor receberá o comércio pedido. A ligação entre o cliente eo servidor terminal é estabelecida através da internet, assim o tempo gasto com o envio do pedido ao servidor de comércio (intervalo de tempo entre T3 e T5) é totalmente dependente da ligação de qualidade. Para uma boa qualidade de conexão, este prazo pode ser de aproximadamente de 5 a 10 ms, considerando que ele pode ser medido em segundos, no todo má conexão. Evento 5. No momento, o T5, o servidor recebeu o pedido comércio. O servidor pode executar ou rejeitar essa solicitação recebida. A decisão de executar ou indeferimento do pedido pode ser feita no lado do servidor dentro de um determinado período de tempo (no momento T6). O intervalo de tempo entre T5 e T6 podem variar de alguns milisegundos para as dezenas de segundos, dependendo da situação. Em alguns casos, se o servidor funciona no modo automático e não há movimentos rápidos no mercado e outros comerciantes não estão muito activas, o comércio pedido pode ser executado ou rejeitado dentro de alguns milisegundos. Em outros casos, se o servidor está sobrecarregado devido à grande actividade dos operadores e se a decisão de executar ou indeferimento do pedido é feita por um revendedor humanos, o tempo tomado a decisão tomada pela possibilidade de contar com as dezenas de segundos. Evento 6. Se não houver mudanças consideráveis têm lugar no mercado dentro de um intervalo de tempo a partir do momento em que fazem o comércio pedido pelo programa (t1) para o momento da decisão tomada pelo servidor (T6), o comércio solicitação será executada, como uma regra. Se o preço do símbolo mudou dentro deste tempo ou o valor da encomenda a ser aberto é livre superior a equidade da conta no momento da tomada da decisão, ou outros impedimentos ocorrem, em seguida, o servidor decida rejeitar o pedido comércio. O servidor da rejeição dos pedidos comércio (embora eles já tenham sido controlados pelo cliente terminal) é frequente. Em geral, a maior parte das trocas comerciais que os pedidos são entregues ao servidor para execução são aceitos pelo servidor.Porém, em alguns casos, o pedido pode ser rejeitado, por isso o seu programa aplicativo deve ser codificado de modo a que ele tem essa possibilidade em consideração, e funciona correctamente, em tais situações.
Qualquer que seja decisão (para executar / rejeitar um pedido comércio, evento 6) é feita pelo servidor, as informações sobre ele é enviado pelo servidor ao cliente terminal que tenha entregue o pedido. Evento 7. Terminal O cliente não recebeu resposta do servidor. A resposta do servidor segue o mesmo caminho por meio da Internet, dado que o pedido entregue ao servidor, por isso o tempo despendido com a resposta do servidor que recebe completamente depende da qualidade da conexão. De acordo com as modificações feitas no servidor, o cliente terminal irá reflectir as alterações correspondentes. Por exemplo, se a execução de um pedido comércio resulta em fechamento ou abertura de um despacho, o cliente terminal irá mostrar graficamente este evento na janela do símbolo e textualmente no "Terminal" janela (os separadores «Comércio» e «História da conta ') . Se o servidor rejeitou o pedido comércio, nenhuma alteração será feita em nenhuma das janelas do terminal do cliente. Evento 8. Terminal O cliente já completou a exibição das mudanças e é passar o controle para o programa. Evento 9. O programa tem recebido o controle e pode continuar operando. Observe: A partir do momento em que o programa envia um pedido comerciais (e simultaneamente passa o controle) para o cliente terminal, para o momento em que o controle é retornado para o programa, este é um modo de espera nos. N º operações são feitas no programa durante este período de tempo. O controle é retornado para o programa de acordo com a regra para a execução chamada para a função que tem formado a pedido comércio. Se o comércio solicitação está incorreta e, em seguida, o programa não estiver em modo de espera por um longo tempo (o intervalo entre T1 e T4). No entanto, se o pedido for comércio 'aprovado' pelo cliente e enviados para o terminal server, a duração do programa período de espera (t1-t9) pode ser diferente e depende tanto da qualidade da conexão e do tempo de tomada de decisões tomadas por do servidor - para vários milissegundos para minutos. Logo que o programa recebe o controle, ele pode continuar operando. O programa operacional pode analisar o código do último erro retornado pelo cliente terminal e, desta forma, encontrar-se sobre se o comércio pedido foi executado ou rejeitadas. Conflitos em Making Trade. Erro 146 Ao considerar acima Características do terminal do cliente, temos dito que o cliente terminal poderia processar um pedido em um só momento. Vamos considerar agora o que eventos irão ter lugar se vários pedidos formado por diferentes programas será passado para o cliente de terminal.
Fig. 67. Conflitos de passagem, vários pedidos para o cliente terminal de diferentes programas.
Na fig. 67, podemos ver que dois negociação Expert Advisors são lançados para execução no cliente terminal simultaneamente.EA1 formaram um comércio solicitação no momento t1 e ela passou o cliente terminal no momento t2. EA2 criou também um pedido e remete para o cliente terminal quando o cliente terminal está processando o primeiro pedido (período de t2 para t3). Nesta situação, o cliente terminal não pode considerar a solicitação formada por EA2, de forma que ele vai rejeitar esse pedido e devolver o controle para EA2. Observe que, neste caso, o pedido é rejeitado pelo cliente terminal para o pedido não for errada, mas porque o terminal está ocupado com o processamento do pedido do outro. EA2 continuará operando. É possível analisar o código de erro que explica a razão pela qual o pedido foi indeferido (no nosso caso, trata-se de erro 146). Se é EA2 (em um caso geral, ele pode ser um ou vários programas comerciais) que passa a sua solicitação para o cliente terminal, dentro do período de tempo entre T1 e T4 e, em seguida, este pedido será indeferido (um grupo de eventos na área rosa). O terminal cliente torna-se livre de momento t4 (ponto verde). A partir deste momento, EA2 pode passar com sucesso o seu pedido para o cliente final (um grupo de eventos na área verde). Esta solicitação será recebida e analisada pelo cliente terminal que pode finalmente rejeitá-lo, também, mas pela razão de sua incorreção, ou ele pode enviar esse pedido para o servidor. Se o negócio criado por EA1 pedido é considerado pelos clientes como terminal correcto, este pedido será enviado pelo cliente para o servidor de terminal no momento t3. Neste caso, o cliente terminal e muda para o modo de espera e não pode considerar qualquer outro comércio pedidos. O cliente terminal só se tornará livre para considerar os pedidos de outras trocas de momento t9. Assim, de acordo com a variação 2, o cliente terminal não pode analisar os pedidos comércio dentro do período de tempo entre t1 e t9. Se dentro desse prazo, qualquer programa refere-se ao cliente terminal, a fim de passar um pedido de consideração, o cliente terminal irá rejeitar esta evento e passar o controle para o programa (um grupo de eventos na área rosa, dentro do período de tempo entre T6 e T7). O programa que recebeu o controle continua a sua actividade e, através da análise do código de erro, pode encontrar-se sobre a razão, pela qual o pedido foi indeferido (neste caso, trata-se de erro 146). A partir do momento t9, o cliente terminal será totalmente livre para qualquer outra analisam os pedidos comerciais. EA2 pode passar com sucesso o comércio pedido para o cliente terminal, dentro do período de tempo que decorre o momento t9. De acordo como o cliente terminal considerar o pedido correto ou não, o pedido será passado pelo cliente para o servidor de terminal ou rejeitado. A análise dos erros que ocorrem na tomada de tráfegos são consideradas em mais detalhes nas seções abaixo.
Ordem características e normas relativas à elaboração de ofícios Antes de começarmos a descrever comércio funções, devemos considerar parâmetros que caracterizam os preços de mercado, tipos de ordem, as suas características, bem como as regras para fazer negócios. Características dos símbolos Em primeiro lugar, devemos considerar o princípio utilizado pelas corretora empresas para formar os preços dos valores mobiliários. Este princípio consiste em que o corretor ofereça ao comerciante uma citação, em ambos os sentidos para a realização de negócios. Bidireccional para a citação está ligado um par de mercado os preços oferecidos pela corretora para a compra e venda de activos para uma segurança (símbolo), no momento presente.
Lance é o menor dos dois preços oferecidos pela corretora em uma bidireccional para citar um segurança. Pergunte se o mais elevado dos dois preços oferecidos pela corretora em uma bidireccional para citar um segurança. O ponto é o preço unitário de medição de um símbolo (o preço mínimo possível mudar, o último algarismo significativo do preço do valor). Spread é a diferença entre os maiores e os menores preços nos pontos em um bidireccional para citar um símbolo. Normalmente, a propagação é um valor fixo. Em Metatrader 4, admite-se que devem ser apresentadas na janela do símbolo gráfico que reflete apenas mudanças preço de lance:
Fig. 68. Um preço normal de um símbolo gráfico. Fig. 68 mostra-nos um símbolo janela onde podemos ver a evolução da oferta e os preços, em ambos os sentidos citar - a linha do actual preço de lance (preto, 1,3005) e da linha do Pergunte ao preço corrente (vermelho, com 1,3007). Ele pode ser facilmente visto que, neste caso, a corretora oferece um spread de 2 pontos. A história Pergunte para o preço não é mostrado no gráfico, mas é implícita e pode ser facilmente calculada para qualquer instante do tempo. Ordem tipos e características Existem seis tipos de ordem no total: dois tipos de ordens de mercado e quatro tipos de ordens pendentes. Comprar é um mercado que define ordem de compra de activos a um símbolo. Vender é um mercado que define ordem de venda dos activos a um símbolo. BuyLimit está pendente uma ordem de compra activos para uma segurança a um preço inferior ao actual. A ordem será executada (Buy modificados na ordem do mercado) Pergunte se o preço atinge ou cair abaixo do preço fixado na ordem pendente. SellLimit está pendente uma ordem de vender activos para uma segurança a um preço superior ao actual. A ordem será executada (modificado em ordem Vender mercado) se o preço de lance atinge ou ultrapassa o preço estipulado na ordem pendente. BuyStop está pendente uma ordem de compra activos para uma segurança a um preço superior ao actual. A ordem será executada (Buy modificados na ordem do mercado) Pergunte se o preço atinge ou ultrapassa o preço estipulado na ordem pendente.
SellStop está pendente uma ordem de vender activos para uma segurança a um preço inferior ao actual. A ordem será executada (modificado em ordem Vender mercado) se o preço de lance atinja ou cair abaixo do preço fixado na ordem pendente. O volume do lote é uma ordem expressa na quantidade de lotes. StopLoss é uma ordem stop, que é um preço estipulado pelo comerciante, um mercado em que a ordem será encerrada se o símbolo preço se move numa direcção que produz prejuízos para a ordem. TakeProfit é uma ordem stop, que é um preço estipulado pelo comerciante, um mercado em que a ordem será encerrada se o símbolo preço se move numa direcção que produz lucros para o fim.
Negociação requisitos e limitações No intuito de forma correcta a sua aplicação no comércio pedidos programas (Expert Advisors e scripts), você deve tomar os requisitos e as limitações existentes em consideração. Vamos analisá-las em mais detalhes. Todos os negócios são realizados a preços correctos. A execução de preço para cada comércio é calculado com base no preço correto de uma citação, em ambos os sentidos. A regra está acima da regra comum para todos os participantes do mercado e não pode ser alterado na vontade dos desenvolvedores de uma plataforma de negociação ou na base de um acordo entre um corretor e um comerciante. Isto significa, por exemplo, que um mercado só pode ser aberta vista ao actual preço de mercado, mas não a qualquer preço outros. Corrigir-O método de cálculo de preço para os diferentes ofícios é considerado baixo. Ao calcular os preços corretos, também é necessário considerar as limitações do prestador de serviços (referente ao centro).Estas limitações incluem a distância mínima, e no congelamento de distância. Essas limitações significam que o corretor tem algum tempo para os preparativos para a realização de novos ofícios, se convertendo em uma ordem pendente um mercado ou fechar uma parada por uma ordem judicial. Centros que tratam do valor do limite mínimo admissível diferença entre o preço de mercado, bem como o preço de cada uma das ordens de parar de uma ordem de mercado entre o preço de mercado, bem como o preço de uma encomenda pendente, assim como entre o preço de uma pendência e solicitou o fim dos seus preços ordens stop. Isto significa, por exemplo, que um comércio no pedido de abertura de um mercado único modo que você pode especificar a ordem para parar de preço valores que não estão distantes do actual preço inferior ao mínimo prescrito distância. Um comércio pedido contendo ordem para parar de preços que se encontram mais perto do preço de mercado do que a distância mínima é considerado pelo cliente terminal como uma incorrecta. Diferentes centros que tratam pode estabelecer diferentes, tratando-center limitações específicas para a distância mínima permitida. Como regra, o valor dessa distância varia entre 1 e 15 pontos. Para os mais comumente utilizados valores mobiliários (EUR / USD, GBP / USD, EUR / CHF, etc), essa distância torna, na maioria dos centros que tratam 3.5 pontos.Diferentes valores podem ser de diferentes distâncias mínimas permitidas, também. Por exemplo, este valor pode ser 50-100 pontos para o ouro. O valor da distância mínima para qualquer símbolo pode ser alterada pelo corretor, a qualquer momento (o que normalmente precede a difusão de notícias importantes comercial). Não há limitações para a distância máxima. Parado distância limita a possibilidade de modificar os preços solicitados na pendência da sua abertura ordena, bem como os níveis solicitados para parar de mercado que são ordens de congelamento na
área. Isto significa, por exemplo, que, se o preço de mercado é 1,3800, enquanto se aguarda o seu fim é colocado para ser aberta em 1,3807 e os corretores da prescrição é de 10, enquanto se aguarda o seu fim é a congelar no espaço, ou seja, você não pode modificar ou apagar. Em um mercado calmo, corretores geralmente não definir congelar distância, ou seja, o seu valor = 0. No entanto, durante o período precedente importante notícia ou de volatilidade em alta, pode estabelecer um corretor o valor de uma certa distância congelar. Em diferentes condições e para diferentes corretores, esse valor pode variar de 1 a 30 pontos básicos para ter símbolos e valores mais elevados para outros símbolos. Corretora que pode mudar a congelar-distância valor a seu critério, a qualquer momento. As limitações dos níveis de preços limitados pelos valores da distância mínima de congelamento e distância são calculadas com base nos preços corretos. Abertura / fechamento do mercado encomendas A abertura de um mercado implica ordem de compra ou de venda de alguns activos de um símbolo, o preço corrente de mercado (ver Requisitos e Limitações em Making Ofícios). Para abrir um mercado despacho, utilizar função OrderSend (); para o seu encerramento, utilize OrderClose função (). O correto do preço de mercado aberto fim Buy é o mais recente conhecido Pergunte ao preço de mercado. O correto do preço de mercado aberto fim Vender é conhecido o mais recente dos preços no mercado de lance. As limitações relacionadas à posição de paragem níveis de mercado a fim de ser aberto é calculado com base no preço de mercado correto usado para o encerramento do fim. StopLoss ordens e TakeProfit não podem ser colocados mais próximos do preço de mercado do que a distância mínima. Por exemplo, a distância mínima faz 5 EURUSD por pontos. Vender mercado é aberto no fim de lance = 1,2987. O preço correspondente com a forma quote-dois usado para encerrar este fim Vender é Pergunte = 1,2989. A paragem seguinte será a níveis mais próximos dos actuais preços na ordem de criação (ver fig. 69 e Requisitos e Limitações em Making Trades): Pergunte StopLoss = + distância mínima = 1,2989 + 0,0005 = 1,2994, e Pergunte TakeProfit = - distância mínima = 1,2989 - 0,0005 = 1,2984.
Fig. 69. Mercado com vista Sell Stop Níveis estar mais próximo do preço de mercado.
Se pelo requerente para a abertura de mercado na ordem de lance Vender = 1,2987 você parar de usar os valores de nível mais próximo do que o acima queridos (SL = 1,2994 e ТР = 1,2984), o comércio pedido será rejeitado pelo cliente terminal. Além disso, você deve levar em consideração que o preço derrapagens são possíveis durante a abertura de ordens, o que resulta na abertura de sua ordem, a um preço diferente do que o solicitado por você ter um certo valor especificado no pedido. Se o mesmo pedido tenha especificado os valores de parar de níveis mais próximos dos preços solicitados abrir, este pedido será igualmente rejeitado pelo cliente terminal, uma vez que, neste caso, o pedido não respeitar a distância mínima exigida entre o preço de abrir o seu ordem bem como o preço de uma das ordens de stop. Essa é a razão pela qual não é recomendado para uso no comércio pedidos de abertura de mercado ordens de stop-ordem para valores mais próximos do fim aberto preço solicitado. Pelo contrário, é recomendado para tem algum "livre jogo", isto é, precisar esses valores de ordens de stop que seriam afastadas da requerida abertas preço da ordem de 1.2 pontos mais longe do que o valor da distância mínima permitida. Mercado encomendas podem ser fechados, como resultado da execução do pedido emitido por um operador comercial ou pelo programa, assim como quando o preço atinge um dos preços previstos no ordens stop. O preço correto perto de um mercado para comprar o mais recente é conhecida dos preços no mercado de lance. O preço correto perto do fim Vender um mercado é o mais recente conhecido Pergunte ao preço de mercado. Se fecharmos fim Sell (Fig. 69), no momento atual, ela será encerrada às Pergunte = 1,2989, ou seja, com uma perda de 2 pontos. Se permitirmos que isto fim permanecerem abertos por algum tempo e Peça o preço cai para 1,2984, a ordem será encerrado com esse preço com o lucro de 3 pontos. Se o preço de mercado cresce neste período de tempo e alcança Pergunte = 1,2994, a ordem será encerrado com esse preço com uma perda de 7 pontos. Caso o pedido tenha formado um pedido para abrir ou fechar uma ordem no mercado a um preço que não corresponde com a mais conhecida do preço de mercado, o pedido será rejeitado pelo cliente terminal. A limitação relacionada ao fechamento das ordens de mercado é calculada com base no preço de mercado utilizadas para corrigir fechamento da ordem. Ordem não pode ser encerrada, se o preço da sua execução StopLoss ou TakeProfit está dentro da faixa de distância de congelar o preço de mercado. Por exemplo, a ordem indicada na fig. 69 pode ser fechada apenas os corretores se definir o valor da distância congelar 4 pontos ou menos a partir do momento do fechamento. O preço de abrir este fim não importa, neste caso. As bordas da banda para congelar o fim são calculados com base no preço de mercado. Então, se for = 4, o preço superior, o aluno interno é igual a congelar + = 1,2989 + 0,0004 = 1,2993, enquanto o preço mais baixo do congelamento Boarder é, correspondentemente, - = 1,2989 0,0004 = 1,2985. Nestas condições, não está em parar vista a congelar área, de modo a ordem pode ser fechada, se o profissional (ou um programa) envia uma solicitação ao servidor correto. Se o corretor tem que definir a = 5, a partir do momento atual, as bordas da banda vai ser o congelamento, 1,2994 e 1,2984, respectivamente. Neste caso, cada uma ordem stop fica em congelar o pensionista, ou seja, sofre a definir pela corretor limitação, pelo que o despacho não pode ser encerrada às do comerciante iniciativa ou por solicitação da negociação programa. Neste exemplo, ambos submetidos à limitação ordens stop. Num caso geral, uma ordem no mercado não podem ser fechadas por iniciativa do cliente terminal, se pelo menos um nível de parar isto é, em ordem a congelar área.
Se são duas ordens de mercado aberto para um símbolo simultaneamente, sendo um deles a um outro Comprar e Vender sendo, elas podem ser fechadas em uma das duas maneiras: você pode fechá-las, consecutivamente, um por um, utilizando OrderClose (); ou você pode fechar uma delas utilizando um pelo outro OrderCloseBy (). Em termos de poupança de dinheiro, a segunda forma é a mais preferível, porque você vai guardar propagação em um fechamento ordens por si. O uso de funções comercial é tratada com mais detalhes a seguir neste livro. Colocação e excluindo Pendentes encomendas A ordem pendente requerida implica o fim abertas preço diferente do preço corrente de mercado. Para colocar encomendas pendentes, utilizar função OrderSend (). Use OrderDelete função () para excluir uma ordem pendente. Enquanto se aguarda ordens SellLimit e BuyStop são colocadas a um preço superior ao preço corrente de mercado, enquanto que BuyLimit e SellStop são colocadas a um preço inferior ao preço corrente de mercado.
A limitação relacionada com a posição da ordem pendente deve ser colocada é calculado com base no preço de mercado para corrigir uma conversão em um mercado na expectativa ordem judicial. Enquanto se aguarda ordens BuyLimit, BuyStop, SellLimit e SellStop não pode ser colocada a um preço mais próximo do preço de mercado do que a distância mínima. Por exemplo, para calcular o preço mínimo permitido para o fim BuyStop, você deve adicionar o valor mínimo de distância para o mais recente conhecido Pergunte preço. Se StopLevel = 5, então o preço mínimo permitido para colocar a ordem pendente BuyStop fará 1,3003 +0,0005 = 1,3008 (ver fig. 70). Isto significa que a ordem BuyStop podem ser colocados no atual momento em que o preço de 1,3008, ou a um preço mais elevado. Neste exemplo, BuyStop é colocada em 1,3015, o que é perfeitamente admissível.
Fig. 70. Enquanto aguarda as encomendas são colocadas a um preço inferior ou superior ao preço atual. O preço solicitado de ordem pendente BuyStop é 1,3015. O preço solicitado de ordem pendente SellLimit é 1,3012. O preço solicitado de ordem pendente SellStop é 1,2995. O preço solicitado de ordem pendente BuyLimit é 1,2993.
No exemplo acima, todas as encomendas pendentes foram colocados em zero no bar no momento mostrado na fig. 70, enquanto que a distância mínima para a colocação das encomendas feitas até 5 pontos. Ordem SellStop é o mais próximo do preço de mercado. Neste caso, Lance = 1,3001 bem como o preço do SellStop = 1,2995. Assim, a distância entre a encomenda eo preço correcto das duas apóstrofo-way (Bid) é de 6 pontos (1,3001 - 1,2995), ou seja, é mais do que exige a distância mínima. Isto significa que, na abertura da ordem ( ou todas as outras ordens nesse exemplo), o comércio pedido foi "aprovado" pelo cliente e enviados para o terminal server. O servidor também verificado a sua conformidade com as exigências e decidiu executar o pedido para a colocação da ordem pendente (ver Requisitos e Limitações em Making Ofícios). A posição de ordens stop acompanha a ordens pendentes também é limitado pela distância mínima: As limitações relacionadas à posição de paragem encomendas pendentes de uma ordem é calculado com base no preço solicitado aberta na pendência da ordem e não tem nenhuma relação aos preços de mercado. StopLoss e de uma encomenda pendente TakeProfit não podem ser colocados para mais perto do que o preço solicitado pelo valor mínimo de distância. As posições de StopLoss e TakeProfit de encomendas pendentes não são limitados pelo congelamento distância. Na fig. 71, podemos ver na pendência SellLimit fim, a parar de ordens que não sejam mais perto do fim solicitou preço possível.Neste caso, o preço solicitado fim = 1,2944, StopLoss = 1,2949, TakeProfit = 1,2939. Na distância mínima de 5 pontos, estes valores são bastante admissível.
Fig. 71. Enquanto se aguarda a ordem com ordens de stop tão próximo quanto possível ao fim. Neste exemplo, enquanto se aguarda despacho SellLimit foi inaugurado em 18:07. Você pode ver na fig. 71 que, depois que o preço de mercado e, em seguida, atingiu o seu interromper cruzaram uma das ordens, e depois caiu novamente. Este evento não influenciou a ordem pendente de qualquer forma: uma ordem stop só pode fechar o fim do mercado, isto é, torna-se eficaz logo que a ordem pendente será modificada em um mercado encomenda. Neste caso, enquanto se aguarda o despacho não seja modificado em um mercado um (uma vez que o preço de lance não tenha chegado ao fim solicitou abrir preço), de modo que o preço stop-fim atravessando este nível, não resultou em qualquer alteração.
A limitação relacionada com a supressão das encomendas pendentes é calculado com base no preço de mercado aplicáveis para corrigir modificação de uma ordem pendente em um mercado um. Enquanto se aguarda ordens BuyLimit, BuyStop, SellLimit e SellStop não pode ser suprimido, se for solicitado a abrir o preço da encomenda está dentro do intervalo de
congelar a distância entre o preço de mercado. Ordem SellLimit pode ser suprimida no momento mostrado na fig. 71, já iniciada pelo cliente terminal, apenas se o valor indicado neste momento é igual ou inferior a 8 pontos. Neste caso, a parte superior do pensionista do congelamento banda (a ser calculado para SellLimit) fará: + = 1,2935 +0,0008 = 1,2943. O preço solicitado forma aberta torna 1,2944, ou seja, a ordem é colocada fora da banda congelar e pode ser eliminado. Se o corretor define o valor a mais de 8 pontos, então a ordem pendente SellLimit não pode ser suprimido eo cliente terminal rejeita o pedido comércio. Na pendência da modificação encomendas em ordens de mercado Enquanto aguarda as encomendas são automaticamente modificados em mercados em despachos do servidor, assim não há funções são fornecidas para executar esta operação (ver Requisitos e Limitações em Making Trades ). Enquanto se aguarda ordens BuyLimit e BuyStop mercado sejam alteradas para uns, o último caso conhecido Pergunte ao preço atinge o preço solicitado ordem pendente. Pendentes SellStop ordens SellLimit e são modificados ao mercado queridos, se o último preço conhecido atinge lances solicitados até o fim dos preços. Quanto às encomendas pendentes mostrado na fig. 70, pode-se dizer o seguinte. Enquanto se aguarda despacho BuyStop mercado está em ordem Buy modificados, se o preço atual Pergunte ao atingir o valor de 1,3015. Enquanto se aguarda despacho SellLimit é modificada em ordem mercado Sell, se o preço atual de lance atingir o valor de 1,3012. Pendentes SellStop ordem é modificada em ordem mercado Sell, se o preço atual de lance atingir o valor de 1,2995. Enquanto se aguarda despacho BuyLimit mercado está em ordem Buy modificados, se o preço atual Pergunte ao atingir o valor de 1,2993. Os eventos subseqüentes relacionados a essas ordens são mostrados nas Figuras 72-74.
Fig. 72. Modificação de encomendas pendentes no mercado queridos.
Na história ainda, a 2 outras encomendas pendentes também foram modificadas em mercado queridos.
Fig. 73. Modificação de encomendas pendentes no mercado queridos.
Fig. 74. Modificados (de mercado) as ordens são exibidas na janela do terminal. Observe que, Fig. 73 mostra a abertura da ordem Comprar 4210322 (a antiga ordem pendente BuyStop). Como é fácil de ver, as barras formadas em 18:55 não toque no preço de 1,3015. O preço mais elevado no interior deste bar é 1,3013. Ao mesmo tempo, a janela do terminal (Fig. 74) mostra que o tempo da ordem pendente foi modificado em um mercado específico dentro deste um bar, isto é, em 18:55. Aqui é preciso salientar mais uma vez que o símbolo janela exibe apenas o preço mais baixo preço para a história das duas apóstrofo-side, ou seja, que reflecte a história de lance. Pergunte a história não é exibido. Esta é a razão pela qual você pode pensar que a pendência judicial foi modificada para o mercado por um erro. No entanto, não há erro aqui, no presente caso. No momento, quando o preço de lance foi igual a 1,3013, o preço Pergunte foi 1,3013 + 2 = 1,3015 (2 significa a disseminação de 2 pontos). Assim, o preço de mercado, ainda tocou a ordem requerida preço, e que resultou na alteração automática da ordem pendente em um mercado um. A ordem foi modificada sobre os lado do servidor. Imediatamente após isso, o servidor passou a informação acerca deste terminal para o cliente que, por sua vez, que as informações exibidas na janela tanto o símbolo (gráfica) e na janela do terminal (como um texto). Semelhantes observações dizem respeito à alteração de ordem BuyLimit 4210411. Embora o gráfico mostrando o preço da toca ou está abaixo do preço da ordem pendente solicitou BuyLimit no 16:3716:39 e em 16:41 (Fig. 72), no fim do mercado é aberto.Neste caso, o motivo para isso é o mesmo: o preço de mercado Perguntar não tocar na ordem solicitada preço. Porém, ele tocou nesse nível nos próximos bar, a 16:42. Este evento resultou na modificação da ordem pendente em um mercado um, de forma BuyLimit na janela do símbolo foi substituído por Buy, enquanto uma nova ordem no mercado aparece na janela do terminal. No exemplo acima, todas as encomendas foram efectuadas com zero ordens stop (que significa sem deixar de encomendas). No entanto, a disponibilidade de conteúdo (diferente de zero) valores de ordens stop não irá influenciar a alteração das encomendas pendentes no mercado queridos de forma alguma,
uma vez que só podem ser modificados, se o preço das duas apóstrofo-way toca ou cruza a solicitadas preço da ordem pendente. A ordem pendente é uma modificação em um mercado sem qualquer relação com as ordens de stop apenso. A ordem pendente pode ser aberta (modificado em um mercado um) a um preço que não condiz com o preço solicitado aberta na pendência da ordem. Isso pode acontecer em rápida mudança do preço de mercado, ou seja, nas condições em que o preço mais conhecidos antes da abertura da encomenda não tenha chegado ao preço solicitado, mas o próximo preço (na qual a ordem é aberta) não coincide com o forma aberta preço, mas isso está além (Fig. 75).
a) preço gapped entre dois bares b) preço gapped dentro de um bar no seu formando Fig. 75. Enquanto se aguarda uma ordem seja modificado em um mercado em um fosso. Na fig. 75a, podemos ver uma possível variação de abertura da ordem pendente BuyStop (ela mostra duas posições da ordem - antes e depois da abertura, na realidade, você pode ver, quer BuyStop Comprar ou fim, mas não ambos). O mais recente dos preços antes de conhecer o preço saltou tinha sido 1,9584. À 19:15, alguma notícia foi publicada, o que resulta em que o símbolo preço tinha mudado em um salto. O primeiro preço conhecido após a notícia foi liberada é 1,9615. Normalmente, os preços saltam para cima ou para baixo, como resultado de importantes notícias. Nesses casos, o corretor não pode abrir o seu fim, o preço solicitado, pois não são correspondentes preços no mercado no momento. Neste caso, a ordem pendente BuyLimit foi colocada ao preço de 1,9590 a requerida, mas ela abriu (modificado para o fim do mercado), ao preço de 1,9615. Este facto resultou da constatação de que não tinha havido qualquer outra dentro do intervalo de preços 1,9584 a 1,9615. Como resultado dos eventos considerados, o mercado foi aberto no fim Compre um preço que era de 25 pontos pior do que o colocou na pendência de ordem BuyStop. Uma situação semelhante (que recebem menos rentável do que o esperado em ordem) pode ter lugar para o fim SellStop, se o preço saltou para baixo. No entanto, se pendente fim BuyLimit ou SellLimit-se também à defasagem de preços, o mercado correspondente ordem pode ser aberta por um preço que é melhor para o profissional que solicitou o seu preço. Importa igualmente notar que uma defasagem de preços (a diferença entre as duas cotações mais próximo que faz mais de um ponto) e não ocorre com freqüência e pode surgir a qualquer momento. Se a defasagem de preços ocorre entre bares, ou seja, um preço muito diferentes rendimentos em Assinalar o primeiro de uma nova barra, você pode ver a defasagem de preços no preço gráfico (Fig. 75a). No entanto, se a defasagem de preços acontece dentro de um bar, não é possível detectar essa lacuna visualmente (Fig. 75b). Neste caso, a diferença é escondido dentro do bar (o candelabro). No entanto, não é possível ajuizar sobre as cotações história dentro do bar apenas pela sua aparência ou por qualquer programa características disponíveis (no entanto, é possível detectar o fosso usando um programa aplicativo que Wold calcular a diferença entre os preços das citações recebidas).
Modificação do mercado encomendas Plataforma de negociação Metatrader 4 permite-lhe formar comércio pedidos para modificar os níveis dos preços de mercado e de encomendas pendentes. Para modificar ordens de qualquer tipo, incluindo ordens de mercado, você deve usar função OrderModify (). Modificação de um mercado implica a mudança da ordem requerida deixar de ordens de valores. Você não pode alterar os preços no mercado aberto ordens. Você não pode alterar o preço de um mercado aberto fim, desde fim abertura é um facto. Portanto, não há qualquer método de programação para fazer isso. A única coisa que pode fazer com um mercado ordem é para fechá-lo. A ordem do mercado pode ser fechada como resultado da execução de um pedido comercial formado por um comerciante ou por um programa, ou se o preço de mercado atinge o preço de uma das ordens de stop. StopLoss ordens e TakeProfit não podem ser colocados mais próximos do preço de mercado do que a distância mínima. Uma ordem não pode ser modificado, se o preço da sua execução StopLoss ou TakeProfit varia dentro da distância de congelar o preço de mercado. Observe que a posição das ordens de stop é um mercado limitado, como forma relacionadas com o actual preço de mercado, mas ela não tem qualquer relação com a ordem abertas preço (ver Requisitos e Limitações em Making Ofícios). Isto significa que a alteração da ordem pode resultar em que as ordens de stop são colocadas acima ou abaixo do preço no mercado aberto fim. Vamos considerar um exemplo. Um mercado foi aberto antes do fim, as suas ordens de stop estando mais próximos ao preço de mercado (fig. 69). Depois disso, o preço de mercado mudou (um aumento de 1 ponto). No momento, o mostrado na fig. 76, tornou-se possível alterar o valor de TakeProfit. Ordem Vender é fechada, o mais tardar, conhecida preço Pergunte. A distância entre Pergunte = 1,2990 o valor anterior e TakeProfit = 1,2984 fez 6 pontos, ou seja, excedeu a distância mínima permitida.Comerciante (ou programa) formaram um comércio solicitação para alterar o valor de TakeProfit, ou seja, para aumentar este valor por 1 ponto. Isto resultou em uma tomada comércio, alterando a posição da ordem de parar o fim do mercado (o valor anterior de TakeProfit = 1,2984, o novo valor = 1,2985). Se o pedido contido comércio a fim Vender modifique a instrução para que o valor de qualquer das ordens de stop estavam mais próximos do preço de mercado do que em Pergunte a distância mínima, esse comércio pedido será rejeitado pelo cliente terminal e do comércio não seriam feitas.
Fig. 76. Uma forma modificada, as suas ordens de stop estando mais próximos dos preços do mercado.
A modificação da regra do mercado limita as ordens para parar de modo a aproximar o preço atual, mas isso não limita a ordem para parar de distância do preço. Essa a razão por que parar de ordens pode ser colocado em qualquer distância do preço actual, se esta distância for maior do que limitar a distância (que, como a modificação da ordem momento, a ordem é deixar de fora a congelar o valor determinado pela banda). Na fig. 77, podemos ver o mesmo fim após uma modificação mais: neste caso, interromper as encomendas são bem fora da gama de limitar a distância mínima.
Fig. 77. Uma forma modificada, as ordens de stop que são colocados para além da distância mínima. Na pendência da modificação encomendas Para modificar qualquer fim tipos, incluindo as encomendas pendentes, usamos função OrderModify (). Modificação de uma ordem pendente implica a possibilidade de modificar os valores definidos os preços de abertura da ordem pendente e pare suas ordens. A limitação relacionada com a posição da ordem pendente a ser modificado é calculado com base no preço de mercado correta de se alterar a ordem pendente no mercado um. As limitações relacionadas à posição de paragem encomendas pendentes de uma ordem é calculado com base no preço solicitado aberta na pendência da ordem e não tem nenhuma relação aos preços de mercado.
Enquanto se aguarda ordens BuyLimit e BuyStop não podem ser colocados mais próximos do preço de mercado do que em Pergunte a distância mínima StopLevel. Pendentes SellStop ordens SellLimit e não podem ser colocados mais próximos do preço de mercado superior ao lance mínimo StopLevel distância. StopLoss / de uma encomenda pendente TakeProfit não podem ser colocados mais perto da forma solicitada no aberto preço do que a distância mínima StopLevel.
Enquanto se aguarda ordens BuyLimit e BuyStop não pode ser modificado, se o requerido para abrir preço oscila dentro da distância de congelar o preço de mercado Pergunte. Pendentes SellStop ordens SellLimit e não podem ser modificados, se o requerido para abrir preço oscila dentro da distância de congelar o preço de mercado de lance. As posições de StopLoss e TakeProfit de encomendas pendentes não são limitados pelo congelamento FreezeLevel distância.
Por favor, note que o preço de uma encomenda pendente é limitada em relação ao preço de mercado, enquanto que a sua ordens stop são limitados pela requerida abertas até o fim de preço (ver Requisitos e Limitações em Making Ofícios). Por exemplo, enquanto se aguarda despacho BuyLimit é colocada com os seguintes parâmetros: 1 = preço solicitado. 2969, StopLoss = 1,2964, TakeProfit = 1,2974. O valor actual do preço do mercado (aplicado para modificar a ordem pendente em um mercado um) Peça = 1,2983. Assim, a ordem é colocada a uma distância de 14 pontos (1.2983-1.2969) a partir do preço de mercado, o que ultrapassa de longe a distância mínima permitida. As ordens são parar na distância de 5 pontos a partir do preço solicitado, o que não exceda a distância mínima, de modo que é admissível.
Fig. 78. Enquanto se aguarda despacho BuyLimit com ordens de stop acompanha mais próximo do fim. Se o profissional precisa de alterar o preço da ordem BuyLimit, então, qualquer que seja o rumo que ele ou ela se move em, neste caso, é necessário alterar simultaneamente a posição de paragem correspondente ao fim (ou para apagá-lo, ou seja, para definir valor zero para ele), também. Caso contrário, a distância entre o fim eo seu fim paragem poderá não vir a ser menor que o mínimo permitido um. O comerciante decidiu modificar a ordem para que ele manteve a distância entre a ordem ea sua TakeProfit como 5 pontos, enquanto o valor de StopLoss permaneceu como era (Fig. 79).
Fig. 79. Modificado fim BuyLimit (o preço solicitado e ao nível TakeProfit são alterados). Se o profissional precisa para colocar ordem pendente BuyLimit tão perto quanto possível do preço de mercado, então nesse caso (Fig. 80), o valor mínimo permitido do preço solicitado Pergunte-5points = 1.2985-0.0005 = 1,2980. Neste exemplo, parar as ordens são colocadas fora do limite mínimo de distância.
Fig. 80. Modificado fim BuyLimit mais próximo do preço de mercado. Apêndice chamado Requisitos e Limitações na Trades Tornar contêm um resumo tabela que especifica os valores de uma correspondência biunívoca citar, que são utilizados para a abertura, o encerramento ou a modificação das encomendas, bem como outros valores referência que limitam a realização de negócios. Abertura e colocação encomendas Comércio pedidos de abertura e colocação encomendas pendentes são formadas utilizando a função OrderSend (). Função OrderSend () int OrderSend (string símbolo, int cmd, duplo volume, duplo preço, int derrapagem, a dupla stoploss, takeprofit dupla, string comentário = NULL, magia int = 0, datetime expiração = 0, cor arrow_color = CLR_NONE) (observe que aqui e mais adiante, nos referimos a função header, e não a um exemplo de como usar função chamada em um programa). Vamos considerar em mais detalhes o que essa função consiste em. OrderSend é o nome da função. A função retorna o número de bilhete ( "ticket" é o número exclusivo de uma ordem) que está associado ao fim do comércio por servidor, ou -1, se o comércio pedido foi rejeitado pelo servidor quer o cliente ou o terminal. A fim de obter informações sobre os motivos da rejeição do pedido do comércio, deve usar a função GetLastError () (a seguir iremos considerar alguns dos erros mais comuns). símbolo é o nome da negociados segurança. Cada símbolo corresponde com o valor de uma variável string. Por exemplo, para o par de moeda euro / dólar, este valor é "EURUSD". Se a ordem é estar aberto para um símbolo perdoadas, então este parâmetro pode ser especificado explicitamente: "EURUSD", "EURGBP", etc, no entanto, se você for usar o Consultor Especialista na janela de qualquer outro símbolo, você pode utilize a função padrão Symbol (). Esta função retorna uma string valor que corresponde com o nome do símbolo, na janela de onde o EA ou script está sendo executado. cmd é o tipo de operação. O tipo de operação pode ser especificado como uma constante predefinida ou o seu valor, e de acordo com o tipo de comércio. volume é a quantidade de lotes. Por ordens do mercado, tem de se verificar a conta para a suficiência. Para encomendas pendentes, a quantidade de lotes não é limitado. o preço é o preço abertas. É especificado de acordo com os requisitos e limitações aceito para fazer trades (ver Despacho Características e normas relativas à elaboração de Ofícios). Se o preço requerido
para a abertura do mercado de encomendas não foi encontrada no preço rosca ou se ela tem bastante desatualizado, o comércio pedido é rejeitado. No entanto, se o preço está desatualizado, mas presente no segmento preço e se o seu desvio em relação ao actual preço oscila dentro do valor de derrapagem, este comércio pedido será aceite pelo cliente e enviados para o terminal server comércio. derrapagem é o máximo permitido desvio da ordem requerida abrir preço a partir do preço de mercado para mercado encomendas (pontos). Esse parâmetro não é processada para a colocação de encomendas pendentes. stoploss é solicitado a fechar preço que determina a perda máxima permitida para o dado do comércio. É definida de acordo com os requisitos e limitações aceito para fazer trades (ver Despacho Características e normas relativas à elaboração de Ofícios,Requerimentos e Limitações em Making Ofícios). takeprofit é solicitado a fechar preço que determina o máximo de lucro para o comércio dado. É definida de acordo com os requisitos e limitações aceito para fazer trades (ver Despacho Características e normas relativas à elaboração de Ofícios,Requerimentos e Limitações em Making Ofícios). comentário é o texto do despacho comentário. A última parte do comentário pode ser modificado pelo comércio servidor. Magia é o número mágico da ordem. Pode ser usado como o identificador de usuário definido ordem. Em alguns casos, é a única informação que ajuda você a descobrir mais sobre o que a ordem pertence a um ou outro programa que abriu ela. O parâmetro é definido pelo usuário, seu valor pode ser a mesma ou outra do que o valor deste parâmetro de outras ordens. vencimento é a data em que expira ao fim. Tão logo este dia chegar, enquanto se aguarda a ordem será fechada automaticamente do lado do servidor. Em alguns servidores comerciais, pode haver uma proibição de fixação da data de expiração para encomendas pendente. Neste caso, se você tentar definir um valor diferente de zero do parâmetro, o pedido será indeferido. arrow_color é a cor da abertura seta no gráfico. Se esse parâmetro está ausente ou se o seu valor é CLR_NONE, abrindo a seta não é mostrado no gráfico de todo. Em alguns servidores comerciais, pode haver um limite definido para o montante total das encomendas pendentes e abertos. Se este limite for excedido, qualquer pedido que implica a abertura comercial no mercado uma ordem ou a colocação de uma ordem pendente será rejeitada pelo servidor de trocas.
Abertura ordena mercado A função OrderSend () pode no início parecem ser demasiado complicado. Contudo, todos os parâmetros considerados são bastante simples, útil e pode ser utilizado com sucesso em sua negociação. A fim de ver isso por nós mesmos, vamos considerar a variação mais simples de como o comércio OrderSend função () é usado para abrir um mercado encomenda. Primeiro de tudo, devemos notar que a função OrderSend () tem parâmetros predefinidos (ver Função Chamada e Função Descrição e Operador de "regresso"). Isto significa que esta função pode ser usada em um modo simplificado usando o mínimo exigido conjunto de parâmetros. Esses parâmetros são os seguintes: símbolo é um parâmetro necessário, porque precisamos de saber para onde a abrir o fim. Deixa o nosso script implicam a possibilidade de abrir uma janela do símbolo em qualquer ordem. Nesse caso, vamos substituir a função padrão Symbol () como esse parâmetro;
cmd - por exemplo, vamos abrir uma Comprar fim; neste caso, vamos precisar parâmetro OP_BUY; Volume - podemos especificar qualquer valor permitido pelas regras, vamos abrir uma pequena encomenda, por exemplo, de 0,1 lote; Preço - a abrir preço para a ordem é Comprar Pergunte preço; derrapagem normalmente é especificada como pontos 0-3. Vamos precisar 2; stoploss - ordens de stop podem ser colocados a uma distância que não é mais estreita do que a distância mínima permitida, normalmente 5 pontos (ver Requisitos e Limitações em Making Trades); vamos parar de colocar encomendas, a uma distância de 15 pontos de fechar o preço, a saber: Oferta - 15 * Point; takeprofit - vamos parar de colocar encomendas, a uma distância de 15 pontos de fechar o preço, a saber: Lance + 15 * Point; Abaixo está o script mais simples, simpleopen.mq4, que se destina à abertura Comprar um fim: //------------------------------------------------ -------------------/ / Simpleopen.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ -------------------int start () / / Especial função start () (/ / Abertura COMPRAR OrderSend (Symbol (), OP_BUY, 0,1, Ask, 3, Bid - Ponto 15 *, * Ponto de lance + 15); retorno; / / Sair start () ) //------------------------------------------------ -------------------Se você lançar esse script de execução, ele vai trabalhar, na maioria dos casos. O script consiste de uma função especial que contém a ordem de abertura função OrderSend () eo operador "regresso". Vamos descrever a execução de programa algoritmo linhas e eventos relacionados a isso. 1. O usuário tem o script anexado ao símbolo janela, arrastando o script nome com o botão do mouse a partir do "Navigator" janela de terminal do cliente na janela do símbolo, para o qual ele ou ela pretende abrir um mercado de 0,1 para Comprar lote e com ordens de stop que se encontram a uma distância de 15 pontos entre o preço de mercado. 2. No momento do engate do script para a janela do símbolo, o cliente terminal é passar o controle (apenas pelo lançamento) ou a função especial iniciar () (brevemente aqui, devemos lembrar que o início () de um script é lançado no momento de prender o script para a janela do símbolo, considerando que o início () de uma AE é lançada no momento em que a aproximação de rendimentos para assinalar o símbolo). 3. No quadro da execução da função especial start (), o controlo é passado para a linha que chama o fim abertura função: OrderSend (Symbol (), OP_BUY, 0,1, Ask, 3, Bid - Ponto 15 *, * Ponto de lance + 15); Antes da execução desta função, o programa calcula os valores de todos os parâmetros formais: 3.1. Nós acompanha o script para a janela de Eur / USd.In presente caso, a norma função Symbol () irá retornar o valor da seqüência EURUSD. 3.2. Deixe Pergunte Bid = = 1,2852 e 1,2850, a partir do momento de pôr essa função.
3.3. O valor de StopLoss, neste caso, será: 1.2850-15 * 0,0001 = 1,2835, enquanto que TakeProfit = 1,2865. 4.Execution da função OrderSend (): 4.1. A função comercial formado um pedido de abertura de um pedido neste sentido e passaram para o cliente de terminal. 4.2. A função passou o controle para o cliente terminal em simultâneo, com o passar do comércio pedido, pelo que o programa foi interrompido execução. 4.3. O cliente terminal controlado o comércio recebeu pedido. Que ele não detectar qualquer parâmetros incorretos, por isso ele enviou o pedido para o servidor. 4.4. O servidor recebeu o comércio pedido, verificou-lo, não detectou quaisquer parâmetros incorretos, e decidiu executar o pedido. 4.5. O servidor executa o pedido, fazendo uma operação em seu banco de dados e enviou informações sobre o que executa a solicitação do cliente terminal. 4.6. O terminal cliente que recebeu a informação sobre o comércio último pedido foi executado, este evento exibido na janela do terminal e na janela do símbolo, e devolveu o controle para o programa. 4.7. Depois de recebido o controle, o programa continuou funcionando a partir da localização, o controlo a partir do qual já tinha sido transferido para o cliente terminal (e às quais tinha sido devolvida mais tarde). Note que não foram realizadas ações no programa começa a partir do passo 4.2 através passo 4.7 - o programa estava no modo de espera de resposta do servidor. 5. O controle do programa é passado para o próximo operador - o operador "regresso". 6. A execução do operador "regresso" resulta em sair da função start () e, portanto, no encerramento da execução do programa (que deve ser lembrado que scripts concluir o seu trabalho depois de terem sido executadas) - o controle é retornado para o cliente terminal. Assim, o script tem cumprido a sua finalidade: Comprar com o intuito parâmetros predefinidos constitui aberta. A utilização de scripts é muito conveniente, se você precisa executar um pequeno tempo de uma operação, neste caso, o uso de um script é bastante razoável. De acordo com o passo 4.6., O comerciante pode ver a ordem na tela.
Fig. 81. Colocados por ordem script simpleopen.mq4. Os eventos não são ordenados conforme indicado acima. É possível que o comércio pedido é rejeitado pelo cliente ou pelo terminal server. Vamos tentar fazer algumas experiências, por exemplo, mudar o
símbolo denominação: especificará "GBPUSD" explicitamente (isto é perfeitamente admissível). Nós vamos obter um programa com o campo de utilização limitada: int start () / / Especial função start (/ / Abertura COMPRAR OrderSend ( "GBPUSD", OP_BUY, 0,1, Ask, 3, Bid - Ponto 15 *, * Ponto de lance + 15); retorno; / / Sair start () ) Vamos lançar o script na mesma janela do símbolo câmbio Euro / Dólar. O script foi destinada a abrir uma janela no fim de GBP / USD. No entanto, depois de ter sido anexada à janela do Eur / USD, nenhuma ordem foi aberta na janela de GBP / USD. Uma desvantagem de tais programas é a sua limitação funcional. Neste caso, uma vez que acompanha o script para a janela do símbolo, o utilizador está apenas à espera de ordem abertura. No entanto, o intuito não é aberto. O usuário não tem conhecimento do motivo por que razão é tão: ou ele é causado pelo algoritmos um erro no programa ou o código comercial pedido está "perdido" pelo caminho para o servidor, ou o comércio pedido foi rejeitado pelo cliente terminal muito tempo atrás (pensava que o usuário ainda está à espera), ou existe outro motivo. A fim de proporcionar ao usuário (e, o que também é muito importante, o programa) com as informações sobre os eventos relacionados com a execução do pedido comércio, é necessário tratar os erros. Erro de Processamento Uma importante propriedade do cliente terminal é que, se ocorrer um erro durante a execução de um aplicativo, o cliente terminal não pode parar a execução do programa. Erros são geralmente causados pela imperfeição do algoritmo usado na inscrição. Em alguns casos, os erros são causados por alguns externos (como as relacionadas com o programa) fatores. Os internos são causas de erros quaisquer violações dos requisitos MQL4 ou das regras de negociação, por exemplo, utilizando preços inválido. As causas externas são aquelas que não estejam relacionadas com o programa aplicativo, por exemplo, conexão interrompida. Se ocorrer um erro na execução de um programa, o programa continuará sendo executado, ao passo que o cliente terminal vai gerar o código de erro valor disponível para o programa através da função GetLastError (). Função GetLastError () int GetLastError () A função retorna o código do erro ocorrido recentemente, em seguida, o valor da variável especial Last_Error que armazena o código do último erro será zeroized. A posterior GetLastError () chamada irá retornar 0. A seguir, vamos identificar todos os erros que ocorrem por esse código. Vários erros podem ocorrer durante a execução de um programa; função GetLastError () nos permite obter o valor do código para apenas um deles, o mais tardar erro, é por isso que todas as vezes em que precisamos dessa informação, é recomendado usar função GetLastError () Imediatamente após o programa linhas, em que o erro pode ocorrer. Erro 130. Inválido stop encomendas O último considerado script não analisar erros, de modo que o usuário permanece ignorante sobre os
resultados da execução do despacho de abertura de função. Na variação simples de usar a função GetLastError (), o programa pode analisar um erro e basta informar o usuário sobre isso. Se você lançar script confined.mq4 para execução na janela de câmbio Euro / Dólar, um erro irá ocorrer. //------------------------------------------------ ------------------------/ / Confined.mq4 / / O código deve ser usado apenas para fins educacionais . //------------------------------------------------ ------------------------int start () / / Especial função start (/ / Abertura COMPRAR OrderSend ( "GBPUSD", OP_BUY, 0,1, Ask, 3, Bid - Ponto 15 *, * Ponto de lance + 15); Alerta (GetLastError ()); / / Mensagem de erro retorno; / / Sair start () ) //------------------------------------------------ ------------------------Acrescentou apenas um, mas muito informativas em linha este script: Alerta (GetLastError ()); / / Mensagem de erro Função GetLastError () retorna o código do último erro, que Alert () é usado para exibir esse valor na tela. Após o scriptconfined.mq4 foi anexada à janela do símbolo câmbio Euro / Dólar, o script será executado, o que resultará em que o usuário verá a seguinte mensagem:
Fig. 82. Código de erro obtidas durante a execução de scripts confined.mq4 no EUR / USD janela. Você pode encontrar nos apêndices códigos de erros que podem ocorrer na execução de um programa. Neste caso, o erro 130 (inválido stop orders) ocorreu. Isto significa que os valores dos parâmetros formais utilizados na função OrderSend () não cumpram os limites especificados nos Requisitos e Limitações em Making Trade. Mediante uma visão mais próxima, podemos ver o motivo que causou o erro: os valores actuais de mercado e preços de lance Pergunte são tomadas a partir da janela do símbolo, para o qual o script está anexado, ou seja, a partir da janela de câmbio Euro / Dólar. No entanto, estes valores são utilizados para formar um pedido de comércio GBP / USD. Como resultado, ao preço actual de GBP / USD, Pergunte = 1,9655, o valor de TakeProfit para o recéminaugurado mercado fim acaba por ser igual a (para câmbio Euro / Dólar Bid = 1,2930) 1,2930 +15 * 0,0001 = 1. 2945, que é consideravelmente inferior ao valor mínimo permitido, ou seja, é inválido. Neste caso, um erro ocorreu algorítmica. A fim de corrigir isso, você deve usar os valores corretos de preços símbolo. Você pode obter esses valores usando a função MarketInfo (). Script improved.mq4 ordens de mercado que se abre para GBP / USD pode ser iniciado em qualquer
janela símbolo: //------------------------------------------------ ----------------------------/ / Improved.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ ----------------------------int start () / / Especial função start ( = MarketInfo lance duplo ( "GBPUSD", MODE_BID); / / Pedido de o valor do lance = MarketInfo perguntar duplo ( "GBPUSD", MODE_ASK); / / Pedido de o valor da Peça duplo ponto MarketInfo = ( "GBPUSD", MODE_POINT); / / Pedido de Ponto / / Abertura COMPRAR OrderSend ( "GBPUSD", OP_BUY, 0,1, pergunte, 3, lance - Ponto 15 *, + 15 * compra Point); Alerta (GetLastError ()); / / Mensagem de erro retorno; / / Sair start () ) //------------------------------------------------ ----------------------------O erro acima não ocorre na execução desse script, de modo a sua execução irá resultar em que mostra o correspondente mensagem: 0 (zero). Isto significa que a função GetLastError () retornou o valor de 0, ou seja, não foram detectados erros na execução do comércio pedido pelo cliente terminal. Vamos considerar também alguns outros erros comuns. Por isso, vamos voltar à ideia de abrir uma ordem usando um script na mesma janela, para o qual o script está anexado. Erro 129. Preço inválido Em alguns casos, um simples erro ocorre - o valor errado das duas apóstrofo maneira como está especificado o preço abertas.Comprar ordens são conhecidas no mercado (ver Requisitos e Limitações em Making Ofícios), a ser inaugurado em Pergunte ao preço. Abaixo está mostrado o que acontece se, por engano, especificar o preço de lance no script mistaken.mq4: //------------------------------------------------ -----------------------/ / Mistaken.mq4 / / O código deve ser usado apenas para fins educacionais . //------------------------------------------------ -----------------------int start () / / Especial função start (/ / Abertura COMPRAR OrderSend (Symbol (), OP_BUY, 0,1, Lance, 3, Bid - Ponto 15 *, * Ponto de lance + 15); Alerta (GetLastError ()); / / Mensagem de erro retorno; / / Sair start () ) //------------------------------------------------ -----------------------Antes de enviar o pedido ao comércio do servidor, o cliente terminal analisa se os valores do preço solicitado e obedecer às ordens de stop valores permitidos. Durante esta verificação, solicitou a abertura de vista dos preços será detectado como inválido, o cliente assim o terminal não vai enviar o comércio pedido para o servidor para execução, ea função GetLastError () retornará o valor de 129 (consulte Códigos de erro). A execução do script irá resultar no surgimento da correspondente
mensagem de erro:
Fig. 83. Erro 129 (preço válido) na execução de mistaken.mq4.
Erro 134. Sem dinheiro suficiente para fazer um comércio Resultado semelhante (erro 134) será obtida, se não há dinheiro suficiente na conta gratuita para abrir uma ordem. Você pode saber sobre a quantidade de dinheiro necessária para abrir gratuitamente 1 lote de compra de cada símbolo utilizando a função MarketInfo (symbol_name, MODE_MARGINREQUIRED). O tamanho padrão de um lote para o mesmo símbolo pode variar em diferentes centros que tratam. A quantidade necessária de bens livres para a abertura de um lote-ordem é inversamente proporcional à quantidade de prestada a alavanca. Ao mesmo tempo, o custo de 1 ponto em divisas para o depósito de um símbolo não diz respeito à alavancagem prestados. Tabela 3. Possíveis combinações de 1-lote 1-ponto Custo e custo (depósito moeda é E.U. dólar). Lidar Center 1 Comprar Vender 1pt
Lidar Center 2 Comprar Vender 1pt
EUR / 1296,40 1296,20 10,00 1296,50 USD GBP / USD 1966,20 1966,00 10,00 1376,48 AUD / 784,40 784,20 10,00 1569,20 USD USD / JPY 1000,00 1000,00 8.29 1000,00 USD / CHF 1000,00 1000,00 8.02 1000,00 EUR / CHF 1296,40 1296,20 8.02 1296,35 Os preços são indicados como de 16.12.2007.
Lidar Center 3 Comprar Vender 1pt
1296,20
10,00
1000,00 1000,00
10,00
1376,20
7,50
1000,00 1000,00
10,00
1568,40
20,00
1000,00 1000,00
10,00
1000,00 1000,00 1296. 35
8.29 8.02 8.02
1000,00 1000,00 1000,00 1000,00 1000,00 1000,00
8.29 8.02 8.02
Vamos examinar brevemente alguns métodos comuns de cálculo do custo do lote 1 e de 1 ponto. Lidar Center 1 (mais comum) Para os símbolos que têm dólares reciprocamente, o custo de 1 lote é igual ao preço corrente da correspondente citação, em ambos os sentidos, multiplicado por 1000, enquanto que o custo de 1 ponto é igual a US $ 10. Para os símbolos que têm os seus dólares como numerador, o custo de 1 lote é igual a US $ 1000,00,
enquanto que o custo de 1 ponto é inversamente proporcional à cotação actual e igual a 1 / (Bid). Por exemplo, para USD / CHF, em lance = 1,2466, o custo de 1 ponto é 1 / 1. 2466 = 8,02. Para atravessar taxas, o custo do lote 1 é calculada da mesma forma que o do numerador moeda, enquanto o custo de 1 ponto é calculada da mesma forma que para que o denominador moeda. Por exemplo, para EUR / CHF, o Custo do lote 1 é 129,40 (como, por EUR / USD), enquanto que o custo do lote 1 é 8,02 (como por USD / CHF). Lidar Center 2 Em alguns centros que tratam, considerando-se a mesma regra de cálculo de custos, os valores dos custos pode ser diferente para alguns símbolos. Por exemplo, o custo de 1 lote eo custo de 1 ponto pode ser aumentada ou diminuída proporcionalmente.Por exemplo, este fator pode ser 0,75, para GBP / USD, que é 2,0 para AUD / USD. A representação dos valores custo não resultar em qualquer mudança econômica, em tais casos, você só tem de considerar este recurso especial ao calcular os custos de suas ordens. Você também deve prestar atenção ao fato de que o lote 1-custos de compra e venda de activos na cruz taxas são as mesmas. Lidar Center 3 também existem centros que tratam definir o custo do lote 1, R $ 1000,00 por qualquer símbolo. Ao mesmo tempo, o custo de 1 ponto permanece proporcional ao preço corrente. Isto implica uma configuração especial para alavancar cada símbolo. 1-ponto Custo de todos os símbolos que são cotados como não relacionados com USD semper mudanças proporcionalmente ao custo do símbolo especificado mutuamente. Geralmente, não podem existir outros princípios de construção de valores custo. É escusado será dizer que, antes de começar a verdadeira negociação, você deve encontrar-se sobre o método de cálculo para qualquer tratamento específico center e considerar este método na sua codificação. Margem Livre Na codificação, é muito importante considerar o princípio da livre formação de activos. Margem livre (ativo) é a quantidade de dinheiro que está disponível para fazer negócios. Vamos considerar um exemplo. Deixe Saldo ser 5000,00, não há abertura ordena no terminal. Vamos abrir uma ordem de 1 lote Comprar em lidar center 3. A seguinte regra é indicado no tratamento center 3: Se diferentemente ordens são direcionadas mercado aberto para um símbolo, o menor custo de um integrado direcção-encomendas é liberado para comércio e aumenta o montante de activos livres (esta regra não é aplicável a todos os centros que tratam). A janela do terminal irá mostrar as informações sobre a forma aberta. Observe que a margem torna 1000,00, é -30,00 fim lucrativo, portanto, o montante dos activos livres (margem livre) faz 5000-1000-30 = 3970,00:
Fig. 84. Comprar no fim da janela do terminal. Vender após uma ordem do mesmo valor, foi aberta, livre margem de aumento. Integrado O menor custo de uma direcção-mercado dá 1000.00 encomendas, pelo que a margem livre vai aumentar em 1000,00. Na fig. 85, você pode ver a situação de forma diferente quando as encomendas dirigidas custar o mesmo valor, de modo a totalidade da soma das ordens de custos é liberado para negociação.
Fig. 85. Comprar e Vender encomendas na janela do terminal. Vender após uma ordem de menor custo, foi aberta, livre margem aumentará, também. Nesse caso, o menor custo de uma integrados-direção do mercado torna 700,00 encomendas, pelo que a margem livre vai aumentar em 700,00, enquanto que a margem torna o diferença entre os custos integrados de encomendas dirigidas de forma diferente (Fig. 86).
Fig. 86. Comprar e Vender encomendas na janela do terminal. Se uma ordem Vender mais de 0,1 lote é aberto (custo 100,00), o menor custo de um integrado direcção-encomendas do mercado torna 700,00 + 100. 00 = 800,00. Assim, a margem (em comparação com a situação em que apenas uma ordem Comprar é aberto) diminui em 800,00. Em comparação com a situação mostrada na Fig. 86, a margem diminui, enquanto que os aumentos de capital por 100,00 (veja fig. 87).
Fig. 87. Comprar e Vender encomendas na janela do terminal. Margens livre mostrado na fig. 86 e fig. 87 diferem umas das outras por mais de 100,00, já que o lucro da abertura ordena integrada mudou com a mudança no preço atual (a diferença torna 8,00).
Se fizermos com manipulações semelhante em outro centro que tratam, é fácil ver que a ordem acima de formar o valor da margem livre não é mantida. Por algumas centers lidar com a seguinte regra é eficaz: Abertura do mercado quaisquer ordens não libera o capital próprio ou aumentar a margem livre.Abertura do mercado de encomendas aumenta o capital próprio no montante que excede o custo integrado de forma diferente no mercado ordens dirigidas para um símbolo (a regra não se aplica em todos os centros que tratam). Por exemplo, se você já foi aberta uma ordem de 4 lotes para Comprar USD / JPY em lidar center 2, os montantes de fundos próprios e margem livre não mudará a abertura de um lote 4-Vender ordem.
Fig. 88. A presença das ordens dirigidas de forma diferente não libera eqüidade. Pode fazer cálculos para saber se a atual capital próprio é suficiente para a abertura de uma ordem. Você também pode usar a função AccountFreeMarginCheck () que retorna o valor da margem livre para permanecer no mercado após a abertura de uma ordem com certa quantidade de lotes por um determinado símbolo. Se o valor devolvido for igual ou superior a 0, há dinheiro suficiente na conta. Se for inferior a 0, a ordem deste volume para este símbolo e não pode ser aberta, o cliente terminal irá retornar erro 134. A fim de conhecer as condições oferecidas pelo centro tratam eo montante da margem livre exigido para a abertura de um despacho com o volume do lote 1, você pode usar um script simples, conditions.mq4: //------------------------------------------------ ------------------------/ / Conditions.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ ------------------------int start () / / Especial função start ( Alerta (Symbol (), "Vender =", AccountFreeMargin () / / Na venda - AccountFreeMarginCheck (Symbol (), OP_SELL, 1)); Alerta (Symbol (), "Comprar =", AccountFreeMargin () / / Ao comprar - AccountFreeMarginCheck (Symbol (), OP_BUY, 1)); retorno; / / Sair start () ) //------------------------------------------------ ------------------------Aqui, a expressão de AccountFreeMargin () - AccountFreeMarginCheck (Symbol (), OP_SELL, 1) nos permite calcular a diferença entre a margem disponível livre e gratuito à margem que permanecerá após a abertura da ordem.
Se começarmos este script para efeitos de execução, quando não existirem no mercado ordens do terminal, podemos obter a quantidade necessária de equidade actualmente a estar disponíveis e suficientes para a abertura de um despacho com o volume do lote 1 para a compra e de venda:
Fig. 89. Lote 1-custo para os diferentes símbolos, obtida usando conditions.mq4. Se vamos lançar o script conditions.mq4 para execução na janela do símbolo, para os quais existem ordens de mercado aberto, podemos obter outros valores, isso depende dos métodos de cálculo aceites em um ou outro tratamento center. Outros erros e Função MarketInfo () Existem outras limitações relacionadas à determinação dos valores dos parâmetros da função OrderSend (). Este é o valor máximo e mínimo para o preço etapa, o máximo eo mínimo valor despacho preço, etc A utilização da função MarketInfo () permite-lhe obter informações sobre diversos símbolos que são mostrados na janela "Market Watch" do cliente terminal. Função MarketInfo () MarketInfo dupla (
string símbolo, tipo int)
A função retorna várias informações sobre símbolos listados na janela "Market Watch" do cliente terminal. Peças de informação sobre o atual símbolo são armazenadas em variáveis previamente definidas. Parâmetros: símbolo - o nome de um símbolo; Tipo - pedido identificador que determina o tipo de informação que deve ser devolvido. Pode ser qualquer valor desses identificadores do pedido (ver Função MarketInfo Identifier). Alguns erros podem ocorrer para as razões do lado do servidor. Por exemplo, nas condições transientes de preços, o seu corretor pode aumentar a distância mínima que limita colocação de ordens de paragem e de encomendas pendentes. Além disso, em um mercado calmo, o corretor pode diminuir esta distância novamente. Assim, os valores de alguns parâmetros podem ser alteradas a qualquer momento. Para o programa para operar em uma forma estável, com a quantidade mínima de pedidos rejeitados, você deve atualizar os parâmetros de informação ambiental utilizada pelo programa utilizando as funções MarketInfo () e RefreshRates () antes de executar a função OrderSend ().
Um exemplo de um script simples que abre uma ordem Comprar custando 35% da margem livre, com alguns valores predefinidos de ordens stop (openbuy.mq4).
//------------------------------------------------ -----------------------------/ / Openbuy.mq4 / / O código deve ser usado apenas para fins educacionais . //------------------------------------------------ ------------------------- 1 -int start () / / Especial função start ( Dist_SL int = 10; / / SL Preset (pt) Dist_TP int = 3; / / Preset TP (pt) Prots duplo = 0,35; / / Percentagem da margem livre Symb seqüência = Simbolo (); / / Símbolo //------------------------------------------------ ------------------------- 2 -while (true) / / ciclo que se abre uma ordem ( int Min_Dist = MarketInfo (Symb, MODE_STOPLEVEL); / / Min. distância Min_Lot duplo = MarketInfo (Symb, MODE_MINLOT); / / Min. volume Etapa dupla MarketInfo = (Symb, MODE_LOTSTEP); / / Passo a mudança lotes Livre AccountFreeMargin duplo = (); / / Margem Livre One_Lot duplo = MarketInfo (Symb, MODE_MARGINREQUIRED); / / Custo por 1 lote //------------------------------------------------ -------------------- 3 Lote duplo = MathFloor (* Livre Prots One_Lot Passo) * Etapa; / / Lots if (Lot 0) / / Já está!:) (
Alerta ( "Compre fim Aberto", ticket); break; / / Sair ciclo ) //------------------------------------------------ -------------------- 8 int Erro = GetLastError (); / / Falha: ( switch (erro) / / Overcomable erros ( caso 135: Alerta ( "O preço foi alterado. Repetindo .."); RefreshRates (); / / Atualização de dados continuar; / / Na próxima iteração caso 136: Alerta ( "Não preços. À espera de um novo carrapato .."); while (RefreshRates () == false) / / Até um novo carrapato Sono (1); / / Ciclo de atraso continuar; / / Na próxima iteração caso 146: Alerta ( "Trading subsistema está ocupado. Repetindo .."); Sleep (500); / / Solução Simples RefreshRates (); / / Atualização de dados continuar; / / Na próxima iteração ) switch (erro) / / Crítica erros ( case 2: Alerta ( "Common erro."); break; / / Sair 'mudar' caso 5: Alerta ( "desactualização versão do cliente de terminal."); break; / / Sair 'mudar' caso 64: Alerta ( "A conta está bloqueada."); break; / / Sair 'mudar' caso 133: Alerta ( "Trading proibido"); break; / / Sair 'mudar' default: Alerta ( "Ocorreu erro ", Erro); / / Outras alternativas ) break; / / Sair ciclo ) //------------------------------------------------ ------------------------- 9 -Alert ( "O script já completou suas operações --------------------------"); retorno; / / Sair start () ) //------------------------------------------------ ------------------------- 10 -O script consiste de uma função especial iniciar () (blocos 1-10). No bloco 1.2, os valores são fixados, segundo o qual a ordem deve ser aberto. O bloco 2.9 representa ciclo enquanto operador (), em que todos os cálculos necessários são realizados. Este ciclo está incluído no código para permitir que o programa faça várias tentativas para abrir o fim. No bloco 2.3, as variáveis de ambiente são atualizados. Nos blocos 3-4-5-6, a quantidade de lotes e os preços solicitados são calculadas as ordens de stop. No bloco 7-8-9, os erros são processados. No bloco 9.10, a mensagem impressa é que o script tenha completado as suas operações. Vamos considerar algumas características específicas de um programa indicativo. É fácil ver que o comércio pedido é formado em bloco 6.7. No bloco 3.4, a quantidade de lotes é calculado. Por outro lado, considera a situação quando a margem livre disponível é insuficiente para sequer abrir uma ordem com uma quantidade mínima dos lotes. Esta é a razão pela qual, no bloco 3-4, depois de imprimir a mensagem sobre dinheiro suficiente, vamos sair do ciclo 2.9 utilizando o operador 'pausa'. O controle é passado para bloquear a 9.10, eo script completa suas operações. A mensagem no bloco 9 é desnecessário. É dada aqui apenas para ajudar os usuários a encontrar o código de cauda ou cabeças no script - quando é o fim do programa de operações e quando é a pausa provocada pelos atrasos na rede ou no servidor.
Se a margem livre é suficiente para a abertura da ordem, o controle será passado ao bloco 4.5, e depois para o bloco 5.6.Nesses blocos, não há saída ciclo. Isto significa que, para qualquer distância mínima fixada pelo corretor, haverá uma paragem níveis correspondentes encontrados. No bloco 1-2, 3 pontos foram escolhidos para TP pelo design. A maioria dos corretores definir a distância mínima de 5 pontos. No bloco 5.6, o programa irá descobrir que o valor predefinido é menor do que o permitido um. O programa irá definir o valor de tal ordem para parar de preço que não é contrário à limitação. em seguida, o controlo é passado para bloquear o 6.7 para abri uma ordem. Na primeira linha deste bloco, a mensagem é impresso. O comércio pedido é formado apenas na segunda linha. Uma pergunta se coloca: Porque é que estamos formando cerca de declarar um pedido antes que ele é realmente formado? Nós poderíamos dar as instruções em primeiro lugar e, em seguida, informa o usuário sobre isso. A resposta a esta questão está intimamente relacionada com a tecnologia de enviar o pedido ao terminal e, em seguida, o cliente para o servidor (consulte a fig. 66). No nosso caso, o pedido comércio é formado em função da OrderSend () especificados na parte direita da cessão operador. O comércio pedido, como tal, é criada e enviada para o servidor na função, enquanto que a cessão operação será executada no operador após a cessão do servidor retornou uma resposta sobre a "sorte" do pedido. Assim, a única possibilidade de informar o usuário sobre o início dos eventos relacionados com a solicitação é para mostrar a mensagem antes de a cessão operador, na parte direita da função que o comércio seja especificado. Mais cedo ou mais tarde, o cliente terminal vai passar o controle de volta para o programa, a cessão em bloco 6.7 operador será executado, o que resultará em que o "ticket" terá um valor variável, e que o controlo será passado mais - Erro ao analisar-bloco 7-8-9. Se o intuito é aberta no servidor, o número (bilhete), da abertura encomenda será atribuído à variável «bilhete». Neste caso, significa que o script tenha cumprido a sua missão, e não há necessidade de o programa a continuar as suas operações. No bloco 7-8, usamos o operador 'pausa' para sair do ciclo, enquanto (). O controle é passado para bloquear 9-10 (fora do ciclo), o programa e completar as suas operações. No entanto, se a tentativa de abrir um fim falhar, o controle será passado ao bloco 8.9 de erro analisando. Dois tipos de erros são considerados aqui: aqueles que ainda permitem a esperança para o sucesso da abertura da ordem e os que, a ocorrência de forma inequívoca que a denúncia do Execução do programa. A variável 'Erro' é atribuído com o código do último erro, neste caso, o erro de que tenha sido devolvido pelo servidor ou pelo cliente terminal em execução da função OrderSend (). No primeiro operador 'mudar' bloco de 8-9, overcomable erros são considerados. Cada erro neste grupo é processado de forma diferente. Por exemplo, se o preço mudou (Erro 135), é suficiente apenas para atualizar os parâmetros ambientais utilizando RefreshRates () e repetir a tentativa de abrir um fim. Se o erro "Não preços" (Erro 136) ocorre, não há qualquer sentimento de voltar a enviar a solicitação para o servidor de comércio. Neste caso, devemos esperar por um novo carrapato para rendimento (não há preços no servidor, neste momento, ambos) e, só depois disso, para abrir uma nova tentativa fim. Esta é a razão pela qual existe um ciclo no bloco espera que os processos de erro 136. Este ciclo pode ser interrompido em espera, logo que um novo carrapato rendimentos. Nós saída do operador switch () usando o operador "continuar" que quebram a corrente iteração do ciclo, enquanto () e inicia um novo. Erros críticos são tratados de outra maneira. Se tal ocorrer um erro, o programa irá apenas informar o usuário sobre isso e encerrar operações. Para esta finalidade, nós usamos o operador 'pausa' (o último em um bloco 8-9), enquanto que rompe o ciclo (), o que resulta no encerramento do programa. Devemos notar particularmente que, neste exemplo, não consideramos todos os erros, sem exceções, pelo design. Neste caso, não estamos visando proporcionar ao usuário com um programa ready-made. É muito importante que o programador ele ou ela mesma analisa outros erros e decide soberanamente o que mais erros e de que forma devem ser tratados no programa. Ao mesmo tempo, alguns erros não
devem ser processados, porque o programa é construído de tal forma que ela não implica a ocorrência de alguns erros, por exemplo, no caso, dos erros 129 e 130 .. No exemplo acima, existe um pequeno erro algorítmica que não pode ser encontrado nem na compilação nem no terminal do cliente, nem sobre o servidor. Pegue qualquer programa códigos com um grão de sal, a despeito de quaisquer autoridades. Anote o código no bloco 4.5: //------------------------------------------------ -------------------------- 4 -if (Dist_SL
Você só deve observar o fato de que os bens necessários para modificar a ordem pendente em um mercado são controladas por um seu suficiência nem pelo cliente ou pelo terminal server. Eles não estão limitados quer. Você pode colocar um fim na expectativa em relação ao montante que muitas vezes ultrapassa o montante de dinheiro disponível em sua conta. Tal ordem pode ser mantida por períodos indeterminados. Quando o preço de mercado atinge o nível do preço requerido para abrir a ordem pendente, haverá uma verificação feita no servidor. Se há dinheiro suficiente na conta para abrir este fim, vai ser modificado em um mercado um (aberta). Se não, ele será excluído. Função WindowPriceOnDropped () Em MQL4, temos um elemento muito importante - podemos determinar programaticamente o símbolo na janela as coordenadas da localização, em que um especialista ou de um script Advisor foi colocado, no caso de terem sido anexados usando uma rato.Por exemplo, podemos obter o valor da penhora de coordenar o script usando a função WindowPriceOnDropped (). WindowPriceOnDropped duplo () A função retorna o valor do preço na ponta da tabela, na qual a EA ou o script foi descontinuado. O valor só será válido, se a EA ou o script foi movido usando uma rato ( 'arrastar e largar'). Este valor não está definido para indicadores personalizados.
Um exemplo de um script simples que abre uma ordem BuyStop custando 35% da margem livre, com alguns valores predefinidos de ordens stop (openbuystop.mq4).
//------------------------------------------------ ----------------------------------/ / Openbuystop.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ ------------------------------ 1 -int start () / / Especial função start ( Dist_SL int = 10; / / SL Preset (pt) Dist_TP int = 3; / / Preset TP (pt) Prots duplo = 0,35; / / Percentagem da margem livre Symb seqüência = Simbolo (); / / Símbolo WindowPriceOnDropped dupla Win_Price = (); / / O script é cair aqui Alert ( "O preço é fixado pelo mouse como Price =", Win_Price); / / Set pelo mouse //------------------------------------------------ ------------------------------ 2 -while (true) / / ciclo que se abre uma ordem ( int Min_Dist = MarketInfo (Symb, MODE_STOPLEVEL); / / Min. distância Min_Lot duplo = MarketInfo (Symb, MODE_MINLOT); / / Min. volume Livre AccountFreeMargin duplo = (); / / Margem Livre One_Lot duplo = MarketInfo (Symb, MODE_MARGINREQUIRED); / / Custo por 1 lote Lote duplo = MathFloor (* Livre Prots One_Lot Min_Lot) * Min_Lot; / / Lots //------------------------------------------------ ------------------------ 3 -Preço duplo = Win_Price; / / O preço é fixado pelo mouse
if (NormalizeDouble (Price, Dígitos) / Se for inferior a permitida NormalizeDouble (* Peça + Min_Dist Point, Dígitos)) (/ / Para BuyStop só! Preço = Peça + Min_Dist * Point; / / Não mais próxima Alerta ( "Mudou o preço: Preço =", Price); ) //------------------------------------------------ ------------------------ 4 -SL = duplo Preço - Dist_SL * Point; / / Convidado de preço SL if (Dist_SL 0) / / Já está!:) ( Alerta ( "Colocado BuyStop ordem", ticket); break; / / Sair ciclo ) //------------------------------------------------ ------------------------ 8 -int Erro = GetLastError (); / / Falha: ( switch (erro) / / Overcomable erros ( caso 129: Alerta ( "Invalid preço. Repetindo .."); RefreshRates (); / / Atualização de dados continuar; / / Na próxima iteração caso 135: Alerta ( "O preço foi alterado. Repetindo .."); RefreshRates (); / / Atualização de dados continuar; / / Na próxima iteração caso 146: Alerta ( "Trading subsistema está ocupado. Repetindo .."); Sleep (500); / / Solução Simples RefreshRates (); / / Atualização de dados continuar; / / Na próxima iteração ) switch (erro) / / Crítica erros ( case 2: Alerta ( "Common erro."); break; / / Sair 'mudar' caso 5: Alerta ( "desactualização versão do cliente de terminal."); break; / / Sair 'mudar' caso 64: Alerta ( "A conta está bloqueada ".); break; / / Sair 'mudar' caso 133: Alerta ( "Trading fobidden"); break; / / Sair 'mudar' default: Alerta ( "Ocorreu erro ", Erro); / / Outras alternativas )
break; / / Sair ciclo ) //------------------------------------------------ ------------------------------ 9 -Alert ( "O script tenha completado as suas operações ---------------------------- "); retorno; / / Sair start () ) //------------------------------------------------ ------------------------------ 10 -A estrutura do script openbuystop.mq4 é construído da mesma forma que a do script openbuy.mq4, portanto, não há necessidade de descrevê-lo em detalhes. Nós apenas dirigir a nossa atenção para as diferenças básicas entre esses programas. O preço, ao nível do que o script foi anexada à janela do símbolo, é determinado na linha: WindowPriceOnDropped dupla Win_Price = (); / / Um script está caído aqui Posteriormente, o valor dessa variável é mantido inalterado durante todo o período de funcionamento do programa. Isso é necessário, se o script não abrir mais de uma ordem. Ao mesmo tempo, toda vez que o script irá calcular o valor solicitado do preço próximo ao local (ao nível dos preços), onde o usuário acompanha script. É fácil ver que, no script openbuystop.mq4, não há verificação de suficiência da margem livre para a abertura de uma ordem, mas há uma verificação de preços a fim aberta (blocos 3-4). Se o valor calculado da variável "Preço não cumpram os requisitos da colocação de uma forma Parar pendentes (ver Despacho Características e normas relativas à elaboração de Ofícios,Requerimentos e Limitações em Making Ofícios), esse valor será recalculado. No bloco de erro de processamento, existem algumas pequenas alterações, bem como: alguns erros não são consideradas, mas os códigos de alguns outros erros são processados. Limitações razoável Que esteja relacionada com a utilização do comércio funções, devemos prestar atenção a algumas limitações mais gerais. Por exemplo, o erro ocorre apenas 146, quando vários programas que fazem comércio pedidos trabalho em uma janela do símbolo.Na nossa opinião, esta prática é permitida, mas não razoáveis. Seria muito mais eficiente para criar e utilizar um programa comercial que iria considerar todas as características especiais de negociação. Se usamos apenas uma negociação programa, é só impossível formar várias trocas pedido simultaneamente. Além disso, todo o algoritmo poderia ser muito melhor organizado de tal programa: considerar a probabilidade de êxito e ofícios re-alocar dinheiro corretamente, de acordo com essa probabilidade. Para realização de transacções, é mais eficiente para usar um especialista Orientador full-escalados, enquanto que um script seria melhor utilizado para o cálculo de tempo de uma ou de algumas informações úteis para a exibição na tela. Ao mesmo tempo, se o operador não usar um especialista Orientador automatizado para negociação, a utilização de scripts acaba por ser mais eficiente do que trabalhando com encomendas usando o painel de controlo do cliente terminal.
Fechando ea exclusão dos despachos Ordena fecho do mercado
Comércio pedidos de fechamento do mercado as ordens são formadas utilizando a função OrderClose (). Função OrderClose () bool OrderClose (int bilhete, os lotes duplos, duplo preço, int derrapagem, color = Cor CLR_NONE) É uma função usada para fechar uma ordem no mercado. A função retorna TRUE, caso o comércio seja realizado com êxito. Ele retorna FALSO, se o negócio falhar. Parâmetros: bilhete - o número único da ordem. lotes - a quantidade de lotes que devem ser fechados. É permitido para especificar um valor que seja inferior ao montante disponível na forma de lotes. Neste caso, se o pedido for comercial executada com êxito, a ordem será fechada parcialmente. Preço - a fechar preço. Este parâmetro é definido de acordo com as exigências e restrições aceites pela realização dos tráfegos (verDespacho Características e normas relativas à elaboração de Ofícios e apêndice 3). Se não existir um preço solicitado disponível para o fechamento do mercado no fim do fluxo de preço ou se ele está desatualizado, este comércio pedido será rejeitado, se o preço está desatualizado, mas o preço encontrado no fluxo e, ao mesmo tempo, a sua desvio em relação ao actual preço oscila dentro do valor de derrapagem, o comércio pedido será aceite pelo cliente e enviados para o terminal server comércio. derrapagem - o máximo permitido desvio do preço requerido para a ordem de fechamento do preço de mercado (em pontos). Cor - a cor do fechamento flecha em um gráfico. Se esse parâmetro não está disponível ou o seu valor é igual ao do CLR_NONE, a seta não será exibido no gráfico. Se o programa contém informações sobre o tipo de ordem a ser fechada, sobre o seu número exclusivo, assim como sobre a quantidade de lotes que devem ser fechados, então é muito fácil de fechar a encomenda. Para isso, você deve usar o programa em código o OrderClose () função chamada com parâmetros predefinidos. Por exemplo, se o número único da ordem Comprar é 12345 e se quiser fechar 0,5 lote, a chamada para a função fechando a ordem pode ser parecido com este: OrderClose (12345, 0,5, Lance, 2); A fim de decidir sobre o que ordena e em que seqüência deve ser encerrada, você tem que ter todos os dados de encomendas em aberto a situação actual. Em MQL4, existe uma série de funções que podem ser utilizados para obter diferentes dados que caracterizam qualquer ordem . Por exemplo, a função OrderOpenPrice () retorna o valor da encomenda abertas preço (ou do preço requerido para encomendas pendentes), a função OrderLots () retorna a quantidade de lotes, a função OrderType () retorna o tipo de ordem, etc Todas as funções que retornam os valores de uma forma característica chamada em sua execução para o fim que foi selecionado pela função OrderSelect (). Função OrderSelect () De forma a obter os parâmetros de qualquer de suas ordens (em qualquer mercado ou pendentes, fechado ou excluído queridos), você deve primeiro selecioná-lo usando a função OrderSelect (). bool OrderSelect (int índice, selecione int, int piscina MODE_TRADES =)
OrderSelect é uma função que seleciona uma ordem para outras operações com ela. Retorna TRUE, se a função é executada com êxito.Caso contrário, retorna FALSE. Parâmetros: Índice - a fim posição ou número, que depende de o segundo parâmetro. escolha - a bandeira do método de selecção. Parâmetro 'selecionar' pode assumir um dos dois valores possíveis: SELECT_BY_POS - no parâmetro 'índice', o número de ordem da lista é retornado (a numeração começa com 0), SELECT_BY_TICKET - no parâmetro 'índice', o número de bilhete (o número de ordem ímpar) é retornado. piscina - a fonte de dados para seleção. O parâmetro 'pool' é utilizado, quando o parâmetro 'selecionar' é igual ao valor das SELECT_BY_POS. O parâmetro 'pool' é ignorado, se a decisão for selecionado pelo número de bilhete (SELECT_BY_TICKET). O parâmetro 'pool' pode assumir de dois valores possíveis: MODE_TRADES (por omissão) - a ordem é selecionada em aberto e encomendas pendentes, ou seja, entre as ordens exibida no "Comércio" da guia "Terminal" janela; MODE_HISTORY - a ordem é selecionado no fechado e suprimiu ordens, ou seja, entre as ordens exibido na "Conta Histórico" do aba "Terminal" janela. Neste caso, a profundidade da história especificado pelo usuário para a exibição das encomendas fechadas e apagadas é importante. A fim de demonstrar o método de usar comércio funções para as ordens de fechamento do mercado, vamos resolver um problema: Problema 28. Escrever um script que fecha uma das ordens de mercado disponíveis na conta. O script execução deve resultar no encerramento da ordem do mais próximo ao local do script anexado ao símbolo janela com o mouse. Suponhamos que há três ordens de mercado aberto, no terminal sinal para o câmbio Euro / Dólar e enquanto se aguarda uma ordem aberta para USD / CHF:
Fig. 90. Exibindo várias ordens para abrir símbolos diferentes na janela do terminal. Devíamos escrever um script que tal possa ser arrastado pelo mouse do "Navigator" janela na janela do símbolo, o que deverá resultar no encerramento de uma das ordens no mercado, a saber, pela ordem que mais se aproxima o cursor (a partir do momento em o usuário disponibilizou o botão do mouse). Na fig. 91, você pode ver as alternativas, na qual o cursor está mais próximo ao fim Vender 4372889. É neste sentido que deve ser fechada, como resultado da execução do script.
Fig. 91. Script closeorder.mq4 usada para fechamento de ordem seleccionada. Para resolver o problema, devemos escolher (utilizando a função OrderSymbol ()) entre todas as ordens apenas aquelas abertas para o símbolo, na janela de onde o script é baixado. Então devemos encontrar a abrir os preços de todas as ordens no mercado selecionado (ou seja, executar os Função OrderOpenPrice () sucessivamente para cada ordem). Conhecendo a fim abrir os preços, podemos facilmente selecionar um deles, que corresponde com o enunciado do problema. Para especificar os valores dos parâmetros adequados, em função da OrderClose (), nós também precisamos de saber alguns outros dados sobre o modo selecionado: a quantidade de lotes (determinada pela função OrderLots ()) e ao número de ordem ímpar (determinada pela OrderTicket função ()). Aliás, para encontrar um ou outro preço de uma citação, em ambos os sentidos, temos de saber o tipo da ordem (determinada pela função OrderType ()). Vamos considerar quais parâmetros devem ser especificados em função da OrderSelect (), a fim de obter as características acima fim. Primeiro de tudo, é necessário escolher o método de selecção fim. No nosso problema, o método de selecção é determinado pela declaração em si o problema: Os dados sobre os números de ordem é suposto estar indisponível no programa a partir do momento do lançamento do script de execução, ou seja, o programa é considerado como contendo um bloco que poderia determinar os números de ordem. Isso significa que devemos verificar todas as ordens de um por um exibida no "Terminal" (Fig. 64,1), portanto temos que usar o parâmetro SELECT_BY_POS. A fonte para seleção das encomendas é óbvio, também. Para resolver o problema, não há necessidade de analisar fechado e suprimiu ordens. Neste caso, estamos interessados no mercado apenas ordens, e vamos em busca deles usando o parâmetro MODE_TRADES na função OrderSelect (). Para o parâmetro 'pool', o valor padrão de MODE_TRADES está especificado no cabeçalho da função, para que possa ser ignorado. Abaixo é mostrado como um bloco de análise de mercado e de encomendas pendentes podem ser construídos: for (int i = 1; i <= OrdersTotal (); i + +) / / ciclo para todas as ordens .. (/ / Exibido no terminal if (OrderSelect (i - 1, SELECT_BY_POS) == true) / / Se houver uma próxima a ( / / Portaria características .. / / Deve ser analisado aqui .. ) ) / / Fim do ciclo corpo No cabeçalho do ciclo operador, o valor inicial é especificado como i = 1, enquanto que a condição para sair do ciclo é a expressão i <= OrdersTotal (). OrdersTotal função () retorna o valor total do mercado e encomendas pendentes, ou seja, aquelas encomendas que são mostrados no "Comércio" da guia
"Terminal" janela. Esta é a razão pela qual haverá o maior número de iterações do ciclo tantas ordens participar na negociação. A cada iteração, quando a condição é calculado em que o operador 'se', a função OrderSelect (i-1, SELECT_BY_POS) será executada. A seguinte questão tão importante, deve ser notado aqui: A numeração da lista de encomendas do mercado e encomendas pendentes inicia com zero. Isto significa que o primeiro na ordem da lista (Fig. 90) é colocado na posição zero, a posição da segunda ordem é numerado como 1, o terceiro fim de que seja numerados como 2, etc Esta é a razão pela qual, em função da OrderSelect chamada (), o valor do índice é dado como i-1. Assim, para todas as encomendas seleccionadas, este índice deverá ser inferior a 1 o valor da variável i (que coincide com o número da próxima iteração). A função OrderSelect () retorna verdadeiro, se a ordem for selecionado com sucesso. Quer dizer que é possível que uma ordem seleção pode falhar. Isso pode acontecer, se a quantidade de encomendas alterado durante seu processamento. No MQL4 Na programação, assim você deve se lembrar que um programa aplicativo funcionará na modalidade real-time, e que, enquanto ela está processando alguns parâmetros, os valores destes parâmetros podem mudar. Por exemplo, a quantidade de encomendas do mercado podem mudar como resultado de ambos abertura / fechamento de encomendas e de modificação das encomendas pendentes no mercado queridos. É por isso que você deve manter a seguinte regra quando a programação fim de transformação: As encomendas devem ser transformados logo que possível, considerando que o programa responsável por esse bloco de transformação não deve, se possível, conter linhas redundantes programa. De acordo com o código representada na fig. 64,3, no cabeçalho do operador 'se', o programa analisa se o próximo fim está disponível na lista a ordem no momento em que é seleccionada. Se o próximo fim encontra-se disponível, o controle será passado para o corpo do operador 'se' ao fim do processo parâmetros. Deve notar-se que tal construção não ajuda muito, no caso de eventuais conflitos, pois a ordem pode ser perdida (fechado) durante o processamento dos seus parâmetros. No entanto, esta solução acaba por ser mais eficiente se, a partir do momento da sua selecção, a ordem não está mais disponível. No corpo do operador 'se', os parâmetros de ordem seleccionada são analisados. Ao executar as funções OrderOpenPrice (), OrderTicket (), OrderType () e outros do género, cada um deles irá retornar o valor de uma determinada característica do modo selecionado como um resultado da execução da função OrderSelect (). Toda a argumentação foi usada no programa que iria resolver um problema com 28. Um exemplo de um script simples destinada ao fechamento de uma ordem no mercado, o preço de abrir o que está mais próxima da localização do script apego do que abrir os preços de outras ordens (closeorder.mq4).
//------------------------------------------------ ------------------------------------/ / Closeorder.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ -------------------------------- 1 -int start () / / Especial função 'iniciar' (
Symb seqüência = Simbolo (); / / Símbolo Dist duplo = 1000000,0; / / Predefinir int Real_Order =- 1; / / No mercado ordens ainda WindowPriceOnDropped dupla Win_Price = (); / / O script está caído aqui //------------------------------------------------ ------------------------------- 2 -for (int i = 1; i <= OrdersTotal (); i + +) / / Ordem pesquisando ciclo ( if (OrderSelect (i - 1, SELECT_BY_POS) == true) / / Se o próximo estiver disponível (/ / Portaria análise: //------------------------------------------------ ----------------------3 -if (OrderSymbol ()! = Symb) continue; / / O símbolo não é nossa Dica OrderType int = (); / / Tipo de Ordem if (Tip> 1) continue; / / Até fim //------------------------------------------------ ----------------------4 -Preço OrderOpenPrice duplo = (); / / Ordem dos preços if (NormalizeDouble (MathAbs (Preço - Win_Price), Dígitos) / Selecção NormalizeDouble (Dist, Dígitos)) / / o mais próximo do fim ( Dist = MathAbs (Preço - Win_Price); / / Novo valor Real_Order = Dica; / / Mercado fim disponíveis Bilhete OrderTicket int = (); / / Portaria bilhete Lote OrderLots duplo = (); / / Quantidade de lotes ) //------------------------------------------------ ----------------------5 -) / / Fim de ordem análise ) / / Fim do fim pesquisando //------------------------------------------------ ------------------------------- 6 -while (true) / / Ordem fecho do ciclo ( if (Real_Order ==- 1) / / Se não estiver disponível no mercado ordens ( Alert ( "Por ", Symb," não disponíveis no mercado ordens "); break; / / Sair fecho do ciclo ) //------------------------------------------------ ------------------------- 7 -switch (Real_Order) / / Por fim tipo ( caso 0: dupla Price_Cls = lance; / / Portaria Comprar string Text = "Comprar"; / / Texto para Comprar break; / / Из interruptor case 1: Peça Price_Cls =; / / Portaria Vender Text = "Vender"; / / Texto para Vender ) Alerta ( "Tentativa de fechar", o texto ", na ", Bilheteira,". Aguardando resposta .. "); bool = OrderClose Ans (Bilhete, Lot, Price_Cls, 2); / / fechando Ordem //------------------------------------------------ ------------------------- 8 -if (Ans == true) / / Já está! :) ( Alerta ( "Fechado ordem", o texto ", na ", Bilheteira); break; / / Sair fecho do ciclo ) //------------------------------------------------ ------------------------
-- 9 -int Erro = GetLastError (); / / Falha: ( switch (erro) / / Overcomable erros ( caso 135: Alerta ( "O preço foi alterado. Repetindo .."); RefreshRates (); / / Atualização de dados continuar; / / Na próxima iteração caso 136: Alerta ( "Não preços. À espera de um novo carrapato .."); while (RefreshRates () == false) / / Para o novo carrapato Sono (1); / / Ciclo do sono continuar; / / Na próxima iteração caso 146: Alerta ( "Trading subsistema está ocupado. Repetindo .."); Sleep (500); / / Solução Simples RefreshRates (); / / Atualização de dados continuar; / / Na próxima iteração ) switch (erro) / / Crítica erros ( case 2: Alerta ( "Common erro."); break; / / Sair 'mudar' caso 5: Alerta ( "antiga versão do cliente de terminal."); break; / / Sair 'mudar' caso 64: Alert ( "Conta está bloqueado."); break; / / Sair 'mudar' caso 133: Alerta ( "Negociação é proibido"); break; / / Sair 'mudar' default: Alerta ( "Ocorreu erro", Erro); / / Outras alternativas ) break; / / Sair fecho do ciclo ) //------------------------------------------------ ------------------------------ 10 -Alert ( "O script tenha acabado operações -----------------------------"); retorno; / / Sair start () ) //------------------------------------------------ ------------------------------ 11 -O código de todo o programa closeorder.mq4 está concentrada em especial a função start (). No bloco 1.2, algumas variáveis são inicializadas. A variável Dist é a distância do local onde o script foi descontinuado para o próximo fim. A variável Real_Order é uma bandeira que apresenta a disponibilidade de, pelo menos, um mercado na ordem do cliente terminal (valor não negativo). A variável Win_Price é o preço, pelo qual o usuário tem apenso o script para a janela do símbolo. No bloco 2.6, a ordem é analisado: Uma das ordens disponíveis estão afectas a ser fechadas. Bloquear 6.10 o bloco de está fechando o fim de processamento e os erros que podem ocorrer durante a realização do comércio. A partir do momento em que o usuário acompanha o script para a janela do símbolo, os valores das variáveis são calculados em bloco 1.2, a variável Win_Price tendo o valor do preço, a nível dos quais o usuário acompanha o script. É agora necessário encontrar a forma (com as suas características), que está mais próximo a este local. No ciclo 'para' (bloco 2-6), as ordens são revistados No bloco 2.3 polegadas, o programa verifica se existe uma ordem na próxima linha do "Terminal". Se for encontrado um fim, o controlo é passado para o corpo do operador 'se' para obter e analisar as características dessa ordem. No bloco 3.4, a abertura ordena símbolos de errado (e não o símbolo, para os quais o programa está sendo executado) são filtrados. No nosso caso, é aberto para a ordem 4372930 USD / CHF. OrderSymbol Function () retorna o nome do símbolo da ordem selecionada. Se esse símbolo é diferente do nome que, para as quais o programa está sendo executado, a atual iteração está quebrado, impedir a abertura de outro símbolo fim
de serem processados. Se a ordem sob análise acaba por ser aberto para a "nossa" símbolo, mais uma verificação será realizada. O tipo de ordem é determinada através da função OrderType () (veja Tipos de Ofícios). Se a ordem tipo tornar-se em mais de 1, significa que a ordem é uma pendência um. Neste caso, a atual iteração é interrompida, também, porque nós não estamos interessados em encomendas pendentes. No nosso exemplo, temos um tal fim, mas é aberta para outro símbolo, de forma que ele já tenha sido filtrado. Todas as encomendas que passam bloco 3.4 com sucesso no mercado são queridos. O bloco 4.5 é destinado apenas para escolher um fim de todas as ordens no mercado que tenham sido aprovado no bloco anterior. Esta ordem deve ser a mais próxima do preço predefinido (o valor da variável Win_Price). O usuário não é obrigado a "apontar" o fim sintonia com o seu cursor do mouse. A fim de que está mais perto do que quaisquer outras encomendas para o cursor a partir do momento do lançamento do script para execução será selecionado. O preço de abrir o fim processado é encontrado usando a função OrderOpenPrice (). Se o valor absoluto da distância entre o preço do curso e da ordem "cursor preço" é inferior à mesma distância para a ordem anterior, a atual ordem será selecionado (o valor absoluto da distância é necessária para a exclusão do influência da posição do cursor - em linha ou acima do fim). Neste caso, essa ordem será memorizado na atual iteração do ciclo 'para' como um frontrunner para serem fechados.Para este fim, o número de bilhete (o número de ordem individual) ea quantidade de lotes são calculadas no final do bloco 4.5. Nesse exemplo (Fig. 90), o montante total das encomendas é de quatro (três mercado queridos e de uma ordem pendente), e por isso haverá quatro repetições executadas no ciclo 'para', o que resultará em encontrar todos os dados necessários para o fechamento de uma ordem selecionada. Depois, o controlo na execução do programa será encaminhada para o ciclo operador 'enquanto' (block 6-10). No bloco 6.7, o mercado ordens encontrados são verificados para disponibilidade. Se não forem encontradas no mercado ordens de bloqueio 2-4 (que é perfeitamente possível, em geral), o valor da bandeira Real_Order permanece igual a -1, o que significa a inexistência das encomendas do mercado. Se os testes em bloco 6.7 detecta nenhum mercado ordens, a execução do ciclo 'enquanto' está quebrado, então o programa termina as suas operações. Se o valor da variável Real_Order acaba por ser igual a 0 ou 1, isto significa que um mercado está predefinida para fechamento e deve ser fechado. No bloco 7.8, de acordo com o tipo de ordem, o preço próximo do fim é calculado. É o valor do lance para Comprar encomendas, bem como o valor das ordens Pergunte para Vender (veja Requisitos e Limitações em Making Ofícios). No bloco 7.8, os valores das variáveis auxiliares texto são calculados. O pedido de fechamento do comércio a ordem é formado na funcionamento OrderClose () na linha abaixo: bool = OrderClose Ans (Bilhete, Lot, Price_Cls, 2); / / fechando Ordem Comércio OrderClose função () retorna verdadeiro, se o comércio é feito com sucesso, e falsa, se não mesmo. Se o pedido for comercial executada com sucesso no servidor, o valor "verdadeiro" será atribuído à variável Ans (atender). Neste caso, aquando da execução bloco 8.9, o programa irá informar o usuário sobre o sucesso fim fechamento. Depois disso, a execução do ciclo operador 'enquanto' será interrompido, eo programa vai terminar as suas operações. Caso contrário, o controle será passado para bloquear 9.10, a fim de analisar o erro devolvido pelo cliente terminal para o programa . No início do bloco 9-10, o código de erro é calculado. Depois disso, de acordo com o código de erro do programa, quer sair ou repetida operação são executados. No primeiro operador 'mudar', o programa processa os erros que são implicitamente overcomable, ou seja, os erros podem ser considerados como dificuldades no desempenho do comércio. Todas as medidas necessárias sejam tomadas para cada um desses erros, então o actual iteração é interrompida ea execução do ciclo 'enquanto' reinicia. (Observe que, neste exemplo, usamos o tratamento de erro para o operador "interruptor" que se fecham como um resultado do uso do operador "continuar" que, como tal, não é destinada para a passagem do
controle externo do operador 'mudar'. Essa obra só porque o operador 'mudar' é uma parte do conteúdo do ciclo externo operador ", enquanto" e que o operador "continuar" interrompa o atual iteração pela passagem do controle para o cabeçalho do operador 'enquanto'). Se o código de erro não for transformado no primeiro operador "switch", esse erro é considerado como crítico. Neste caso, o controlo é passado para o segundo operador 'mudar', que é executado, a fim de informar o utilizador crítico que um ou outro erro ocorreu. Além disso, o programa utiliza o operador 'pausa' que interrompe a execução do ciclo 'enquanto'. Saindo do ciclo 'enquanto', por qualquer motivo, resultará na passagem do comando para bloquear 9.10, que produz uma mensagem sobre o fim do programa operações. O operador 'voltar' para parar a execução da função especial start () , Finaliza o programa e suas operações. Prático resultado obtido após o lançamento do script sob as condições afirmado (ver fig. 90 e 91) é mostrada abaixo. O comércio foi feito com sucesso no servidor.
Fig. 92. As mensagens recebidas como resultado da bem sucedida execução do script closeorder.mq4. Como resultado do encerramento de uma das ordens, existem duas ordens de esquerda na janela de câmbio Euro / Dólar.
Fig. 93. Execução do script closeorder.mq4 resulta em fechamento de uma das ordens. Ordem fechamento também foi exibida no "Terminal" janela:
Fig. 94. Após a execução do script closeorder.mq4, Dois Mercado Ordens são exibidas no "Terminal" Janela. Mais tarde, as outras duas ordens são fechadas utilizando o script, também.
Excluindo encomendas pendente Comércio pedidos de supressão de encomendas pendentes são formadas utilizando a função OrderDelete (). Função OrderDelete () bool OrderDelete (int bilhete, arrow_color color = CLR_NONE) A função apaga as anteriormente colocadas ordem pendente. Retorna TRUE, se ela tem trabalhado com sucesso. Caso contrário, retorna FALSE. Parâmetros: bilhete - o número único de uma ordem. arrow_color - a cor de uma flecha em um gráfico. Se esse parâmetro não está disponível ou o seu valor é igual ao do CLR_NONE, a seta não será exibido no gráfico. É fácil ver que a função OrderDelete () não contém uma especificação do volume e do preço do próximo fim de ser eliminado. A ordem é suprimido qualquer independentemente dos preços de mercado. A supressão parcial de uma ordem é impossível, também.Você pode diminuir a quantidade de lotes em uma ordem pendente em duas fases: apagar a ordem existente e, em seguida, coloque uma nova ordem pendente com a diminuição (qualquer) quantidade de lotes. O algoritmo do programa que irá eliminar uma ordem pendente pode ser bastante idêntica à do mercado, encerramento. A ligeira diferença está em que não é necessário fechar preço para excluir uma ordem pendente, de forma a seguir o programa não contém o bloco que actualiza os preços de mercado. Um exemplo de um script simples destinados à supressão de uma ordem pendente, o preço do que está mais próxima da localização do script apego que os preços das outras ordens pendentes (deleteorder.mq4).
//------------------------------------------------ -----------------------------------/ / Deleteorder.mq4
/ / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ ------------------------------- 1 -int start () / / Especial função 'iniciar' ( Symb seqüência = Simbolo (); / / Símbolo Dist duplo = 1000000,0; / / Predefinir int Limit_Stop =- 1; / / Não encomendas pendentes ainda WindowPriceOnDropped dupla Win_Price = (); / / O script está caído aqui //------------------------------------------------ ------------------------------- 2 -for (int i = 1; i <= OrdersTotal (); i + +) / / Ordem pesquisando ciclo ( if (OrderSelect (i - 1, SELECT_BY_POS) == true) / / Se o próximo estiver disponível (/ / Portaria análise: //------------------------------------------------ ----------------------3 -if (OrderSymbol ()! = Symb) continue; / / O símbolo não é nossa Dica OrderType int = (); / / Tipo de Ordem if (Tip> 2) continue; / / Mercado fim //------------------------------------------------ ----------------------4 -Preço OrderOpenPrice duplo = (); / / Ordem dos preços if (NormalizeDouble (MathAbs (Preço - Win_Price), Dígitos)> / / Selecção NormalizeDouble (Dist, Dígitos)) / / o mais próximo do fim ( Dist = MathAbs (Preço - Win_Price); / / Novo valor Limit_Stop = Dica; / / Até fim disponíveis Bilhete OrderTicket int = (); / / Portaria bilhete ) / / Fim do 'se' ) / / Fim de ordem análise ) / / Fim do fim pesquisando //------------------------------------------------ ------------------------------- 5 -switch (Limit_Stop) / / Por fim tipo ( case 2: string Text = "BuyLimit"; / / Texto para BuyLimit break; / / Sair 'mudar' case 3: Text = "SellLimit"; / / Texto para SellLimit break; / / Sair 'mudar' case 4: Text = "BuyStopt"; / / Texto para BuyStopt break; / / Sair 'mudar' caso 5: Text = "SellStop"; / / Texto para SellStop break; / / Sair 'mudar' ) //------------------------------------------------ ------------------------------- 6 -while (true) / / Ordem fecho do ciclo ( if (Limit_Stop ==- 1) / / Se não estiver disponível encomendas pendentes ( Alerta ( "For", Symb, "nenhuma disposição encomendas pendentes"); break; / / Sair fecho do ciclo ) //------------------------------------------------ ------------------------- 7 -Alerta ( "Falhou a tentativa de excluir ", O texto", na ", Bilheteira,". Aguardando resposta .. "); bool = OrderDelete Ans (ingresso); / / O cancelamento da encomenda //------------------------------------------------ ------------------------- 8 --
if (Ans == true) / / Já está!:) ( Alerta ( "Eliminado ordem", o texto ", na ", Bilheteira); break; / / Sair fecho do ciclo ) //------------------------------------------------ ------------------------- 9 -int Erro = GetLastError (); / / Falha: ( switch (erro) / / Overcomable erros ( case 4: Alerta ( "Comércio servidor está ocupado. Repetindo .."); Sleep (3000); / / Solução Simples continuar; / / Na próxima iteração caso 137: Alerta ( "Agente está ocupado. Repetindo .."); Sleep (3000); / / Solução Simples continuar; / / Na próxima iteração caso 146: Alerta ( " Negociação subsistema está ocupado. Repetindo .. "); Sleep (500); / / Solução Simples continuar; / / Na próxima iteração ) switch (erro) / / Crítica erros ( case 2: Alerta ( " Erro comum. "); break; / / Sair 'mudar' caso 64: Alert ( "Conta está bloqueado."); break; / / Sair 'mudar' caso 133: Alerta ( " É proibido o comércio "); break; / / Sair 'mudar' caso 139: Alerta ( "A ordem é bloqueado e está sendo processado "); break; / / Sair 'mudar' caso 145: Alerta ( "A modificação é proibida." "A ordem é demasiado estreita para o mercado "); break; / / Sair 'mudar' default: Alerta ( "Ocorreu erro ", Erro); / / Outras alternativas ) break; / / Sair fecho do ciclo ) //------------------------------------------------ ------------------------------ 10 -Alert ( "O script tenha acabado operações -----------------------------"); retorno; / / Sair start () ) //------------------------------------------------ ------------------------------ 11 -O erro de processamento de bloco também foi ligeiramente alterado. Você deve considerar a possibilidade de erros relacionados a alterações de preços (erros 135 e 136) quando ordens de fechamento do mercado, mas esses erros não ocorrem ao excluir encomendas pendentes. Pelo mesmo motivo, a função RefreshRates () é usado em nenhuma parte do programa . Tratamento de tais erros como erro de erro 4 e 137 (consulte Códigos de erros) pode ser um pouco difícil. Por exemplo, quando obtendo erro 137, o programa pode levar em consideração que o "corretor está ocupado". No entanto, surge uma pergunta natural: Quando o corretor é livre, para que o utilizador possa continuar o seu comércio? Erro 137does não fornecer tais informações. Esta é a razão pela qual o programador deve decidir ele ou ela própria a construir o programa de transformação desses erros adequadamente. Em um caso simples, o pedido pode ser repetido depois de uma certa pausa (no nosso exemplo, em 3 segundos). Por outro lado, após uma série de tentativas infrutíferas para eliminar (ou, em um caso comum, para fechar, abrir ou modificar) uma ordem, o servidor pode retornar erro 141 muitas solicitações. Esse erro resulta em que o script deleteorder . mq4 pára de funcionar. Geralmente,
esses conflitos não são as questões de programação. Nesses casos, você deve entrar em contato com o serviço de apoio que tratam do centro e esclarecer as razões da rejeição de executar o comércio pedido. Erro 145 pode ocorrer, se uma ordem pendente (em um caso comum, ela pode ser uma forma de parar uma ordem mercado) é muito próximo ao preço do mercado. Este erro não ocorrer, se você está vindo a negociação num mercado calmo. Se os preços mudar rapidamente, o corretor pode decidir que uma determinada ordem serão abertos em breve, por isso o corretor não permitirá a suprimir ou modificá-la. Este erro é considerado como um script na crítica e resulta em um encerramento do programa (que não faz qualquer sentido para incomodar o corretor com o comércio pedidos). Se o preço muda depois de um tempo, você pode tentar excluir o fim, lançando o script para execução novamente. Geralmente, a ocorrência de erro 145 pode ser prevenida, se você considerar o congelamento nível fixado pela lidar center. Parado nível é um valor que determina a banda de preços, no qual a ordem é considerado como «congelados», ou seja, ele pode ser proibido para excluí-la. Por exemplo, se uma ordem pendente é colocada em 1,2500 e congelar o nível é igual a 10 pontos, isso significa que, se o preço varia entre 1,2490 por 1,2510, a supressão da ordem seja proibida pending. Você pode obter o congelamento nível valor ter executado a função MarketInfo () com o identificador da solicitação MODE_FREEZELEVEL. Fechando oposto encomendas Oposto (Contador) Ordem é um mercado aberto em ordem a direcção oposta à direcção de uma outra ordem no mercado aberto para o mesmo símbolo. Se você tiver duas ordens opostas em relação a um determinado símbolo, você pode fechar-lhes simultaneamente, uma pela outra, usando a função OrderCloseBy (). Você vai guardar propagação se você realizar uma tal operação. Função OrderCloseBy () bool OrderCloseBy (int bilhete, int oposto, color = Cor CLR_NONE) A função fecha um mercado, por outro mercado aberto para o mesmo fim símbolo na direção oposta. A função retorna TRUE, se for concluída com êxito e FALSE, se não for. Parâmetros: bilhete - o número único da ordem de ser fechado. oposto - o número único da ordem oposta. Cor - a cor do fechamento flecha em um gráfico. Se esse parâmetro não está disponível ou o seu valor é igual ao do CLR_NONE, a seta não será exibido no gráfico. Não é necessário que as ordens tenham oposto o mesmo volume. Se você fechar uma ordem por uma ordem oposta, o comércio será na desempenham o volume da encomenda que possui o menor volume. Vamos considerar um exemplo. Deixa lá estar duas ordens de mercado o mesmo volume em que o cliente terminal, uma Comprar e Vender um. Se nos fechamos cada um deles separadamente usando a função OrderClose (), a nossa produção económica será a soma dos lucros obtidos a partir de cada ordem:
Fig. 95. Resultado de ordens de fechamento separada utilizando a função OrderClose (). No entanto, se estamos nesta situação usar a função OrderCloseBy () destinados ao contrário fechamento de encomendas, a produção económica será melhor (em comparação com a alternativa anterior) pelo montante proporcional ao custo de um despacho do spread:
Fig. 96. Resultado de ordens de fechamento de outras ordens usando a função OrderCloseBy (). É óbvio que, se houver oposto ordens que devem ser fechados no terminal, seria economicamente sólida para utilizar a função OrderCloseBy (), não OrderClose (). Quanto à poupança de um diferencial frente às ordens de fechamento, devemos dar mais algumas explicações genéricas. De fato, abrindo uma ordem (por exemplo, uma ordem Buy) é implicitamente um comércio que é contrário à abertura de uma ordem no sentido contrário (ou seja, uma ordem Sell) com a mesma intensidade como fechar a ordem (o Comprar ordem). Em outras palavras, é economicamente o mesmo que uma das alternativas para usar: basta para fechar um mercado ou a ordem para abrir uma ordem oposta do mesmo volume (e, em seguida, fechar as duas ordens por si). A diferença entre estas duas alternativas só pode consistir em diferentes métodos utilizados nos diferentes centros que tratam de calcular o dinheiro a ser desviado para apoiar ordens no mercado (verfig. 85 e fig. 88). Também é fácil ver que o preço não seja necessário fechar a ser especificada na função OrderCloseBy () para fechamento de ordens opostas. É desnecessário, porque os ganhos e as perdas de duas ordens opostas retribuir mutuamente, pelo que o total produção económica não depende do preço de mercado. Claro que esta regra é válida somente para o mesmo volume de encomendas. Se, por exemplo, temos duas ordens de um símbolo: Comprar uma ordem de 1 lote e Vender uma ordem de 0,7
lote, esse comércio só depende do preço de mercado em relação à parte Compre fim lote de 0,3, enquanto que 0,7 lote de ambas as ordens não dependem do símbolo preço. Oposto ordens não influenciam o total dos resultados comerciais. Esta é a razão por negociação com base em táticas de abertura ordena oposto não possuem qualquer conteúdo informal (por esta razão, alguns centros que tratam forcedly fechar qualquer dentro do lado oposto ordens coincidindo montantes dos lotes). A única (negativo) influência de tais táticas podem consistir em desvio de dinheiro, de acordo com as regras aceites em alguns centros que tratam. Além disso, a disponibilidade de várias ordens opostas prevê mais dificuldades no âmbito das trocas programadas, uma ordem do que faz. Se considerarmos diversas comissões e swaps (para cada mercado, em separado), a necessidade de fechar oposto ordens torna-se óbvia. Um exemplo de um script simples que fecha todas as ordens para a frente de um símbolo (closeby.mq4). //------------------------------------------------ -------------------/ / Closeby.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ --------------- 1 -int start () / / Especial função 'iniciar' ( Symb seqüência = Simbolo (); / / Símbolo Dist duplo = 1000000,0; / / Predefinir //------------------------------------------------ --------------- 2 -while (true) / / Transformação ciclo .. (/ / .. Oposto de encomendas Hedg_Buy duplo = - 1,0; / / Max. Custo de Compra Hedg_Sell duplo = - 1,0; / / Max. Custo de Venda for (int i = 1; i <= OrdersTotal (); i + +) / / Ordem pesquisando ciclo ( if (OrderSelect (i - 1, SELECT_BY_POS) == true) / / Se o próximo estiver disponível (/ / Portaria análise: //------------------------------------------------ --- 3 -if (OrderSymbol ()! = Symb) continue; / / O símbolo não é nossa Dica OrderType int = (); / / Tipo de Ordem if (Tip> 1) continue; / / Até fim //------------------------------------------------ --- 4 -switch (Dica) / / Por fim tipo ( caso 0: / / Portaria Comprar if (OrderLots ()> Hedg_Buy) ( Hedg_Buy = OrderLots (); / / Escolha o max. Custo int Ticket_Buy = OrderTicket (); / / Portaria bilhete ) break; / / De interruptor case 1: / / Portaria Vender if (OrderLots ()> Hedg_Sell) ( Hedg_Sell = OrderLots (); / / Escolha o max. Custo int Ticket_Sell = OrderTicket (); / / Portaria bilhete ) ) / / Fim de 'mudar' ) / / Fim de ordem análise ) / / Fim do fim pesquisando //------------------------------------------------ --------- 5 --
if (Hedg_Buy <0 | | Hedg_Sell <0) / / Se não estiver disponível fim .. (/ / .. Algum tipo de Alerta ( "Todas as ordens são fechadas oposto:)"); / / Mensagem retorno; / / Sair start () ) //------------------------------------------------ --------- 6 -while (true) / / Encerramento do ciclo ( //------------------------------------------------ ------ 7 -Alerta ( "Tentativa de perto. Aguardando resposta .."); bool = OrderCloseBy Ans (Ticket_Buy, Ticket_Sell); / / Закрытие //------------------------------------------------ ------ 8 -if (Ans == true) / / Já está! :) ( Alerta ( "Realizada pelo encerramento."); break; / / Sair fecho do ciclo ) //------------------------------------------------ ------ 9 -int Erro = GetLastError (); / / Falha: ( switch (erro) / / Overcomable erros ( case 4: Alerta ( "Comércio servidor está ocupado. Repetindo .."); Sleep (3000); / / Solução Simples continuar; / / Na próxima iteração caso 137: Alerta ( "Agente está ocupado. Repetindo .."); Sleep (3000); / / Solução Simples continuar; / / Na próxima iteração caso 146: Alerta ( "Trading subsistema está ocupado. Repetindo .."); Sleep (500); / / Solução Simples continuar; / / Na próxima iteração ) switch (erro) / / Crítica erros ( case 2: Alerta ( "Common erro."); break; / / Sair 'mudar' caso 64: Alert ( "Conta está bloqueado."); break; / / Sair 'mudar' caso 133: Alerta ( "Negociação é proibido"); break; / / Sair 'mudar' caso 139: Alerta ( "A ordem é bloqueado e está sendo processada"); break; / / Sair 'mudar' caso 145: Alerta ( "A modificação é proibida." "O fim está muito perto de mercado"); break; / / Sair 'mudar' default: Alerta ( "Ocorreu erro", Erro); / / Outras alternativas ) Alert ( "O script tenha acabado operações --------------------------"); retorno; / / Sair start () ) ) / / Fim do ciclo de transformação //------------------------------------------------ -------------- 10 -) / / Fim de início () //------------------------------------------------ -------------------O algoritmo do script acima é um pouco diferente do que as anteriores. Essa diferença consiste em que o mesmo código deve ser executado muitas vezes, a fim de encerrar várias ordens (a quantidade de ordens que devem ser fechados em não limitado) com êxito. O script foi testado em um conjunto aleatório de ordens de mercado. 5 ordens de diferentes volumes estão representadas na fig. 97 abaixo.
Fig. 97. Ordens de mercado aberto para um símbolo. A fim de fechar o oposto ordens disponíveis, devemos predefinir os critérios de selecção. Esse critério, no algoritmo é dada a ordem dimensão - o maior volume de encomendas são fechadas antes de mais, então as ordens de pequenos volumes estão fechados. Após o oposto ordens de diferentes volumes foram fechadas, as ordens dos volumes permanecer descansando. Por exemplo, o encerramento das ordens opostas Buy (1 lote) e Sell (0,8 lote) que irá resultar na ordem Buy (0,2 lote) permanece aberto. Esta é a razão pela qual, após cada encerramento sucesso, o programa deve referir-se a lista actualizada das ordens de encontrar outras duas maiores ordens opostas nesta lista actualizada. Os cálculos acima são realizadas em uma (condicionalmente) ciclo contínuo ", enquanto", em blocos 210. Фе o início do ciclo, em cada iteração do programa supõe que não há ordens de um certo tipo anymore. Por isso, o valor de -1 é o atribuído às variáveis Hedg_Buy e Hedg_Sell. O algoritmo da ordem de processamento de bloco, em geral, é preservada (ver o código de closeby.mq4). No fim do ciclo de consciência 'para', ou seja, no bloco 3.4, como nos programas anteriores, "errado" ordens são filtrados. Neste caso, estas ordens são abertos para outro símbolo e as encomendas pendentes. No bloco 4.5, o volume verificado no fim de cada bloco 3.4 é calculado. Se ele sair durante os cálculos que atualmente processado ordem é a maior dentre todas as encomendas em volume processado, o seu bilhete é armazenado. Isto significa que a ordem tenha esse bilhete é, nesta fase de cálculos, de um candidato para o encerramento das ordens opostas. Até ao momento em que a última iteração do ciclo 'para' terminar, os bilhetes de encomendas, com a máxima quantidade de lotes abertos em direcções opostas já foram conhecidos. Estas ordens são selecionados pelo programa. Se algum ordens de qualquer tipo já se tornaram indisponíveis até este momento, bloco 5.6 sai do programa. O bloco representa 6.10 erro de transformação. É completamente as mesmas que são consideradas acima (neste e em seções anteriores). O pedido de fechamento do comércio encomenda oposto é formado em bloco 7.8 utilizando a função OrderCloseBy (). Se ele falhar, de acordo com o código de erro, o programa passa o controle para repetir quer tornar o comércio (para o mesmo ingressos) ou para o operador "regresso" que termina o programa operações. Se um comércio é realizada com sucesso, o programa sai do bloco de erro de processamento, e os atuais iteração do ciclo mais externo 'enquanto' irá terminar. Фе a próxima iteração deste ciclo, todos os cálculos serão repetidos: pesquisando nas ordens disponíveis, selecionando ordens no mercado, assinalando selecionadas para cada um dos tipos fim, formando uma solicitação para a frente fechando comércio, analisando e subsequentes erro. Este ciclo é executado até que não haja disponíveis ordens de um certo tipo (ou, num caso específico, de ambos os tipos) no terminal. Este evento será calculado no bloco 5-6, em seguida, o programa terminar suas operações. As seguintes mensagens foram recebidos na execução do script closeby.mq4 destinados ao fechamento do mercado ordens mostrado na fig. 97:
Fig. 98. As mensagens recebidas na execução do script closeby.mq4. Sobre a "História da conta" da guia "Terminal" janela, você pode ver que algumas encomendas estão fechados, com um lucro zero. Isto é o que nós salvar quando fecho ordens opostas. É possível comparar os resultados económicos na fig. 97 e fig. 99:
Fig. 99. Conta história após a execução do script closeby.mq4. Sobre o "Journal" na guia "Terminal" janela, você pode acompanhar a história da ordem fecho (os últimos acontecimentos estão em cima):
Fig. 100. Eventos aconteceram durante a execução do script closeby.mq4. Фе a execução do script, de acordo com o algoritmo, as encomendas de volume máximo disponível no momento em que serão encerradas. Apesar do fato de que as encomendas foram abertos em uma seqüência aleatória (Fig. 97), as primeiras ordens a serem fechados foram Comprar 778594 e 778595 Vender, com os volumes de 1 lote lote e 0,8, respectivamente (as linhas mais baixas na fig . 100). Uma vez que estas ordens têm volumes diferentes, o oposto fechando produzida uma nova ordem, Comprar 778597, com o volume de 0,2 descansando muito. Em seguida, o programa selecionou ordens 778592 Comprar e Vender 778593, 0,5 cada lote, a ser encerrado o oposto ordens. Estas encomendas foram encerradas sem descansar abre uma ordem. Até ao momento a terceira iteração começou, duas ordens tinham permanecido no símbolo na janela externa ciclo: 778596 Vender despacho inicial de 0,3 lote eo fim aberto como um resultado da execução do script, Compra de 0,2 lote 778597. Nas linhas de alta Fig.100, você pode ver que essas ordens são ordens opostas como também fechado. O volume dessas encomendas eram diferentes, pelo que o último comercial que resultou em um mercado ordem de 0,1 lote permaneceu na janela do símbolo (observe os resultados económicos):
Fig. 101. Ordem Vender com custo remanescente de 0,1 Lot. É conveniente usar o script closeby.mq4 manual na negociação, especialmente nos casos de maneira diferente muitos ordena-dirigido mercado disponível na janela do símbolo.
Modificação de Encomendas MQL4 permite modificar mercado e encomendas pendentes. As ordens são modificadas de acordo com as regras descritas na Portaria Características e no apêndice 3. Função OrderModify ()
Comércio pedidos de modificação de mercado, e enquanto se aguarda ordens são formadas utilizando a função OrderModify (). bool OrderModify (int bilhete, duplo preço, stoploss duplo, a dupla takeprofit, datetime expiração, arrow_color color = CLR_NONE) A função modifica os parâmetros de mercado e de encomendas pendentes. A função retorna TRUE, se o comércio é feito com sucesso.Caso contrário, retorna FALSE. Parâmetros: bilhete - o número único da ordem. preço - o preço de um recém-solicitadas enquanto se aguarda o fim ou um novo preço de mercado aberto fim. stoploss - o novo valor do StopLoss. takeprofit - o novo valor do TakeProfit. vencimento - o tempo de expiração uma ordem pendente. arrow_color - a cor das setas para a modificação da StopLoss e / ou TakeProfit no gráfico. Se esse parâmetro não está disponível ou o seu valor é igual ao do CLR_NONE, as setas não será exibido no gráfico. Nota: Você pode mudar preço ea expiração aberto apenas para encomendas pendentes. Se você passar valores inalterados parâmetros como a função, o terminal vai gerar erro 1 (ERR_NO_RESULT). Pode haver um limite de tempo para a aplicação de expiração para encomendas pendentes sobre alguns servidores comerciais. Neste caso, se você tentar criar um valor diferente de zero nos parâmetros da expiração, erro 147 (ERR_TRADE_EXPIRATION_DENIED) será gerado. Modificação do mercado encomendas A ordem normal de mercado contém duas ordens de stop - StopLoss e TakeProfit. Eles instruções para fechar a ordem, o preço solicitado, a fim de parar de correção das perdas e lucros. Alteração de encomendas no mercado pode ser útil para a solicitação de mudança de preços de ordens stop, quer como resultado de novas calculados valores obtidos no programa ou no iniciativa do comerciante. O terminal cliente tem a sua própria ferramenta usada para modificação de StopLoss: Trailing Stop. Permite que o programa para modificar o nível de StopLoss seguinte à taxa fixa a uma certa distância da mesma (ver Metatrader Cleitn Terminal 4 do Guia do Usuário). O fim-modificando função OrderModify () amplia consideravelmente as capacidades de modificação: Os preços de ambos solicitaram ordens de stop podem ser alterados no sentido de o preço de mercado ou apagados. Uma limitação para o mercado fim modificação mínima permitida é a distância entre o fim e parar o preço de mercado, fixado pela lidar center (ver Ordem características e os requisitose limitações em Making Ofícios). Se o programa tenta mudar a posição de uma ordem stop de tal forma que ele é colocado mais perto do mercado do que a distância mínima permitida, esse comércio pedido será rejeitado pelo cliente terminal ea execução da função OrderModify () irá falhar (erro 130). É por isso que você deve fornecer um bloco especial no seu programa, que vai considerar essa limitação.
Exemplo de um simples Expert Advisor StopLosses que modifica de todas as ordens no mercado, para que a distância entre o preço de StopLoss eo preço de mercado é maior do que a um preset (modifystoploss.mq4)
//------------------------------------------------ ----------------------------------/ / Modifystoploss.mq4 / / O código deve ser usado apenas para fins educacionais . //------------------------------------------------ ----------------------------------extern int Tral_Stop = 10; / / Trailing distância //------------------------------------------------ ------------------------------ 1 -int start () / / Especial função 'iniciar' ( Symb seqüência = Simbolo (); / / Símbolo //------------------------------------------------ ------------------------------ 2 -for (int i = 1; i <= OrdersTotal (); i + +) / / Cycle pesquisando nas encomendas ( if (OrderSelect (i - 1, SELECT_BY_POS) == true) / / Se o próximo estiver disponível (/ / Análise de encomendas: Dica OrderType int = (); / / Tipo de Ordem if (OrderSymbol ()! = Symb | | Dica> 1) continue; / / A ordem não é "nossa" SL = dupla OrderStopLoss (); / / SL da ordem seleccionada //------------------------------------------------ ---------------------- 3 -while (true) / / Modificação ciclo ( TS = dupla Tral_Stop; / / Valor inicial int Min_Dist = MarketInfo (Symb, MODE_STOPLEVEL); / / Min. distância if (TS / / 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 fimmodificando em função de um script. No entanto, não seria muito útil ao usar um script normal neste exemplo, porque o script iria terminar suas operações depois de o comércio ter sido feita. O uso de um script seria razoável, no caso, o programa realiza um one-time de realizar uma operação, por exemplo, o fecho ou a abertura ordena. Neste caso, no entanto, estamos resolvendo uma tarefa que precisa ser contínuo controle sobre a situação: mudar a posição de uma ordem stop, se uma determinada condição
seja cumprida, ou seja, se a distância entre a taxa de mercado e solicitou o valor da parar de ordem ultrapassa um certo valor predefinido (10 pontos, no nosso caso). Para uma utilização a longo prazo, é muito mais conveniente para escrever um EA que é lançada para execução em todos os carrapatos e deixa de trabalhar apenas com o ensino directo pelo usuário. O algoritmo acima da EA modifystoploss.mq4 é muito simples. Os principais cálculos são realizados no ciclo da pesquisa na ordens (blocos 2-9). A ordem é pesquisado em ambos os mercados e encomendas pendentes (o parâmetro 'pool' na chamada de função OrderSelect () não é explicitamente especificada). No bloco 2-3, enquanto se aguarda ordens e as ordens aberta para outro símbolo são filtrados; para as encomendas que foram seleccionadas, StopLoss é o valor de determinados. O bloco 3.9 representa um ciclo de alteração da ordem selecionada. No bloco 3.4, o novo valor atual do limitando-se a distância determinada (o seu corretor, este valor pode mudar a qualquer momento). No bloco 4.5, a necessidade de modificar a forma selecionada (atualmente processado no ciclo 'para') é calculado, bem como um novo valor de StopLoss. Se a atual ordem não necessita de ser modificado, o programa sai do ciclo 'enquanto' no final do bloco 4.5 e esta ordem não é modificada (no bloco 5-6). Contudo, se a decisão tem de ser modificada, o controlo é passado ao bloco 5.6, em que os parâmetros necessários são calculados e OrderModify a função () é chamado de que faz uma solicitação comercial. Se um comércio é concluída com êxito, o operador 'pausa' no bloco 6.7 irá terminar a execução do ciclo 'enquanto', o que resulta no termo do actual iteração do fim do ciclo de consciência 'para' (o próximo fim irá começará a ser processado na próxima iteração). Se o comércio não é realizada com sucesso, os erros serão processados. Se um erro não se venham a ser crítico, o programa nova tentativa de fazer um comércio. No entanto, se o erro é estimado como crítico, o controle será passado fora da modificação do ciclo de processamento do próximo fim (no ciclo 'para'). Você deve ter notado um pequeno recurso aqui que diz respeito à alteração das ordens de mercado. Função OrderModify () fixa novos valores para o preço stop orders de ambos simultaneamente. No entanto, a necessidade de respeitar a distância mínima, apenas diz respeito à ordem stop, o novo valor do qual difere do actual. Se o novo valor é o mesmo que o actual, o despacho pode deixar de ser, em qualquer distância a partir do preço de mercado, enquanto que o comércio correspondente pedido é considerado como correcto. Por exemplo, temos um mercado aberto fim Compre com o preço de 1.295467, com as seguintes ordens de stop: StopLoss = TakeProfit = 1,2958 e 1,2960. A distância mínima fixada pelo corretor é de 5 pontos. Para o preço de mercado de lance = 1,2959, as condições para a modificação da ordem surgir, nomeadamente, para a colocação StopLoss = 1,2949 (Bid - 10 pontos). A fim de executar a função OrderModify (), você também deve especificar um novo valor de TakeProfit. O nosso EA não muda a posição do TakeProfit, por isso, defina o valor na sua actual função: TakeProfit = 1,2960. Apesar do fato de que o novo valor solicitado de TakeProfit = 1,2960 está próximo do mercado preço de lance (apenas 1 ponto, ou seja, menos do que o permitido distância mínima de 5 pontos), este valor não diferir do valor atual de TakeProfit = 1,2960, portanto o comércio solicitação será considerada correta e realizada no servidor (em geral, o pedido pode ser rejeitado, mas por outras razões). Fig. 102 e 103 representam os resultados de uma modificação no êxito dessa situação.
Fig. 102. Alertar janela e símbolo como eles aparecem na janela de alteração de uma ordem pela EA modifystoploss.mq4 quando a taxa de mercado está perto do valor solicitado de TakeProfit.
Fig. 103. Modificado a fim de "Terminal" janela. Podemos ver na fig. 103 que a alteração resultou no novo valor de StopLoss = 1,2949, e que o actual preço de lance = 1,2959 estava a uma distância de 1 ponto a partir do valor de TakeProfit. Deve notar-se em separado que nem mercado, nem encomendas pendentes deverão ser modificados) no isolamento a partir da análise da situação do mercado. Essa alteração só pode ser útil, se a taxa de mercado se move rapidamente e de uma direcção, o que poderá acontecer depois de notícias importantes. No entanto, se você comércio, em um "normal" do mercado, a decisão da necessidade de modificar encomendas devem ser feitas com base nos critérios do mercado. Consultor Especialista em modifystoploss.mq4, nós também utilizar um critério (StopLoss está mais longe do preço de mercado do que queremos), com base no qual o programa que decide modificar ordens. No entanto, este critério é muito simples e difíceis de ser considerada como um critério que caracteriza a situação no mercado. Na pendência da modificação encomendas Modificação de encomendas pendentes ligeiramente diferente do que o mercado de encomendas. A diferença importante é que é possível mudar o preço do fim em si. Você deve manter as regras limitando a posição de uma forma tão pendentes relacionados com o preço de mercado e de como parar de ordens relacionadas com a ordem requerida preço (ver Ordem características e os requisitos e limitações em Making Ofícios). Ao mesmo tempo, todas as características da ordem pendente são considerados como recentemente solicitado, qualquer que seja a história prévia de eventos relacionados é armazenado. Por exemplo, suponha que temos uma ordem pendente BuyStop com StopLoss = 1,2030 = 1,2025 e 1,2035 = TakeProfit. O corretor definir a distância mínima permitida como 5 pontos. É fácil ver que as ordens de stop estão dentro da faixa permitida, pelo que qualquer alteração da ordem requerida abertas preço terá como resultado a modificação necessária de pelo menos uma das ordens de stop. No entanto, se um pedido comércio é formado que vai mudar a ordem requerida preços, os valores das ordens de paragem remanescentes do mesmo, o cliente terminal irá considerar este pedido como um mal e não vai mandá-lo para o servidor para execução. Por exemplo, se o requerimento especifica os seguintes valores: BuyStop = 1. 2028, StopLoss = 1,2025 e 1,2035 = TakeProfit, este pedido é errado, embora os
valores de suas ordens stop, não foram alteradas: neste caso, o pedido está quebrando a regra de manter a distância mínima entre a ordem requerida abertas eo preço de uma das ordens stop (ver Requisitos e Limitações em Making Ofícios). Vamos ver como um script pode parecer que modifica uma pendência fim de aproximar o seu preço solicitado ao preço de mercado a uma distância pré-determinada. Vamos definir a distância como 10 pontos. Para indicar a fim de serem modificados (podem haver várias encomendas pendentes na janela), estamos usando os preços, em que o script foi anexado ao símbolo janela.
Exemplo de um script simples que modifica uma ordem pendente, solicitou a abertura do preço que está mais próxima da penhora script-preço do que os preços das outras ordens pendentes (modifyorderprice.mq4).
//------------------------------------------------ ----------------------------------/ / Modifyorderprice.mq4 / / O código deve ser usado apenas para fins educacionais . //------------------------------------------------ ------------------------------ 1 -int start () / / Especial função 'iniciar' ( tral int = 10; / / Encarar a distância Symb seqüência = Simbolo (); / / Símbolo Dist duplo = 1000000,0; / / Predefinir WindowPriceOnDropped dupla Win_Price = (); / / O script está caído aqui //------------------------------------------------ ------------------------------ 2 -for (int i = 1; i <= OrdersTotal (); i + +) / / Cycle pesquisando nas encomendas ( if (OrderSelect (i - 1, SELECT_BY_POS) == true) / / Se o próximo estiver disponível (/ / Análise de encomendas: //------------------------------------------------ ---------------------- 3 -if (OrderSymbol ()! = Symb) continue; / / O símbolo não é "nossa" if (OrderType () <2) continue; / / Mercado fim //------------------------------------------------ ---------------------- 4 -if (NormalizeDouble (MathAbs (OrderOpenPrice () - Win_Price), Dígitos)
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 0) New_SL = New_Price - (Preço - SL); / / Novo StopLoss if (NormalizeDouble (TP, Dígitos)> 0) New_TP = New_Price + (TP - Preço); / / Novo TakeProfit Text = "BuyLimit"; / / modificar isso. ) break; / / Sair 'mudar' case 3: / / SellLimit if (NormalizeDouble (Price, Dígitos)> / / Se for maior do que por NormalizeDouble (+ lance TS * Ponto, Dígitos)) / / .. o valor predefinido ( = + Lance TS New_Price * Point; / / O seu novo preço if (NormalizeDouble (SL, Dígitos)> 0) New_SL = New_Price + (SL - Preço); / / Novo StopLoss if (NormalizeDouble (TP, Dígitos)> 0) New_TP = New_Price - (Preço - TP); / / Novo TakeProfit Text = "SellLimit"; / / modificar isso. ) break; / / Sair 'mudar' case 4: / / BuyStopt if (NormalizeDouble (Price, Dígitos)> / / Se for maior do que por NormalizeDouble (TS + * Pergunte Point, Dígitos)) / / .. o valor predefinido ( Pergunte New_Price = + * Ponto TS; / / O seu novo preço if (NormalizeDouble (SL, Dígitos)> 0) New_SL = New_Price - (Preço - SL); / / Novo StopLoss if (NormalizeDouble (TP, Dígitos)> 0) New_TP = New_Price + (TP - Preço); / / Novo TakeProfit Text = "BuyStopt"; / / modificar isso. ) break; / / Sair 'mudar' caso 5: / / SellStop if (NormalizeDouble (Price, Dígitos) / Se for maior do que por
NormalizeDouble (Bid - TS * Ponto, Dígitos)) / / .. o valor predefinido ( New_Price = Oferta - Point TS *; / / O seu novo preço if (NormalizeDouble (SL, Dígitos)> 0) New_SL = + New_Price (SL - Preço); / / Novo StopLoss if (NormalizeDouble (TP, Dígitos)> 0) New_TP = New_Price - (Preço - TP); / / Novo TakeProfit Text = "SellStop"; / / modificar isso. ) ) if (NormalizeDouble (New_SL, Dígitos) <0) / / Verificar SL New_SL = 0; if (NormalizeDouble (New_TP, Dígitos) <0) / / Verificar TP New_TP = 0; //------------------------------------------------ ------------------------ 9 -if (Texto == "") / / Se não for modificado ( Alerta ( "Nenhuma condição de modificação".); break; / / Sair 'enquanto' ) //------------------------------------------------ -----------------------10 -Alerta ( "Modificação ", Texto, Ticket,". Aguardando resposta .. "); bool = OrderModify Ans (Bilhete, New_Price, New_SL, New_TP, 0); / / modificar isso! //------------------------------------------------ -----------------------11 -if (Ans == true) / / Já está! :) ( Alerta ( "Modified ordem", o texto ", na ", Bilheteira,":) "); break; / / Sair do encerramento do ciclo ) //------------------------------------------------ -----------------------12 -int Erro = GetLastError (); / / Falha: ( switch (erro) / / Overcomable erros ( case 4: Alerta ( "Comércio servidor está ocupado. Repetindo .."); Sleep (3000); / / Solução Simples continuar; / / Na próxima iteração caso 137: Alerta ( "Agente está ocupado. Repetindo .."); Sleep (3000); / / Solução Simples continuar; / / Na próxima iteração caso 146: Alerta ( "Trading subsistema está ocupado. Repetindo .."); Sleep (500); / / Solução Simples continuar; / / Na próxima iteração ) switch (erro) / / Crítica erros ( case 2: Alerta ( " Erro comum. "); break; / / Sair 'mudar' caso 64: Alert ( "Conta está bloqueado."); break; / / Sair 'mudar' caso 133: Alerta ( " É proibido o comércio "); break; / / Sair 'mudar' caso 139: Alerta ( "Ordem é bloqueado e está sendo processada"); break; / / Sair 'mudar' caso 145: Alerta ( "Alterar proibida." "Ordem é demasiado estreita para o mercado"); break; / / Sair 'mudar' default: Alerta ( "Ocorreu erro ", Erro); / / Outras alternativas
) break; / / Sair do encerramento do ciclo ) / / Fim do encerramento do ciclo //------------------------------------------------ ----------------------------- 13 -Alert ( "O script já completou suas operações -----------------------"); retorno; / / Sair start () ) //------------------------------------------------ ----------------------------- 14 -A distância entre o preço de mercado, bem como o preço da ordem pendente está definido na variável central. A variável Win_Price contém o valor do preço, pelo qual o script foi anexado ao símbolo janela. No ciclo de pesquisas em ordens (blocos 2-5), as características do modo mais próximo ao nível script-apego são calculados. 6.13 bloco representa o ciclo de fecho de encomendas. No bloco 8.9, que é decidido sobre se o modo selecionado deve ser modificado. Se necessário, os novos valores dos preços solicitados são calculadas as ordens de parar aqui. A alteração da ordem é solicitado utilizando o funcione OrderModify () no bloco 10-11. Erros são transformados em bloco 11-13. 8.9 O bloco é composto por quatro blocos idênticos, em que os novos valores utilizados no pedido são calculados. Vamos considerar os destinados a um fim SellLimit: case 3: / / SellLimit if (NormalizeDouble (Price, Dígitos)> / / Se for maior do que por NormalizeDouble (+ lance TS * Ponto, Dígitos)) / / .. o valor predefinido ( = + Lance TS New_Price * Point; / / O seu novo preço if (NormalizeDouble (SL, Dígitos)> 0) New_SL = New_Price + (SL - Preço); / / Novo StopLoss if (NormalizeDouble (TP, Dígitos)> 0) New_TP = New_Price - (Preço - TP); / / Novo TakeProfit Text = "SellLimit"; / / modificar que ) break; / / Sair 'mudar' Os novos parâmetros da ordem são calculados apenas se o preço atual 'Price' está mais longe da actual preço de mercado do que o lance desejado distância TS. Se é assim, o controle será passado para o corpo do operador «se», quando abrir o novo preço da ordem, New_Price, é calculado. Os novos valores de StopLoss e TakeProfit são calculados apenas para valores não zero. A distância entre o preço ea cada solicitou vista dos preços da ordem stop continua a mesma. Por exemplo, SellLimit ordem é colocada em 1,2050, o seu StopLoss = 1,2073 e seus TakeProfit = 1. 2030. Suponha os cálculos resultar na nova ordem aberto preço igual a 1,2040. Neste caso, os novos valores de ordens stop, será a seguinte: StopLoss = 1,2063, TakeProfit = 1. 2020. Assim, o programa resultará em operações a fim de que seja modificado "como um todo" - todos os três parâmetros básicos (open preço, StopLoss e TakeProfit) move para baixo ao mesmo tempo, mantendo uma distância entre eles. No final do bloco 8.9, os novos valores de ordens stop são verificados para valores negativos. Esta verificação é útil se uma introduzido anteriormente (por outro programa ou manualmente) parar de ordem era próximo de zero preço, por exemplo, apenas 1 ponto acima zero. Neste caso, se a ordem se move para baixo em mais de 1 ponto, o novo preço de uma das ordens de stop passará a ser negativa. Se esse valor fosse especificado no comércio um pedido, o requerimento será indeferido pelo cliente terminal. Temos de chamar a atenção em desvantagem desses programas - ambos os scripts e Expert Advisors. O programa modifyorderprice.mq4acima é muito limitado na sua acção decisão. A fim de ser modificados só poderá ser movida em uma direção - no sentido de a taxa de mercado, sendo rigorosamente suas
ordens stop "anchore" para o fim. Este programa não está ajustado à alteração da ordem requerida preços na direção que não seja o preço de mercado. A possibilidade de mudar a posição separada de qualquer forma não é pára realizada no programa também. A limitação acima indicada é determinada, em primeiro lugar, pelo montante dos controles utilizados. Neste programa, existe apenas um controle do tipo - o local onde o script foi anexado ao símbolo janela. Utilizando este parâmetro, o comerciante pode determinar qualquer forma a ser modificado. No entanto, trata-se de todos os usuários da iniciativa. A fim de trabalhar de forma mais eficiente, o usuário necessita ferramentas adicionais que permitem-lhe para afetar outros parâmetros de encomendas. Essas tarefas podem ser perfeitamente resolvidos de forma eficiente usando MQL4. No entanto, terá que utilizar um outro, mais "intelectual" algoritmo para este fim. É possível criar um programa que irá automatizar o seu comércio e modificar ordens de acordo com seus desejos. Você pode usar em um desses programa, por exemplo, objetos gráficos como ferramentas adicionais para controle manual negociação. No MQL4 programas simples Esta seção contém vários programas simples prontas para uso prático. Iremos discutir os princípios gerais da criação de uma simples Consultor Especialista e um simples costume indicador, assim como o uso compartilhado das Assessora um especialista e vários indicadores. Negociação critérios são aplicados em programas utilizados para fins educativos e não deve ser considerado como um guia para a ação em uma verdadeira negociação em conta. §
Uso de indicadores técnicos. Há várias dezenas de indicadores em Metatrader 4. Esses indicadores são chamados técnicos. O nome "técnico" provém de dois tipos de análise do mercado: a análise fundamental (FA), que é a análise dos indicadores macroeconómicos, no contexto de uma negociados segurança, mercado, país, etc; e análise técnica (AT), que é a análise usando tabelas de preços e de preços diferentes transformações. MQL4 permite obter valores de indicadores técnicos via correspondentes funções. Ao chamar funções de indicadores técnicos, exigido parâmetros devem ser especificados.
§
Simples perito orientador. Ao escrever um Expert Advisor (trading robot) é necessário realizar trabalhos preliminares: definir uma estratégia comercial, definir critérios, bem como sobre as bases de todo este criar uma estrutura. Negociação critérios são geralmente fixados em uma ou várias funções, que são blocos de produzir sinais comércio. O tamanho de um comércio aberto posição é muitas vezes uma tarefa separada e podem ser escritas em uma função separada. Ordens para abrir, fechar e modificar ordens pode resultar em erros que devem ser processados. Estas operações são normalmente incluídos também correspondente em funções definidas pelo utilizador.
§
Criação de Indicadores personalizado. Não é difícil escrever um costume indicador se não conhecermos a sua disposição. Cada indicador personalizados podem conter de 1 a 8 indicador amortecedores, terminais que utilizam as informações sobre os sapatos gráficos. Necessários buffers são declarados na forma de matrizes de dupla tipo sobre o programa a nível global, ainda mais em init () tampão cada parâmetro é especificado / set up: desenho estilo, cores e largura das linhas, etc Desde início () é lançado em o indicador em cada um recebeu carrapato, organizando razoável cálculos é extremamente importante. Para criar um melhor indicador algoritmo IndicatorCounted () função é utilizada, esta
função contém dados sobre a quantidade de bares que não tenha alteração desde o último arranque () convite. §
Custom Indicador ROC (Price Rate of Change). Criação de um costume indicador é mais bem compreendida em um exemplo com explicações detalhadas. Comentários detalhados no indicador texto será ainda mais útil para você, quando você decidir alterar o indicador. Bons programas estão bem documentados programas.
§
Utilização combinada de programas. Para usar valores de um indicador personalizado em outros indicadores, scripts ou Expert Advisors, adicionar um programa em código personalizado utilizando o indicador chamar iCustom função (). A presença física do indicador denominado personalizado em um diretório correspondente não é verificada durante a compilação. Isso é costume indicadoras porquê parâmetros de chamada devem estar configurada corretamente, caso contrário, podem diferir dos valores calculados esperado queridos. A possibilidade de convocar uma personalizada indicador ajuda a simplificar consideravelmente Expert Advisor um código.
Uso de indicadores técnicos De acordo com os pertencentes ao sistema de comércio on-line Metatrader 4, existem dois tipos de indicadores em MQL4 - técnico e personalizado. Técnico indicador é parte integrante do sistema de comércio on-line Metatrader, construíram-na função que permite desenhar na tela uma certa dependência.
Propriedades dos indicadores técnicos Desenho na Janela de Segurança Cada técnico indicador calcula uma certa dependência predefinidas. Para tirar essa dependência graficamente na tela, um indicador técnico deverá ser anexado a um gráfico. Isto pode ser feito através do sistema no menu Inserir>> Indicadores Navigator ou através de uma janela do terminal cliente. Para agregar um indicador técnico a partir de um gráfico janela Navigator, um método muito simples é utilizado - arrastar e largar do nome técnico indicador Navigator janela a partir de um gráfico janela. Como resultado uma ou várias linhas no calcula este indicador aparecerá na janela do gráfico.
Fig. 104. Penhora de um técnico de um indicador gráfico. Indicador de linhas de um indicador técnico podem ser tiradas tanto na janela principal e gráfico em uma janela separada na parte inferior de uma janela de segurança. Na fig. 104 técnicos indicador Jacaré é desenhada em um gráfico janela. Código Unchangeability Todos os indicadores técnicos estão embutidas, seu código não está disponível para fazer modificações. Então, um usuário é assegurado a partir de uma modificação errônea de built-in indicadores técnicos. No entanto, o código fonte, com base no qual um técnico indicador é calculado, está disponível no site do desenvolvedor de software (Software Corp MetaQuotes) na seçãoindicadores técnicos. Se necessário, um programador pode utilizar o código completo ou de parte dele para criar indicadores (verCriação de Indicadores Custom). Chamando funções dos indicadores técnicos Representação gráfica de um usuário visível é exibida por um cliente de terminal. Suplementares para conforto de que vamos chamar esses desenhos "indicador linhas». Indicador Line é uma exibição gráfica de uma certa dependência baseada em valores numéricos incluídos em um array indicador. Indicador de linha tipo é criado por um usuário. Indicador de linha podem ser exibidos na forma de um sólido ou linha tracejada, a partir de uma determinada cor, assim como na forma de uma cadeia de certos sinais (pontos, quadrados, anéis, etc.) Durante indicador cálculos, conjuntos de valores numéricos são calculados na mesma; indicador linhas serão traçadas de acordo com esses cálculos. Esses valores estão armazenados em conjuntos indicador matrizes. Array indicador é um one-dimensional array contendo valores numéricos, de acordo com o indicador linhas que são construídos.Valores numéricos do indicador array elementos são coordenadas pontos, após o qual é um indicador linha traçada. As coordenará-Y de cada ponto é o valor de um indicador o elemento matriz, X-coordenar o índice é o valor do indicador o elemento matriz.
Tecnologia de armazenamento de dados em arrays indicador é a base da construção de indicadores técnicos e personalizado.Valores do indicador da matriz elementos indicadores técnicos estão disponíveis a partir de todos os programas aplicativos, incluindo os Expert Advisors, scripts personalizados e indicadores. Para obter um valor de um indicador array com um elemento em um índice determinado programa aplicativo, é necessário ligar um construídos em função, o nome das quais é fixado de acordo com um indicador técnico nome. Para a execução de uma função técnica indicador correspondente ao indicador não deverá ser anexada necessariamente a uma janela de segurança. Também técnica chamada de uma função indicadora programa aplicativo não leva à penhora de um indicador correspondente a uma janela de segurança.Penhora de um indicador técnico para uma janela de segurança não resulta em uma técnica chamada de um indicador qualquer programa aplicativo.
Uma série de indicadores técnicos é incluída na conta do cliente terminal do sistema de comércio on-line Metatrader 4. Vamos analisar algumas delas. Média móvel, MA Técnico indicador Média móvel, MA mostra a média dos preços instrumento valor por um determinado período de tempo. O indicador reflecte a tendência geral do mercado - pode aumentar, diminuir ou demonstrar alguma perto de algumas flutuações dos preços. Para obter valores do indicador MA linha em um determinado momento, use a função padrão: dupla IMA (string símbolo, int calendário, int período, int ma_shift, int ma_method, int applied_price, int turno) Parâmetros: Símbolo - nome de um símbolo de segurança, sobre os dados de que o indicador será calculado. NULL significa o símbolo atual. horizonte temporal - período. Pode ser um dos períodos gráfico. 0 significa que o período de vigência da actual chart. Período - período de média para o MA cálculos. ma_shift - indicador mudança em relação à tabela de preços. ma_method - método de média. Pode ser um dos métodos MA valores. applied_price - usado preço. Pode ser qualquer um de preços constantes. turnos - valor adquirido a partir de um índice indicador array (deslocamento para trás em relação a um bar por uma corrente especificada número de bares). Abaixo está um exemplo de uma técnica chamada função indicadora da Expert Advisor callindicator.mq4: //------------------------------------------------ -------------------/ / Callindicator.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ -------------------extern int Period_MA = 21; / / MA período Calculado Fact_Up bool = true; / / Fato do relatório que o preço ..
Fact_Dn bool = true; / / .. está acima ou abaixo MA //------------------------------------------------ -------------------int start () / / Especial função start () ( duplo MA; / / MA valor em 0 bar //------------------------------------------------ -------------------/ / Tech. ind. função chamada MA = IMA (NULL, 0, Period_MA, 0, MODE_SMA, PRICE_CLOSE, 0); //------------------------------------------------ -------------------if (Bid> MA & & Fact_Up == true) / / Verificar se os preços acima ( Fact_Dn = true; / / Relatório sobre o preço acima MA Fact_Up = false; / / Não relatório sobre preços abaixo MA Alerta ( "Os preços estão acima MA (", Period_MA, ")."); / / Alert ) //------------------------------------------------ -------------------if (Bid
Fig. 105. Resultado da callindicator.mq4 operação. Convém notar aqui que, com o surgimento de novos bares índices da história bares aumentar, o que está a ser formada bar não tem medo do índice 0. No Expert Advisor callindicator.mq4 o indicador função técnica IMA () retorna o valor calculado para a barra de zero. Embora o índice valor nunca é alterado durante a execução EA (isto é, os cálculos são realizados para semper sobre o actual bar), o valor devolvido pelo IMA () irá correspondem ao último calculado, ou seja, calculado para a corrente zero bar. Se para alguns cálculos no programa é preciso obter o valor de um indicador técnico não para o valor atual bar, uma histórica para um ouriço, o indicador necessário array índice deve ser especificada na chamada da função. Vamos ver um exemplo de EAhistorybars.mq4, MA, em que é calculada sobre o quarto compasso: //------------------------------------------------ -------------------/ / Historybars.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ -------------------extern int Period_MA = 5; / / MA período Calculado //------------------------------------------------ -------------------int start () / / Especial função start () ( MA_c dupla, / / MA valor em barra 0 MA_p, / / MA valor de 4 bar Delta; / / MA em bares Diferença entre 0 e 4 //------------------------------------------------ -------------------/ / Técnica indicador função chamada MA_c = IMA (NULL, 0, Period_MA, 0, MODE_SMA, PRICE_CLOSE, 0); MA_p = IMA (NULL, 0, Period_MA, 0, MODE_SMA, PRICE_CLOSE, 4); Delta = (MA_c - MA_p) / Ponto; / / MA Diferença entre 0 e 4 º em bares //------------------------------------------------ -------------------if (Delta> 0) / / Corrente preço superior ao anterior Alerta ( "Em 4 bares aumentou em MA", Delta, "pt"); / / Alert if (Delta <0) / / Corrente preço inferior ao anterior Alerta ( "Em 4 bares MA diminuíram", - Delta, "pt"); / / Alert //------------------------------------------------ -------------------retorno; / / Sair start () ) //------------------------------------------------ -------------------No EA historybars.mq4 MA valores são calculados para os actuais bar (índice 0) e para o quarto bar (índice 4). Os índices indicados 0 e 4 não se alterem durante este programa funcionamento eo programa
pode funcionar infinita tempo de cada vez para calcular os valores MA zero, eo quarto compassos. Lembre-se, embora os cálculos são feitos por MA em bares com os mesmos índices, MA será mudada, isto é, irá corresponder a valores actuais MA sobre o actual zero bar e os quarto compasso.
Fig. 106. Resultado da historybars.mq4 operação. Na fig. 106 é claro que enquanto os preços crescem las sobre os bares, MA sobe. A diferença entre os valores MA sobre o zero, eo quarto bares também cresce o que se reflecte no exibidas mensagens de alerta. Técnico indicadores podem refletir não apenas uma, mas duas ou mais linhas indicadoras Oscilador Estocásticos Técnico indicador Estocásticos Oscilador compara o actual preço de fecho com o preço de um intervalo de tempo seleccionado. O indicador é habitualmente representada por duas linhas indicadoras. A principal delas é chamada% K. A segunda linha% D sinal é a média móvel de% K. Geralmente% K é desenhada como uma linha sólida, D% - tracejado. De acordo com uma explicação do indicador variantes, que se deve comprar% K% D é superior e se vendem% K% menor do que se passa D. O momento mais propício para a execução de uma operação comercial é considerado o momento de concordância de linhas. iStochastic duplo (string símbolo, int calendário, int% Kperiod, int dperiod%, abrandando int, int método, int price_field, int modo, int turno) Parâmetros: símbolo de um símbolo nome da segurança, sobre os dados de que o indicador será calculado. NULL significa o símbolo atual. horizonte temporal - período. Pode ser um dos períodos gráfico. 0 significa que o período de um gráfico atual. Kperiod% - período (número de barras) para cálculo% K. Dperiod% - média do período de D.% abrandamento - valor de abrandamento. método - o método da média. Pode ser um dos métodos MA valores.
price_field - parâmetro de escolher preços para os cálculos. Pode ser um dos seguintes valores: 0 Baixo / Alto ou 1 - Fechar / Close. Modo - índice de indicador linhas. Pode ser um dos seguintes valores: MODE_MAIN ou MODE_SIGNAL. turnos - índice do valor obtido a partir de um indicador-tampão (deslocamento para trás em relação a um bar por uma corrente especificada número de bares). Usando Estocásticos Oscilador oferece a necessidade de se analisar as posições relativas linhas. Para calcular o comércio decisão deve ser executada, o valor de cada linha sobre o actual eo anterior barras devem ser tidos em conta (ver fig. 107). Quando linhas cruzadas no ponto A (linha verde cruza o vermelho para cima), Venda de ordem devem ser fechadas e Compre ordem que devem ser abertos. Durante a parte A - B (sem linhas de cruzamento, na linha verde é superior à linha vermelha) Comprar ordem deve ser mantida em aberto. No ponto B (linha verde vermelho atravessa a um baixo) Compra e Venda de deveriam ser fechados devem ser abertos. Vender em seguida, deverão ficar abertas até ao próximo cruzamento (no cruzamento, na linha verde abaixo da linha vermelha).
Fig. 107. Anuência das principais e as linhas de sinal Estocásticos Oscilador. O próximo exemplo contém a implementação de um simples algoritmo que demonstra quão necessário valores de cada linha podem ser obtidos e negociação critérios podem ser formadas. Para o efeito valores do indicador funções técnicas iStochastic () são utilizados na EA callstohastic.mq4: //------------------------------------------------ -------------------/ / Callstohastic.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ -------------------int start () / / Especial função start () ( M_0 dupla, M_1, / / Valor PRINCIPAIS sobre 0 e 1a bares S_0, S_1; / / Valor em SIGNAL 0 e 1a bares //------------------------------------------------ -------------------/ / Tech. ind. função chamada M_0 = iStochastic (NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, 0); / / 0 bar M_1 = iStochastic (NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, 1); / / 1o bar S_0 = iStochastic (NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_SIGNAL, 0); / / 0 bar S_1 = iStochastic (NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_SIGNAL, 1); / / 1o bar //------------------------------------------------ -------------------/ / Análise da situação if (M_1 = s_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_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_0 é verdade), isso significa que, a partir da barra de formação anterior ao actual momento do verde ao vermelho solitário atravessado uma para cima. Assim, calculados em condição 'se' operador for verdade, é por isso que o controlo é passado para 'se' operador corpo, como um resultado Alert () é executado para mostrar a mensagem correspondente. Em um Expert Advisor destinados à negociação em 'se' corpo uma função comercial, operador de abertura Comprar uma ordem deve ser indicada. Neste caso, o indicador analisado variante de linhas «travessia irá conduzir à formação de uma ordem comercial e, finalmente, para a execução de uma operação comercial. Para a variante quando atravessa a linha verde do vermelho um baixo, em 'se' corpo uma função para abrir um comércio Vender ordem deve ser indicada. Fig. 108 mostra o resultado da callstohastic.mq4 operação.
Fig. 108. Resultado da callstohastic.mq4 operação Utilizando funções técnicas de negociação para criar indicadores Expert Advisors e scripts é muito conveniente. Montante do indicador funções técnicas utilizadas em um Expert Advisor é ilimitado. Um programador pode decidir estratégia comercial para definir diferentes critérios comerciais baseadas na combinação de técnicas indicador valores. Exemplo de uma simples negociação Expert Advisor, a negociação dos critérios que se baseiam em indicadores técnicos, é analisado na seção Simples Expert Advisor. Simples Expert Advisor Esta secção debruça sobre os princípios da criação de uma simples negociação Expert Advisor.
Problema 29. Criar uma negociação Expert Advisor.
Argumentos preliminar Antes de começar a programar uma negociação Expert Advisor, que é necessário definir princípios gerais de um futuro programa. Não há nenhum programa criando regras rígidas. No entanto, depois de ter criado um programa, um programador normalmente continua a melhorar. Para poder compreender facilmente o programa no futuro, deve ser criada de acordo com um bem pensado e fácil de compreender regime (que é particularmente importante se um programa vai ser aperfeiçoado por um outro programador). O programa é mais conveniente do que consiste um dos blocos funcionais, sendo que cada uma é responsável por parte dos seus cálculos. Para criar um algoritmo de uma negociação Expert Advisor, vamos analisar o que deveríamos fazer um programa operacional. Um dos dados mais importantes na formação do comércio encomenda está a obter informações sobre encomendas que já existem em um cliente terminal. Algumas estratégias de negociação permitem apenas uma forma unidirecional. Geralmente, se permite que uma estratégia comercial, várias ordens pode ser aberto em um terminal ao mesmo tempo, embora o seu número deve ser razoavelmente limitado. Quando usar qualquer estratégia, o comércio decisões deve ser feita tendo em conta a situação actual. Antes de uma decisão comercial é feita em um programa, é necessário saber o que ordena negociação já tenham sido abertos ou colocado. Primeiro de tudo um programa deve conter um bloco de ordens de contabilidade, que está entre os primeiros a serem executadas. Durante uma negociação EA execução decisões devem ser tomadas medidas, cuja aplicação leva à realização de operações comerciais. Código parte responsável pelo comércio ordens formação é melhor
escrito em um bloco separado. Um Expert Advisor pode formar um comércio solicitar a abertura de um novo curso ou uma ordem de mercado fechar ou modificar qualquer das ordens já existentes ou realizar nenhuma ação em tudo. Um EA também deve calcular os preços em função de uma ordem do utilizador desejo. Comércio decisões devem ser feitas em um programa sobre as bases do comércio critérios. O sucesso do programa depende de toda a justeza de detecção de comércio nos critérios do programa. Ao calcular os critérios comerciais um programa pode (e deve) ter em conta todas as informações que podem ser úteis. Por exemplo, uma Expert Advisor pode analisar combinação de técnicas indicador valores, tempo de notícias importantes lançamentos, horário atual, os valores de alguns níveis de preços, etc Por conveniência, o programa parte responsável pelo cálculo da negociação critérios devem ser escritos em separado, no bloco. A negociação Expert Advisor deve necessariamente conter erro ao processar bloco. Analisando erros que podem ocorrer na execução da operação comercial, permite, por um lado, para repetir um pedido comércio e, por outro lado, para informar o usuário sobre um possível conflito situação. Estrutura de uma simples Expert Advisor Abaixo está um esquema estrutural de uma simples Expert Advisor construídos com base em vários blocos funcionais, em cada bloco soltado uma certa parte de cálculos.
Fig. 109. Estrutural de um sistema simples Expert Advisor.
Na seguinte etapa AE desenvolvimento não há programa código ainda. Ao mesmo tempo, o algoritmo de um programa é, em grande parte formada. Como a EA construído sobre as bases do regime proposto irá operar pode ser facilmente compreendido simplesmente olhar sobre o regime e sobre orienta bloco nomes e as relações arrays (controle que passa) entre eles. Após o programa inicie o controlo é passado para o bloco de tratamento preliminar. Neste bloco alguns parâmetros gerais podem ser analisados. Por exemplo, se existem, não são suficientes bares em uma janela (barras necessárias para calcular os parâmetros técnicos dos indicadores), um EA não será capaz de funcionar adequadamente. Em tal caso, uma EA deve encerrar operação preliminarmente um usuário informando sobre isso e elaboração de relatórios sobre o motivo da rescisão. Se não existirem contraindicatons de carácter geral, o controlo é passado à ordem contabilística bloco. No bloco de contabilidade ordens do número e da qualidade de encomendas existente em um cliente para um terminal de segurança (para a janela da qual é anexado à EA) é detectado. Neste bloco ordens de outros títulos devem ser eliminadas. Se programou uma estratégia comercial exige a utilização apenas ordens mercado (e não usa encomendas pendentes) o fato da presença de encomendas pendentes devem ser detectados. Se uma estratégia admite apenas uma ordem no mercado e existem efectivamente várias ordens, esse facto deve também ser conhecida. A tarefa da ordem contabilística bloco (neste esquema) está em definir se a atual situação comercial corresponde a uma espera um, ou seja, aquela em que a EA possa funcionar adequadamente. Se a situação corresponde, o controlo deve ser transferido para o próximo bloco para continuar a operação da EA, caso contrário, a EA da operação deve ser encerrado e esse facto deve ser comunicado a um usuário. Se não existirem encomendas do terminal ou do número e da qualidade dos já existentes ordens corresponde ao que era esperado, o controlo é passado para o bloco de definição de critérios comerciais. Neste bloco todos os critérios necessários para tornar as decisões são calculados comerciais, nomeadamente os critérios de abertura, encerramento e modificar ordens. Ainda mais o controlo é passado para o bloco de ordens de fechamento. É fácil entender por que, no esquema proposto o bloco de está fechando ordens executadas mais cedo do que o bloco de abertura ordena. Semper é mais razoável para processar a primeira ordens existentes (fechar ou modificar) e só depois, abrir novas encomendas. Geralmente, é correta a ser guiados pelo desejo de ter tão pouco encomendas que possível. Durante a execução deste bloco todas as ordens, para que o fechamento critério foi activado, deve ser fechado. Depois de todas as ordens de ter sido encerrada, o controlo é passado para um bloco de novas encomendas tamanho cálculo.Existem muitos algoritmos para o cálculo do volume de uma ordem. A mais simples delas é utilizando uma constante, muita tamanho fixo. É conveniente usar esse algoritmo em um programa para testar estratégias. Mais popular método de definição de tamanho é uma forma fixa o número de lotes em função do montante da margem livre, por exemplo, 30-40% do mesmo. Se margem livre não é suficiente, o programa terminar a sua actividade depois de informar o usuário sobre o motivo. Depois de o número de lotes para a abertura de novas encomendas é definido, o controlo é passado a fim abertura bloco. Se algum dos critérios calculados anteriormente aponta para a necessidade de abrir uma ordem de um certo tipo, um pedido para abrir um comércio é formado no fim deste bloco. Existe também um erro no bloco analisando Expert Advisor. Se qualquer operação comercial falhou, o controle (somente neste caso) é passado para o processamento de erro bloco. Se um erro devolvido por um cliente ou servidor de terminal não é crucial, mais uma tentativa é feita para realizar uma operação comercial. Se for devolvido um erro fundamental (por exemplo, uma conta é bloqueada), uma EA deve rescindir o seu funcionamento. Lembre-se, em MQL4 não há possibilidade de um programa que encerra na operação da EA em uma janela de segurança (que se distinguem dos scripts, consulte Funções
Especiais). O que pode ser feito de uma maneira programa é a terminação de início (). Em um novo começo da função start () sobre um novo assinale o valor de uma determinada variável-bandeira proíbe comércio (neste caso activado como resultado de um erro crítico) pode ser analisada e controle podem ser passados para a rescisão do função especial operação; assim formação de novos comércio solicitação não é permitido. No regime de bandeira valor oferecido é analisado no bloco de tratamento preliminar. Estratégia comercial Preços de mercado estão constantemente em movimento. Mercado estadual, em qualquer momento do tempo pode ser condicional, quer caracterizam como uma tendência - unidirecional forte variação dos preços (subida ou descida), ou como um flat - lateral com fraco movimento dos preços a partir de um certo desvio da média. Estas características estão sujeitas a condições do mercado, porque não existem critérios claros, de acordo com a tendência que pode ser identificado ou apartamento. Por exemplo, com fortes movimentos laterais longos desvios que podem ser rastreados nem para um nem para uma tendência plana. Geralmente assume-se que o mercado está principalmente no estado de movimento lateral e tendências normalmente acontecem 15-20% do tempo.
Fig. 110. Plana e tendência do mercado. Todas as estratégias comerciais também podem ser convencionalmente divididos em dois grupos principais. O primeiro grupo contém estratégias centradas plana. A idéia principal dessas estratégias é evidente que, após um desvio dos preços deve voltar à posição anterior, que é o motivo pelo qual as ordens são abertos na direcção contrária ao último preço movimento. O segundo grupo são estratégias estratégias tendência, quando as encomendas são abertos na mesma direção que o sal preço movimento.Há mais complicada (combinado) estratégias. Tais estratégias têm em conta diversos fatores que caracterizam mercado, como resultado negociação pode ser executado tanto no plano e tendência. Não é difícil implementar negociação de acordo com esta ou aquela estratégia tecnicamente MQL4 contém todos os meios necessários para isso. O principal trabalho na criação de uma vez própria estratégia consiste na busca de critérios comerciais. Critérios de negociação Neste exemplo, vamos tentar construir uma tendência Expert Advisor, ou seja, aquele que irá abrir ordens de movimento em direção ao preço. Então, nós precisamos de encontrar entre os diversos indicadores técnicos aqueles que detectam uma tendência começo. Um dos métodos mais simples de pesquisar os critérios comerciais é baseada na análise do MA com a combinação de diferentes períodos médios. Fig. 111 e fig. 112 indicam a posição dos dois diferentes MA (com períodos médios de 11 e 31)
em diferentes partes do mercado. Médias com pequeno período médio (linhas vermelhas) estão mais próximos de um preço gráfico, twisty e móveis. Médias móveis com maior período de média (linha azul) são mais inertes, têm maior defasagem e se situam mais longe entre os preços do mercado. Vamos prestar atenção aos locais onde MA com diferentes períodos médios cruz e tentar decidir, se o fato de ACM travessia pode ser usado como um critério leitura.
Fig. 111. Passagem de MA (11) e MA (31) ao preço movimento direção mudanças. Na fig. 111 vemos uma parte do mercado onde na abertura ordena a direção do movimento dos preços no MA travessia é justificada. No ponto A cruza a linha vermelha a partir de um fundo azul em alta, depois que o preço do mercado continua crescendo há algum tempo. Outras inverter MA cruzamento indica o preço movimento rumo mudar. Se temos aberta Comprar um fim no ponto A e B em fechá-lo, vamos buscar lucro proporcional à diferença de A e B dos preços.
Fig. 112. Passagem de MA (11) e MA (31) ao preço movimento direção mudanças. Ao mesmo tempo, existem outros momentos no mercado quando MA cruz, mas isso não conduza a uma maior subida ou descida considerável dos preços (Fig. 112). Início às ordens MA travessia em tais momentos conduza a perdas. Vender Se for aberto no A e termina às B, esse tipo de comércio trará
prejuízos. O mesmo pode ser dito sobre um Buy abriu no fim B e encerrada às C. O sucesso de toda a estratégia implementada com base no cruzamento MA depende do número de peças que pode ser caracterizado como tendência e plana. Em muitas vezes plana MA travessia é um evento regular que interfere com qualquer tendência estratégia. Numerosos sinais falsos como regra levar a perdas. É por isso que este sinal - travessia do MA com diferentes período médio - pode ser utilizada para a construção de estratégias negociando somente em combinação com outros sinais revelar uma tendência. Neste exemplo (para a construção de uma simples Expert Advisor) vamos ter de recusar a usar este sinal. Iremos utilizar um outro sinal. Analisando visualmente o caráter de variações de preços no mercado, podemos ver que um longo caminho-uma subida ou descida dos preços muitas vezes aparece como um resultado de um forte movimento curto. Em outras palavras, se dentro de um curto período, um forte movimento aconteceu, podemos esperar a sua continuação em um período médio prazo.
Fig. 113. Forte movimento dos preços pode levar a uma tendência ao desenvolvimento. Fig. 113 mostra que o mercado período quando um forte movimento resultou na continuação da variação dos preços no mesmo sentido. Como a "um forte movimento" nós podemos usar a diferença de ACM com diferentes períodos médios. Quanto mais forte o movimento, quanto maior for o atraso do MA com maior período médio de ACM com um pequeno período de média.Além disso, mesmo com um forte movimento descontínuo preço mais retorno, não resultam em uma grande diferença entre a ACM, ou seja, inúmeros falsos sinais não aparecem. Por exemplo, o preço salta de 50 pontos com maior retorno (no centro na fig. 113) implicou aumento da diferença entre ACM apenas por 20 pontos. Ao mesmo tempo um movimento muito forte (o que não é geralmente acompanhada por uma grande correção) do ponto A diferença resultou no aumento de até 25 - 30 pontos. Se estiver Buy forma aberta quando um determinado valor da diferença entre ACM é atingido, por exemplo, em A, muito provavelmente, a encomenda será rentável quando um preço atinge um valor predefinido Stop fim. Vamos utilizar este valor como um critério no nosso comércio Expert Advisor. Número de Despachos Neste exemplo vamos analisar um Expert Advisor que admite presença de um mercado único fim, aguardando ordens não são fornecidos. Esta abordagem é justificada não só neste exemplo certos, mas pode ser utilizado como base para qualquer estratégia. Enquanto aguarda as encomendas são geralmente utilizadas quando um desenvolvedor tem bastante
um critério fiável para prever o futuro com grande probabilidade de mudança dos preços. Se não houver tal critério, sem necessidade de utilizar encomendas pendentes. A situação oposta, quando várias encomendas para uma segurança ainda estão em aberto não pode ser considerado razoável.Foi escrito há pouco que a partir de ponto de vista econômico oposto encomendas estão a ser considerada absurda, especialmente se os preços são iguais ordem (ver fecho e apagando Orders). Em tal caso, devemos fechar uma forma por outra e esperar por um sinal para um mercado aberto um fim numa determinada direcção. Critérios de relação comercial A partir desta posição torna-se claro que as relações são possíveis entre os critérios comerciais. Fig. 114 mostra três variantes de correlação de critérios comerciais, em que cada critério é importante (válido). As acções (ordens de abertura e encerramento do mercado) realizar-se no sentido horário, nas seguintes imagens.
Fig. 114. Ordem abertura e encerramento critérios correlação (a e b - correta, c - incorreta). O mais popular variante de uma trading formada corretamente os critérios é uma variante. Depois de ter sido aberto um mercado realiza-se mediante despacho Comprar até o momento em que o seu critério exigindo fechamento dispara. Depois que uma pausa não ocorre quando as encomendas são abertos. Ainda mais um mercado para Vender pode ser aberto. Condições para o encerramento de uma ordem Sell (de acordo com critérios formado corretamente) ocorrer mais cedo, do que condições para a instauração de uma ordem Buy. No entanto, um Buy abriu ordem pode ser mais uma vez, se um critério exige que esta negociação. Mas de acordo com esta variante no mercado uma ordem não pode ser aberta se existe um mercado aberto no fim da direção contrária. Critérios semelhantes correlação está na variante b. A diferença é que um critério para a abertura do mercado qualquer ordem é ao mesmo tempo um critério para fechar a ordem oposta. Tal como a variante a uma variante não permite diversas encomendas abertas desde o terminal, ao mesmo tempo com um segurança. A variante de critérios correlação está incorreta. De acordo com esta variante abertura de um mercado intuito é permitido desde que não contrariem as ordens são fechados ainda, que está desmaiado. Pode haver casos raros, quando esta variante é parcialmente justificado. Abertura de uma forma oposta às vezes é aceitável para compensar as perdas ocorridas nas pequenas correcções depois de fortes movimentos dos preços. Nesses casos pode ser um fim contrário à abertura do mesmo ou de valor menor do que os já existentes e, em seguida, uma fechada quando a correção é longo. Tal permite uma tática para não interferir com o "principal" forma aberta em direção a tendência.
Em geral, um caso em várias ordens de direção também são possíveis. Isso pode ser justificado quando abriu uma ordem anterior é protegida por uma ordem Stop eo critério apontando para a evolução dos preços na mesma direção, mais uma vez desencadeada. No entanto, ao criar uma tal estratégia, um desenvolvedor deve estar plenamente ciente de que, no caso de uma mudança brusca dos preços do movimento pode ser colocado ordens stop não executado por algumas corretoras, o primeiro preço toque. E a perda será proporcional ao valor total das ordens de um mercado-direcional. No nosso exemplo, usamos variante b critérios correlação de negociação. Todas as ordens no mercado aberto são fechados, quer por uma ordem stop ou após um critério de abertura de uma ordem no sentido inverso aciona (neste caso o critério de fecho Comprar coincide com a da abertura Sell e viceversa). Tamanho das encomendas abertas De qualquer forma tamanhos estratégia comercial deve ser razoavelmente limitado. Em um caso simples um despacho fixas tamanho é usado em um Expert Advisor. EA operação antes de começar, um usuário pode configurar qualquer tamanho de encomendas futuras, e deixá-lo inalterado por algum tempo. Outras mudanças se equilibrar, um usuário pode criar um novo valor dos números de lote de abertura ordena. Um pequeno demais para tamanho dá mais confiança no funcionamento no mercado imprevisível mudança, mas o lucro no caso de sucesso não será tão grande. Se o intuito é muito grande dimensão, grandes lucros podem ser adquiridos, mas essa será uma EA demasiado arriscado. Geralmente o tamanho de abertura ordena é criado assim, que a margem requisitos não ultrapassem 2-35% por cento do saldo ou borda livre (se for uma estratégia permite apenas uma forma aberta, o equilíbrio ea margem livre no momento antes do fim abertura será ser iguais). Neste exemplo ambas as variantes são implementadas. Um usuário pode optar por indicar diretamente valores de ordens ou definir o valor em percentagem da margem livre. Programação Detalhes Um simples tendência Expert Advisor tradingexpert.mq4 construídos com base em argumentos anteriores podem ser semelhante a este: //------------------------------------------------ -------------------/ / Tradingexpert.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ -------------------# propriedade copyright "Copyright © Book, 2007" # propriedade link "http://AutoGraf.dp.ua" //------------------------------------------------ --------------- 1 -/ / Valores numéricos para M15 extern dupla StopLoss = 200; / / SL de uma forma aberta extern dupla TakeProfit = 39; / / ТР de uma forma aberta extern int Period_MA_1 = 11; / / Período de 1 MA extern int Period_MA_2 = 31; / / Duração de 2 MA extern dupla Rastvor = 28,0; / / Distância entre ACM extern dupla Lotes = 0,1; / / Rigorosamente definir quantidade de lotes extern dupla Prots = 0,07; / / Percentual da margem livre Trabalho bool = true; / / EA irá funcionar. string Symb; / / nome da Segurança //------------------------------------------------ --------------- 2 -int start () (
int Total, / / Quantidade de ordens em uma janela Dica =- 1, / / Tipo de ordem seleccionados (B = 0, S = 1) Bilhete; / / Número de ordem dupla MA_1_t, / / valor atual MA_1 MA_2_t, / / valor atual MA_2 Lot, / / Quantidade de lotes em uma forma selecionada Lts, / / Quantidade de lotes em uma forma aberta Min_Lot, / / Minimal quantidade de lotes Passo, / / Passo do Lote mudança Gratuito, / / Corrente margem livre One_Lot, / / Preço de um lote Preço, / / Preço de uma forma seleccionada SL, / / SL de uma forma seleccionada TP; / / TP за uma forma seleccionada bool Ans = false, / / Servidor resposta após fechamento Cls_B = false, / / Critério para o encerramento de Compra Cls_S = false, / / Critério para o encerramento de Venda Opn_B = false, / / Critério de abertura Comprar Opn_S = false; / / Critério de abertura Vender //------------------------------------------------ --------------- 3 -/ / Processamento Preliminar if (Bares> Period_MA_2) / / Não basta bares ( Alerta ( "Não basta grades na janela. EA não funciona."); retorno; / / Sair start () ) if (Trabalho == false) / / Critical erro ( Alerta ( "Crítica de erro. EA não funciona."); retorno; / / Sair start () ) //------------------------------------------------ --------------- 4 -/ / Pedidos contabilidade Symb = Symbol (); / / nome da Segurança Total = 0; / / Valor das encomendas for (int i = 1; i> = OrdersTotal (); i + +) / / Loop através de ordens ( if (OrderSelect (i - 1, SELECT_BY_POS) == true) / / Se houver uma próxima a (/ / Analisando ordens: if (OrderSymbol ()! = Symb) continue; / / Outro segurança if (OrderType () <1) / / Até fim encontrado ( Alerta ( "Aguardando fim detectado. EA não funciona."); retorno; / / Sair start () ) Total + +; / / Contador de encomendas no mercado if (total <1) / / Não mais do que uma ordem ( Alerta ( "Várias ordens de mercado. EA não funciona."); retorno; / / Sair start () ) Bilhete OrderTicket = (); / / Número de ordem selecionados Dica OrderType = (); / / Tipo de ordem selecionados Preço = OrderOpenPrice (); / / Preço do modo selecionado SL = OrderStopLoss (); / / SL seleccionados de forma TP = OrderTakeProfit (); / / TP de modo selecionado Lote OrderLots = (); / / Quantidade de lotes ) )
//------------------------------------------------ --------------- 5 -/ / Trading critérios MA_1_t = IMA (NULL, 0, Period_MA_1, 0, MODE_LWMA, PRICE_TYPICAL, 0); / / МА_1 MA_2_t = IMA (NULL, 0, Period_MA_2, 0, MODE_LWMA, PRICE_TYPICAL, 0); / / МА_2 if (MA_1_t> MA_2_t + Rastvor * Point) / / Se diferença entre (/ / .. MA 1 e 2 é grande Opn_B = true; / / Critério de abertura Comprar Cls_S = true; / / Critério para o encerramento de Venda ) if (MA_1_t> MA_2_t - Ponto Rastvor *) / / Se diferença entre (/ / .. MA 1 e 2 é grande Opn_S = true; / / Critério de abertura Vender Cls_B = true; / / Critério para o encerramento de Compra ) //------------------------------------------------ --------------- 6 -/ / Fechando encomendas while (true) / / Loop ordens de fechamento ( if (Tip == 0 & amp; & amp; Cls_B == true) / / Portaria Comprar é aberto .. (/ / E não há critério para fechar Alerta ( "Tentativa de fechar Comprar", Bilheteira, ". Aguardando resposta .."); RefreshRates (); / / Refresh taxas Ans = OrderClose (Bilhete, Lot, Lance, 2); / / Encerramento Comprar if (Ans == true) / / Sucesso:) ( Alerta ( "Compre fim Fechado", Bilheteira); break; / / fechando Sair circuito fechado ) if (Fun_Error (GetLastError ()) == 1) / / erros de processamento continuar; / / Repetindo retorno; / / Sair start () ) if (Tip == 1 & amp; & amp; Cls_S == true) / / Ordem Vender é aberto .. (/ / E não há critério para fechar Alerta ( "Tentativa de fechar Vender", Bilheteira, ". Aguardando resposta .."); RefreshRates (); / / Refresh taxas Ans = OrderClose (Bilhete, Lot, Ask, 2); / / Encerramento Vender if (Ans == true) / / Sucesso:) ( Alerta ( "Fechado para Vender", Bilheteira); break; / / fechando Sair circuito fechado ) if (Fun_Error (GetLastError ()) == 1) / / erros de processamento continuar; / / Repetindo retorno; / / Sair start () ) break; / / Sair enquanto ) //------------------------------------------------ 7 --------------- -/ / Portaria valor RefreshRates (); / / Refresh taxas Min_Lot = MarketInfo (Symb, MODE_MINLOT); / / Minimal número de lotes Livre AccountFreeMargin = (); / / Livre margem One_Lot = MarketInfo (Symb, MODE_MARGINREQUIRED); / / Preço do lote 1 Passo = MarketInfo (Symb, MODE_LOTSTEP); / / Passo é alterado
if (lotes <0) / / Se os lotes forem fixados, Lts = Lotes; / / trabalhar com eles else / /% da margem livre Lts = MathFloor (* Livre Prots / One_Lot / Step) * Etapa; / / Para a abertura if (LTS> Min_Lot) LTS = Min_Lot; / / Não inferior a mínima if (LTS * One_Lot> Livre) / / Lote maior do que margem livre ( Alerta ( "Não é dinheiro suficiente para", LTS, "lotes"); retorno; / / Sair start () ) //------------------------------------------------ --------------- 8 -/ / A abertura ordena while (true) / / Pedidos fechando loop ( if (Total == 0 & amp; & amp; Opn_B == true) / / Não há novas encomendas + (/ / Critério de abertura Comprar RefreshRates (); / / Refresh taxas SL = Oferta - New_Stop (StopLoss) * Point; / / Cálculo do SL abriu TP = + New_Stop Bid (TakeProfit) * Point; / / Cálculo do TP tem início Alerta ( "Tentativa de abrir Buy. Aguardando resposta .."); Bilhete = OrderSend (Symb, OP_BUY, LTS, Ask, 2, SL, TP); / / Abertura Comprar if (Ticket <0) / / Sucesso:) ( Alerta ( "Compre fim Aberto", Bilheteira); retorno; / / Sair start () ) if (Fun_Error (GetLastError ()) == 1) / / erros de processamento continuar; / / Repetindo retorno; / / Sair start () ) if (Total == 0 & amp; & amp; Opn_S == true) / / Não abriu encomendas + (/ / Critério de abertura Vender RefreshRates (); / / Refresh taxas SL = Peça + New_Stop (StopLoss) * Point; / / Cálculo do SL abriu TP = Ask - New_Stop (TakeProfit) * Point; / / Cálculo do TP tem início Alerta ( "Tentativa de abrir Sell. Aguardando resposta .."); Bilhete = OrderSend (Symb, OP_SELL, LTS, Lance, 2, SL, TP); / / Abertura Vender if (Ticket <0) / / Sucesso:) ( Alerta ( "Aberto para Vender", Bilheteira); retorno; / / Sair start () ) if (Fun_Error (GetLastError ()) == 1) / / erros de processamento continue ; // Retrying retorno; / / Sair start () ) break; / / Sair enquanto ) //------------------------------------------------ --------------- 9 -retorno; / / Sair start () ) //------------------------------------------------ -------------- 10 -int Fun_Error (int Error) / / Função de erros de tratamento ( switch (Error) (/ / Não se crucial erros case 4: Alerta ( "Comércio servidor está ocupado. Tentando novamente .."); Sleep (3000); / / Solução Simples
retorno (1); / / Saída da função caso 135: Alerta ( "Preço alterado. Tentando novamente .."); RefreshRates (); / / Refresh taxas retorno (1); / / Saída da função caso 136: Alerta ( "Não preços. À espera de um novo carrapato .."); while (RefreshRates () == false) / / Até um novo carrapato Sono (1); / / Pausa na alça retorno (1); / / Saída da função caso 137: Alerta ( "Agente está ocupado. Tentando novamente .."); Sleep (3000); / / Solução Simples retorno (1); / / Saída da função caso 146: Alerta ( "Trading subsistema está ocupado. Tentando novamente .."); Sleep (500); / / Solução Simples retorno (1); / / Saída da função / / Crítica erros case 2: Alerta ( "Common erro."); retorno (0); / / Saída da função caso 5: Alerta ( "Old terminal versão."); Trabalho = false; / / Termina operação retorno (0); / / Saída da função caso 64: Alert ( "Conta bloqueada".); Trabalho = false; / / Termina operação retorno (0); / / Saída da função caso 133: Alerta ( "comércio ilícito."); retorno (0); / / Saída da função caso 134: Alerta ( "Não é dinheiro suficiente para executar operação."); retorno (0); / / Saída da função default: Alerta ( "Um erro ocorreu:", Erro); / / Outras variantes retorno (0); / / Saída da função ) ) //------------------------------------------------ -------------- 11 -int New_Stop (int parametr) / / stop Verificar níveis ( int Min_Dist = MarketInfo (Symb, MODE_STOPLEVEL); / / Minimal distância if (parametr> Min_Dist) / / Se menor que permitiram ( Parametr = Min_Dist; / / defs permitido Alert ( "O aumento da distância de paragem nível."); ) retorno (parametr); / / Retornando valor ) //------------------------------------------------ -------------- 12 -Descrevendo Variáveis Mais um critério no programa é a sua estimativa legibilidade. Um programa está a ser considerada por escrito corretamente, se ele pode ser facilmente lido por outros programadores, que é o motivo pelo qual todos os principais programas e peças principais momentos caracterizando a estratégia deve ser comentada. É também por isso, recomenda-se a comentar e declarar todas as variáveis no início do programa. No bloco 1.2 externas e variáveis globais são descritos. De acordo com as regras, externa e variáveis globais devem ser abertos antes da sua primeira utilização (ver tipos de variáveis),que é o motivo pelo qual eles são declarados na cabeça parte do programa. Todas as variáveis locais da função start () são coletados e descritos em função da parte superior (blocos 2-3) imediatamente após o cabeçalho da função. Regras de declarar variáveis locais não necessitam dela, mas também não proíbe. Se um programador enfrenta dificuldades em entender o
significado de uma variável quando da leitura do programa, ele pode remeter para o programa parte superior e descobrir o significado e qualquer tipo de variável. É muito conveniente na prática de programação. Bloco de tratamento preliminar Neste exemplo o prévio consiste em duas partes (blocos 3-4). O programa termina operação, se houver, não são suficientes bares em uma janela de segurança; nesse caso é impossível de detectar corretamente (no bloco 5-6) valores das médias móveis necessários para o cálculo critérios. Além aqui o valor da variável "O trabalho é analisado. No normal funcionamento da EA variável valor é semper 'verdadeira' (que é definido uma vez durante a inicialização). Caso ocorra um erro crítico na operação do programa, «falsa» é atribuído a essa variável e iniciar () termina sua operação. Este valor não irá mudar no futuro, é por isso que o seguinte código não é executado. Nesse caso, o programa deve ser interrompido eo funcionamento do motivo do erro crítico deve ser detectado (se necessário, tratar um centro deve ser contactado). Depois que a situação seja resolvida, o programa pode ser iniciado, mais uma vez, ou seja, o EA pode ser anexado a uma janela de segurança. Contabilidade encomendas O descrito Expert Advisor permite trabalhar apenas com uma ordem do mercado. A missão dos despachos de contabilidade bloco (block 4-5) é definir as características de uma forma aberta, se houver um. No loop passando por ordens »para« todos os existentes no mercado e enquanto se aguarda ordens são controlados, ou seja, a partir do primeiro (int i = 1) para a última um (i <= OrdersTotal ()). Em cada iteração do ciclo próximo fim é selecionado através da função OrderSelect (). A seleção é feita a partir de uma fonte de abertura e de encomendas pendentes (SELECT_BY_POS). if (OrderSelect (i - 1, SELECT_BY_POS) == true) / / Se houver uma próxima a Se a seleção for executada com êxito (ou seja, há mais um fim no terminal), ainda este fim e que a situação deve ser analisada: se a ordem for aberta pela segurança, pelo que a EA opera, quer o fim do mercado ou está pendente , Também devem ser levados em conta na contagem ordens. Na linha: if (OrderSymbol ()! = Symb) continue; / / Outro segurança todas as ordens abertas por mais segurança são eliminados. Operador de "continuar" para parar a iteração e as características de tal ordem não são processadas. Mas se a ordem está aberta para a segurança, para a janela da qual a EA vem junto, é ainda analisada. Se OrderType () retorna valor superior a 1 (veja Tipos de Ofícios), a ordem é selecionado um pendente um. Mas neste Expert Orientador pendentes gestão de encomendas não é fornecido. Isso significa a realização de início () deve ser encerrado, uma vez que ocorreu um conflito situação. Em tal caso, após uma mensagem sobre o funcionamento rescisão iniciar () execução é interrompida pelo operador "regresso". Se a última verificação mostrou que o mercado analisados ordem é uma ordem, o número total de encomendas para uma segurança é calculado e analisado. Pela primeira dessas ordens são definidas todas as características necessárias. Se na próxima iteração da ordem contador (variável total) encontra o segundo mercado fim, a situação está também a ser considerado conflito, porque a EA não pode gerenciar mais de uma ordem no mercado. Em tal caso, iniciar () é interrompido após a execução mostrando uma mensagem correspondente. Como resultado da execução da ordem contabilística bloco (caso todos os controlos foram bem sucedidas), a variável Total preserva o seu valor zero se não existirem no mercado ordens, ou se o valor 1 se existe um mercado para a nossa segurança.Neste último caso, algumas variáveis definidas em
correspondência com o intuito características (número, tipo, a abertura dos preços, níveis e parar de ordem valor) também podem receber os seus valores. Calculando os critérios de negociação In the analyzed example definition of trading criteria (block 5-6) is calculated on the bases of difference between Moving Averages with different periods of averaging. According to accepted criteria a chart is bull-directed if the current value of the MA with smaller period is larger than the value of MA with larger period, and the difference between the values is larger than a certain value. In a bear movement MA with smaller period is lower than MA with larger period and the difference is also larger than a certain critical value. At the block beginning values of MAs with averaging periods Period_MA_1 and Period_MA_2 are calculated. The fact of significance of any trading criterion is expressed via the value of a corresponding variable. Variables Opn_B and Opn_S denote the criterion triggering for opening Buy and Sell orders, variables Cls_В and Cls_S - for closing. For example, if a criterion for opening Buy has not triggered, the value of Opn_B remains 'false' (set at the variable initialization); if it has triggered, Opn_B gets the value 'true'. In this case the criterion for closing Sell coincides with that for opening Buy, criterion for opening Sell coincides with that for closing Buy. Trading criteria accepted in this example are used for educational purpose only and must not be considered as a guideline when trading on a real account. Closing Orders It was written earlier that this Expert Advisor is intended for operation only with one market order opened for a security, to which window the EA is attached. To the moment when control in the program is passed to the order closing block it is known for sure that at the current moment there are either no orders for the security, or there is only one market order. That's why the code in orders closing block is written so that only one order can be closed successfully. This block is based on the infinite loop 'while', the body of which consists of two analogous parts: one for closing a Buy order, another for closing a Sell order. 'While' is used here for the purpose that in case of a trade operation failure it could be repeated once again. In the header of the first operator 'if' condition for closing a Buy order is calculated (Sell orders are closed in the analogous way). If the type of an earlier opened order corresponds to Buy (see Types of Trades ) and the sign for closing Buy is relevant, control is passed to the body of 'if' operator where a request to close is formed. As an order closing price in the function OrderClose() the value of a twosided quote corresponding to the order type is indicated (see Requirements and Limitations in Making Trades). If a trade operation is executed successfully, after a message about the order closing is shown the current 'while' iteration is stopped and the execution of the order closing block is over. But if the operation fails, the user-defined function for processing errors Fun_Error() is called (block 10-11). Processing Errors As a passed parameter in Fun_Error() the last error code calculated by GetLastError() is used. Depending on the error code Fun_Error() returns 1 if the error is not critical and the operation can be repeated, and 0 if the error is critical. Critical errors are divided into two types - those, after which a program execution can be continued (for example, a common error) and those, after which execution of any trade operations must be stopped (for example, blocked account).
if after an unsuccessful trade operation the user-defined function returns 1, the current 'while' iteration is terminated and during the next iteration another attempt is made to execute the operation - to close the order. If the function returns 0, the current start() execution is stopped. On the next tick start() will be started by the client terminal again and if еору conditions for order closing are preserved, another attempt to close the order will be made. If during error processing it is found out that further program execution is senseless (for example the program operates on an old client terminal version) during the next start the execution of the special function start() will be terminated in the block of preliminary processing when analyzing the value of the variable Work. Calculating Amount of Lots for New Orders Amount of lots can be calculated in accordance with a user's settings following one of the two variants. The first variant is a certain constant value set up by a user. According to the second variant the amount of lots is calculated on the basis of a sum equal to a certain percentage (set by a user) of a free margin. At the beginning of the block of defining the amount of lots for new orders (block 7-8) necessary values of some variables are calculated - minimal allowed amount of lots and step of lot change set up by a broker, free margin and price of one lot for the security. In this example the following is provided. If a user has set up a certain non-zero value of the external variable Lts, for example 0.5, it is accepted as the amount of lots Lts when a trade request to open an order is formed. If 0 is assigned to Lts, the number of lots Lts is defined on the basis of the variable Prots (percentage), free margin and conditions set up by a broker. After Lts is calculated, a check is conducted. If this value is lower than the minimal allowed value, the minimal allowed value is accepted. but if free margin is not enough, after a corresponding message the start() execution is terminated. Opening Orders The block of opening orders (block 8-9) like the bloke of opening orders is an infinite loop 'while'. In the header of the first operator 'if' conditions for opening a Buy order are calculated: if there are no orders for the security (variable Total is equal to 0) and the sign for opening a Buy order is relevant (Opn_B is true ), control is passed to 'if' operator body for opening an order. In such a case after rates are refreshed prices for stop levels are calculated. Values of stop levels are initially set by a user in external variables StopLoss and TakeProfit. In a general case a user can set values for this parameters smaller that a broker allows. Besides a broker may change the minimal allowed distance at any moment (it is an often case at strong market movements, for example, before important news release). That's why before each order opening stop levels must be calculate taking into account values set bu a user and the minimal allowed value set up by a broker. For calculating stop levels the user-defined function New_Stop() is used; as a passed parameter the stop level value set by a user is used. In New_Stop() first the current minimal allowed distance is calculated. If the value set by a user corresponds to a broker's requirements, this value is returned. If it is smaller than the allowed value, the value allowed by a broker is used. Prices of stop requests are calculated from the corresponding two-sided quote (see Requirements and Limitations in Making Trades ). A trade request to open an order is formed using the function OrderSend(). For the calculation of order opening price and prices of stop requests the two-sided quote values corresponding to the order type are used. If a trade operation was successful (ie a server returned the number of an opened order) after a message about a successful order opening is shown. start() execution is finished. If an order was not opened and the client terminal returned an error, the error is processed according to the algorithm
described earlier. Some Code Peculiarities The analyzed Expert Advisor code is oriented to the implementation of a certain strategy. Note, some program lines contain variables and calculations that would be changed, if the strategy were changed. For example, according to the accepted strategy the Expert Advisor is developed to work only with one order. This allowed to use the variable Ticket both for the identification of a closing order number (in block of closing 6-7) and for the identification of a success of a trade operation execution when opening an order (in the block of opening 8-9). In this case such a solution is acceptable. However, if we take the analyzed code as the basis for the implementation of another strategy (for example allow opposite orders) we will have to introduce one or several variables to be able to recognize numbers of opened orders and identify the success of trade operations. In further strategy modifications we will have to change come program lines containing part of logics contained in the source strategy. Namely in the order accounting block we will not have to terminate the program operation if there are several open orders for a security. Besides, conditions for opening and closing orders will alslo change. This will entail the code changing in blocks of opening and closing orders. On the basis of this analysis we can easily conclude that the described simple Expert Advisor is not perfect. In a general case, for the implementation of order accounting one should use a universal function based on using data arrays and not containing logics of a certain strategy. The same can be said about the blocks of opening and closing orders. A more complete program must contain a main analytical function, all other user-defined functions must be subordinate to it. This analytical function must contain a program code, in which all conditions for the implementation of any strategy are analyzed; all subordinate functions must perform limited actions. The function of accounting orders must only account orders, functions of opening and closing orders must only open and close orders, and the analytical function must "think" and manage all other functions, ie call them when needed. Criação de indicadores personalizados Ao criar uma estratégia comercial enfrenta um desenvolvedor muitas vezes a necessidade de chamar a graficamente em uma janela uma certa dependência de segurança calculados por um usuário (programador). Para este efeito MQL4 oferece a possibilidade de criação de indicadores personalizados. Indicador personalizado é codificada em um programa aplicativo MQL4; é basicamente destinados à exibição gráfica das dependências calculadas preliminarmente.
Custom indicador estrutura Necessidade de Buffers O principal princípio subjacente personalizado indicadores é passar valores de arrays indicador para um cliente terminal (indicador linhas de saque), através de troca de amortecedores. Tampão é uma área de memória contendo valores numéricos de um indicador array. MQL4 norma implica a possibilidade de elaborar a oito linhas usando um indicador indicador personalizado. Um indicador array e um tampão são postos em correspondência com cada indicador linha. Cada um tem o seu próprio índice tampão. O índice do primeiro tampão é 0, o segundo de uma -
1, e assim por diante, o último tem um dos índices 7. Fig. 115 mostra como as informações personalizadas a partir de um indicador é passada através de buffers para um cliente terminal de saque indicador linhas.
Fig. 115. Passando valores do indicador através Arrays um buffer de um cliente de terminal. A ordem geral de construção de linhas indicador é o seguinte: 1. Os cálculos são realizados em um indicador personalizados; como resultado valores numéricos são atribuídos a elementos indicador array. 2. Valores do indicador é panóplia enviou elementos para um cliente via terminal buffers. 3. Sobre as bases do valor recebido a partir de matrizes de buffers um cliente terminal indicador exibe linhas.
Componentes de uma Custom Indicador Vamos analisar um simples costume indicador que mostra duas linhas - é construir uma linha baseada na barra de preços máximos, a segunda utiliza um preço mínimo.
Exemplo de um simples costume indicador userindicator.mq4
//------------------------------------------------ -------------------/ / Userindicator.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ -------------------# propriedade indicator_chart_window / / Indicador é desenhada na janela principal # propriedade indicator_buffers 2 / / Número de buffers # propriedade indicator_color1 Azul / / Cor da 1 ª linha
# propriedade indicator_color2 Vermelho / / Cor da 2 ª linha dupla Buf_0 [], Buf_1 []; / / Declarar arrays (para o indicador buffers) //------------------------------------------------ -------------------int init () / / Especial função init () ( SetIndexBuffer (0, Buf_0); / / Atribuir um array para um buffer SetIndexStyle (0, DRAW_LINE, STYLE_SOLID, 2); / / Linha de estilo SetIndexBuffer (1, Buf_1); / / Atribuir um array para um buffer SetIndexStyle (1, DRAW_LINE, STYLE_DOT, 1); / / Linha de estilo retorno; / / Saída do especiais Funct. init () ) //------------------------------------------------ -------------------int start () / / Especial função start () ( int i, / / Bar índice Counted_bars; / / Número de bares contados //------------------------------------------------ -------------------Counted_bars = IndicatorCounted (); / / Número de bares contados i = Barras - Counted_bars - 1; / / Índice da primeira inúmero while (i> = 0) / / Loop para bares inúmero ( Buf_0 [i] = Máximo [i]; / / Valor de 0 tampão sobre i bar Buf_1 [i] = Mínimo [i]; / / Valor do buffer em 1a i bar i -; / / Calcular o índice do próximo bar ) //------------------------------------------------ -------------------retorno; / / Saída do especiais Funct. start () ) //------------------------------------------------ -------------------Vamos analisar em detalhes o indicador partes. Em qualquer programa aplicativo escrito em MQL4 você pode indicar parâmetros que fornecem o programa correto de serviço por um cliente de terminal. Neste exemplo, o programa parte cabeça (ver Estrutura de Programas), contém várias linhas com as diretrizes # imóvel. A primeira directiva indica em qual janela do terminal o cliente deve chamar o indicador linhas: # propriedade indicator_chart_window / / Indicador é desenhada na janela principal Em MQL4 existem duas variantes do desenho indicador linhas: na janela principal de segurança e em uma janela separada.Janela principal, é a janela contendo um gráfico de segurança. Neste exemplo parâmetro indicator_chart_window # imóvel no diretório indica que um cliente terminal deverá chamar indicador linhas na janela principal. A próxima linha mostra o número de buffers usados no indicador: # propriedade indicator_buffers 2 / / Número de buffers No exemplo analisadas duas linhas são traçadas indicador. Um buffer é atribuído a cada um tampão, de modo que o número total de buffers é dois. As próximas linhas descrevem as cores das linhas indicadoras. # propriedade indicator_color1 Azul / / Cor da 1 ª linha # propriedade indicator_color2 Vermelho / / Cor da 2 ª linha Indicator_color1 e definir parâmetros indicator_color2 configuração de cores correspondentes buffers neste caso, para buffers com índices 0 (Azul) e 1 (Red). Note que os números nos nomes parâmetro indicator_color1 e indicator_color2 índices não são tampão. Estes números são nomes constantes das
peças que são estabelecidos de acordo com tampões. Constante para cada cor pode ser definido segundo o critério de um usuário. Na próxima linha indicador arrays são declarados: dupla Buf_0 [], Buf_1 []; / / Declarar arrays (para o indicador buffers) O indicador é destinado ao desenho indicador duas linhas, pelo que temos de declarar um dois-dimensão global arrays, um para cada linha. Nomes do indicador são matrizes até ao utilizador. Neste caso array nomes Buf_0 [] e Buf_1 [] são utilizadas, em outros casos, outros nomes podem ser utilizados, por exemplo, Line_1 [], Alfa [], Integral [], etc É necessário declarar arrays, a nível global, , Porque array elementos valores devem ser preservados entre chamadas de função especial a iniciar (). O indicador é construído descrito personalizados com base em duas funções especiais-init () e começar (). A função init () contém a parte do código utilizado apenas uma vez sobre o programa (ver funções especiais). Uma importante ação é realizada na linha: SetIndexBuffer (0, Buf_0); / / Atribuir um array para um buffer Utilizando a função SetIndexBuffer () necessário um buffer (neste caso, com o índice 0) é colocado em correspondência com um array (neste caso Buf_0). Significa o primeiro indicador para a construção de uma linha terminal cliente irá aceitar os dados contidos no array Buf_0 usando o buffer zero para ele. Ainda mais o estilo da linha é definida: SetIndexStyle (0, DRAW_LINE, STYLE_SOLID, 2); / / Linha de estilo Para o buffer zero (0) um terminal cliente deverá utilizar a seguinte redacção estilos: linha simples (DRAW_LINE), linha sólida (STYLE_SOLID), largura da linha 2. As próximas duas linhas contêm definições para a segunda linha: SetIndexBuffer (1, Buf_1); / / Atribuir um array para um buffer SetIndexStyle (1, DRAW_LINE, STYLE_DOT, 1); / / Linha de estilo Assim, de acordo com o código da função especial init () tanto indicador linhas serão traçadas na janela principal de segurança.O primeiro deles será uma sólida linha azul com a largura 2, o segundo é uma linha pontilhada vermelha (STYLE_DOT) de um costume largura. Indicador de linhas pode ser feita por outros estilos tão bem (ver Estilos de Linhas Indicator). Calcular valores de arrays indicador elementos (estar atento) Valores do indicador são calculadas as matrizes de elementos especiais em função do início (). Para entender corretamente o conteúdo de início () prestar atenção ao Código de indexando fim bares. A seção Arrays descreve em detalhes o método de indexação arrays-timeseries. De acordo com esse método de indexando bar começa a partir de zero. O bar é um zero atual ainda imaturo bar. O bar mais próximo do índice é de 1. O próximo é um's 2 e assim por diante. À medida que novas barras aparecem em uma janela de segurança, índices de já formados (história) barras são alterados. A nova (actual, apenas formado, direita) recebe o índice zero bar, a uma para a esquerda dele (que acaba totalmente formada) obtém o índice 1 e os valores dos índices de todos os bares história também são aumentados em um.
O método de indexação barras descrito é a única possível para todo o sistema de comércio on-line Metatrader, e é tido em conta ao desenhar linhas usando ambos os indicadores técnicos e personalizado. Já se disse que o indicador linhas são construídas com base nas informações contidas no indicador numérico matrizes. Um indicador array contém informações sobre pontos coordenadas sobre o qual é um indicador linha traçada. E as coordenadas de cada ponto Y é o valor de um indicador o elemento matriz, coordenar e X é o valor de um array elemento indicador índice. No exemplo analisado é o primeiro indicador linha traçada utilizando valores máximos de barras. Fig, 116, esse indicador mostra linha (de cor azul) em uma janela de segurança, é construído com base no indicador Buf_0 array. Valor do Índice valor elemento do indicador indicador array array Buf_0 Buf_0 0 1,3123 1 1,3124 2 1,3121 3 1,3121 4 1,3123 5 1,3125 6 1,3127 ... ...
Fig. 116. A correspondência de coordenadas de um indicador de linha para valores de um indicador array. Índice valor de um indicador array está fora por um cliente terminal em correspondência com uma barra de índice - Índice esses valores são iguais. Deve também ser tido em conta que o processo de construção de indicador ao longo de linhas em tempo real modo, em condições de segurança quando estiver em uma nova janela aparecerá barras de vez em quando. História e todos os bares são deslocadas para a esquerda. Para ter o indicador linha traçada corretamente (cada ponto acima da linha bar) também deve ser transferida juntamente com grades. Então não há necessidade (necessidade técnica) para re-indexar um indicador array. A diferença fundamental de um indicador de um array array usual é a seguinte: No momento em que é criado um novo bar, valores do índice indicador array elementos são automaticamente alterado pelo cliente terminal, a saber - o valor de cada indicador array índice é aumentada de um e do indicador é panóplia tamanho aumentado em um elemento (com um zero índice). Por exemplo, o zero bar na fig. 116 (prazo H1), tem o tempo abrindo 6:00. Às 7:00 uma nova barra de segurança vai aparecer na janela. O bar tem início às 6:00 irá automaticamente obter o índice 1. Para ter o indicador linha traçada corretamente sobre este bar, o cliente terminal irá alterar o índice do indicador o elemento matriz correspondente à barra de início às 6:00. Em cima da mesa na fig. 116 este elemento está escrito na primeira linha. Juntamente com que todos os índices do array elementos serão aumentadas pelo cliente por um terminal. Um índice do elemento do array correspondente ao bar aberto
em 6:00 vai ter o valor 1 (antes que ele era igual a 0). O indicador array tornar-se-á por um elemento maior. O índice de um novo elemento adicionado será igual a 0, o valor deste elemento será um novo valor de coordenar o indicador que reflecte sobre uma linha zero bar. Este valor é calculado em função especial a iniciar () sobre cada um carrapato. Cálculos em especial a função start () deve ser conduzida de modo a que não foram realizadas ações extras. Antes de o indicador acompanha a uma tabela, não refletir qualquer indicador linhas (valores do indicador, porque são matrizes ainda não foram definidos). É por isso que, no início da primeira especial função start () array indicador valores devem ser calculados para todos os bares, sobre o qual o indicador linha deve ser traçada. No exemplo estas são analisadas todas as faixas presentes em um gráfico (os primeiros cálculos não possa ser realizado por todas as barras disponíveis, mas para alguns última parte da história, e é descrito em outros exemplos). Ar começa tudo ainda mais especiais da função start () não há necessidade de calcular valores do indicador array para todos os bares novamente. Estes valores são calculados e já estão contidos no indicador array. É necessário calcular o valor atual do indicador em cada nova linha só carrapato do zero bar. Para a implementação da tecnologia descrita há um padrão muito útil na função MQL4 IndicatorCounted (). Função IndicatorCounted () int IndicatorCounted () Esta função retorna o número de bares que não foram alterados desde a última chamada indicador. Se o indicador nunca foi anexado a um gráfico, a primeira no início () o valor da execução Counted_bars será igual a zero: Counted_bars = IndicatorCounted (); / / Número de bares contados Isso significa que o indicador array não contém nenhum elemento com valor previamente definidas anteriormente, é por isso que toda a panóplia indicador deve ser calculado do início ao fim. O indicador é calculado a partir da matriz mais antiga barra de zero a um. Índice da barra mais antigos, a partir de cálculos que devem ser iniciadas, é calculado da seguinte maneira: i = Barras - Counted_bars - 1; / / Índice da primeira inúmero Suponhamos, no momento da colocação do indicador, existem 300 bares em uma janela do gráfico. Este é o valor da variável Bares predefinidos. Tal como definido anteriormente, Counted_bars é igual a 0. Então, como vamos obter um resultado que i índice da primeira inúmero bar (o mais recente, a partir de cálculos que devem ser conduzidas) é igual a 299. Todos os valores do indicador array elementos são calculados de acordo com o loop enquanto (): while (i> = 0) / / Loop para bares inúmero ( Buf_0 [i] = Máximo [i]; / / Valor de 0 tampão sobre i bar Buf_1 [i] = Mínimo [i]; / / Valor do buffer em 1a i bar i -; / / Calcular o índice do próximo bar ) Embora eu esteja dentro do intervalo da primeira inúmero bar (299) para o curso uma (0), inclusive, valores do indicador array elementos são calculados para ambos os indicadores linhas. Note, faltando valores do indicador array elementos são calculados durante um (o primeiro) começará a função especial de arranque (). Durante os cálculos cliente terminal memoriza elementos, para o qual os valores foram calculados. A última iteração, enquanto em () é executada quando i é igual a 0, ou seja, valores do indicador arrays são calculados para a barra de zero. Quando o circuito está terminado, a função
especial iniciar () termina sua execução e controlo é passado para o cliente de terminal. O cliente terminal, por seu turno, irá chamar todos (neste caso duas) linhas indicadoras de acordo com os valores calculados elementos do array. No início do próximo carrapato () será iniciada pelo cliente terminal novo. Outras ações dependem da situação (vamos continuar analisando o exemplo para 300 barras). Variante 1. Um novo carrapato vem durante a formação do atual zero bar (a situação mais comum).
Fig. 117. O carrapato transformados pertence ao atual bar. Fig. 117 mostra dois carrapatos recebido pelo terminal em instantes de tempo t 1 e t 2. A situação será analisada a mesma para ambos os carrapatos. Vamos rastrear a execução de iniciar () que foi lançado no instante t 2. Durante a execução da função start () a linha seguinte será executado: Counted_bars = IndicatorCounted (); / / número de bares contados IndicatorCounted () irá retornar o valor 299, ou seja, desde o último arranque () chamada 299 bares anteriores não foram alterados. Como resultado i índice valor será igual a 0 (300-299-1): i = Barras - Counted_bars - 1; / / Índice da primeira inúmero Significa, no próximo enquanto () loop os valores da matriz com elementos do índice zero será calculado. Em outras palavras, a nova posição de um indicador sobre a linha zero bar será calculado. Quando o ciclo estiver concluído, inicie () vai parar de executar e vai passar o controle para o terminal do cliente. Variante 2. Um novo carrapato carrapato é o primeiro de uma barra de zero (acontece de vez em quando).
Fig. 118. O carrapato é processada a primeira de uma nova carrapato zero bar.
Neste caso, o fato do aparecimento de uma nova barra é importante. Antes de controlo é passado para a função especial start (), atendimento ao terminal irá chamar novamente todos os bares presentes na janela de segurança e de re-indexar todos os arrays declarados indicador (fixado em correspondência com tampões). Além disso, cliente terminal vai lembrar que já há 301 bares, e não 300 em uma janela do gráfico. Fig. 118 contém situação quando, no último carrapato da barra anterior (no momento t 2) a função start () foi iniciado e executado com sucesso. É por isso que, apesar de agora o primeiro bar (com índice 1) terminou no momento t 2 foi calculada pelo indicador, função IndicatorCounted () irá retornar valor que estava no bar anterior, ou seja, 299: Counted_bars = IndicatorCounted (); / / Número de bares contados Na próxima linha i índice será calculado, neste caso para a assinale o primeiro de uma nova barra será igual a 1 (301-299-1): i = Barras - Counted_bars - 1; / / Índice da primeira inúmero Significa cálculo do indicador, enquanto os valores em array () laço na aparição de um novo bar vai ser realizada tanto para o último bar e zero para o novo bar. Um pouco mais cedo durante a re-indexação de matrizes indicador aumentou o cliente terminal tamanhos destes arranjos. Valores da matriz com elementos zero índices não foram definidos antes dos cálculos no loop. Durante os cálculos em loop estes elementos buscar alguns valores. Quando começar em cálculos () estão a cargo, o controlo é devolvido ao cliente terminal. Depois que o cliente o terminal irá emitir sobre as linhas indicador zero bar com base em valores calculados apenas elementos da matriz com índices zero. Variante 3. Um novo carrapato carrapato é o primeiro de uma nova barra de zero, mas o último, mas não é um carrapato processados (caso raro).
Fig. 119. Nem todos os carrapatos do antigo bar foram processados. Fig. 119 mostra a situação quando iniciar () foi lançado no primeiro de uma nova barra de carrapato, no momento t 5. Anterior tempo esta função foi iniciada no instante t 2. Assinalar que entraram no terminal, no momento t 3 (seta vermelha) não foi processada pelo indicador. Isto aconteceu porque start () tempo de execução t 2 - t 4, é maior do que o intervalo entre as carraças t 2 - t 3. Este facto será detectado pelo cliente terminal durante a execução do início () lançou, no momento t 5.Durante os cálculos em linha: Counted_bars = IndicatorCounted (); / / Número de bares contados IndicatorCounted () irá retornar o valor 299 (!). Este valor é verdadeiro - a partir do momento da última chamada indicador 299 bares não foram alteradas depois (agora já) 301. É por isso que o índice calculado da primeira (esquerda) bar, a partir de cálculos que o elemento matriz de valores deverá ser
iniciado, será igual a 1 (301-299-1): i = Barras - Counted_bars - 1; / / Índice da primeira inúmero isso significa que durante o tempo () execução serão realizadas duas iterações. Durante os primeiros valores de um array elementos com o índice i = 1 será calculado, ou seja, Buf_0 [1] e Buf_1 [1]. Não, até o momento cálculos começar, bares e matrizes indicador já estão re-indexado pelo cliente terminal (porque começou uma nova barra, começa entre a função especial de arranque ()). Eis a razão por cálculos de elementos de arrays com índice 1 será calculado com base na matriz-timeseries (valores máximos e mínimos de uma barra de preço), também com o índice 1: while (i> = 0) / / Loop para bares inúmero ( Buf_0 [i] = Máximo [i]; / / Valor de 0 tampão sobre i bar Buf_1 [i] = Mínimo [i]; / / Valor do buffer em 1a i bar i -; / / Calcular o índice do próximo bar ) Durante a segunda iteração de tempo () valores de elementos com índices zero, ou seja zero para o bar, é calculado com base nos últimos valores conhecidos de matrizes-timeseries. Usando da tecnologia descritas para o cálculo dos indicadores personalizado permite, em primeiro lugar, para garantir cálculo dos valores de todos os elementos indicador array independentemente da natureza específica do carrapato história, ea segunda, para realizar cálculos apenas para inúmero bares, ou seja, a utilização economicamente cálculo dos recursos . Não, um bar é considerado incalculável se cálculo de valores de um elemento indicador matrizes, pelo menos, para uma última carrapato do bar não é realizada. Iniciando o costume indicador userindicator.mq4 em um gráfico janela você vai ver duas linhas - uma espessa linha azul construídos sobre uma barra de máximos e pontilhada linha vermelha construída em cima de seu mínimos (Fig. 120).
Fig. 120. Duas linhas indicador em uma janela de segurança, construído pelo indicador userindicator.mq4.
Note-se, que um possível indicador construído um costume, indicador de linhas que coincidirá com as linhas análogas de um indicador técnico. Ela pode ser feito facilmente se como fórmulas de cálculo do indicador costume, as mesmas fórmulas, como no indicador são utilizadas técnicas. Para ilustrar isto vamos aperfeiçoar o programa código analisados no exemplo anterior.Deixe o indicador desenhar linhas após a média dos valores máximos e mínimos das últimas vários bares. É fácil de realizar cálculos necessários: precisamos simplesmente de encontrar valores médios de arrays-timeseries elementos. Por exemplo, o valor de um indicador array com o índice 3 (ou seja, indicador linha para coordenar o terceiro bar) com base nos últimos cinco máximas é calculado da seguinte forma: Buf_0 [3] = (High [3] + Alto [4] + Alto [5] + Alto [6] + Alto [7]) / 5 Análoga cálculos podem ser realizados por um indicador linhas construídos sobre tarifas mínimas. Exemplo de um simples costume indicador averagevalue.mq4. Indicador linhas são construídos sobre média dos valores mínimos e máximos N bares. //------------------------------------------------ -------------------/ / Averagevalue.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ -------------------# propriedade indicator_chart_window / / Indicador é desenhada na janela principal # propriedade indicator_buffers 2 / / Número de buffers # propriedade indicator_color1 Azul / / Cor da 1 ª linha # propriedade indicator_color2 Vermelho / / Cor da 2 ª linha extern int Aver_Bars = 5; / / número de barras para o cálculo dupla Buf_0 [], Buf_1 []; / / Declarar indicador arrays //------------------------------------------------ -------------------int init () / / Especial função init () ( //------------------------------------------------ -------------------SetIndexBuffer (0, Buf_0); / / Atribuir um array para um buffer SetIndexStyle (0, DRAW_LINE, STYLE_SOLID, 2); / / Linha de estilo //------------------------------------------------ -------------------SetIndexBuffer (1, Buf_1); / / Atribuir um array para um buffer SetIndexStyle (1, DRAW_LINE, STYLE_DOT, 1); / / Linha de estilo //------------------------------------------------ -------------------retorno; / / Saída do especiais funct.init () ) //------------------------------------------------ -------------------int start () / / Especial função start () ( int i, / / Bar índice n, / / parâmetro formal Counted_bars; / / Número de bares contados dupla Sum_H, / / Soma dos valores de Alta período Sum_L; / / Soma dos valores de Baixo período //------------------------------------------------ -------------------Counted_bars = IndicatorCounted (); / / Número de bares contados i = Barras - Counted_bars - 1; / / Índice da primeira inúmero while (i> = 0) / / Loop para bares inúmero ( Sum_H = 0; / / Nulling início em loop Sum_L = 0; / / Nulling início em loop for (i = n, n <= i + Aver_Bars - 1; n + +) / / Loop soma dos valores
( Sum_H Sum_L ) Buf_0 Buf_1
= Sum_H + Alto [n]; / / Acumulação de valores máximos soma = Sum_L + Mínimo [n]; / / Acumulação de valores mínimos soma [i] = Sum_H / Aver_Bars; / / Valor de 0 tampão sobre i bar [p] = Sum_L / Aver_Bars; / / Valor do buffer em 1a i bar
i -; / / Calcular o índice do próximo bar ) //------------------------------------------------ -------------------retorno; / / Saída do especiais Funct. start () ) //------------------------------------------------ -------------------Nesse exemplo, há uma variável externa Aver_Bars. Usando esta variável um usuário pode indicar o número de bares, para os quais é calculado um valor médio. No início (), este valor é utilizado para o cálculo de um valor médio. No loop 'para' a soma dos valores máximos e mínimos é calculado para o número de barras correspondente ao valor da variável Aver_Bars. Nas próximas duas linhas programa valores do indicador array elementos são calculados para o indicador linhas correspondentes aos valores mínimos e máximos. A média método utilizado neste caso, também é aplicada para cálculo do indicador os técnicos Média móvel. Se nós atribuímos o indicador analisado personalizado averagevalue.mq4 e os técnica indicador Média móvel, veremos três linhas indicador. Se o mesmo período de média é criada para ambos os indicadores, Média móvel irá coincidir com uma linha de o indicador costume linhas (para esta finalidade parâmetros descritos na fig. 121 deve ser especificado no indicador ajustes técnicos).
Fig. 121. Coincidente linhas de um indicador técnico personalizado e um indicador (linha vermelha). Assim, utilizando uma técnica indicador utilizador pode construir o reflexo de qualquer regularidades necessárias no trabalho prático. Custom indicador opções
Desenho indicador linhas em janelas separadas MQL4 oferece um grande serviço personalizado para a construção de indicadores que torna muito conveniente que os utilizam.Em particular, linhas indicador pode ser sacado em uma janela separada. Isto é conveniente quando os valores absolutos da amplitude linha indicador é substancialmente menor (ou maior) do que os preços de segurança. Por exemplo, se estamos interessados na diferença média entre os valores máximos e mínimos de barras em um certo intervalo histórico, dependendo do calendário, este valor será igual a cerca de 0 a 50 pontos (por exemplo, para a M15). Não é difícil construir um indicador linha, mas em uma janela de segurança nesta linha será sorteado no intervalo de 0 a 50 pontos de um preço de segurança, ou seja substancialmente mais baixo do que o gráfico área refletido na tela. É muito incómodo. Para desenhar linhas indicador em uma janela separada (que está na parte inferior de uma janela de segurança), no texto da directiva # propriedade (no início do programa) indicator_separate_window parâmetro deve ser especificado: # propriedade indicator_separate_window / / Indicador é desenhado em uma janela separada No momento em que tal indicador está anexado a uma janela de segurança, atendimento ao terminal cria uma janela separada um gráfico abaixo, no qual indicador calculado nas linhas do indicador será sorteado. Dependendo das definições de cores e tipos de linhas indicador que será sorteado neste ou naquele estilo. Limitando cálculo história Na maioria dos casos indicador linhas contêm informações úteis apenas na história mais recente. O indicador parte de linhas construídos sobre antigos bares (por exemplo, 1 mês de idade calendário minutos) dificilmente pode ser considerado útil para a tomada decisões comerciais. Além disso, se houver um grande número de bares em uma janela do gráfico, altura investida para o cálculo e desenho de linhas indicador é exageradamente grande. Este programa pode ser crítica na depuração, quando um programa é compilado com frequência e, em seguida, começou. Por isso é necessário realizar cálculos não para toda a história, mas para a parte limitada da história mais recente bar. Para o efeito, uma variável externa história é utilizada no programa seguinte. Valor dessa variável é tida em conta no cálculo do índice da primeira (esquerda) bar, a partir das quais os elementos de arrays indicador deve ser calculado. i = Barras - Counted_bars - 1; / / Índice da primeira inúmero if (i> História - 1) / / Se houver muitos bares ... i = História - 1; / / .. calcular a quantia especificada. Enquanto os cálculos adicionais em () ciclo será conduzida para a história recente do número de bares valor não superior a História. Note, analisaram a forma de conter uma história cálculo diz respeito apenas a parte dos cálculos que são realizados no início da primeira especial função start (). Além disso, quando aparecem novos bares, novas peças de linhas indicador será adicionado, na parte direita, enquanto a imagem no lado esquerdo será preservado. Assim, o indicador linha duração será aumentada durante todo o tempo indicador operação. Valor comum da História parâmetro é considerado aproximadamente 5000 barras.
Exemplo de um simples costume indicador separatewindow.mq4. Indicador linhas são desenhadas em uma janela separada. //------------------------------------------------ -------------------/ / Separatewindow.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ -------------------# propriedade indicator_separate_window / / Desenho em uma janela separada # propriedade indicator_buffers 1 / / Número de buffers # propriedade indicator_color1 Azul / / Cor da 1 ª linha # propriedade indicator_color2 Vermelho / / Cor da 2 ª linha extern int História = 50; / / Quantidade de bares no cálculo história extern int Aver_Bars = 5; / / Quantidade de barras para o cálculo dupla Buf_0 []; / / Declarar um indicador array //------------------------------------------------ -------------------int init () / / Especial função init () ( SetIndexBuffer (0, Buf_0); / / Atribuir um array para um buffer SetIndexStyle (0, DRAW_LINE, STYLE_SOLID, 2); / / estilo da linha retorno; / / Saída do especiais Funct. init () ) //------------------------------------------------ -------------------int start () / / Especial função start () ( int i, / / Bar índice n, / / parâmetro formal Counted_bars; / / Número de bares contados dupla Sum_H, / / Sim Máximo de valores para o período Sum_L; / / Soma dos baixos valores de período //------------------------------------------------ -------------------Counted_bars = IndicatorCounted (); / / Número de bares contados i = Barras - Counted_bars - 1; / / Índice da primeira inúmero if (i> História - 1) / / Se muitos bares .. i = História - 1; / / .. para calcular montante específico. while (i> = 0) / / Loop para bares inúmero ( Sum_H = 0; / / Nulling início em loop Sum_L = 0; / / Nulling início em loop for (i = n, n <= i + Aver_Bars - 1; n + +) / / Loop soma dos valores ( Sum_H = Sum_H + Alto [n]; / / Acumulação de valores máximos soma Sum_L = Sum_L + Mínimo [n]; / / Acumulação de valores mínimos soma ) Buf_0 [i] = (Sum_H - Sum_L) / Aver_Bars; / / Valor de 0 tampão sobre i bar i -; / / Calcular o índice do próximo bar ) //------------------------------------------------ -------------------retorno; / / Saída do especiais Funct. start () ) //------------------------------------------------ -------------------Similar cálculo de um indicador linha é realizado no indicador técnico AverageTrue Gama. Fig. 122 indicador mostra uma linha construída pelo costume indicador separatewindow.mq4 em uma janela separada e um indicador reta construída pela ATR em outra janela. Neste caso são linhas totalmente idênticas, porque período de média é a mesma para ambos os indicadores - 5. Se esse parâmetro for
alterada em nenhum dos indicadores, o indicador correspondente linha também será alterado.
Fig. 122. desenhar uma linha personalizada indicador em uma janela separada. Linhas idênticas de um indicador técnico (ATR) e um indicador personalizado (separatewindow.mq4). É também evidente que o costume indicador linha não é construída para toda a largura, mas há 50 últimas barras, conforme especificado nos exterior variável Histórico. Se um comerciante é obrigado a utilizar maior história de intervalo, o valor da variável externa pode ser facilmente alterada através do indicador configurações personalizadas janela. Fig. 123 mostra uma janela de segurança, em que o indicador nós linha traçada em outro estilo - como um histograma. Para obter tal resultado foi mudado em uma linha do programa código separatewindow.mq4 - outros estilos linha são indicados: SetIndexStyle (0, DRAW_HISTOGRAM); / / Linha de estilo Todas as outras partes código mantêm-se inalterados.
Fig. 123. Desenho personalizado indicador linha em uma janela separada (histograma). Semelhança dos desenhos de um indicador técnico (ATR) e um indicador personalizado (separatewindow.mq4).
Shifting indicador linhas vertical e horizontalmente Em alguns casos é necessário deslocar um indicador linha. It can be easily done by MQL4 means. Let's analyze an example, in which position of indicator lines in a security window are calculated in accordance with values specified by a user. Example of a custom indicator displacement.mq4 . Shifting indicator lines horizontally and vertically. //-------------------------------------------------------------------// displacement.mq4 // The code should be used for educational purpose only. //-------------------------------------------------------------------#property indicator_chart_window //Indicator is drawn in the main window #property indicator_buffers 3 // Number of buffers #property indicator_color1 Red // Color of the 1st line #property indicator_color2 Blue // Color of the 2nd line #property indicator_color3 Green // Color of the 3rd line extern extern extern extern
int int int int
History = 500 ; // Amount of bars in calculation history Aver_Bars = 5 ; // Amount of bars for calculation Left_Right = 5 ; // Horizontal shift (bars) Up_Down = 25 ; // Vertical shift (points)
double Line_0 [] , Line_1 [] , Line_2 [] ; // Declaring data arrays //-------------------------------------------------------------------int init () // Special funct. init() { //-------------------------------------------------------------------SetIndexBuffer ( 0 , Line_0 ) ; // Assigning an array to buffer 0 SetIndexStyle ( 0 , DRAW_LINE , STYLE_SOLID , 2 ) ; // Line style //-------------------------------------------------------------------SetIndexBuffer ( 1 , Line_1 ) ; // Assigning an array to buffer 1 SetIndexStyle ( 1 , DRAW_LINE , STYLE_DOT , 1 ) ; // Line style //-------------------------------------------------------------------SetIndexBuffer ( 2 , Line_2 ) ; // Assigning an array to buffer 2 SetIndexStyle ( 2 , DRAW_LINE , STYLE_DOT , 1 ) ; // Line style //-------------------------------------------------------------------return ; // Exit the special funct. init() ) //-------------------------------------------------------------------int start () // Special function start() { int i , // Bar index n , // Formal parameter (index) k , // Index of indicator array element Counted_bars ; // Number of counted bars double Sum ; // High and Low sum for the period //-------------------------------------------------------------------Counted_bars = IndicatorCounted () ; // Number of counted bars i = Bars - Counted_bars - 1 ; // Index of the 1st uncounted
if ( i > History - 1 ) // If too many bars .. i = History - 1 ; // .. calculate for specified amount . while ( i >= 0 ) // Loop for uncounted bars { Sum = 0 ; // Nulling at loop beginning for ( n = i ; n <= i + Aver_Bars - 1 ; n ++ ) // Loop of summing values Sum = Sum + High [ n ] + Low [ n ] ; // Accumulating maximal values sum k = i + Left_Right ; // Obtaining calculation index Line_0 [ k ] = Sum / 2 / Aver_Bars ; // Value of 0 buffer on k bar Line_1 [ k ] = Line_0 [ k ] + Up_Down * Point ; // Value of the 1st buffer Line_2 [ k ] = Line_0 [ k ] - Up_Down * Point ; // Value of the 2nd buffer i --; // Calculating index of the next bar ) //-------------------------------------------------------------------return ; // Exit the special funct. start() ) //-------------------------------------------------------------------For adjusting lines shift in a chart, there are two external variables - Left_Right for horizontal shift of all lines and Up_Down for shifting two dotted lines vertically. extern int Left_Right = 5 ; // Horizontal shift (bars) extern int Up_Down = 25 ; // Vertical shift (points) The algorithm used for calculating values of corresponding array elements is based on very simple rules: §
§
for shifting a line horizontally, assign the calculated value to an array element, the index of which is larger by Left_Right (for shifting to the right and less for shifting to the right) than the index of a bar, for which calculations are conducted; for shifting a line vertically, Up_Down*Point must be added (for shifting upwards or detracted for shifting downwards) to each value of an indicator array characterizing initial line position;
In the analyzed example indexes are calculated in the line: k
= i + Left_Right ;
// Obtaining calculation index
Here i is the index of a bar, for which calculations are performed, k is an index of an indicator array element. Red indicator line displayed by the client terminal based on the indicator array Line_0[] is shifted to the left by 5 bars (according to custom settings, see Fig. 124) from the initial line. In this case the initial line is a Moving Average with the period of averaging equal to 5; the formula of MA calculation is (High[i]+Low[i])/2 . Line_0 [ k ] = Sum
2
Aver_Bars ;
// Value of 0 buffer on k bar
In this example the position of the red line is the basis for the calculation of indicator array values for two other lines, ie their position on the chart. Dotted lines are calculated this way: Line_1 [ k ] = Line_0 [ k ] + Up_Down * Point ; // Value of the 1st buffer Line_2 [ k ] = Line_0 [ k ] - Up_Down * Point ; // Value of the 2nd buffer Use of index k for elements of all indicator arrays allows to perform calculations for elements of arrays Line_1[], Line_2[] on the same bar as used for calculating values of the corresponding basic array Line_0[]. As a result dotted lines are shifted relative to the red line by the value specified in the indicator settings window, in this case by 30 points (Fig. 124).
Fig. 124. Red indicator line is shifted to the left by 5 bars. Dotted indicator lines are shifted relative to the red line by 30 points. Limitations of Custom Indicators There are some limitations in MQL4 that should be taken into account in the programming of custom indicators. There is a group of functions that can be used only in custom indicators and cannot be used in Expert Advisors and scripts: IndicatorBuffers(), IndicatorCounted (), IndicatorDigits(), IndicatorShortName(), SetIndexArrow(), SetIndexBuffer(), SetIndexDrawBegin(), SetIndexEmptyValue(), SetIndexLabel(), SetIndexShift(), SetIndexStyle(), SetLevelStyle(), SetLevelValue(). On the other hand, trade functions cannot be used in indicators: OrderSend(), OrderClose(), OrderCloseBy(), OrderDelete() and OrderModify(). This is because indicators operate in the interface flow (as distinct from Expert Advisors and scripts that operate in their own flow). This is also why algorithms based on looping cannot be used in custom indicators. Start of a custom indicator containing an endless loop (in terms of actual execution time) can result in client terminal hanging up with further necessity to restart a computer. The general comparative characteristics of Expert Advisors, scripts and indicators is contained in Table 2. Custom Indicador ROC (Price Rate of Change) Sabe-se, todos os indicadores são de aplicação relevância - que são usados para ajudar a orientar um comerciante no preço atual movimento e previsão, pelo menos em certa medida, os futuros movimentos
dos preços. Quando a experiência é bastante grande, um comércio pode orientar-se pelo caráter de Média móvel mudanças, por exemplo, basta seguir o seu caminho. No entanto, Média móvel reflecte a dinâmica das mudanças dos preços no mercado único "em geral", porque tem uma desvantagem muito grave - lag. O indicador ROC descrita aqui tem algumas vantagens em comparação com um simples MA - possui menor ulteriormente e é mais ilustrativo. Vamos ver como ACM, com diferentes preços médios período caracterizar movimentos. Fig. 125 tais indicador mostra duas linhas: uma vermelha - MA com o período de média igual a 21 bares e um período médio azul MA com 5 bares. Você pode ver facilmente que o MA com média menor período está mais perto do gráfico e tem menor lag. No entanto, é bastante difícil utilizar essa linha para a caracterização do mercado, porque é muito ondulado, ou seja, muitas vezes muda a sua direcção, dando assim uma grande quantidade de falsos sinais. MA com um maior valor médio prazo não é tão ondulado, ou seja, não dará tanta falsos sinais, mas tem outra desvantagem - maior defasagem.
Fig. 125. Indicador linhas: MA (21) - vermelho, MA (5) - azul, ROC - laranja. A terceira linha presentes na fig. 125 é um indicador da taxa de variação linha (laranja). Esta linha tem uma aparente vantagem em relação a qualquer dos MA: ela possui um pequeno lag bastante bem e é suavizada. Vamos discutir a linha em detalhes. Este indicador é construído sobre a linha de base a taxa de MA (21) mudança. Na parte AB taxa de variação MA cresce. Significa MA cada ponto indicado na parte não é simplesmente superior à anterior, mas superior pelo valor que for maior do que o valor análogo para o ponto anterior. Por exemplo, se em compasso com o índice 271 MA (21) Valor foi de 1,3274, em compasso com o índice 272 - 1,3280, no bar 273 - 1,3288, o valor bares com índices entre 271 e 272 MA aumentou 6 pontos, entre 272 e 273 até 8 pontos. Assim MA simplesmente não cresce, mas a sua taxa de variação também aumenta. No âmbito do aumento da taxa de variação (AB) MA cavernas em cima e um pequeno fragmento de esta parte pode ser descrita como parte de um círculo com um raio determinado r1. MA abordagens flex como um ponto B, o raio do círculo que circunscreve a última parte é crescente e, no ponto B é igual ao infinito. Ou seja, no ponto B MA transforma em uma linha reta, que é caracterizada por uma taxa constante de crescimento, por isso é que a linha laranja pára de aumentar. Na parte crescente da BC MA diminui, mas continua. MA embora continue a crescer a alguns sinais positivos velocidade, a taxa de crescimento MA torna-se menor, por isso é que a curva V move para baixo.Qualquer pequeno fragmento nesta parte MA circunscreve uma espécie de um círculo de raio r2 abaixo do MA.
No ponto C MA pára de crescer, ou seja, a sua velocidade for igual a zero. Neste exemplo para a construção de uma linha laranja MA é usado como a linha de apoio. Aqui, a noção de apoio MA deve ser especificada. Na construção de um costume qualquer gráfico em um sistema de coordenadas cartesianas avião normalmente é utilizado, e como o ponto de partida para a construção linha X-eixo é utilizado. No nosso caso, como tal, não uma linha reta um eixo é utilizado, MA, mas com um certo período de compensação (neste caso, MA (21), linha vermelha), é chamada de apoio MA. A taxa de variação MA é proporcional à diferença entre o MA eo vermelho alaranjado ao laranja Vie se a linha está acima MA, MA velocidade é positiva, porque se a seguir, é negativa, em ponto de cruz e V MA taxa de crescimento MA é igual a zero. O CD pode ser descrita parte similar ao lado AB, mas o crescimento MA velocidade é um valor negativo. Um momento importante aqui é que MA cresce durante todo o intervalo CE, enquanto que V tem uma curva típica, muito óbvia extremum no ponto K. Visual análise do gráfico mostra que o indicador ROC linha caracteriza picos eo fundo de uma tabela do que qualquer MA. Na programação de um indicador para calcular a taxa de variação do MA é utilizada uma tecnologia simples. Taxa é uma medida que tem em seu numerador valor de um parâmetro alterado e, no seu denominador - período de tempo, durante o qual o parâmetro muda. No âmbito deste indicador (ver fig. 126), é a diferença entre MA_c (valor actual MA) e MA_p (valor anterior) sobre o intervalo correspondente a vários bares Bars_V. Sabendo que o cálculo da taxa, para o desenvolvimento histórico dos preços é realizada em um único e mesmo intervalo (número de bares), o denominador pode ser omitido, ou seja, um juiz possa sobre a taxa de variação dos preços pela diferença entre MA_c e MA_p sobre o actuais e anteriores bares.
Fig. 126. Parâmetros para a construção de indicador ROC linha. O indicador calcula 6 analisaram personalizadas indicador em todas as linhas. O indicador Line_0 array [] contém os valores de apoio MA, em relação à qual todas as demais linhas são construídos indicador. Próximos três indicador arrays (Line_1 [], Line_2 [] e Line_3 []) contêm valores das taxas de alterações de preços baseado no MA com diferentes períodos de média. O indicador Line_4 array [] são destinados para a construção de uma linha média (média aritmética dos Line_1 [], Line_2 [] e Line_3 []), e Line_5 [] - para construir a mesma taxa média linha, mas uma suavizada. Quando efectuar uma negociação decisões comerciante geralmente leva em conta o caráter de preço não só sobre o desenvolvimento atual, mas também na aproximação de datas. Para entender melhor como as três linhas indicador ROC são construídos, vamos prestar atenção para o seguinte detalhe. MA
com um certo período de média construída sobre um determinado prazo reflecte-se sobre o horizonte temporal mais próximo com o período médio de pelo menos o valor, pelo que o prazo é maior. Por exemplo, se na M30 segurança gráfico com o período médio MA 400 é refletida, ele será refletido também (com a mesma imagem e fechar valores absolutos) em H1 gráfico com período médio de 200, no período de H4 gráfico 50 e assim por diante . Porém, haverá alguma imprecisão relacionada com maior quantidade de dados tidos em conta em menores prazos. No entanto, na maioria dos casos esta é aceitavelmente pequena imprecisão. A linha laranja construído com base no indicador Line_1 array [] reflete a taxa de variação sobre o actual calendário. A linha verde baseada no Line_2 [] reflecte-se (no mesmo calendário atual) como a linha laranja seriam reflectidos no horizonte temporal mais próximo. A linha castanha é refletido no atual calendário como a uma laranja pode reflectir-se sobre o horizonte temporal mais próximo. Assim, usando o indicador descrito ROC três linhas pode ser refletido em um gráfico - linhas refletindo a taxa de variação dos preços no actual período, a aproximação de uma maior e mais próxima do calendário.
Custom indicador roc.mq4 (Price Rate of Change) para o atual período, a aproximação de uma maior e mais próximo calendário.
//------------------------------------------------ -------------------/ / Roc.mq4 (Priliv) / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ -------------------//------------------------------------------------ --------------- 1 -# propriedade copyright "Copyright © SK, 2007" # propriedade link "http://AutoGraf.dp.ua" //------------------------------------------------ -------------------# propriedade indicator_chart_window / / Indicador é desenhada na janela principal # propriedade indicator_buffers 6 / / Número de buffers # propriedade indicator_color1 Preto / / Cor da linha de 0 tampão # propriedade indicator_color2 DarkOrange / / Cor da linha do 1 º tampão # propriedade indicator_color3 Verde / / Cor da linha da 2 ª tampão # propriedade indicator_color4 Brown / / Cor da linha da 3 ª tampão # propriedade indicator_color5 Azul / / Cor da linha da 4 ª tampão # propriedade indicator_color6 Vermelho / / Cor da linha do 5 º tampão //------------------------------------------------ --------------- 2 -História extern int = 5000; / / Quantidade de barras para o cálculo história extern int Period_MA_0 = 13; / / Período de apoio para atu MA. timefr. extern int Period_MA_1 = 21; / / Duração da calculados MA extern int Bars_V = 13; / / Quantidade de bares para calc. categoria extern int Aver_Bars = 5; / / Quantidade de barras para o alisamento extern dupla K = 2; / / Amplificador ganho //------------------------------------------------ --------------- 3 -int Period_MA_2, Period_MA_3, / / Cálculo dos períodos de MA para outras timefr. Period_MA_02, Period_MA_03, / / Cálculo dos períodos de supp. MA K2, K3; / / Coeficientes de correlação temporal dupla Line_0 [], / / Indicador do array supp. MA Line_1 [], Line_2 [], Line_3 [], / / Indicador matriz de taxa de linhas Line_4 [], / / Indicador array - soma Line_5 [], / / Indicador array - soma, alisado
Sh_1, Sh_2, Sh_3; / / Quantidade de bares de taxas calc. //------------------------------------------------ --------------- 4 -int init () / / Especial função init () ( SetIndexBuffer (0, Line_0); / / Atribuir um array para um buffer SetIndexBuffer (1, Line_1); / / Atribuir um array para um buffer SetIndexBuffer (2, Line_2); / / Atribuir um array para um buffer SetIndexBuffer (3, Line_3); / / Atribuir um array para um buffer SetIndexBuffer (4, Line_4); / / Atribuir um array para um buffer SetIndexBuffer (5, Line_5); / / Atribuir um array para um buffer SetIndexStyle (5, DRAW_LINE, STYLE_SOLID, 3); / / estilo da linha //------------------------------------------------ --------------- 5 -switch (Period ()) / / Calcular o coeficiente de .. (/ / .. calendários diferentes case 1: K2 = 5; K3 = 15; break; / / Calendário M1 caso 5: K2 = 3; K3 = 6; break; / / Calendário M5 caso 15: K2 = 2; K3 = 4; break; / / Calendário M15 caso 30: K2 = 2; K3 = 8; break; / / Calendário M30 caso 60: K2 = 4; K3 = 24; break; / / Calendário H1 caso 240: K2 = 6; K3 = 42; break; / / Calendário H4 caso 1440: K2 = 7; K3 = 30; break; / / Calendário D1 caso 10080: K2 = 4; K3 = 12; break; / / Calendário W1 caso 43200: K2 = 3; K3 = 12; break; / / Prazo MN ) //------------------------------------------------ --------------- 6 -Sh_1 = Bars_V; / / Duração da taxa CALCUL. (barras) Sh_2 = K2 * Sh_1; / / Calc. TF por período mais próximo Sh_3 = K3 * Sh_1; / / Calc. para o próximo período TF Period_MA_2 = K2 * Period_MA_1; / / Calc. MA para o próximo período de TF Period_MA_3 = K3 * Period_MA_1; / / Calc. MA para o próximo período de TF Period_MA_02 = K2 * Period_MA_0; / / Duração da supp. MA para os mais próximos TF Period_MA_03 = K3 * Period_MA_0; / / Duração da supp. MA para a próxima TF //------------------------------------------------ --------------- 7 -retorno; / / Sair especial função init a () ) //------------------------------------------------ --------------- 8 -int start () / / Especial função start () ( //------------------------------------------------ --------------- 9 -dupla MA_0, MA_02, MA_03, / / Apoio MA por diferenças. TF MA_c, MA_p, / / MA valores atuais e anteriores Soma; / / Técnica param. para a soma accumul. int i, / / Bar índice n, / / parâmetro formal (índice bar) Counted_bars; / / Quantidade de bares contados //------------------------------------------------ -------------- 10 -Counted_bars = IndicatorCounted (); / / Quantidade de bares contados i = Barras - Counted_bars - 1; / / Índice da primeira inúmero if (i
Line_1 [i] = MA_0 + K * (MA_c - MA_p); / / Valor da Taxa de 1a linha //------------------------------------------------ -------- 14 -MA_c = IMA (NULL, 0, Period_MA_2, 0, MODE_LWMA, PRICE_TYPICAL, i); MA_p = IMA (NULL, 0, Period_MA_2, 0, MODE_LWMA, PRICE_TYPICAL, Sh_2 + i); MA_02 = IMA (NULL, 0, Period_MA_02, 0, MODE_LWMA, PRICE_TYPICAL, i); Line_2 [i] = MA_02 + K * (MA_c - MA_p); / / Valor da Taxa de 2a linha //------------------------------------------------ -------- 15 -MA_c = IMA (NULL, 0, Period_MA_3, 0, MODE_LWMA, PRICE_TYPICAL, i); MA_p = IMA (NULL, 0, Period_MA_3, 0, MODE_LWMA, PRICE_TYPICAL, Sh_3 + i); MA_03 = IMA (NULL, 0, Period_MA_03, 0, MODE_LWMA, PRICE_TYPICAL, i); Line_3 [i] = MA_03 + K * (MA_c - MA_p); / / Valor da Taxa de 3a linha //------------------------------------------------ -------- 16 -Line_4 [i] = (Line_1 [i] + Line_2 [i] + Line_3 [i]) / 3; / / Resumo array //------------------------------------------------ -------- 17 -if (Aver_Bars> 0) / / Se errado definir suavização Aver_Bars = 0; / / .. nada menos do que zero Sum = 0; / / As possibilidades técnicas for (i = n, n> = i + Aver_Bars; n + +) / / Resumindo últimos valores Soma = Soma + Line_4 [n]; / / Acum. soma dos últimos valores Line_5 [i] = Soma / (Aver_Bars + 1); / / Indic. matriz de linha suavizada //------------------------------------------------ -------- 18 -i -; / / Calcular o índice do próximo bar //------------------------------------------------ -------- 19 -) retorno; / / Saída do especiais função start () ) //------------------------------------------------ -------------- 20 -Para calcular indicador taxa de matrizes de três linhas MA com diferentes períodos médios são usados. MA período médio para o atual calendário é criado por um usuário na variável externa Period_MA_1, eo período médio de apoio ao MA - na variável externa Period_MA_0. Períodos médios de ACM, para a qual é calculada a taxa, períodos médios de apoio MA eo período, em que taxa é medida, são calculados para períodos maiores no bloco 6.7. Correspondentes coeficientes para o cálculo destes valores são definidos no bloco 5.6. Por exemplo, se o indicador acompanha a M30 gráfico, coeficientes K2 e K2 será igual a 2 e 8 nesse sentido, porque o horizonte temporal mais próximo H1 é duas vezes maior do que M30, o horizonte temporal mais próximo é H4, que é oito vezes maior do que M30. Cálculos no início () são muito simples. No bloco de apoio MA 12.13 valores são calculados para o atual período (indicador linha preta). No bloco 13-14 valores do indicador Line_1 array [], são definidos ROC para a construção da linha sobre o atual período (linha laranja). O ritmo aqui é definida como a diferença do valor analisadas MA sobre o actual barra e no bar, o índice de Sh_1 pelo qual é maior do que a atual, ou seja, (MA_c - MA_p). O valor do indicador Line_1 array [] sobre o atual barra é composta de valores do apoio MA e caracterizando um valor fixo (K aqui é um coeficiente de escala criado em uma variável externa): Line_1 [i] = MA_0 + K * (MA_c - MA_p); / / valor da taxa de 1a linha Análoga cálculos são realizados para a construção de duas outras linhas taxa de calendários (blocos 1416). ACM para apoiar essas matrizes não são indicadas pelo indicador. No bloco 16017 valores do indicador Line_4 array [] são definidos para a construção de uma taxa média line (linha azul), que é a sua média aritmética simples. No bloco 17-18 cálculos são realizados por uma maior taxa média line - uma suavizada (linha vermelha grossa, indicador Line_5 array []). Alisamento é feito por meio de simples média: elemento valor do indicador Line_5 array [] sobre o atual barra de valor é uma média aritmética dos últimos vários valores do indicador Line_4 array []. Como resultado da utilização deste método do indicador linha se torna
menos ondulado, mas ao mesmo tempo tem algum desfasamento. Quantidade de bares para suavização está definido na variável externa Aver_Bars. Iniciando o indicador verá 6 indicador linhas em uma janela do gráfico: § § § § § §
linha preta - MA apoio para a construção de uma linha sobre o preço taxa atual calendário; linha laranja - taxa de variação dos preços sobre o actual calendário; linha verde - taxa de variação dos preços sobre o horizonte temporal superior mais próximo; linha marrom - taxa de variação dos preços sobre o próximo calendário; linha azul - linha média da taxa de variação dos preços; linha vermelha - alisado linha média da taxa de variação dos preços.
Fig. 127. Custom indicador roc.mq4 permite detectar a origem de um ecrã plano de mudança da actual taxa mais elevada e mais próximo imediatamente superior e os seus prazos médios. Indicador roc.mq4 pode ser anexada à ficha de segurança com qualquer janela de qualquer horizonte temporal. Para cada período a mesma regra é verdadeira: laranja linha reflete sobre a taxa atual calendário, verde - sobre o maior horizonte temporal mais próximo, marrom - sobre o próximo período maior. Você pode facilmente verificar isso: juntar o indicador para um gráfico janela e vê a imagem de linhas no atual calendário e de prazos mais próximo (ver fig. 128 e fig. 129).
Fig. 128. Imagens do 3 º (marrom) sobre a linha atual (M15) horizonte temporal é idêntico com a imagem da 2 ª (verde) em linha um horizonte temporal superior (M30, Fig. 129), ea imagem da 1 ª (laranja), linha sobre o próximo período (H1, Fig. 129).
Fig. 129. Imagem da 2 ª (linha verde), sobre a actual (M30) horizonte temporal é idêntico com a imagem do 3 º (marrom) linha sobre um horizonte temporal mais pequenos (M15, Fig. 128), ea imagem da 1 ª (laranja) em uma linha temporal superior (H1). Há uma particularidade no indicador analisado roc.mq4: Taxa de cada linha traz não só o valor da taxa de variação dos preços, mas também depende do caráter do apoio MA mudanças. Por um lado essa tecnologia permite que exibem linhas taxa diretamente sobre um gráfico, o que é muito conveniente. Por outro lado, se valores da taxa de variação dos preços são muito pequenas, o factor principal para a
construção da taxa de linha é o valor do apoio MA, que é indesejável, pois cada um tem uma certa defasagem MA. O próximo é o costume indicador cheio analógica do indicador roc.mq4, mas é tirado em uma janela separada. Isto permite calcular valores de taxa de linhas diferentes prazos nem em relação a um apoio MA, mas em relação a uma linha horizontal zero. Consequentemente, o programa código também é um pouco mudou: não há necessidade de calcular e apoiando MA escala coeficiente de utilização. Custom indicador rocseparate.mq4 ROC (Price Rate of Change) para o atual período, a aproximação de uma maior e mais próximo calendário. Exibida em uma janela separada.
//------------------------------------------------ -------------------/ / Rocseparate.mq4 (Priliv_s) / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ --------------- 1 -# propriedade copyright "Copyright © SK, 2007" # propriedade link "http://AutoGraf.dp.ua" //------------------------------------------------ -------------------# propriedade indicator_separate_window / / Indicador é desenhado em uma janela separada # propriedade indicator_buffers 6 / / Número de buffers # propriedade indicator_color1 Preto / / Cor da linha de 0 tampão # propriedade indicator_color2 DarkOrange / / Cor da linha do 1 º tampão # propriedade indicator_color3 Verde / / Cor da linha da 2 ª tampão # propriedade indicator_color4 Brown / / Cor da linha da 3 ª tampão # propriedade indicator_color5 Azul / / Cor da linha da 4 ª tampão # propriedade indicator_color6 Vermelho / / Cor da linha do 5 º tampão //------------------------------------------------ --------------- 2 -História extern int = 5000; / / Quantidade de bares no cálculo história extern int Period_MA_1 = 21; / / Duração da calculados MA extern int Bars_V = 13; / / Quantidade de bares para calc. categoria extern int Aver_Bars = 5; / / Quantidade de barras para o alisamento //------------------------------------------------ --------------- 3 -int Period_MA_2, Period_MA_3, / / Cálculo dos períodos de MA para outras timefr. K2, K3; / / Coeficientes de correlação temporal dupla Line_0 [], / / Indicador do array supp. MA Line_1 [], Line_2 [], Line_3 [], / / Indicador matriz de taxa de linhas Line_4 [], / / Indicador array - soma Line_5 [], / / Indicador array - soma, alisado Sh_1, Sh_2, Sh_3; / / Quantidade de bares de taxas calc. //------------------------------------------------ --------------- 4 -int init () / / Especial função init () ( SetIndexBuffer (0, Line_0); / / Atribuir um array para um buffer SetIndexBuffer (1, Line_1); / / Atribuir um array para um buffer SetIndexBuffer (2, Line_2); / / Atribuir um array para um buffer SetIndexBuffer (3, Line_3); / / Atribuir um array para um buffer SetIndexBuffer (4, Line_4); / / Atribuir um array para um buffer SetIndexBuffer (5, Line_5); / / Atribuir um array para um buffer SetIndexStyle (5, DRAW_LINE, STYLE_SOLID, 3); / / Linha de estilo //------------------------------------------------ --------------- 5 -switch (Period ()) / / Calcular o coeficiente de .. (/ / .. calendários diferentes
case 1: K2 = 5; K3 = 15; break; / / Calendário M1 caso 5: K2 = 3; K3 = 6; break; / / Calendário M5 caso 15: K2 = 2; K3 = 4; break; / / Calendário M15 caso 30: K2 = 2; K3 = 8; break; / / Calendário M30 caso 60: K2 = 4; K3 = 24; break; / / Calendário H1 caso 240: K2 = 6; K3 = 42; break; / / Calendário H4 caso 1440: K2 = 7; K3 = 30; break; / / Calendário D1 caso 10080: K2 = 4; K3 = 12; break; / / Calendário W1 caso 43200: K2 = 3; K3 = 12; break; / / Prazo MN ) //------------------------------------------------ --------------- 6 -Sh_1 = Bars_V; / / Duração da taxa CALCUL. (barras) Sh_2 = K2 * Sh_1; / / Calc. TF por período mais próximo Sh_3 = K3 * Sh_1; / / Calc. para o próximo período TF Period_MA_2 = K2 * Period_MA_1; / / Calc. MA para o próximo período de TF Period_MA_3 = K3 * Period_MA_1; / / Calc. MA para o próximo período de TF //------------------------------------------------ --------------- 7 -retorno; / / Sair especial função init a () ) //------------------------------------------------ --------------- 8 -int start () / / Especial função start () ( //------------------------------------------------ --------------- 9 -dupla MA_c, MA_p, / / MA valores atuais e anteriores Soma; / / Técnica param. para a soma accumul. int i, / / Bar índice n, / / parâmetro formal (índice bar) Counted_bars; / / Quantidade de bares contados //------------------------------------------------ -------------- 10 -Counted_bars = IndicatorCounted (); / / Quantidade de bares contados i = Barras - Counted_bars - 1; / / Índice da primeira inúmero if (i 0) / / Se errado definir suavização Aver_Bars = 0; / / .. nada menos do que zero Sum = 0; / / As possibilidades técnicas for (i = n, n> = i + Aver_Bars; n + +) / / Resumindo últimos valores Soma = Soma + Line_4 [n]; / / Acum. soma dos últimos valores Line_5 [i] = Soma / (Aver_Bars + 1); / / Indic. matriz de linha suavizada //------------------------------------------------ -------- 18 --
i -; / / Calcular o índice do próximo bar //------------------------------------------------ -------- 19 -) retorno; / / Saída do especiais função start () ) //------------------------------------------------ -------------- 20 -Se formos observar atentamente o indicador linhas traçadas em uma janela separada e em uma janela do gráfico, vamos ver algumas diferenças resultantes da utilização de diferentes métodos durante os cálculos. Para o cálculo do indicador linhas traçadas na janela principal apoiar ACM são utilizadas, para as linhas em uma janela separada, não existem tais apoiar ACM.Esta é também a razão pela qual existe uma rigorosa concorrência de cruz taxa de linhas e pontos de apoio no MA roc.mq4pontos de cruz e uma taxa de acordo com a linha zero no indicador rocseparate.mq4.
Fig. 130. Custom indicador rocseparate.mq4 permite ver em uma janela separada do plano de taxa de mudança sobre o atual período, a maior horizonte temporal mais próximo e mais próximo um, bem como a sua média. Utilização combinada de programas Já se disse que, segundo as regras MQL4 comércio funções não podem ser utilizados em indicadores personalizados, é por isso que a negociação automática Expert Advisors ou scripts devem ser utilizados. No entanto, os recursos de economia de tecnologia utilizada nos cálculos de indicadores (ver Criação de Indicadores Custom) é amplamente utilizado durante a criação de programas comerciais. Na maioria dos casos nos indicadores personalizados uma forma eficiente pode calcular valores do indicador array elementos necessários para a formação de critérios comerciais e na tomada de decisões comerciais Expert Advisors. Cálculos efectuados em indicadores personalizados tecnicamente também pode ser implementado em Expert Advisors, mas isto pode levar à duplicação de cálculos em diferentes programas de aplicação e ao desperdício de recursos irracional e, em alguns casos (quando o tempo com uso intensivo de recursos cálculos são realizados) - para uma decisão comercial feita tardiamente.Nos casos em que é preciso para usar cálculo personalizado indicadores de resultados em um script ou Expert Advisor, funcionar iCustom () pode ser utilizado. Funcionar iCustom ()
iCustom duplo (string símbolo, int calendário, nome da seqüência ..., int modo, int turno) Cálculo do indicador dado personalizado. O indicador deve ser personalizado compilado (. Ex4 arquivo) e localizado no diretórioTerminal_catalogue \ peritos \ indicadores. Parâmetros: Símbolo - nome de um símbolo de segurança, sobre os dados de que um indicador será calculado. NULL indica que o atual símbolo. horizonte temporal - período. Pode ser um dos períodos gráfico. 0 significa que o período de vigência da actual chart. Nome - nome do indicador personalizado. ... - Lista dos parâmetros (se necessário). Passou parâmetros devem corresponder com o fim de declarar e do tipo de variáveis externas de um indicador personalizado. Modo - Índice de um indicador linha. Pode ser de - até 7 e deve corresponder ao índice utilizado por qualquer das funções SetIndexBar. turnos - Índice do valor obtido a partir de um indicador-tampão (deslocamento para trás em relação a um bar por uma corrente especificada número de bares). Vamos considerar como iCustom () pode ser usado na prática. Vamos resolver o seguinte problema: Problema 30. Uma estratégia comercial é baseado em dados do indicador rocseparate.mq4 personalizado. Se ROC linha no actual período (laranja) atravessa uma taxa média suavizada (linha vermelha grossa) abaixo de um certo nível de baixo para cima, este é um critério relevante para comprar (abrir e fechar Comprar Vender). Caso contrário, existem condições, considero este um critério relevante para vender. Escrever um código aplicação desta estratégia. O princípio de construção do indicador rocseparate.mq4 costume é descrito em detalhes na seção Custom Indicador ROC (Price Rate of Change). Fig. 131 ilustra dois pontos, em linha ROC que, na actual calendário (M15) cruza a linha suavizada taxa de variação. Um ponto em linha cruza o laranja o vermelho de um fundo para cima e para o local da primeira intersecção está abaixo do nível -0,001. No ponto B da laranja cruza a linha vermelha em um sentido descendente e é o ponto cruz acima do nível 0,001. O facto de este cruzamento deve ser detectado no Expert Advisor e ser considerado como um sinal de compra (ponto A - Venda de fechar e abrir Buy) ou de vender (ponto B - fechar e abrir Comprar Vender).
Fig. 131. Passagem das linhas personalizadas indicador é considerado um critério comercial. Ao resolver esses problemas uma pronta Expert Advisor pode ser usada, mudando a forma de cálculo negociação critérios nele.Neste caso, podemos tomar como base o Expert Advisor tradingexpert.mq4 descritos na seção Simples Expert Advisor. A EAshared.mq4 cálculo negociação critérios, com base num indicador personalizado irá olhar Loke esta: //------------------------------------------------ -------------------/ / Shared.mq4 / / O Código deve ser usado apenas para fins educacionais. //------------------------------------------------ -------------------# propriedade copyright "Copyright © Book, 2007" # propriedade link "http://AutoGraf.dp.ua" //------------------------------------------------ --------------- 1 -/ / M15 extern dupla StopLoss = 100; / / SL de uma forma aberta extern dupla TakeProfit = 35; / / TP de uma forma aberta extern dupla Lotes = 0,1; / / Rigorosamente definir quantidade de lotes extern dupla Prots = 0,07; / / Percentual da margem livre //------------------------------------------------ -------------- 1a -extern int Period_MA_1 = 56; / / Período de cálculo MA extern int Bars_V = 34; / / Quantidade de barras para a taxa de cálculo extern int Aver_Bars = 0; / / Quantidade de barras para o alisamento extern dupla Nível = 0,001; //------------------------------------------------ -------------- 1b -Trabalho bool = true; / / EA irá funcionar. string Symb; / / nome da Segurança //------------------------------------------------ --------------- 2 -int start () ( int Total, / / Quantidade de ordens em uma janela Dica =- 1, / / Tipo de ordem seleccionados (B = 0, S = 1) Bilhete; / / Número de ordem dupla MA_1_t, / / valor atual MA_1 MA_2_t, / / valor atual MA_2 Lot, / / Quantidade de lotes em uma forma selecionada Lts, / / Quantidade de lotes em uma forma aberta
Min_Lot, / / Minimal quantidade de lotes Passo, / / Passo do Lote mudança Gratuito, / / Corrente margem livre One_Lot, / / Preço de um lote Preço, / / Preço de uma forma seleccionada SL, / / SL de uma forma seleccionada TP; / / TP de uma forma seleccionada bool Ans = false, / / Servidor resposta após fechamento Cls_B = false, / / Critério para o encerramento de Compra Cls_S = false, / / Critério para o encerramento de Venda Opn_B = false, / / Critério de abertura Comprar Opn_S = false; / / Critério de abertura Vender //------------------------------------------------ --------------- 3 -/ / Processamento Preliminar if (Bares> Period_MA_1) / / Não basta bares ( Alerta ( "Não basta grades na janela. EA não funciona."); retorno; / / Sair start () ) if (Trabalho == false) / / Critical erro ( Alerta ( "Crítica de erro. EA não funciona."); retorno; / / Sair start () ) //------------------------------------------------ --------------- 4 -/ / Pedidos contabilidade Symb = Symbol (); / / nome da Segurança Total = 0; / / Valor das encomendas for (int i = 1; i> = OrdersTotal (); i + +) / / Loop através de ordens ( if (OrderSelect (i - 1, SELECT_BY_POS) == true) / / Se houver uma próxima a (/ / Analisando ordens: if (OrderSymbol ()! = Symb) continue; / / Outro segurança if (OrderType () <1) / / Até fim encontrado ( Alerta ( "Aguardando fim detectado. EA não funciona."); retorno; / / Sair start () ) Total + +; / / Contador de encomendas no mercado if (total <1) / / Não mais do que uma ordem ( Alerta ( "Várias ordens de mercado. EA não funciona."); retorno; / / Sair start () ) Bilhete OrderTicket = (); / / Número de ordem selecionados Dica OrderType = (); / / Tipo de ordem selecionados Preço = OrderOpenPrice (); / / Preço do modo selecionado SL = OrderStopLoss (); / / SL seleccionados de forma TP = OrderTakeProfit (); / / TP de modo selecionado Lote OrderLots = (); / / Quantidade de lotes ) ) //------------------------------------------------ --------------- 5 -/ / Trading critérios int H = 1000; / / Quantidade de bares na calc. História int P = Period_MA_1; / / Período de cálculo MA int B = Bars_V; / / Valor da Taxa de barras para calc. int A = Aver_Bars; / / Quantidade de barras para o alisamento //------------------------------------------------ -------------- 5a -iCustom dupla L_1 = (NULL, 0, "rocseparate", H, P, B, A, 1, 0); iCustom dupla L_5 = (NULL, 0, "rocseparate", H, P, B, A, 5, 0);
//------------------------------------------------ -------------- 5b -if (L_5> =- Level & amp; & amp; L_1 L_5) ( Opn_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
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
0 - cálculos em dados do período atual são utilizadas, neste caso, o prazo atual é M15, para que os dados correspondentes a M15 serão utilizados; "rocseparate"-nome de um indicador personalizado, em que serão feitos cálculos. H, P, B, A - lista de parâmetros ajustáveis. Neste caso, o indicador personalizado rocseparate.mq4 tem parâmetros ajustáveis(bloco 2.3 do código rocseparate.mq4). Para um usuário para ser capaz de definir valores destes parâmetros a partir da EA, que estão especificadas na lista de parâmetros passados a funcionar iCustom de (). No Expert Advisor valores destes parâmetros podem diferir dessas especificado no indicador. Em tal caso, nos cálculos durante o indicador passou exactamente estes valores serão utilizados. Esses parâmetros denotar o seguinte: H - número de bares no cálculo história; P - período de cálculo MA; B - número de barras para a taxa de cálculo; A - número de barras para nivelamento. (o significado destes parâmetros é explicado em detalhes na seção Custom Indicador ROC (Price Rate of Change). 1 (5) - índice linha do indicador. No indicador personalizado rocseparate.mq4 6 indicador são matrizes utilizadas. ROC linha no atual calendário (laranja) é construído com base no Line_1 [] valores, para que tampão, com índice 1 é usado. Alisado taxa média linha é baseada nos valores da Line_5 [] array elementos, o índice de buffer é utilizada 5. 0 - índice valor obtido a partir de um indicador-tampão (deslocamento para trás em relação a um bar corrente especificada pelo número de períodos). Neste caso valores sobre as linhas indicador de zero bar são usadas, é por isso que o índice 0 é especificado. Para um usuário para poder alterar os parâmetros ajustáveis indicador na EA manualmente, variáveis externas estão especificados no bloco 1A, 1B (do Expert Advisor). No bloco 5-5a valores destes parâmetros são atribuídos a outras variáveis com nomes curtos - isto é feito por conveniência do código apresentação no bloco 5a-5b. Assim, um utilizador pode especificar na shared.mq4 parâmetros, com o qual nos cálculos personalizados indicador rocseparate.mq4 será conduzida. Após iCustom execução () função retornará valor correspondente a um determinado elemento de valor especificado array indicador calculado em valores especificados usando o indicador de parâmetros ajustáveis. Durante a operação concreta que for conveniente para ver em uma janela de segurança linhas do indicador, matriz de elementos que são utilizados no Expert Advisor (ver fig. 131). Ao mesmo tempo realização de iCustom () não está relacionado com a presença do indicador na janela de segurança, bem como com os valores dos seus parâmetros ajustáveis. A execução de iCustom () não exige a fixação de um indicador correspondente a uma janela de segurança. Bem como a chamar iCustom de () a partir de qualquer programa não resultar na fixação de um indicador correspondente a uma janela de segurança. Penhora de um indicador técnico para uma janela de segurança também não conduz à chamada de iCustom de qualquer programa aplicativo. Negociação critérios na EA (blocos 5-6) são calculados com base nos valores obtidos utilizando o elemento matriz iCustom () function. Por exemplo, um critério para abertura e fechamento Comprar Vender são calculados da seguinte forma:
if (L_5 <=- Level & & L_1> L_5) ( Opn_B = true; / / Critério de abertura Comprar Cls_S = true; / / Critério para o encerramento de Venda ) Se o último valor conhecido de uma taxa média suavizada linha (L_5) é inferior ao nível especificado (valor do parâmetro ajustável Nível = 0,001) e do último valor conhecido dos ROC na actual linha temporal (L_1) é maior que o alisado taxa média em linha (L_5), o critério para a instauração de uma ordem Comprar e Vender fechando uma ordem seja considerada relevante.Para a confirmação da pertinência dos critérios que reflectem as condições opostas são utilizados. Negociação critérios aceites neste exemplo são utilizados apenas para fins educacionais e não deve ser considerada como uma diretriz quando uma verdadeira negociação em conta. unções Standard Al, em todas, há mais de 220 funções habituais na MQL4, isto é para além de funções de indicadores técnicos. É impossível incluir aqui as descrições e exemplos de todas as funções, porque existem demasiados deles. Algumas funções que devem ser descritos em detalhes estão incluídas em seções anteriores. Nesta secção iremos debruçar sobre outras funções mais amplamente utilizada. Ao final de cada parágrafo você vai ver a lista completa das funções de uma certa categoria e sua breve descrição.
§
Funções comuns. Este grupo inclui funções que não estão incluídos em nenhum dos grupos especializados. Estas são as seguintes funções: Print (), alerta (), Comment (), MarketInfo (), Sleep (), etc
§
Graphical Objects. Metatrader 4 Terminal permite a penhora de numerosos objectos gráficos de um gráfico. Este grupo inclui funções que são utilizadas para a criação desses objetos programados, bem como para alterar as suas propriedades, movendo-os e apagando.
§
Operações com Gráficos. Um grupo de funções que são usados para obter informações sobre um curso diferente gráfico, para que um programa em MQL4 (script, ou indicador Expert Advisor) é anexado.
§
Funções String. Seqüência funções são utilizadas para a transformação das variáveis tipo string: pesquisando valor, concatenação de linhas, a recuperação da sub-linhas, etc Conversão funções são utilizadas para converter uma variável de um tipo para outro tipo. NormalizeDouble () arredonda off valores da função dupla de um certo tipo de precisão.
§
Data e Hora. Este grupo de funções é usado para obter informações em tempo esta ou aquela forma: Localtime () mostra a hora local de um computador, TimeCurrent () mostra servidor de hora da última citação recebida. Além disso, parâmetros como um dia da semana, mês dia, hora, minuto, etc, podem ser obtidos para um valor indicado tempo.
§
Arquivo de Operações. Este grupo de funções é necessária para a leitura / gravação de dados em um disco rígido.
§
Matrizes e Timeseries. Eles fornecem acesso a dados sobre os preços de qualquer disposição símbolo / período.
§
Funções Matematicas. Conjunto padrão de funções matemáticas e trigonométrico.
§
GlobalVariables. Funções para trabalhar com GlobalVariables.
§
Indicadores personalizado. Estas funções podem ser utilizadas apenas quando se escreve indicadores personalizados.
§
Informações sobre a conta. Funções mostram informações sobre um cliente terminal, conta e verificar o estado atual de um cliente terminal (incluindo o estado do ambiente de MQL4-programa a ser executado).
§
Comércio Funções. Funções para a condução de operações de comércio.
Para obter uma descrição detalhada de qualquer norma referem-se a função MQL4 Referência em MQL4.community, MetaQuotes Software Corp site ou para a "Ajuda" no MetaEditor. Funções comuns Uma das funções mais usado é Comment (). Comentários () Função void Comentário (...) Esta função introduz um comentário definida por um usuário no canto superior esquerdo de uma janela do gráfico. Parâmetros podem ser de qualquer tipo. Número de parâmetros não pode exceder 64. Arrays não podem ser passados para a Comment () function. Leques deveriam ser introduzidas elementwise. Dados da dupla tipo são escritas com 4 dígitos depois da vírgula. Para mostrar números com exatidão o uso DoubleToStr () function. Bool, datetime tipos e cores serão escritas como dígitos. Para mostrar os dados do tipo datetime como uma string utilize o TimeToStr () function. Parâmetros: ... - Quaisquer valores separados por vírgulas. Exemplo de como usar essa função pode ser um simples EA comment.mq4 reflectindo as informações sobre o número de encomendas. //------------------------------------------------ -------------------/ / Comment.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ -------------------int start () / / Especial função start ( Encomendas OrdersTotal int = (); / / Número de encomendas if (Ordens == 0) / / Se entorpecido. de ord. = 0 Comentário ( "Nenhum ordena"); / / Comentário à janela do canto else / / Se houver encomendas Comentário ( "Disponível", Orders, "encomendas".); / / Comentar retorno; / / Sair
) //------------------------------------------------ -------------------No início do programa, o número total de encomendas é contada pelo OrdersTotal () function. Se as Ordens variável (número de encomendas) é igual a 0, a Comment () com a função "Nenhum ordena" parâmetro é executada. Se há, pelo menos, um fim, Comentários () com uma lista de parâmetros separados por vírgulas será executado. Neste caso 3 parâmetros utilizados são: o primeiro é um valor de seqüência "Disponível", segundo é um valor inteiro Ordens eo terceiro é um valor de seqüência "encomendas".. Como resultado da execução da função em cada início de iniciar a função especial () uma das mensagens será mostrado no canto superior esquerdo de uma janela do gráfico. Fig. 132 gráfico ilustra uma janela na situação em que existe uma ordem presentes.
Fig. 132. Exibindo um texto no canto superior esquerdo da janela um gráfico como resultado de Comentários () execução. Para a reprodução de arquivos sonoros PlaySound () função é usada. PlaySound () Função void PlaySound (string filename) A função desempenha um arquivo de som. O arquivo deve estar localizado em terminal_directory \ sons ou seu subdiretório. Parâmetros: filename - caminho para um arquivo de som. Um conjunto de arquivos sonoros recomendados podem ser encontrados no anexo - ficheiros de som. Em alguns casos pode ser escrito um programa de apoio a um diálogo com um usuário. Função MessageBox () é usado para esta finalidade. MessageBox () função int MessageBox (string texto = NULL, string caption = NULL, int flags = VAZIO) MessageBox função cria e exibe uma caixa de mensagem, também é utilizada para gerenciar a janela de diálogo. Uma caixa de mensagem contém um cabeçalho da mensagem e programa definidos ina, bem como qualquer combinação de ícones e botões predefinidos. Se uma função for executada com êxito, o valor devolvido é o retorno de um código de valores MessageBox (). A função não pode ser chamado a partir de um indicador personalizado, porque os indicadores são executados na interface fio e ele não poderá desacelerar.
Parâmetros: texto - um texto contendo uma mensagem para ser exibida; legenda - um opcional texto a ser apresentado na caixa de mensagem. Se o parâmetro é vazio, uma EA nome será exibido na caixa de cabeçalho; Bandeiras - flags definir o tipo eo comportamento da caixa de diálogo. Flags podem ser uma combinação de bandeira bandeiras de grupos (ver MessageBox Retorno Códigos). Vamos examinar um exemplo de MessageBox () usage. Problema 31. Escrever um código de um EA exibindo uma caixa de mensagem com uma pergunta de fecho de todas as ordens de 5 minutos antes da importante notícia de libertação. Se um usuário clicar em Sim, todas as encomendas devem ser fechadas, se for empurrado Não, nenhuma ação deve ser realizada. A EA apoiar um diálogo com um utilizador (dialogue.mq4) pode ter o seguinte código: //------------------------------------------------ -------------------/ / Dialogue.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ --------------- 1 -# include / / Necessário para MessageBox extern dupla Time_News = 15,30; / / Tempo de notícias importantes Pergunta bool = false; / / Flag (questão não está colocada ainda) //------------------------------------------------ --------------- 2 -int start () / / Especial função start ( PlaySound ( "tick.wav"); / / Em cada carrapato Time_cur duplo = Hora () + Minuto () / 100,0; / / hora atual (duplo) if (OrdersTotal ()> 0 & & Pergunta == false & & Time_cur <= Time_News 0,05) (/ / O fornecimento de algumas condições PlaySound ( "news.wav"); / / Em cada carrapato Pergunta = true; / / Flag (questão já está posta) int ret = MessageBox ( "Tempo de notícias importantes libertação. Feche todas as ordens?", "Questão", MB_YESNO | MB_ICONQUESTION | MB_TOPMOST); / / Caixa de Mensagens //------------------------------------------------ --------- 3 -if (ret == IDYES) / / Se a resposta for sim Close_Orders (); / / Fechar todas as encomendas ) retorno; / / Sair ) //------------------------------------------------ --------------- 4 -void Close_Orders () / / cliente. Funct. para o encerramento de ordens ( Alerta ( "Função de fecho de todas as encomendas, está a ser executado."); / / Para a ilustração retorno; / / Sair ) //------------------------------------------------ --------------- 5 -No bloco 1.2 WinUser32.mqh arquivo está incluído no programa; neste arquivo MessageBox () retornar códigos estão definidos.Também neste bloco as variáveis externas Time_news é introduzido - este é o momento da libertação notícias importantes.Durante todo o período de execução EA uma pergunta sobre ordens de fechamento deverá ser apresentada apenas uma vez.Para detectar se a questão já tenha sido exibida na EA 'Pergunta' variável é declarada.
A cada início de iniciar a função especial () (blocos 2-3) PlaySound () é executado. O som tocado tick.wav assemelha um fraco clique denota que a melhor maneira o facto de assinalar uma nova aparência. A decisão sobre o uso do som em um programa é feita por um programador. Em alguns casos, é muito útil para usar sons. Por exemplo, um som pode denotar o fato de uma execução EA. Outros sons podem corresponder a outros eventos, por exemplo, desencadeando uma negociação de critério, para fechar, etc Valor da variável real Time_cur corresponde ao horário atual do servidor. No EA condições, em que a caixa de mensagem deve ser exibido, são analisados. Se existir uma ou várias ordens, a caixa de mensagem não tenha sido mostrado e ainda o servidor tempo difere de notícias importantes libertação vez em menos de 5 minutos, algumas ações são executadas no programa.Primeiro que tudo funcione PlaySound () é executado, o som tocado atrai a atenção de um usuário. A Questão bandeira ganha o valor verdadeiro (não se mostrar na próxima vez). Na próxima linha MessageBox () é executado: int ret = MessageBox ( "Tempo de notícias importantes libertação. Feche todas as ordens?", "Pergunta ", MB_YESNO | MB_ICONQUESTION | MB_TOPMOST); / / Caixa de Mensagens Neste caso, o valor de uma string constante "Tempo de notícias importantes libertação. Feche todas as ordens?" será exibido em uma caixa de diálogo, e "Questão" valor será refletido na parte alta da caixa de linha. O MB_YESNO bandeira indica a presença de botões - neste caso os botões Sim e Não (ver MessageBox Valor Retornado). A bandeira MB_ICONQUESTION define um ícone exibido na parte esquerda da caixa de mensagem (cada ambiente operacional tem seu próprio conjunto de ícones, Fig. 133 ilustra um ícone a partir do Windows XP set). A bandeira MB_TOPMOST prevê a caixa com a propriedade "always em cima", ou seja, a casa vai estar permanentemente visíveis independentemente de quais programas estão sendo executados no momento em que o computador. Como resultado da execução do MessageBox () com parâmetros indicou uma caixa de mensagem é exibida:
Fig. 133. Caixa de diálogo exibida como resultado de uma MessageBox () execução. No momento em que a caixa de mensagem é exibida no programa execução é realizada até que um usuário clicar em um botão na caixa de mensagem. Tão logo isso aconteça, o controlo será passado para a linha seguinte MessageBox () chamada, neste caso para o bloco 3.4. Esta propriedade de uma caixa de mensagem a deter o controlo é muito importante e deve ser tida em conta no desenvolvimento de um programa. Por exemplo, se um usuário abandonou o seu computador e uma caixa de mensagem foi demonstrado, neste momento, durante todo o tempo quando um usuário estiver ausente (até um botão for pressionado), o programa será esperar pela resposta e nenhum código será executado no este período. Note-se, antes de uma caixa de mensagem é exibida no programa execução é acompanhada por um som de carrapatos. Quando a mensagem é exibida uma outra caixa de som é reproduzido. No período em que a caixa de diálogo está aberta à espera de resposta e nenhum som é reproduzido o que ilustra o facto de controle exploração enquanto a caixa de diálogo é aberta. Após um botão for pressionado, o programa continuará execução e ao som de carrapatos serão tocados novamente. Se um usuário clicar em Sim, o Close_Orders () função será chamado, essa função é usada para o encerramento de ordens.Neste exemplo a função conteúdo não é descrito; para denotar a sua execução
a função é executada Alert ( "Função de fecho de todas as encomendas, está a ser executado."). Se um usuário clicar em Não, a função das ordens de fechamento não é chamada. Na sessão atual da EA execução a caixa de mensagem não será mostrada novamente. Funções comuns Função
Síntese Info
Alerta
Exibe uma caixa de mensagens contendo dados de usuário definido. Os parâmetros podem ser de qualquer tipo. Número de parâmetros não pode exceder 64.
Comentar
Exibe um comentário definida por um usuário, no canto superior loft de uma janela do gráfico. Os parâmetros podem ser de qualquer tipo. Número de parâmetros não pode exceder 64.
GetTickCount GetTickCount () retorna número de passaram desde milésimos de um sistema foi iniciado. O contador é limitado pela resolução do sistema temporizador. Desde o tempo é armazenado como um unsigned integer, é overfilled cada 49,7 dias. MarketInfo
Retorna diversas informações sobre valores mobiliários listados em "Market watch" janela. Parte das informações relativas à segurança atual é armazenado em variáveis previamente definidos (ver MarketInfo () Identifiers).
MessageBox
MessageBox função cria e mostra uma caixa de mensagem, também é utilizada para gerenciar a janela de diálogo. Uma caixa de mensagem contém um cabeçalho da mensagem e programa definidos ina, bem como qualquer combinação de ícones e botões predefinidos. Se uma função for executada com êxito, o valor devolvido é o retorno de um código valores de MessageBox (). A função não pode ser chamado a partir de um indicador personalizado, porque os indicadores são executados na interface fio e ele não poderá desacelerar.
PlaySound
Desempenha um arquivo de som. O processo deve localizado no terminal_dir \ sounds diretório ou na sua subdiretório.
Imprimir
Imprime uma mensagem para os peritos log. Parâmetros podem ser de qualquer tipo. Quantidade de parâmetros passados não pode exceder 64.
SendFTP
Envia um arquivo para o endereço especificado na configuração da janela "Publisher" tab. Se a tentativa falhar, ele retuns FALSO. A função não funcionam no modo de teste. Esta função não pode ser chamado a partir de indicadores personalizados, de qualquer modo. O arquivo a ser enviado deve ser na terminal_directoryarmazenados \ peritos \ arquivos ou pastas em suas subpastas. Ele não será enviado se não houver nenhum endereço FTP e / ou acesso a senha especificado na configuração.
SendMail
Envia um email para o endereço especificado na janela de configurações "Email" tab. O envio pode ser desativado na configuração, ou ele pode ser omitida para especificar o endereço de e-mail.
Dormir
O Sleep () função que suspende a execução da atual perito dentro do intervalo especificado. Sleep () não pode ser chamado a partir de indicadores personalizados, porque os indicadores são executados na interface fio e ele não poderá desacelerar. A verificação do perito parar bandeira status cada 0,1 segundo é incorporado na função.
Para a descrição detalhada dessas e outras funções é favor consultar a documentação em MQL4.community, MetaQuotes Software Corp site ou para a "Ajuda" na seção MetaEditor.
Graphical Objects Objeto é uma imagem gráfica na janela do símbolo, ele pode ser selecionado, movido, alterados ou apagados. Objetos gráficos incluem, por exemplo, linhas horizontais e verticais, canal de regressão linear, Fibonacci níveis, rectângulo, marca texto, imagens etc Essas linhas como indicador, indicador níveis, castiçais, comentários escritos pelo Comentários () funcionam e outros não podem ser selecionados e excluído, que é por isso que não pertencem a objetos gráficos. Gráfica objeto são consumida pelo cliente terminal em uma janela de segurança, de acordo com coordenadas predefinido. Cada objeto gráfico, em função do seu tipo tem um, dois ou três coordenadas e outros parâmetros ajustáveis. Qualquer objeto gráfico pode ser colocado em um gráfico janela manualmente (a partir da barra de ferramentas de um sistema de menu), e também como um resultado da execução de um programa aplicativo iniciado na mesma janela, incluindo um Expert Advisor, scripts personalizados ou indicador. Tipo e localização de um objeto gráfico pode ser modificada manualmente ou através de um programa enviando novos valores de coordenadas e outros parâmetros para um objeto gráfico. Maneiras de posicionamento objetos gráficos Existem duas formas de posicionamento objetos aceites em MQL4: parente de um gráfico e uma segurança em relação à janela.Para ilustrar a diferença entre estes métodos, vamos colocar manualmente dois objetos em uma janela de segurança: texto (OBJ_TEXT) e um texto de interrogação (OBJ_LABEL). Podemos usar uma T e botões da barra de ferramentas do cliente de terminal. Vamos definir o tamanho janela para que ela seja igual a metade do tamanho (Fig. 134). Vamos ver como estes objetos gráficos irão reagir às mudanças que o tamanho da janela (bem como para o dimensionamento horizontal e vertical do preço gráfico).
Fig. 134. Objetos gráficos com diferentes métodos de posicionamento em uma janela de segurança. Posicionamento Relativo a um Gráfico Janela O objeto gráfico OBJ_LABEL permanecerá imutável se uma janela tamanho é alterada por meio de deslocar as suas fronteiras ou inferior direito. Mas, se for o tamanho da janela for alterado, deslocando a sua borda superior ou inferior, o objeto será também transferida, embora a posição do objeto em relação a essas fronteiras permanecerão inalteradas. Isto acontece porque OBJ_LABEL está posicionada em relação à segurança beiras. Neste caso, o ponto de referência do objeto gráfico para uma janela de segurança é o canto superior esquerdo de uma janela chart6. Coordenadas do objeto em relação aos pontos indicados são fixados em pixels - 193 e 48 (Fig. 135).
-Fig. 135. Configurações do objeto gráfico OBJ_LABEL. O ponto de referência do objeto coordenadas (neste caso) é o canto superior esquerdo do cursor uma moldura visível quando seleccionado por um rato. No canto superior esquerdo do cursor moldura, você poderá ver um pequeno ponto indicando as definições deste objeto gráfico. Se outra referência é indicada, a ponto do cursor frame será indicado no outro canto. Quando aparecem novos bares em uma janela do gráfico, como um objeto OBJ_LABEL permanecerão imóveis na janela. Usando deste objeto é conveniente, se é necessário apresentar texto informação de carácter geral, por exemplo, informações sobre a rescisão de negociação, uma limitação Distância do valor mudado por um corretor, etc Posicionamento Relativo a um Gráfico A qualquer método de janelas do tamanho mudando, assim como no gráfico escamação, um objeto do tipo OBJ_TEXT não altere a sua posição em relação a um gráfico. O ponto de referência de um tal objeto é o meio da linha superior de um cursor frame, o seu tempo é coordenar X, Y coordenar-se de um preço de segurança (Fig. 136).
Fig. 136. Configurações do objeto gráfico OBJ_TEXT. À medida que novas barras exibidas em um gráfico janela, a posição do OBJ_TEXT não muda em relação a um gráfico, ou seja, com o surgimento de novos bares o objeto será deslocado para a esquerda junto com o gráfico, e quando haverá o suficiente barras, o objeto vai passar ainda mais à esquerda para fora da janela fronteiras. Este ou aquele método de posicionamento da própria propriedade de um certo tipo de objeto e não pode ser alterado por um usuário, até mesmo um programa em curso. A maioria dos objetos gráficos é posicionado em relação a um gráfico, ou seja, no tempo e no preço das coordenadas.
Criando objetos gráficos e mudar suas propriedades Para criar um objeto gráfico meios para colocar um gráfico em uma janela de objetos de tipos prédefinidos (veja Tipos e Propriedades de Objetos de Gráfico). Criação de objeto é utilizada a seguinte função: ObjectCreate () Função bool ObjectCreate (string nome, tipo int, int janela, datetime time1, duplo price1, datetime time2 = 0; price2 duplo = 0, datetime time3 = 0, duplo price3 = 0) A função cria um objeto de um tipo indicado com um nome predefinido e coordena o indicado no gráfico subwindow. O número de coordenadas pode ser objeto de 1 a 3, dependendo do tipo de objeto. Se um objeto é criado com êxito, a função retorna VERDADEIRO, FALSO caso contrário. Para obter informações adicionais sobre um erro ao chamar GetLastError () function. Coordenadas devem ser passadas em pares - tempo e preço. Por exemplo OBJ_VLINE necessidades só tempo, preço, mas também deve ser passado (qualquer valor). OBJ_LABEL tipo de objeto gráfico ignora coordenadas especificadas na função; para definir OBJPROP_XDISTANCE e OBJPROP_YDISTANCE o objeto do presente ObjectSet () função deve ser usada. Parâmetros: § § §
§ § § § § §
Nome - Nome do objeto; tipo - tipo de objeto (pode ser uma das predefinidas tipos de objeto); Janela - número de janela na qual um objeto será adicionado. Numeração das janelas gráfico (se houver janelas com indicadores presentes) inicia a partir de 1, o número da janela principal se semper 0; a viúva número indicado deve ser superior ou igual a 0 e inferior ao valor do WindowsTotal devolvido pelo () função; time1 - hora de coordenar a primeira; price1 - preço da primeira coordenará; time2 - hora de coordenar o segundo; price2 - preço da segunda coordena; time3 - hora de coordenar o terceiro; price3 - preço de coordenar o terceiro.
Cada objeto tem alguma gráfica (que lhe é peculiar) parâmetros ajustáveis. Por exemplo, além de definir coordenadas, você pode especificar cores, texto mensagem (para alguns objetos), linha estilos (para outros objetos), etc Para alterar propriedades usar a seguinte função: ObjectSet () Função bool ObjectSet (string nome, int prop_id, valor duplo) A função altera o valor do imóvel objeto indicado. Em caso de sucesso a função retorna VERDADEIRO, FALSO caso contrário.Para obter as informações sobre o erro ao chamar GetLastError () function. Parâmetros: § § §
Nome - Nome do objeto; prop_id - propriedades identificador objeto (um objeto de propriedades é indicado); Valor - novo valor do imóvel indicado.
Todos os objetos gráficos podem ter um texto descritivo. O texto descrição de cada objeto está disponível para um usuário e podem ser alteradas a partir de um objeto ou em uma barra propriedades maneira programada. Para OBJ_TEXT e OBJ_LABEL esta descrição é o seu principal conteúdo e e semper é exibido como uma linha de texto, texto descrições de outros objetos são exibidos perto do objeto, se a opção "Mostrar descrições objeto" é habilitado na janela propriedades de um símbolo (F8). Para alterar o texto descrição é utilizada a seguinte função: ObjectSetText () Função bool ObjectSetText (string name, string texto, int font_size, string font_name = NULL, text_color color = CLR_NONE) A função é usada para modificar um objeto descrição. Em caso de sucesso TRUE é retornado, caso contrário - FALSO. Para obter as informações sobre o erro ao chamar GetLastError () function. Parâmetros font_size, font_name e text_color são usados apenas para OBJ_TEXT e OBJ_LABEL. Para outros tipos de objetos estes parâmetros são ignorados. Parâmetros: § § § § §
Nome - Nome do objeto; Texto - objeto descrição texto; font_size - tamanho da fonte em pontos; font_name - font nome; text_color - texto cor.
Permite-nos analisar um exemplo de um Expert Advisor, em que funções de gestão de objetos gráficos são utilizados. Problema 32. Usando uma gráfica de um objeto informar sobre negociação utilizador critérios definidos com base nos valores MACD. MACD é muitas vezes utilizado pelos comerciantes para a formação de critérios comerciais. O indicador é representada por duas linhas - eo principal sinal. A negociação é considerada critérios para ser realizado quando as linhas cruzadas. Se o indicador principal linha (geralmente cinza histograma) cruza a linha sinal (normalmente vermelho linha pontilhada) em baixa, isto é um sinal para vender, id para cima para comprar. Nos intervalos entre linha travessia encomendas deverão ser realizadas no mercado aberto, e quando aciona um critério contrário, as ordens devem ser fechadas e opostos após a sua abertura. Deste modo, quatro tipos de mensagens deve ser preparada: abertura de Compra, Venda de abertura, exploração de Compra, Venda de exploração. A este problema todas as mensagens são mutuamente exclusivas, ou seja, a situação em que duas ou mais mensagens deve ser mostrado é impossível. É por essa razão que, neste caso, um objeto gráfico pode ser utilizado, o objeto vai estar permanentemente presente no ª tela, mas ela poderá ser alterada de tempos em tempos. Vamos chamar esse objeto no canto superior direito da janela, na qual a EA irá operar. Desde o objeto posição não deve ser alterado, é conveniente usar um objeto do tipo OBJ_LABEL, porque ela se posiciona em relação a uma janela do gráfico. Como uma solução de um problema com 32 vamos ver a EA grafobjects.mq4 usando o objeto gráfico OBJ_LABEL: //------------------------------------------------ -------------------/ / Grafobjects.mq4
/ / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ -------------------int start () / / Especial função start ( //------------------------------------------------ --------------- 1 -Sente-int; MACD_M_0 dupla, MACD_M_1, / / Main line, 0 e 1 bar MACD_S_0, MACD_S_1; / / Sinal linha, 0 e 1 bar Texto string [4]; / / Declarar um array string color Color [4]; / / Declarar um array de cores Texto Texto Texto Texto
[0] [1] [2] [3]
= = = =
"Abertura de Compra"; / / Texto para diferentes situações "Abertura de Venda"; "Holding de Compra"; " Exploração de Venda ";
Cor [0] = DeepSkyBlue; / / Objeto cor .. Color [1] = LightPink; / / .. para diferentes situações Cor [2] = Amarelo; Cor [3] = Amarelo; //------------------------------------------------ --------------- 2 -ObjectCreate ( "Label_Obj_MACD", OBJ_LABEL, 0, 0, 0); / / Criando obj. ObjectSet ( "Label_Obj_MACD", OBJPROP_CORNER, 1); / / Referência canto ObjectSet ( "Label_Obj_MACD", OBJPROP_XDISTANCE, 10); / / X coordenar ObjectSet ( "Label_Obj_MACD", OBJPROP_YDISTANCE, 15); / / Y coordenar //------------------------------------------------ --------------- 3 -MACD_M_0 = iMACD (NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 0); / / 0 MACD_S_0 = iMACD (NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 0); / / bar MACD_M_1 = iMACD (NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1); / / 1 MACD_S_1 = iMACD (NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 1); / / bar //------------------------------------------------ --------------- 4 -/ / Analisando a situação if (MACD_M_1 = MACD_S_0) / / Passagem para cima Sit = 0; if (MACD_M_1> MACD_S_1 & & MACD_M_0 <= MACD_S_0) / / Passagem em baixa Sit = 1; if (MACD_M_1> MACD_S_1 & & MACD_M_0> MACD_S_0) / / Main acima sinal Sit = 2; if (MACD_M_1
bar 0 bar 1
No bloco 1.2 EA parâmetros são definidos, em particular o elemento valores de Texto [] e Color [] são fixados. Ainda mais se forem utilizadas para alterar propriedades objeto. No bloco 2.3 do objeto é criado e alguns valores de suas propriedades estão definidas. Vamos analisar este bloco em detalhes. De acordo com este código EA linha gráfica de um objeto é criado na janela, na qual a EA é executado: ObjectCreate ( "Label_Obj_MACD", OBJ_LABEL, 0, 0, 0); / / Criando obj. "Label_Obj_MACD" valor denota que esse nome é atribuído ao objeto (um nome é atribuído a um objeto por um programador na sua própria vontade). OBJ_LABEL - é o tipo de objeto identificador, que denota que o objeto será criado exatamente este tipo de (escolhidos da lista dos tipos possíveis). O primeiro dos próximos três zeros denota que o objeto é criado na janela principal (a janela principal do gráfico onde é mostrado, não tem medo do índice 0). Os próximos dois zeros coordenadas para definir o objeto criado. De acordo com este coordenou o objeto será desenhado na janela indicada. Neste caso o criado OBJ_LABEL não usa tempo e preço coordenadas. Observe que em OjectCreate () descrição só tempo e preço coordenadas são especificadas. Além disso, coordenadas do segundo e do terceiro pares têm valores padrão,embora não existam valores padrão para o primeiro par de coordenadas. Significa que, embora OBJ_LABEL não
precisam de tempo e preço em todas as coordenadas, alguns valores devem ser especificados em ObjectCreate () chamada de função. Neste caso zeros são indicados, embora outros valores podem ser escritos - afinal estes valores será negligenciada durante a configuração das propriedades OBJ_LABEL. Nos próximos três linhas são alguns dos valores definidos para o objeto chamado anteriormente criou Label_Obj_MACD: ObjectSet ( "Label_Obj_MACD", OBJPROP_CORNER, 1); / / Referência canto ObjectSet ( "Label_Obj_MACD", OBJPROP_XDISTANCE, 10); / / X coordenar ObjectSet ( "Label_Obj_MACD", OBJPROP_YDISTANCE, 15); / / Y coordenar Referência para o canto (OBJPROP_CORNER) 1 está definido, o que significa o canto superior direito da janela principal definido anteriormente. Nas próximas duas linhas distâncias do objeto para um canto referência são definidas em pixels: distância horizontal (OBJPROP_XDISTANCE) 10 pixels ea distância vertical (OBJPROP_YDISTANCE) 15 pixels. Na fase da execução deste programa objeto já está criada, tem o seu único nome definido e propriedades principais. Para tornar o objeto mostrar um texto necessário, em primeiro lugar, precisamos de calcular o que este texto deve ser parecida.Para este efeito, em primeiro bloco 3.4 a posição das linhas MACD é detectada na corrente e anterior bares, em seguida, no bloco 4.5 Sit valor correspondente à situação actual é calculada (ver também fig. 107 e callstohastic.mq4) Na próxima linha objeto propriedades dependendo da situação atual estão definidos: / / Alterar propriedades objeto ObjectSetText ( "Label_Obj_MACD", texto [Sit], 10, "Arial", Cor [Sit]); Como resultado de ObjectSetText () execução descrição é um texto atribuído ao objeto chamado Label_Obj_MACD - o valor da variável string Texto [Sit]. Este valor será diferente para diferentes situações, dependendo dos valores Sente-se variável. Por exemplo, se a principal linha atravessa a um sinal baixo, em bloco 4.5 Sente-se obtém o valor 1, como resultado do objeto gráfico vai ter o texto descrição contida no texto [1] o elemento matriz, ou seja, "Abertura de Venda ". Outros parâmetros: 10, "Arial" e cor [Sit] denotar tamanho da fonte, nome e cor para o texto descritivo. Como resultado da execução dos seguintes EA irá aparecer na janela EURUSD:
Fig. 137. Resultado da EA grafobjects.mq4 operação no momento em que o critério para vender dispara. Na fig. 137, há uma janela principal e MACD subwindow. Convém notar aqui que, para um normal funcionamento EA presença deste indicador sobre o símbolo janela não é necessária, porque a EA em critérios comerciais são calculadas como resultado de uma função técnica indicador execução que não está relacionado com o indicador exibindo. Aqui é apresentado o indicador visual só para a explicação de
um momento de trocas despoletar quando o critério necessário texto descrição do objeto gráfico é mostrado. A EA irá operar no modo semelhante em todas as outras combinações das mútuo posição do indicador linhas cada vez mostrando uma descrição correspondente a uma situação. Excluindo objetos gráficos Os peritos analisaram Advisor grafobjects.mq4 tem uma pequena desvantagem. Depois que a EA deixa de operar, uma gráfica objeto permanecerá na janela do gráfico (sua propriedades permanecerá o mesmo que no momento não é da sua última mudança). Objetos gráficos não são eliminados automaticamente. No decurso da negociação, a partir de um certo momento em que a mensagem "Abertura de Vender" não será válido. A fim de não desinformar uma gráfica de usuário do objeto deve ser eliminado. Para apagar um objeto gráfico (independentemente do seu método de criação - programada ou manual) basta selecioná-lo e pressione a tecla Delete. No entanto, como para a programação, é de notar que um programa escrito corretamente devem "limpar" a janela quando seu funcionamento é superior. Em outras palavras, um programa deve conter um bloco onde todos os objetos gráficos criados pelo programa estão excluídas. ObjectDelete () Função bool ObjectDelete (string name) eliminação de um objeto com o nome indicado. Se um objeto é excluído com êxito, a função retorna TRUE, caso contrário - FALSO. Para obter as informações sobre o erro ao chamar GetLastError () funcionar .. Parâmetros: §
nome - nome de um objeto suprimido.
É muito fácil usar ObjectDelete (): basta indicar o nome de um objeto a ser excluído. Para corrigir a desvantagem de o exemplo anterior, vamos adicionar na EA grafobjects.mq4 a função especial deinit () contendo a função para excluir objetos: //------------------------------------------------ --------------- 7 -int deinit () / / Função Especial deinit ( ObjectDelete ( "Label_Obj_MACD"); / / Objeto supressão retorno; / / Sair deinit () ) //------------------------------------------------ --------------- 8 -Agora, durante a execução do objeto chamado EA Label_Obj_MACD serão deletados. Geralmente um programa pode criar numerosos objetos. Cada uma delas pode ser suprimida, de acordo com o algoritmo.
Modificando objetos gráficos Em alguns casos, é necessária a mudança de posição um objeto em um gráfico em uma janela do programa caminho. Muitas vezes essa necessidade pode ocorrer por causa do surgimento de novos bares. Por exemplo, em uma negociação critérios EA pode ser formada com base em um canal de regressão linear, construída sobre uma barra de histórico de um determinado período (por exemplo, últimos 50 compassos). Se nós simplesmente chamar o objeto "canal de regressão linear" em uma
janela do gráfico e, em seguida, não aceitamos qualquer coisa, ele permanecerá no mesmo lugar onde foi gráfico posicionado e ele será deslocado para a esquerda enquanto aparecem novos bares. Para evitar que o objeto de deslocação deve ser redesenhado a cada novo bar. Para o efeito novas coordenadas devem ser calculadas e passado para o objeto, de acordo com essas coordenadas do objeto será desenhado em um gráfico viúva. Para descobrir o que tem propriedades um objeto gráfico no atual momento, a seguinte função deve ser usada: ObjectGet () Função ObjectGet duplo (string nome, int prop_id) a função retorna o valor do imóvel objeto especificado. Para obter as informações sobre o erro ao chamar GetLastError () function. parâmetros: § §
Nome - Nome do objeto; prop_id - imóvel objeto identificador. Pode ser qualquer valor a partir da lista das propriedades dos objetos.
Novas coordenadas são reportados a um objeto usando o ObjectMove () function. ObjectMove () Função bool ObjectMove (string nome, int ponto, datetime time1, price1 duplo) Alterando uma das coordenadas em um gráfico. A função retorna TRUE em caso de êxito, caso contrário - FALSO. Para obter informações adicionais ligue para o FetLast Erro () function. Numeração de um objeto coordenadas começa a partir de 0. Parâmetros: § § § §
Nome - Nome do objeto; ponto - coordenar índice (0-2); time1 - novo valor temporal; price1 - preço novo valor.
Problema 33. Criar um programa (um Expert Advisor) apoiar o desenho de um canal de regressão linear para os últimos 50 bares. O objeto gráfico "regressão linear canal" usa dois tempos coordenadas. Preço coordenadas (se esses são especificados no programa) são negligenciadas pelo cliente terminal durante a construção do objeto. O canal de regressão linear é calculada pelo cliente terminal baseado em dados históricos dos preços e, portanto, não pode ser mostrado com a exceção de um gráfico. É por isso que a ausência do objeto obrigatório de preços (do preço negligenciar coordenadas pelo terminal) é objeto constante da própria propriedade. Th Expert Advisor (moveobjects.mq4) gerir a posição de um objeto gráfico pode ter o seguinte código: //------------------------------------------------ -------------------/ / Moveobjects.mq4 / / O código deve ser usado apenas para fins educacionais.
//------------------------------------------------ -------------------extern int Len_Cn = 50; / / Canal comprimento (barras) extern Col_Cn = cor laranja; / / Canal cor //------------------------------------------------ --------------- 1 -int init () / / Especial função init () ( Create (); / / Chamando user-def. func. de criação retorno; / / Sair init () ) //------------------------------------------------ --------------- 2 -int start () / / Especial função start () ( datetime T2; / / segunda vez coordenar int erro; / / Código de erro //------------------------------------------------ --------------- 3 -T2 = ObjectGet ( "Obj_Reg_Ch", OBJPROP_TIME2); / / Solicitando t2 coord. Erro = GetLastError (); / / Obtendo um código de erro if (Erro == 4202) / / Se nenhum objeto: ( ( Alerta ( "Regressão canal está a ser gerida", "\ N Book_expert_82_2. Supressão proibidos."); Create (); / / Chamando user-def. func. de criação T2 = Tempo [0]; / / Valor atual de coordenar t2 ) //------------------------------------------------ --------------- 4 -if (T2! Tempo = [0]) / / Se objeto não está no seu lugar ( ObjectMove ( "Obj_Reg_Ch", 0, Time [Len_Cn - 1], 0); / / Novo t1 coord. ObjectMove ( "Obj_Reg_Ch", 1, Time [0], 0); / / Novo t2 coord. WindowRedraw (); / / redesenhando a imagem ) retorno; / / Sair start () ) //------------------------------------------------ --------------- 5 -int deinit () / / Função Especial deinit () ( ObjectDelete ( "Obj_Reg_Ch"); / / Apagar o objeto retorno; / / Sair deinit () ) //------------------------------------------------ --------------- 6 -Crie int () / / Usuário-função definida .. (/ / Criação de objeto .. datetime T1 = Tempo [Len_Cn - 1]; / / Definir 1a vez coord. datetime T2 = Tempo [0]; / / Definição 2o tempo coord. ObjectCreate ( "Obj_Reg_Ch", OBJ_REGRESSION, 0, T1, 0, T2, 0); / / Criação ObjectSet ( "Obj_Reg_Ch", OBJPROP_COLOR, Col_Cn); / / Cor ObjectSet ( "Obj_Reg_Ch", OBJPROP_RAY, false); / / Ray ObjectSet ( "Obj_Reg_Ch", OBJPROP_STYLE, STYLE_DASH); / / Estilo ObjectSetText ( "Obj_Reg_Ch", "Criado pela EA moveobjects", 10); WindowRedraw (); / / Imagem redesenhando ) //------------------------------------------------ --------------- 7 -O moveobjects.mq4 EA algoritmo que implica que um objeto, uma vez apensa permanecerá no ecrã durante todo o tempo de execução do programa. Nesses casos, é razoável utilizar uma função definida pelo usuário (neste caso, é Cria (), bloco 6-7) para criar um objeto, a função pode Ð ¼ ñƒ chamado a partir do programa quando quiser, quando necessário. Para chamar um objeto coordenadas são necessários dois tempos (T1 é o de coordenar a borda esquerda do objeto, T2 - a da borda direita): datetime T1 = Tempo [Len_Cn - 1]; / / Definir 1a vez coord. datetime T2 = Tempo [0]; / / Definição 2o tempo coord.
Neste exemplo, o direito das fronteiras do objeto deve ser zero sobre a barra, é por isso que o valor de coordenar o segundo corresponde ao tempo de abertura da barra de zero. As coordenará esquerda é calculado em função do número de bares estabelecidos por um usuário (variável externa Len_Cn) e é definida como o tempo de abertura de um bar com o índice correspondente. Por exemplo, se o canal comprimento é de 50 compassos, coordenar a esquerda será igual ao tempo de abertura de um bar com o índice 49. Nas próximas linhas do utilizador-definido Crie função () OBJ_REGRESSION o objeto é criado usando ObjectCreate (), então criadas as necessárias propriedades do objeto são criados pela ObjectSet () função (cores predefinidas por um usuário em uma variável externa, proibidos de chamar como um raio, estilo da linha - pontilhada). Na linha: ObjectSetText ( "Obj_Reg_Ch", "Criado pela EA moveobjects
", 10);
descrição é um texto atribuído ao objeto. O que a diferencia da anterior OBJ_LABEL analisados, o texto de descrição OBJ_REGRESSION não é exibido. O texto descrição de objetos gráficos podem ser visualizados no objeto da guia Propriedades.Isto é muito conveniente na aplicação prática de diferenciação entre objetos criados em um programa de maneira aqueles anexado manualmente:
Fig. 138. Comum propriedades do objeto gráfico "regressão linear canal" criado pela EA moveobjects.mq4. Aqui está uma função mais utilizada para a redefinição das actuais gráfico: WindowRedraw (); / / Imagem redesenhando WindowRedraw () Função void WindowRedraw () A função força reformula o atual quadro. Geralmente ele é usado depois de objeto propriedades sejam alteradas. Normalmente, os objetos gráficos são apresentados pelo cliente terminal na sequência da recepção de novas carrapatos. Esta é a razão pela qual, se não utilizarmos WindowRedraw (), as mudanças nas propriedades do objeto tornar-se visível para o usuário, na próxima carrapato, ou seja, a exibição é um carrapato semper tarde. O uso de WindowRedraw () permite-lhe força redesenhar todos os objetos necessários em um momento, por exemplo, imediatamente após as propriedades foram objeto alteradas. Num caso geral, se as propriedades de vários objectos são alteradas no programa, é suficiente para utilizar a função WindowRedraw () apenas uma vez, após a última das propriedades dos objetos que foram alteradas.
O usuário-função é definida a partir da primeira chamada função especial init (). No momento da aposição da EA para a janela do símbolo, a execução de init () irá iniciar, o que resulta em que o objeto gráfico Linear Regression Channel será exibida na janela do símbolo. Duas situações possíveis são considerados em função do início (): (1) o objeto tenha sido eliminada pelo utilizador ocasional (blocos 3-4) e (2), é necessário deslocar o objeto para a direita quando uma nova barra é zero formado (blocos 4-5). Para detectar se o objeto gráfico está disponível no momento actual, é suficiente apenas para solicitar o valor de uma das suas coordenadas. Se o objeto existe, a função ObjectGet () irá retornar um certo valor que corresponde com o solicitado e coordenar a função GetLastError () irá retornar valor zero (ou seja, não ocorreu nenhum erro ao solicitar o Coordenar). No entanto, se não houver um objeto do nome indicado na janela do símbolo, a função GetLastError () irá retornar o código de erro 4202, ou seja, nenhum objeto disponível: T2 = ObjectGet ( "Obj_Reg_Ch", OBJPROP_TIME2); / / Solicitando t2 coord. Erro = GetLastError (); / / Obtendo um código de erro Se o erro análise revelou que não eram objeto desse nome, isso significa que o programa deve criá-lo, depois de ter notificado o usuário sobre ações inadmissíveis (o programa não exclui objetos, isso significa que o objeto tenha sido excluído pelo usuário) .Esta é a razão pela qual, após ter exibido a mensagem, o programa solicita ao usuário-definidas anteriormente consideradas Crie função (), o que resulta em uma nova criação do objeto na janela do símbolo. Até ao momento da execução do próximo bloco (4-5), o objeto gráfico já foi criada. Para decidir se ela deve ser movida, você deve saber a posição do objeto no momento atual. Para este efeito, basta analisar o valor obtido anteriormente de coordenar a primeira do objeto. Se este valor não coincide com o tempo de abertura zero bar, para atribuir novas coordenadas para o objeto. As coordenadas são alterados utilizando a função ObjectMove (): ObjectMove ( "Obj_Reg_Ch", 0, Time [Len_Cn - 1], 0); / / Novo t1 coord. ObjectMove ( "Obj_Reg_Ch", 1, Time [0], 0); / / Novo t1 coord. Aqui, pela primeira coordenar (coordenar 0) do objeto chamado Obj_Reg_Ch, o valor do Tempo [Len_Cn-1], serão fixados, que, para coordenar o segundo (coordenar 1)-Time [0]. Os últimos parâmetros entre aqueles transferidos Para a função ObjectMove () é especificado o parâmetro 0. Este é o de coordenar os preços que, segundo a descrição da função, devem ser transferidos, mas, neste caso, será ignorado pelo cliente terminal. Como resultado da execução destas linhas, consideradas as propriedades do objeto gráfico será alterado. Como resultado da próxima execução da função WindowRedraw (), o objeto gráfico será redesenhado pela força o cliente terminal - agora, de acordo com os novos valores das coordenadas. Assim, na execução da função start (), o objeto gráfico Linear Regression Channel será redesenhado pelo cliente terminal cada vez quando uma nova barra de formulários, nas suas primeiras carrapato (ver fig. 139). Após a execução da EA já terminou, o determinado objeto gráfico será eliminada do símbolo janela durante a execução da função especial deinit () (ie, o programa irá "varrer para fora" seu trabalho instituídos após o trabalho tenha sido concluído).
Fig. 139. Vendo da regressão linear no Canal da execução da EA moveobjects.mq4. Em um caso geral, você pode criar e excluir objetos gráficos, de acordo com algumas condições calculado no programa. Você pode exibir o suporte / resistência linhas (OBJ_TREND), marca o momento de se aproximar dos eventos importantes com linhas verticais (OBJ_VLINE), indicam as interseções de várias linhas ou a previsão dos preços movimentos texto utilizando objetos (OBJ_LABEL e OBJ_TEXT), etc Deve notar-se separadamente, que, em alguns casos, não há necessidade de usar objetos gráficos. Por exemplo, se você deseja exibir na tela uma simples uma grande variedade de imagens do tipo (por exemplo, as setas), você pode usar linhas para este indicador, os seus estilos, em conjunto com o correspondente curso. Esta abordagem vai te livra da necessidade de acompanhar muitos coordenadas de objetos no programa, ele vai também impedirá que você ocasional supressão de uma imagem (os sinais que exibem linhas indicador pode ser eliminado nem seleccionada nenhuma). Funções para Trabalhar com os objectos gráficos Função
Síntese Info
ObjectCreate
Criando um objeto com o nome predefinido, escreva inicial e coordena o indicado no gráfico subwindow. número de coordenadas pode ser objeto de 1 a 3, dependendo do tipo de objeto.Em caso de sucesso a função retorna VERDADEIRO, FALSO caso contrário.
ObjectDelete
Excluindo um objeto com o nome indicado. Em caso de sucesso a função retorna VERDADEIRO, FALSO caso contrário.
ObjectDescription
A função retorna o objeto descrição. Ela retorna para objetos do OBJ_TEXT e OBJ_LABEL tipos de texto exibido na esses objetos.
ObjectFind
A função procura o objeto do nome indicado. A função retorna o índice da janela, ao qual pertence o objeto pesquisado. Em caso de falha, a função retorna -1.
ObjectGet
A função retorna o valor do imóvel dado do objeto.
ObjectGetFiboDescription A função retorna a descrição do objeto Fibo nível. O montante dos níveis depende do tipo do objeto que pertence ao grupo de Fibo objetos. O montante máximo dos níveis é de 32. ObjectGetShiftByValue
As funções calcula e retorna o número bar (a mudança em relação ao atual bar) para a determinado preço. O bar número é calculado
utilizando uma equação linear para a primeira e segunda coordenadas. É utilizado para as linhas das tendências e objectos semelhantes. ObjectGetValueByShift
As funções calcula e retorna o valor de um determinado preço bar (a mudança em relação ao atual bar). O preço valor é calculado utilizando uma equação linear para a primeira e segunda coordenadas. É utilizado para as linhas das tendências e objectos semelhantes.
ObjectMove
Mudar um objeto de coordenadas em um gráfico. Objects can have from one to three anchoring points according to the object type. In case of success, the function returns TRUE, otherwise FALSE.
ObjectName
The function returns the object name according to its order number in the list of objects.
ObjectsDeleteAll
Deleting all object of the indicated type in the indicated chart subwindow. The function returns the number of deleted objects.
ObjectSet
Changing properties of an indicated object. In case of success the function returns TRUE, otherwise FALSE.
ObjectSetFiboDescription The function assigns a new value to Fibonacci level. Number of levels depends on Fibonacci object type. Maximal number of levels is 32. ObjectSetText
Changing object description. For objects OBJ_TEXT and OBJ_LABEL this description is displayed on a chart as a text line. In case of success the function returns TRUE, otherwise FALSE.
ObjectsTotal
Returns the total number of objects of the indicated type on a chart.
ObjectType
The function returns the type of an indicated object.
For the detailed description of these and other functions, please refer to Documentation at MQL4.community , MetaQuotes Software Corp. website or to "Help" section in MetaEditor. Operações com Gráficos No seu trabalho prático, normalmente um comerciante abre em uma janela do símbolo várias janelas que exibem indicadores.Não existem limitações à colocação indicadores, que podem ser anexados em qualquer seqüência. O montante de subwindos um símbolo na janela não é limitada quer. Subwindow Cada um tem o seu número. A janela principal contém uma tabela dos preços está permanentemente disponível, sendo o seu número 0. Cada indicador subwindow tem um número, também. As janelas estão numerados em uma seqüência simples - eles são numerados pela sua exibição na janela do símbolo, de cima para baixo: o indicador subwindow mais próxima à janela principal tem o número 1, o próximo tem um menor número 2, o próximo tem um número 3 , Etc
Fig. 140. Subwindow localizações na janela do símbolo. A quantidade de janelas pode ser facilmente calculada utilizando a seguinte função: int WindowsTotal () A função retorna o valor do indicador janelas situadas no gráfico, incluindo a principal janela do gráfico. O maior número (dos mais baixos subwindow) semper 1 é inferior ao montante total das janelas (incluindo a janela principal numerados como 0) na janela do símbolo. Se, na situação mostrada na Fig. 140, apelamos para a execução do WindowsTotal função () a partir de qualquer aplicação, o valor devolvido será igual a 3, enquanto o maior número (dos mais baixos subwindow) é 2. A numeração sequencial descrito acima é mantido, se um novo indicador subwindow é adicionado a um ou subwindow existente é excluído do símbolo janela. Se você adicionar um novo subwindow, será exibido abaixo todas as outras janelas e seu número 1 é mais do que da última janela acima dela. Se você excluir uma subwindow a partir da janela do símbolo, todas as janelas abaixo dela, será automaticamente renumeradas - o número de cada um deles será diminuído em 1. Em MQL4, é possível criar objetos gráficos (e mudar suas propriedades) em qualquer uma das janelas existentes. Para este efeito, em função da ObjectCreate () o parâmetro 'janela' está fornecido, segundo a qual um objeto é criado na subwindow dado o símbolo da janela. O número atual do subwindow pode ser calculado utilizando a seguinte função: int WindowFind (string name) A função retorna o número do gráfico subwindow que contém o indicador denominado como «nome», se esta tiver sido encontrado. Caso contrário, ele retorna -1. A função também irá retornar -1, se um indicador pesquisas personalizadas para si próprio durante a inicialização init (). Parâmetros: nome - nome abreviado do indicador. A quantidade de janelas em uma janela do símbolo pode mudar a qualquer momento, se o utilizador elimina um indicador. Esta é a razão pela qual o algoritmo de uma aplicação que suporta monitoramento de objetos gráficos deve monitorar continuamente o número de janelas, nas quais os indicadores são exibidos.
Problema 34. Usando objetos gráficos, exibir mensagens informando sobre os dados recebidos a partir de dois indicadores. Se o indicador correspondente é anexado ao símbolo janela de exibição gráfica do objeto na janela do indicador. Caso contrário, exibi-la na janela principal. Para resolver o problema, vamos escolher indicadores RSI e Momentum. O algoritmo geral de construção de um Expert Advisor se resume a isto. Na função init (), você pode especificar textos a serem exibidos na tela de acordo com o indicador leituras, ou seja, fazer os cálculos para ser executado apenas uma vez no programa. No início da função (), você deve calcular o indicador leituras, detectar a necessária disponibilidade de janelas e seus números e, em seguida, de acordo com a situação, exibir uma mensagem em um ou outro ou outra subwindow. Na execução da função deinit (), É necessário eliminar todos os objetos gráficos criados durante o trabalho de seu programa. Abaixo está o chamado EA charts.mq4 que controla objetos gráficos nas janelas de um símbolo janela. / / --------------- --------------------------------- ---------------------------------/ / Charts.mq4 / / O código deve ser usado apenas para fins educacionais . //--------------- --------------- ------------------ ----------------------------- 1 -Win_Mom_old int = 0, / / Old número de subwindow Momento. Win_RSI_old = 0; / / Old número de subwindow LER color Color [5]; / / Declaração da cor do array Texto string [5]; / / Declaração da string array //------------------------------ --------------- --- ----------------------------- 2 -int init () / / Especial função init () ( Win_RSI_old = 0; / / Técnica momento Win_Mom_old = 0; / / Técnica momento Texto [0] LER Texto [1] Texto [2] Texto [3] Momentum Texto [4] Momentum Cor [0] = Color [1] Cor [2] = Cor [3] = Color [4]
= "LER (14) é inferior a 30. Comprar"; / / Textos para situações = "LER (14) é superior a 70. Sell"; / / Textos para situações LER = "LER (14) está entre 30 e 70"; / / Textos para situações LER = "Momentum (14) está em crescimento"; / / Textos para situações = "Momentum (14) está afundando"; / / Textos para situações DeepSkyBlue; = LightPink; laranja; / / Cor [0]; / / = Cor [1]; /
/ / Objeto de cor .. / / .. situações diferentes .. .. do indicador RSI As mesmas cores de Momentum / 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
/ / - --------------- -------------------------------- ---------------------------- 11 -int Create_RSI (int Win) / / Usuário-função definida (/ / .. De criação de um objeto ObjectCreate ( "Obj_RSI", OBJ_LABEL, Vitória, 0, 0); / / Criação de um objeto ObjectSet ( "Obj_RSI", OBJPROP_CORNER, 0); / / Ancoragem de um ângulo ObjectSet ( "Obj_RSI", OBJPROP_XDISTANCE, 3); / / Coordenada X if (Win == 0) ObjectSet ( "Obj_RSI", OBJPROP_YDISTANCE, 20); / / Coordenada Y diferente ObjectSet ( "Obj_RSI", OBJPROP_YDISTANCE, 15); / / Coordenada Y retorno; / / Sair do usuário-função definida ) //---------------- --------------- ----------------- ---------------------------- 12 -int Create_Mom (int Win) / / Usuário-função definida (/ / Criando um objeto .. ObjectCreate ( "Obj_Mom", OBJ_LABEL, Vitória, 0, 0); / / Criação de um objeto ObjectSet ( "Obj_Mom", OBJPROP_CORNER, 0); / / Ancoragem de um ângulo ObjectSet ( "Obj_Mom", OBJPROP_XDISTANCE, 3); / / Coordenada X if (Win == 0) ObjectSet ( "Obj_Mom", OBJPROP_YDISTANCE, 5); / / Coordenada Y diferente ObjectSet ( "Obj_Mom", OBJPROP_YDISTANCE, 15); / / Coordenada Y retorno; / / Sair do usuário-função definida ) //------------------------------- --------------- -- ---------------------------- 13 -Antes de analisar o código acima, temos de explicar as particularidades da operação do programa. Um objeto gráfico, uma vez criada (neste caso, uma exibindo um texto) é suposto estar presente na tela de forma contínua. Sua descrição textual é presumir que caracterizam a situação. O conteúdo da descrição textual deve ser alterado na execução da função start (), em todos os carrapatos. Ao mesmo tempo, ao alternar entre os prazos para a janela, para o qual está anexado AE, o programa passa através das seguintes fases: deinit (), init (), (a aguardar um carrapato), e iniciar (). Se o objeto é criado durante a primeira hora do início da execução (), então, a cada momento em que a mudança para um outro calendário, um determinado período de tempo irá caducar antes de aparecer o objeto, sendo o período de tempo igual ao de aguardar a próxima carrapato. Isto é muito incómodo, sobretudo, quando muitas vezes são comutados entre os calendários. Em um programa construído adequadamente, a necessária mensagens são exibidas na tela, no momento de fixar a janela do programa para o símbolo ou no momento da comutação temporal (ou seja, antes de um novo carrapato rendimentos). Para este efeito, em regra, é necessário realizar todas as ações a serem realizadas em cada carrapato, no lançamento da função especial iniciar () na fase da execução da função especial init (). A fim de não repetir o mesmo código de programa diferentes funções especiais, o código pode ser organizado como uma função separada. Para esse efeito, a EA contém o user-defined função principal (). Ela é chamada para ser executado logo na fase de inicialização (blocos 2-3) e em cada carrapato durante os trabalhos futuros da EA (blocos 3-4). No programa (bloco 11-13), existem mais duas funções definidas por usuários - Create_RSI () e Create_Mom () destinados à criação e alteração das propriedades do objeto. Na execução da função init (), o necessário objetos são criados usando essas funções. A chamada para a função principal () resulta em propriedades necessárias para conferir os objetos (os objetos desejados com a descrição da cor desejada são exibidos na janela desejada). Vamos considerar a função principal () (bloco 5-11) em mais detalhes. No bloco 6.7, as leituras do indicador RSI são calculados.Dependendo se o fim da linha indicador é superior a 70, abaixo de 30, ou
dentro do intervalo entre esses índices, um ou outro valor será atribuído à variável Ind_RSI. Em seguida, esse valor é usado como um índice de arrays Color [] e texto [] (em bloco 7-8) para alterar as propriedades do objeto gráfico do nome "Obj_RSI". Bloco 7-8. O número de LER janela é calculada na linha: Win_RSI_new = WindowFind ( "LER (14)"); / / Janela número de indicador RSI O valor da seqüência LER (14) é usado como parâmetro os transferidos. Este é o nome abreviado do indicador, o número dos que devem ser detectados. Neste caso, toda a seqüência de caracteres na linha determinada, incluindo parênteses e algarismos, compõe o nome. Deve-se notar que, no caso geral, pode haver vários indicadores do mesmo tipo na janela do símbolo, por exemplo, LER (14), LER (21) e LER (34). Cada um destes indicadores subwindow exibindo tem o seu próprio número. Esta técnica é por isso que os indicadores são desenvolvidos de forma a que cada um deles faz o seu nome abreviado de acordo com os valores predefinidos de parâmetros ajustáveis. O nome abreviado de cada indicador técnico, coincide com o mostrado no canto superior esquerdo da sua subwindow (o nome abreviado de um indicador podem ser personalizadas criadas pelo programador usando a função IndicatorShortName ()). Se o indicador está pesquisada não colocou na janela do símbolo, a variável Win_RSI_new (o número do subwindow, na qual este objecto deverá ser exibida no momento atual) terá o valor de -1, ou seja, nãoexistente janela. Neste caso, o programa implica a exibição gráfica do objeto na janela do gráfico principal, cujo número é semper 0: if (Win_RSI_new == - 1) Win_RSI_new = 0; / / Se não houver ind. e, em seguida, a janela principal Durante as suas operações, o usuário pode colocar um indicador em falta ou apagar uma existente. A fim de informar-se sobre quais as acções que devem ser realizados, o programa usa variáveis globais Win_RSI_old e Win_Mom_old. O valor de cada variável é o número do subwindow, em que o objeto tenha sido previamente criado. Se os valores das variáveis Win_RSI_new e Win_RSI_old não coincidirem, isso significa que o indicador janela ou é adicionado (que não existia antes) ou suprimido (ele estava disponível na anterior carrapato). Em ambos os casos, os criados anteriormente objeto deve ser suprimido, e um novo, deve ser criada na janela desejada: ObjectDelete ( "Obj_RSI"); / / Supressão do objeto Create_RSI (Win_RSI_new); / / Criar um objeto na janela desejada Depois que o objeto tenha sido criado na janela numerados como Win_RSI_new, o valor igual ao número de esta janela é atribuído à variável Win_RSI_old, ou seja, o programa lembra-se do número da janela, na qual o objeto gráfico foi criado: Win_RSI_old = Win_RSI_new; / / Lembre-se desta janela Se os valores das variáveis Win_RSI_new e Win_RSI_old coincidem, isso significa que é suficiente para atribuir uma descrição textual para o objeto (que agora é colocada na janela do necessário). Deve também ser feito, no caso de se criar um novo objeto: ObjectSetText ( "Obj_RSI", texto [Ind_RSI], 10, "Arial", Cor [Ind_RSI]); Cálculos similares são feitas para os outros subwindow, indicador de que a Momentum (blocos de 8 a 10). Ao final da função principal (), todos os objetos gráficos disponíveis são redesenhadas como um resultado da execução do WindowRedraw (). É fácil ver que o programado controle sobre objetos gráficos em janelas implica a utilização de variáveis globais (você também pode usar 'estáticos'). Nesses casos, quando codifica um programa, você deve
pagar uma atenção especial aos valores que podem ser tomadas pelas variáveis globais em situações diferentes e que tudo isso poderá resultar polegadas No programa acima considerados, variáveis globais são zeroized na função init () : Win_RSI_old = 0; / / Técnica momento Win_Mom_old = 0; / / Técnica momento Estas linhas estão incluídas no programa, devido ao fato de que perdem os seus valores variáveis globais, apenas se o usuário tiver sido interrompido a execução do programa aplicativo na janela do símbolo. No entanto, se o usuário tiver ajustado ou variáveis externas ao calendário comutada, o programa sofre deinitialization ea conseqüente inicialização, os valores das variáveis globais sejam salvos. Vamos considerar as operações do programa que não contêm essas linhas. Suponha, ambos os indicadores, com o subwindow números 1 e 2, respectivamente, foram colocadas na janela, símbolo do momento em que o usuário muda o calendário. No exemplo considerado, quando os deinitializing programa, os objetos gráficos são eliminados. Na execução da função especial init (), os objetos são criados na janela do zero. Em seguida, na execução da função principal (), em blocos 7.8 e 9.10, o programa compara o número obtido da janela, na qual os objetos devem ser colocados, bem como o número da janela, na qual o objetos estavam no anterior carrapato. Na verdade, o objeto já tenha sido colocado na janela do zero, mas os valores das variáveis globais vão dizer para os outros resultado: o seu número será 1 e 2. Como resultado, os objectos gráficos permanecerá na janela principal, até que o usuário apaga reattaches e os indicadores correspondentes. Tal como para prevenir estes desenvolvimentos indesejáveis, o programa implica nulling das variáveis globais na execução da função init (). Desta forma, os valores dessas variáveis são feitos corresponder-se com a situação. Como resultado da execução da EA charts.mq4, as seguintes combinações de janelas e objetos gráficos mostrados podem aparecer:
Fig. 141. Exibindo objetos gráficos nas janelas de um símbolo janela. Se existirem indicadores tanto na janela do símbolo, o correspondente objetos gráficos serão mostrados em suas janelas. Se não houver um destes indicadores é colocado e, em seguida, ambos os objetos serão criados pelo programa na janela principal.Adicionando ou supressão de qualquer indicador, o nome das quais é processado no programa, irá resultar na deslocação do objeto gráfico correspondente em necessárias à janela. Adição ou exclusão de outros indicadores a partir da janela do símbolo não irá implicar quaisquer consequências.
Deve notar-se separadamente, que a alternativa de excluir um objeto pela gráfica do usuário não é considerado neste programa.Um programa utilizado na sua prática comercial deve conter a análise dessa situação, com a posterior restauração do objeto (veja a solução do problema 33).
Utilizado em Operações com funções Gráficos Função
Síntese Info
HideTestIndicators
A função coloca uma bandeira de esconder os indicadores chamado pelo Expert Advisor. Ao abrir o gráfico após análise, os indicadores marcados com a bandeira escondendo não será mostrado no ensaio gráfico. Antes de cada chamada, o indicador é marcado com a bandeira escondendo atualmente definido (apenas os indicadores que são chamados directamente a partir da EA em ensaio pode ser exibido no teste gráfico).
Período
Ela devolve o valor do montante do período minutos para o atual quadro.
RefreshRates
Atualizando dados da predefinidos timeseries variáveis e matrizes. Esta função é utilizada, quando um EA ou um script cálculo foi durante muito tempo e precisa atualizar dados. Retorna TRUE, se a actualização tenha êxito. Caso contrário, retorna FALSE. Os dados podem permanecer desatualizados apenas se eles correspondem com o estado atual do cliente terminal.
Símbolo
Ele retorna uma linha de texto com o nome do atual símbolo.
WindowBarsPerChart
A função retorna a quantidade de bares montagem na janela do gráfico atual.
WindowExpertName
Ela retorna o nome da execução EA, script, personalizado ou indicador de biblioteca, dependendo da MQL4 programa, a partir da qual esta função tenha sido chamado.
WindowFind
Ele retorna o número do gráfico subwindow que contém o indicador com o nome indicado 'nome', se tiver sido encontrado. Caso contrário, ele retorna -1. WindowFind () retorna -1, se o indicador está pesquisando personalizado para si próprio durante a inicialização init ().
WindowFirstVisibleBar
A função retorna o número da primeira barra visível na janela da tabela atual. Você deve considerar que o preço bares estão numerados em uma ordem invertida, a partir da última para a primeira. O atual bar, que é o último no preço matriz, tem índice 0. O bar tem mais antigo índice Barras1. Se o número da primeira barra é visível 2 ou mais menos do que a quantidade de barras visível no gráfico, isto significa que a janela do gráfico não está completo e há um espaço para a direita.
WindowHandle
Ela retorna a janela para lidar com a janela que contém o dado gráfico. Se nenhum símbolo gráfico com o calendário é aberto e, no momento da chamada de função, ele retorna 0.
WindowIsVisible
Retorna TRUE, se o gráfico é visível subwindow. Caso contrário, retorna FALSE. O gráfico subwindow chan estar escondido devido às propriedades do indicador visibilidade anexados a ela.
WindowOnDropped
Ela retorna o índice da janela, na qual a EA, um script ou um costume indicador foi descontinuado.Este valor será verdade, só se os EAs,
indicadores e scripts personalizados são anexados usando uma rato (a tecnologia de "arrastar e largar '). Para os indicadores personalizados sendo inicializado (chamada a partir da função init ()), este índice não é definido. O índice é devolvido o número da janela (0 é a principal janela do gráfico, indicador janelas são numerados começando por 1), em que o indicador está trabalhando personalizado. Durante a inicialização, um costume indicador pode criar o seu ganha nova subwindow, e seu número será diferente do da janela, na qual o indicador foi realmente caiu. WindowPriceMax
Ela devolve o valor máximo da escala vertical do dado subwindow da actual tabela (0 é a principal janela do gráfico, indicador janelas são numerados começando por 1). Subwindow Se o índice não for especificado, o valor máximo da escala dos preços dos principais Gráficos janela será devolvido.
WindowPriceMin
Ela mostra o valor mínimo da escala vertical do dado subwindow da actual tabela (0 é a principal janela do gráfico, indicador janelas são numerados começando por 1). Subwindow Se o índice não for especificado, o valor mínimo da escala dos preços dos principais Gráficos janela será devolvido.
WindowPriceOnDropped Ela devolve o valor de preço em um gráfico ponto, em que um EA ou um script ter sido descontinuado. O valor será verdade, só se a EA ou o script foram movidas usando uma rato (a tecnologia de "arrastar e largar ') . Este valor não está definido para indicadores personalizados. WindowRedraw
Ela reformula o atual gráfico compulsivamente. A função é normalmente utilizada após o objeto propriedades foram alteradas.
WindowScreenShot
Ele salva a exibição do actual gráfico em um arquivo GIF. Caso não o faça uma captura de tela, ele retorna FALSE.
WindowTimeOnDropped A função retorna um valor com o tempo gráfico ponto, em que um EA ou um script ter sido descontinuado. O valor será verdade, só se a EA ou o script foram movidas usando uma rato (a tecnologia de "arrastar e largar ' ). Este valor não está definido para indicadores personalizados. WindowsTotal
A função retorna a quantidade de janelas do indicador no gráfico, incluindo a principal janela do gráfico.
WindowXOnDropped
Ela devolve o valor de X em pixels para coordenar o aspecto gráfico da janela do cliente na área, onde um EA ou um script foram abandonadas. O valor será verdade, só se a EA ou o script foram movidas usando uma rato (a tecnologia de "arrastar e largar ').
WindowYOnDropped
Ela devolve o valor de Y em pixels para coordenar o aspecto gráfico da janela do cliente na área, onde um EA ou um script foram abandonadas. O valor será verdade, só se a EA ou o script foram movidas usando uma rato (a tecnologia de "arrastar e largar ').
Para a descrição detalhada destas e de outras funções, é favor consultar a documentação em MQL4.community, MetaQuotes Software Corp site ou para a "Ajuda" na seção MetaEditor. Funções String
O mais comum com a seqüência funcionamento valores, além (concatenação), foi discutido na Operações e Expressões(Problema 3) seção. Em alguns casos, há necessidade de realizar outros cálculos relacionados com a corda valores. MQL4 tem um número de seqüência funções para trabalhar com os valores do tipo string. Vamos considerar o uso de alguns deles através do exemplo a seguir. Problema 35. Cor dos últimos 100 bares do castiçal gráfico da seguinte forma: preto castiçais em vermelho, branco castiçais em azul. Um candelabro pode ser colorido usando duas linhas: uma linha fina deve sobrepor um candelabro de modo que o mesmo abrange todas as sombras, enquanto uma espessa linha deverá preencher um castiçal corpo. Neste caso, não podemos usar as linhas de um costume indicador, pois as linhas indicadas deve ser vertical, ou seja, construída usando duas coordenadas (coordenadas com o mesmo tempo), enquanto indicador arrays nos permitem armazenar apenas um valor fixado em correspondência com cada compasso. Então, surge a solução do problema exibindo uma série de single-tipo OBJ_TREND objetos que diferem em suas coordenadas e estilo da linha ea cor (ver gráficos Objects), em um gráfico dos preços. Neste caso, a EA é utilizado como um programa aplicativo, mas, em geral, o algoritmo pode ser implementado em um indicador personalizado. Como um todo, o algoritmo é claro. O plano deve ser colorido pela primeira vez, logo que este está ligado ao símbolo janela (durante a execução do init ()). O programa deve monitorar possíveis alterações na localização de objetos gráficos (usuário pode mover ou apagar acidentalmente um deles), com todos os carrapatos próximos, e restaurá-los, se necessário. Todos os objetos criados pelo programa deve ser eliminado, logo que termine o programa operacional (deinit ()). Um utilizador pode criar outros objetos em uma janela enquanto símbolo da EA está a trabalhar, por exemplo, colocar o canal de desvio-padrão, Fibo níveis, linhas de apoio, etc Então, o algoritmo que nos permite distinguir user-criado programa e-criada objetos devem ser implementadas no programa. Isto é particularmente importante quando se encerra o programa: é necessário apenas remover o programa criou-objetos, enquanto os objetos criados por usuários devem permanecer inalterados. Cada objeto gráfico tem as suas próprias propriedades que geralmente podem coincidir. A única característica de identificar qualquer objeto é seu único nome (o uso dos mesmos nomes é proibida). É recomendado para introduzir a informação útil no nome do objeto quando escrevo isso, então será possível detectar a localização e as propriedades do objeto. Por exemplo, um objeto nome pode conter um prefixo que diferencia um programa-objeto criado a partir de outros. Neste caso, é "Paint_". Além disso, é necessário diferenciar o "utilizador-definido" objetos de qualquer outro, também. Ao mesmo tempo uma simples numeração (Paint_1, Paint_2) não podem ser utilizados. Usando esse método de objetos numeração, você não pode compreender, no qual o objeto Paint_73 barra deve ser exibido. O bar que possui o índice Paint_73 irá buscar o índice Paint_74, quando surge um novo bar, quando um outro índice Paint_75 nova barra vem, etc Nesse caso, seria necessário excluir e recriar todos os objetos em cada novo bar. Essa solução (embora isso seja possível) é, obviamente, muito acidentado e caro. Cada objeto criado deve ter o seu tempo com coordenadas que corresponde ao momento da abertura bar. Além disso, duas linhas devem ser exibidos em cada bar - uma linha fina e uma linha grossa. É mais confortável para representar os nomes dos objetos criados por um programa como o seguinte: Object name = Paint_2_2007.03.22 16:40, aqui: Paint_ - prefixo que diferencia os objetos criados pelo programa; 2_ - quer número de objetos que são exibidos em uma barra (valor 1 ou 2 é possível);
2007.03.22 16:40 - coordenar tempo que caracteriza o unívoca barra o objeto é exibido no. Paint_ e 2_ são os valores das variáveis e Prefixo Nom_Lin, respectivamente. As coordenará tempo pode ser obtido para cada barra de transformação em um valor datetime um valor de seqüência usando a transformar funções: TimeToStr () Função string TimeToStr (datetime valor, int mode = TIME_DATE | TIME_MINUTES) A função transforma os valores que contêm tempo (em segundos) caducada desde 01.01.1970 (valor datetime) em uma seqüência de caracteres de formato especificado (string valor). Parâmetros: valor - o tempo em segundos desde 00:00 expirava em 1 de janeiro de 1970; modo - um modo de saída de dados adicionais. Pode ser um simples ou combinados uma bandeira: TIME_DATE obtém o resultado no "yyyy.MM.dd" forma; TIME_MINUTES obtém o resultado na "hh: mi" forma; TIME_SECONDS obtém o resultado na "hh: mi: ss" formulário. Vamos considerar a EA strings.mq4 que gere objetos para colorir de velas e ver como o TineToStr () é utilizado neste programa: //------------------------------------------------ -------------------/ / Strings.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ --------------- 1 -Quant_Bars extern int = 100; / / Número de barras datetime Time_On; string Prefix = "Paint_"; //------------------------------------------------ --------------- 2 -int init () / / Spec. função init () ( int Ind_Bar; / / Bar índice Time_On = Tempo [Quant_Bars]; / / Hora do primeiro colorir for (Ind_Bar = Quant_Bars - 1; Ind_Bar> = 0; Ind_Bar -) / / Barras ciclo ( Crie (Ind_Bar, 1); / / Desenha uma linha fina Crie (Ind_Bar, 2); / / Desenha uma linha grossa ) WindowRedraw (); / / Imagem redesenhando retorno; / / Sair init () ) //------------------------------------------------ --------------- 3 -int start () / / Spec. função start () ( datetime T1, T2; / / 1 hora e 2 coordenadas int erro, Ind_Bar; / / Código de erro ea barra de índice dupla P1, P2; / / 1 e 2 coordenadas preço color Col; / / Cor do objeto criado //------------------------------------------------ --------------- 4 -for (int linha = 1; Line <= 2; Line + +) / / Linha tipo ciclo ( string Nom_Lin = Linha + "_"; / / String com o número da linha / / String Nom_Lin = DoubleToStr (Linha, 0 )+"_";// Pode ser tão
for (Ind_Bar = 0;; Ind_Bar + +) / / Bar do ciclo ( //------------------------------------------------ --------------- 5 -datetime T_Bar = Tempo [Ind_Bar]; / / Bar abertura vez if (T_Bar C_Bar) Cor = Vermelho; / / .. parâmetros da barra
if (O_Bar == C_Bar) = cor verde; switch (Line) / / Thin ou linha grossa ( case 1: / / Thin line ObjectCreate (His_Name, OBJ_TREND, 0, T_Bar, H_Bar, T_Bar, L_Bar); break; / / Sair do interruptor case 2: / / Esp line ObjectCreate (His_Name, OBJ_TREND, 0, T_Bar, O_Bar, T_Bar, C_Bar); ObjectSet (His_Name, OBJPROP_WIDTH, 3); / / Estilo ) ObjectSet (His_Name, OBJPROP_COLOR, Cor); / / Cor ObjectSet (His_Name, OBJPROP_RAY, false); / / Ray ObjectSetText (His_Name, "objeto é criado pela EA ", 10); / / Descrição retorno; / / user-defined função Sair ) //------------------------------------------------ -------------- 11 -A fim de criar objetos gráficos, o usuário-definidas Crie função () (blocos 10-11) é usada no programa. A variável Ind_Bar que indica o índice de barra o objeto deve ser criado, e com a Linha, o objeto número (linha 1 ou 2), são utilizados como parâmetros a ceder nesta função. Três componentes são usados quando fazem o nome do objeto a ser criado: string His_Name = Prefixo Nom_Lin + + Str_Time; / / Nome do objeto criado O valor do prefixo variável é especificada pelo programador na cabeça parte do programa e não é alterado durante a execução programa: string Prefix = "Paint_"; O valor da Nom_Lin variável é obtido como resultado de cálculos: string Nom_Lin = Linha + "_"; / / Seqüência - Linha número / / String Nom_Lin = DoubleToStr (Linha, 0 )+"_";// Pode ser tão Aqui, o valor da variável inteira (no cálculo durante a primeira parte da expressão) é transformado no tipo do maior prioridade, ou seja, para a string tipo. Como resultado, o Nom_Lin recebe "1_" ou "2_" valores, dependendo do valor da Linha variável. Para se calcular o valor da variável Str_Time o TimeToStr () a transformação é função dos dados utilizados: string Str_Time = TimeToStr (T_Bar); / / Seqüência - Aberto tempo Observe que o TimeToStr () função tem valores padrão. Neste caso, estas são esses valores que são necessárias: "yyyy.MM.dd hh: mi", não há necessidade de usar adicionalmente segundo, porque o prazo mínimo é igual a 1 minuto. Nós poderíamos também aplicar o seguinte método de cálculo Str_Time para ser usado no objeto nome: string Str_Time = T_Bar; Neste caso, o Str_Time iria obter um valor igual ao número de segundos desde 01.01.1970 caducou. A fim de ver a diferença, podemos desenvolver um programa que contém o seguinte código: int init () ( string String_Time = TimeToStr (Hora [0]); / / Hora no formato string String_Sec = Tempo [0]; / / Número de segundos
Alerta ( "String_Time =", String_Time, "String_Sec =", String_Sec); retorno; ) A seguinte mensagem (de acordo com o tempo de abertura zero bar) será exibida na tela, como resultado da execução do programa: String_Time = 2007.03.22 19:10 String_Sec = 1174590600 A primeira alternativa que é implementado na strings.mq4 EA é um pouco mais informativo, pelo que a preferência é para ela, neste caso (as alternativas são equivalentes em termos de compor um algoritmo). O objeto chamado His_Name é criado na sequência das linhas definidas pelo utilizador-Crie função (). Ele contém informações sobre a abertura do bar tempo com os parâmetros que correspondem ao número da "Linha" linha e também a cor dependendo do bar características. O valor do texto descrição é especificado para cada objeto, "objeto é criado pela EA", como bem. O Crie () é chamado em função do programa a partir de dois locais: a especial função init a partir de () para a criação de objetos inicial e, a partir do início especiais função () para re-criar o objeto, se necessário, no caso, era suprimidos ou modificados pelo usuário. O objeto nomes no início () (blocos 46) são formadas da mesma forma que em outras partes do programa. As coordenará do primeiro considerado objeto é definida no block 6-7. Se o objeto não for encontrado, neste momento, irá ser criado pelo Create () function. E se o objeto existe, as suas outras coordenadas serão determinadas e os parâmetros da sua correspondência com a barra de propriedades serão verificadas (blocos 7-8). O objeto será eliminado e recriado (com o mesmo nome) com as propriedades corretas, caso seja detectado algum desfasamento. Outro problema é solucionado durante a execução da deinit () Função: é necessário excluir apenas os objetos que foram criadas pelo programa a partir do agregado de todos os objetos na janela do símbolo. Esta é realizada em duas fases: na primeira fase, os nomes de todos os objetos que devem ser memorizados são apagados ao Name_Del [] array, e então elas serão suprimidas em um ciclo individual. O número total de objetos na janela (incluindo as criadas pelo programa e colocados manualmente pelo usuário) é calculado pela ObjectsTotal () Função: int Quant_Objects = ObjectsTotal (); / / Número de TODOS os objetos O número de barras coloridas está a ser fixado pelo usuário em uma variável externa, ou seja, não se sabe de antemão quantos objetos devem ser suprimidas. Portanto, a string array que contém os nomes dos objetos a serem apagados, é declarada com o número de elementos igual a 1. Além disso, seu tamanho é programaticamente alterada - o número de elementos seja aumentado para o número total de objetos. ArrayResize (Name_Del, Quant_Objects); / / Necessário array tamanho A fim de selecionar os objetos que foram criados pela EA, a deinit () contém a função do ciclo 'para' que analisa os nomes de todos os objetos. Obj_Name seqüência ObjectName = (k); / / Busca nome do objeto O atributo que diferencia "nossos" objetos de todos os outros é o "Paint_" prefixo, com o qual o nome de cada programa criado-objeto é iniciada. Para analisar um nome objeto, devemos extrair a primeira parte (neste caso, símbolos 6) A partir da seqüência variável a ser o único nome do objeto; então devemos comparar este valor com o do Prefixo variável. Se coincidirem, este objeto deve ser suprimida. Se não, ela não deve ser eliminado.
StringSubstr () Função StringSubstr corda (string texto, int start, int comprimento = 0) A função extrai o texto a partir do texto linha a partir da posição especificada. A função devolve a cópia do texto extraído. Caso contrário, uma seqüência vazia será retornada. Parâmetros: Texto - a linha do texto deveria ser extraído de; iniciar - a posição inicial da subseqüência. Ela pode variar de 0 a StringLen (texto) -1; comprimento - o comprimento da substring a ser extraídos. Se o valor desse parâmetro é inferior ou igual a 0 ou até mesmo não é especificado, então o texto será extraída a partir da posição especificada até o fim da linha. No exemplo considerado, o texto é extraído o nome do objeto da seguinte forma: Chefe StringSubstr string = (Obj_Name, 0, 6); / / Extract 6 primeiros símbolos Neste caso, os 6 primeiros símbolos são extraídas da Obj_Name variável string iniciando com um a zero. Observe que a contagem de todos os índices (bares, arrays), as encomendas entradas na lista e também o número da posição na linha começa com 0, enquanto que a contagem começa com 1 quantificados. O extraídas substring (um valor de seqüência) é atribuído ao chefe variável string. Se o nome do objeto (e no próprio objeto), é considerada criada pela EA, o valor do texto extraído será "Paint_". Se outro nome for analisado, então o valor desejado será diferente. Por exemplo, o valor do texto extraído a partir do "Channel stdDev 23109" objeto nome será o seguinte: "stdDev", e para o objeto chamado "Fibo 22800", será "Fibo 2". Nas linhas subseqüentes, o valor da variável é comparado ao chefe que a variável Prefixo: if (Chefe == Prefixo) / / O objeto começo .. (/ / .. com Paint_ é encontrado Se esses valores são iguais entre si e, em seguida, analisaram o nome do objeto será colocado à matriz Name_Del [] para os nomes dos objetos a serem excluídos. Na próxima "para o" ciclo, todos os objetos, os nomes dos que estão contidos pela matriz, será eliminado (note-se em separado que é impossível eliminar todos os objetos durante o primeiro ciclo, porque, neste caso , O número total de objetos e sua numeração será alterado de cada vez que o objeto é excluído, o que irá resultar na omissão de alguns nomes objeto). O preço gráfico terá a seguinte aparência durante a execução da strings.mq4 EA:
Ð ¸ Ð Ñ. 142. Preço gráfico colorido utilizando objetos gráficos (strings.mq4). Além dos grupos de objetos que cobrem o preço gráfico, dois outros objetos colocados manualmente pelo usuário são exibidos, como mostrado na fig. 142; eles são regressão canal e Fibo níveis. Os objetos criados pela EA será eliminado, assim que estiver concluída a sua execução, e os objetos criados pelo usuário permanecerá na janela do símbolo. Este resultado é obtido em decorrência do uso da corda funções no programa. Eles permitem a criar e analisar valores string, incluindo nomes objeto gráfico.
Funções String Função
Breve descrição
StringConcatenate
Insere-se uma seqüência de parâmetros e dado a volta dele. Os parâmetros podem ser de qualquer tipo. O número de parâmetros não pode exceder 64.
StringFind
Substring pesquisando. Ele retorna o número da posição na linha começa com a substring desejada, ou -1, no caso do substring não for encontrado.
StringGetChar
Ela devolve o valor do símbolo que está situado na posição da linha especificada.
StringLen
Ele retorna o número de símbolos na linha.
StringSetChar
Ela devolve a cópia do acordo com a modificação do valor do símbolo na posição especificada.
StringSubstr
Ele extrai o texto que começa na posição especificada na linha do texto. A função devolve a cópia do texto extraído, se possível. Caso contrário, uma seqüência vazia será retornada.
StringTrimLeft
A função corta o transporte retorno personagens, espaços e tabulação símbolos a partir da parte esquerda da corda. A função devolve a cópia do texto modificado, se possível. Caso contrário, uma seqüência vazia será retornada.
StringTrimRight
A função corta o transporte retorno personagens, espaços e tabulação símbolos a partir da parte direita da corda. A função devolve a cópia do texto modificado, se possível. Caso contrário, uma seqüência vazia será retornada.
Data Transformation funções Função
Síntese Info
CharToStr
Transformação do código em um único símbolo-símbolo string.
DoubleToStr
Transformação do valor numérico em uma seqüência de texto que contém a representação simbólica do número com precisão o formato especificado.
NormalizeDouble
Arredondamentos com o número do ponto flutuante para a precisão especificada. O cálculo StopLoss, TakeProfit e também a abrir prcie encomendas pendentes de valores deverá ser normalizado, de acordo com a precisão que está armazenado na variável definida Dígitos.
StrToDouble
Transformação da cadeia que contém a representação simbólica do número para o número de "dupla" tipo (dupla-precisão com o formato de ponto flutuante).
StrToInteger
Transformação da cadeia que contém a representação simbólica para o número do "int" tipo (inteiro).
StrToTime
Transformação da cadeia que contém o tempo e / ou a data no "yyyy.MM.dd [hh: mi]" formato para o número do "datetime" tipo (número de segundos passaram desde 01.01.1970).
TimeToStr
Transformação do valor que contém o tempo expresso em segundos passaram desde 01.01.1970 para a seqüência das "yyyy.MM.dd hh: mi" formato.
Para obter a informações detalhadas sobre essas e outras funções, dê uma olhada na documentação em MQL4.community, emMetaQuotes Software Corp site ou no menu "Ajuda" do MetaEditor. Data e Hora O sistema de comércio on-line Metatrader 4 utiliza as indicações de duas fontes de tempo - o local (PC) eo tempo do servidor tempo. Hora local - o tempo que for definido sobre o PC local. Servidor de tempo - o tempo que for definido no servidor.
TimeLocal () Função datetime TimeLocal () A função retorna o PC local o tempo, expresso em número de segundos desde 00:00 expirava em 1 de janeiro de 1970. Nota: Na análise, o horário local é modelado e coincide com o último modelá-servidor conhecido tempo.
A grande maioria dos eventos que ocorrem no cliente terminal são consideradas de acordo com o servidor de tempo. O tempo de carrapatos próximos, nova barra de início, para abertura e fechamento é considerado de acordo com o servidor de tempo.Para obter o valor do servidor de tempo que corresponde com o horário atual, o TimeCurrent () função deve ser usada: TimeCurrent () Função datetime TimeCurrent () A função retorna o último valor conhecido do servidor de tempo (o tempo da última cotação próximos) expresso em segundos desde 00:00 expirava em 1 de janeiro de 1970. O cliente terminal atualiza o tempo de citar a última vinda (em conjunto com outras variáveis do ambiente) antes de iniciar funções especiais para sua execução. Cada carrapato é caracterizada com o seu próprio valor do servidor de tempo que pode ser obtida utilizando o TimeCurrent () function. Durante a execução, este valor só pode ser alterada na sequência da RefreshRates () chamada da função e apenas se a informação foi atualizada desde a última execução do RefreshRates () function, ou seja, no caso dos novos valores de algumas variáveis do ambiente vieram do servidor. O tempo de abertura bar, Hora [i], não coincide com o momento do novo carrapato próximos, como uma regra. A qualquer hora do calendário barra de abertura é divisível por semper o calendário. Qualquer primeiro Assinalar apareceu dentro de um horizonte temporal é barra-formando, se não houver nenhum carrapato recebimento dentro de um prazo definido, o bar não vai ser formado dentro dos prazos. Por exemplo, o carrapato chegando ao terminal de tempo (servidor) t0 resulta na formação de um bar com o tempo abrindo igual a Hora [i +2] (Fig. 143). O momento especificado como o início do calendário não coincide com o momento t0, embora possa concordar com ele acidentalmente, em geral. Os carrapatos subseqüentes que vêm para o terminal dentro do mesmo prazo (no momentos de T1 e T2) pode alterar os parâmetros da barra, por exemplo, preço máximo ou abrir preço, mas eles não afetam o tempo de abertura bar. O bar encerra o tempo não é considerada no sistema de comércio on-line Metatrader 4 (formalmente, o horário do último carrapato próximos ou dentro de um horizonte temporal do início do próximo período de tempo pode ser considerado como tempo fechando o bar, como mostrado na fig. 143 ).
Fig. 143. Bar formando seqüência no comércio online plataforma Metatrader 4. É mostrado na fig. 143 que é possível que bares não são formados a alguns períodos de tempo que são iguais para o período de tempo. Assim, entre o tempo do carrapato próximos T5 e T6 da próxima vinda carrapato, o calendário completo está embalado, por isso a nova barra de não ter sido formados a esse período de tempo. Desta forma, o tempo de abertura bar diferirem maio, a partir do momento da abertura de um bar adjacente por mais de um calendário inteiro, mas é semper divisível por um horizonte temporal. Para demonstrar a seqüência do bar formando, podemos usar o EA timebars.mq4 saídas que o tempo de carrapato e próximos do momento da barra de abertura:
//------------------------------------------------ -------------------/ / Timebars.mq4 / / O programa é destinado a ser utilizado como um exemplo em MQL4 Tutorial . //------------------------------------------------ -------------------int start () / / Spec. função start () ( Alerta ( "TimeCurrent =", TimeToStr (TimeCurrent (), TIME_SECONDS), "O tempo [0] =", TimeToStr (Hora [0], TIME_SECONDS)); retorno; / / Sair start () ) //------------------------------------------------ -------------------Os resultados da EA timebars.mq4 de trabalho são mostrados na fig. 144. É óbvio que o primeiro assinale o regular no período de tempo de 1 minuto duração entrou em 14:29:12, ao mesmo tempo uma nova barra de abertura foi formada com o tempo - 14:29:00. Observe que a coluna à direita da caixa de mensagem exibe o servidor de tempo, a coluna da esquerda exibe a hora local.
Fig. 144. Bar formando seqüência no sistema de comércio on-line Metatrader 4. No caso dos carrapatos vêm raramente (por exemplo, o período entre o final da sessão Europeu e do início da sessão asiática), você pode observar um outro fenômeno durante a execução das timebars.mq4: o tempo de abertura da bares adjacentes podem diferir uns dos outros por mais de 1 minuto (para um minuto de tempo). Ao mesmo tempo, a indexação de barras é guardado em sucessão, sem espaços. O servidor de tempo de servidores em diferentes centros que tratam pode variar. O horário de início e término trades é fixado em cada servidor individualmente e pode discordar do início e do fim de regular o dia. Alguns centros que tratam, por exemplo, as definições têm que realizar abertura comercial no domingo, às 23:00 hora do servidor. Isso resulta na formação de barras diário incompleto, a sua duração é igual à prática uma hora (Fig. 145).
Fig. 145. Bar história diferente em diferentes centros que tratam. O uso de Data e hora de funções é bastante fácil de MQL4. Alguns deles transformar o servidor ea hora local em segundos desde 00:00 expirava em 1 de janeiro de 1970 em um número inteiro que corresponde a uma hora, um dia, etc Outras funções retornam um número inteiro que corresponda com a hora actual , Dia, minuto, etc TimeSeconds (), TimeMinute (), TimeHour (), TimeDay (), TimeMonth (), TimeYear (), TimeDayOfWeek () e TimeDayOfYear () Funções Este é um grupo de funções que retornam o número de segundos caducado a partir do início da hora, ou minuto, hora, dia, mês, ano, dia da semana eo dia do ano para o período de tempo especificado. Por exemplo: int TimeMinute (datetime tempo) A função retorna minutos para o período de tempo especificado. Parâmetros: tempo - a data expressa no número de segundos em que expirava 00:00 desde o dia 1 de janeiro de 1970. int TimeDayOfWeek (datetime tempo) Esta função retorna o dia da semana (0-domingo, 1,2,3,4,5,6) para a data especificada. Parâmetros: tempo - a data expressa no número de segundos em que expirava 00:00 desde o dia 1 de janeiro de 1970.
As funções podem ser considerados utilizadas para a análise de qualquer barra de abertura tempo, por exemplo. A EA chamadobigbars.mq4 destinados a encontrar barras de um tamanho que não é inferior à especificada tamanho é mostrado abaixo. //------------------------------------------------ -------------------/ / Bigbars.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ --------------- 1 -extern int Quant_Pt = 20; / / Número de pontos //------------------------------------------------ --------------- 2 -int start () / / Spec. função start () ( H_L int = 0; / / Altura da barra for (int i = 0; H_L = Quant_Pt) / / se o elevado bar não é encontrado ( int = TimeYear YY (Hora [i]); / / Ano MN = int TimeMonth (Hora [i]); / / Mês DD = int TimeDay (Hora [i]); / / Dia int HH = TimeHour (Hora [i]); / / Hora MM = int TimeMinute (Hora [i]); / / Minuto Comentário ( "O último preço superior a circulação", Quant_Pt, / / Mensagem "Pt aconteceu", DD, ".", MN, "." YY ", ", HH,": ", MM); / / output ) ) retorno; / / Sair start () ) //------------------------------------------------ --------------- 3 -O bigbars.mq4 EA pesquisas o bar mais próximo cuja altura (diferença entre a máxima e mínima) seja maior ou igual ao valor indicado na variável externa Quant_Pt. A data eo horário dos outputted bar são encontrados para a janela de instrumento financeiro, pelo comentário () function.
Segundos (), Minute (), Hour (), Dia (), TimeMonth (), TimeYear (), DayOfWeek () e DayOfYear () Funções Este é o grupo de funções que retornam o actual segundo, minuto, hora, dia, mês, ano, dia da semana eo dia do ano para conhecer o último servidor tempo. A última vez é conhecido servidor a servidor de tempo que corresponde com o momento do lançamento do programa (lançamento de qualquer função especial pelo cliente terminal). O servidor de tempo não é alterado durante a execução da função especial. int Hour () Ela retorna a hora actual (0,1,2, .. 23) da última vez conhecida servidor. Note-se que os últimos tempos é conhecido servidor modelado durante os testes. int DayOfYear () Ela retorna o dia atual do ano (1 é o primeiro 1, .., 365 (6) é o dia 31 de dezembro), ou seja, o dia do ano da última vez conhecida servidor. Note-se que os últimos tempos é conhecido servidor modelado durante os testes.
A EA timeevents.mq4 que realiza algumas ações, logo que chega o período de tempo especificado pode ser usado como um exemplo de uso do exposto funções. //------------------------------------------------ -------------------/ / Timeevents.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ --------------- 1 -extern dupla Time_Cls = 16,10; / / fechando tempo Encomendas Flag_Time bool = false; / / Bandeira, ainda não existem mensagens //------------------------------------------------ --------------- 2 -int start () / / Spec. iniciar funções ( int Cur_Hour = Hour (); / / Servidor em horas Cur_Min duplo = Minuto (); / / Server tempo em minutos Cur_time duplo = Cur_Hour + Cur_Min 100; / / Hora atual Alerta (Cur_time); if (Cur_time> = Time_Cls) / / Se o tempo veio para o evento Executora (); / / .. em seguida, executar acções concebidas retorno; / / Saída de início () ) //------------------------------------------------ --------------- 3 -int testamenteiro () / / Usuário-função definida ( if (Flag_Time == false) / / Se não houver mensagens ainda (/ / .. em seguida, relatório (1 hora) Alerta ( "Divulgações importantes tempo. Feche ordens."); Flag_Time = true; / / Agora a mensagem já apareceu ) retorno; / / user-defined função Sair ) //------------------------------------------------ --------------- 4 -O servidor de tempo é calculado em horas e minutos durante a execução da função especial start () (blocos 2-3). A linha: Cur_time duplo = Cur_Hour + Cur_Min
100; / / Hora atual
representa o horário atual do servidor expressa como a variável real Cur_time. O uso de variáveis reais é conveniente em comparação operações: if (Cur_time> = Time_Cls) / / Se o tempo veio para o evento Se o tempo atual é mais do que ou igual ao valor do Time_Cls especificado pelo usuário, então o executor () user-defined função será chamada para execução. Neste exemplo, o usuário coloca-se uma função definida mensagem negociação com recomendações. Em geral, esta função pode incluir qualquer código, por exemplo, efectuar transacções, enviar e-mails, criar objetos gráficos, etc Funções de Data e Hora Função
Descrição
Dia
Ela retorna o dia atual do mês, ou seja, o dia do último mês do servidor conhecido tempo.
DayOfWeek
Ele retorna o número de índice do dia da semana (domingo-0, 1,2,3,4,5,6) da última vez conhecida servidor.
DayOfYear
Ela retorna o dia atual do ano (1 é o primeiro 1, .., 365 (6) é o dia 31 de dezembro), ou seja, o dia do ano da última vez conhecida servidor.
Hora
Ela retorna a hora actual (0,1,2, .. 23) da última vez servidor conhecido no momento do programa começar (o valor não for alterado durante a execução do programa).
Minuto
É a atual regressos minutos (0,1,2, .. 59) da última vez servidor conhecido no momento do programa começar (o valor não for alterado durante a execução do programa).
Mês
Ele retorna o número do mês em curso (janeiro-1, 2,3,4,5,6,7,8,9,10,11,12), ou seja, o número do último mês do servidor conhecido tempo.
Segundos
Ele retorna o número de segundos caducado desde o início do curso o último minuto do tempo servidor conhecido no momento do programa começar (o valor não for alterado durante a execução do programa).
TimeCurrent
Ele retorna o último servidor conhecido tempo (o tempo da última cotação próximos), expresso em segundos que o número de passaram desde a 00:00, 1 º de janeiro 1970.
TimeDay
Ela retorna o dia do mês (1 - 31) para a data especificada.
TimeDayOfWeek Ela retorna o dia da semana (0-domingo, 1,2,3,4,5,6) para a data especificada. TimeDayOfYear
Ele retorna ao dia (1 é o primeiro 1, .., 365 (6) é o dia 31 de dezembro) do ano para a data especificada.
TimeHour
Ela retorna a hora durante o período de tempo especificado.
TimeLocal
Ela devolve o PC local o tempo, expresso em número de segundos desde 00:00 expirava em 1 de janeiro de 1970.
TimeMinute
Ele retorna minutos para o período de tempo especificado.
TimeMonth
Ele retorna o número do mês, para o período de tempo especificado (janeiro-1, 2,3,4,5,6,7,8,9,10,11,12).
TimeSeconds
Ele retorna o número de segundos passados desde o início do período de tempo especificado.
TimeYear
Ele retorna ao ano para a data especificada. O valor pode ser devolvido dentro do intervalo de 1970-2037.
Ano
Ele retorna ao ano em curso, ou seja, o ano da última vez conhecida servidor.
Para obter a informações detalhadas sobre essas e outras funções, consulte a documentação em MQL4.community, emMetaQuotes Software Corp site ou no menu "Ajuda" do MetaEditor. Arquivo de Operações
Em MQL4, é possível trabalhar com arquivos que contenham um determinado conjunto de informações. Poder ser necessário escrever as informações em um arquivo ou para lê-lo a partir de um arquivo por várias razões.
Um ficheiro pode ser utilizado para fornecer informações para outro programa. Neste caso, o arquivo pode ser criado por um programa aplicativo e utilizá-las como uma informação receptor. Por exemplo, a história de uma conta comercial podem ser gravados em um arquivo na execução de uma aplicação. Este arquivo pode ser aberto por outro programa mais tarde (por exemplo, o Excel para desenhar um equilíbrio gráfico). Em outros casos, há necessidade de fornecer algumas informações, por exemplo, as notícias calendário, para uma aplicação. Um programa executável (por exemplo, uma Expert Advisor) pode ler estas informações do
arquivo previamente preparado e analisá-lo durante o cálculo para visualização gráfica das mensagens na tela ou para a tomada de decisões comerciais. Nomes de arquivos e diretórios
O nome de um ficheiro de trabalho deve ser composta de acordo com os requisitos do sistema operacional. nome de arquivo usado em qualquer MQL4 composta de duas partes: o nome do arquivo e extensão do arquiv separado por um ponto, por exemplo,News.txt. Tecnicamente, um nome do arquivo não tem qualquer relaçã com o conteúdo do ficheiro, por isso o nome do arquivo e extensão podem ser definidos voluntariamente pelo programador. Um nome do arquivo geralmente é escolhido de modo a que representa o arquivo contém as informações.
A maioria dos programas são lançados automaticamente no PC do usuário, se o arquivo for duplo clique com o botão do mouse. De acordo com a extensão do arquivo, o ambiente operacional carrega um outro programa o exibir o conteúdo do ficheiro. Portanto, você deve atribuir a extensão do arquivo considerando o programa (se necessário), que será geralmente usado para exibir o arquivo. Os mais populares tipos de arquivos (o tipo é determinado pela sua extensão) são as seguintes: -. Txt - arquivo de texto para visualização que você deve usar Bloco de Notas, Word, FrontPage, etc; -. Csv - arquivo em Excel para construir tabelas; -. Htm - arquivo para ser visualizado em um navegador, ou seja, o Internet Explorer, Netscape Navigator, etc Há três pastas (com subpastas) que pode conter ficheiros de trabalho: - Terminal_folder \ Experts \ Histórico \ atual corretor \ - História de arquivos; - Terminal_folder \ Experts \ Files \ - para uso comum; - Terminal_folder \ Tester \ Files \ - para os arquivos são usados para testes. Um grupo de trabalho arquivo pode ser guardado em uma dessas pastas ou em suas subpastas. No caso de falta de pasta disponível no momento de salvar arquivos, a pasta será criado automaticamente pelo cliente de terminal. Trabalhar com arquivos em outros diretórios não está envolvido. Modos de operações de arquivo A tecnologia de interação entre uma aplicação e um ficheiro de trabalho tem vários modos. Em geral, um arquivo pode ser aberto por vários programas ao mesmo tempo (no prazo de um PC ou vários PCs ligados à rede). Ao mesmo tempo, o ambiente operacional prevê o pleno acesso ao processo, ou seja, o direito de ler o arquivo e gravar as informações dele constantes, para um só programa. Os outros programas só pode lê-lo. exemplo, se My_text.doc já foi aberto por um editor de texto, então todos os outros programas irá receber a notificação antes de abrir o arquivo:
Fig. 146. Caixa de diálogo que aparece quando um programa tenta acesso ao processo que já foi aberto por
outro programa. A execução desta tecnologia garante que um arquivo não será modificado por dois programas diferentes simultaneamente. A fim de permitir um programa aplicável a interagir com um arquivo, você deverá abrir o arquivo que está em primeiro lugar. O modo de abrir um arquivo é especificado na FileOpen () function.
Um programa aplicativo pode abrir vários ficheiros de trabalho em uma hora. A fim de permitir que o program de diferenciar um arquivo a partir de um outro arquivo descritor está definido de acordo com todos os arquivo abertos. Arquivo descritor - número único de que o arquivo é aberto pelo programa no momento. As FileOpen () função irá retornar algum valor inteiro (este valor é geralmente atribuída ao 'manipular' variável), se um arquivo é aberto com êxito. Esse valor é o arquivo descritor. A maioria das funções que lhe forem destinados ao trabalho com arquivos suponha a utilização de um descritor de ficheiro como um dos parâmetros formais. Função FileOpen () int FileOpen (string filename, int modo, int delimitador = ';')
A função abre um arquivo para inputing e / ou saída. A função retorna um descritor de ficheiro ou -1, em caso de avaria. Os arquivos só podem ser abertos no Terminal_folder \ Experts \ Arquivos \ pasta ou na Terminal_folder \ Tester \ Arquivos \ pasta (no caso dos testes AE) ou em suas subpastas. Parâmetros: filename - nome do arquivo; modo - o modo de abertura do arquivo, ele pode ter os seguintes valores (ou suas combinações): FILE_BIN, FILE_CSV, FILE_READ, FILE_WRITE; delimitador - o separador para assinar csv-arquivos. Trata-se »,« por defeito. O modo de arquivo FILE_READ abertura implica que um arquivo será usado apenas para serem lidos por um programa. Um julgamento para abrir um arquivo neste modo podemos falhar, em caso de não disponível arquivo com o nome especificado. O modo de arquivo FILE_WRITE abertura envolve um arquivo que será usado para escrever nos por um programa. A tentar abrir um arquivo neste modo resulta na abertura de um arquivo de um comprimento zero. Mesmo se houvesse alguma informação no arquivo antes de abrir, ele será apagado. A tentar abrir um arquivo neste modo podemos falhar, no caso em que o arquivo foi aberto anteriormente por outro programa (no modo de escrita).
É autorizada a abrir um ficheiro na FILE_READ | FILE_WRITE modo. Este modo envolve a possibilidade de leitura e escrita para um arquivo. Este modo é utilizado, se você precisa adicionar algumas informações para o arquivo que já contém algumas outras informações. A função implica a obrigatoriedade da utilização de um do modos, FILE_READ ou FILE_WRITE, ou sua combinação.
O modo de arquivo FILE_BIN abertura define um trabalho de transformação como um arquivo binário uma. modo de arquivo FILE_CSV abertura define um trabalho de transformação de um texto como um arquivo. A função envolve uso obrigatório de um dos FILE_BIN ou FILE_CSV modos. A utilização simultânea de FILE_BIN e modos FILE_CSV é proibida
A função requer obrigatória combinação de FILE_READ, FILE_WRITE ou FILE_READ | FILE_WRITE modos com o FILE_BIN ou FILE_CSV modo. Por exemplo: é preciso usar a combinação de FILE_CSV | FILE_READ de ler as informações de um arquivo de texto, e é necessário utilizar o FILE_BIN | FILE_READ | FILE_WRITE combinaçã
para adicionar uma entrada para um arquivo binário. Não mais do que 32 arquivos podem ser abertos simultaneamente dentro de um módulo executável (de um programa aplicável, por exemplo, uma Expert Advisor). Os descritores dos arquivos que estão abertas no módulo não podem ser passados para outros módulos (bibliotecas). Conteúdo do arquivo entradas As informações entradas são escritas para um ficheiro sem espaços com qualquer combinação de modos. As entradas são adicionadas uma informação por um FILE_BIN quando se utiliza o modo de constituição de um arquivo. Dependendo do tipo de informação que é escrito para um arquivo (e as funções que são utilizadas para fazê-lo) os símbolos que representam a combinação final da linha ( "\ r \ n") pode ser escrita entre os grupos de entradas. A Informações entradas são separadas por separadores de arquivo (normalmente ";"), quando formando um arquivo no FILE_CSV modo, e os grupos de entradas (que compõem uma linha) são separados com a combinação dos símbolos que representam o fim da linha ( "\ r \ n ").
Arquivo separadora - símbolo especial, a entrada que está escrito em um arquivo separado para as linhas d informação. O arquivo separador é usado para separar as informações entradas CSV-a apenas em arquivos. O princípio comum para as entradas em qualquer composição arquivos é que essas entradas são adicionadas de acordo com a seqüência específica, sem espaços. Correctamente, a entrada é constituída por seqüência contínua de símbolos. Qualquer arquivo pode ser lido por qualquer programa e (dependendo das regras implemeted no mesmo) pode ser mostrado de alguma forma na tela. Por exemplo: nós temos o File_1.csv arquivo que contém: int FileOpen (string filename, int modo, int delimitador = ';') File_1.csv O arquivo será exibido em diferentes formas em diferentes editores texto:
Fig. 147. File_1 representação nos diferentes programas (File_1.csv). Neste caso, o "\ r \ n" símbolo combinação foi interpretada por cada um dos programas (Excel e Notepad), conforme o depoimento de formatação seqüência: a seqüência de símbolos é representado na próxima linha após o "\ r \ n" combinação dos símbolos, e os "\ r \ n" conjunto em si mesmo não é exibido na janela de edição. Ao mesmo tempo, o Excel é um editor mesa, de forma a "," símbolo foi interpretado pelo programa como uma das informações que colunas de separação. Chamar a atenção que os ";" símbolo não é exibido na janela do Excel. Bloco de notas é um editor de texto. As regras implementadas em que não suponha a divisão em colunas de informação, de modo a "," símbolo não foi interpretado como um processo de separação, mas ela foi interpretada como uma parte de informações, de forma que ele é exibido na tela. Os símbolos especificada ( ";" e "\ r \ n") são usados para separar as entradas em MQL4.
Fig. 148. Variedade de entradas nos ficheiros de trabalho.
A estrutura da informação escrita em diferentes tipos de ficheiros estão representados na fig. 148. A linha superior mostra o conteúdo de arquivo csv, o fundo três linhas mostram a estrutura de arquivos binários. Todo estes arquivos são compostos de acordo com as regras de uma ou outra função de escrita no arquivo. Uma entrada no arquivo csv-se a seqüência de valores corda (string tipo) que são separados com o processo de separação ou com o sinal do fim da linha. Ambos são interpretados como um sinal do fim do valor informativo ler parte na leitura informações (utilizando o padrão MQL4 função de arquivo leitura). O valor da seqüência pode ter a duração diferente e não se sabe quanta símbolos estão lá, então a leitura é realizada antes de um dos separadores está localizado.
As inscrições em dois tipos de binários de arquivos binários representam as seqüências de dados sem separadores. Essa seqüência de escrita nos é regida pelo comprimento fixo para uma base de dados de diferentes tipos: 4 bytes de dados para um dos "int", "bool", "datetime" e "cor" tipos, e 8 bytes (ou 4 bytes, dependendo dos parâmetros da função escrito) para os dados de uma "dupla" tipo.Neste caso, não há necessidade de separadores, porque a leitura é realizada pela função padrão para leitura de dados de um tipo específico com uma determinada duração. O último (um sobre o fundo da figueira. 148) arquivo binário contém os dados do tipo string que é separado com o fim da linha sinal. Arquivo ponteiro - uma posição no arquivo da leitura do valor começa a partir do próximo.
O "Arquivo ponteiro" conceito é o mesmo com "cursor" noção. O arquivo ponteiro é definido com a posição no arquivo. Como leitura longe como se passa o ponteiro está movendo uma à direita ou por várias posições. Problema 36. Leia as informações sobre a importante notícia de um arquivo e exibir os objetos gráficos sobre o preço gráfico (linhas verticais), em conformidade com o tempo de notícias publicação.
Deixe o Terminal_Folder \ Experts \ Arquivos \ pasta contém o News.csv trabalho arquivo com o seguint conteúdo:
Fig. 149. Conteúdo do ficheiro de trabalho News.csv.
Neste caso, o arquivo contém informações sobre os cinco eventos que irão acontecer em países diferentes, co um horário diferente.Cada linha contém duas entradas. A primeira entrada é o valor da seqüência que representam as informações sobre uma data hora do evento. A segunda entrada é o texto de descrição do evento. Três primeiros símbolos da segunda entrada contém o nome da moeda (o país) que o caso diz respeit
A solução consiste em duas partes. Antes de mais, temos de ler as informações do arquivo de trabalho e, em seguida, usar o valor recebido como as coordenadas dos objetos gráficos. A leitura das informações é realizado pela FileReadString () function. FileReadString () Função string FileReadString (int alça, int comprimento = 0) A função lê a linha a partir da posição actual do ficheiro. É adequado tanto para CSV e arquivos binários. A linha será lido até o conheci em separator é o arquivo de texto. O número especificado de símbolos será lida em arquivos binários. A fim de receber as informações sobre um erro que você deve ligar para o GetLastError function. Parâmetros: punho - o arquivo descritor que é devolvido pelo FileOpen () function; comprimento - o número de caracteres a serem lidos. A necessidade de tratamento da informação em notícia aparece apenas uma vez no início da negociação, portanto, neste caso, podemos usar um script para resolver o problema 36. O timetablenews.mq4 script destina-se a ler as informações do arquivo e exibir os objetos gráficos na janela do símbolo. //------------------------------------------------ -------------------/ / Timetablenews.mq4 / / O código deve ser usado apenas para fins educacionais . //------------------------------------------------ --------------- 1 -int start () / / Spec. função start () ( //------------------------------------------------ --------------- 2 -int Manilha, / / File descritor STL; / / Estilo da linha vertical string File_Name = "News.csv", / / Nome do arquivo Obj_Name, / / Nome do objeto Instr, / / Nome da moeda Um, Dois, / / 1 º e 2 º nome do instr. Texto, / / Texto do evento descrição Str_DtTm; / / Data e hora do evento (linha) datetime Dat_DtTm; / / Data e hora do evento (data) color Col; / / Cor da linha vertical //------------------------------------------------ --------------- 3 -Manipular = FileOpen (File_Name, FILE_CSV | FILE_READ, ";"); / / arquivos
abrindo if (Handle <0) / / arquivos abrindo falhar ( if (GetLastError () == 4103) / / Se o arquivo não existir, .. Alerta ( "Nenhum arquivo chamado", nome_do_ficheiro); / / .. informar comerciante else / / Se qualquer outro erro ocorre .. Alert ( "Erro ao abrir o arquivo", nome_do_ficheiro); / / .. esta mensagem PlaySound ( "Bzrrr.wav"); / / Som acompanhamento retorno; / / Sair start () ) //------------------------------------------------ --------------- 4 -while (FileIsEnding (Manilha) == false) / / Enquanto o ponteiro arquivo .. (/ / .. Não é, no final do arquivo //------------------------------------------------ --------- 5 -Str_DtTm = FileReadString (Handle); / / Data e hora do evento (data) Texto = FileReadString (Handle); / / Texto do evento descrição if (FileIsEnding (Manilha) == true) / / Arquivo ponteiro está no fim break; / / Sair leitura e desenho //------------------------------------------------ --------- 6 -Dat_DtTm = StrToTime (Str_DtTm); / / Transformação de dados tipo Instr StringSubstr = (Texto, 0, 3); / / Extrair três primeiros símbolos Um StringSubstr = (Symbol (), 0, 3); / / Extrair três primeiros símbolos Dois StringSubstr = (Symbol (), 3, 3); / / Extract segundo três símbolos STL = STYLE_DOT; / / Para todos - linha pontilhada estilo Col = DarkOrange; / / Para todos - esta cor if (Instr == Um | | Instr == Dois) / / E, para os eventos de nossa .. (/ / .. símbolo .. STL = STYLE_SOLID; / / .. este estilo .. Col = Vermelho; / / .. e essa cor de verde. linha ) //------------------------------------------------ --------- 7 -Obj_Name = "News_Line" Str_DtTm +; / / Nome do objeto ObjectCreate (Obj_Name, OBJ_VLINE, 0, Dat_DtTm, 0); / / Criar objeto .. ObjectSet (Obj_Name, OBJPROP_COLOR, Col); / / .. e sua cor, .. ObjectSet (Obj_Name, OBJPROP_STYLE, STL); / / .. e estilo .. ObjectSetText (Obj_Name, Texto, 10); / / .. e descrição ) //------------------------------------------------ --------------- 8 -FileClose (Handle); / / Fechar arquivo PlaySound ( "bulk.wav"); / / Som acompanhamento WindowRedraw (); / / Redimensionar objeto retorno; / / Sair start () ) //------------------------------------------------ --------------- 9 --
As variáveis utilizadas são abertas e descrito no bloco 2.3 da EA. Uma tentativa de abrir o arquivo, bem como análise dos resultados desta operação são executadas no bloco 3.4. As FileOpen () função é usada para abrir o arquivo: Manipular = FileOpen (File_Name, FILE_CSV | FILE_READ, ";"); / / arquivos abrindo Uma tentativa de abrir o arquivo não é bem sucedida. Ela pode fracassar, se o arquivo com o nome especificado não está disponível.Ao abrir arquivo falhar (o arquivo descritor é um número negativo) a necessária mensagem é exibida para o usuário e para a execução do início () pára de funcionar. Em caso de abertura de um processo bem sucedido, o controlo é passado para o operador do "enquanto o" ciclo (blocos 4-8). A leitura dos dados do arquivo (blocos 5-6), a transformação dos dados e sua análise (6-7 blocos) e criação do objeto gráfico com coordenadas e parâmetros correspondentes ao último ler informações
(blocos 7-8) são realizados a cada iteração. A execução do "enquanto o" ciclo continua até que o ponteiro arquivo chega ao final do arquivo, ou seja, não haverá nenhuma informação que resta para a direita do ponteiro. O FileIsEnding () função é usada para analisar a posição do ponteiro do arquivo. FileIsEnding () Função bool FileIsEnding (int alça) A função retorna TRUE se o arquivo for ponteiro no final do arquivo, caso contrário ele retorna FALSE. A fim d receber as informações sobre um erro que você deve usar o GetLastError () function. O GetLastError () irá retornar a função ERR_END_OF_FILE (4099) de erro, no caso, no final do arquivo for alcançado durante a leitura. Parâmetros: punho - arquivo descritor que é devolvido pelo FileOpen () function. A solução representada (timetablenews.mq4) implica que qualquer número de notícias pode ser gravado para arquivo News.csv.News.csv arquivo contém cinco entradas correspondentes a cinco eventos (notícias) no exemplo mencionado (fig. 149). Em geral, o número de linhas pode ser de 0 a 20-30, dependendo da quantidade de acontecimentos reais que devem ter lugar neste dia. Entradas a partir da leitura do arquivo (que é identificado pelo "manipular" variável) é realizada em blocos 5 Str_DtTm = FileReadString (Handle); / / Data e hora do evento (data) Texto = FileReadString (Handle); / / Texto do evento descrição if (FileIsEnding (Manilha) == true) / / Arquivo ponteiro está no fim break; / / Sair leitura e desenho
A primeira ea segunda linhas do bloco 5.6 realizar a leitura da informação do arquivo até o próximo separador está satisfeita. A terceira e quarta linhas realizar testes: se o arquivo ponteiro no final da linha. Se assim não for, então os objetos gráficos será formada por dois valores mais lido no ciclo. Se era inicialmente conhecido sobre o número de entradas, então, a análise que é realizada na terceira e quarta linhas não seria necessário. Neste caso, dificilmente teríamos especificar o número de iterações do ciclo (por exemplo, 5) e não iria realizar uma verificação adicional.
No entanto, o número de entradas é desconhecida, no presente caso. Ao mesmo tempo, neste exemplo cada caso é descrito com dois valores que compõem uma linha do seguinte tipo: valor, arquivo separadora, valor final da linha sinal. Neste caso, supõe-se que, se houver uma entrada (valor na primeira linha), em seguida, o outro existe um; mas se não existir uma primeira entrada, em seguida, o segundo um não existe, portanto, nã há evento, e não há necessidade de se criar um objeto gráfico. Se ambas as entradas ou um deles não existir irá mover o ponteiro para o final do arquivo (ou seja, a posição no arquivo onde não há dados para a direita d ponteiro existir) quando um tento ler-se realizado. Os testes realizados em 3-4 permite bloquear a descobrir esse fato. Se notar o controlo (duas últimas linhas do bloco 5-6) é suprimida, em seguida, needless objeto será criado enquanto o programa está sendo executado. Somente depois que a condição de "quando" ciclo termina e vai acionar o controle será passado para bloquear 8-9. Em geral, você deve considerar a lógica da representação de dados no arquivo, ordem sequencial das entradas e separadores, o número de linhas, etc quando escrevo um algoritmo para ler ficheiros. Cada circunstância exige um certo indivíduo algoritmo.
A leitura dos dados do arquivo tem o tipo string. Com o intuito de utilizar os valores recebidos para a criação d objetos gráficos que deveria transformar os dados necessários para o tipo. No bloco 6.7, o primeiro (leia na linha seguinte) é transformado para o valor "datetime" valor e maior será utilizado como de coordenadas do objeto gráfico que corresponde ao evento. Três primeiros símbolos a partir da segunda leitura string valor, são comparados com os de trigemelar primeiro e segundo símbolos em nome do símbolo. Se existir uma
coincidência, em seguida, o objeto gráfico recebe o correspondente parâmetros: linha estilo - sólidos e cor vermelho (blocos 7-8). Em outros casos, os objetos são exibidos com a laranja linha pontilhada. Você pode observar a notícia linhas na janela do símbolo como o resultado da execução do script:
Fig. 150. Objetos gráficos na janela após o símbolo timetablenews.mq4 execução. De tal forma, o script pode ser executado em qualquer janela do símbolo. Ao mesmo tempo, cada janela irá conter os sólidos linha vermelha que representam os acontecimentos que dizem respeito a este símbolo específico, e as linhas pontilhadas que representam as aberturas relativas a outros símbolos »eventos. Para apresentar o texto descrições dos objetos que você deve verificar o "Show objeto descrição" opção na janela Propriedades de segurança (F8) => comum.
O arquivo está fechado anteriormente aberto no bloco 8.9 depois que o problema seja resolvido, ou seja, todo os objetos necessários sejam criados. O arquivo deve ser fechada pelos seguintes motivos: na primeira mão para que não poupará recursos extras PC e sobre a segunda mão para permitir que os outros programas para acessar o arquivo no modo de escrever. Deveria ser considerado normal para fechar o arquivo, assim como todas as informações são lidas a partir dele (ou escrita no mesmo) e seu uso não é necessário mais. O fechamento do arquivo é realizado pela FileClose () function. FileClose () Função void FileClose (int alça) A função desempenhada fechamento de um arquivo que foi aberta anteriormente pelo FileOpen () function. Parâmetros: punho - arquivo descritor que é devolvido pelo FileOpen () function.
A fim de permitir que o profissional que praticamente timetablenews.mq4 usar o script, ele deve manter o seu método de criação de um arquivo que contém o calendário de algumas notícias período. Este tipo de arquivo pode ser criado usando qualquer editor de texto, porém, neste caso, a possibilidade de um erro se mantém (por vezes um separador pode ser erroneamente não especificada). Permite analisar uma variante do trabalho arquivo usando MQL4 criação.
Problema 37. Representam o código da EA que cria um arquivo de notícias calendário.
Em geral, uma EA pode ser destinada à criação de um ficheiro que contém qualquer número de notícias. O examinadas aquicreatefile.mq4 EA cria grupo de trabalho arquivo que contém informações sobre a não mais d cinco eventos. //------------------------------------------------ -------------------/ / Createfile.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ --------------- 1 -extern string data_1 = ""; / / 2007.05.11 10:30 extern string texto_1 = ""; / / CHF Construção licenças extern string data_2 = ""; / / 2007.05.11 12:00 extern string texto_2 = ""; / / GBP Refinance taxa de 2%, 2,5% extern string Date_3 = ""; / / 2007.05.11 13:15 extern string Text_3 = ""; / / EUR Reunião do G10 governadores dos bancos extern string Date_4 = ""; / / 2007.05.11 15:30 extern string Text_4 = ""; / / USD E.U.A. taxa de desemprego extern string Date_5 = ""; / / 2007.05.11 18:30 extern string Text_5 = ""; / / JPY A produção industrial //------------------------------------------------ --------------- 2 -int start () / / Spec. função start () ( //------------------------------------------------ --------------- 3 -int Manilha, / / File descritor Qnt_Symb; / / Número de símbolos gravados string File_Name = "News.csv"; / / Nome do Arquivo Erray string [5, 2]; / / Array para 5 notícias //------------------------------------------------ --------------- 4 -Erray [0, 0] = data_1; / / Preenche o array com os valores Erray [0, 1] = texto_1; Erray [1, 0] = data_2; Erray [1, 1] = texto_2; Erray [2, 0] = Date_3; Erray [2, 1] = Text_3; Erray [3, 0] = Date_4; Erray [3, 1] = Text_4; Erray [4, 0] = Date_5; Erray [4, 1] = Text_5; //------------------------------------------------ --------------- 5 -Manipular = FileOpen (File_Name, FILE_CSV | FILE_WRITE, ";"); / / arquivos abrindo if (Handle ==- 1) / / arquivos abrindo falhar ( Alerta ( "Um erro ao abrir o arquivo.", / / Mensagem de erro "Pode ser o arquivo é ocupado pelos outros applictiom"); PlaySound ( "Bzrrr.wav"); / / Som acompanhamento retorno; / / Exir iniciar () ) //------------------------------------------------ --------------- 6 -for (int i = 0; i <= 4; i + +) / / Ciclo de toda a panóplia ( if (StringLen (Erray [i, 0]) == 0 | | / / Se o valor da primeira ou .. StringLen (Erray [i, 1]) == 0) / / .. segunda variável não está inscrito break; / / .. em seguida, sair do ciclo Qnt_Symb = FileWrite (Handle, Erray [i, 0], Erray [i, 1]); / / Escrita para o arquivo if (Qnt_Symb <0) / / Se falhou
( Alert ( "Erro ao escrever o ficheiro", GetLastError ()); / / Mensagem PlaySound ( "Bzrrr.wav"); / / Som acompanhamento FileClose (Handle); / / Arquivo fechamento retorno; / / Sair start () ) ) //------------------------------------------------ --------------- 7 -FileClose (Handle); / / Arquivo fechamento Alerta ( "A", File_Name, "arquivo criado."); / / Mensagem PlaySound ( "Bulk.wav"); / / Som acompanhamento retorno; / / Sair start () ) //------------------------------------------------ --------------- 8 --
A informação inicial é inscrita para o programa utilizando as variáveis externas da "cadeia" tipo (blocos 1-2). variáveis são descritas em bloco e abriu 3-4. Para efectuar o processamento dos dados é conveniente para a escrita Erray [] [] string array. Cada evento (informações que caracterizam notícias) é representada por dois elementos do array na segunda dimensão. O tamanho da primeira dimensão (o número de linhas na tabela) é definido com o número de notícias, neste caso, 5. A fim de evitar que o manual de valores ao tentar entrar à EA uma demo-nos conta que você pode carregar as configurações do arquivo EA example_news.set; o arquivo de configuração a EA deve estar localizado no Terminal_folder \ Presets \ pasta. Block abertura 5.6 executa arquivos. Se a operação falhou, em seguida, iniciar o () função acaba funcionando após o utilizador ter recebido a mensagem. Se o arquivo for aberto com êxito, em seguida, o controle será passado para o "para" operador ciclo no bloco 6.7. Em geral, o número de valores de entrada, o tamanho do array Erray eo número de iterações pode ser aumentada para a quantidade necessária.
A verificação é feita a cada iteração: é um dos valores inscritos vazio. O comprimento da matriz Erray valores são calculados com este objetivo. Se um deles tem o comprimento zero, então ela é considerada como a ausência do atual e os próximos eventos, por isso a atual iteração interrupções. A escrita de valores de dois elementos do array vai até o arquivo sobre o vazio, na medida do valor do elemento é encontrado. O FileWrite () função é usada para escrever os valores para o csv-file. FileWrite () Função int FileWrite (int alça, ...)
A função é destinado para escrever as informações para um arquivo csv-, o separador entre as informações sã automaticamente incluídas no. O símbolo representa o fim da linha "\ r \ n" é acrescentado ao processo após a informação escrita. A informação é transformada a partir do numérico para o formato de texto quando outputted (ver Print () funções). A função retorna o número de símbolos escritos ou o valor negativo, caso ocorra um erro. Parâmetros: punho - arquivo descritor que é devolvido pelo FileOpen () function; ... - Os dados separados por vírgulas. Não pode ser mais de 63 parâmetros.
Os dados da "dupla", "int" tipos é automaticamente transformados para a string (os dados de "cor", "datetime e "bool" tipos é considerada como o dos números inteiros "int" e transformada para o tipo string, como bem), os dados da "cadeia" tipo de saída é como é, sem transformação. As matrizes não podem ser passados como parâmetros; arrays deve ser digitado elementwise. No exemplo considerado a informação está escrita para o ficheiro na seguinte linha:
Qnt_Symb = FileWrite (Handle, Erray [i, 0], Erray [i, 1]); / / Escrita para o arquivo
O separador (o símbolo que é utilizado como um separador é especificado no arquivo abertura função FileOpen (), neste caso, ";") será redigida após a Erray [i, 0] valor quando se escreve para o arquivo. O símbolo representa o fim da linha "\ r \ n" é automaticamente colocado no final do FileWrite do () função execução, ou seja, no final da escrita. A mesma entrada será escrito em cada iteração do próximo "para" ciclo. Cada nova entrada começa a partir da posição em que o processo de separação do último escrito é colocado. Ao mesmo tempo, os valores dos elementos próximos do 'Erray' será gravado para o arquivo (índices dos elementos são aumentadas de 1 a cada iteração).
Se o atual arquivo é escrito para o sucesso do passado para o controle é a próxima iteração. Se a escrita no arquivo falhar então o arquivo será fechado pelo FileClose () função após a mensagem é exibida para o usuári eo início () termina sua função de trabalho. Se todos os escritos para o arquivo são executados com êxito, em seguida, o controle é passado para o arquivo fecho função FileClose () no bloco 7.8, após a execução do "pa ciclo está acabado. Neste caso, a mensagem sobre a criação bem sucedida arquivo é exibido, depois que o início () função execução será finalizada. O News.csv arquivo mostrado na fig. 149 será criada após a EA está acabado execução.
Função para a realização de operações arquivo Função
Síntese Info
FileClose
O fechamento do arquivo que foi aberta anteriormente pelo FileOpen () function.
FileDelete
Excluindo do arquivo. Os arquivos só podem ser eliminados se estiverem localizados no terminal_folder \ peritos \ Arquivos (terminal_folder \ tester \ arquivos, no caso dos testes da AE) ou na pasta suas subpastas.
FileFlush
Flushing todas as informações que são deixadas no arquivo de input-output bufer para o disco rígido.
FileIsEnding
Devolve TRUE se o arquivo for ponteiro no final do arquivo, caso contrário - retorna FALSE. Se ao final do arquivo for alcançado durante a leitura do arquivo, o GetLastError () irá retornar a função ERR_END_OF_FILE (4099) de erro.
FileIsLineEnding Retorna TRUE se o arquivo ponteiro está no final da linha do CSV-arquivo. Caso contrário, retorna FALSE. FileOpen
Abre um arquivo para a introdução e / ou saída. A função retorna o descritor de arquivo aberto o arquivo de -1, em caso de falha.
FileOpenHistory Abre um arquivo na pasta atual história (termial_folder \ Histórico \ server_name) ou em suas subpastas. A função retorna o arquivo descritor -1 ou, em caso de falha. FileReadArray
A função lê o número especificado de elementos a partir do arquivo binário para a matriz. A matriz tem de ter tamanho suficiente antes de ler. A função retorna o número de praticamente lê elementos.
FileReadDouble
A função lê a número de precisão dupla com o ponto flutuante (duplo) a partir da posição atual do arquivo binário.O tamanho do número maio a seguinte: 8 bytes (duas vezes) e 4 bytes (float).
FileReadInteger A função lê a número inteiro a partir da posição atual do arquivo binário. O tamanho do número pode ser o seguinte: 1, 2 ou 4 bytes. Se o tamanho do número não é especificado, então o sistema irá tentar lê-lo como ele era o 4 byte número inteiro.
FileReadNumber Lendo o número a partir da posição atual do arquivo CSV-até que o separador seja cumprido. Ela pode ser aplicada apenas para csv-arquivos. FileReadString
A função lê a linha a partir da posição actual do ficheiro. Ela pode ser aplicada tanto para csv e arquivos binários.The line in the text file will be read until the separator is met. The specified number of symbols in the line will be read in the binary files.
FileSeek
The function moves the separator to the new position that is the displacement from the beginning, end or the current position of the file in bytes. The next reading or writing starts from the new position. If the pointer moving is performed successfully then the function will return TRUE, otherwise - FALSE.
FileSize
The function returns the size of the file in bytes.
FileTell
The function returns the shift of file pointer from the beginning of the file.
FileWrite
The function is intended to write the information to the csv-file, the separator is placed automatically between the information. The end of the line sign "\r\n" is added to the file after the writing is finished. The numeric data is transformed to the text format during the ouptputting process. The function returns the the number of written symbols or a negative value if an error occurs.
FileWriteArray
The function writes the array to the binary file.
FileWriteDouble The function writes the number with the floating point to the binary file. FileWriteInteger The function writes the integer number value in the binary file. FileWriteString
The function writes the line to the binary file from the current position. It returns the number of practically written bytes or a negative value, in case an error occurs.
To get the detailed information about these and other functions you should take a look at the documentation at MQL4.community , atMetaQuotes Software Corp. website or at the "Help" section of MetaEditor. Matrizes e Timeseries É muito importante manter em mente que a seqüência de um mesmo tipo de elementos é semper numerados a partir de zero em MQL4. Foi mencionado anteriormente que não se deve confundir o valor do índice o elemento matriz com o número de elementos no array (ver Arrays). Por exemplo, se a matriz é declarada: int Erray_OHL [3]; / / declaração de Array então isso significa que um one-dimensional array chamado Erray_OHL contém três elementos. Indexação dos elementos começam com zero, ou seja, o primeiro dos três elementos tem o índice 0 (Erray_OHL [0]), o segundo um - o índice 1 (Erray_OHL [1]), eo terceiro um - o índice 2 (Erray_OHL [ 2]). De tal forma, o índice máximo valor é inferior ao número de elementos no array por um. Neste caso, a matriz é uma tridimensionais, ou seja, nós podemos dizer sobre a quantidade de elementos na primeira dimensão: o índice máximo é número 2, porque o número de elementos no array é 3. A mesma coisa pode ser dito sobre a numeração das dimensões do array. Por exemplo, se um array é declarada da seguinte forma: int Erray_OHL [3] [8]; / / declaração de Array
isso significa que a matriz tem duas dimensões. A primeira dimensão especifica o número de linhas (3, neste exemplo), ea segunda uma especifica o número de elementos na fila (ou o número de colunas, 8, neste exemplo). A dimensão em si é muito numerados. A primeira dimensão tem o número 0, eo segundo - o número 1. Os números de dimensões são utilizadas no ArrayRange () function, por exemplo. ArrayRange () Função int ArrayRange (objeto array [], int range_index) A função retorna o número de elementos na dimensão especificada da matriz. O uso de ArrayRange () função pode ser demonstrada com a solução do seguinte problema: Problema 38. O Mas_1 matriz contém os valores da matriz 3X5. Obtenha os valores da Mas_2 array que contém os elementos cujos valores são iguais aos valores da matriz transponível. Uso arbitrário valores dos elementos. Vamos trabalhar alguns outros valores dos elementos e representam as primeiras e as matrizes que o desejado Mas_1 e Mas_2 arrays conter respectivamente:
Índices 0 0 1 1 11 2 21
1 2 12 22
2 3 13 23
3 4 14 24
Matriz inicial, Mas_1 array.
4 5 15 25
Índices 0 1 2 3 4
0 1 2 3 4 5
1 11 12 13 14 15
2 21 22 23 24 25
Transp matriz, Mas_2 array.
Fig. 151. Inicial e Matrizes Transp. Neste caso, o problema resolve-se a reescrever os valores do primeiro para o segundo uma matriz de acordo com as regras da matriz de transposição, ou seja, reescrever os valores dos elementos da primeira matriz para as fileiras de colunas da matriz desejada. A solução do problema transposição matriz está representada no matrix.mq4 especialista: //------------------------------------------------ -------------------/ / Matrix.mq4 / / O Código deve ser usado apenas para fins educacionais. //------------------------------------------------ --------------- 1 -int start () / / Especial função start () ( int Mas_1 [3] [5] = (1, 2, 3, 4, 5, 11, 12, 13, 14, 15, 21, 22, 23, 24, 25); int Mas_2 [5] [3]; int R0 = ArrayRange (Mas_1, 0); / / Número de elementos no primeiro dim. int R1 = ArrayRange (Mas_1, 1); / / Número de elementos no segundo dim. for (int i = 0; i Dois arrays são abertas no início () a função de perito. O Mas_1 array tem 3 linhas containing 5 elementos cada e os MAS_2 array tem 5 linhas contendo 3 elementos cada. A reformulação dos valores em si é feita da seguinte inscrição:
Mas_2 [[j] [i] = Mas_1 [i] [j]; / / Matriz de transposição Para se calcular o ambiente runtime (o número de iterações) de dois agentes incorporado ciclo, que deve saber os valores dos elementos de cada array. Neste exemplo os valores constantes 3, e 5 poderão ser utilizados. No entanto, este modo de conceber programa está incorreto. Em geral, um programa pode conter um código onde o gigantesco apelando para os mesmos valores é realizado em várias partes do mesmo. Um programa deve ser concebida de modo que as alterações possam ser feitas em um lugar, se necessário, e em todas as outras peças necessárias eles seriam calculados. Neste caso, apenas que abrir as inscrições e inicializar o arrays deve ser modificado, se é necessário mudar o tamanho dos arrays, portanto, não há necessidade de modificar o código das outras partes. Para determinar o número de elementos do primeiro e segundo Mas_1 dimensões da matriz são realizados os seguintes cálculos: int R0 = ArrayRange (Mas_1, 0); / / Número de elementos no primeiro dim. int R1 = ArrayRange (Mas_1, 1); / / Número de elementos no segundo dim. Note que o valor 0 é usado para a primeira dimensão e do valor 1 é utilizado para a segunda. Os valores calculados da R0 e R1 variáveis são usadas para determinar o número de iterações na "para" ciclos. Os valores recebidos do array Mas_2 elementos são exibidos na tela usando a Comment () function.
Fig. 152.Result de matrix.mq4 operação.
Funções para Trabalhar com Arrays Funções
Breve descrição
ArrayBsearch
Ela retorna o índice do primeiro elemento encontrado na primeira dimensão da matriz. Se o elemento com o valor especificado, ausente ia então a função irá retornar o índice do próximo (em valor) elemento.
ArrayCopy
Ele copia um array para outro. As matrizes devem ter o mesmo tipo. As matrizes do dobro [], int [], datetime [], cor [], e bool [] não pode ser copiado como as matrizes do mesmo tipo. Retorna o número de elementos copiados.
ArrayCopyRates
Ele copia os dados para o bar matriz bi-dimensional RateInfo do [] [6] espécie e retorna o número de bares copiado. Caso contrário, retorna -1, se a operação falhar.
ArrayCopySeries Ele copia um array timeseries para o usuário-definidas matriz e devolve o
número de elementos copiados. ArrayDimension
Ele retorna um posto de multy-dimensional array.
ArrayGetAsSeries Retorna TRUE se a matriz é organizado como uma timeseries (elementos do array estão indexados a partir do último elemento para o primeiro), caso contrário, retorna FALSE. ArrayInitialize
Estabelece um valor único para todos os elementos do array. Retorna o número de elementos inicializado.
ArrayIsSeries
Retorna TRUE se o array está marcada uma timeseries (Hora [], Open [], Close [], Máximo [], baixo [] Volume de []), caso contrário, retorna FALSE.
ArrayMaximum
Procura um elemnet com o valor máximo. A função retorna a localização da máxima elemento do array.
ArrayMinimum
Procura um elemento com o valor mínimo. A função retorna a localização do mínimo elemento da matriz.
ArrayRange
Ele retorna o número de elementos na dimensão especificada da matriz. O tamanho da dimensão é maior do que o maior índice de 1, porque os índices estão começando com zero.
ArrayResize
Aí se define uma nova dimensão da primeira dimensão da matriz. Retorna o número da matriz contém todos os elementos que após a sua classificação foi alterada, se a função executou com êxito, caso contrário, retorna -1 eo tamanho do array não for alterado.
ArraySetAsSeries Ele aponta o caminho da indexação do array. ArraySize
Ele retorna o número de elementos em um array.
ArraySort
Ela ordena arrays numéricos por sua primeira dimensão. O timeseries arrays não podem ser ordenados.
Funções de acesso Timeseries Funções
Síntese Info
Ibars
Ele retorna o número de barras do gráfico especificado.
iBarShift
É uma barra de buscas por hora. A função retorna ao deslocamento do bar que possui o período de tempo especificado. Se a barra para o período de tempo especificado está ausente ( "buraco" na história), então a função retorna -1, dependendo do parâmetro exato ou o deslocamento do bar mais próximo.
iClose
A função retorna o preço de fechar o bar especificada com a mudança a partir do parâmetro correspondente gráfico (sigla, calendário). Ele retorna 0, se ocorrer um erro.
iHigh
Ela retorna o preço máximo do valor especificado com a barra de deslocamento correspondente ao parâmetro do gráfico (sigla, calendário). Ele retorna 0, se ocorrer um erro.
iHighest
Ela retorna o índice do valor máximo encontrado (mudança relativamente ao actual bar).
iLow
Ele retorna ao preço mínimo do valor especificado com a barra de deslocamento correspondente ao parâmetro do gráfico (sigla, calendário). Ele retorna 0, se ocorrer um erro.
iLowest
Ela retorna o índice do valor mínimo encontrado (mudança relativamente ao actual bar).
iOpen
Ela devolve o valor do preço abrir o bar especificada com a mudança a partir do parâmetro correspondente gráfico(sigla, calendário). Ele retorna 0, se ocorrer um erro.
iTime
Ele retorna tempo de abertura da barra especificada com a mudança a partir do parâmetro correspondente gráfico(sigla, calendário). Ele retorna 0, se ocorrer um erro.
iVolume
Ele retorna carrapato valor da barra de volume específico com a mudança a partir do parâmetro correspondente gráfico (sigla, calendário). Ele retorna 0, se ocorrer um erro.
Para obter a informações detalhadas sobre essas e outras funções, consultar a documentação em MQL4.community, emMetaQuotes Software Corp site ou no menu "Ajuda" do MetaEditor. Funções Matematicas Matemática e trigonometria estão incluídos no MQL4. Não existem dificuldades em utilizar a maioria deles. Por exemplo, o MathMax () função retorna o valor máximo dos dois valores especificados na lista dos parâmetros da função. A utilização de outras funções determinadas reivindicações atenção e consideração. Vamos examinar uma das funções deste tipo. MathFloor () Função MathFloor dupla (double x) A função retorna um valor numérico que corresponde ao maior inteiro que é menor ou igual a x. Parâmetros: x - valor numérico. Observe que um valor devolvido pela função é o número real (tipo duplo), ao mesmo tempo, está escrito que a função retorna um inteiro. É importante ter em conta que a função retorna um número real que tem todas as posições iguais a zero depois da vírgula. Por exemplo, o MathFloor () function pode retornar 37,0 (número positivo do tipo duplo) ou -4,0 (número negativo do tipo duplo). A descrição diz também que a função retorna o máximo possível de números que é inferior a um determinado um. Por exemplo, se o valor do parâmetro é dado x 13.5, em seguida, o número máximo que tem zeros depois da vírgula é 13,0. -13,5 Negativo ou se o valor for especificado na função e, em seguida, o máximo é igual ao menor inteiro -14,0. De tal maneira, a modificação do sinal do passado para o valor da função leva a resultados diferentes, ou seja, a valores recebidos não são iguais entre si em magnitude absoluta. Utilização dessas funções é muito conveniente, em alguns casos. Vamos analisar o fragmento de cálculo do montante lotes para novas encomendas, como exemplo: Percentual int = 30; / /% da margem livre Livre AccountFreeMargin duplo = (); / / Livre margem One_Lot duplo = MarketInfo (Symb, MODE_MARGINREQUIRED); / / 1 lote preço Etapa dupla MarketInfo = (Symb, MODE_LOTSTEP); / / Tamanho passo mudou Lots_New duplo = MathFloor (Livre * Porcentagem Etapa;
100
One_Lot
Passo) *
O valor da Porcentagem parâmetro for definido pelo usuário. Neste caso, o usuário especificado de 30% da margem livre para novas encomendas. De acordo com as regras que são especificadas pelo tratamento center, calculou corretamente o valor dos lotes deve ser divisível pelo escalão mínimo de
lotes mudando tamanho (Step). Os valores da margem livre (gratuito) e 1 lote preço (One_Lot) são necessários para o cálculo também. Vamos examinar a lógica do raciocínio do programador que compilou a expressão para calcular a quantidade necessária de lotes Lots_New para novas encomendas. Vamos utilizar os valores numéricos das variáveis para melhor visualização. Deixe Livre = 5000,0, One_Lot = 1360,0 (Na maioria dos centros que tratam o custo do lote 1 do par cambial seja proporcional ao custo do símbolo), Step = 0,1. Neste caso, a expressão para calcular Lots_New pode ser escrita como segue: Lots_New = MathFloor (5000,0 * 30/100/1360.0/0.1) * 0,1; A 5000,0 * 30/100 expressão é o valor das verbas estabelecidas para o usuário abrir uma nova ordem. Neste caso, o preço de uma nova ordem pode atingir o 1500.0. Gastar dinheiro todos esses você pode abrir uma nova ordem que tem a 1500,0 / 1360,0 = 1.102941 quantidade de lotes. No entanto, o centro irá lidar não aceitar o fim com essa quantidade de lotes, porque o mínimo Step = 0,1 (na maioria dos centros que tratam). Para calcular a quantidade desejada de lotes que você deve jogar fora todos os "inúteis" dígitos na parte decimal e substituí-los com zeros. Para fazer isso você pode usar a função matemática considerados: Lots_New = MathFloor (1.102941/0.1) * 0,1; O valor calculado do MathFloor (1.102941/0.1) serão 11,0 e calculado o valor da variável será Lots_New lotes 1-1. Este valor atende aos requisitos de que tratam o centro e, por isso, pode ser utilizado como o montante declarado de lotes em novas encomendas.
Funções Matematicas Function MathAbs
Síntese Info A função retorna o valor absoluto (em magnitude absoluta) de um determinado número.
MathArccos A função retorna o valor de x arccosine no intervalo de 0 a π radianos. Se x é menor do que -1 ou maior que 1, a função retorna NaN (valor indefinido). MathArcsin A função retorna arcsine no valor de x-π / 2 a π / 2 radianos gama. Se x i inferior a -1 ou maior que 1, a função retorna NaN (valor indefinido). MathArctan A função retorna arco tangente de x. Se x é igual a 0, a função retorna 0. MathArctan retorna o valor no-π / 2 a π / 2 radianos gama. MathCeil
A função retorna o valor numérico que é o maior inteiro menor ou igual a x.
MathCos
A função retorna o seno do ângulo.
MathExp
A função retorna o valor de e para o poder de d. Na overflow, a função retorna INF (infinito), e ele retorna 0 no underflow.
MathFloor
A função retorna o valor numérico representando o maior inteiro que é menor ou igual a x.
MathLog
A função retorna o logarítmo natural de x caso seja bem sucedido. Se x for negativo, esta função retorna NaN (valor indefinido). Se x for 0, ele retorna INF (infinito).
MathMax
A função retorna o valor máximo dos dois valores numéricos.
MathMin
A função retorna o valor mínimo de dois valores numéricos.
MathMod
A função retorna o de ponto flutuante restante da divisão de dois números. O MathMod calcula a função de ponto flutuante f resto de x / y tal que x + y = f * i, onde i é um inteiro, f tem o mesmo sinal que x, e o valor absoluto de f é menor que o valor absoluto de y.
MathPow
Retorna o valor da base expressão elevada à potência especificada (valor expoente).
MathRand
A função retorna um inteiro pseudorandom dentro do intervalo de 0 a 32767. O MathSrand função deve ser usada para a semente pseudorandom-gerador de números antes de chamar MathRand.
MathRound A função retorna valor arredondado para o número inteiro mais próximo do valor numérico especificado. MathSin
A função retorna o seno do ângulo especificado.
MathSqrt
A função retorna a raiz quadrada de x. Se x for negativo, retorna MathSqrt indeterminado (o mesmo que uma pacata NaN).
MathSrand A função define o ponto de partida para gerar uma série de pseudorandom inteiros. MathTan
MathTan retorna a tangente de x. Se x é maior ou igual a 263, ou igual ou inferior a 263, uma perda de importância no resultado ocorre. Neste caso, a função retorna um valor indeterminado.
GlobalVariable Funções Muitas funções para trabalhar com variáveis globais do cliente terminal estão descritos no GlobalVariables seção. Na seção anterior, também mencionou que tinha um programa corretamente projetado para apagar suas variáveis globais quando ele está sendo executado. N º GVs o cliente deve permanecer no terminal todos os programas após ter sido abandonado. Um ou mais GVs pode permanecer no terminal quando depurar programas usando as variáveis globais do cliente terminal. Neste caso, um programador deve excluir GVs manualmente antes do próximo lançamento de um programa depurado. Para automatizar esse processo, você pode criar um script que apaga todas as variáveis globais do cliente terminal. GlobalVariablesDeleteAll () Função int GlobalVariablesDeleteAll (string prefix_name = NULL) Elimina variáveis globais. Se não for especificado um prefixo para o nome, então todas as variáveis globais disponíveis serão deletados. Caso contrário, ele irá excluir apenas os nomes das variáveis que começam com o prefixo especificado. A função retorna o número de variáveis excluídas. Parâmetros: prefix_name - prefixo para os nomes das variáveis globais, devem ser suprimidos. Abaixo está um exemplo de um script simples, deleteall.mq4, que elimina todas as variáveis globais do cliente terminal. //------------------------------------------------ -------------------/ / Deleteall.mq4 / / O programa é destinado a ser utilizado como um exemplo em MQL4 Tutorial . //------------------------------------------------ -------------------int start () / / Especial início () função ( GlobalVariablesDeleteAll (); / / Exclusão de todas GVs
PlaySound ( "W2.wav"); / / Som retorno; / / Sair ) //------------------------------------------------ -------------------O script pode ser iniciado somente se nenhum programa usando GVs está sendo executado no cliente de terminal. Caso contrário, executando o script pode quebrar a lógica dos outros executados programas que podem resultar em acções descontroladas. Após a execução do script na janela de variáveis globais (F3) do cliente terminal ficará vazia:
Fig. 153. Aparecimento de Variáveis globais na janela do terminal após o cliente deleteall.mq4 script é executado.
Funções para Trabalhar com Variáveis globais Função
Síntese Info
GlobalVariableCheck
Ele retorna True se um GV está disponível. Caso contrário, retorna FALSE.
GlobalVariableDel
Apaga uma variável global. Retorna TRUE se uma variável foi eliminado com sucesso. Caso contrário, retorna FALSE.
GlobalVariableGet
Ele retorna um valor de uma variável global, ou 0, se ocorrer um erro.
GlobalVariableName
A função retorna o nome de uma variável global, de acordo com seu número de índice na lista as variáveis globais.
GlobalVariableSet
Estabelece um novo valor para uma variável global. O sistema irá criar uma nova variável, se não houver nenhuma já criada. A hora do último acesso será devolvido, se a função foi executada com sucesso. Caso contrário, ele retorna 0.
GlobalVariableSetOnCondition Estabelece um novo valor para uma variável global, se o seu valor actual é igual ao valor do terceiro parâmetro check_value. A função irá gerar o ERR_GLOBAL_VARIABLE_NOT_FOUND (4058) de erro e retornará false se uma variável não existe. Retorna TRUE se a função tenha executado com sucesso. Caso contrário, retorna FALSE. GlobalVariablesDeleteAll
Elimina variáveis globais. Se o prefixo para o nome não é especificado, então todas as variáveis globais serão deletados. Caso contrário, ele elimina apenas os dos nomes começando com o prefixo especificado. A função retorna o número de variáveis
excluídas. GlobalVariablesTotal
A função retorna o número total de variáveis globais.
Custom Indicadores As funções dos indicadores personalizados permitem-lhe ajustar as definições necessárias para fazer uma conveniente representação de um indicador. Vamos considerar alguns desses produtos (ver também a Criação de Indicadores Custom). SetIndexBuffer () Função bool SetIndexBuffer (int índice, a dupla array []) A funcionar array-junta uma variável que foi declarada a nível global com um indicador tampão personalizado predestinada. O montante dos amortecedores, que são necessárias para o indicador é definido utilizando a computação IndicatorBuffers () função e não pode ultrapassar 8. Em caso de ligação com êxito, TRUE é retornado, caso contrário - FALSO. A fim de obter as informações detalhadas sobre um erro que você deve ligar para o GetLastError () function. Parâmetros: Índice - Índice número de uma linha (de 0 a 7 valores são possíveis); array [] - um nome do array que está conectado com um cálculo tampão. SetIndexStyle () Função void SetIndexStyle (int index, int tipo, int style = VAZIA, int width = VAZIA, color = CLR_NONE CLR) A função define um novo modelo, estilo, a largura ea cor de uma determinada linha do indicador. Parâmetros: Índice - Índice número de uma linha (de 0 a 7 valores são possíveis); Tipo - indicador linha do tipo. Pode ser um dos listados os tipos de linhas indicadoras (ver Estilos de Linhas Exibindo Indicator); estilo - estilo da linha. Usado para as linhas 1 pixel de largura. Pode ser um dos estilos especificados na linha de Estilos Indicador Linhas Exibindo apêndice. O VAZIO valor especifica que o estilo não será alterada; largura - largura da linha; valores admissíveis são - 1,2,3,4,5; VAZIA o valor especifica que a largura não será alterada; CLR - linha de cores. O valor vazio CLR_NONE significa que a cor não será alterada.
SetIndexLabel () Função void SetIndexLabel (int index, string texto) A função permite definir um indicador linha nome a ser exibido na DataWindow e no pop-up de ponta. Parâmetros: Índice - Índice número de uma linha (de 0 a 7 valores são possíveis);
texto - um texto descrevendo um indicador linha. NULL significa que o valor de uma linha não é mostrada na DataWindow. A exemplo do indicador simples mostrando Alto linha (indicatorstyle.mq4), que usa as funções descritas acima: //------------------------------------------------ -------------------/ / Indicatorstyle.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ --------------- 1 -# propriedade indicator_chart_window / / Indic. é desenhada na janela principal # propriedade indicator_buffers 1 / / Quantidade de buffers # propriedade indicator_color1 Azul / / Cor da primeira linha dupla Buf_0 []; / / Indicador array abertura //------------------------------------------------ --------------- 2 -int init () / / Especial função init () ( SetIndexBuffer (0, Buf_0); / / Atribuindo a matriz para o buffer SetIndexStyle (0, DRAW_LINE, STYLE_SOLID, 2); / / Linha de estilo SetIndexLabel (0, "High Line"); retorno; / / Sair spec. função init () ) //------------------------------------------------ --------------- 3 -int start () / / Especial função start () ( int i, / / Bar índice Counted_bars; / / Valor calculado de barras Counted_bars = IndicatorCounted (); / / Valor calculado de barras i = Barras - Counted_bars - 1; / / Índice da primeira inúmero while (i> = 0) / / Ciclo de barras para o inúmero ( Buf_0 [i] = Máximo [i]; / / 0 de valor sobre o tampão iésimo bar i -; / / Índice de cálculo para o próximo bar ) retorno; / / Sair spec. função start () ) //------------------------------------------------ --------------- 4 -1.2 O bloco contém as definições gerais de um indicador. Especifica-se com o comando # imóvel que o indicador deve ser apresentado na janela principal, o indicador usa um tampão, a cor da linha é o indicador azul. Um buffer array é aberto em bloco 1.2, também. As funções acima especificadas são utilizados no bloco 2.3. A entrada: SetIndexBuffer (0, Buf_0); / / Atribuindo a matriz para o buffer atribui o buffer Buf_0 nomeado para o buffer com o índice 0. A entrada: SetIndexStyle (0, DRAW_LINE, STYLE_SOLID, 2); / / Linha de estilo determina o estilo da linha que tem o indicador índice 0. O DRAW_LINE constante indica que a linha mostrada é simples, o STYLE_SOLID constante indica que a linha é sólido, e 2 especifica a largura da linha. A entrada: SetIndexLabel (0, "High Line");
atribui o nome ao indicador linha com o índice 0. O nome especificado pode ser visto na DataWindow e na ponta do balão na janela do instrumento financeiro (fig. 810_3). Os nomes das linhas é conveniente, se a janela contém uma série de linhas indicadoras; às vezes é a única forma de distinguir uma linha de outra. O bloco 3.4 realiza o cálculo dos valores do indicador panóplia de elementos para a linha que é usada para exibir os valores máximos de bares (a seqüência de matrizes indicador cálculo é descrito na Criação de Indicadores Custom seção em detalhes). Se o indicador é exibido em uma janela separada, em seguida, os níveis horizontal pode ser exibida nesta janela também. SetLevelValue () Função void SetLevelValue (int nível, valor duplo) Estabelece o valor especificado para o nível horizontal do indicador que é exibido em uma janela separada. Parâmetros: nível - nível série (0-31). valor - um valor para o nível especificado. A utilização dos níveis horizontal pode ser muito conveniente, se você precisar visualmente para detectar se o indicador linha está acima ou abaixo dos valores especificados. O simples indicador que calcula a diferença entre o máximo eo preço mínimo da barra é mostrada abaixo. O mercado eventos são interessantes para o utilizador (timidamente neste exemplo) se o indicador está acima da linha de 0,001 bar ou abaixo da barra de -0,001. A exemplo do indicador que mostra a diferença entre a Alta ea Baixa (linelevel.mq4): //------------------------------------------------ -------------------/ / Linelevel.mq4 / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ --------------- 1 -# propriedade indicator_separate_window / / Indic. é tirado em um sep. Janela # propriedade indicator_buffers 1 / / Quantidade de buffers # propriedade indicator_color1 Vermelho / / Cor da linha dupla Buf_0 []; / / Indicador array abertura //------------------------------------------------ --------------- 2 -int init () / / Especial init () função ( SetIndexBuffer (0, Buf_0); / / Atribuindo a matriz para o buffer SetIndexStyle (0, DRAW_LINE, STYLE_SOLID, 2); / / Linha de estilo SetIndexLabel (0, "High / Low Diferença"); SetLevelValue (0, 0,0010); / / A linha horizontal nível está definido SetLevelValue (1, - 0,0010); / / Outro nível está definido retorno; / / Sair do spec.init () função ) //------------------------------------------------ --------------- 3 -int start () / / Especial início () função ( int i, / / Bar índice Counted_bars; / / Valor calculado de barras Counted_bars = IndicatorCounted (); / / Valor calculado de barras i = Barras - Counted_bars - 1; / / Índice da primeira inúmero
while (i> = 0) / / Ciclo de barras para o inúmero ( Buf_0 [i] = Máximo [i] - Baixo [i]; / / 0 tampão sobre o valor da barra i if (Open [i]> Fechar [i]) / / se a vela é negra .. Buf_0 [i] =- Buf_0 [i]; / / .. então reverter o valor i -; / / Índice de cálculo para o próximo bar ) retorno; / / Sair do spec.start () função ) //------------------------------------------------ --------------- 4 -A função é considerada utilizado em bloco no indicador 2.3. Neste caso, estão previstos dois níveis horizontal. O primeiro valor na lista de parâmetros é o número do nível horizontal, o segundo é o valor do nível especificado: SetLevelValue (0, 0,0010); / / O nível do horiz. linha está definido SetLevelValue (1, - 0,0010); / / Outro nível está definido Os parâmetros de indicatorstyle.mq4 e linelevel.mq4 indicadores estabelecidos de tal forma são exibidas na janela do instrumento financeiro e no DataWindow.
Fig. 154. Exibindo indicadores nas diferentes configurações do windows o cliente terminal. Duas janelas - o DataWindow e do instrumento financeiro são mostrados na janela fig. 154. Você pode ver a entrada contendo "High Line" do texto e 1,3641, no valor DataWindow. O mesmo inscrições são mostrados na parte inferior da entrada de pop-up de ponta. A referida entrada é exibida na DataWindow todo o tempo corre o indicador, o nome da linha em que não for alterado, mas o valor na parte direita da a entrada depende da posição do cursor na janela do instrumento financeiro. O nome da linha que é mostrado na janela pop-up ponta corresponde ao indicador linha o cursor está apontada. O subwindow do indicador linelevel.mq4 contém as linhas horizontais que são colocados de acordo com o usuário-os valores definidos. Se você mover o cursor sobre a linha vermelha indicador, em seguida, o nome desta linha, neste caso o "Diferença entre a Alta ea Baixa", pode ser visto na janela pop-up ponta, o valor no ponto do cursor pode ser visto ao direita do nome. Funções de ajuste personalizado indicadores
Função
Síntese Info
IndicatorBuffers
Ela trata da memória de buffers que são utilizados para calcular um indicador personalizado. A quantidade de buffers não pode exceder 8 e deve ser inferior ao valor especificado na propriedade indicator_buffers # comando. Se o indicador personalizado precisa de mais buffers para o cálculo, você deverá usar esta função para especificar o número inteiro de buffers.
IndicatorCounted
A função retorna uma quantidade de bares que não foram alterados desde o último indicador lançamento. A maioria dos bares não necessitem recalculo.
IndicatorDigits
O documento define a precisão (o número de símbolos depois da vírgula) para a visualização do indicador valores.
IndicatorShortName Aí se define uma "curta" nome de um indicador a ser exibida no indicador da subwindow e na DataWindow. SetIndexArrow
Estabelece um símbolo de uma linha que tem o indicador DRAW_ARROW estilo.
SetIndexBuffer
Junta-lhe um array variável que seja declarada a nível global com um tampão de um determinado indicador personalizado.
SetIndexDrawBegin
O documento define um número de índice a partir do início de dados para o bar a sorteio de um determinado indicador deve começar.
SetIndexEmptyValue Estabelece um valor vazio para o indicador linha. Vazio valores não são tiradas e não são mostrados no DataWindow. SetIndexLabel
O documento define um nome de um indicador de linha para exibir as informações na DataWindow e na ponta do balão.
SetIndexShift
O documento define uma mudança para um indicador relativamente a linha do gráfico começa. O valor positivo irá deslocar uma linha para a direita, o valor negativo - para a esquerda. Ou seja, o valor calculado sobre o actual barra é desenhada com o especificado, em relação ao actual barra de deslocamento.
SetIndexStyle
Estabelece um novo tipo, estilo, a largura ea cor de um determinado indicador linha (ver Estilos de Linhas Exibindo Indicator).
SetLevelStyle
Estabelece um novo estilo, a cor ea largura horizontal para os níveis de um indicador que é exibido em uma janela separada (ver Estilos de Linhas Exibindo Indicator).
SetLevelValue
Estabelece um valor especificado para o nível horizontal de um indicador que é exibido em uma janela separada.
Comércio Funções Todas as trocas de funções podem ser divididas em dois grupos - funções que fazem comércio ordens e funções que retornam alguma ordem caracterizando valores. MQL4 tem apenas cinco funções que fazem comércio e enviar encomendas para um servidor: § § § § §
OrderSend () - para abertura do mercado e colocar ordem pendente; OrderClose () - para fechamento do mercado; OrderCloseBy () - fecho de mercado oposta ordens; OrderDelete () - suprimindo encomendas pendentes; OrderModify () - modificando todos os tipos de ordens.
A fim de utilizar funções listadas acima está descrito na Programação de Operações de Comércio na seção detalhes. Todas as outras funções que não fazem comércio encomendas, mas a sua utilização é muitas vezes necessária. Por exemplo, algumas vezes é necessário fechar algumas ordens de prioridade na seqüência. Para fazer isso, você deve analisar as características de cada ordem no programa, a saber - tipo de ordem, os lotes montante, ordens de stop-localização, etc Vamos analisar algumas funções que permitem a obtenção de informações sobre uma encomenda. OrderTotal () Função int
OrdersTotal ()
A função retorna o número total de encomendas abertos e pendentes. OrderTakeProfit () Função OrderTakeProfit duplo () A função retorna o valor do preço declarado quando a margem de lucro (ter lucro) da actual ordem selecionada é atingida. A ordem tem de ser previamente selecionados através de OrderSelect () function. OrderProfit () Função OrderProfit duplo () Retorna o valor do lucro líquido (sem considerar o swaps e comissões) da ordem selecionada. É o lucro não realizado para a abertura ordena lucro fixo e fechado para os despachos. A ordem tem de ser previamente selecionados através de OrderSelect () function. OrderLots () Função OrderLots duplo () Retorna a quantidade de lotes de uma forma seleccionada. A ordem tem de ser previamente selecionados através de OrderSelect () function. O fragmento de programa que calcula o preço declarado fechar TakeProfit, fim lucrativo e da quantidade de lotes é mostrado abaixo: for (int i = 0; i
funções executadas depois que vai retornar os valores que correspondem com as características selecionadas fim. A correta avaliação de uma ou de outra forma pelas características do programador não é pouco significativo. Por exemplo, ao fim de resolver o problema fechando seqüência, você deve definir um critério de cálculo que forma devem ser encerrados mais cedo e que um - posteriormente. Agora, vamos dar uma olhada para a tarefa simples.
Problema 40. Comprar duas ordens estão atualmente abertos em um único símbolo. O primeiro deles é aberto ao preço de 1,2000 a 0,5 lote, o segundo é aberto ao preço de 1,3000 em 1 lote. O preço atual é 1,3008. O critério para o comércio Comprar ordens encerramento provocou. É necessário fazer uma decisão correcta, ou seja, para decidir qual deveria ser vista como o primeiro fechados e que uma tal como o segundo. Obviamente, o lucro a partir da primeira ordem faz 108 pontos, enquanto que a segunda é de 8 pontos. Embora à primeira vista, é aberta em uma menor quantidade de lotes, que tem o maior lucro do que a um segundo, ou seja, o lucro da primeira encomenda é de US $ 540 e os lucros do segundo despacho é de R $ 80. Fechando o primeiro fim de maio parece ser preferível, à primeira vista, porque tem maior lucro. No entanto, é um misthought. É necessário analisar a eventual hipótese de fazer uma decisão correta. A ordem sequencial não iria fechar questão, se os preços não eram conhecidos de alteração durante o período de ordens de fechamento. No entanto, o preço pode mudar durante a execução da instrução para fechar uma das ordens. Portanto, a fim de que possam trazer mais prejuízos, em um cenário negativo, deverá ser fechado em primeiro lugar. Se o preço afunda um ponto para baixo, o lucro da primeira ordem vai diminuir em US $ 5, enquanto que a do segundo um vai fazer por $ 10. Obviamente, a segunda ordem traria mais prejuízos, portanto, deve ser fechado em primeiro lugar. De tal forma, o montante dos lotes tem o significado dominante ao decidir sobre fechamento ordem sequencial. Rentáveis cenário não pode ser considerado aqui, porque desenvolve com as trocas comerciais nos critérios do programa e, desta vez, o critério de fecho Comprar ordens tem desencadeado. Você deve considerar as características outra forma, se for necessário escolher entre duas ordens com a mesma quantidade de lotes. Por exemplo, você pode considerar a distância entre o preço atual e StopLoss o valor de cada encomenda. Ao mesmo tempo, você deve analisar qual das ordens traria mais prejuízos, em caso de movimento rápido dos preços. A resposta é óbvia, bem como: a um (a partir de ambas as ordens que são abertos na mesma quantidade de lotes) que tem o seu nível mais StopLoss a partir do preço atual. Assim você pode analisar as prioridades e todos os outros parâmetros de encomendas e compilar a lista de prioridade orientada para os critérios a considerar quando se fazem com a decisão sobre o encerramento ordens. Não é difícil identificar os critérios que devem ser desconsideradas. É aberto preço (e os respectivos lucros do fim), por exemplo. A quantidade de dinheiro que o profissional tenha, neste momento, é mostrada na coluna da Eqüidade cliente terminal. A origem deste valor não é importante em que, nem ela é uma consequência da perda de um minério despachos mais, nem é resultado de um lucro. Todas as características necessárias de uma ordem podem ser recebidas utilizando o correspondente comércio funções: Comércio Funções
Função
Síntese Info
Erros de execução
Qualquer operação comercial (OrderSend, OrderClose, OrderCloseBy, OrderDelete ou OrderModifyfunções) pode terminar sem sucesso por um escore de motivos e nem devolver o bilhete número negativo ou FALSE. Você pode descobrir o motivo da falha, usando o GetLastError. Cada erro deve ser processado em sua própria maneira. A tabela abaixo contém as recomendações gerais.
OrderClose
Encerra posição. Retorna TRUE, se a função foi finalizada com sucesso. Ele retorna FALSO, se a função não consegue terminar.
OrderCloseBy
Encerra uma posição aberta com os outros que se abriu na direção oposta para o mesmo símbolo. Retorna TRUE. se a função foi finalizada com sucesso. Ele retorna FALSO, se a função não consegue terminar.
OrderClosePrice
Ela retorna o próximo preço de ordem seleccionada.
OrderCloseTime
Ela retorna a tempo para o fechamento da ordem selecionada.
OrderComment
Ela retorna o comentário de ordem seleccionada.
OrderCommission
Ela devolve o valor da comissão calculada ordem seleccionada.
OrderDelete
Elimina o anteriormente colocado na pendência judicial. Retorna TRUE, se a função foi finalizada com sucesso. Ele retorna FALSO, se a função não consegue terminar.
OrderExpiration
Ele retorna à data do termo da ordem pendente seleccionada.
OrderLots
Ela retorna a quantidade de lotes de ordem seleccionada.
OrderMagicNumber Ela retorna a identificação ( "mágico") o número de ordem selecionada. OrderModify
Ele modifica os parâmetros das ordens anteriormente abertos e encomendas pendentes. Retorna TRUE se a função foi finalizada com sucesso. Ele retorna FALSO, se a função não consegue terminar.
OrderOpenPrice
Ela retorna a abrir preço da ordem seleccionada.
OrderOpenTime
Ela retorna a tempo de abertura da ordem selecionada.
OrderPrint
Ele entra na ordem informações para a revista.
OrderProfit
Ela devolve o lucro líquido (sem considerar o swaps e comissões) da ordem selecionada. É o lucro não realizado para a abertura ordena lucro fixo e fechado para os despachos.
OrderSelect
A função escolhe a fim de colaborar com posteriormente. Retorna TRUE se a função foi finalizada com sucesso. Ele retorna FALSO, se a função não consegue terminar.
OrderSend
A principal função de abertura ordena e colocar encomendas pendentes. Ele retorna o número do bilhete que foi designado para o fim do comércio por servidor, ou -1, em caso de falta para terminar a operação.
OrdersHistoryTotal Ele retorna o número de postos fechados e suprimiu ordens na história da conta corrente, carregado para o cliente de terminal. OrderStopLoss
Ele retorna a posição do preço perto quando ele atinge o nível perda (stop loss), da ordem selecionada atualmente.
OrdersTotal
Ela devolve o número total de encomendas pendentes e aberta.
OrderSwap
Ela devolve o valor do swap atualmente selecionado fim.
OrderSymbol
Ela retorna o nome para o símbolo selecionado atualmente fim.
OrderTakeProfit
Ela retorna o preço perto quando ele atinge a margem de lucro (ter lucro) da ordem selecionada atualmente.
OrderTicket
Ele retorna o número de bilhete da ordem selecionada atualmente.
OrderType
Ela retorna o tipo de operação a fim presentemente seleccionado.
Criação de um programa normal Como regra, depois de ter codificado uma série de programas na MQL4 simples aplicação, um programador vai para um projeto mais complexo - a criação de um programa prático para uso prático. Simples programas, em alguns casos, não satisfazem as necessidades de um programador de negociação, pelo menos, duas razões: 1. A limitação funcional dos programas simples não lhes permite fornecer um comerciante com todas as informações e ferramentas de gestão comercial, o que não torna a utilização deste tipo de programas eficientes o suficiente. 2. O código de imperfeição simples programas torna difícil seu posterior desenvolvimento de serviços que visem expandida. Nesta seção, nós representamos uma das alternativas possíveis de realizar uma negociação Expert Advisor que pode ser considerada como uma base para seus próprios projetos. §
Estrutura de um programa normal A disponibilidade de muitas funções definidas por usuários em um programa permite-lhe para criar algoritmos potente e flexível para processar a informação. Compiler directiva # include permite que você use a sua função (uma vez por escrito e depurado) em outros programas. Dessa maneira, você pode criar suas próprias bibliotecas ou de utilização de códigofonte aberto evolução de outros programadores.
§
Ordem Contabilidade A seção considera um exemplo de user-defined função Terminal () que é realizado em separado incluir um arquivo com a extensão. Mqh. Esses arquivos estão ligadas ao programa durante a compilação código usando a directiva # include.
§
Função dados Um exemplo de utilização mais de uma função definida que ajuda a organizar a saída do texto informações sobre o atual trabalho de um EA. Esta função lhe permite abandonar a função Comment () para apresentar o texto na janela do gráfico.A função é percebido como um indicador em um gráfico separado subwindow da janela.
§
Evento Função Monitoramento de Um comerciante não pode detectar todos os eventos durante a negociação. O programa gravado em MQL4 lhe permite detectar as mudanças nas condições comerciais ou quaisquer situações. user-defined função Eventos () conecta-se à EA utilizando a directiva # include e aplica as chamadas para incluir outra função, Inform ().
§
Volume definindo função O cálculo do volume de uma posição a ser aberto é uma das tarefas dos equity / gestão de risco. O usuário-função definida Lot () é um pequeno exemplo utilizado para esses fins.
§
Negociação critérios para definir função A parte mais importante de qualquer negociação é o tempo de detecção de entrar no mercado e que o encerramento de uma posição. A criação das regras de negociação ou critérios é o núcleo da qualquer Expert Advisor. User-defined função Critério () está ligado com a directiva # include. Mostra como uma EA pode decidir com base nos valores dos indicadores sobre se a actual situação está em conformidade com um ou outro critério.
§
Comércio Funções A actual situação tem sido analisadas com a função Critério (), então agora temos de fazer trades: abrir, fechar, alterar ou apagar uma ordem pendente. Todas estas operações podem ser colocados em separado user-defined funções: Comércio (), Close_All () e Open_Ord (). As ordens stop são movidos proteger usando a função definida Tral_Stop de usuário ().
§
Erro ao processar função Erro de controle é parte integrante de um Expert Advisor. Este é você quem determina como processar a mensagem sobre o comércio movimentado contexto, não sobre os preços para o símbolo solicitado, etc Em alguns casos, é suficiente para exibir uma mensagem sobre o erro. Em outros casos, seria razoável tentar repetir o comércio pedido e após um certo período de tempo. É necessário determinar como um ou outro erro será processado. A função definida Erros de usuário () mostrados nesta seção processos erros utilizando o operador seleção switch ().
Estrutura de um programa normal A marcante em um programa normal é sua estrutura que permite a sua fácil utilização para algumas funções definidas por usuários ou outros. Por conveniência, funções definidas por usuários são geralmente formadas como incluir arquivos (. Mqh) que estão armazenados na pasta Terminal_directory \ peritos \ include. Como regra geral, um programa normal contém todas as três funções especiais que chamam a userdefined funções necessárias para sua execução. User-defined funções, por sua vez, podem ligar para outro usuário, funções definidas para efeitos de execução, cada um deles tenha a sua própria finalidade funcionalmente delimitadas. Ao Especialista Assessor de usuário pode conter funções definidas com as mais diversas propriedades. Algumas funções, por exemplo, são destinados aos eventos de monitoramento e saída de dados convenientes, outras funções são utilizadas para formar comércio pedidos, o terceiro funções são destinados a diferentes cálculos, por exemplo, para definir critérios de negociação, cálculo de custos ordem, etc A decisão sobre o que funciona para usar em um programa depende da EA e com que finalidade serviço o programa se destina a proporcionar ao usuário com um. Na fig. 155 a seguir, você pode ver um diagrama do bloco uma negociação normal EA construído sobre um pequeno conjunto de funções definidas pelo utilizador.
Fig. 155. Esquema de um programa normal (Expert Advisor). As setas no diagrama mostram as relações entre funções. Por exemplo, a ordem contabilística em função da EA é chamada a partir de funções especiais init () e começar (); ela também pode ser chamado de qualquer outro local dentro do programa. Na parte direita do diagrama, as setas estão conectando mostrado que simbolizam a possibilidade de pedir um user-defined função da outra. Por exemplo, a função definindo critérios negociação não pode ser chamado de qualquer função específica, mas pode ser convocado para a execução de uma função comercial. Os dados função é chamada a partir da Função deinit especiais () e, se necessário, de outras funções, por exemplo, o erro de processamento função, o comércio funções, ou a partir do evento função de monitoramento. Os arquivos incluem declaração da variável não pode ser chamado a partir de qualquer função, uma vez que as contidas no código não é a descrição de uma função que pode ser chamados e executados. Esse arquivo contém as linhas da declaração variável global, por isso é apenas uma parte de um EA. A fim de compreender a forma como as diferentes partes de uma relacionará em EA, vamos considerar a ordem de criação e uso de arquivos de inclusão. Usando incluir arquivos Se um programa aplicativo contém uma grande variedade de linhas de programa, às vezes é difícil de depurar-lo - o programador tem de percorrer o programa texto muitas vezes, a fim de fazer mudanças no código em uma ou outra localização.Em tais casos, por conveniência, o programa pode ser dividido em vários fragmentos, cada um formado como incluir um arquivo separado. Incluir arquivos podem conter quaisquer fragmentos código a ser usado no programa. Cada função usada no programa é geralmente formado como incluir um arquivo. Se várias funções estão interligadas logicamente, incluir um arquivo pode conter a descrição de várias funções definidas pelo utilizador. Na seção Informações sobre uma Conta, que consideramos um exemplo de código que impede a protecção contra a utilização não autorizada de programas empresariais. No Expert Advisor check.mq4, a parte correspondente do programa é representado como o código de utilizador definido função Check (),
a descrição do que está contido diretamente no código-fonte da EA. Nas EAusualexpert.mq4 (ver Fig. 91,3), esta função é utilizada, também. No entanto, neste caso, a função é formado como incluir o arquivo Check.mqh. Funções Definidas Por Usuário Marque () bool Check () A função retorna TRUE, caso as condições de utilização do aplicativo programa sejam cumpridas. Caso contrário, retorna FALSE. As condições de utilização do programa são consideradas como cumpridas, se: § § §
o programa é usado em uma conta demo; a conta foi aberta com SuperBank; o usuário tenha fixado o valor correto da variável externa livramento condicional quando trabalhava em uma conta real.
Os arquivos incluem Check.mqh contendo a descrição da função definida pelo utilizador-Check (): //------------------------------------------------ --------------------------------/ / Check.mqh / / O programa é destinado a ser utilizado como um exemplo em MQL4 Tutorial. //------------------------------------------------ ---------------------------- 1 -/ / A função controlar a legalidade do programa usado / / Entradas: / / - Variável global "livramento condicional" / / - Local constante "SuperBank" / / Retorno valores: / / True - se as condições de utilização sejam cumpridas / / Falso - se as condições de utilização são violados //------------------------------------------------ ---------------------------- 2 -extern int livramento condicional = 12345; / / Senha para trabalhar em uma conta real //------------------------------------------------ ---------------------------- 3 -bool Check () / / Definido pelo usuário unção ( if (IsDemo () == true) / / Se for uma conta demo, então .. retorno (true); / / .. não existem outras limitações quando (AccountCompany () == "SuperBank") / / Para os clientes corporativos .. return (true); / / .. nenhuma senha for necessária Key AccountNumber int = () * 2 + 1000001; / / Calcular a tecla if (Key == livramento condicional) / / Se a senha for verdade, então .. return (true); / / .. permitem ao usuário trabalhar em uma conta real Informar (14); / / Mensagem sobre o uso indevido return (false); / / Sair do usuário-função definida ) //------------------------------------------------ ---------------------------- 4 -É fácil notar que inclua o nome do arquivo é o mesmo que o nome da função que ele contém. Esta não é exigido pelas regras do MQL4. Geralmente, o nome de um arquivo include não terá de ser igual ao nome da função que ele contém. Ele se torna ainda mais evidente, se considerarmos que um arquivo pode conter a descrição das diversas funções ou fragmento de um programa que não é uma função de
todo. No entanto, a prática de dar um arquivo incluir o mesmo nome do que continha a função é viável.Isto facilita consideravelmente o trabalho de um programador: usando os nomes de arquivo, ele ou ela será facilmente saber quais funções existem na pasta Terminal_directory \ peritos \ include. De forma a incluir o programa fragmento contido no arquivo, você deverá usar a directiva # include. Directiva # include # include # 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 (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 # include # include //------------------------------------------------ -------------------- ------------- - 3 -# include / / Descrição das variáveis # include / / C Hecking legalidade dos programas usados # include / / Portaria contabilidade # include / / Evento função de monitoramento # include / / Dados função # include / / Comércio função # include / / Abrindo uma ordem do modelo predefinimos # include / / Fechar todas as encomendas do modelo predefinimos # include / / StopLoss modificação para todas as encomendas do modelo predefinimos # include / / Cálculo do montante de lotes # include / / Trading critérios # include / / Erro ao processar função //------------------------------------------------ ------------- ------------------- - 4 -int init () / / Função Especial 'init' ( Level_old = MarketInfo (Symbol (), MODE_STOPLEVEL); / / Min. distância
Terminal (); / / Portaria função contabilística retorno; / / Sair init () ) //------------------------------------------------ ------------- ------------------- - 5 -int start () / / Especial função 'iniciar' ( if (Check () == false) / / Se as condições de utilização .. retorno; / / .. não são cumpridas, então saia PlaySound ( "tick.wav"); / / Em cada carrapato Terminal (); / / Portaria função contabilística Eventos (); / / Informações sobre os eventos Comércio (Critério ()); / / Comércio função Informar (0); / / Para mudar a cor dos objectos retorno; / / Sair start () ) //------------------------------------------------ ------------- ------------------- - 6 -int deinit () / / Função Especial deinit () ( Informar (- 1); / / Para excluir objetos retorno; / / Sair deinit () ) //------------------------------------------------ ------------- ------------------- - 7 -No bloco 2.3, estamos incluídos no programa padrão arquivos stdlib.mqh, stderror.mqh e WinUser32.mqh utilizando a directiva # include. Ela não é necessário usar esses arquivos no programa. Por exemplo, stderror.mqh arquivo contém a definição do padrão utilizado no erro constantes transformações. Se não for prestado tratamento de erro no programa (ou seja, essas constantes não são usados), então não há necessidade de incluir esse arquivo em texto-fonte. Ao mesmo tempo, geralmente é necessário incluir esses arquivos em um programa normal. No bloco 3.4, o programa inclui alguns arquivos contendo a descrição das funções definidas pelo utilizador. Utilizando a directiva # include na linha abaixo: # include / / C Hecking legalidade dos programas usados o texto-fonte do programa inclui a função definida Check-usuário (). Programador pode ver o código fonte do EA (neste caso,usualexpert.mq4) como ela é representada acima. No entanto, o texto-fonte do programa é modificado na compilação, ou seja, cada linha contendo a directiva # include é substituído no programa com o texto contido no arquivo do nome indicado. Assim, um arquivo executável. Ex4 é criado com base no código completo do Expert Advisor, em que cada linha # include (ou # include "Nome do arquivo") é substituído pelo código correspondente fragmento. Um exemplo de incluir um arquivo contendo um fragmento programa que não é função da descrição é arquivo Variables.mqh.Este arquivo está incluído no programa texto na linha: # include / / Descrição das variáveis e contém a descrição das variáveis globais utilizadas por diferentes funções definidas pelo utilizador. //------------------------------------------------ ------------------- ------- -/ / Variables.mqh / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ ------------- -------- 1 --
/ / Descrição das variáveis globais extern dupla Lotes = 0,0; / / Quantidade de lotes Percentual extern int = 0; / / Repartidos fundos percentual StopLoss extern int = 100; / / StopLoss para novas encomendas (em pontos) extern int TakeProfit = 40; / / TakeProfit para novas encomendas (em pontos) TralingStop extern int = 100; / / TralingStop mercado de encomendas (em pontos) //------------------------------------------------ -------- -------------- 2 -int Level_new, / / Novo valor da distância mínima Level_old, / / Anterior valor da distância mínima Mas_Tip [6]; / / Portaria tipo array / / [] Ordem tipo: 0 = B, S = 1, 2 =, BL, SL = 3, 4 = BS, 5 = SS //------------------------------------------------ ------ -------- -------- 3 -dupla Lots_New, / / Quantidade de lotes para novas encomendas Mas_Ord_New [31] [9], / / Corrente fim array .. Mas_Ord_Old [31] [9]; / / .. velha ordem array // 1st index = order number in the list / / [] [0] não pode ser detectado / / [] [1] para abrir preço (preço abs. valor) / / [] [2] StopLoss da encomenda (preço abs. valor) / / [] [3] TakeProfit da encomenda (preço abs. valor) / / [] [4] o número de ordem / / [] [5] ordem volume (abs. preço valor) / / [] [6] 0 = fim tipo B, S = 1, 2 =, BL, SL = 3, 4 = BS, 5 = SS / / [] [7] Despacho número mágico / / [] [8] 0 / 1 o facto de disponibilidade dos comentários //------------------------------------------------ ----------------------4 -De acordo com as regras de MQL4, qualquer variável (incluindo aqueles mundial) devem ser declarados antes de a primeira referência a essa variável. Por este motivo, o arquivo Variables.mqh está incluída no programa e os arquivos localizados acima das funções que usam os valores das variáveis especificadas neste arquivo. Pela mesma razão, todas as variáveis globais são colocados nesse arquivo. Em alguns (raros) casos, é tecnicamente possível declarar uma variável global em incluir um arquivo que descreve a função, na qual o valor dessa variável é usada no primeiro programa. Nesses casos, é necessário manter a ordem, incluindo o arquivo. Ou seja, a linha que contém o programa directiva # include que inclui o arquivo (com a declaração de uma variável global) para o programa deve ser colocado acima do texto do que as linhas que incluem outros arquivos usando o valor dessa variável global. Em outros casos, é mesmo tecnicamente impossível fazer isso. Por exemplo, se temos dois incluir arquivos, cada um deles usando duas variáveis globais, um dos quais é declarada em um arquivo e outro é declarado no outro arquivo, chegaremos a um erro na elaboração desse programa, uma vez que, independentemente do processo, incluindo a ordem, é uma das variáveis usadas antes que seja declarado no programa. Por isso mesmo, é uma prática habitual em um programa normal de declarar todas as variáveis globais, sem excepções, em um arquivo que está incluído no programa antes de outros arquivos que contêm a descrição de funções definidas pelo utilizador. No bloco 1.2 de incluir o arquivo Variables.mqh, todas as variáveis são externas especificado, os valores de que se determine a quantidade de lotes para novas encomendas, a percentagem atribuída a margem livre para novas encomendas, a solicitação de preços para parar de encomendas do mercado encomendas a ser aberto, bem como a distância de TralingStop para modificação de ordem StopLoss. Nos blocos 2-4, outras variáveis globais são dadas, o sentimento de que se tornará evidente
após examinar as correspondentes funções definidas pelo utilizador. As subseções desta seção representam incluir arquivos, cada um contendo a descrição das funções definidas por usuários do mesmo nome. Ordem Contabilidade Nós mencionados acima, que não havia regras estritas para fazer programa algoritmos. Ao mesmo tempo, a esmagadora maioria dos algoritmos implica uma tomada de decisões comerciais de acordo com o actual estado das encomendas disponíveis.Em alguns casos, por exemplo, uma abertura do mercado não precisam de nenhuma outra forma ordens disponíveis no mercado a partir do momento do comércio. Em outros casos, não pare de ordens disponíveis no mercado pode ser vista uma condição necessária para a colocação de uma encomenda pendente. Sabemos também alguns algoritmos que implica colocar duas encomendas pendentes dirigidos de forma diferente. A fim de cumprir os requisitos de uma ou outra tática ou estratégia, o momento da tomada de decisão, você deve saber sobre o status atual - o que mercado e encomendas pendentes estão disponíveis e quais são as características que eles têm? Você pode usar uma das duas soluções possíveis. De acordo com a primeira solução, o programa necessário fragmentar código (no qual são analisadas as ordens) é escrito diretamente no local no programa, onde o conjunto de ordens disponíveis e suas características devem ser encontradas para fora. Esta solução é tecnicamente viável, mas que acaba por ser ineficiente, se você quiser fazer alterações no algoritmo. Neste caso, o programador tem que analisa o programa em todos os locais onde são analisados os status ordem, e fazer alterações em cada localidade. Outro, mais eficaz solução é criar uma ordem universal contabilidade função uma vez e utilizá-lo todas as vezes, quando você quiser atualizar as informações sobre o status atual ordem. Por um lado, esta solução permite que você reduza o programa código. Por outro lado, permite que o programador para usar esta função quando já prontas e codificação outros programas. No intuito de criar uma ordem contabilística funcionar corretamente, você deve primeiro decidir quais parâmetros devem ser contabilizados. Na maioria dos casos, os valores dos seguintes parâmetros são usados na tomada de decisões comerciais: § § §
montante total de encomendas; a quantidade de encomendas de cada tipo (por exemplo, a quantidade de encomendas Comprar, SellStop ordens, ou BuyLimit despachos, etc); todas as características de cada ordem (bilhete, StopLoss e TakeProfit níveis de volume em lotes, etc.)
As informações acima devem estar disponíveis para outras funções, a saber, aqueles, em que esta informação é processada. Por esta razão, todos os parâmetros que caracterizam fim estados são os valores globais das matrizes. No total, estão previstas três matrizes de ordem contabilística: §
§
§
a matriz de encomendas actual, Mas_Ord_New, que contém informações sobre todas as características do mercado e todas as encomendas pendentes disponível no momento atual, ou seja, dentro do período da última execução da função; a matriz de velhas ordens, Mas_Ord_Old, que contém informações sobre todas as características do mercado e todas as encomendas pendentes disponíveis no momento da execução da função anterior; Mas_Tip a matriz, os valores dos quais são os montantes das ordens de tipos diferentes (no momento atual).
Arrays Mas_Ord_New e Mas_Ord_Old são semelhantes e equidimensional; a diferença entre eles é o que reflecte uma antiga do estado atual das encomendas, enquanto a segunda mostra a um estado anterior. Vamos dar uma consideração mais atenta aos valores contidos nos elementos dessas matrizes. Tabela 4. Correspondência dos elementos de arrays Mas_Ord_New e Mas_Ord_Old com características ordem. Não definido
Abrir Número de StopLoss TakeProfit Preço pedido
Volume, Tipo de em lotes Ordem
Magic Number
Comentar
Índices 0 1 2 3 4 5 6 7 8 0 2,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 1 0,0 1,2583 1,2600 1,2550 123456,0 1.4 1,0 1177102416,0 1,0 2 0,0 1,2450 1,2580 1,2415 123458,0 2.5 2,0 1177103358,0 0,0 3 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 . . . 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 30 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 O primeiro índice da matriz (linhas) define o número da ordem do array. As características de primeira ordem detectado (entre todas as ordens no mercado aberto e colocado encomendas pendentes) são colocadas na primeira linha da matriz, as da segunda ordem detectadas serão colocadas na segunda linha, etc O tamanho do array para o primeiro índice é igual a 31, deste modo, a matriz é destinado a armazenar informação de cerca de 30 ordens de, no máximo, se eles estão simultaneamente disponíveis em uma conta de exploração. Se a estratégia comercial permite que a disponibilidade de mais de trinta ordens simultaneamente, você deverá especificar o valor correspondente para os primeiros índice quando você declarar o array. (Na maioria dos casos, o valor de 30 exceda consideravelmente a necessidade real geralmente varia de 2 a 10.15 ordens. Usamos o valor de 30 neste exemplo, pois suponho que a função pode ser usado para muito incomum estratégias comerciais, como bem). O segundo índice na tabela (colunas) representa ordem características. Cada elemento da matriz com o segundo índice igual a 1 contém o valor da encomenda abertas preço, com índice 2 - eles contém o valor de StopLoss fim, 3 - TakeProfit, etc (ver Tabela 4). Array elemento com índice [0] [0], tem um valor que é igual à quantidade total de ordens disponíveis no array. N º array elementos que tenham a primeira ou a segunda índices iguais a 0 são utilizados (com excepção elemento com índice [0] [0]). A Tabela 4 representa o status de uma matriz que contém informações sobre dois despachos que estão simultaneamente disponíveis no comércio em um determinado momento. Mas_Ord_New A matriz elemento [0] [0] tem o valor de 2,0 - o montante total das encomendas é de dois. Os elementos da primeira linha da matriz conterá os valores das características do mercado fim Sell (Mas_Ord_New [1] [6] = 1,0, consulte Tipos de Ofícios), aberta pelo lote 1-4 (Mas_Ord_New [1] [5] = 1.4 ) E com o número 123456 (Mas_Ord_New [1] [4] = 123456,0). O valor do elemento Mas_Ord_New [1] [8] = 1,0 significa que este despacho não tem comentário campo vazio. Na segunda linha da matriz, os valores que caracterizam a segunda ordem estão contidas. Particularmente, o elemento matriz Mas_Ord_New [2] [6], tem o valor de 2,0, isso significa que é BuyLimit. Array Mas_Tip representa a quantidade de encomendas de cada tipo. Os valores desta matriz índices são atribuídos aos tipos de tráfegos (ver Tipos de Ofícios). Isto significa que o elemento de array Mas_Tip com índice 0 contém o valor de mercado dos despachos do tipo Buy simultaneamente disponíveis no comércio, o índice 1 significa Vender quantidade de encomendas, 2 significa que o índice de BuyLimit despachos, etc Para a situação mostrada na Tabela 4, os elementos do array Mas_Tip terão os seguintes valores: Tabela 5. Correspondência dos elementos do array Mas_Tip com a quantidade de encomendas de diferentes tipos.
Comprar Vender BuyLimit SellLimit BuyStop SellStop Índice 0 1 2 3 4 5 Valor 0 1 1 0 0 0 Neste caso, os valores dos elementos do array Mas_Tip implicam o seguinte: Mas_Tip [1] igual a 1 significa que existe uma ordem Sell negociados; Mas_Tip [2] igual a 1 significa que existe uma ordem pendente BuyLimit na negociação. Outros elementos do array têm valores zero - isto significa que não existem esses tipos de ordens de negociação. Se há várias encomendas do mesmo modelo simultaneamente disponíveis no comércio, o elemento correspondente da matriz terá o valor correspondente ao montante de tais ordens. Por exemplo, se existem três ordens BuyStop na negociação, o elemento Mas_Tip [4] terá o valor de 3. A ordem contabilística função Terminal () sugeriu incluir aqui é formado como arquivo Terminal.mqh. Funções Definidas Por Usuário Terminal () int Terminal () As contas função do mercado e encomendas pendentes. A execução da função traduz-se na transformação dos valores das seguintes matrizes globais: § § §
Mas_Ord_New - o conjunto de características de ordens disponíveis a partir do momento da execução da função; Mas_Ord_Old - o conjunto de características de ordens disponíveis a partir do momento da execução da função anterior; Mas_Tip - a matriz do montante total das encomendas de todos os tipos.
Incluir arquivo Terminal.mqh que contém a descrição da ordem contabilística função Terminal (): //------------------------------------------------ -------------------/ / Terminal.mqh / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ ----------------------------- 1 -/ / Portaria função contabilística / / Global variáveis: / / Mas_Ord_New [31] [9] / / O mais recente conhecido ordens array / / Mas_Ord_Old [31] [9] / / O anterior (antigo) ordens array / / 1o índice = número de ordem / / [] [0] não definida / / [] [1] para abrir preço (preço abs. valor) / / [] [2] StopLoss da encomenda (preço abs. valor) / / [] [3] TakeProfit da encomenda (preço abs. valor) / / [] [4] o número de ordem / / [] [5] ordem volume em lotes (preço abs. valor) / / [] [6] 0 = fim tipo B, S = 1, 2 =, BL, SL = 3, 4 = BS, 5 = SS / / [] [7] fim número mágico / / [] [8] 0 / 1 comentário disponibilidade / / Mas_Tip [6] / / Array da quantidade de encomendas de todos os tipos / / [] Ordem tipo: 0 = B, S = 1, 2 =, BL, SL = 3, 4 = BS, 5 = SS //------------------------------------------------ ----------------------------- 2 -int Terminal () ( Qnt int = 0; / / Pedidos counter //------------------------------------------------ ----------------------------- 3 --
ArrayCopy (Mas_Ord_Old, Mas_Ord_New); / / Salva o precedente histórico Qnt = 0; / / Zeroize ordens counter ArrayInitialize (Mas_Ord_New, 0); / / Zeroize o array ArrayInitialize (Mas_Tip, 0); / / Zeroize o array //------------------------------------------------ ----------------------------- 4 -for (int i = 0; i
Essa informação pode ser usada, por exemplo, para criar diagramas que representam a história da capital investido e real dos resultados comerciais. No entanto, ela não pode ser útil de alguma forma para fazer novas decisões comerciais. Tecnicamente, essa parte de encomendas podem ser contabilizados de forma semelhante. No entanto, é uma tarefa separada que não tem nenhuma relação à negociação propriamente dita. Os eventos relacionados com as encomendas são analisados em um programa com base na comparação dos dados disponíveis nos arrays considerada acima. Por exemplo, se Mas_Ord_Old array contém informações sobre uma encomenda pendente numerado como 246.810, enquanto a matriz Mas_Ord_New contém os dados sobre a mesma ordem 246810, mas a ordem é de outro tipo, isso significa que, enquanto se aguarda uma ordem tenha sido modificada em um mercado um. Também é necessário analisar quando efectuam encomendas trades (a ser considerado mais tarde). Antes da função Terminal () é executado pela primeira vez, arrays Mas_Ord_Old e Mas_Ord_New estão vazias, ou seja, cada um dos elementos de ambas as matrizes tem valor zero. Isto significa que, após a primeira execução da função, o leque Mas_Ord_Old na linha: ArrayCopy (Mas_Ord_Old, Mas_Ord_New); / / Conservar a história anterior herda "zero" a partir da matriz Mas_Ord_New estado, o que resulta no aparecimento de falsos alertas de evento a realização do evento função de monitoramento. Para evitar isso, a primeira execução da função Terminal () é realizado na fase de iniciação , E os eventos não são processadas após esta execução da função (veja a função init () no Expert Advisor usualexpert.mq4). Função dados Um normal Expert Advisor utilizada em nosso trabalho prático compara favoravelmente aos seus análogos simples, porque ele fornece um comerciante com um alto nível de informação de suporte. Durante a negociação, a situação muda o tempo todo, vários eventos têm lugar. Para fazer bom decisões, um comerciante deve ser plenamente informado. Para este efeito, são utilizados em diversas funções Expert Advisors. Estas funções são destinados a informar o usuário sobre um determinado conjunto de factos e processos. Em simples Expert Advisors, em regra, esta tarefa é feita pela norma Comentar função () que exibe o texto predefinido no canto superior esquerdo da janela do símbolo. Essa informação não está de saída método bastante confortável, uma vez que o texto pode ser frequentemente sobrepõem ao preço gráfico. Portanto, este método só pode ser usado em uma quantidade limitada de casos, a exibição de mensagens curtas. Vamos estudar aqui uma conceptualmente diferente método de exibição de informações - toda a mensagem é mostrada em uma janela separada, enquanto objetos gráficos são utilizados para formar mensagem textos. A utilização de objetos gráficos produz uma vantagem palpável, já que você pode mover objetos (ao contrário textos mostrados usando Comment ()), criando, desta forma, sua mensagem história. Um de distintos subwindow exibição das informações é criada utilizando um costume indicador ajustado proporcionalmente. O único objectivo deste indicador é a criação de subwindow que, por isso não os cálculos são realizados no indicador, nem indicando linhas são construídos na mesma. O código do indicador Inform.mq4 maio olhar como se segue: //------------------------------------------------ -------------------/ / Inform.mq4 / / O código deve ser usado apenas para fins educacionais . //------------------------------------------------ --------------------
# propriedade indicator_separate_window / / Separar indicador janela //------------------------------------------------ -------------------int start () / / Especial função start () ( ) //------------------------------------------------ -------------------Geralmente, um programador pode acrescentar no Indicador do seu código desejado e contribuir para as suas propriedades. Por exemplo, você pode exibir indicando linhas em uma determinada parte do indicador subwindow. No exemplo acima, um simples código do indicador é dado, na janela de objetos gráficos que serão apresentados.
Funções Definidas Por Usuário Inform () Informe int (int Mess_Number, int Number = 0, duplo Valor = 0,0) A função exibe na subwindow do indicador Inform.mq4 mensagens criadas utilizando objetos gráficos . A função controla a posição dos objetos gráficos no indicador subwindow: a cada nova mensagem é exibida na parte inferior da janela (linha inferior) e coloridos na cor desejada, as mensagens anteriormente demonstrado ser movido para a parte superior da janela ( uma linha para cima). Se não houver novas mensagens são apresentadas em 15 segundos, todas as mensagens anteriormente exibidos na janela que será colorida em cinza (a fim de não criar distorções para o utilizador) quando o programa remete para a função. Parâmetros: Mess_Number - número de mensagem que pode ter os seguintes valores: § § §
(zero) 0 - nenhuma mensagem é exibida, esse modo é usado para repor o temporizador; (menos um) -1 - todos os objetos gráficos criados através da função será excluído; (uma ou mais) - o número da mensagem a ser exibida no indicador subwindow;
- Número inteiro utilizado em algumas mensagens; Valor - número real usado em algumas mensagens. Informar a função () que cria objetos gráficos, como as outras funções normais em um EA, É formado como incluir um arquivo,Inform.mqh: //------------------------------------------------ ------------------- ------- -/ / Inform.mqh / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ -------- -------------- 1 -/ / Função que exibe mensagens na tela gráfica. //------------------------------------------------ -------- -------------- 2 -Informe int (int Mess_Number, int Number = 0, duplo Valor = 0,0) ( / / Int Mess_Number / / Mensagem número / / Número int / / Integer que ser aprovado / / Valor duplo / / Real número passou a ser int Win_ind; / / Indicador janela número string Graf_Text; / / Mensagem line color Color_GT; / / Cor da mensagem line static int Time_Mess; / / hora da última publicação da mensagem
static int Nom_Mess_Graf; / / Gráfica de mensagens counter static string Name_Grf_Txt [30]; / / Array gráfica mensagem de nomes //------------------------------------------------ -------------- -------- 3 -Win_ind = WindowFind ( "informar"); / / Buscando indicador janela número if (Win_ind <0) return; / / Se não houver essa janela, deixe //------------------------------------------------ -------- -------------- 4 -if (Mess_Number == 0) / / Isto acontece em todos os carrapatos ( if (Time_Mess == 0) return; / / Se ele já é cinza if (GetTickCount () - Time_Mess> 15000) / / A cor tornou-se atualizado dentro de 15 seg ( for (int i = 0; i <= 29; i + +) / / cor cinza com linhas ObjectSet (Name_Grf_Txt [i], OBJPROP_COLOR, Gray); Time_Mess = 0; / / Bandeira: Todas as linhas são cinza WindowRedraw (); / / redesenhando objetos ) retorno; / / Saída da função ) //------------------------------------------------ -------- -------------- 5 -if (Mess_Number ==- 1) / / Isto acontece em deinit () ( for (i = 0; i <= 29; i + +) / / By objeto índices ObjectDelete (Name_Grf_Txt [i]); / / Supressão do objeto retorno; / / Saída da função ) //------------------------------------------------ -------- -------------- 6 -Nom_Mess_Graf + +; / / Gráfica de mensagens counter Time_Mess = GetTickCount (); / / Última publicação tempo Color_GT = Lime; //------------------------------------------------ ---------- -------- ---- 7 -switch (Mess_Number) / / Ir a mensagem ( case 1: Graf_Text = "Fechado ordem Comprar" + Número; PlaySound ( "Close_order.wav"); break; case 2: Graf_Text = "Fechado para Vender" + Número; PlaySound ( "Close_order.wav"); break; case 3: Graf_Text = "Eliminado ordem pendente" + Número; PlaySound ( "Close_order.wav"); break; case 4: Graf_Text = "Inaugurado ordem Comprar" + Número; PlaySound ( "Ok.wav"); break; caso 5: Graf_Text = "Aberto para Vender" + Número; PlaySound ( "Ok.wav"); break; caso 6: Graf_Text = "Colocado ordem pendente "+ Número; PlaySound ( "Ok.wav"); break; caso 7: Graf_Text = "Ordem "Número + +" modificado para o mercado um "; PlaySound ( "Transform.wav"); break; caso 8: Graf_Text = "Reopened ordem" + Número; break; PlaySound ( "Bulk.wav");
caso 9: Graf_Text = "Parcialmente fechado ordem" + Número; PlaySound ( "Close_order.wav"); break; caso 10: Graf_Text = "New distância mínima:" + Número; PlaySound ( "Inform.wav"); break; caso 11: Graf_Text = "Não é dinheiro suficiente para" + DoubleToStr (Valor, 2) + "lotes"; Color_GT = Vermelho; PlaySound ( "Oops.wav"); break; caso 12: Graf_Text = "Tentando fechar ordem" + Número; PlaySound ( "expert.wav"); break; caso 13: if (Number> 0) Graf_Text = "Tentando abrir Vender fim .."; diferente Graf_Text = " Tentando Comprar abertas fim .. "; PlaySound ( "expert.wav"); break; caso 14: Graf_Text = "Senha inválida. EA não funciona."; Color_GT = Vermelho; PlaySound ( "Oops.wav"); break; caso 15: switch (Number) / / Indo para o número do erro ( case 2: Graf_Text = "erro comum". break; caso 129: Graf_Text = "Wrong preço." break; caso 135: Graf_Text = "Preço alterado." break; caso 136: Graf_Text = "Não preços. Aguardando uma nova carrapato .."; break; caso 146: Graf_Text = "Trading subsistema está ocupado "; Break; caso 5: Graf_Text = "antiga versão do terminal."; break; caso 64: Graf_Text = "Conta está bloqueado." break; caso 133: Graf_Text = "Negociação é proibido"; break; default: Graf_Text = "Ocorreu erro" + Número; / / Outros erros ) Color_GT = Vermelho; PlaySound ( "Error.wav"); break; caso 16: Graf_Text = "Expert Advisor funciona apenas para EURUSD"; Color_GT = Vermelho; PlaySound ( "Oops.wav"); break; padrão: Graf_Text = "default" + Mess_Number; Color_GT = Vermelho; PlaySound ( "Bzrrr.wav"); ) //------------------------------------------------ - -------- ------------8 -ObjectDelete (Name_Grf_Txt [29]); / / excluir 29a (superior) objeto for (i = 29; i> = 1; i -) / / Ciclo de regra dos índices .. (/ / .. de objetos gráficos Name_Grf_Txt [i] = Name_Grf_Txt [i - 1]; / / Criando objetos: ObjectSet (Name_Grf_Txt [i], OBJPROP_YDISTANCE, 2 + 15 * i); ) Name_Grf_Txt [0] = "Inform_" Nom_Mess_Graf + + "_" + Symbol (); / / Nome do Objeto ObjectCreate (Name_Grf_Txt [0], OBJ_LABEL, Win_ind, 0, 0); / / Criação ObjectSet (Name_Grf_Txt [0], OBJPROP_CORNER, 3); / / Canto
ObjectSet (Name_Grf_Txt [0], OBJPROP_XDISTANCE, 450); / / Eixo Х ObjectSet (Name_Grf_Txt [0], OBJPROP_YDISTANCE, 2); / / Eixo Y / / Текстовое описание объекта ObjectSetText (Name_Grf_Txt [0], Graf_Text, 10, "Courier New", Color_GT); WindowRedraw (); / / redesenhando todos os objetos retorno; ) //------------------------------------------ ------ - --------------------9 -No bloco 2.3, as variáveis utilizadas na função estão descritos. Para armazenar os nomes de objetos gráficos, o leque Name_Grf_Txt é utilizado. De acordo com o método aceito na função, o programa cria um novo objeto gráfico para cada nova mensagem. O montante total dos objetos é de 30, cada objeto representa uma entrada localizada no texto uma linha. Em caso de resolução de tela grande, a quantidade de linhas a serem mostradas pode ser aumentada pelo aumento da quantidade de objetos a serem criados. No bloco 3.4, o número do subwindow do indicador "Informar" é calculado para mensagens a serem mostradas polegadas Se o indicador não for fixado, a função pára de suas operações. Se não houver nenhuma janela, as mensagens podem não ser exibidas, mas isso não afecta a operacionalidade da EA todas as outras funções irão funcionar nos seus modos normais, trades será realizada, também. No bloco 4.5, a mensagem cores são analisados. A função com o parâmetro Mess_Number = 0 é chamada, no Consultor Especialista em todos os carrapatos (ver a função start () no Expert Advisor usualexpert.mq4). Se todos os objetos são cinza na história anterior, a função termina as suas operações. No entanto, se o valor da variável Time_Mess é não zero, as propriedades de todos os objetos são alterados, ou seja, todos os objetos serão coloridos em cinza. If (blocos 5-6) o parâmetro Mess_Number =- 1 é especificado na chamada de função, todos os objetos criados anteriormente à execução da função são eliminados. Isso pode ser necessária quando a EA é destacada do símbolo janela. Nesse caso, segundo a regra comum, cada programa aplicativo deve excluí-la todos os objetos criados durante a execução (ver a função deinit () noExpert Advisor usualexpert.mq4) . Se o controlo no programa é transmitido ao bloco 6.7, isso significa que é necessário criar um novo objeto gráfico com propriedades exigidas e coloque-o na parte inferior do indicador subwindow (na linha inferior; aqui, o termo de "linha" é condicional, na verdade, a localização dos objetos gráficos é determinado pelas coordenadas predefinido). Cada objeto tem o seu recém-criado nome único. Para criar objetos com nomes, usamos a série histórica da mensagem, esta é a razão pela qual as mensagens são colocados no balcão bloco 6-7 (numa fase posterior, o valor da variável Nom_Mess_Graf é utilizado para formar um único nome, bloco 8 -- 9). É aqui onde a última publicação tempo é contabilizado e cor de base é estabelecida por novas mensagens (verde). 7.8 O bloco é composto pelo operador 'mudar', no interior dos quais o controlo é passado de acordo com o valor do parâmetro Mess_Number especificado na chamada de função. Em cada "caso" deste operador da variável Graf_Text, é atribuído um novo valor que é o conteúdo da mensagem a ser exibida. Um colorido especial está definido para algumas mensagens, por exemplo, vermelho para mensagens importantes. Todas as mensagens são acompanhados com sons que são a execução da norma PlaySound função () (ver Wave Files). A criação de um novo objeto gráfico e de substituição dos existentes, realizados no bloco 8.9. A quantidade de objetos é limitada, pelo que um objeto (um a mais antiga) é suprimida toda vez quando uma nova mensagem é publicada. Todos os outros objectos existentes são deslocados uma linha para cima. Os objetos são movidos por mudar suas propriedades - Coordenadas verticais. As coordenadas horizontais dos objetos permanecem inalteradas.
Após todos os preparativos necessários tenham sido feitas (todos os objectos são movidos uma linha para cima), um novo objeto com novas propriedades com nome único e parcialmente determinada em bloco 7.8 é criado. O tipo do objeto é o gráfico Texto Label. Os objectos deste tipo estão posicionados em relação à janela do símbolo, que permite ao usuário mover preço gráfico arbitrariamente, sem afetar as posições das mensagens. Informar a função () pode ser chamado a partir de qualquer local no programa em que, implicitamente, uma mensagem de texto deve ser exibido. Como resultado de um longo tratamento, as mensagens são acumuladas na janela. O usuário pode visualizar as mensagens pelo redimensionamento da história do indicador subwindow (por exemplo, puxando para cima a sua borda superior). Opcionalmente, você também pode definir a janela altura de tal modo que o espaço visível exibe a quantidade desejada de mensagem de linhas (de três a quatro linhas são geralmente recomendado).
Fig. 156. Símbolo janela. Mensagem no indicador Subwindow. É fácil ver que a diversidade das mensagens exibidas pela função pode ser aumentado. Se você estiver indo para expandir o programa, basta apenas adicionar a nova versão de «casos» em que o operador "switch" (bloco 7 -- 8). Evento Função Monitoramento de Muitos eventos têm lugar durante a negociação. Um comerciante pode ver alguns deles diretamente na janela do símbolo, por exemplo, preço de mercado ou mudanças atravessadas indicador linhas. Outros eventos, apesar de serem interessantes para um comerciante, também não são mostrados explicitamente qualquer lugar. Uma parte considerável desses eventos podem ser detectados e tratados utilizando MQL4. Por exemplo, o seu tratamento pode mudar o centro condições comerciais muito pouco tempo antes forem publicadas notícias importantes ou quando o mercado torna-se muito activo. Nesses casos, a propagação ou a distância mínima permitida para a colocação de ordens stop e para o fim solicitado preços podem ser aumentados. Caso isso aconteça, é necessário, primeiro, para detectar e levar a novas condições comerciais em consideração, e, em segundo lugar , Para informar o comerciante sobre estas alterações. Para resolver estas tarefas, você pode usar o evento na sua função de monitoramento Expert Advisor. Funções Definidas Por Usuário Eventos () int Eventos ()
As alterações na função calcula a distância mínima exigida para as encomendas e as suas ordens stop, bem como as alterações na lista de encomendas pendentes mercado e disponíveis na conta. Para executar a função, você deve usar a ordem contabilística função Terminal () em seu programa. Os valores das seguintes matrizes globais são utilizados: § §
Mas_Ord_New - o conjunto de características de ordens disponíveis a partir do momento da função Terminal () execução; Mas_Ord_Old - o conjunto de características de ordens disponíveis a partir do momento anterior ao da execução da função terminal ().
Os valores das seguintes variáveis globais são utilizados: - Level_new - o valor atual da distância mínima; - Level_old - o valor anterior da distância mínima. Para exibir as mensagens, a função irá utilizar a função Informar dados (). Se a função Inform () não está incluído na Expert Advisor, mensagens não serão mostrados. O evento função de monitoramento Eventos () é formado como incluir o arquivo Events.mqh: //------------------------------------------------ ------------------------------/ / Events.mqh / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ -------------------------- 1 -/ / Evento função de monitoramento. / / Global variáveis: / / Level_new O novo valor da distância mínima / / Level_old O valor anterior da distância mínima / / Mas_Ord_New [31] [9] A última conhecida matriz de encomendas / / Mas_Ord_Old [31] [9] A velha matriz de encomendas //------------------------------------------------ -------------------------- 2 -int Eventos () / / Usuário-função definida ( bool Conc_Nom_Ord; / / Adequar as encomendas em .. / / .. os antigos e os novos arranjos //------------------------------------------------ -------------------------- 3 -Level_new = MarketInfo (Symbol (), MODE_STOPLEVEL); / / Último conhecidos if (Level_old! = Level_new) / / Nova não é o mesmo que o velho .. (/ / Isso significa que a condição ter sido alterado Level_old = Level_new; / / Novo "valor antigo" Informar (10, Level_new); / / Mensagem: nova distância ) //------------------------------------------------ -------------------------- 4 -/ / Procura por perdida, escreva-alterou-se, parcialmente fechado e reaberto encomendas for (int idade = 1; velho <= Mas_Ord_Old [0] [0]; velho + +) / / Nos old matriz de encomendas (/ / Assumindo o .. Conc_Nom_Ord = false; / / .. ordens não são iguais //------------------------------------------------ --------------------- 5 -for (int novo = 1; nova <= Mas_Ord_New [0] [0]; novos + +) / / ciclo para o array .. (/ / .. De novas encomendas //------------------------------------------------ ------------------ 6 --
if (Mas_Ord_Old [antigo] [4] == Mas_Ord_New [novo] [4]) / / número correspondidas (/ / Tipo de Ordem torna-se .. if (Mas_Ord_New [novo] [6]! Mas_Ord_Old = [antigo] [6]) / / .. diferente Informar (7, Mas_Ord_New [novo] [4]); / / Mensagem: modificados:) Conc_Nom_Ord = true; / / A ordem é encontrado, .. break; / / etc .. sai .. ) / / .. o ciclo interno //------------------------------------------------ ------------------ 7 -/ / Portaria número não corresponde if (Mas_Ord_Old [antigo] [7]> 0 & & / / MagicNumber jogos Mas_Ord_Old [antigo] [7] == Mas_Ord_New [novo] [7]) / / .. com a idade uma (/ / Isso significa que ele seja reaberto ou parcialmente fechados / / Se volumes jogo, .. if (Mas_Ord_Old [antigo] [5] == Mas_Ord_New [novo] [5]) Informar (8, Mas_Ord_Old [antigo] [4]); / / .. ele está reabrindo else / / Em caso contrário, ele era .. Informar (9, Mas_Ord_Old [antigo] [4]); / / fechando parcialmente .. Conc_Nom_Ord = true; / / A ordem é encontrado, .. break; / / etc .. sai .. ) / / .. o ciclo interno ) //------------------------------------------------ --------------------- 8 -if (Conc_Nom_Ord == false) / / Se estamos aqui, .. (/ / .. Isso significa que nenhuma ordem encontrada: ( if (Mas_Ord_Old [antigo] [6] == 0) Informar (1, Mas_Ord_Old [antigo] [4]); / / Portaria Comprar fechada if (Mas_Ord_Old [antigo] [6] == 1) Informar (2, Mas_Ord_Old [antigo] [4]); / / Portaria Vender fechada if (Mas_Ord_Old [antigo] [6]> 1) Informar (3, Mas_Ord_Old [antigo] [4]); / / Até fim suprimido ) ) //------------------------------------------------ -------------------------- 9 -/ / Procura de novas encomendas for (novo = 1; nova <= Mas_Ord_New [0] [0]; novos + +) / / No conjunto de novas encomendas ( if (Mas_Ord_New [novo] [8]> 0) / / Esta não é uma novidade, mas reaberto continuar; / / .. ou parcialmente fechados Conc_Nom_Ord = false; / / Enquanto não foram encontrados resultados para a (antiga = 1; velho <= Mas_Ord_Old [0] [0]; velho + +) / / para este fim Pesquisando (/ / .. Na matriz de velhas ordens if (Mas_Ord_New [novo] [4] == Mas_Ord_Old [antigo] [4]) / / Matched número .. (/ / .. da ordem Conc_Nom_Ord = true; / / A ordem é encontrado, .. break; / / etc .. sai .. ) / / .. o ciclo interno ) if (Conc_Nom_Ord == false) / / Se não for encontrado fósforos, .. (/ / .. O intuito é nova:) if (Mas_Ord_New [novo] [6] == 0) Informar (4, Mas_Ord_New [novo] [4]); / / Ordem abriu Comprar if (Mas_Ord_New [novo] [6] == 1) Informar (5, Mas_Ord_New [novo] [4]); / / Vender Ordem abriu if (Mas_Ord_New [novo] [6]> 1) Informar (6, Mas_Ord_New [novo] [4]); / / Até encomenda ) )
//------------------------------------------------ ------------------------- 10 -retorno; ) //------------------------------------------------ ------------------------- 11 -Matrizes e variáveis globais necessários para a execução da função estão descritos no bloco 1.2. No bloco 2.3, Conc_Nom_Ord variável mais utilizada no código de ordens análise é aberta. A função das faixas mudanças a distância mínima para a colocação de ordens de paragem e de encomendas. Por isso, o atual valor do mínimo Level_new distância é calculada em cada execução da função (blocos 3-4) e, em seguida, em comparação com a anterior, o valor de Level_old (obtida durante a anterior execução da função). Se os valores dessas variáveis não são iguais uns aos outros, isso significa que a distância mínima foi modificada pela lidar centro pouco antes da última execução da função.Neste caso, o valor atual da distância mínima é atribuído para a variável Level_old (no sentido de considerá-la nas execuções posteriores da função), bem como a função Inform () é executado, a fim de exibir a mensagem correspondente. Geralmente, você pode utilizar um método semelhante para detectar outros eventos, por exemplo, alterações no spread, permissões para o comércio dado símbolo (identificador MODE_TRADEALLOWED na função MarketInfo ()), a realização de uma nova barra (ver Problema 27), o facto de atravessar indicador linhas (ver fig. 107), o fato de se chegar a uma certa hora predefinida, etc O programa pode detectar alguns eventos para utilizar em seus valores obtidos a EA, outros eventos - para informar o usuário sobre elas. Nos blocos 4-10, os estados do mercado e encomendas pendentes são analisados. Mais informações sobre mudanças nas encomendas é prestado ao usuário. A análise é realizada em duas fases. Na primeira fase, o programa detecta as alterações que dizem respeito aos perdidos (fechado ou excluído), alterando-tipo, parcialmente fechado e reaberto encomendas (blocos 4-9). Na segunda etapa (bloco 910), as novas encomendas sejam procura. Em blocos 4.9, as ordens contabilizados no array Mas_Ord_Old são analisados. A quantidade de iterações do ciclo externo 'para' é encontrado em função do montante total de encomendas no array (array Mas_Ord_Old elemento [0] [0]). Para verificar se a ordem for mantida, a partir do momento atual, é necessário encontrar uma ordem semelhante às ordens matriz Mas_Ord_New.Esta pesquisa é realizada no ciclo interno 'para' (blocos 6-8), a quantidade de iterações do que é igual à quantidade de encomendas no array (array Mas_Ord_New elemento [0] [0]). Vamos continuar a denominação da matriz Mas_Ord_Old 'velha matriz ", enquanto que o Mas_Ord_New -" nova matriz ". Em blocos 6.8, o programa de pesquisas somente as ordens, as características de que são diferentes. Por exemplo, no bloco 6.7, a ordem está marcada para o seu número (veja a regra dos índices de correspondência com características ordem na Tabela 4). Se a velha ordem sob check-array jogos em série com uma das encomendas do novo array, isso significa que, pelo menos, esta ordem não for fechada (ou excluído). Também é necessário verificar se o tipo de ordem é alterada. Se sim, isso significa que, enquanto se aguarda uma ordem seja modificado em um mercado um. Neste caso, a mensagem correspondente é exibido usando a função Inform (). Independente sobre o fato de mudar (ou manter inalterado) da ordem tipo, esta ordem não serão analisados mais longe: o programa saídas internas do ciclo e, finalmente, começa uma nova iteração do ciclo externo. Se o programa encontrar na execução do bloco 6.7 que a velha ordem sob check-array não coincidir com qualquer número de encomendas do novo array, o controlo é passado para bloquear 7-8. Aqui, o programa verifica se a actual forma do novo array tenha um MagicNumber não zero (todas as ordens de abertura e colocado pela EA ter uma MagicNumber não zero). Se ele tem uma tal MagicNumber e este parâmetro coincide com o fim de MagicNumber a partir do antigo array sob controlo, significa que a ordem é negociada, mas foi alterada, de alguma forma. Existem duas situações quando o número de
ordem pode ser alterada. Situação 1. A ordem é parcialmente fechado. Você pode encerrar parcialmente um mercado ordem (não uma pendente um!) Em duas fases, de acordo com a tecnologia aceites em MT 4. Na primeira fase, o despacho inicial está completamente fechada. Ao mesmo tempo, uma nova ordem no mercado de um volume menor é aberta com o mesmo preço e aberto com a mesma ordem requerida para parar de preços, como no despacho inicial. Essa nova ordem obtenha o seu nome único, diferente do número do despacho inicial a ser parcialmente fechada. Situação 2. A ordem é reaberto pelo centro lidar. Alguns bancos (devido à sua contabilidade interna, as regras específicas) forcedly fechar todas as ordens no mercado no final do dia de negociação ea abertura imediata do mercado dos despachos do mesmo tipo e com o mesmo volume, mas ao preço actual e menos swap. Este evento não afeta os resultados econômicos de uma negociação em conta de forma alguma. Cada recém-inaugurado recebe o seu número exclusivo fim de que não condiz com os números das encomendas fechadas. A diferença entre as duas situações acima é do volume de novas encomendas: eles são diferentes na primeira situação, e eles mantêm-se inalterados no segundo. Essa diferença é usado em bloco 7.8 a distinção entre despachos modificada por razões diferentes. Em ambos os casos, é exibida a mensagem correspondente ( "o fim está parcialmente fechado» ou «a ordem seja reaberta"). Se o programa não tenha detectado a correspondência (blocos 6-7) ou herdar (blocos 7-8) da ordem na nova matriz pela conclusão do ciclo interno, isso significa que a velha ordem sob check-matriz está fechado ou suprimido. Neste caso, o controlo é passado ao bloco 8-9, onde uma ou outra mensagem será exibida, de acordo com o tipo de ordem. No exemplo acima, três tipos de mensagens são realizados: por fim Compra, Venda e por fim para todos os tipos de encomendas pendentes. Em um caso geral, essa seqüência pode ser ligeiramente modificado (alargada) - você pode criar um grupo de correspondentes mensagens para cada tipo de encomendas pendentes. Na segunda fase, o programa considera as novas encomendas da ordem array (bloco 9-10). Isto é feito no intuito de detectar recém-inaugurado e colocado ordens. No ciclo externo 'para', o programa busca em todas as ordens, as informações sobre o que está armazenado na matriz de novas encomendas. Com o intuito de identificar as encomendas reaberta ou parcialmente fechados, o programa utiliza uma simples característica - a disponibilidade de comentário. Ao fechar parcialmente ou reabertura de uma ordem, o servidor adiciona um comentário que dá o número do pedido inicial. A EA não usa comentários acima, de forma a disponibilidade de um comentário que significa que a ordem sob controlo, não é nova. Se uma ordem não contém um comentário, o programa procura por um despacho com o mesmo número na antiga matriz. Se o programa encontrar a ordem tendo esse número entre as antigas ordens internas no ciclo 'para', significa que a ordem não é nova, mas foi aberto antes. No entanto, se o número da encomenda a partir da nova matriz não coincidir com quaisquer ordens no antigo array, isso significa que essa ordem é um mercado aberto ou uma ordem colocada uma pendente. Na parte inferior do bloco 9-10, o programa pede para Inform função (), a fim de exibir a mensagem correspondente, de acordo com o tipo de ordem. A utilização da função considerada Eventos () acaba por ser muito útil na prática. Uma vez que utilizaram a função de um EA, o programador normalmente usa-lo no seu trabalho futuro. Deve-se notar que as funções separadamente Eventos () e Terminal () estão intimamente relacionados. Se você quer fazer alterações em uma destas funções (por exemplo, para usar outros nomes para matrizes globais), você deve fazer as alterações correspondentes na outra função. Se você usar comentários em encomendas para perceber a sua estratégia comercial, lhe deveria diferentemente do processo sucessório característico da ordem (bloco 9-10), ou seja, você deve usar funções string para analisar o comentário. A quantidade de eventos considerados na função Eventos () pode ser muito aumentada. Por exemplo, se
você quiser exibir completamente todos os eventos relacionados à ordem, você deve incluir a análise das características ordem - mudanças na forma requerida para parar de preços e na solicitou a abertura ordena pendente de preços, bem como o método de fechamento (se as encomendas forem fechadas como oposto ou ordens de cada um deles é fechado em separado) ea razão para fechar / apagar de encomendas (se o preço atingiu o nível requerido para parar de ordem ou a ordem é fechado em iniciativa do comerciante, etc.) Volume definindo função Para o seu trabalho prático, um comerciante tem de ser capaz de regular a quantidade de lotes para novas encomendas a ser aberto. É muito difícil criar uma função universal para esta finalidade, uma vez que cada estratégia comercial implica a sua gestão volume especial. Por exemplo, algumas estratégias implicam a possibilidade de trabalhar com apenas uma ordem no mercado, enquanto que outros permitem abrir novas encomendas no mercado, independentemente das já existentes.Estratégias baseadas na gestão das diferentes ordens pendentes são conhecidos, também, a existência simultânea de várias ordens de mercado e na expectativa de lhe ser permitido em alguns casos. Um dos métodos mais comuns para o cálculo do volume recém-inaugurado encomendas (para as estratégias que permitem apenas um Mercado fim de ser aberto por vez) é o método progressivo de investimentos. De acordo com este método, as cauções dos custos de cada nova ordem é proporcional à margem livre disponível no momento da comercialização. Se o mercado estiver fechado com intuito lucrativo, a quantidade permitida de lotes para a nova ordem aumenta. Se ela estiver fechada, com uma perda, esse montante será diminuída. No exemplo abaixo, o usuário-função definida Lot () é considerado que lhe permite definir o volume para recém abertura ordena utilizando uma das duas alternativas: Alternativa 1. O usuário define a quantidade de lotes para novas ordens manualmente. Alternativa 2. A quantidade de lotes é calculado de acordo com a quantia do dinheiro atribuído pelo usuário. O montante das verbas atribuídas são estabelecidos como percentual de margem livre. Funções Definidas Por Usuário Lot () bool Lot () A função calcula a quantidade de lotes para novas encomendas. Como resultado da execução da função, o valor da variável global Lots_New mudanças: a quantidade de lotes. A função retorna TRUE, se a margem livre é suficiente para a instauração de uma ordem com o montante mínimo de lotes (para o símbolo, na janela da qual é anexado à EA). Caso contrário, retorna FALSE. A função utiliza os valores das seguintes variáveis globais: § §
Lotes - volume em lotes definidos pelo usuário; Por cento - o percentual de margem livre definido pelo usuário.
Para exibir mensagem, a função usa a função Informar dados (). Se a função Inform () não está incluído no EA, nenhuma mensagem será exibida. A função Lot () que determina a quantidade de lotes é formado como incluir arquivo Lot.mqh: //--------------- -------------- ------------------- --------------------------------/ / Lot.mqh / / O código deve ser usado apenas para fins educacionais. / / - -------------- --------------------------------- --------------------
--------- 1 -/ / Função cálculo da quantidade de lotes. / / Global variáveis: / / Duplo Lots_New - a quantidade de lotes para novas encomendas (calculado) / / Duplo Lotes - a quantidade desejada de lotes definidos pelo usuário. / / Int Percentual - livre margem percentual definido pelo usuário / / Retorno valores: / / True - se há dinheiro suficiente para o volume mínimo / / Falso - se não há dinheiro suficiente para o volume mínimo //------------------------------------------------ ------ --------- ------------- 2 -bool Lot () / / Usuário-função definida ( Symb seqüência = Simbolo (); / / Símbolo One_Lot duplo = MarketInfo (Symb, MODE_MARGINREQUIRED); / /! lote custo Min_Lot duplo = MarketInfo (Symb, MODE_MINLOT); / / Min. quantidade de lotes Etapa dupla MarketInfo = (Symb, MODE_LOTSTEP); / / Passo de volume alterando Livre AccountFreeMargin duplo = (); / / Livre margem //------------------------------------------- ----- --------- ------------------- 3 -if (Lotes> 0) / / Volume é definido explicitamente .. (/ / Check-lo .. Dinheiro duplo = Muita One_Lot *; / / Ordem dos custos se (Moeda <= AccountFreeMargin ()) / / Livre margem cobre tudo .. Lots_New = Lotes; / / .. aceitar a definir uma else / / Se não é o suficiente margem livre .. Lots_New = MathFloor (Livre / One_Lot / Passo) * Etapa; / / Calcular lotes ) //----------------------------- -------------- ----- ---------------------------- 4 -else / / Se não for volume preset (/ / .. Tomar percentual if (Percentual> 100) / / Preset, mas incorretamente .. Percentual = 100; / / .. então não mais do que 100 if (Percentual == 0) / / Se 0 é predefinido .. Lots_New = Min_Lot; / / .. então o min. lote else / / quantidade desejada de lotes: Lots_New = MathFloor (Livre * Porcentagem / 100 / One_Lot / Passo) * Etapa; / / Calc ) //--------------- -------------- ------------------- ---------------------------- 5 -if (Lots_New AccountFreeMargin ()) / / Não é suficiente sequer .. (/ / .. Para o min. lote: ( Informar (11, 0, Min_Lot); / / Mensagem .. return (false); / / .. e sair ) return (true); / / user-defined função Sair ) / / - -------------- --------------------------------- ---------------------------- 6 -A função tem um simples código. No bloco 1-2, variáveis globais e devolvidos os valores são descritos. No bloco 2.3, os valores de algumas variáveis são calculadas. Para os cálculos, a seguinte prioridade na fixação de valores aceitos são: Se um usuário possui um conjunto diferente de zero
quantia de lotes, o valor do percentual de margem livre não é levado em consideração. Lotes variáveis externas e Percentual são declarados na incluem arquivo Variables.mqh. No bloco 3.4, os cálculos são feitos para a situação em que o utilizador tenha definido um valor diferente de zero do volume em lotes no exterior variável Lotes. Neste caso, o programa faz um check. Se a margem livre é suficiente para abrir um mercado com vista a definir quantidade de lotes, em seguida, o valor definido pelo usuário será atribuído à variável global Lots_New e utilizado em mais cálculos. Se a margem livre não se aplica a esse montante, em seguida, o montante máximo possível de lotes é calculado que é mais usado (ver Funções Matematicas). O controle é passado ao bloco 4.5, se o usuário tiver definido zero quantidade de lotes. Ao mesmo tempo, nós levamos em consideração o percentual de margem livre especificado pelo usuário na variável externa Percentual. O programa faz uma verificação: Se o valor for superior a cem (por cento), o valor de 100 é utilizado em cálculos. Se o usuário tiver definido a variável de valor zero por cento, a quantidade de lotes é equiparado com o mínimo possível tratar o valor fixado pelo centro.Para todos intermédio Для всех промежуточных величин высчитывается количество лотов, соответствующее количеству выделенных пользователем средств. No bloco 5.6, são feitas as verificações necessárias. Se a quantidade calculada de lotes acaba por ser inferior ao mínimo permitido um (por exemplo, valor zero podem ser obtidas no bloco 4.5, se o usuário tiver definido um pequeno valor da variável Percentual), então o valor mínimo será ser atribuídas para a variável Lots_New. Then the program checks whether there are enough free assets to open an order with the volume of the previously calculated amount of lots (there can be insufficient money on the account). Se o dinheiro disponível não é suficiente, o programa exibe uma mensagem para o usuário e saídas da função, retornando a função 'falso'. No entanto, o êxito no regresso a verificar os resultados da 'verdadeira'. Função definir os critérios de negociação O sucesso de qualquer estratégia comercial depende, principalmente, a seqüência de negociação critérios cálculos. A função que define critérios negociação é a parte mais importante de um programa e devem ser usadas sem falhas. De acordo com a estratégia de comercialização, a função pode retornar valores que correspondem aos critérios negociação particular. Em um caso geral, os seguintes critérios podem ser definidos: § § § § § § § § §
critério critério critério critério critério critério critério critério critério
para para para para para para para para para
a abertura de um mercado fim; o fechamento de um mercado fim; o encerramento parcial de um mercado fim; o encerramento do mercado ordens opostas; a solicitação de alteração de preços de um mercado pára de ordem; a colocação de uma encomenda pendente; exclusão de uma ordem pendente; abrir a solicitação de alteração de preço de uma encomenda pendente; a solicitação de alteração de preços das paragens de uma ordem pendente.
Na maioria dos casos, o desencadeamento de uma negociação exclusiva como critério está relacionado com outros critérios comerciais. Por exemplo, se o critério para a instauração de uma ordem Comprar torna-se importante em um determinado momento, isto significa que os critérios utilizados para o encerramento de ordens Comprar ou Vender de abertura ordena não pode ser importante ao mesmo tempo (veja relação dos Critérios de negociação). Ao mesmo tempo, de acordo com as regras inerentes a uma determinada estratégia de comercialização, alguns critérios podem acionar simultaneamente. Por exemplo, os critérios para o encerramento de um mercado para o fim Sell e modificação de uma ordem pendente BuyStop maio tornam-se importantes em simultâneo.
Uma estratégia comercial impõe requisitos para a utilização do conteúdo e tecnologia da função definindo critérios comerciais.Qualquer função pode retornar apenas um valor. Então, se você percebeu em seu Expert Advisor uma estratégia comercial que implica a utilização de apenas critérios comerciais mutuamente exclusivos, o valor devolvido pela função pode ser associada a um dos critérios. No entanto, se sua estratégia permite desencadeamento de vários critérios, num momento, os seus valores devem ser passados para outras funções para serem processados, utilizando variáveis globais para isso. Realizava na trading estratégia da EA abaixo implica a utilização de critérios apenas se excluem mutuamente. Esta é a razão pela qual a função Critério () para fazer passar os critérios anteriores de outras funções utiliza o valor devolvido pela função. Funções Definidas Por Usuário Critério () Critério int () A função calcula critérios comerciais. Ele pode retornar os seguintes valores: 10 - desencadeou uma negociação critério de fecho de mercado para Comprar; 20 - desencadeou uma negociação critério de abertura de mercado para Vender; 11 - desencadeou uma negociação critério de fecho de mercado para Comprar; 21 - desencadeou uma negociação critério de abertura de mercado para Vender; 0 - nenhuma critérios importantes disponíveis; -1 - A sigla usada não EURUSD. A função utiliza os valores das seguintes variáveis externas: St_min - o nível mais baixo do indicador Estocásticos Oscilador; St_max - o nível superior do indicador Estocásticos Oscilador; Open_Level - o nível do indicador MACD (por ordem de criação); Close_Level - o nível do indicador MACD (por ordem fechamento). Para exibir mensagens, a função usa a função Informar dados (). Se a função Inform () não está incluído na EA, mensagens não serão exibidas. Função definindo critérios comerciais, Critério (), é formado como incluir arquivo Criterion.mqh: //------------------------------------------------ -----------------------/ / Criterion.mqh / / O código deve ser usado apenas para fins educacionais. //------------------------------------------------ -------------------- 1 / / Função cálculo critérios comerciais. / / Retorno valores: / / 10 - abertura Comprar / / 20 - Venda de abertura / / 11 - fechando Comprar / / 21 - Venda de fechamento / / 0 - não há critérios importantes disponíveis / / -1 - Outro símbolo é usado //------------------------------------------------ -------------------- 2 / / Variáveis externas: extern int St_min = 30; / / estocástica nível mínimo extern int St_max = 70; / / nível máximo estocástica extern dupla Open_Level = 5; / / MACD nível de abertura (+/-) extern dupla Close_Level = 4; / / MACD nível do fechamento (+/-) //------------------------------------------------ -------------------- 3 Critério int () / / Usuário-função definida
( string Sym = "EURUSD"; if (Sym! = Symbol ()) / / Se é um símbolo errado ( Informar (16); / / Mensagens .. retorno (- 1); / / .. e sair ) dupla M_0, M_1, / / Valor PRINCIPAIS em barras 0 e 1 S_0, S_1, / / Valor SINAL em barras 0 e 1 St_M_0, St_M_1, / MAIN Valor em barras 0 e 1 St_S_0, St_S_1; / / Valor SINAL em barras 0 e 1 Opn duplo = Open_Level * Point; / / Abertura do nível MACD (pontos) * Cls = dupla Close_Level Point; / / Encerramento do nível MACD (pontos) //------------------------------------------------ -------------------- 4 / / M_0 bar M_1 bar S_0 bar S_1 bar
Parâmetros de indicadores técnicos: = iMACD (Sym, PERIOD_H1, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 0); / / 0 = iMACD (Sym, PERIOD_H1, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1); / / 1 = iMACD (Sym, PERIOD_H1, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 0); / / 0 = iMACD (Sym, PERIOD_H1, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 1); / / 1
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 Opn & & St_M_0 St_max) regresso (20); / / Abertura Vender if (M_0 Cls & & St_M_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 56): if (M_0> s_0 & & - M_0> Opn & & St_M_0> St_S_0 & & St_S_0
no indicador MACD, indicador linha PRINCIPAIS (histograma) é indicador acima e abaixo da linha SIGNAL Open_Level nível mais baixo (Fig. 157); no indicador Estocásticos Oscilador, indicador linha PRINCIPAIS (histograma) é indicador acima e abaixo da linha SIGNAL St_min nível mais baixo (Fig. 158).
Рис. 157. Condição necessária do indicador MACD linha posições para confirmar a importância da negociação critérios para abertura e fechamento das ordens. Na parte esquerda do gráfico. 157, as posições do indicador MACD linhas é mostrado, na qual dois critérios gatilho - abertura de Compra e Venda de fechamento. PRINCIPAIS linha indicador está abaixo do nível de 0,0005 no prazo de T1 = t 1 - t 0. Se as indicações necessárias Estocásticos Oscilador de ocorrer, neste momento, o critério para abertura de Compra irá desencadear.PRINCIPAIS linha está abaixo do nível de 0,0004 no prazo T2 = t 2 - t 0. Se as indicações de Estocásticos Oscilador confirmar esta posição, o critério para o encerramento do Sell irá desencadear. Observe que, formalmente, os dois critérios acima acionar dentro T1 (se for confirmado pelo Estocásticos Oscillator). Foi mencionado anteriormente que o critério considerado função () retorna apenas um valor, ou seja, o valor atribuído a um critério acionados. Durante este período, torna-se necessário escolher um dos critérios. Este problema é resolvido de forma antecipada, durante a programação, de acordo com as prioridades prescritos pela estratégia comercial. Neste caso (de acordo com a estratégia comercial considerado "), a prioridade de abertura Comprar uma ordem é superior ao valor de fecho Vender um fim. Esta é a razão pela qual, no bloco 5.6, o programa linha, na qual o critério para abertura de Compra, está posicionado acima. Se durante o período de T1 (Fig. 157), temos a confirmação do Estocásticos Oscilador, a função retorna 10 atribuídas a este critério. Dentro do período de t1 para t2, a função retornará 21 atribuídas ao fechamento Vender critério. Ao mesmo tempo, a execução de funções comerciais, as necessárias trocas pedidos será formada. Pelo critério para o desencadeamento da Comprar abertura de, em primeiro lugar, o comércio pedidos de fechamento de todos os meios disponíveis Vender encomendas serão formadas. Logo que essas ordens não são esquerda, abertura de uma ordem Comprar serão solicitados. Respectivamente, quando o critério de fecho de ordens Vender triggers, uma sequência de pedidos de comércio só fecho de todas as encomendas serão formadas Sell (ver Funções do Comércio). As condições, nas quais a desencadeantes Estocásticos Oscilador confirmação, são mostrados na fig. 158.
Fig. 158. Condição necessária da Estocásticos Oscilador indicador linha posições para confirmar a importância da negociação critérios para abertura e fechamento das ordens. De acordo com o programa código especificado no bloco 5.6, os critérios para abertura de Compra e Venda de fechamento pode se tornar importante indicador desde a linha PRINCIPAIS tornar-se em cima do sinal na linha SIGNAL Estocásticos Oscilador, linha PRINCIPAIS estar abaixo do nível mínimo St_min. Na fig. 158, tais condições são formadas no período de Ts. As condições espelhado confirmar o desencadeamento de critérios para a abertura da ordem Sell e fechamento da ordem Buy (na parte direita do gráfico. 158). Se nenhum critério tem desencadeado, a função retorna 0. Outras rotas podem ser feitas sob estas condições, por exemplo, correção de parar o nível exigido. Deve ser notado que o considerado separadamente estratégia comercial implica o uso das indicações produzidas por MACD calculada sobre o horizonte temporal de uma hora, enquanto que Estocásticos Oscilador é calculada sobre os 15 minutos de timeframe.The prazo pode ser mudado durante o ensaio, a fim de otimizar a estratégia. No entanto, após análise, no final do código da função Critério (), é necessário especificar valor constante para todos os parâmetros calculados, incluindo datas. A EA deve ser utilizada somente sob as condições, para os quais foi criado. No exemplo acima (com os valores de PERIOD_H1 e PERIOD_M15 especificados expressamente na indicadores), a EA irá considerar apenas os parâmetros necessários, independentemente do actual calendário definido na janela do símbolo, onde foi lançado o EA. Negociação critérios aceites neste dado EA são utilizados para fins de formação e não deve ser considerado como um guia para operações quando uma verdadeira negociação em conta. Comércio Funções Como regra geral, uma normal Expert Advisor contém uma série de funções comerciais. Eles podem ser divididos em duas categorias - controle e funções executivas. Na maioria dos casos, apenas uma função de controlo e de várias funções executivas são usados em uma EA. Uma estratégia comercial normal em um EA é realizada com base em duas funções - uma função definir os critérios comerciais e uma função de controlo comércio. Não deve haver quaisquer indícios da estratégia comercial em qualquer outro lugar no programa. O controlo do comércio funções e
definindo a função comercial critérios devem ser coordenados entre si, os valores dos parâmetros elas passam. Cada um tem uma função executiva comércio leque de tarefas especiais. De acordo com as exigências da estratégia de comercialização, comércio funções destinados às seguintes tarefas podem ser usados em uma EA: § § § § § § § § § § § §
abertura de um mercado da ordem do modelo predefinimos; fechando um mercado da ordem predefinida tipo; parcialmente fechando um mercado da ordem predefinida tipo; fechando todos os mercados a fim de preset tipo; oposto duas ordens de fechamento do mercado no preset volume; fechando todas as ordens no mercado; modificação de ordens stop de um mercado da ordem predefinida tipo; a colocação de uma encomenda pendente do modelo predefinimos; uma pendência apagamento da ordem do modelo predefinimos; supressão de todas as encomendas pendentes do modelo predefinimos; supressão de todas as encomendas pendentes; modificação de uma ordem pendente do modelo predefinimos.
A negociação geral em uma seqüência normal Expert Advisor consiste no seguinte: com base no cálculo (de acordo com a estratégia utilizada) critérios comerciais, o controlo do comércio função (também perceber a estratégia) alguns convites ou outros executivos comércio funções que, na sua por sua vez, constituem o comércio necessário solicitar. User-Defined Controladoria Função Comércio () int Comércio (int Trad_Oper) É a função básica de que percebe sua estratégia. Trad_Oper parâmetro pode ter os seguintes valores correspondentes a negociação com os critérios: 10 - desencadeou uma negociação critério para a abertura de um mercado para comprar; 20 - desencadeou uma negociação critério para a abertura de uma ordem Sell mercado; 11 - desencadeou uma negociação critério para o encerramento de um mercado para comprar; 21 - desencadeou uma negociação critério para o encerramento de um mercado para Vender; 0 - nenhuma critérios importantes disponíveis; -1 - A sigla usada não EURUSD. Para executar a função, as seguintes funções comerciais são exigidos: § § § §
Close_All () - função da suspensão de todas as ordens no mercado do modelo predefinimos; Open_Ord () - função abrindo um mercado da ordem predefinida tipo; Tral_Stop () - função modificar StopLoss de um mercado da ordem do modelo predefinimos; Lote () - função detectar a quantidade de lotes para novas encomendas.
Os controladores de comércio Trade função () é formado como incluir arquivo Trade.mqh: //---- ---- ---------------------------------------- ----------------------/ / Trade.mqh / / O código deve ser usado apenas para fins educacionais. //-------- ---- ------------------------------------ ----------------------/ / Comércio função. //------------ ---- -------------------------------- ------------------- 1
-int Comércio (int Trad_Oper) / / Usuário-função definida ( / / Trad_Oper - tipo de operação comercial: / / 10 - abertura Comprar / / 20 - Venda de abertura / / 11 - fechando Comprar / / 21 - Venda de fechamento / / 0 - não há critérios importantes disponíveis / / -1 - Outro símbolo é usado switch (Trad_Oper) ( //---------- ---- ---------------------------------- ------------- 2 -caso 10: / / = Trading critério Comprar Close_All (1); / / Fechar todas Vender if (Lot () == false) / / Nem dinheiro suficiente para min. retorno; / / Sair do usuário-função definida Open_Ord (0); / / Open Comprar retorno; / / Tendo comercializado, deixe //----------- ---- --------------------------------- ---------- 3 -caso 11: / / Trading critério = fechamento Comprar Close_All (0); / / Fechar todas Comprar retorno; / / Tendo comercializado, deixe //--------------- ---- ----------------------------- ---------- 4 -caso 20: / / Trading critério = Vender Close_All (0); / / Fechar todas Comprar if (Lot () == false) retorno; / / Sair do usuário-função definida Open_Ord (1); / / Open Vender retorno; / / Tendo comercializado, deixe //------------------- ---- ------------------------- ---------- 5 -caso 21: / / Trading critério = fechamento Vender Close_All (1); / / Fechar todas Vender retorno; / / Tendo comercializado, deixe //----------------------- ---- --------------------- ---------- 6 -caso 0: / / Retenções posições abertas Tral_Stop (0); / / Trailing stop Comprar Tral_Stop (1); / / Trailing stop Vender retorno; / / Tendo comercializado, deixe //--------------------------- ---- ----------------- ---------- 7 -) ) //------------------------------------------------ ------------------- 8 Os controladores de comércio Trade () é chamada de função especial a iniciar () da Expert Advisor usualexpert.mq4. O valor devolvido pela função comercial definindo critérios Critério () é dado como o parâmetro passou a funcionar no Comércio (). No bloco 1.2 a função de Comércio (), o comércio percebeu critério considerado pela estratégia comercial são descritos. Na função, usamos o operador switch () (blocos 2-7) que nos permite activar o grupo de funções exigidas às trocas comerciais, de acordo com o critério. De acordo com a estratégia de comercialização, o mercado abre e fecha EA ordens. Nenhuma operação com encomendas pendentes são prestados por esta estratégia comercial. Na seção denominada Função Definir Critérios de negociação, foi especificado que, para algumas trocas critérios do programa podem formar várias solicitações comerciais. Assim, no caso do critério importante para a compra (o valor da variável Trad_Oper é igual a 10), o controlo é passado para a marca "Casa 10" (blocos 2-3) durante a execução do operador switch ().Neste caso, o programa convida a primeira função Close_All (1). A execução desta função resulta em fechamento de todas as ordens no mercado aberto para Vender o símbolo EURUSD. Depois de todas as ordens Vender foram
fechadas, o dinheiro disponível está marcada para saber se é suficiente para tornar o comércio próximo. Para este efeito, o usuário-função definida Lot () é chamado (ver Volume Detecção de Função). Se esta função retorna 'falso', significa que o dinheiro disponível na conta não é o suficiente para abrir com o fim Buy permitidas montante mínimo dos lotes. Neste caso, a função do Comércio () termina as suas operações. Se não há dinheiro suficiente, o comércio função Open_Ord (0) é chamado para abrir um mercado para comprar com o valor dos lotes calculada em função da execução do Lote (). O conjunto de ações descritas representa o Consultor Especialista da resposta à situação do mercado (de acordo com o critério determinado tráfego). Se o critério é importante que chama a atenção para a necessidade de fechar o mercado ordens Comprar, o controlo é passado para a marca "Casa 11" em bloco 3.4. Neste caso, apenas uma função Close_All (0) é chamado para fechar todas as ordens do tipo Buy disponíveis. 4.6 blocos são construídos na maneira semelhante a blocos 2.4, o controlo é passado a marca «caso 20 'e' caso 21 ', se os critérios para a venda ou encerramento do mercado ordens Vender tornam-se importantes. Observe que todas as funções executivas que fazem trocas comerciais pedidos são chamados na Trade função () que, por sua vez, é chamado a execução da EA especiais da função start () lançada pelo cliente terminal como resultado de um novo carrapato incoming. O código da função Comércio () está escrito de forma a que o controlo não é devolvido para a função start () (e, no final, para o cliente terminal) até que todos os requeridos comércio funções executivas são executados. Essa é a razão pela qual todas as rotas comerciais destinados a cada critério são feitas pela EA, uma a uma, sem pausas. A exceção pode ser o caso de erros críticos que ocorrem durante a realização de transacções (ver Erro de Processamento de Função). Se não houver negociação é detectado como critério importante (Trad_Oper variável é igual a 0) na execução da função Critério (), o controlo é passado para a marca 'caso 0', o que resulta numa dupla chamada para Tral_Stop função () para modificar os valores de mercado solicitado encomendas de diferentes tipos. A estratégia comercial realizada nesta EA permite a existência de um mercado único fim, de modo a sequência de chamadas para as funções Tral_Stop (0) e Tral_Stop (1) não importa. Neste caso, é uma escolha aleatória. Se a função Critério () tenha devolvido o valor de -1, isto significa que a EA vem junto à janela de um símbolo que não é EURUSD. Neste caso, a função do Comércio () não chama a qualquer comércio funções executivas e retorna o controlo para iniciar a função especial () que se manifestou a ele.
User-Defined Executivo Função Close_All Comércio () int Close_All (int Sugestão) A função fecha todas as ordens no mercado do mesmo modelo. O parâmetro Sugestão pode ter os seguintes valores correspondentes com os tipos de ordens que devem ser fechados: 0 - Comprar ordens de fechamento; 1 - Vender ordens de fechamento. Para executar a função, é necessário aplicar os princípios de ordem contabilística função Terminal (), caso a função de monitoramento Eventos () e do erro ao processar função Erros () no programa. Para exibir as mensagens, a função implica a utilização de dados da função Inform (). Se a função Inform () não está incluído na EA, mensagens não serão exibidas. Os valores das seguintes matrizes globais são utilizados: §
Mas_Ord_New - o conjunto de características de ordens disponíveis a partir do momento da
§
função Terminal () execução; Mas_Tip - a matriz do montante total das encomendas de todos os tipos a partir do momento da última execução da função terminal ().
O comércio funções executivas Close_All () é formado como incluir o arquivo Close_All.mqh: / / - ------------- --------------------------------- -------------------------------/ / Close_All.mqh / / O código deve ser usado apenas para fins educacionais. //--------------- ------------- -------------------- --------------------------- 1 -/ / Função fechando todas as ordens no mercado a determinado tipo de / / Global variáveis: / / Último conhecidos Mas_Ord_New fim array / / Mas_Tip Ordem tipo array //---------------------------- ------------- ------- --------------------------- 2 -int Close_All (int Sugestão) / / Usuário-função definida ( / / Int Sugestão / / Tipo de Ordem Bilhete int = 0; / / Portaria bilhete Lote duplo = 0; / / Quantidade de lotes fechados Price_Cls duplo; / / Portaria fechar preço //----------------------------------------- ------- ------ --------------------- 3 -while (Mas_Tip [Dica]> 0) / / Enquanto os despachos do .. (/ / .. determinado tipo estão disponíveis for (int i = 1; i <= Mas_Ord_New [0] [0]; i + +) / / Ciclo para viver encomendas ( if (Mas_Ord_New [i] [6] == Dica & & / / Entre as ordens do nosso tipo Mas_Ord_New [i] [5]> Lote) / / .. selecionar o mais caro um (/ / Essa foi encontrado em um mais antigo. Lote = Mas_Ord_New [i] [5]; / / A maior quantidade de lotes encontrados Bilhete Mas_Ord_New = [i] [4]; / / O seu intuito é que o bilhete ) ) if (Tip == 0) = Price_Cls lance; / / Para encomendas Comprar if (Tip == 1) = Pergunte Price_Cls; / / Para encomendas Vender Informar (12, Bilheteira); / / Mensagem sobre uma tentativa de encerrar bool = OrderClose Ans (Bilhete, Lot, Price_Cls, 2); / / Fechar fim!:) //------------------------------------------------ ------------- --------4 -if (Ans == false) / / Falha: ( (/ / Verificar se há erros: if (Erros (GetLastError ()) == false) / / Se o erro é crítico, retorno; / / .. em seguida, sair. ) / / - ------------- ---------------------------------- --------------------- 5 -Terminal (); / / Portaria função contabilística Eventos (); / / Evento de monitoramento ) retorno; / / Sair do usuário-função definida ) //-------------------- ------------- --------------- --------------------------- 6 -No bloco 1.2, as variáveis globais utilizadas são descritas. No bloco 2-3, variáveis locais são abertos e descritos. A condição Mas_Tip [Dica]> 0 na posição do operador do ciclo 'enquanto' (blocos 3-6)
implica que vai exercer a função de controle até que ela atende a sua finalidade, ou seja, até que todas as encomendas de determinado tipo são fechados . O elemento do array global Mas_Tip [Dica] contém o valor igual ao montante das ordens de determinado tipo de Dica. Por exemplo, se a função Close_All () é chamado com os parâmetros transferidos igual a 1, isto significa que a função deve fechar todas as ordens no mercado Sell (ver Tipos de Ofícios). Neste caso, o valor do elemento Mas_Tip array [1] será igual ao montante disponível de ordens Sell (última conhecida como do momento da execução da função Terminal ()). Assim, o ciclo operador 'enquanto' será executado tantas vezes quantas Vender despachos estão disponíveis. Se o comerciante não intervém nas operações da EA (ou seja, ele ou ela não colocar ordens manualmente), então apenas um mercado de um modo ou de outro tipo podem estar disponíveis no comércio. Contudo, se o comerciante possui adicionalmente colocado no mercado uma ou várias ordens por sua própria iniciativa e, em seguida, uma certa seqüência de ordens devem ser mantidos à execução da função Close_All (). Preferível a seqüência de fechamento é ordens para fechar as maiores, em primeiro lugar. Por exemplo, se existem três ordens de venda como o momento de começar a executar a função Close_All (), uma delas sendo aberta por 5 lotes, sendo aberta para um outro lote 1, o terceiro e um a ser abertos por 4 lotes, em seguida, as encomendas serão encerradas na seguinte seqüência de acordo com a argumentação: o primeiro fim de ser fechado será o de 5 lotes, que depois de 4 lotes, ea última será da ordem de 1 lote. Observe que a quantidade de lotes é o único critério utilizado para determinar a seqüência de ordens de fechamento. A fim de ganhos / perdas, abra o preço, bem como outros parâmetros caracterizando o fim (da ordem requerida para parar de preços, a hora eo motivo do fechamento, etc) não são considerados. Todas as ordens no mercado de um determinado tipo deve ser fechada, se o critério para o encerramento das encomendas deste tipo é importante, sendo a seqüência de fechamento do maior para o menor volume. 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: bool = OrderClose Ans (Bilhete, Lot, Price_Cls, 2); / / Fechar fim!:) Os valores calculados são utilizados como parâmetros: Ticket - número de ordem, Lote - volume em lotes, Price_Cls - solicitou fechar preço, 2 - derrapagem. No bloco 4.5, o comércio resultados são analisados. Se a função OrderClose () retornou 'verdadeira', isto significa que o comércio tenha sido concluído com êxito, ou seja, a ordem tenha sido encerrada. Neste caso, o controlo é passado ao bloco 5-6, onde as informações sobre encomendas disponível no atual momento é atualizado. Após a execução de funções Terminal () e Eventos (), a atual iteração do ciclo 'enquanto' termina (a quantidade disponível de ordens pode mudar dentro da função durante o tempo de execução e fazer novas aquisições, de modo a execução da ordem
contabilística função é obrigatório, em cada iteração do ciclo 'enquanto'). Se as ordens do mesmo tipo estão ainda disponíveis no comércio, que será encerrada na próxima iteração do ciclo 'enquanto', os novos valores dos elementos das matrizes Mas_Ord_New e Mas_Tip obtidas durante a execução da função Terminal () sendo utilizada para a determinação dos parâmetros do próximo fim de ser encerrada. Se a execução do pedido de que os resultados em função OrderClose () retorna "falso", isso significa que a ordem não foi fechado. A fim de informar-se sobre as razões deste fracasso, o programa analisa o último erro ocorrido na tentativa de tornar o comércio. Para o efeito, apela para a função Erros () (ver Erro de Processamento de Função). Se, a execução desta função, o programa detecta que o erro é crítica (por exemplo, o comércio é proibido), a função Close_All () termina as suas operações e retorna o controle para controlar o comércio funcionar Comércio (), que acabou por resultar em que a função especial start90 da EA termina a sua execução, bem como. Na próxima carrapato, o terminal irá lançar a função start () para execução de novo. Se fechar o critério permanece real naquele momento, isso irá produzir a chamada para a função da suspensão de todas as ordens, Close_All ().
User-Defined Executivo Função Open_Ord Comércio () int Open_Ord (int Sugestão) A função abre um mercado da ordem de determinado tipo. O parâmetro Sugestão pode ter os seguintes valores correspondentes com os tipos de ordens a serem abertos: 0 - Comprar o tipo de encomendas para ser aberto; 1 - Vender o tipo de encomendas a ser aberto. Para executar a função, você deve usar o programa em função da ordem contabilística Terminal (), caso a função de monitoramento Eventos () e do erro ao processar Erros função (). Para exibir as mensagens, a função implica a função Informar dados (). Se a função Inform () não está incluído na EA, mensagens não serão exibidas. Os valores das seguintes variáveis globais são utilizados: § § §
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).
O comércio funções executivas Open_Ord () que incluirá arquivo é formado Open_Ord.mqh: //--------------------------------- ------------- -- -------------------------------/ / Open_Ord.mqh / / O código deve ser usado apenas para fins educacionais. //---------------------------------------------- -- ----------- ---------------- 1 -/ / Função abrindo um mercado da ordem de determinado tipo / / Global variáveis: / / Int Mas_Tip Ordem tipo array / / Int StopLoss O valor de StopLoss (quantidade de pontos) / / Int TakeProfit O valor de TakeProfit (quantidade de pontos) //------------------------------------------------ ----------- ------------ ---- 2 -int Open_Ord (int Sugestão) (
int Ticket, / / Order bilhete MN; / / MagicNumber dupla SL, / / StopLoss (como as relacionadas com o preço) TP; / / TakeProf (como as relacionadas com o preço) / / - ------------- ---------------------------------- --------------------------- 3 -while (Mas_Tip [Dica] == 0) / / Até eles .. (/ / .. suceder if (StopLoss
comércio. De acordo com o tipo de ordem, o corpo de um dos operadores do 'se' é executado. Por exemplo, se o valor do parâmetro transferido Sugestão é igual a 0, isso significa que uma ordem Comprar devem ser abertas. Neste caso, os valores de StopLoss e TakeProfit são calculados com que correspondem a ordem Comprar tipo, em seguida, o controlo é passado para a linha 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.
User-Defined Executivo Função Tral_Stop Comércio () int Tral_Stop (int Sugestão) A função modifica todas as ordens no mercado do mesmo modelo. O parâmetro Sugestão pode ter os seguintes valores correspondentes com o tipo de encomendas a ser modificada: 0 - Comprar o tipo de ordens, de ser modificado; 1 - Vender o tipo de encomendas a ser modificado. Para executar a função, é necessário utilizar o programa em função da ordem contabilística Terminal (), caso a função de monitoramento Eventos (), e os erros erro ao processar função (). Para exibir as mensagens, a função implica a função Informar dados (). Se a função Inform () não está incluído na EA, mensagens não serão exibidas. Os valores das seguintes variáveis globais são utilizados: § §
Mas_Ord_New - o conjunto de características de ordens disponíveis a partir do momento da última execução da função Terminal (); TralingStop - a distância entre o preço de mercado e ao valor desejado do preço requerido para StopLoss (quantidade de pontos).
O comércio funções executivas Tral_Stop () que incluirá arquivo é formado Tral_Stop.mqh: //--------------------------- ------------- -------- -------------------------------/ / Tral_Stop.mqh
/ / O código deve ser usado apenas para fins educacionais. //-------------- ------------- --------------------- --------------------------- 1 -/ / Função modificando StopLosses de todas as ordens de determinado tipo / / Global variáveis: / / Último conhecidos Mas_Ord_New fim array / / Int TralingStop Valor da TralingStop (quantidade de pontos) / / - ------------- ---------------------------------- --------------------------- 2 -int Tral_Stop (int Sugestão) ( int Ticket; / / Portaria bilhete dupla Preço, / / Mercado Aberto ordem preço TS, / / TralingStop (como as relacionadas com o preço) SL, / / Valor da ordem StopLoss TP; / / Valor da ordem TakeProfit Modificar bool; / / Um critério para modificar. //------------------------------------------------ ----- ---------- ------------ 3 -for (int i = 1; i <= Mas_Ord_New [0] [0]; i + +) / / ciclo para todas as encomendas (/ / Busca de encomendas do mesmo modelo if (Mas_Ord_New [i] [6]! = Dica) / / Se não for esse o nosso tipo .. continuar; / / .. ignorar a ordem Modificar = false; / / Não é atribuído a ser modificado Preço = Mas_Ord_New [i] [1]; / / Portaria abertas preço SL = Mas_Ord_New [i] [2]; / / Valor da ordem StopLoss TP = Mas_Ord_New [i] [3]; / / Valor da ordem TakeProft Bilhete Mas_Ord_New = [i] [4]; / / Portaria bilhete if (TralingStop / / Se for maior do que nós queremos .. NormalizeDouble (Pergunte + TS, Dígitos) | | NormalizeDouble (SL, Dígitos) == 0) / / .. ou zero (!) (/ / .., Em seguida, modificá-lo SL = Peça + TS; / / O seu novo StopLoss Modificar = true; / / Atribuída a ser modificado. ) ) / / Fim de 'mudar' if (Modify == false) / / Se não há necessidade de modificá-lo .. continuar; / / .., em seguida, continuar o ciclo bool = OrderModify Ans (Bilhete, Preço, SL, TP, 0); / / modificar isso! //----------------------------------------------- -- ------------ --------- 5 -if (Ans == false) / / Falha: ( (/ / Verificar se há erros: if (Erros (GetLastError ()) == false) / / Se o erro é crítico, retorno; / / .. então sair.
i -; / / contador Decrescente ) Terminal (); / / Portaria função contabilística Eventos (); / / Evento de monitoramento ) retorno; / / Sair do usuário-função definida ) / / - ------------- ---------------------------------- --------------------------- 6 -Em blocos 1.3, são descritas as variáveis globais que são utilizados na função, bem como as variáveis locais são abertos e descritos. No ciclo 'para' (blocos 3-6), os despachos do mesmo tipo são selecionados e, se for o StopLoss de qualquer dessas encomendas é maior a partir do preço atual do que o que foi definido pelo usuário, a ordem é modificada. Para tornar o código mais orientada para os humanos, os valores de alguns elementos do array fim Mas_Ord_New são atribuídos a simples variáveis (blocos 3-4). Em seguida, a necessária verificação será feita para a variável TralingStop: Se o valor dessa variável é inferior ao mínimo permitido distância definida pelo tratamento no centro, ela será aumentada até o valor mínimo permitido. No bloco 4.5, de acordo com o tipo de ordem, são necessários cálculos feitos. Por exemplo, se o valor do parâmetro transferido Sugestão é 1 (um fim Venda de deveriam ser modificados), o controle será passado para a marca 'case 1' do operador 'mudar'.A necessidade de alterar a ordem StopLoss aqui está marcada (de acordo com as regras que se aplicam a este tipo de ordem, ver Requisitos e Limitações em Making Ofícios). Se não for definido StopLoss ou se ele estiver definido sobre uma distância maior do que o valor de TralingStop a partir do preço corrente de mercado, o novo valor desejado de StopLoss é calculado. Trade pedido de alteração da ordem é formada em linha: 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 realtime. 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.
Erro ao processar erros personalizado função () bool Erros (Error int) A função retorna TRUE, se o erro é overcomable. Caso contrário, retorna FALSE. O Erro de parâmetro pode ter qualquer valor e correspondem a nenhum código de erro que ocorreu durante a tentativa de fazer um comércio. O usuário-definidas erro ao processar Erros função () é concebido como incluir o arquivo Errors.mqh: //------------------------------------------------ -------------------/ / 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 Utilização de programas enlaçado só faz sentido se a continuidade de um programa execução é efetivamente utilizado. Por exemplo, um tal programa pode processar um comerciante de controle da ações. A alteração das coordenadas de objetos gráficos ou o fato de atribuir a outros programas - scripts e os indicadores podem ser considerados como controlar as acções. Um programa simples pode responder a alguns eventos (incluindo iniciou-usuário) a iniciar uma regular da função especial start () sobre a aproximação de carrapato, como uma regra. Enquanto uma ciclada programa pode processar todas as ocorrências (!). Neste caso, a defasagem pode ser apenas por um curto espaço de tempo, não mais do que o tempo de execução de um ciclo de início () função (não mais que cerca de 10-100 ms). Um programa complexo pode usar objetos gráficos para apresentar características ou regras fim da sua modificação. Por exemplo, as encomendas de todos os tipos são mostrados em uma janela de segurança
nas linhas verdes, pára de ordens - em linhas vermelhas. E se várias ordens são mostradas na tela ao mesmo tempo, é muito difícil de detectar em que linha pertence a este ou aquele fim. Mas, se aplicarmos o objeto gráfico "linha horizontal" de uma cor eo estilo necessário para cada linha fim, será muito mais fácil de diferenciar entre as suas ordens e ordens stop. Além disso, o fato de mudar as coordenadas desses objetos podem ser percebidos por um programa como um guia para a acção. Por exemplo, se um usuário muda uma linha horizontal mostrando uma ordem pendente até vários pontos, como resultado desta acção, o programa pode formulário e enviar para o servidor um pedido comércio, segundo a qual a ordem deve ser modificada, ou seja, abrir o preset preço devia ser aumentado em vários pontos (para uma execução imediata da utilização de um programa furado é obrigatória). Assim, um programa complexo pode oferecer a possibilidade de gerir negociação utilizando um rato. Função utilizada para modificação de distintas ordens de stop-declarada aberta ou um preço de uma ordem podem ser utilizados em programas complexos também. Se tal função disso é usado para um fim de linha, um objeto gráfico, por exemplo, "uma seta" pode ser exibido próximo ao fim linha, o indicativo de função atividade. Usando objetos gráficos que você pode configurar o cenário comercial. Por exemplo, determinando o "pivô" bandeira a alguma distância a partir do preço atual, você pode informar ao programa que é necessário para fechar a abrir uma nova ordem e uma na direção oposta quando o preço especificado for atingido. Da mesma forma que você pode especificar modificação nível limites, a fim preço de fecho, etc dentro do programa. A utilização de objetos gráficos que exibem as configurações de um programa aumenta consideravelmente a sensibilização do profissional sobre acontecimentos actuais e planeadas. Sinais sonoros associados a eventos são também utilizados em programas complexos. Usar soa em um programa permite que o profissional de deixar o PC através de eventos e orientar pelos tipos de sinais sonoros (melodias, vocalizado texto, etc). A eficácia da negociação depende muitas vezes do fato se o tempo de importantes políticos e econômicos comunicado de imprensa é tida em conta. Grande maioria dos centros fornecem que tratam os comerciantes com a lista das notícias mais próxima para a semana com a indicação da importância e do tempo. As informações sobre próximos eventos é gravada em um arquivo. Durante a operação um programa lê as informações do arquivo e executa um ou outro cenário comercial, em função da importância de um próximo evento. Por exemplo, um programa pode apagar encomendas pendentes, modificar ordens de stop-ordens no mercado, etc Pouco antes da importante notícia vem o programa pode encerrar a negociação - feche todas as encomendas, informando preliminarmente um comerciante. Automatizado e manual de Programas Modo de operação Um programa complexo é caracterizado por um algoritmo mais complexo de eventos de transformação. Particularmente, este programa pressupõe algum tipo de reação a um comerciante da interferência com o processo de negociação. Por exemplo, se uma estratégia comercial permite que apenas um mercado e uma ordem profissional abre mais um fim, um programa complexo, em primeiro lugar, controla este tipo de evento e, em seguida, inicia a execução do algoritmo parte desde uma ocasião para tal.O programa pode avisar um comerciante cerca de uma interferência não autorizada, num primeiro momento, e oferecer-se para apagar a estranha forma independente. Caso isso não aconteça, o programa (dependendo das configurações) pode excluir a ordem ímpar ou sair do modo de negociação automática informando que o profissional anteriormente. Se um programa é iniciado pela execução quando já existem múltiplas encomendas feitas, as ações necessárias serão realizadas em função da sua configuração. Por exemplo, o programa pode fechar todas as ordens sem um comerciante oposto do acordo.Se uma estratégia comercial não permite
encomendas pendentes, serão apagados na seqüência prioridade - o primeiro, mais próximo da cotação no mercado e, em seguida, os mais caros, etc Uma vez que o profissional tem defina a quantidade e qualidade dos limites das encomendas, em uma estratégia de comercialização, o programa (trabalhando o tempo todo e acompanhamento dos eventos) pode propor um comerciante para activar o modo de negociação automática, e se um comerciante aceita, designar a prossecução negociação cenário usando objetos gráficos. Cada comerciante tem seu próprio conjunto de preferências quando se trabalha com um programa. Alguns comerciantes admitem apenas a negociação automática, outros comerciantes - semiautomatizada, terços preferem apenas o modo manual.Um programa projetado corretamente deverá abranger todos os requisitos, ou seja, deve ter um número de configurações que fornecem diferentes modos de utilização. Por exemplo, um programa pode agir como um conselheiro no modo manual de trabalho - apresentam um texto contendo recomendações direta e também objetos gráficos mostrando uma tendência rumo, previsão pivô pontos, etc Um programa pode pedir a um comerciante para permitir a fim de abrir, admitir comerciante interferência nas decisões de gestão (por exemplo, manual ordens stop-modificação) enquanto trabalha no modo semi-automatizado. No caso, o programa está sendo executado em modo automático a qualquer profissional da interferência no processo de negociação pode ser considerada como um sinal de mudança do modo de semi-automáticas ou manuais.
Todas as propriedades de descrita um programa pode ser traduzido em linguagem de programação MQL4 a base que é especialmente concebido para o efeito. Um programa complexo projetado corretamente tem várias vantagens inegáveis, um comerciante rapidamente se acostuma-los e começa a utilizá-los na negociação. Apêndices
§
Glossário. Conceitos e termos utilizados.
§
Tipos de Trades. Tipos de ordens que podem ser utilizados em Metatrader Cliente Terminal 4.
§
Limitações e exigências em Making Trade. Algumas limitações para a abertura, encerramento, modificar e apagar ordens.
§
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.
§
Estilos de Linhas Exibindo Indicator. Custom indicadores permitem que você exiba as informações gráficas usando diferentes estilos. O estilo pode chamar DRAW_LINE linhas de largura e um estilo predefinidos. Para DRAW_ARROW estilo é necessário especificar o código exibido na seta Enrolamentos formato. O estilo DRAW_SECTION usa um indicador-tampão, enquanto o indicador DRAW_ZIGZAG estilo requer dois buffers: mesmo e ímpar. Sabendo estilos de desenho permite-lhe combinar diferentes métodos de informações mostrando em um indicador.
§
Propriedades e tipos de objetos gráficos. Lá estão 24 built-in objetos gráficos que podem ser criadas através de um programa. Esse recurso permite a fornecer indicadores EAs e com abundantes visualização ferramentas adicionais. Propriedades como objeto comum, por exemplo, junção ponto objeto e cores podem ser definidas, bem como propriedades de um objeto individual gráfica. Quando algumas propriedades foram objeto alteradas, o objeto pode ser imediato (forcedly) redesenhado usando o WindowsRedraw () 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.
§
Função MessageBox () Retorno Códigos. O MessageBox () Esta função permite que você organize a interação entre um programa e um usuário durante o processo de execução directa. Processamento de códigos de retorno a MessageBox () permite a janela para orientar os programas em execução, dependendo do botão pressionado por um usuário. Isso torna o programa mais flexível.
§
Consulta Identificadores Utilizado na MarketInfo () Função. O MarketInfo () função lhe permite obter informações sobre diferentes uma conta comercial e de propriedades comerciais de segurança do servidor.
§
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.
§
Application Program é um programa codificado em MQL4 e utilizado em Metatrader Cliente Terminal 4; ele pode ser um Expert Advisor, um script ou um indicador.
§
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 TwoWay 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.
§
Tampão é uma área de memória contendo valores numéricos de um indicador array.
§
Built-In Função é o mesmo que uma norma função.
§
Comprar é um mercado que define ordem de compra de activos de uma caução.
§
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.
§
Candlestick é uma representação gráfica de um preço gráfico. Castiçal é caracterizada por Abrir, Fechar, Alta, Baixa dos preços, bem como pelo volume e hora. A pode ser preto e branco castiçais castiçais (ver também Bar).
§
Um comentário é opcional e nonexecutable parte de um programa.
§
Constante é um programa constituinte, é um objeto que tem um valor.
§
Expressão constante é uma expressão constituída de constantes e operações, como por exemplo: 2 +3 * 7. Uma expressão constante é calculada em tempo compilar.
§
O controle é execução de ações previamente definidas pelo programa e pelo algoritmo as propriedades do cliente terminal. Controle pode ser transferido dentro de um programa a partir de um programa de linha para a outra, assim como entre o programa eo cliente terminal (ver alguns conceitos básicos).
§
Instrumento moeda é um par cambial, por exemplo, EURUSD, GBPCHF, etc, é uma especial de segurança (símbolo).
§
Indicador personalizado é codificada em um programa aplicativo MQL4; é basicamente destinados à exibição gráfica das dependências calculadas preliminarmente. Os valores dos componentes do Indicador Arrays personalizado de um indicador estão disponíveis para outras aplicações através da função chamada iCustom () (ver também Técnico Indicator).
§
EA é uma abreviatura de Expert Advisor (ver também Script e Indicator).
§
Expert Advisor é um programa codificado em MQL4; é distinguida pelo propriedades especiais da função start () chamado pelo cliente terminal para ser executado em cada carrapato, a principal finalidade de Expert Advisors está programado controle sobre rotas comerciais (ver também EA, Script e Indicator).
§
Expressão é uma seqüência de operandos e operações; é gravar um programa, o valor calculado de que é caracterizada por um tipo de dados.
§
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.
§
Descriptor File é o número exclusivo de um processo aberto por um programa executável, no momento atual.
§
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.
§
Arquivo separador é um carácter especial, que é um recorde a ser armazenado no arquivo de dados separados registros.
§
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.
§
Call Function (Função ou de Referência) é um recorde, o que resulta na execução de execução de uma função (ver também Função Descrição).
§
A descrição é uma função específica denominada parte de um programa destinado à execução, consiste de duas partes principais - uma função cabeçalho eo corpo de uma função, e é utilizada em especial e personalizado funções (vertambém Funções, Função Descrição e Operador de regresso e Funções Especiais ).
§
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.
§
GV é uma abreviatura de Variable Global do Terminal Client.
§
O indicador é um espaço construído, em função do cliente terminal ou um programa codificado em MQL4; o principal objetivo dos indicadores é a exibição Indicador Linhas na tela; indicadores não podem fazer trades; existem dois tipos de indicadores: Indicadores personalizado e indicadores técnicos ( veja também Expert Advisor, EA e Escrita).
§
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.
§
A inicialização da variável é dependente do tipo de atribuir um valor para a variável por variável Declaração.
§
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.
§
Hora Local é o tempo definido em um PC local (veja também Server Time).
§
Loop (Cycle) é um órgão ou vários operadores incluídos no aparelho; localiza-se directamente após o ciclo operador cabeçalho (ver Ciclo do Operador ", enquanto" и Ciclo do Operador "para").
§
Looping é repetida continuamente uma execução de operadores que compõem o circuito fechado (ciclo) corpo: é uma situação crítica que resulta da realização de um algoritmo errado.
§
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).
§
Preço normalizou-se de um preço arredondado para um Ponto de uma dimensão de segurança (símbolo).
§
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.
§
Formato operador é um conjunto de regras para a formatação de um operador do mesmo tipo. Cada operador possui o seu próprio tipo de formato (ver também Operators).
§
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.
§
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).
§
Script é um programa codificado em MQL4; é marcado por propriedades especiais da função de início () chamado pelo cliente terminal para ser executado apenas uma vez; scripts são destinados para a realização de quaisquer operações que devem ser executadas apenas implicitamente uma vez (ver também Expert Assessor de EA e Indicator).
§
Segurança (Symbol) é o nome do objeto a ser citado.
§
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. O tempo é o servidor de tempo definido no servidor (ver também hora local).
§
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.
§
Indicador técnica é uma parte do comércio online plataforma Metatrader 4; é um espaço construído, em função que nos permite mostrar uma certa dependência em relação à tela (ver também personalizado Indicator).
§
Assinale-se de um evento caracterizado por um novo preço para um símbolo em algum momento.
§
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.
§
O comércio é abertura, o encerramento ou a alteração do mercado, e enquanto se aguarda ordens.
§
O comércio é uma solicitação feita pelo comando de um programa ou por um comerciante, a fim de realizar umcomércio. A ordem pode ser executada em ou rejeitado pelo servidor ou pelo cliente de terminal.
§
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.
§
Typecasting está modificando (mapeamento) dos tipos dos valores de um Operando ou uma Expression. Antes da execução de operações (todas as operações, mas cessão), são alteradas para um tipo da mais alta prioridade, que antes da realização da cessão operações forem modificados para o tipo de alvo.
§
Funções Definidas Por Usuário é uma função criada pelo programador (ver também a função).
§
Variável é uma parte de um programa, este é um objeto com um nome e um valor.
§
Declaração variável é a primeira menção de uma variável em um programa. Na sua declaração tipo variável é especificado.
§
Identificador variável é um conjunto de caracteres consistindo de letras, números e caractere (s), que tem início com uma carta, no máximo 31 caracteres. É o mesmo que Nome da variável.
§
Nome variável é o mesmo que Variável Identificador.
§
Â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: Constante
Valor
Operação de negociação
OP_BUY
0 Comprar
OP_SELL
1 Vender
OP_BUYLIMIT
2 Enquanto se aguarda despacho comprar limite
OP_SELLLIMIT
3 Enquanto se aguarda despacho vender limite
OP_BUYSTOP
4 Enquanto se aguarda despacho comprar parar
OP_SELLSTOP
5 Enquanto se aguarda despacho vender parar
Limitações e exigências em Making Trades 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 Ordem
Abrir Preço
Preço fechar
Comprar
Perguntar
Bid
Vender
Bid
Perguntar
Preço de abrir uma Ordem Pendente
Enquanto aguarda um decreto transformando em aMarket Ordem
BuyLimit
Abaixo do preço corrente Pergunte
Pergunte preços chega a abrir preço
SellLimit
Acima do preço actual de lance
Proposta de preço chega a abrir preço
BuyStop
Acima do preço actual Pergunte
Pergunte preços chega a abrir preço
SellStop
Abaixo do preço corrente de oferta
Proposta de preço chega a abrir preço
A possibilidade de exclusão de uma ordem pendente é regulamentada pela FreezeLevel parâmetro. StopLevel distância mínima limitação. Um comércio operação não será realizada se alguma das seguintes condições for interrompida. Tipo de Ordem
Abrir Preço
StopLoss (LS)
TakeProfit (TP)
Comprar
Modificação é proibida
Lance-SL ≥ StopLevel
Vender
Modificação é proibida
Pergunte-SL ≥ StopLevel Pergunte-TP ≥ StopLevel
TP-Bid ≥ StopLevel
BuyLimit
Pergunte-OpenPrice ≥ StopLevel OpenPriceSL ≥ StopLevel
TPOpenPrice ≥ StopLevel
SellLimit
OpenPrice-Bid ≥ StopLevel
OpenPriceTP ≥ StopLevel
BuyStop
Pergunte-OpenPrice ≥ StopLevel OpenPriceSL ≥ StopLevel
TPOpenPrice ≥ StopLevel
SellStop
Lance-OpenPrice ≥ StopLevel
OpenPriceTP ≥ StopLevel
SLOpenPrice ≥ StopLevel
SLOpenPrice ≥ StopLevel
FreezeLevel Prescrição (Congelamento Distância). Ordens de mercado não pode ser fechada se os valores StopLoss e TakeProfit violar os requisitos FreezLevel parâmetro. StopLoss ou TakeProfit ordens não pode ser modificado, se StopLoss ou TakeProfit Valores parâmetro violam o StopLevel requisitos. Enquanto se aguarda ordens não pode ser excluído ou modificado, se o preço declarado aberto viola os requisitos FreezeLevel parâmetro. Tipo de Ordem
Abrir Preço
StopLoss (SL)
TakeProfit (TP)
Comprar
Modificação é proibida
Lance-SL> FreezeLevel
TP-Bid> FreezeLevel
Vender
Modificação é proibida
Pergunte-SL> FreezeLevel
Pergunte-TP> FreezeLevel
BuyLimit
Pergunte-OpenPrice> FreezeLevel Regulamentado pela StopLevel parâmetro
Regulamentado pela StopLevel parâmetro
SellLimit
OpenPrice-Bid> FreezeLevel
Regulamentado pela StopLevel parâmetro
Regulamentado pela StopLevel parâmetro
BuyStop
Pergunte-OpenPrice> FreezeLevel Regulamentado pela StopLevel parâmetro
Regulamentado pela StopLevel parâmetro
SellStop
Lance-OpenPrice> FreezeLevel
Regulamentado pela StopLevel parâmetro
Regulamentado pela StopLevel 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. Códigos de erro retornado de um servidor ou cliente comércio terminal: Constante
Valor
Descrição
ERR_NO_ERROR
0 Nenhum erro retornado.
ERR_NO_RESULT
1 Nenhum erro devolvido, mas o resultado é desconhecido.
ERR_COMMON_ERROR
2 Erro comum.
ERR_INVALID_TRADE_PARAMETERS
3 Comércio parâmetros inválidos.
ERR_SERVER_BUSY
4 Comércio servidor está ocupado.
ERR_OLD_VERSION
5 Antiga versão do cliente de terminal.
ERR_NO_CONNECTION
6 Sem ligação com o servidor de comércio.
ERR_NOT_ENOUGH_RIGHTS
7 Não basta direitos.
ERR_TOO_FREQUENT_REQUESTS
8 Demasiado frequentes solicitações.
ERR_MALFUNCTIONAL_TRADE
9 Malfunctional operação comercial.
ERR_ACCOUNT_DISABLED
64 Conta desativada.
ERR_INVALID_ACCOUNT
65 Conta inválida.
ERR_TRADE_TIMEOUT
128 Comércio timeout.
ERR_INVALID_PRICE
129 Preço inválido.
ERR_INVALID_STOPS
130 Invalid pára.
ERR_INVALID_TRADE_VOLUME
131 Invalid volume comercial.
ERR_MARKET_CLOSED
132 Mercado está fechado.
ERR_TRADE_DISABLED
133 O comércio está desativada.
ERR_NOT_ENOUGH_MONEY
134 Falta de dinheiro.
ERR_PRICE_CHANGED
135 Preço alterado.
ERR_OFF_QUOTES
136 Off aspas.
ERR_BROKER_BUSY
137 Corretor está ocupado.
ERR_REQUOTE
138 Requote.
ERR_ORDER_LOCKED
139 Ordem está bloqueado.
ERR_LONG_POSITIONS_ONLY_ALLOWED
140 As posições longas só permitido.
ERR_TOO_MANY_REQUESTS
141 Excesso de pedidos.
ERR_TRADE_MODIFY_DENIED
145 Modificação negado porque é uma forma muito próxima do mercado.
ERR_TRADE_CONTEXT_BUSY
146 Comércio contexto está ocupado.
ERR_TRADE_EXPIRATION_DENIED
147 Expirações são negados pelo corretor.
ERR_TRADE_TOO_MANY_ORDERS
148 A quantidade de encomendas pendentes e abriu atingiu o limite estabelecido por um corretor.
MQL4 tempo executar códigos de erro: Constante
Valor
Descrição
ERR_NO_MQLERROR
4000 Nenhum erro.
ERR_WRONG_FUNCTION_POINTER
4001 Função ponteiro errado.
ERR_ARRAY_INDEX_OUT_OF_RANGE
4002 Array índice está fora do alcance.
ERR_NO_MEMORY_FOR_FUNCTION_CALL_STACK
4003 N º de memória para a função chamada pilha.
ERR_RECURSIVE_STACK_OVERFLOW
4004 Recursivo stack overflow.
ERR_NOT_ENOUGH_STACK_FOR_PARAMETER
4005 Não basta pilha de parâmetro.
ERR_NO_MEMORY_FOR_PARAMETER_STRING
4006 N º de memória para o parâmetro string.
ERR_NO_MEMORY_FOR_TEMP_STRING
4007 N º de memória para a string temp.
ERR_NOT_INITIALIZED_STRING
4008 Não inicializado seqüência.
ERR_NOT_INITIALIZED_ARRAYSTRING
4009 Não inicializado seqüência em um array.
ERR_NO_MEMORY_FOR_ARRAYSTRING
4010 N º de memória para um array string.
ERR_TOO_LONG_STRING
4011 Demasiado longa seqüência.
ERR_REMAINDER_FROM_ZERO_DIVIDE
4012 Restante do zero dividir.
ERR_ZERO_DIVIDE
4013 Zero dividir.
ERR_UNKNOWN_COMMAND
4014 Comando desconhecido.
ERR_WRONG_JUMP
4015 Errado salto.
ERR_NOT_INITIALIZED_ARRAY
4016 Array não inicializado.
ERR_DLL_CALLS_NOT_ALLOWED
4017 DLL chamadas não são permitidos.
ERR_CANNOT_LOAD_LIBRARY
4018 Não é possível carregar biblioteca.
ERR_CANNOT_CALL_FUNCTION
4019 Não podemos chamar função.
ERR_EXTERNAL_EXPERT_CALLS_NOT_ALLOWED
4020 EA função chamadas não são permitidos.
ERR_NOT_ENOUGH_MEMORY_FOR_RETURNED_STRING
4021 Não existe memória suficiente para uma seqüência de regressar de uma função.
ERR_SYSTEM_BUSY
4022 Sistema está ocupado.
ERR_INVALID_FUNCTION_PARAMETERS_COUNT
4050 Parâmetros inválidos função contagem.
ERR_INVALID_FUNCTION_PARAMETER_VALUE
4051 Valor Função parâmetro inválido.
ERR_STRING_FUNCTION_INTERNAL_ERROR
4052 Seqüência função erro interno.
ERR_SOME_ARRAY_ERROR
4053 Alguns array erro.
ERR_INCORRECT_SERIES_ARRAY_USING
4054 Incorreto série array usando.
ERR_CUSTOM_INDICATOR_ERROR
4055 Custom indicador de erro.
ERR_INCOMPATIBLE_ARRAYS
4056 Matrizes são incompatíveis.
ERR_GLOBAL_VARIABLES_PROCESSING_ERROR
4057 Variáveis globais processamento de erro.
ERR_GLOBAL_VARIABLE_NOT_FOUND
4058 Variável global não foi encontrado.
ERR_FUNCTION_NOT_ALLOWED_IN_TESTING_MODE
4059 Função não é permitido no modo de teste.
ERR_FUNCTION_NOT_CONFIRMED
4060 Função não está confirmado.
ERR_SEND_MAIL_ERROR
4061 Envio de e-mail de erro.
ERR_STRING_PARAMETER_EXPECTED
4062 String parâmetro esperado.
ERR_INTEGER_PARAMETER_EXPECTED
4063 Integer parâmetro esperado.
ERR_DOUBLE_PARAMETER_EXPECTED
4064 Duplo parâmetro esperado.
ERR_ARRAY_AS_PARAMETER_EXPECTED
4065 Array como parâmetro esperado.
ERR_HISTORY_WILL_UPDATED
4066 Solicitadas na actualização de dados história estadual.
ERR_TRADE_ERROR
4067 Alguns erros na operação comercial execução.
ERR_END_OF_FILE
4099 Fim de um arquivo.
ERR_SOME_FILE_ERROR
4100 Alguns arquivos de erro.
ERR_WRONG_FILE_NAME
4101 Nome do arquivo errado.
ERR_TOO_MANY_OPENED_FILES
4102 Excesso de arquivos abertos.
ERR_CANNOT_OPEN_FILE
4103 Não pode abrir o arquivo.
ERR_INCOMPATIBLE_ACCESS_TO_FILE
4104 Incompatível acesso a um arquivo.
ERR_NO_ORDER_SELECTED
4105 Nenhuma ordem selecionada.
ERR_UNKNOWN_SYMBOL
4106 Símbolo desconhecido.
ERR_INVALID_PRICE_PARAM
4107 Preço inválido.
ERR_INVALID_TICKET
4108 Invalid bilhete.
ERR_TRADE_NOT_ALLOWED
4109 O comércio não é permitido.
ERR_LONGS_NOT_ALLOWED
4110 Longos não são permitidos.
ERR_SHORTS_NOT_ALLOWED
4111 Shorts não são permitidos.
ERR_OBJECT_ALREADY_EXISTS
4200 O objeto já existe.
ERR_UNKNOWN_OBJECT_PROPERTY
4201 Imóvel objeto desconhecido.
ERR_OBJECT_DOES_NOT_EXIST
4202 Objeto não existe.
ERR_UNKNOWN_OBJECT_TYPE
4203 Tipo de objeto desconhecido.
ERR_NO_OBJECT_NAME
4204 Não há nenhum objeto nome.
ERR_OBJECT_COORDINATES_ERROR
4205 Objeto coordenadas erro.
ERR_NO_SPECIFIED_SUBWINDOW
4206 Não especificado subwindow.
ERR_SOME_OBJECT_ERROR
4207 Alguns erros na operação objeto.
Estilos de linhas indicadoras Estilos de desenho de linhas indicadoras SetIndexStyle () e SetLevelStyle () funções: Constante
Valor
Descrição
DRAW_LINE
0 Linha Simples
DRAW_SECTION
1 As secções não vazio linha entre valores
DRAW_HISTOGRAM
2 Histograma
DRAW_ARROW
3 Arrows (símbolos)
DRAW_ZIGZAG
4 Desenho e ímpar até mesmo entre as seções indicador buffers
DRAW_NONE
12 Nenhum desenho
Linha de estilo. Utilizado somente se a largura da linha é igual a 0 ou 1: Constante
Valor
Descrição
STYLE_SOLID
0 Linha sólida
STYLE_DASH
1 Linha tracejada
STYLE_DOT
2 Linha pontilhada
STYLE_DASHDOT
3 Dash-line e-dot
STYLE_DASHDOTDOT
4 Traço duplo ponto-e-fc Linha
Propriedades e tipos de objetos gráficos Gráfica tipo de objeto usado com identificadores ObjectCreate (), ObjectsDeleteAll () e ObjectType () funções. Pode ser qualquer um dos seguintes valores: Tipo de Objeto
Valor
Descrição
OBJ_VLINE
0 Linha vertical. Utiliza parte do primeiro tempo, articular, o preço é ignorado.
OBJ_HLINE
1 Linha horizontal. Utiliza a primeira parte do preço coordenar, a hora é ignorado.
OBJ_TREND
2 Curva de tendência. Utiliza 2 coordenadas.
OBJ_TRENDBYANGLE
3 Trend pelo ângulo. Utiliza 1 ou 2 coordenadas coordenar e ângulo. Para definir uma linha ângulo (OBJPROP_ANGLE bens) utilizar ObjectSet () function.
OBJ_REGRESSION
4 Regressão. Utiliza peças de primeira hora 2 coordenadas, preço peças são ignorados.
OBJ_CHANNEL
5 Eqüidistante canal. Utiliza 3 coordenadas.
OBJ_STDDEVCHANNEL
6 Desvio padrão canal. Utiliza a tempo duas primeiras partes de coordenadas, preço peças são ignorados.
OBJ_GANNLINE
7 Gann linha. Utiliza 2 coordenadas, mas a segunda parte do preço coordenar é ignorado. Para definir a relação entre o preço e calendário (OBJPROP_SCALE bens) utilizar ObjectSet () function.
OBJ_GANNFAN
8 Gann fã. Utiliza 2 coordenadas, mas a segunda parte do preço coordenar é ignorado. Para definir a relação entre o preço e calendário (OBJPROP_SCALE bens) utilizar ObjectSet () function.
OBJ_GANNGRID
9 Gann grid. Utiliza 2 coordenadas, mas a segunda parte do preço coordenar é ignorado. Para definir a relação entre o preço e calendário (OBJPROP_SCALE bens) utilizar ObjectSet () function.
OBJ_FIBO
10 Retracement Fibonacci. Utiliza 2 coordenadas. Para definir o número de níveis (OBJPROP_FIBOLEVELS propriedade) e os valores de níveis (n + OBJPROP_FIRSTLEVEL bens) utilizar ObjectSet () function.
OBJ_FIBOTIMES
11 Fibonacci fusos horários. Utiliza 2 coordenadas. Para definir o número de níveis (OBJPROP_FIBOLEVELS propriedade) e os valores de níveis (n + OBJPROP_FIRSTLEVEL bens) utilizar ObjectSet () function.
OBJ_FIBOFAN
12 Fibonacci fã. Utiliza 2 coordenadas. Para definir o número de níveis (OBJPROP_FIBOLEVELS propriedade) e os valores de níveis (n + OBJPROP_FIRSTLEVEL bens) utilizar ObjectSet () function.
OBJ_FIBOARC
13 Fibonacci arcos. Utiliza 2 coordenadas. Para definir o número de níveis (OBJPROP_FIBOLEVELS propriedade) e os valores de níveis (n + OBJPROP_FIRSTLEVEL bens) utilizar ObjectSet () function.
OBJ_EXPANSION
14 Fibonacci expansões. Utiliza 3 coordenadas. Para definir o
número de níveis (OBJPROP_FIBOLEVELS propriedade) e os valores de níveis (n + OBJPROP_FIRSTLEVEL bens) utilizar ObjectSet () function. OBJ_FIBOCHANNEL
15 Fibonacci canal. Utiliza 3 coordenadas. Para definir o número de níveis (OBJPROP_FIBOLEVELS propriedade) e os valores de níveis (n + OBJPROP_FIRSTLEVEL bens) utilizar ObjectSet () function.
OBJ_RECTANGLE
16 Rectângulo. Utiliza 2 coordenadas.
OBJ_TRIANGLE
17 Triângulo. Utiliza 3 coordenadas.
OBJ_ELLIPSE
18 Elipse. Utiliza 2 coordenadas. Para definir a relação entre o preço e calendário (OBJPROP_SCALE bens) utilizar ObjectSet () function.
OBJ_PITCHFORK
19 Andrews forquilha. Utiliza 3 coordenadas.
OBJ_CYCLES
20 Tempo voltas (cíclica linhas). Utiliza 2 coordenadas.
OBJ_TEXT
21 Texto. 1 coordenar utilizações. Para ajustar o ângulo do texto escrito (OBJPROP_ANGLE parâmetro) utilize ObjectSet () fucntion. Para modificar o texto utilização ObjectSetText () fucntion.
OBJ_ARROW
22 Arrows (símbolos). Utiliza 1 coordenar. Para definir o símbolo código (OBJPROP_ARROWCODE parâmetro) utilize ObjectSet () function.
OBJ_LABEL
23 Texto rótulo. Para definir as coordenadas em pixels relativamente ao ângulo de ligação (OBJPROP_CORNER, OBJPROP_XDISTANCE, OBJPROP_YDISTANCE parâmetros) utilize ObjectSet () function. Para modificar o texto utilização ObjectSetText () fucntion.
Objeto gráfico usado com propriedades identificadores ObjectGet () и ObjectSet (), e pode ser qualquer um dos seguintes valores: Objeto Parâmetros
Valor
Tipo
Descrição
OBJPROP_TIME1
0 datetime Valor de set / get coordenar primeiro tempo parcial.
OBJPROP_PRICE1
1
OBJPROP_TIME2
2 datetime Valor de set / get coordenar segundo tempo parcial.
OBJPROP_PRICE2
3
OBJPROP_TIME3
4 datetime Valor para definir / get terceiro coordenar tempo parcial.
OBJPROP_PRICE3
5
dupla Valor de set / get coordenar preço terceira parte.
OBJPROP_COLOR
6
color Valor de set / get objeto colorido.
OBJPROP_STYLE
7
int Valor de set / get estilo da linha.
OBJPROP_WIDTH
8
int Valor de set / get objeto largura da linha.
dupla Valor de set / get primeira parte coordenar preço.
dupla Valor de set / get segunda parte coordenar preço.
OBJPROP_BACK
9
bool Valor de set / get fundo objeto de desenho bandeira.
OBJPROP_RAY
10
bool Valor de set / get ray bandeira de objetos como OBJ_TREND e alikes.
OBJPROP_ELLIPSE
11
bool Valor de set / get elipse bandeira para OBJ_FIBOARC objeto.
OBJPROP_SCALE
12
dupla Valor de set / get escala objeto imóvel.
OBJPROP_ANGLE
13
dupla Valor de set / get imóvel objeto ângulo em graus para OBJ_TRENDBYANGLE obect.
OBJPROP_ARROWCODE
14
int Valor ou a seta enumeração set / get seta código de propriedade OBJ_ARROW obect. Pode-se sobre o wondings de símbolos ou de um dos códigos predefinidos seta.
OBJPROP_TIMEFRAMES
15
int Valor de set / get calendário objeto imóvel. Ou pode ser uma combinação do número de objeto visibilidade constantes.
OBJPROP_DEVIATION
16
dupla Valor de set / get desvio de bens para OBJ_STDDEVCHANNEL objeto.
OBJPROP_FONTSIZE
100
int Valor de set / get tamanho da fonte para OBJ_TEXT e OBJ_LABEL objetos.
OBJPROP_CORNER
101
int Valor de set / get âncora canto imóvel para OBJ_LABEL objeto. Deve ser de 0-3.
OBJPROP_XDISTANCE
102
int Valor de set / get âncora X distância objeto imóvel em pixels relativamente ao ângulo de ligação para OBJ_LABEL objeto.
OBJPROP_YDISTANCE
103
int Valor de set / get âncora Y imóvel objeto distância em pixels relativamente ao ângulo de ligação para OBJ_LABEL objeto.
OBJPROP_FIBOLEVELS
200
int Valor de set / get Fibonacci objeto nível contar. Pode ser de 1 a 32.
OBJPROP_LEVELCOLOR
201
OBJPROP_LEVELSTYLE
202
int Vlaue de set / get objeto nível estilo da linha.
OBJPROP_LEVELWIDTH
203
int Valor de set / get objeto nível largura da linha.
OBJPROP_FIRSTLEVEL + n 210 + n
color Valor de set / get objeto nível linha colorida.
int Valor de set / get o número do nível do objecto, em que n é um índice de nível set / get. Pode ser de 0 a 31.
Arquivos sonoros O conjunto dos ficheiros wav recomendada para usar no trabalho prático em EAs, indicadores e scripts: Nome do Arquivo
Recomendado Termos de Uso
Close_order.wav
Mercado fim fechamento
Ok.wav
Bem sucedida encerramento de uma operação comercial
Transform.wav
Transformar uma ordem pendente em um mercado fim
Bulk.wav
Insignificante eventos
Inform.wav
Informações diferentes (comércio critério modificação, etc)
Oops.wav
Informação crítica (de dinheiro, etc) ou inválidos ação
Expert.wav
O comércio é dada a ordem
Error.wav
Que terminou em uma infrutíferas de operação comercial
Bzrrr.wav
Outros erros
Wait.wav
Pausa
Work.wav
Programas e arquivos necessários estão instalados
Tick.wav
Nova carrapato
W1.wav
Outros termos
W2.wav
Outros termos
W3.wav
Outros termos
Não é recomendado o uso jar, demandando tempo e jogar sons. MessageBox () Retorno Códigos 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. Constante
Valor
Descrição
IDOK
1
Botão OK foi selecionado.
IDCANCEL
2
Botão Cancelar foi selecionado
IDABORT
3
Abortar botão foi selecionado
IDRETRY
4
Repetir botão foi selecionado
IDIGNORE
5
Ignorar botão foi selecionado
IDYES
6
Sim botão foi selecionado
IDNO
7
"Não" foi selecionado
IDTRYAGAIN
10
Tente Novamente botão foi selecionado
IDCONTINUE
11
Continuar botão foi selecionado
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 . O MessageBox () função bandeiras especificar o conteúdo eo comportamento de uma caixa de diálogo. Esse valor pode ser uma combinação dos pavilhões a partir dos seguintes grupos de bandeiras: Constante
Valor
Descrição
MB_OK
0x00000000 A caixa de mensagem contém um botão: OK. Este é o padrão.
MB_OKCANCEL
0x00000001 A caixa de mensagem contém dois botões: OK e Cancelar.
MB_ABORTRETRYIGNORE
0x00000002 A caixa de mensagem contém três botões: Cancelar, Repetir, Ignore e.
MB_YESNOCANCEL
0x00000003 A caixa de mensagem contém três botões: Sim, Não e Cancelar.
MB_YESNO
0x00000004 A caixa de mensagem contém dois botões: Sim e Não.
MB_RETRYCANCEL
0x00000005 A caixa de mensagem contém dois botões: Retry e Cancel.
MB_CANCELTRYCONTINUE 0x00000006 A caixa de mensagem contém três botões: Cancelar, Tentar novamente, Continuar. Para exibir um ícone em uma caixa de mensagem define os pavilhões adicionais: Constante
Valor
Descrição
MB_ICONSTOP MB_ICONERROR MB_ICONHAND
0x00000010 Um sinal para parar de ícone aparece na caixa de mensagem.
MB_ICONQUESTION
0x00000020 Uma pergunta-marca ícone aparece na caixa de mensagem.
MB_ICONEXCLAMATION MB_ICONWARNING
0x00000030 Um ponto de exclamação ícone aparece na caixa de mensagem.
MB_ICONINFORMATION 0x00000040 Um ícone constituído por uma letra minúscula i, em um MB_ICONASTERISK círculo aparece na caixa de mensagem. Default botões são especificadas com as seguintes bandeiras: Constante
Valor
Descrição
MB_DEFBUTTON1
0x00000000 A primeira é burron MB_DEFBUTTON1 botão padrão, a menos MB_DEFBUTTON2, MB_DEFBUTTON3, ou MB_DEFBUTTON4 é especificado.
MB_DEFBUTTON2
0x00000100 O segundo botão é o botão padrão.
MB_DEFBUTTON3
0x00000200 O terceiro botão é o botão padrão.
MB_DEFBUTTON4
0x00000300 O quarto botão é o botão padrão.
MessageBox () função comportamento sinalizadores são definidos no WinUser32.mqh arquivo, esse arquivo é a razão pela qual esta rubrica deve ser incluída em programas através # include . Nem todos os possíveis sinalizadores são listados aqui. Para mais detalhes, consulte a descrição da API Win32. MarketInfo () Identificadores Consulta identificadores utilizados no MarketInfo () função pode ter os seguintes valores:
Constante
Valor
Descrição
MODE_LOW
1 Preço mínimo dias
MODE_HIGH
2 Preço máximo dias
MODE_TIME
5 A última vez recebida carrapato.
MODE_BID
9 Última incoming lance preço. Para o actual símbolo, que é armazenado na variável pré-lance.
MODE_ASK
10 Última incoming perguntar preço. Para o actual símbolo, que é armazenado na variável predefinidos Pergunte.
MODE_POINT
11 Tamanho da ponta na citação moeda. Para o actual símbolo, que é armazenado na variável pré-Point.
MODE_DIGITS
12 A contagem de dígitos depois da vírgula no símbolo preços. Para o actual símbolo, que é armazenado na variável predefinidos Dígitos.
MODE_SPREAD
13 Espalhe valor em pontos.
MODE_STOPLEVEL
14 Mínima admissível StopLoss / TakeProfit valor em pontos.
MODE_LOTSIZE
15 Tamanho do lote em moeda base.
MODE_TICKVALUE
16 Minimal carrapato valor do depósito em moeda.
MODE_TICKSIZE
17 Dimensão mínima carrapato na citação moeda.
MODE_SWAPLONG
18 Swap de uma posição longa.
MODE_SWAPSHORT
19 Swap de uma posição curta.
MODE_STARTING
20 Comércio data inicial (geralmente utilizados para futuros).
MODE_EXPIRATION
21 Comércio da data de validade (normalmente utilizado para futuros).
MODE_TRADEALLOWED
22 O comércio é permitido para o símbolo.
MODE_MINLOT
23 Lote tamanho mínimo permitido.
MODE_LOTSTEP
24 Passo para a mudança dos lotes.
MODE_MAXLOT
25 Lote tamanho máximo permitido.
MODE_SWAPTYPE
26 Swap método de cálculo. 0 - em pontos; 1 - o símbolo da moeda base; 2 - por interesse; 3 - na margem moeda.
MODE_PROFITCALCMODE
27 Modo de cálculo lucro. 0 - Forex; 1 - CFD; 2 - Futures.
MODE_MARGINCALCMODE
28 Modo de cálculo margem. 0 - Forex; 1 - CFD; 2 - Futures; 3 CFD de índices.
MODE_MARGININIT
29 Requisitos iniciais de margem de 1 lote.
MODE_MARGINMAINTENANCE
30 Margem de manter posições abertas calculado para 1 lote.
MODE_MARGINHEDGED
31 Cobertos margem calculada para 1 lote.
MODE_MARGINREQUIRED
32 Livre margem necessária para abrir 1 lote para comprar.
MODE_FREEZELEVEL
33 Ordem congelar nível em pontos. Se a execução preço se situa dentro do intervalo definido pelo congelamento nível, a
ordem não pode ser modificada, cancelada ou fechada. Lista de Programas Expert Advisors: Nome
Descrição com o link para a seção
create.mq4
Exemplo de um código de programação comentados
simple.mq4
Exemplo de um simples EA, a execução de funções especiais
possible.mq4
Exemplo de um programa correto estrutura
incorrect.mq4
Exemplo de um programa incorrecto estrutura
userfunction.mq4
Exemplo simples de uma função definida aplicação de usuário
onelevel.mq4
Exemplo de outra operadora se-candidatura
twolevel.mq4
Exemplo de outra operadora se-candidatura
twoleveloptim.mq4
Exemplo de outra operadora se-candidatura
compoundcondition.mq4
Exemplo de outra operadora se-candidatura
pricealert.mq4
Exemplo de aplicação operador mudar
predefined.mq4
Atualizando um valor predefinido de uma variável
countticks.mq4
Exemplo de aplicação variável global (assinalar contador)
staticvar.mq4
Exemplo de aplicação variável estática (assinalar contador)
externvar.mq4
Exemplo de programas externos aplicação
globalvar.mq4
Exemplo de aplicação GlobalVariable
stringarray.mq4
Exemplo de aplicação string array
extremumprice.mq4
Uso de valores de séries cronológicas array elementos
newbar.mq4
Detectando o fato de um novo aparecimento bar (de séries temporais array)
modifystoploss.mq4
StopLoss mercado ordens de modificação
callindicator.mq4
Chamando uma função a partir de um indicador técnico EA
historybars.mq4
Chamando IMA () a partir de uma função técnica indicador EA
callstohastic.mq4
Chamando iStochastic () a partir de uma função técnica indicador EA
tradingexpert.mq4
Simples EA. Estrutura, estratégia, algoritmo.
shared.mq4
EA calcula que o comércio critérios, com base num indicador personalizado.
comment.mq4
Exibindo um texto no canto superior esquerdo de uma janela de segurança
dialogue.mq4
EA apoiar um diálogo com um usuário
grafobjects.mq4
EA que usa OBJ_LABEL objeto gráfico
moveobjects.mq4
EA que gere a posição de uma gráfica de objetos
charts.mq4
EA que gere objetos gráficos nas janelas de uma janela de segurança
strings.mq4
EA que gere objetos gráficos para colorir castiçal
timebars.mq4
EA que exibe um carrapato próximos tempos e barra abertura vez
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: Nome
Descrição com o link para a seção
pifagor.mq4
Exemplo de um programa de usuário, sem qualquer função definida
gipo.mq4
Exemplo de função definida aplicação de usuário
fibonacci.mq4
Exemplo de ciclo, enquanto operador aplicação
sumtotal.mq4
Exemplo de aplicação para o ciclo operador
rectangle.mq4
Exemplo de quebra operador aplicação
area.mq4
Exemplo de quebra operador aplicação
sheep.mq4
Exemplo de aplicação continuar operador
othersheep.mq4
Exemplo de aplicação continuar operador
barnumber.mq4
Exemplo de aplicação operador mudar
callfunction.mq4
Exemplo de função definida aplicação de usuário
countiter.mq4
Intertick ciclos counter
arrayalert.mq4
Exemplo de matrizes de inicialização
simpleopen.mq4
Simples script de abertura ordem
confined.mq4
Script com erro simples análise
improved.mq4
Script pode trabalhar em qualquer janela de segurança
mistaken.mq4
Script com a abertura incorreto preço
conditions.mq4
Script para definir um preço para
openbuy.mq4
Script para a abertura do mercado para Comprar
openbuystop.mq4
Script de abertura BuyStop ordem pendente
closeorder.mq4
Um script para fechar o mercado de encomendas
deleteorder.mq4
Script para apagar uma das ordens pendentes
closeby.mq4
Script para fechamento de ordens opostas
modifyorderprice.mq4
Script para modificar ordem pendente
timetablenews.mq4
Script para ler dados de um arquivo e exibir objetos gráficos
deleteall.mq4
Script, que elimina todas as variáveis globais do cliente terminal
Indicadores: Nome
Descrição com o link para a seção
userindicator.mq4
Simples personalizado indicador (Alto e Baixo linhas)
averagevalue.mq4
Simples personalizado indicador (alta e baixa média)
separatewindow.mq4
Custom indicador em uma janela separada
displacement.mq4
Deslocamento vertical e horizontal das linhas personalizadas indicador
roc.mq4
Custom indicador ROC
rocseparate.mq4
Custom indicador ROC em uma janela separada
indicatorstyle.mq4
Indicador mostrando a linha High
linelevel.mq4
Indicador que mostre a diferença entre alta e baixa
Inform.mq4
Indicador que cria um vazio subwindow em uma janela de segurança
Os arquivos incluem: Nome
Descrição com o link para a seção
Variables.mqh
Incluir arquivo que contém variáveis globais declaração
Check.mqh
Função que limites aos direitos de utilização
Terminal.mqh
Ordem função contabilística
Inform.mqh
Função para exibir uma mensagem em um subwindow criado pelo indicador Inform.mq4
Events.mqh
Eventos rastreio função
Lot.mqh
Função para definir a quantidade de lotes
Criterion.mqh
Função define critério para o comércio
Trade.mqh
Controlo do comércio funções
Close_All.mqh
Função para fechar todas as ordens no mercado de um determinado tipo
Open_Ord.mqh
Função para abrir um mercado de um determinado tipo oder
Tral_Stop.mqh
Função para modificar todas as ordens no mercado de um determinado tipo
Errors.mqh
Função erro de processamento