Monday, 3 July 2017

Mql4 Close Open Orders And Forex


Encerramento e exclusão de pedidos Os pedidos comerciais para o fechamento de ordens de mercado são formados usando a função OrderClose (). Function OrderClose () É uma função usada para fechar uma ordem de mercado. A função retorna TRUE, se o comércio for executado com sucesso. Ele retorna FALSO, se o comércio falhar. Bilhete - o número único da ordem. Muito - o montante de lotes a ser fechado. É permitido especificar um valor menor que a quantidade disponível de lotes na ordem. Nesse caso, se a solicitação comercial for executada com sucesso, o pedido será fechado em parte. Preço - fechar preço. Este parâmetro é definido de acordo com os requisitos e limitações aceitos para realização de negócios (ver Características e Regras do Pedido para Negociações e Apêndice 3). Se não houver preço solicitado disponível para fechar o pedido de mercado no fluxo de preços ou se estiver desatualizado, este pedido comercial será rejeitado se o preço estiver desatualizado, mas encontrado no fluxo de preços e, ao mesmo tempo, seu desvio A partir do intervalo de preços atual dentro do valor da derrapagem, o pedido comercial será aceito pelo terminal do cliente e enviado ao servidor de comércio. Deslizamento - o desvio máximo permitido do preço solicitado para o fechamento da ordem do preço de mercado (em pontos). Cor - a cor da seta de fechamento em um gráfico. Se este parâmetro não estiver disponível ou seu valor for igual ao CLRNONE, a seta não será exibida no gráfico. Se o programa contiver informações sobre o tipo de ordem a ser fechada, sobre o seu número único, bem como sobre a quantidade de lotes a serem fechados, é muito fácil fechar a ordem. Para isso, você deve usar no código do programa a chamada de função OrderClose () com parâmetros predefinidos. Por exemplo, se o número exclusivo da ordem Comprar for 12345 e se você deseja fechar 0,5 lotes, a chamada para a função que fecha a ordem pode parecer assim: Para decidir quais ordens e em que seqüência deve ser fechada, Você tem que ter dados de todos os pedidos abertos na situação atual. No MQL4, há várias funções que podem ser usadas para obter vários dados que caracterizam qualquer ordem. Por exemplo, a função OrderOpenPrice () retorna o valor do preço aberto da ordem (ou do preço solicitado para pedidos pendentes), a função OrderLots () retorna a quantidade de lotes, a função OrderType () retorna o tipo da ordem, Etc. Todas as funções que retornam os valores de uma chamada de característica de ordem em sua execução para a ordem que foi selecionada pela função OrderSelect (). Function OrderSelect () Para obter os parâmetros de qualquer uma das suas ordens (independentemente do mercado ou pendentes, fechados ou excluídos), você deve primeiro selecioná-lo usando a função OrderSelect (). OrderSelect é uma função que seleciona uma ordem para operações futuras com ele. Ele retorna TRUE, se a função for executada com sucesso. Caso contrário, ele retorna FALSO. Índice - a posição ou número da ordem, depende do segundo parâmetro. Selecione - o símbolo do método de seleção. A seleção de parâmetros pode levar um dos dois valores possíveis: SELECTBYPOS - no índice de parâmetros, o número da ordem na lista é retornado (a numeração começa com 0), SELECTBYTICKET - no índice de parâmetros, o número do ticket (o número de ordem exclusivo) é devolvida. Pool - a fonte de dados para seleção. O pool de parâmetros é usado, quando a seleção de parâmetro é igual ao valor de SELECTBYPOS. O pool de parâmetros é ignorado, se a ordem for selecionada pelo número do ticket (SELECTBYTICKET). O grupo de parâmetros pode assumir dois valores possíveis: MODETRADES (por padrão) - a ordem é selecionada em ordens abertas e pendentes, ou seja, entre as ordens exibidas na guia quotTruffot da janela quotTerminalquot MODEHISTORY - a ordem é selecionada em fechado e excluído Ordens, ou seja, entre os pedidos exibidos na guia quotAccount Historyquot da janela quotTerminalquot. Nesse caso, a profundidade do histórico especificado pelo usuário para exibição de pedidos fechados e excluídos é importante. Para demonstrar o método de utilização de funções comerciais para o fechamento de ordens de mercado, resolva um problema: Problema 28. Escreva um script que encerre uma das ordens de mercado disponíveis na conta. A execução do script deve resultar no fechamento da ordem mais próxima da localização do script anexado à janela de símbolos com o mouse. Suponha que existam três ordens de mercado abertas no terminal para o símbolo EurUsd e um pedido pendente aberto para UsdChf: Fig. 90. Exibindo vários pedidos abertos para diferentes símbolos na janela do terminal. Devemos escrever um script que possa ser arrastado pelo mouse a partir da janela QuotNavigatorquot para a janela de símbolos, o que deve resultar no fechamento de um dos pedidos de mercado, ou seja, a ordem mais próxima do cursor (a partir do momento em que o usuário Soltou o botão do mouse). Na Fig. 91, você pode ver a alternativa, na qual o cursor está mais próximo da ordem Sell 4372889. É esse pedido que deve ser fechado como resultado da execução do script. Para resolver o problema, devemos selecionar (usando a função OrderSymbol ()) entre todos os pedidos apenas aqueles abertos para o símbolo, na janela da qual o script é descartado. Então, devemos encontrar os preços abertos de todos os pedidos de mercado selecionados (ou seja, executar a função OrderOpenPrice () sucessivamente para cada pedido). Conhecendo os preços abertos da ordem, podemos selecionar facilmente um deles que corresponda à afirmação do problema. Para especificar os valores adequados dos parâmetros na função OrderClose (), também precisamos conhecer alguns outros dados sobre a ordem selecionada: a quantidade de lotes (determinada pela função OrderLots ()) eo número de ordem exclusivo (determinado pela Função OrderTicket ()). Além disso, para encontrar um ou outro preço de uma cotação bidirecional, temos que saber o tipo de ordem (determinado pela função OrderType ()). Vamos considerar quais parâmetros devem ser especificados na função OrderSelect () para obter as características de ordem acima. Em primeiro lugar, é necessário escolher o método de seleção de pedidos. No nosso problema, o método de seleção é determinado pela própria declaração do problema: os dados sobre os números de ordem devem estar indisponíveis no programa a partir do momento do lançamento do script para execução, ou seja, o programa é considerado conter um bloco que faria Determine esses números de ordem. Isso significa que devemos verificar todos os pedidos, um por um exibido em quotTerminalquot (Fig. 64.1), então precisamos usar o parâmetro SELECTBYPOS. A fonte de seleção de pedidos também é óbvia. Para resolver o problema, não há necessidade de analisar pedidos fechados e excluídos. Nesse caso, estamos interessados ​​apenas em pedidos de mercado, então vamos buscá-los usando o parâmetro MODETRADES na função OrderSelect (). Para o pool de parâmetros, o valor padrão de MODETRADES é especificado no cabeçalho da função, portanto, pode ser ignorado. Abaixo está mostrado como um bloco para análise de mercado e pedidos pendentes pode ser construído: no cabeçalho do operador de ciclo, o valor inicial é especificado como i1, enquanto que a condição para sair do ciclo é a expressão iltOrdersTotal (). Function OrdersTotal () retorna a quantidade total de mercado e as ordens pendentes, ou seja, aquelas ordens que são mostradas na guia quotTradequot da janela quotTerminalquot. É por isso que haverá tantas iterações no ciclo quanto muitos pedidos participarem na negociação. Em cada iteração, quando a condição é calculada no operador se, a função OrderSelect (i-1, SELECTBYPOS) será executada. O seguinte assunto importante deve ser notado aqui: a numeração de pedidos na lista de pedidos de mercado e pendentes começa com zero. Isso significa que a primeira ordem na lista (Fig. 90) é colocada na posição zero, a posição da segunda ordem é numerada como 1, a terceira ordem é numerada como 2, etc. É por isso que, na função Chamada OrderSelect (), o valor do índice é dado como i-1. Assim, para todos os pedidos selecionados, esse índice sempre será 1 inferior ao valor da variável i (que coincide com o número da próxima iteração). A função OrderSelect () retorna true, se a ordem for selecionada com sucesso. Isso significa que é possível que uma seleção de pedidos possa falhar. Isso pode acontecer, se a quantidade de pedidos mudou durante o processamento. Ao programar no MQL4, você deve lembrar que um programa de aplicação funcionará no modo em tempo real e que, enquanto processa alguns parâmetros, os valores desses parâmetros podem mudar. Por exemplo, a quantidade de ordens de mercado pode mudar como resultado tanto da abertura do fechamento de pedidos quanto da modificação de pedidos pendentes em mercados. É por isso que você deve manter a seguinte regra ao programar processamento de pedidos: as ordens devem ser processadas o mais rápido possível, enquanto o bloco de programa responsável por esse processamento não deve, se possível, conter linhas de programas redundantes. De acordo com o código representado na Fig. 64.3, no cabeçalho do operador se, o programa analisa se a próxima ordem está disponível na lista de pedidos no momento em que é selecionada. Se a próxima encomenda estiver disponível, o controle será passado para o corpo do operador se for processar os parâmetros da ordem. Deve-se notar que tal construção não ajuda muito, em caso de possíveis conflitos, porque a ordem pode ser perdida (fechada) durante o processamento de seus parâmetros. No entanto, esta solução acaba por ser mais eficiente se, a partir do momento da sua seleção, a ordem não está mais disponível. No corpo do operador se, os parâmetros da ordem selecionada são analisados. Ao executar as funções OrderOpenPrice (), OrderTicket (), OrderType () e outros do tipo, cada um deles retornará o valor de uma determinada característica da ordem selecionada como resultado da execução da função OrderSelect (). Todo o raciocínio acima foi usado no programa que resolveria o Problema 28. Um exemplo de um script simples destinado ao fechamento de uma ordem de mercado, cujo preço aberto está mais próximo da localização do script que os preços abertos de outros pedidos (Closeorder. mq4). Todo o código do programa closeorder. mq4 está concentrado no início da função especial (). No bloco 1-2, algumas variáveis ​​são inicializadas. A variável Dist é a distância do local onde o script foi descartado para a ordem mais próxima. A variável RealOrder é uma bandeira que exibe a disponibilidade de pelo menos uma ordem de mercado no terminal do cliente (valor não negativo). A variável WinPrice é o preço, no qual o usuário anexou o script à janela de símbolos. No bloco 2-6, a ordem é analisada: uma das ordens disponíveis é atribuída para ser fechada. O bloco 6-10 é o bloco de fechar a ordem e de processar os erros que podem ocorrer durante o desempenho do comércio. A partir do momento em que o usuário anexou o script à janela de símbolos, os valores das variáveis ​​são calculados no bloco 1-2, a variável WinPrice, tomando o valor do preço, ao nível do qual o usuário anexou o script. Agora é necessário encontrar a ordem (com suas características) mais próxima desta localização. No ciclo para (bloco 2-6), as ordens são pesquisadas. No bloco 2-3, o programa verifica se há uma ordem na próxima linha do quotTerminalquot. Se for encontrada uma ordem, o controle é passado para o corpo do operador se for para obter e analisar as características dessa ordem. No bloco 3-4, as ordens abertas para símbolos errados (não o símbolo, para o qual o programa está sendo executado) são filtradas. No nosso caso, é a ordem 4372930 aberta para UsdChf. Function OrderSymbol () retorna o nome do símbolo da ordem selecionada. Se esse nome de símbolo for diferente desse, para o qual o programa está sendo executado, a iteração atual está quebrada, impedindo que a ordem aberta para outro símbolo seja processada. Se a ordem em análise acabar sendo aberta para o quotourot symbol, mais uma verificação será realizada. O tipo de ordem é determinado usando a função OrderType () (veja Tipos de Operações). Se o tipo de ordem for superior a 1, isso significa que a ordem é pendente. Nesse caso, a iteração atual também está interrompida, porque não estamos interessados ​​em pedidos pendentes. No nosso exemplo, temos uma ordem dessas, mas está aberto para outro símbolo, então já foi filtrado. Todos os pedidos que passam o bloco 3-4 com sucesso são os de mercado. O bloco 4-5 destina-se a selecionar apenas uma ordem de todos os pedidos de mercado que passaram com êxito o bloco anterior. Essa ordem deve ser a mais próxima do preço predefinido (o valor da variável WinPrice). O usuário não é obrigado a referir a linha de pedido com o cursor do mouse. A ordem que está mais próxima do que qualquer outro pedido ao cursor a partir do momento do lançamento do script para execução será selecionada. O preço aberto do pedido processado é encontrado usando a função OrderOpenPrice (). Se o valor absoluto da distância entre o preço da ordem atual eo preço do quotcursor for menor que a mesma distância para a ordem anterior, a ordem atual será selecionada (o valor absoluto da distância é necessário para excluir a influência de A posição do cursor - abaixo ou acima da linha de pedido). Neste caso, esta ordem será memorizada na iteração atual do ciclo como corredor frontal por ser fechada. Para este pedido, o número do bilhete (o número individual da ordem) e o montante dos lotes são calculados no final do bloco 4-5. Neste exemplo (Fig. 90), a quantidade total de pedidos é quatro (três mercados e uma ordem pendente), então haverá quatro iterações executadas no ciclo, o que resultará na busca de todos os dados necessários para o fechamento de um Ordem selecionada. Em seguida, o controle no programa de execução será passado para o operador do ciclo enquanto (bloco 6-10). No bloco 6-7, os pedidos de mercado encontrados são verificados quanto à disponibilidade. Se nenhuma ordem de mercado for encontrada no bloco 2-4 (é bem possível, em geral), o valor da bandeira RealOrder permanece igual a -1, o que significa a indisponibilidade de pedidos de mercado. Se a verificação no bloco 6-7 não detectar pedidos de mercado, a execução do ciclo enquanto estiver quebrada, o programa termina suas operações. Se o valor da variável RealOrder for igual a 0 ou 1, isso significa que um mercado está predefinido para fechamento e deve ser fechado. No bloco 7-8, de acordo com o tipo de ordem, o preço de fechamento da ordem é calculado. É o valor das ordens de compra por compra e o valor de pedir pedidos de venda (consulte Requisitos e limitações na negociação). No bloco 7-8, os valores da variável auxiliar Texto são calculados. O pedido comercial para o encerramento da ordem é formado na função OrderClose () na linha abaixo: Trade function OrderClose () retorna true, se o comércio for feito com sucesso e falso, se não. Se a solicitação comercial for executada com sucesso no servidor, o valor verdadeiro será atribuído à variável Ans (resposta). Nesse caso, ao executar o bloco 8-9, o programa informará o usuário sobre o encerramento bem sucedido da ordem. Depois disso, a execução do operador do ciclo será interrompida e o programa encerrará suas operações. Caso contrário, o controle será passado para o bloco 9-10 para analisar o erro retornado pelo terminal do cliente 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, a saída do programa ou a operação repetida são executadas. No primeiro interruptor do operador, o programa processa os erros que são implicitamente superáveis, ou seja, os erros podem ser considerados como dificuldades temporárias na realização do comércio. Todas as ações necessárias são tomadas para cada um desses erros, então a iteração atual é interrompida e a execução do ciclo enquanto reinicia. (Por favor, note que, neste exemplo, usamos para o processamento de erros, o interruptor do operador que foi encerrado como resultado do uso do operador, que, como tal, não se destina a passar do controle fora do interruptor do operador. Esta construção funciona Apenas porque o interruptor do operador é parte dos conteúdos do operador do ciclo externo enquanto o operador continua e interrompe a iteração atual passando o controle para o cabeçalho do operador enquanto). Se o código de erro não for processado no primeiro interruptor do operador, este erro é considerado crítico. Nesse caso, o controle é passado para o segundo interruptor do operador, que é executado para informar o usuário que um ou outro erro crítico ocorreu. Além disso, o programa usa a interrupção do operador que interrompe a execução do ciclo enquanto. Saindo do ciclo enquanto, por qualquer motivo, resultará na passagem do controle para o bloco 9-10 que produz uma mensagem sobre o final das operações do programa. O retorno do operador pára a execução do início da função especial (), e o programa termina suas operações. O resultado prático obtido após o lançamento do script nas condições indicadas (ver Fig. 90 e 91) é mostrado abaixo. O comércio foi feito com sucesso no servidor. Como resultado do fechamento de uma das ordens, há duas ordens na janela de EurUsd. O fechamento de pedidos também foi exibido na janela quotTerminalquot: Fig. 94. Após Execução do Script closeorder. mq4. Duas ordens de mercado são exibidas na janela quotTerminalquot. Mais tarde, os outros dois pedidos também estão fechados usando esse script. Excluindo pedidos pendentes Pedidos comerciais para exclusão de pedidos pendentes são formados usando a função OrderDelete (). Function OrderDelete () A função exclui a ordem pendente previamente colocada. Retorna TRUE, se tiver funcionado com sucesso. Caso contrário, ele retorna FALSO. Bilhete - o número único de um pedido. Arrowcolor - a cor de uma seta em um gráfico. Se este parâmetro não estiver disponível ou seu valor for igual ao CLRNONE, a seta não será exibida no gráfico. É fácil ver que a função OrderDelete () não contém uma especificação do volume e o preço de fechamento da ordem a ser excluída. A ordem é eliminada, independentemente de qualquer preço de mercado. A exclusão parcial de uma ordem também é impossível. Você pode diminuir a quantidade de lotes em uma ordem pendente em duas etapas: exclua o pedido existente e, em seguida, coloque um novo pedido pendente com a diminuição (qualquer) quantidade de lotes. O algoritmo do programa que irá excluir uma ordem pendente pode ser bastante idêntico ao do fechamento da ordem do mercado. Uma pequena diferença é que nenhum preço próximo é necessário para excluir uma ordem pendente, então o programa abaixo não contém o bloco que atualiza os preços de mercado. Um exemplo de um script simples destinado a excluir uma ordem pendente, cujo preço solicitado está mais próximo da localização do script que os preços de outras ordens pendentes (deleteorder. mq4). O bloco de processamento de erros também foi modificado ligeiramente. Você deve considerar a possibilidade de erros relacionados às mudanças de preços (erros 135 e 136) ao fechar ordens de mercado, mas esses erros não ocorrem ao excluir pedidos pendentes. Pelo mesmo motivo, a função RefreshRates () é usada em nenhum lugar do programa. O processamento de erros como erro 4 e erro 137 (ver códigos de erro) pode ser um pouco difícil. Por exemplo, ao obter o erro 137, o programa pode levar em consideração que o quotbroker está ocupado. No entanto, surge uma questão natural: quando o corretor é livre, para que o usuário continue seu erro comercial 137 não fornece essa informação. É por isso que o programador deve decidir-se como construir o programa processando esses erros corretamente. Em um caso simples, a solicitação pode ser repetida após uma certa pausa (em nosso exemplo, em 3 segundos). Por outro lado, após uma série de tentativas mal sucedidas para excluir (ou, em casos comuns, fechar, abrir ou modificar) uma ordem, o servidor pode retornar o erro 141 - muitos pedidos. Este erro resulta em que o script deleteorder. mq4 deixa de funcionar. Geralmente, tais conflitos não são questões de programação. Nesses casos, você deve entrar em contato com o serviço de suporte dos centros de negociação e esclarecer os motivos da rejeição para executar o pedido comercial. O erro 145 pode ocorrer, se uma ordem pendente (em um caso comum, pode ser uma ordem de parada de um pedido de mercado) é muito próxima do preço de mercado. Este erro não ocorre, se você estiver negociando regularmente em um mercado tranquilo. Se os preços mudam rapidamente, seu corretor pode decidir que uma determinada ordem será aberta em breve, de modo que o intermediário não permitirá excluí-la ou modificá-la. Este erro é considerado no script como crítico e resulta em término do programa (não faz sentido para incomodar o corretor com solicitações comerciais). Se o preço mudar depois de um tempo, você pode tentar excluir o pedido, iniciando o script para execução novamente. Geralmente, a ocorrência do erro 145 pode ser evitada, se você considerar o nível de congelamento definido pelo centro de negociação. O nível de congelamento é um valor que determina a faixa de preços, dentro da qual a ordem é considerada como congelada, ou seja, pode ser proibido excluí-la. Por exemplo, se uma ordem pendente for colocada em 1.2500 e o nível de congelamento for igual a 10 pontos, isso significa que, se o preço variar entre 1.2490 e 1.2510, a exclusão da ordem pendente é proibida. Você pode obter o valor de nível de congelamento executando a função MarketInfo () com o identificador de solicitação de MODEFREEZELEVEL. Encerrar ordens opostas O pedido oposto (contador) é um pedido de mercado aberto na direção oposta à direção de outro pedido de mercado aberto para o mesmo símbolo. Se você tiver dois pedidos opostos para um determinado símbolo, você pode fechá-los simultaneamente, um por outro, usando a função OrderCloseBy (). Você salvará um spread se você executar essa operação. Function OrderCloseBy () A função fecha um pedido de mercado por outro pedido de mercado aberto para o mesmo símbolo na direção oposta. A função retorna TRUE, se for concluída com sucesso, e FALSE, se não. Bilhete - o número exclusivo da ordem a ser fechada. Oposto - o número único da ordem oposta. Cor - a cor da seta de fechamento em um gráfico. Se este parâmetro não estiver disponível ou seu valor for igual ao CLRNONE, a seta não será exibida no gráfico. Não é necessário que as ordens opostas tenham o mesmo volume. Se você fechar um pedido em uma ordem oposta, o comércio será executado no volume da ordem que tenha o menor volume. Vamos considerar um exemplo. Deixe haver dois pedidos de mercado do mesmo volume no terminal do cliente, um Buy and one Sell. Se fecharmos cada um deles separadamente usando a função OrderClose (), nossa produção econômica será a soma dos lucros obtidos de cada ordem: Fig. 95. Resultado do fechamento separado de pedidos usando a função OrderClose (). No entanto, se usarmos nesta situação, a função OrderCloseBy () destinada ao fechamento oposto de pedidos, a produção econômica será melhor (em comparação com a alternativa anterior) pela quantidade proporcional ao custo de uma distribuição de pedidos: Fig. 96. Resultado do encerramento de pedidos por outros pedidos usando a função OrderCloseBy (). É óbvio que, se houver ordens opostas a serem fechadas no terminal, seria economicamente correto usar a função OrderCloseBy (), não OrderClose (). Quanto a economizar um spread ao fechar ordens opostas, devemos dar algumas explicações mais gerais. De fato, abrir um pedido (por exemplo, uma ordem de compra) é, implicitamente, um comércio oposto à abertura de uma ordem na direção oposta (ou seja, uma ordem de venda) ao mesmo grau que o fechamento da ordem (a compra ordem). Em outras palavras, é economicamente o mesmo qual das alternativas a utilizar: apenas para fechar uma ordem de mercado ou para abrir uma ordem oposta do mesmo volume (e depois fechar as duas ordens entre si). A diferença entre estas duas alternativas pode consistir apenas em diferentes métodos utilizados em diferentes centros de negociação para calcular o dinheiro a ser desviado para suportar ordens de mercado (ver Fig. 85 e Fig. 88). Também é fácil ver que o preço de fechamento não é necessário ser especificado na função OrderCloseBy () para fechar ordens opostas. É desnecessário, porque o lucro e a perda de duas ordens opostas repitam mutuamente, de modo que a produção econômica total não depende do preço de mercado. Claro, esta regra é efetiva apenas para pedidos do mesmo volume. Se, por exemplo, temos duas ordens para um símbolo: uma ordem de compra de 1 lote e uma ordem de venda de 0,7 lotes, esse comércio depende apenas do preço de mercado relacionado com a parte de compra de 0,3 lot, enquanto que 0,7 lotes de Ambos os pedidos não dependem do preço do símbolo. Pedidos opostas não influenciam os resultados comerciais totais. É por isso que as táticas de negociação baseadas na abertura de ordens opostas não possuem conteúdo informal (por esse motivo, alguns centros de negociação fecharam forçosamente quaisquer ordens opostas dentro dos montantes coincidentes). A única influência (negativa) dessas táticas pode consistir em desviar dinheiro de acordo com as regras aceitas em alguns centros de negociação. Além disso, a disponibilidade de várias ordens opostas fornece mais dificuldades no contexto da negociação programada do que uma ordem. Se considerarmos várias comissões e swaps (para cada ordem de mercado separadamente), a necessidade de fechar pedidos opostos torna-se óbvia. Um exemplo de um script simples que fecha todas as ordens opostas para um símbolo (closeby. mq4). O algoritmo do script acima é um pouco diferente dos precedentes. Esta diferença consiste em que o mesmo código deve ser executado muitas vezes para fechar vários pedidos (a quantidade de pedidos a serem fechados não limitados) com sucesso. 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. Para fechar as ordens opostas disponíveis, devemos predefinir os critérios de seleção. Este critério no algoritmo dado é o tamanho da ordem - as ordens de volumes maiores são fechadas primeiro, então as ordens de volumes menores são fechadas. Depois que as ordens opostas de diferentes volumes foram fechadas, as ordens dos volumes de repouso permanecem. Por exemplo, o fechamento de ordens opostas Comprar (1 lote) e Vender (0,8 lote) resultará na compra da ordem (0,2 lot) permanece aberta. É por isso que, após cada encerramento bem sucedido, o programa deve se referir à lista atualizada de pedidos para encontrar duas outras ordens opostas maiores nesta lista atualizada. Os cálculos acima são realizados em um ciclo (condicional) contínuo enquanto, nos blocos 2-10. O início do ciclo, em cada iteração o programa supõe que já não há ordens de um determinado tipo. Para isso, o valor de -1 é atribuído às variáveis ​​HedgBuy e HedgSell. O algoritmo do bloco de processamento de pedidos é, em geral, preservado (veja o código de closeby. mq4). No ciclo de busca de pedidos para, nomeadamente, no bloco 3-4, como nos programas anteriores, as ordens quotwrongquot são filtradas. Neste caso, estes são pedidos abertos para outro símbolo e pedidos pendentes. No bloco 4-5, o volume de cada ordem verificada no bloco 3-4 é calculado. Se ocorrer durante cálculos que o pedido atualmente processado é o maior volume entre todas as ordens processadas, seu ticket é armazenado. Isto significa que a ordem com este bilhete é, nesta fase de cálculos, um candidato para encerramento de ordens opostas. No momento em que a última iteração do ciclo de acabamentos, já foram conhecidos os bilhetes de pedidos com quantidade máxima de lotes abertos em direções opostas. Essas ordens são selecionadas pelo programa. Se qualquer ordem de qualquer tipo já se tornou indisponível por este momento, o bloco 5-6 sai do programa. O bloco 6-10 representa o processamento de erros. É completamente o mesmo que os considerados acima (neste e em seções anteriores). O pedido comercial para o fechamento de ordens opostas é formado no bloco 7-8 usando a função OrderCloseBy (). Se ele falhar, de acordo com o código de erro, o programa passa o controle para tentar novamente fazer o comércio (para os mesmos tickets) ou para o retorno do operador que termina as operações do programa. Se um comércio for executado com sucesso, o programa sai do bloco de processamento de erros e a iteração atual do ciclo mais externo enquanto terminará. A próxima iteração deste ciclo, todos os cálculos serão repetidos: busca nas encomendas disponíveis, seleção de pedidos de mercado, seleção de um marcado para cada tipo de ordem, formando pedido comercial para fechamento oposto e posterior análise de erros. Este ciclo é executado até que não existam pedidos disponíveis de um determinado tipo (ou, em caso particular, de ambos os tipos) no terminal. Este evento será calculado no bloco 5-6, então o programa encerra suas operações. As seguintes mensagens foram recebidas na execução do script nearby. mq4 destinado ao fechamento de ordens de mercado mostradas na Fig. 97: Na guia quotAccount Historyquot da janela quotTerminalquot, você pode ver que alguns pedidos são fechados com lucro zero. Isso é o que economizamos ao fechar ordens opostas. Você pode comparar os resultados econômicos na Fig. 97 e Fig. 99: Na guia quotJournalquot na janela quotTerminalquot, você pode rastrear o histórico de fechamento de pedidos (os últimos eventos estão no topo): a execução do script, de acordo com o algoritmo, as ordens de volume máximo disponível no momento serão fechadas. Apesar do fato de que as ordens foram abertas em uma seqüência aleatória (Fig. 97), as primeiras ordens para serem fechadas foram Comprar 778594 e Vender 778595, com os volumes de 1 lote e 0,8 lote, respectivamente (as linhas inferiores na Fig. . 100). Uma vez que estas ordens têm volumes diferentes, o fechamento oposto produziu uma nova ordem, Comprar 778597, com o volume de repouso de 0,2 lot. Em seguida, o programa selecionou encomendas Comprar 778592 e Vender 778593, 0,5 lot cada, para ser fechado como ordens opostas. Essas ordens foram fechadas sem abrir um pedido de repouso. No momento em que a terceira iteração começou, duas ordens permaneceram na janela de símbolos no ciclo externo: ordem inicial Vender 778596 de 0,3 lot e a ordem aberta como resultado da execução do script, Compre 778597 de 0,2 lotes. Nas linhas superiores da Fig. 100, você pode ver que essas ordens também são fechadas como ordens opostas. Os volumes dessas ordens eram diferentes, de modo que o último comércio resultou em uma única ordem de mercado de 0.1 lot permaneceu na janela de símbolos (observe os resultados econômicos): é conveniente usar o script closeby. mq4 no comércio manual, especialmente em Casos de muitas ordens de mercado direcionadas de forma diferente disponíveis na janela de símbolos. Fechar Todos os Trades Script para MT4 Postado em 13 de dezembro de 2013 em Scripts 1 Para trocar FAST com MT4 Meta Trader 4, recomenda-se que você tenha Close All Trades Script Práticas em tais situações. Abaixo estão vários scripts que você arrastou o amplificador para o seu gráfico e ele irá pré-configurar tarefas que foi projetado para fazer. Fechar Todas as trades Script são uma maneira simples, mas eficaz de negociar. For Example if you have 20 open trades and they all turn in your favor you can close them all simultaneously easily with one click Or for Example if you are in critical situation and all orders turn against you on some high impact news you can just quickly close all orders or pending orders or both just with a drag and drop of Close All Trades Script Description of Close All Trades Script: CloseAllTrades 8211 closes all opened and pending orders on all symbols CloseAllTradesCurrent 8211 closes all opened and pending orders on current chart symbol CloseAllTradesOpened 8211 closes all opened orders on all symbols CloseAllTradesOpenedCurrent 8211 closes all opened orders on current chart symbol CloseAllTradesPending 8211 closes all pending orders on all symbols CloseAllTradesPendingCurrent 8211 closes all pending orders on current chart symbol CloseAllTradesBuy 8211 closes all opened buy orders on all symbols CloseAllTradesBuyCurrent 8211 closes all opened buy orders on current chart symbol CloseAllTradesSell 8211 closes all opened sell orders on all symbols CloseAllTradesSellCurrent 8211 closes all opened sell orders on current chart symbol How to install Close All Trades Script in MetaTrader 4 MT4: DownloadCopySave the MQ4EX4 file into your C:Program FilesMetaTrader 4expertsscripts folder (or change the folder to your installation sometimes forex broker name) Restart your MetaTrader 4 application (assuming it8217s currently open) 8230 or Launch your MetaTrader 4 application On the left hand side, look for the 8220 Navigator 8221 window and under the 8220 Common 8221 tab, look into the 8220 Scripts 8221 section Locate the indicator which you have just downloaded into the folder stated in Step 1 Drag (Click and drag) the Script onto the chart (when you want the task to be performed) yaaaaaaayyy8230 your task should now be executed8230 Subscribe Connect: Subscribe to our e-mail newsletter to receive updates and please visit us on our social networks: Related Post s: Towers Scalping Strategy Profit On Drop Script for MT4 One Response to Close All Trades Script for MT4 Leo September 12, 2014 at 02:24 Thanks. My current CloseAll() script fails to work after the 670 Built MT4 upgrade. Try the CloseAllTrades() script here and it works without a glitch. Thread: Close all buy and close all sell orders Here are two examples, For each pair that you want to manage, you have to copy these codes and to modify the symbol at line 20. Funyoo, do you have a script or an EA that can be placed on an open window so that it will close all open trades if the total profit has reached a certain percentage or a certain number of pips or something to that extent. UPDATE NEVERMIND FUNYOO. I FOUND ONE ON THE INTERNET CALLED quotTHE MULTI PURPOSE TRADE MANAGERquot. IT WORKS GREAT THANKS FOR EVERYTHING YOU HAVE DONE FOR ME. Last edited by stevensouders 12-17-2010 at 21:46. Junior Member Join Date Oct 2012 Posts 1 Hi Funyoo. im new to FX and EA. I have tried to find EA for quotclose all sellquot or quotclose all buyquot when hit target but couldnt find. I found only close all sell or all buy without the quotHIT TARGET or PROFITquot. Is it possible if you could help me to create 1 EA which content below:- 1)Close all sell if profit hit X target. 2)Close all buy if profit hit X target. 3)Include trailing stop (If possible, if cannot no problem) 4) Do not close if equity or margin level less than X if we close all buy or close all sell (If possible, if cannot no problem) Note: If no 4 is quite difficult to code so just no 1,2 and 3 in one EA. If no 4 and 3 difficult so just no 1 and 2 in one EA If still difficult just create no 1 and 2 separately. It would be really gratefull if you could provide me with the above. Thanks in advance Last edited by djanggo 10-20-2012 at 02:20.Closing and Deleting Orders Trade requests for closing of market orders are formed using the function OrderClose(). Function OrderClose() It is a function used to close a market order. The function returns TRUE, if the trade is performed successfully. It returns FALSE, if the trade fails. ticket - the unique number of the order. lots - the amount of lots to be closed. It is allowed to specify a value that is less than the available amount of lots in the order. In this case, if the trade request is successfully executed, the order will be closed partly. price - close price. This parameter is set according to the requirements and limitations accepted for performing of trades (see Order Characteristics and Rules for Making Trades and Appendix 3 ). If there is no requested price available for closing of the market order in the price flow or if it is outdated, this trade request will be rejected if the price is outdated, but found in the price flow and, at the same time, its deviation from the current price ranges within the value of slippage, the trade request will be accepted by the client terminal and sent to the trade server. slippage - the maximum allowed deviation of the requested price for closing of the order from the market price (in points). Color - the color of the closing arrow in a chart. If this parameter is unavailable or its value is equal to that of CLRNONE, the arrow will not be displayed in the chart. If the program contains information about the type of the order to be closed, about its unique number, as well as about the amount of lots to be closed, then it is very easy to close the order. For this, you should use in the program code the OrderClose() function call with preset parameters. For example, if the unique number of the order Buy is 12345 and if you want to close 0.5 lot, the call to the function closing the order may look like this: In order to decide about what orders and in what sequence should be closed, you have to have data of all orders opened in the current situation. In MQL4, there is a number of functions that can be used to get various data that characterize any order. For example, the function OrderOpenPrice() returns the value of the order open price (or of the requested price for pending orders), the function OrderLots() returns the amount of lots, the function OrderType() returns the type of the order, etc. All functions that return the values of an order characteristic call at their execution to the order that has been selected by the function OrderSelect(). Function OrderSelect() In order to get the parameters of any of your orders (no matter market or pending, closed or deleted ones), you should first select it using the function OrderSelect(). OrderSelect is a function that selects an order for further operations with it. It returns TRUE, if the function is executed successfully. Otherwise, it returns FALSE. index - the order position or number, it depends on the second parameter. select - the flag of selection method. Parameter select can take one of two possible values: SELECTBYPOS - in the parameter index, the order number in the list is returned (the numbering starts with 0), SELECTBYTICKET - in the parameter index, the ticket number (the unique order number) is returned. pool - the data source for selection. The parameter pool is used, when the parameter select is equal to the value of SELECTBYPOS. The parameter pool is ignored, if the order is selected by the ticket number (SELECTBYTICKET). The parameter pool can take on of two possible values: MODETRADES (by default) - the order is selected in open and pending orders, i. e. among the orders displayed in the quotTradequot tab of the quotTerminalquot window MODEHISTORY - the order is selected in closed and deleted orders, i. e. among the orders displayed in the quotAccount Historyquot tab of the quotTerminalquot window. In this case, the depth of history specified by the user for displaying of closed and deleted orders is important. In order to demonstrate the method of using trade functions for closing of market orders, lets solve a problem: Problem 28. Write a script that closes one of the market orders available on the account. The script execution must result in closing of the order closest to the location of the script attached to the symbol window with the mouse. Suppose there are three market orders opened in the terminal for the symbol EurUsd and a pending order opened for UsdChf: Fig. 90. Displaying several orders opened for different symbols in the terminal window. We should write such a script that can be dragged by the mouse from the quotNavigatorquot window into the symbol window, which should result in closing of one of the market orders, namely, the order closest to the cursor (as of the moment when the user released the mouse button). In Fig. 91, you can see the alternative, at which the cursor is closest to order Sell 4372889. It is this order that must be closed as a result of the script execution. To solve the problem, we should select (using the function OrderSymbol()) among all orders only those opened for the symbol, in the window of which the script is dropped. Then we should find the open prices of all selected market orders (i. e. execute the function OrderOpenPrice() successively for each order). Knowing the order open prices, we can easily select one of them that corresponds with the statement of the problem. To specify the proper values of parameters in the function OrderClose(), we will also need to know some other data about the selected order: the amount of lots (determined by the function OrderLots()) and the unique order number (determined by the function OrderTicket()). Besides, to find one or another price of a two-way quote, we have to know the type of the order (determined by the function OrderType()). Lets consider what parameters must be specified in the function OrderSelect() in order to obtain the above order characteristics. First of all, it is necessary to choose the order selection method. In our problem, the selection method is determined by the problem statement itself: The data about order numbers is supposed to be unavailable in the program as of the moment of launching the script for execution, i. e. the program is considered to contain a block that would determine those order numbers. This means that we should check all orders one by one displayed in quotTerminalquot (Fig. 64.1), so we have to use the parameter SELECTBYPOS. The source for selection of orders is obvious, as well. To solve the problem, there is no need to analyze closed and deleted orders. In this case, we are interested in market orders only, so we will search in them using the parameter MODETRADES in the function OrderSelect(). For the parameter pool, the default value of MODETRADES is specified in the function header, so it can be skipped. Below is shown how a block for analyzing of market and pending orders can be built: In the heading of the cycle operator, the initial value is specified as i1, whereas the condition to exit the cycle is the expression iltOrdersTotal(). Function OrdersTotal() returns the total amount of market and pending orders, i. e. those orders that are shown in the quotTradequot tab of the quotTerminalquot window. This is why there will be as many iterations in the cycle as many orders participate in trading. At each iteration, when the condition is calculated in the operator if, the function OrderSelect(i-1,SELECTBYPOS) will be executed. The following important matter must be noted here: The numbering of orders in the list of market and pending orders starts with zero. This means that the first order in the list (Fig. 90) is placed in zero position, the position of the second order is numbered as 1, that of the third order is numbered as 2, etc. This is why, in the function call OrderSelect(), the value of index is given as i-1. Thus, for all selected orders, this index will always be 1 less than the value of the variable i (that coincides with the number of the next iteration). The function OrderSelect() returns true, if the order is successfully selected. It means that it is possible that an order selection can fail. This can happen, if the amount of orders changed during their processing. When programming in MQL4, you should well remember that an application program will work in the real-time mode and that, while it is processing some parameters, the values of these parameters may change. For example, the amount of market orders can change as a result of both openingclosing of orders and modifying of pending orders into market ones. This is why you should keep to the following rule when programming order processing: Orders must be processed as soon as possible, whereas the program block responsible for this processing should not, if possible, contain redundant program lines. According to the code represented in Fig. 64.3, in the header of the operator if, the program analyzes whether the next order is available in the order list at the moment when it is selected. If the next order is available, the control will be passed into the body of the operator if to process the order parameters. It must be noted that such construction does not help much, in case of possible conflicts, because the order can be lost (closed) during processing of its parameters. However, this solution turns out to be most efficient if, as of the moment of its selection, the order is not available anymore. In the body of the operator if, the parameters of the selected order are analyzed. When executing the functions OrderOpenPrice(), OrderTicket(), OrderType() and others of the kind, each of them will return the value of a certain characteristic of the order selected as a result of execution of the function OrderSelect(). All the above reasoning was used in the program that would solve Problem 28. An example of a simple script intended for closing of a market order, the open price of which is closer to the location of the script attachment than the open prices of other orders (closeorder. mq4 ). The whole code of the program closeorder. mq4 is concentrated in the special function start(). In block 1-2, some variables are initialized. The variable Dist is the distance from the location where the script has been dropped to the closest order. The variable RealOrder is a flag that displays the availability of at least one market order in the client terminal (nonnegative value). The variable WinPrice is the price, at which the user has attached the script to the symbol window. In block 2-6, the order is analyzed: One of the orders available is assigned to be closed. Block 6-10 is the block of closing the order and of processing the errors that can occur during performing of the trade. Starting from the moment when the user attached the script to the symbol window, the values of the variables are calculated in block 1-2, the variable WinPrice taking the value of the price, at the level of which the user attached the script. It is now necessary to find the order (with its characteristics) that is closest to this location. In the cycle for (block 2-6), the orders are searched in. In block 2-3, the program checks whether there is an order in the next line of the quotTerminalquot. If an order is found, the control is passed to the body of the operator if to get and analyze the characteristics of that order. In block 3-4, the orders opened for wrong symbols (not the symbol, for which the program is being executed) are filtered out. In our case, it is order 4372930 opened for UsdChf. Function OrderSymbol() returns the symbol name of the selected order. If this symbol name is other than that, for which the program is being executed, the current iteration is broken, preventing the order opened for another symbol from being processed. If the order under analysis turns out to be opened for quotourquot symbol, one more check will be performed. The order type is determined using the function OrderType() (see Types of Trades ). If the order type turns out to be more than 1, it means that the order is a pending one. In this case, the current iteration is interrupted, too, because we are not interested in pending orders. In our example, we have such an order, but it is opened for another symbol, so it has already been filtered out. All orders that pass block 3-4 successfully are market ones. Block 4-5 is intended for selecting only one order of all market orders that have successfully passed the preceding block. This order must be the closest to the predefined price (the value of the variable WinPrice). The user is not required to quotpinpointquot the order line with his or her mouse cursor. The order that is closer than any other orders to the cursor as of the moment of launching the script for execution will be selected. The open price of the order processed is found using the function OrderOpenPrice(). If the absolute value of the distance between the price of the current order and the quotcursor pricequot is less than the same distance for the preceding order, the current order will be selected (the absolute value of the distance is necessary for excluding of the influence of the cursor position - under or above the order line). In this case, this order will be memorized at the current iteration of the cycle for as a front-runner for being closed. For this order, the ticket number (the individual number of the order) and the amount of lots are calculated at the end of block 4-5. In this example (Fig. 90), the total amount of orders is four (three market ones and one pending order), so there will be four iterations executed in the cycle for, which will result in finding all necessary data for closing of one selected order. Then the control in the executing program will be passed to the cycle operator while (block 6-10). In block 6-7, the market orders found are checked for availability. If no market orders are found in block 2-4 (it is quite possible, in general), the value of the flag RealOrder remains equal to -1, which means the unavailability of market orders. If the checking in block 6-7 detects no market orders, the execution of the cycle while is broken, the program then finishes its operations. If the value of the variable RealOrder turns out to be equal to 0 or 1, this means that a market is predefined for closing and must be closed. In block 7-8, according to the order type, the close price of the order is calculated. It is the value of Bid for Buy orders, and the value of Ask for Sell orders (see Requirements and Limitations in Making Trades ). In block 7-8, the values of the auxiliary variable Text are calculated. The trade request for closing of the order is formed in the function OrderClose() in the line below: Trade function OrderClose() returns true, if the trade is made successfully, and false, if not. If the trade request is successfully executed on the server, the value true will be assigned to the variable Ans (answer). In this case, when executing block 8-9, the program will inform the user about successful order closing. After that, the execution of the cycle operator while will be stopped, and the program will end its operations. Otherwise, the control will be passed to block 9-10 in order to analyze the error returned by the client terminal to the program. At the beginning of block 9-10, the error code is calculated. After that, according to the error code, either program exit or repeated operation are executed. In the first operator switch, the program processes the errors that are implicitly overcomable, i. e. the errors can be considered as temporary difficulties in performing of the trade. All necessary actions are taken for each of such errors, then the current iteration is stopped and the execution of the cycle while restarts. (Please note that, in this example, we use for error processing the operator switch that is exited as a result of using of the operator continue that, as such, is not intended for passing of the control outside the operator switch. This construction works just because the operator switch is a part of contents of the external cycle operator while and the operator continue interrupts the current iteration by passing of the control to the header of the operator while). If the error code is not processed in the first operator switch, this error is considered to be critical. In this case, the control is passed to the second operator switch, which is executed in order to inform the user that one or another critical error has occurred. Further, the program uses the operator break that interrupts the execution of the cycle while. Exiting the cycle while, for any reason, will result in passing of the control to block 9-10 that produces a message about the end of the program operations. The operator return stops the execution of the special function start(), and the program finishes its operations. Practical result obtained after launching of the script under the stated conditions (see Fig. 90 and 91) is shown below. The trade was successfully made on the server. As a result of closing of one of the orders, there are two orders left in the window of EurUsd. Order closing has also been displayed in the quotTerminalquot window: Fig. 94. After Execution of the Script closeorder. mq4. Two Market Orders Are Displayed in the quotTerminalquot Window. Later, the other two orders are closed using this script, too. Deleting Pending Orders Trade requests for deleting of pending orders are formed using the function OrderDelete(). Function OrderDelete() The function deletes the previously placed pending order. It returns TRUE, if it has worked successfully. Otherwise, it returns FALSE. ticket - the unique number of an order. arrowcolor - the color of an arrow in a chart. If this parameter is unavailable or its value is equal to that of CLRNONE, the arrow will not be displayed in the chart. Its easy to see that the function OrderDelete( ) does not contain a specification of the volume and the close price of the order to be deleted. The order is deleted regardless any market prices. The partly deletion of an order is impossible, too. You can decrease the amount of lots in a pending order in two stages: delete the existing order and then place a new pending order with the decreased (any) amount of lots. The algorithm of the program that will delete a pending order can be quite identical to that of market order closing. A slight difference is in that no close price is needed to delete a pending order, so the program below does not contain the block that updates market prices. An example of a simple script intended for deletion of a pending order, the requested price of which is closer to the location of the script attachment than the prices of other pending orders (deleteorder. mq4 ). The error-processing block has also been slightly changed. You should consider the possibility of errors related to price changes (errors 135 and 136) when closing market orders, but such errors dont occur when deleting pending orders. For the same reason, the function RefreshRates() is used nowhere in the program. Processing such errors as error 4 and error 137 (see Error Codes ) can be a bit difficult. For example, when getting error 137, the program can take into consideration that quotbroker is busyquot. However, a natural question arises: When is the broker free, for the user to continue his or her trading Error 137does not provide such information. This is why the programmer must decide him or herself how to build the program processing such errors properly. In a simple case, the request can be repeated after a certain pause (in our example, in 3 seconds). On the other hand, after a series of unsuccessful attempts to delete (or, in a common case, to close, open or modify) an order, the server may return error 141 - too many requests. This error results in that the script deleteorder. mq4 stops working. Generally, such conflicts are not the matters of programming. In such cases, you should contact the dealing centers support service and clarify the reasons for the rejection to execute the trade request. Error 145 can occur, if a pending order (in a common case, it can be a stop order of a market order) is too close to the market price. This error does not occur, if you are steadily trading on a calm market. If prices change rapidly, your broker may decide that a certain order will be opened soon, so the broker will not allow to delete or modify it. This error is considered in the script as a critical one and results in termination of the program (it doesnt make any sense to bother the broker with trade requests). If the price changes after a while, you can try to delete the order by launching the script for execution again. Generally, the occurrence of error 145 can be prevented, if you consider the freeze level set by the dealing center. Freeze level is a value that determines the price band, within which the order is considered as frozen, i. e. it can be prohibited to delete it. For example, if a pending order is placed at 1.2500 and the freeze level is equal to 10 points, it means that, if the price ranges from 1.2490 through 1.2510, the deletion of the pending order is prohibited. You can get the freeze level value having executed the function MarketInfo() with the request identifier of MODEFREEZELEVEL. Closing Opposite Orders Opposite (Counter) Order is a market order opened in the direction opposite to the direction of another market order opened for the same symbol. If you have two opposite orders for a certain symbol, you can close them simultaneously, one by another, using the function OrderCloseBy(). You will save one spread if you perform such an operation. Function OrderCloseBy() The function closes one market order by another market order opened for the same symbol in the opposite direction. The function returns TRUE, if it is completed successfully, and FALSE, if not. ticket - the unique number of the order to be closed. opposite - the unique number of the opposite order. Color - the color of the closing arrow in a chart. If this parameter is unavailable or its value is equal to that of CLRNONE, the arrow will not be displayed in the chart. It is not necessary that opposite orders have the same volume. If you close an order by an opposite order, the trade will be perform in the volume of the order that has the smaller volume. Lets consider an example. Let there be two market orders of the same volume in the client terminal, one Buy and one Sell. If we close each of them separately using the function OrderClose(), our economic output will be the sum of the profits obtained from each order: Fig. 95. Result of separate closing of orders using the function OrderClose(). However, if we use in this situation the function OrderCloseBy() intended for opposite closing of orders, the economic output will be better (as compared to the preceding alternative) by the amount proportional to the cost of one orders spread: Fig. 96. Result of closing orders by other orders using the function OrderCloseBy(). It is obvious that, if there are opposite orders to be closed in the terminal, it would be economically sound to use the function OrderCloseBy(), not OrderClose(). As to saving a spread at closing of opposite orders, we should give some more general explanations. As a matter of fact, opening an order (for example, a Buy order) is implicitly a trade that is opposite to opening of an order in the opposite direction (i. e. a Sell order) to the same degree as closing the order (the Buy order). In other words, it is economically the same which of the alternatives to use: just to close a market order or to open an opposite order of the same volume (and then close both orders by each other). The difference between these two alternatives may only consist in different methods used in different dealing centers to calculate the money to be diverted to support market orders (see Fig. 85 and Fig. 88 ). It is also easy to see that the close price is not necessary to be specified in the function OrderCloseBy() for closing of opposite orders. It is unnecessary, because the profit and the loss of two opposite orders repay mutually, so the total economic output does not depend on the market price. Of course, this rule is effective only for orders of the same volume. If, for example, we have two orders for one symbol: a Buy order of 1 lot and a Sell order of 0.7 lot, this trade only depends on the market price as related to the Buy order part of 0.3 lot, whereas 0.7 lot of both orders dont depend on the symbol price. Opposite orders do not influence the total trading results. This is why trading tactics based on opening of opposite orders dont have any informal contents (for this reason, some dealing centers forcedly close any opposite orders within the coinciding amounts of lots). The only (negative) influence of such tactics may consist in diverting of money according to the rules accepted in some dealing centers. Besides, the availability of several opposite orders provides more difficulties in the context of programmed trading, than one order does. If we consider various commissions and swaps (for each market order separately), the necessity to close opposite orders becomes obvious. An example of a simple script that closes all opposite orders for a symbol (closeby. mq4 ). The algorithm of the above script is a bit different than the preceding ones. This difference consists in that the same code must be executed many times in order to close several orders (the amount of orders to be closed in not limited) successfully. The script was tested on a random set of market orders. 5 orders of different volumes are represented in Fig. 97 below. In order to close the available opposite orders, we should predefine the selection criteria. This criterion in the given algorithm is the order size - the orders of larger volumes are closed first, then the orders of smaller volumes are closed. After the opposite orders of different volumes have been closed, the orders of the resting volumes remain. For example, the closing of opposite orders Buy (1 lot) and Sell (0.8 lot) will result in that order Buy (0.2 lot) remains opened. This is why, after each successful closing, the program must refer to the updated list of orders to find two other largest opposite orders in this updated list. The above calculations are realized in a (conditionally) continuous cycle while, in blocks 2-10. the beginning of the cycle, at each iteration the program supposes that there are no orders of a certain type anymore. For this, the the value of -1 is assigned to the variables HedgBuy and HedgSell. The algorithm of the order-processing block is, in general, preserved (see the code of closeby. mq4). In the order-searching cycle for, namely in block 3-4, like in the preceding programs, quotwrongquot orders are filtered out. In this case, these are orders opened for another symbol and pending orders. In block 4-5, the volume of each order checked in block 3-4 is calculated. If it turns out during calculations that the currently processed order is the largest in volume among all orders processed, its ticket is stored. This means that the order having this ticket is, at this stage of calculations, a candidate for closing of opposite orders. By the moment when the last iteration of the cycle for finishes, the tickets of orders with maximum amount of lots opened in opposite directions have already been known. These orders are selected by the program. If any orders of any types have already become unavailable by this moment, block 5-6 exits the program. Block 6-10 represents error processing. It is completely the same as those considered above (in this and preceding sections). The trade request for closing of opposite orders is formed in block 7-8 using the function OrderCloseBy(). If it fails, according to the error code, the program passes the control either to retry making the trade (for the same tickets) or to the operator return that ends the program operations. If a trade is successfully performed, the program exits the error-processing block, and the current iteration of the most external cycle while will end. the next iteration of this cycle, all calculations will be repeated: searching in the orders available, selecting market orders, selected one ticked for each of order types, forming a trade request for opposite closing, and subsequent error analyzing. This cycle is executed until there are no available orders of a certain type (or, in a particular case, of both types) in the terminal. This event will be calculated in block 5-6, then the program ends its operations. The following messages were received at the execution of the script closeby. mq4 intended for closing of market orders shown in Fig. 97: On the quotAccount Historyquot tab of the quotTerminalquot window, you can see that some orders are closed with a zero profit. This is what we save when closing opposite orders. You can compare economic results in Fig. 97 and Fig. 99: On the quotJournalquot tab in the quotTerminalquot window, you can track the history of order closing (the latest events are on top): the execution of the script, according to the algorithm, the orders of maximum volume available at the moment will be closed. In spite of the fact that the orders were opened in a random sequence (Fig. 97), the first orders to be closed were Buy 778594 and Sell 778595, with the volumes of 1 lot and 0.8 lot, respectively (the lower lines in Fig. 100). Since these orders have different volumes, the opposite closing produced a new order, Buy 778597, with the resting volume of 0.2 lot. Then the program selected orders Buy 778592 and Sell 778593, 0.5 lot each, to be closed as opposite orders. These orders were closed without opening a resting order. By the moment the third iteration started, two orders had remained in the symbol window in the external cycle: initial order Sell 778596 of 0.3 lot and the order opened as a result of the execution of the script, Buy 778597 of 0.2 lot. In the upper lines of Fig. 100, you can see that those orders are also closed as opposite orders. The volumes of those orders were different, so the last trade resulted in that one market order of 0.1 lot remained in the symbol window (please note the economic results): It is convenient to use the script closeby. mq4 in manual trading, especially in cases of many differently-directed market orders available in the symbol window.

No comments:

Post a Comment