MetaTrader 4 - Exemplos MagicNumber: quotMagicquot Identificador do Pedido 1. Preâmbulo Em 3, o gerenciamento de posições em aberto era bastante demorado. Os comerciantes tinham à sua disposição uma ferramenta bastante limitada para trabalhar com a lista de posições abertas e fechadas. O problema de distinguir entre posições próprias e de outra pessoa foi resolvido de maneira bastante complicada. Em 4, a situação mudou cardinalmente. Agora, o trader pode usar uma grande variedade de funções e gerenciar totalmente todas as posições abertas e fazer pedidos e ter acesso a informações sobre quaisquer posições fechadas. Um parâmetro especial chamado MagicNumber foi adicionado para identificar pedidos. Este é o parâmetro com o qual o nosso artigo irá lidar. 2. O que é MagicNumber int OrderSend (símbolo string, int cmd, volume duplo, preço duplo, slippage int, double stoploss, takeprofit duplo, string commentNULL, int magic0. Datetime expiration0, cor arrowcolorCLRNONE) magic - Ordem magic number. Pode ser usado como identificador definido pelo usuário, ou seja, quando um pedido está sendo colocado (uma posição está sendo aberta), pode-se atribuir um número único a ele. Este número será consequentemente usado para distinguir a ordem acima de outras. Não há nenhum uso (ou mesmo possibilidade) de aplicar esse recurso ao negociar manualmente, mas é realmente inexpendível ao negociar usando um especialista (negociação automatizada). Exemplo 1: Um operador humano e um especialista estão negociando no terminal do cliente ao mesmo tempo. Tarefa: O especialista deve negociar de acordo com seu algoritmo e pode não fazer nada com posições abertas manualmente. Solução: o especialista deve atribuir um MagicNumber diferente de zero à posição que está sendo aberta. No futuro, ele deve gerenciar apenas posições, o MagicNumber do qual é igual ao pré-definido. Exemplo 2: Dois especialistas com diferentes algoritmos estão negociando no terminal do cliente ao mesmo tempo. Tarefa: O especialista deve gerenciar apenas seus pedidos. Solução: Cada especialista deve usar seu MagicNumber diferente de zero ao abrir posições. No futuro, eles devem gerenciar apenas posições, o MagicNumber do qual é igual ao pré-definido. Exemplo 3: Diversos especialistas, um operador humano e um especialista assistente que realizam uma Parada Móvel Padrão estão operando no terminal do cliente simultaneamente. Tarefa: Especialistas em negociação devem trabalhar de acordo com seus algoritmos e podem não fazer nada com posições abertas manualmente. O perito assistente que realiza o Trailing Stop pode modificar apenas posições abertas manualmente, mas não aquelas abertas por outros especialistas. Solução: Os especialistas em negociação devem usar MagicNumbers exclusivos e gerenciar apenas suas posições. O perito assistente deve modificar apenas as posições com MagicNumber igual a 0. Todos os três exemplos são bastante realistas, e os usuários provavelmente poderiam ter configurado tais problemas para eles mesmos. Nos três casos, o MagicNumber é usado para resolvê-lo. Este caminho não é o único, mas o mais fácil. 3. Realização Agora vamos resolver a tarefa específica: criar um especialista que possa trabalhar apenas com suas próprias posições sem prestar atenção às posições abertas manualmente ou por outros especialistas. Vamos primeiro escrever um especialista simples, para o qual o sinal para abrir uma posição será quando o indicador MACD estiver de acordo com a linha zero. O especialista ficará assim: Vamos anexá-lo ao gráfico e ver como ele funciona: Tudo está bem, mas há um problema aqui. Se abrirmos uma posição durante a operação de especialistas, ela considerará essa posição como sua e agirá de acordo. Não é isso que queremos. Modificaremos o nosso especialista de tal forma que ele gere apenas as suas próprias posições: Adicione a variável externa denominada ExpertID para ser usada para alterar os valores do MagicNumber para posições abertas pelo especialista. Depois da posição ter sido selecionada pela função OrderSelect (), adicionar verificação se o MagicNumber do pedido selecionado está de acordo com o da variável ExpertID. Escreveremos o valor do ExpertID em vez de 0 no campo MagicNumber durante a abertura da posição. Considerando as mudanças acima, o código aparecerá da seguinte forma: Agora, quando o especialista está trabalhando, o usuário pode abrir posições manualmente. O especialista não vai tocá-los. 4. Especialistas Múltiplos em Diferentes Cartas de Um Símbolo Há casos em que o mesmo EA deve negociar nos gráficos do mesmo símbolo, mas com prazos diferentes, por exemplo. Se tentarmos anexar nosso especialista ao gráfico EURUSD, H1, e ao EURUSD, M30, simultaneamente, eles interferirão um no outro: cada um considerará a posição aberta como sua posição e a modificará a seu critério. Esse problema pode ser resolvido atribuindo outro ExpertID ao outro especialista. Mas isso não é muito conveniente. Se há muitos especialistas usados, pode-se ficar emaranhado entre seus IDs. Podemos encontrar esse problema usando o período do gráfico como MagicNumber. Como podemos fazer isso? Se adicionarmos o período do gráfico ao ExpertID, é possível que dois especialistas diferentes em dois gráficos diferentes gerem o mesmo MagicNumber. Então, multiplicaremos melhor o ExpertID por 10 e colocaremos o período do gráfico (seu código de 1 a 9, para ser exato) no final. Será algo parecido com isto: Agora adicione este código à função init () do expert e substitua ExpertID por MagicNumber em todos os lugares. A versão final do EA se parece com isso: em tal aparência, o especialista pode ser usado em vários gráficos com períodos diferentes. O valor da variável ExpertID será alterado somente se houver a necessidade de lançar dois especialistas em gráficos do mesmo símbolo e período (por exemplo, EURUSD H1 e EURUSD H4), mas isso é muito raro. Da mesma forma, usando o código acima, o usuário pode melhorar seus EAs e ensiná-los a distinguir suas posições das estrangeiras. Aviso: Todos os direitos a estes materiais são reservados por MQL5 Ltd. A cópia ou reimpressão destes materiais, no todo ou em parte, é proibida. OrderExpiration Retorna a data de validade (se houver) para o pedido pendente ou aberto selecionado. OrderExpiration pode ser definido com a função OrderSend. O valor padrão é zero, o que significa que não há expiração na ordem inserida. OrderLots Retorna o número de lotes ou o tamanho da negociação para o pedido selecionado. OrderLots é definido na criação de pedidos com a função OrderSend. OrderMagicNumber Retorna o número mágico para o pedido selecionado. Número mágico é um número usado para diferenciar entre pedidos para um determinado símbolo e conta. Em teoria, todas as ordens poderiam ser colocadas com um número mágico separado e fechadas com uma rotina de fechamento personalizada. Na prática, diferentes estratégias ou diferentes sinais de entrada dentro da mesma estratégia podem usar diferentes números mágicos para abrir pedidos de relatórios ou para fins de fechamento de negociações. OrderOpenPrice Retorna o preço de abertura do pedido selecionado no momento. Para fazer referência ao preço de fechamento, consulte a função OrderClosePrice, que retorna o preço de pedidos históricos (fechados). OrderOpenTime Retorna o horário de abertura do pedido selecionado. OrderPrint Imprime informações sobre o pedido atualmente selecionado no registro de especialistas. As informações a seguir são retornadas: OrderTicket, OrderOpenTime, OrderType, OrderLots, OrderStopLoss, OrderTakeProfit, OrderCloseTime, OrderClosePrice, OrderCommission, OrderSwap, OrderProfit, OrderComment, OrderMagicNumber, OrderExpiration OrderProfit Retorna o valor do lucro líquido para o pedido selecionado no momento, excluindo o swap e a comissão. Para posições abertas, o valor de retorno é o patrimônio líquido aberto para o pedido selecionado. Para posições fechadas, o valor de retorno é o lucro líquido fechado para o pedido selecionado. OrderStopLoss Retorna o preço de stop loss para o pedido selecionado no momento. Se nenhum preço stop loss for definido, o valor de retorno será zero. Esse valor geralmente é definido com a função OrderModify para intermediários dos EUA e pode ser definido com a função OrderSend para intermediários não baseados nos EUA. OrderSwap Retorna o valor do swap (se houver) cobrado ou creditado na conta pelo pedido selecionado. O swap representa uma taxa de juros para a realização de uma posição durante a noite, ou um pagamento de juros para manter um par de moedas com juros durante a noite. Os swaps são definidos pelo corretor e geralmente são fixados na mesma hora todos os dias, por exemplo, às 5:00 PM EST. OrderSymbol Retorna o símbolo usado na ordem selecionada no momento. A função OrderSymbol e a função OrderMagicNumber fornecem duas maneiras de diferenciar entre pedidos colocados em uma única conta e podem ser úteis em rotinas de fechamento de pedido quando apenas determinados símbolos ou determinados números mágicos devem ser fechados. OrderTakeProfit Retorna o preço de lucro para o pedido selecionado no momento. Se nenhum preço de lucro for definido, o valor de retorno será zero. Tal como acontece com OrderStopLoss, o valor é normalmente definido com a função OrderModify para os intermediários dos EUA e pode ser definido com a função OrderSend para intermediários não baseados nos EUA. OrderTicket Retorna o número do ticket para o pedido selecionado no momento. O número do ticket é criado usando a função OrderSend. OrderType Retorna o tipo de pedido atualmente selecionado. Existem vários valores possíveis: Abertura e colocação de pedidos As solicitações comerciais para abertura e colocação de ordens pendentes são formadas usando a função OrderSend (). Função OrderSend () (por favor note que aqui e abaixo, nos referimos ao cabeçalho da função. Não a um exemplo de como usar a chamada de função em um programa). Vamos considerar em mais detalhes o que esta função consiste. OrderSend é o nome da função. A função retorna o número do ticket (ticket é o número exclusivo de um pedido) que é atribuído ao pedido pelo servidor de negociação, ou -1, se o pedido de troca tiver sido rejeitado pelo servidor ou pelo terminal do cliente. Para obter informações sobre os motivos da rejeição da solicitação de troca, você deve usar a função GetLastError () (abaixo, vamos considerar alguns dos erros mais comuns). symbol é o nome do título negociado. Cada símbolo corresponde ao valor de uma variável de string. Por exemplo, para o par de moedas de Euro / dólar americano, esse valor é ampquotEURUSDampquot. Se o pedido estiver sendo aberto para um símbolo perdido, esse parâmetro poderá ser especificado explicitamente: ampquotEURUSDampquot, ampquotEURGBPampquot, etc. No entanto, se você for usar o Expert Advisor na janela de qualquer outro símbolo, poderá usar a função padrão Símbolo(). Esta função retorna um valor de string que corresponde ao nome do símbolo, na janela em que o EA ou o script está sendo executado. cmd é o tipo de operação. O tipo de operação pode ser especificado como uma constante predefinida ou seu valor e de acordo com o tipo de troca. volume é a quantidade de lotes. Para ordens de mercado, você deve sempre verificar a conta para a suficiência. Para pedidos pendentes, a quantidade de lotes não é limitada. preço é o preço aberto. Ele é especificado de acordo com os requisitos e limitações aceitos para fazer negociações (consulte Características e regras de pedidos para fazer negócios). Se o preço solicitado para a abertura de ordens de mercado não tiver sido encontrado na linha de preço ou se tiver sido consideravelmente desatualizado, a solicitação de negociação será rejeitada. No entanto, se o preço estiver desatualizado, mas presente no encadeamento de preços e se o seu desvio dos intervalos de preços atuais estiver dentro do valor de slippage, essa solicitação de negociação será aceita pelo terminal do cliente e enviada ao servidor de negociação. slippage é o desvio máximo permitido do preço de abertura do pedido solicitado do preço de mercado para ordens de mercado (pontos). Este parâmetro não é processado para colocação de pedidos pendentes. stoploss é o preço de fechamento solicitado que determina a perda máxima permitida para o comércio em questão. Ele é definido de acordo com os requisitos e limitações aceitos para fazer negociações (consulte Características do pedido e regras para fazer negócios. Requisitos e limitações na realização de negócios). takeprofit é o preço de fechamento solicitado que determina o lucro máximo para o comércio em questão. Ele é definido de acordo com os requisitos e limitações aceitos para fazer negociações (consulte Características do pedido e regras para fazer negócios. Requisitos e limitações na realização de negócios). comment é o texto do comentário do pedido. A última parte do comentário pode ser modificada pelo servidor de negociação. Magia é o número mágico da ordem. Pode ser usado como o identificador de pedidos definido pelo usuário. Em alguns casos, é a única informação que ajuda você a descobrir que a ordem pertence a um ou outro programa que a abriu. O parâmetro é definido pelo usuário, seu valor pode ser o mesmo ou diferente do valor deste parâmetro de outras ordens. expiração é a data em que o pedido expira. Assim que esse dia chegar, a ordem pendente será fechada automaticamente no lado do servidor. Em alguns servidores de negociação, pode haver uma proibição de definir a data de vencimento para pedidos pendentes. Nesse caso, se você tentar definir um valor diferente de zero do parâmetro, a solicitação será rejeitada. arrowcolor é a cor da seta de abertura no gráfico. Se este parâmetro estiver ausente ou se seu valor for CLRNONE, a seta de abertura não será mostrada no gráfico. Em alguns servidores de negociação, pode haver um limite definido para a quantidade total de pedidos abertos e pendentes. Se esse limite for excedido, qualquer solicitação de negociação que implique a abertura de uma ordem de mercado ou a colocação de uma ordem pendente será rejeitada pelo servidor de negociação. Abertura de Ordens de Mercado A função OrderSend () pode parecer, a princípio, intricada demais. No entanto, todos os parâmetros considerados são bastante simples, úteis e podem ser usados com sucesso em sua negociação. Para ver isso por nós mesmos, vamos considerar a variação mais simples de como a função de negociação OrderSend () é usada para abrir uma ordem de mercado. Em primeiro lugar, devemos observar que a função OrderSend () tem parâmetros pré-definidos (consulte Chamada de função e Descrição da função e Retorno do operador). Isso significa que essa função pode ser usada em um modo simplificado usando o conjunto mínimo de parâmetros necessários. Esses parâmetros são os seguintes: o símbolo é um parâmetro necessário, porque precisamos saber onde abrir o pedido. Deixe nosso script sugerir a possibilidade de abrir um pedido em qualquer janela de símbolo. Neste caso, vamos substituir a função padrão Symbol () como este parâmetro cmd - por exemplo, vamos abrir uma ordem de compra, neste caso, vamos especificar o volume parâmetro OPBUY - podemos especificar qualquer valor permitido pelas regras permite abrir um pequeno ordem, por exemplo, de 0,1 preço do lote - preço aberto para o pedido Comprar é o preço Ask slippage é normalmente especificado como 0-3 pontos. Vamos especificar 2 stoploss - as ordens de parada podem ser colocadas a uma distância que não seja mais próxima que a distância mínima permitida, normalmente 5 pontos (consulte Requisitos e limitações na realização de negociações) permite colocar ordens stop a uma distância de 15 pontos do preço de fechamento a saber: Bid - 15Point takeprofit - permite colocar ordens stop a uma distância de 15 pontos do preço de fechamento, a saber: Bid 15Point Abaixo está o script mais simples, simpleopen. mq4. destinado a abrir uma ordem de compra: se você iniciar esse script para execução, ele funcionará na maioria dos casos. O script consiste em uma função especial que contém a função de abertura de pedido OrderSend () e o retorno do operador. Vamos descrever o algoritmo de execução para linhas de programa e eventos relacionados a isso. 1. O usuário anexou o script à janela de símbolo arrastando o nome do script com o botão do mouse da janela ampquotNavigatoramp do terminal do cliente para a janela do símbolo, para o qual ele deseja abrir uma ordem de compra. lote e com ordens stop que estão a uma distância de 15 pontos do preço de mercado. 2. No momento de anexar o script à janela de símbolos, o terminal do cliente está passando o controle (apenas lançando-o) oa função especial start () (aqui devemos lembrar brevemente que o início () de um script foi iniciado no momento de anexar o script à janela de símbolos, enquanto o início () de um EA é lançado no momento em que o tick mais próximo recebe o símbolo). 3. Dentro da estrutura de execução da função especial start (), o controle é passado para a linha que chama a função de abertura da ordem: Antes da execução desta função, o programa calcula os valores de todos os parâmetros formais: 3.1. Anexamos o script à janela do Eur / USd. Neste caso, a função padrão Symbol () retornará o valor da string EURUSD. 3.2. Deixe o Ask 1.2852 e o Bid 1.2850 a partir do momento de chamar esta função. 3.3. O valor de StopLoss, neste caso, será: 1.2850-150.0001 1.2835, enquanto TakeProfit 1.2865. 4. Execução da função OrderSend (): 4.1. A função formou uma solicitação de negociação para abertura de um pedido e passou essa solicitação para o terminal do cliente. 4.2. A função passou o controle para o terminal do cliente simultaneamente com a passagem da solicitação de negociação, portanto a execução do programa foi interrompida. 4.3. O terminal do cliente verificou a solicitação de troca recebida. Ele não detectou nenhum parâmetro incorreto, então enviou o pedido para o servidor. 4.4. O servidor recebeu a solicitação de negociação, verificou, não detectou nenhum parâmetro incorreto e decidiu executar a solicitação. 4.5. O servidor executou a solicitação fazendo uma transação em seu banco de dados e enviou as informações sobre essa solicitação executada para o terminal do cliente. 4.6. O terminal do cliente recebeu a informação de que a última solicitação de troca foi executada, exibiu esse evento na janela do terminal e na janela de símbolos e retornou o controle para o programa. 4.7. Uma vez tendo recebido o controle, o programa continuava trabalhando a partir do local, do qual o controle havia sido passado anteriormente para o terminal do cliente (e para o qual havia sido devolvido mais tarde). Observe que nenhuma ação foi executada no programa, começando da etapa 4.2 até a etapa 4.7 - o programa estava no modo de aguardar a resposta do servidor. 5. O controle no programa é passado para o próximo operador - o operador retorna. 6. A execução do operador retorna resultados ao sair da função start () e, portanto, no término da execução do programa (deve ser lembrado que os scripts concluem seu trabalho depois de serem executados) - o controle é retornado ao cliente terminal. Assim, o script cumpriu sua finalidade: a compra com os parâmetros predefinidos é aberta. O uso de scripts é muito conveniente, se você precisar executar uma pequena operação única 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. Os eventos nem sempre são ordenados como mostrado acima. É possível que a solicitação de troca seja rejeitada pelo terminal do cliente ou pelo servidor. Vamos tentar fazer algumas experiências, por exemplo, alterar o nome do símbolo: especifique ampquotGBPUSDampquot explicitamente (isso é bastante permitido). Obteremos um programa com o campo de uso limitado: Vamos iniciar o script na mesma janela do símbolo Eur / Usd. O script tinha a intenção de abrir um pedido na janela do Gbp / Usd. No entanto, depois de ter sido anexado à janela do Eur / Usd, nenhum pedido foi aberto na janela do Gbp / Usd. Uma desvantagem de tais programas é a sua limitação funcional. Nesse caso, uma vez que o script foi anexado à janela de símbolo, o usuário está aguardando a abertura do pedido. No entanto, o pedido não está aberto. O usuário não está ciente do motivo pelo qual é assim: ou é causado por um erro algorítmico no código do programa ou a solicitação de troca é ampquotlostampquot pelo caminho para o servidor, ou a solicitação de troca foi rejeitada pelo terminal do cliente tempo atrás (pensei que o usuário ainda está esperando), ou há outro motivo. A fim de fornecer ao usuário (e, o que também é muito importante, o programa) as informações sobre os eventos relacionados à execução da solicitação de negociação, é necessário processar os erros. Processamento de Erros Uma propriedade muito importante do terminal do cliente é que, se ocorrer um erro durante a execução de um aplicativo, o terminal do cliente não parará a execução do programa. Erros geralmente são causados pela imperfeição do algoritmo usado no aplicativo. Em alguns casos, os erros são causados por alguns fatores externos (relacionados ao programa). As causas internas de erros são quaisquer violações dos requisitos do MQL4 ou de regras de negociação, por exemplo, usando preços inválidos. As causas externas são aquelas que não estão relacionadas ao programa aplicativo, por exemplo, conexão interrompida. Se ocorrer um erro na execução de um programa, o programa continuará em execução, enquanto o terminal do cliente gerará o valor do código de erro disponível para o programa por meio da função GetLastError (). Função GetLastError () A função retorna o código do erro recém-ocorrido, então o valor da variável especial lasterror que armazena o código do último erro será zerado. A chamada GetLastError () subseqüente retornará 0. Daqui em diante, identificaremos todos os erros que ocorrem por esse código. Vários erros podem ocorrer durante a execução de uma função de programa GetLastError () nos permite obter o valor de código para apenas um deles, o erro mais recente, é por isso que toda vez que precisamos dessas informações, é recomendável usar a função GetLastError ( ) imediatamente após as linhas do programa, nas quais o erro pode ocorrer. Erro 130. Pedidos de Parada Inválidos O último script considerado não analisa erros, portanto, o usuário permanece ignorante sobre os resultados da execução da função de abertura do pedido. Na variação simples de usar a função GetLastError (), o programa pode analisar um erro e apenas informar o usuário sobre isso. Se você iniciar o script confined. mq4 para execução na janela do Eur / Usd, ocorrerá um erro. Adicionamos apenas uma linha, mas muito informativa, a este script: A função GetLastError () retorna o código do último erro, enquanto o Alert () é usado para exibir este valor na tela. Após o script confined. mq4 ter sido anexado à janela do símbolo Eur / Usd, o script será executado, o que resultará em que o usuário verá a seguinte mensagem: Você pode encontrar no Apêndice códigos de erros que podem ocorrer na execução de um programa. Nesse caso, ocorreu o erro 130 (pedidos de parada inválidos). Isso significa que os valores dos parâmetros formais usados na função OrderSend () não estão de acordo com as limitações especificadas em Requisitos e Limitações no Making Trades. Em uma visão mais próxima, podemos ver o motivo que causou o erro: os valores atuais dos preços de mercado Bid and Ask são retirados da janela de símbolos, à qual o script está anexado, ou seja, da janela do Eur / Usd. No entanto, esses valores são usados para formar uma solicitação de negociação para o Gbp / Usd. Como resultado, ao preço atual de Gbp / Usd, Ask 1,9655, o valor de TakeProfit para o pedido de mercado recém-aberto acaba sendo igual a (para Eur / Usd Bid 1,2930) 1,2930150,00011. 2945, que é consideravelmente inferior ao valor mínimo permitido, isto é, é inválido. Nesse caso, ocorreu um erro algorítmico. Para corrigi-lo, você deve usar os valores corretos dos preços dos símbolos. Você pode obter esses valores usando a função MarketInfo (). O script improved. mq4 que abre ordens de mercado para o Gbp / Usd pode ser iniciado em qualquer janela de símbolo: O erro acima não ocorre na execução deste script, portanto, sua execução resultará na exibição da mensagem correspondente: 0 (zero). Isso significa que a função GetLastError () retornou o valor 0, ou seja, nenhum erro foi detectado na execução da solicitação de troca pelo terminal do cliente. Vamos também considerar alguns outros erros comuns. Para isso, vamos voltar à idéia de abrir um pedido usando um script na mesma janela, ao qual o script está anexado. Erro 129. Preço inválido Em alguns casos, ocorre um erro simples - o valor errado da cotação bidirecional é especificado como o preço de abertura. As ordens do mercado Buy são conhecidas (consulte Requisitos e limitações na realização de negociações) para serem abertas ao preço Ask. Abaixo, é mostrado o que acontece se, por engano, especificarmos o preço do lance no script confused. mq4: Antes de enviar a solicitação de troca ao servidor, o terminal do cliente analisa se os valores solicitados de preço e ordens de parada estão em conformidade com os valores permitidos. Durante essa verificação, o preço de pedido aberto solicitado será detectado como inválido, portanto, o terminal do cliente não enviará a solicitação de troca ao servidor para execução, e a função GetLastError () retornará o valor de 129 (consulte Códigos de Erro). A execução do script resultará na aparência da mensagem de erro correspondente: Erro 134. Não é suficiente dinheiro para fazer uma negociação Um resultado semelhante (erro 134) será obtido, se não houver dinheiro livre suficiente na conta para abrir um pedido . Você pode saber sobre a quantidade de dinheiro livre necessária para abrir 1 lote para a compra de cada símbolo usando a função MarketInfo (symbolname, MODEMARGINREQUIRED). O tamanho de um lote padrão para o mesmo símbolo pode variar em diferentes centros de negociação. A quantidade necessária de ativos livres para abrir um pedido de um lote é inversamente proporcional ao valor da alavancagem fornecida. Ao mesmo tempo, o custo de 1 ponto na moeda de depósito de um símbolo não está relacionado à alavancagem fornecida. Tabela 3. Combinações possíveis de custo de 1 lote e custo de 1 ponto (a moeda de depósito é o dólar dos EUA). Centro de Negociação 1 Os preços são indicados a partir de 16.12.2007. Vamos considerar brevemente alguns métodos comuns de cálculo do custo de 1 lote e de 1 ponto. Centro de Negociação 1 (mais comum) Para os símbolos que têm USD reciprocamente, o custo de 1 lote é igual ao preço atual da cotação bidirecional correspondente multiplicado por 1000, enquanto o custo de 1 ponto é igual a 10. Para o símbolos que têm USD como seu numerador, o custo de 1 lote é igual a 1000,00, enquanto o custo de 1 ponto é inversamente proporcional à cotação atual e igual a 1 / (Bid). Por exemplo, para USD / CHF, no lance 1.2466, o custo de 1 ponto é 1/1. 2466 8,02. Para taxas cruzadas, o custo de 1 lote é calculado da mesma maneira que o da moeda do numerador, enquanto o custo de 1 ponto é calculado da mesma maneira que para a moeda do denominador. Por exemplo, para EUR / CHF, o custo de 1 lote é de 129,40 (como para EUR / USD), enquanto o custo de 1 lote é de 8,02 (como para USD / CHF). Centro de Negociação 2 Em alguns centros de negociação, considerando a mesma regra de cálculo de custos, os valores de custos podem ser diferentes para alguns símbolos. Por exemplo, o custo de 1 lote e o custo de 1 ponto podem ser proporcionalmente aumentados ou diminuídos. Por exemplo, esse fator pode ser 0,75 para GBP / USD, enquanto é 2.0 para AUD / USD. Essa representação dos valores de custo não resulta em nenhuma alteração econômica em tais casos, você só precisa considerar esse recurso especial ao calcular os custos de seus pedidos. Você também deve prestar atenção ao fato de que os custos de 1 lote para compra e venda de ativos a taxas cruzadas são os mesmos. O Centro de Negociação 3 também tem centros de negociação que definem o custo de 1 lote como 1000,00 para qualquer símbolo. Ao mesmo tempo, o custo de 1 ponto permanece proporcional aos preços atuais. Isso implica em definir uma alavancagem especial para cada símbolo. O custo de 1 ponto de todos os símbolos que não são cotados como relacionados a USD sempre muda proporcionalmente ao custo do símbolo especificado reciprocamente. Geralmente, podem existir outros princípios de construção de valores de custo. É desnecessário dizer que, antes de começar a negociação real, você deve descobrir sobre o método de cálculo para qualquer centro de negociação específico e considerar este método em sua codificação. Na codificação, é muito importante considerar o princípio de formar ativos livres. Margem livre (ativos) é a quantidade de dinheiro disponível para fazer negócios. Vamos considerar um exemplo. Deixe saldo de 5000,00, não há pedidos em aberto no terminal. Vamos abrir uma ordem de compra de 1 lote no centro de negociação 3. A seguinte regra é declarada no centro de negociação 3: Se ordens de mercado direcionadas diferentemente são abertas para um símbolo, o menor custo integrado de ordens de uma direção é liberado para negociação e aumenta o quantidade de ativos livres (esta regra não é aplicável para todos os centros de negociação). A janela do terminal exibirá as informações sobre o pedido aberto. Por favor, note que a margem faz 1000.00, o lucro do pedido é -30.00, portanto, a quantidade de ativos livres (margem livre) faz 5000-1000-303970.00: Após uma ordem de venda do mesmo valor ter sido aberta, a margem livre aumentará. O menor custo integrado de ordens de mercado de uma direção faz 1.000,00, então a margem livre aumentará em 1.000,00. Na Fig. 85, você pode ver a situação em que as ordens direcionadas diferentemente custam o mesmo valor, então a soma total dos custos de ordens é liberada para negociação. Depois que uma ordem de venda de menor custo for aberta, a margem livre também aumentará. Nesse caso, o menor custo integrado de ordens de mercado de uma direção faz 700,00, então a margem livre aumentará em 700,00, enquanto a margem faz a diferença entre os custos integrados de ordens direcionadas diferentemente (figura 86). Se mais uma ordem Venda de lote 0,1 for aberta (custo 100,00), o menor custo integrado de ordens de mercado de uma direção faz 700,00 100,00, 800,00. Assim, a margem (em comparação com a situação em que apenas uma compra é aberta) diminui em 800,00. Em comparação com a situação mostrada na Fig. 86, a margem diminui, enquanto o patrimônio aumenta em 100,00 (ver Fig. 87). As Margens Livres mostradas na Fig. 86 e na Fig. 87 diferem uma da outra em mais de 100,00, uma vez que o lucro integrado de ordens abertas mudou com a variação do preço atual (a diferença é de 8,00). Se fizermos manipulações semelhantes em outro centro de negociação, é fácil ver que a ordem acima de formar o valor da margem livre não é mantida. Para alguns centros de negociação, a seguinte regra é efetiva: A abertura de qualquer ordem de mercado não libera o patrimônio nem aumenta a margem livre. A abertura de ordens de mercado aumenta o patrimônio pelo valor que excede o custo integrado de ordens de mercado direcionadas diferentemente para um símbolo (a regra não se aplica a todos os centros de negociação). Por exemplo, se você tiver aberto anteriormente um pedido Compre 4 lotes para USD / JPY no centro de negociação 2, os montantes de patrimônio líquido e margem livre não serão alterados na abertura de um pedido de venda de 4 lotes. Fig. 88. A presença de ordens direcionadas diferentemente não libera equidade. Você pode fazer cálculos para saber se o patrimônio atual é suficiente para a abertura de um pedido. Você também pode usar a função AccountFreeMarginCheck () que retorna o valor da margem livre para permanecer após a abertura de uma ordem de mercado com certa quantidade de lotes para um determinado símbolo. Se o valor retornado for igual ou maior que 0, há dinheiro suficiente na conta. Se for menor que 0, então a ordem deste volume e para este símbolo não pode ser aberta, o terminal do cliente retornará o erro 134. Para conhecer as condições oferecidas pelo centro de negociação e a quantidade de margem livre necessária para a abertura de uma ordem com o volume de 1 lote, você pode usar um script simples, conditions. mq4: Aqui, a expressão de nos permite calcular a diferença entre a margem livre disponível e a margem livre que permanecerá após a abertura da ordem. Se iniciarmos este script para execução, quando não houver ordens de mercado no terminal, poderemos obter o montante de patrimônio atualmente necessário e suficiente para a abertura de um pedido com o volume de 1 lote para compra e venda: Lançamos o script conditions. mq4 para execução na janela do símbolo, para o qual existem ordens de mercado abertas, podemos obter outros valores, depende dos métodos de cálculo aceitos em um ou outro centro de negociação. Outros erros e função MarketInfo () Existem outras limitações relacionadas à determinação dos valores dos parâmetros da função OrderSend (). Esta é a etapa máxima e mínima do preço do pedido, o valor máximo e mínimo do preço do pedido, etc. O uso da função MarketInfo () permite obter várias informações sobre símbolos mostrados na janela ampquotMarket Watchampquot do terminal do cliente. Função MarketInfo () A função retorna várias informações sobre símbolos listados na janela ampquotMarket Watchampquot do terminal do cliente. Partes de informações sobre o símbolo atual são armazenadas em variáveis predefinidas. símbolo - o nome de um tipo de símbolo - identificador de solicitação que determina o tipo de informação a ser retornada. Pode ser o valor daqueles dos identificadores de solicitação (consulte Função Identificador MarketInfo). Alguns erros podem ocorrer pelos motivos no lado do servidor. Por exemplo, nas condições de preços transitórios, seu corretor pode aumentar a distância mínima que limita a colocação de ordens pendentes e ordens de parada. Além disso, em um mercado calmo, o corretor pode diminuir essa distância novamente. Assim, os valores de alguns parâmetros podem ser alterados a qualquer momento. Para que o programa opere de maneira estável, com a quantidade mínima de solicitações rejeitadas, você deve atualizar os parâmetros do ambiente de informações usado pelo programa usando as funções MarketInfo () e RefreshRates () antes de executar a função OrderSend (). Um exemplo de um script simples que abre uma ordem Buy custando 35 da margem livre, com alguns valores predefinidos de stop orders (openbuy. mq4). O script consiste em uma função especial start () (blocos 1-10). No bloco 1-2, os valores são definidos, nos quais a ordem deve ser aberta. O bloco 2-9 representa o operador de ciclo while (), no qual todos os cálculos necessários são executados. Este ciclo está incluído no código para permitir que o programa faça várias tentativas para abrir o pedido. No bloco 2-3, as variáveis de ambiente são atualizadas. Nos blocos 3-4-5-6, a quantidade de lotes e os preços solicitados das ordens de parada são calculados. No bloco 7-8-9, os erros são processados. No bloco 9-10, a mensagem é impressa informando que o script concluiu suas operações. Vamos considerar algumas características especiais de um código de programa. Its easy to see that the trade request is formed in block 6-7. In block 3-4, the amount of lots is calculated. It also considers the situation when the available free margin is insufficient to open even an order with the minimum amount of lots. This is why, in block 3-4, after printing the message about insufficient money, we exit cycle 2-9 using the operator break. The control is passed to block 9-10, and script completes its operations. The message in block 9 is unnecessary. It is given here just to help users of the code to find tails or heads in the script - when is the end of the programs operations and when is the pause caused by delays in the network or on the server. If the free margin is sufficient for opening of the order, the control will be passed to block 4-5 and then to block 5-6. In those blocks, there is no cycle exit. This means that, for any minimum distance set by the broker, there will be corresponding stop levels found. In block 1-2, 3 points were chosen for TP by design. The majority of brokers set the minimum distance as 5 points. In block 5-6, the program will discover that the preset value is less than the allowed one. The program will set such a value of the stop-order price that does not contradict the limitation. then the control is passed to block 6-7 to open an order. In the first line of this block, the message is printed. The trade request is formed only in the second line. A question arises: Why do we declare about forming a request before it is really formed We could give the instruction first and then inform the user about it. The answer to this question is closely related to the technology of sending the request to the client terminal and then to the server (see Fig. 66). In our case, the trade request is formed in the function OrderSend() specified in the right part of the assignment operator. The trade request as such is created and sent to the server in the function, whereas the assignment operation will be executed in the assignment operator after the server has returned a reply about the ampquotfateampquot of the request. Thus, the only possibility to inform the user about the start of events related to the request is to show the message before the assignment operator, in the right part of which the trade function is specified. Sooner or later, the client terminal will pass the control back to the program, the assignment operator in block 6-7 will be executed, which will result in that the ticket variable will take a value, and the control will be passed further - to error-analyzing block 7-8-9. If the order is opened on the server, the number (ticket) of the opened order will be assigned to the variable ticket. In this case, it means that the script has fulfilled its task and there is no need for the program to continue operations. In block 7-8, we use the operator break to exit cycle while(). The control is passed to block 9-10 (outside the cycle), and the program completes its operations. However, if the attempt to open an order fails, the control will be passed to block 8-9 for error analyzing. Two types of errors are considered here: those that still allow to hope for successful opening of the order and those, the occurrence of which means unambiguous termination of the program execution. The variable Error is assigned with the code of the last error, in this case, of the error that has been returned by the server or by the client terminal at execution of function OrderSend(). In the first operator switch of block 8-9, overcomable errors are considered. Each error in this group is processed differently. For example, if the price has changed (error 135), it is sufficient just to update the environment parameters using RefreshRates() and repeat the attempt to open an order. If the error ampquotNo pricesampquot (error 136) occurs, there is no sense to re-send the request to the trade server. In this case, we should wait for a new tick to income (there are no prices on the server at this time, either) and, only after that, retry to open an order. This is why there is a waiting cycle in the block that processes error 136. This waiting cycle will be interrupted as soon as a new tick incomes. We exit the operator switch() using operator continue that breaks the current iteration of the cycle while() and starts a new one. Critical errors are processed in another way. If such an error occurs, the program will just inform the user about it and terminate operations. For this purpose, we use the operator break (the last one in block 8-9) that breaks the cycle while(), which results in termination of the program. We should note particularly that, in this example, we dont consider all errors without exceptions, by design. In this case, we are not aiming at providing the user with a ready-made program. It is very important that the programmer him or herself analyzes other errors and decides independently what else errors and in what way should be processed in the program. At the same time, some errors must not be processed, because the program is built in such a way that it does not imply occurrence of some errors, for example, in this case, of errors 129 and 130.. In the above example, there is a small algorithmic error that cannot be found at neither compilation nor in the client terminal, nor on the server. Take any program codes with a grain of salt, in contempt of any authorities. Note the code in block 4-5: As a result of calculations in the body of the operator if(), the variable DistSL can take a new value. Suppose a normal minimum distance makes 5 points. Suppose that at the first execution (in quick market), this value is set as 20 points on the server. The variable MinDist will take the value of 20. Also suppose that the formed trade request has been rejected due to error 136. The program will track the new tick in block 8-9. Within this period of time, the value of the minimum distance can be changed on the server, for example, decreased to 10 points. At the moment when the new tick incomes, the control will be passed to the new cycle, and the new value of the variable MinDist, equal to 10, will be calculated. However, the value of the variable DistSL remains unchanged and equal to 20 (block 4-5 is coded in such a way that the value of DistSL can only increase). In order to exclude this algorithmic error, you should write block 4-5 in such a manner that only the value that depends on the situation would change (in this case, it is the value of SL), whereas the value of DistSL wouldnt change, for example, like this: A similar change must be made in block 5-6 for the other stop order. Placing Pending Orders There is no crucial difference in programming between placing of pending orders and placing of market ones. You should only note the fact that the assets necessary to modify the pending order into a market one are checked for their sufficiency neither by the client terminal or by the server. They are not limited either. You can place a pending order for the amount that many times exceeds the amount of money available on your account. Such an order can be kept for indefinite periods of time. When the market price reaches the level of the open price requested for the pending order, there will be a check made on the server. If there are enough money on the account for opening this order, it will be modified into a market one (opened). If not, it will be deleted. Function WindowPriceOnDropped() In MQL4, we have a very important feature - we can determine programmatically in the symbol window the coordinates of the location, at which an Expert Advisor or a script has been placed, if they have been attached using a mouse. For example, we can obtain the ordinate value of attachment of the script using the function WindowPriceOnDropped(). The function returns the value of the price in the point of the chart, in which the EA or the script has been dropped. The value will be true only, if the EA or the script has been moved using a mouse (drag and drop). This value is not defined for custom indicators. An example of a simple script that opens a BuyStop order costing 35 of the free margin, with some preset values of stop orders (openbuystop. mq4 ). The structure of the script openbuystop. mq4 is built in the same way as that of the script openbuy. mq4. so there is no need to describe it in details. We will only turn our attention to basic differences between these programs. The price, at the level of which the script has been attached to the symbol window, is determined in the line: Subsequently, the value of this variable is kept unchanged during the entire period of operation of the program. This is necessary, if the script fails opening an order more than. At the same time, the script will every time calculate the requested value of the price close to the location (to the price level) where user attached the script. It is easy to see that, in the script openbuystop. mq4. there is no check for sufficiency of free margin for opening of an order, but there is a check of the order open price (block 3-4). If the calculated value of the variable Price does not comply with the requirements of placing of a pending Stop order (see Order Characteristics and Rules for Making Trades. Requirements and Limitations in Making Trades ), this value will be recalculated. In the block of error processing, there are some small changes, as well: some errors are not considered, but the codes of some other errors are processed. Reasonable Limitations As related to the use of trade functions, we should pay attention to some more general limitations. For example, error 146 occurs only, if several programs that form trade requests work in one symbol window. In our opinion, this practice is allowable, but not reasonable. It would be much more efficient to create and use one trading program that would consider all special features of trading. If we use only one trading program, it is just impossible to form several trade request simultaneously. Moreover, the entire algorithm could be organized much better in such a program: consider the probability of successful trades and re-allocate money correctly, according to this probability. For performing of trades, it is more efficient to use a full-scaled Expert Advisor, whereas a script would be better used for one-time calculations or for displaying some useful information on the screen. At the same time, if the trader does not use an Expert Advisor for automated trading, the use of scripts turns out to be more efficient than working with orders using the control panel of the client terminal.
No comments:
Post a Comment