Eu sou novo na escrita de um consultor especialista, e eu preciso de ajuda com o meu consultor de especialistas em mudança simples, simples e móvel. Meu código é muito básico. Vende-se quando a menor média móvel se move abaixo da média móvel maior. O que eu quero fazer é isso. Uma ordem é colocada quando a média móvel menor cruza acima da média móvel maior, de modo que a EA compra. Quando a menor média móvel, em seguida, cruza abaixo da média móvel maior, quero vender essa ordem. Isso está tudo bem E, ao mesmo tempo, eu quero colocar outra nova ordem para comprar de acordo com a última ordem. Eu não quero aguardar o próximo crossover. Então, quando um pedido é fechado, outro deve ser colocado. Obtendo Por favor, alguém pode ajudar a modificar meu código existente. Ver que eu sou um novato, alguém pode comentar o código que foi escrito. Anexei meu arquivo atual. Saudações, Brendan (África do Sul) Eu sou novo na escrita de um consultor especialista, e eu preciso de ajuda com meu consultor de especialistas em meio móvel simples simples. Meu código é muito básico. Vende-se quando a menor média móvel se move abaixo da média móvel maior. O que eu quero fazer é isso. Uma ordem é colocada quando a média móvel menor cruza acima da média móvel maior, de modo que a EA compra. Quando a menor média móvel, em seguida, cruza abaixo da média móvel maior, quero vender essa ordem. Isso está tudo bem E, ao mesmo tempo, eu quero colocar outra nova ordem para comprar de acordo com a última ordem. Eu não quero aguardar o próximo crossover. Então, quando um pedido é fechado, outro deve ser colocado. Obtendo Por favor, alguém pode ajudar a modificar meu código existente. Ver que eu sou um novato, alguém pode comentar o código que foi escrito. Anexei meu arquivo atual. Saudações, Brendan (África do Sul) Seus arquivos não estão anexados. Você pode tentar anexar o arquivo mq4 Apenas um comentário lateral de que os cruzamentos de MAs não são o melhor momento para comprar. No momento em que as cruzes acontecem, a mudança de direção já está bem em andamento, então o buysell pode estar um pouco atrasado. O MACD que rastreia as diferenças de gap entre 2 MAs é um melhor indicador de mudança de direção. O histograma rastreia a direção, a linha de sinal indica se a direção está para cima ou para baixo. Essa é a teoria de qualquer maneira. Então, você acha que eu tenho que arranhar o crossover 2 MA e escrever um novo sistema especializado com um MACD. Você talvez tenha obtido um exemplo de trabalho com você, por favor. Aqui está o meu cronômetro 2 SMA: int Crossed (double line1, double line2) static int lastdirection 0 static int currentdirction 0 se (line1 gt line2) currentdirction 1 up if (line1 lt line2) currentdirction 2 down int cnt, ticket, total shortSma duplo, longSma if (Bars lt 100) Imprimir (quotbars menos de 100quot) return (0) Se (TakeProfit lt 10) Print (quotTakeProfit less than 10quot) return (0) verifique TakeProfit shortSma iMA (NULL, 0, 5, 0, MODESMA, PRICECLOSE, 0) longSma iMA (NULL, 0, 50, 0, MODESMA, PRICECLOSE , 0) int é cruzado cruzado (shortSma, longSma) se (total lt 1) se (isCrossed 1) ticket OrderSend (Symbol (), OPBUY, Lots, Ask, 3, 0 (Ask TakeProfit Point), quotDouble SMA Crossover H1quot, 12345, 0, Azul) se (ticket gt 0) se (OrderSelect (ticket, SELECTBYTICKET, MODETRADES)) Imprimir (ordem QUOTBUY aberta. Quot, OrderOpenPrice ()) else Print (q UotError opening BUY order. Quot, GetLastError ()) retorna (0) se (isCrossed 2) ticket OrderSend (Symbol (), OPSELL, Lots, Bid, 3, 0, (Bid - TakeProfit Point), QuoDouble SMA Crossover H1quot, 12345, 0, Vermelho) Se (ticket gt 0) se (OrderSelect (ticket, SELECTBYTICKET, MODETRADES)) Imprimir (quotSELL order opened. Quot, OrderOpenPrice ()) else Imprimir (quotError opening SELL order. Quot, GetLastError ()) return (0) return (0 ) Para (cnt 0 cnt lt cnt total) OrderSelect (cnt, SELECTBYPOS, MODETRADES) se (OrderType () lt OPSELL ampamp OrderSymbol () Symbol ()) se (OrderType () OPBUY) a posição longa é aberta se ele for fechado se ( IsCrossed 2) OrderClose (OrderTicket (), OrderLots (), Bid, 3, Violet) close position return (0) check de saída para parar de sair se (TrailingStop gt 0) se ((Bid - OrderOpenPrice ()) gt (Point TrailingStop) ) Se (OrderStopLoss () lt (Bid-Point TrailingStop)) OrderModify (OrderTicket (), OrderOpenPrice (), (Bid-Point TrailingStop), OrderTakeProfit (), 0, Green) return (0) senão vá para a posição curta se ele Estar perto D se (isCrossed 1) OrderClose (OrderTicket (), OrderLots (), Ask, 3, Violet) close position return (0) exit check for trailing stop if (TrailingStop gt 0) se ((OrderOpenPrice () - Ask) gt ( Point TrailingStop)) se ((OrderStopLoss () gt (Ask Point TrailingStop)) (OrderStopLoss () 0)) OrderModify (OrderTicket (), OrderOpenPrice (), (Ask Point TrailingStop), OrderTakeProfit (), 0, Vermelho) return ( 0) Então, você acha que devo arranhar o cronômetro 2 MA e escrever um novo sistema especializado com um MACD. Você talvez tenha obtido um exemplo de trabalho com você, por favor. Aqui está o meu 2 cruzamentos SMA: int. Cruzado (dual line1, double line2) static Int lastdirection 0 static int currentdirction 0 if (line1 gt line2) currentdirction 1 up if (line1 lt line2) currentdirction 2 down int cnt, ticket, total shortSma duplo, longSma if (Bars lt 100) Imprimir (quotbars menos de 100quot) retornar ( 0) se (TakeProfit lt 10) Print (quotTakeProfit less than 10quot) return (0) verifique TakeProfit shortSma iMA (NULL, 0, 5, 0, MODESMA, PRIC ECLOSE, 0) longSma iMA (NULL, 0, 50, 0, MODESMA, PRICECLOSE, 0) int é cruzado cruzado (shortSma, longSma) se (total lt 1) se (isCrossed 1) ticket OrderSend (Symbol (), OPBUY, Lots , Pergunte, 3, 0 (pergunte o ponto TakeProfit), quotDok SMA Crossover H1quot, 12345, 0, azul) se (ticket gt 0) se (OrderSelect (ticket, SELECTBYTICKET, MODETRADES)) Imprimir (ordem QUOTBUY aberta. Quot, OrderOpenPrice ()) else Print (quotError opening COMPRAR ordem. Quot, GetLastError ()) return (0) se (isCrossed 2) ticket OrderSend (Symbol (), OPSELL, Lots, Bid, 3, 0, (Bid - TakeProfit Ponto), quotDocel SMA Crossover H1quot, 12345, 0, Vermelho) se (ticket gt 0) se (OrderSelect (ticket, SELECTBYTICKET, MODETRADES)) Imprimir (quotSELL order opened. Quot, OrderOpenPrice ()) else Print (quotError opening SELL order. tot, GetLastError ()) return (0) return (0) for (cnt 0 cnt lt cnt total) OrderSelect (cnt, SELECTBYPOS, MODETRADES) se (OrderType () lt OPSELL ampamp OrderSymbol () Symbol ()) if (OrderType () OPBUY) a posição longa é aberta se ele for fechado se (isCrossed 2) OrderClose (OrderTicket (), OrderLots (), Bid, 3, Violet) close position return (0) exit check for trailing stop if (TrailingStop gt 0) Se ((Bid - OrderOpenPrice ()) gt (Point TrailingStop)) se (OrderStopLoss () lt (Bid - Point TrailingStop)) OrderModify (OrderTicket (), OrderOpenPrice (), (Bid - Point TrailingStop), OrderTakeProfit (), 0 , Gr Een) return (0) senão vá para a posição curta se ele for fechado se (isCrossed 1) OrderClose (OrderTicket (), OrderLots (), Ask, 3, Violet) close position return (0) exit check for trailing stop if (TrailingStop Gt 0) se ((OrderOpenPrice () - Ask) gt (Point TrappingStop)) se ((OrderStopLoss () gt (Ask Point TrailingStop)) (OrderStopLoss () 0)) OrderModify (OrderTicket (), OrderOpenPrice (), (Ask Point TrailingStop), OrderTakeProfit (), 0, Red) return (0) Uso de Indicadores Técnicos De acordo com a pertença ao sistema de negociação on-line MetaTrader 4 existem dois tipos de indicadores em MQL4 - técnicos e personalizados. O indicador técnico é parte integrante do sistema de negociação on-line MetaTrader, função incorporada que permite desenhar na tela uma certa dependência. Propriedades dos Indicadores Técnicos Desenho na Janela de Segurança Cada indicador técnico calcula uma certa dependência predefinida. Para desenhar esta dependência graficamente na tela, um indicador técnico deve ser anexado a um gráfico. Isso pode ser feito através do menu do sistema Inserir indicadores de gtgt ou via janela Navegador de um terminal de cliente. Para anexar um indicador técnico a um gráfico da janela do Navegador, um método muito simples é usado - arraste-amp-drop do nome do indicador técnico da janela do Navegador para uma janela do gráfico. Como resultado, uma ou várias linhas calculadas neste indicador aparecerão na janela do gráfico. As linhas de indicadores de um indicador técnico podem ser desenhadas tanto na janela principal do gráfico como em uma janela separada na parte inferior de uma janela de segurança. Na Fig. 104 indicador técnico Alligator é desenhado em uma janela de gráfico. Código Unchangeability Todos os indicadores técnicos são incorporados, seu código não está disponível para fazer modificações. Portanto, um usuário é protegido de uma modificação errônea de indicadores técnicos incorporados. No entanto, o código-fonte, no qual um indicador técnico é calculado, está disponível no site do desenvolvedor de software (MetaQuotes Software Corp.) na seção Indicadores Técnicos. Se necessário, um programador pode usar o código completo ou parte dele para criar indicadores personalizados (consulte Criação de indicadores personalizados). Funções de chamada de indicadores técnicos A representação gráfica visível para um usuário é exibida por um terminal de cliente. Além disso, por conveniência, chamaremos essas linhas de indicadores de desenhos. Indicator Line é uma exibição gráfica de uma determinada dependência com base em valores numéricos incluídos em uma matriz de indicadores. O tipo de linha do indicador é configurado por um usuário. A linha do indicador pode ser exibida na forma de uma linha sólida ou tracejada, de uma cor especificada, bem como na forma de uma cadeia de certos sinais (pontos, quadrados, anéis, etc.). Durante os cálculos dos indicadores, os conjuntos de valores numéricos são calculados, e as linhas indicadoras serão desenhadas de acordo com esses cálculos. Esses conjuntos de valores são armazenados em matrizes de indicadores. Indicador Array é uma matriz unidimensional contendo valores numéricos, de acordo com quais linhas de indicadores são construídas. Os valores numéricos dos elementos da matriz do indicador são coordenadas de pontos, sobre os quais é desenhada uma linha de indicador. A coordenada Y de cada ponto é o valor de um elemento da matriz do indicador, a coordenada X é o valor do índice do elemento da matriz do indicador. A tecnologia de armazenamento de dados em matrizes de indicadores é a base para a construção de indicadores técnicos e personalizados. Os valores dos elementos da matriz de indicadores de indicadores técnicos estão disponíveis em todos os programas de aplicativos, incluindo consultores especializados, scripts e indicadores personalizados. Para obter um valor de um elemento de matriz de indicador com um determinado índice em um programa de aplicativo, é necessário chamar uma função incorporada, cujo nome é definido de acordo com um nome de indicador técnico. Para a execução de uma função de indicador técnico, o indicador correspondente não deve estar necessariamente ligado a uma janela de segurança. Também a chamada de função de indicador técnico de um programa de aplicativo não leva à conexão de um indicador correspondente a uma janela de segurança. A anexação de um indicador técnico a uma janela de segurança também não resulta em uma chamada de indicador técnico em um programa de aplicação. Uma série de indicadores técnicos está incluído no terminal do cliente do sistema de negociação on-line MetaTrader 4. Vamos analisar alguns deles. Média móvel, MA Indicador técnico Média móvel, MA mostra o valor médio do preço do instrumento por um determinado período de tempo. O indicador reflete a tendência geral do mercado - pode aumentar, diminuir ou mostrar algumas flutuações perto de algum preço. Para obter valores de linha de indicador MA em um determinado momento, use a função padrão: símbolo - símbolo nome de uma segurança, nos dados dos quais o indicador será calculado. NULL significa o símbolo atual. Período de tempo - período. Pode ser um dos períodos de gráfico. 0 significa o período do gráfico atual. Período - período de média para cálculos MA. Deslocamento - deslocamento do indicador em relação a um gráfico de preços. Mamethod - método de média. Pode ser um dos métodos MA métodos. Preço aplicado - preço usado. Pode ser qualquer uma das constantes de preços. Índice de valor de deslocamento adquirido a partir de uma matriz de indicadores (retroceder em relação a uma barra atual por um número especificado de barras). Abaixo está um exemplo de chamar uma função de indicador técnico do Expert Advisor callindicator. mq4: Na chamada de EA callindicator. mq4 iMA () é usada (função do indicador técnico de Média de Movimento). Vamos analisar esta parte do programa em detalhes: NULL denota que o cálculo de uma média móvel é feito para uma janela de segurança, à qual a EA está anexada (neste caso é EA, em geral, pode ser qualquer programa de aplicação) 0 - é Calculado para o período definido na janela de segurança, ao qual a EA está anexada PeriodMA - o valor do período de média é definido em uma variável externa se depois de anexar EA a uma janela de segurança, um usuário não altera esse valor nas configurações das variáveis externas de EA , O valor é igual a 5 0 - a matriz de indicadores não é deslocada em relação a um gráfico, ou seja, os valores dos elementos de matriz de indicadores contêm valores de MA calculados para barras, nas quais a linha de indicador é desenhada MODESMA - método de uma média móvel simples é usado para Cálculos PRICECLOSE - preço de fechamento do bar é usado para os cálculos 0 - índice do elemento da matriz do indicador, para o qual o valor é adquirido - neste caso é elemento zero. Levando em consideração que a matriz de indicadores não é deslocada em relação ao gráfico, o valor MA é obtido para a barra de zero. A função iMA () retorna um valor atribuído à variável MA. Em outras linhas de programa, esse valor é comparado com o preço atual da Licitação. Se o preço atual for maior ou menor que o valor MA obtido, um alerta será exibido. O uso das variáveis FactUp e FactDn permite mostrar o alerta somente após o primeiro cruzamento da linha MA (nota, a linha de indicador azul em uma janela de segurança é desenhada não porque a função de indicador técnico foi chamada do programa, mas porque um usuário se anexou O indicador para o gráfico, Fig. 104). Deve notar-se aqui que com a aparência de novos índices de barras de barras de histórico aumentam, a barra atualmente sendo formada sempre tem o índice 0. No indagador de especialistas callindicator. mq4, a função de indicador técnico iMA () retorna o valor calculado para a barra de zero. Embora o valor do índice nunca seja alterado durante a execução de EA (isto é, os cálculos são sempre realizados na barra atual), o valor retornado pelo iMA () corresponderá sempre ao último calculado, isto é, calculado para a barra de zero atual. Se, para alguns cálculos no programa, precisamos obter o valor de um valor de indicador técnico não para a barra atual, para um histórico, o índice de matriz de indicador necessário deve ser especificado na chamada de função. Permite ver um exemplo de EA historybars. mq4. Em que o MA é calculado na quarta barra: nos valores de EA historybars. mq4 são calculados para a barra atual (índice 0) e para a quarta barra (índice 4). Os índices indicados 0 e 4 não mudam durante esta operação do programa e o programa pode operar infinitamente longo a cada vez que calcula valores de MA para zero e quarta barras. Lembre-se, embora os cálculos sejam feitos para MA em barras com os mesmos índices, MA será alterado, ou seja, corresponderá aos valores MA atuais na barra zero atual e na quarta barra atual. Na Fig. 106 é claro que à medida que os preços crescem nas barras de las, MA aumenta. A diferença entre os valores de MA no zero e na quarta barra também cresce, o que é refletido nos alertas exibidos. Os indicadores técnicos podem refletir não apenas um, mas também duas ou mais linhas de indicadores. O indicador técnico Stochastic Oscillator compara o preço de fechamento atual com o intervalo de preços por um período de tempo selecionado. O indicador é geralmente representado por duas linhas de indicador. O principal é chamado K. A segunda linha de sinal D é a média móvel de K. Normalmente, K é desenhado como uma linha contínua, D - tracejada. De acordo com uma das variantes da explicação do indicador, devemos comprar se K é maior do que D e vender se K for inferior a D. O momento mais favorável para a execução de uma operação comercial é considerado o momento de concordância das linhas. Símbolo símbolo nome de uma segurança, nos dados dos quais o indicador será calculado. NULL significa o símbolo atual. Período de tempo - período. Pode ser um dos períodos de gráfico. 0 significa o período do gráfico atual. Kperiod - período (número de barras) para calcular K. Dperiod - período de média de D. desaceleração - valor da desaceleração. Método - método de média. Pode ser um dos métodos MA métodos. Pricefield - parâmetro de escolha de preços para cálculos. Pode ser um dos seguintes valores: 0 - LowHigh ou 1 - Close Close. Modo - índice de linhas de indicadores. Pode ser um dos seguintes valores: MODEMAIN ou MODESIGNAL. Shift - índice do valor obtido a partir de um buffer de indicador (mudar de volta em relação a uma barra atual por um número especificado de barras). O uso do Oscilador Estocástico oferece a necessidade de analisar as posições de linhas relativas. Para calcular qual a decisão comercial deve ser realizada, o valor de cada linha nas barras atual e anterior deve ser levado em consideração (ver Fig. 107). Quando as linhas cruzam no ponto A (a linha verde cruza o vermelho para cima), a ordem de venda deve ser fechada e a ordem de compra deve ser aberta. Durante a parte A - B (sem cruzamento de linhas, a linha verde é maior do que a linha vermelha) A ordem de compra deve ser aberta. No ponto B (linha verde cruza o vermelho para baixo) A compra deve ser fechada e a venda deve ser aberta. Em seguida, Sell deve permanecer aberto até o próximo cruzamento (sem cruzamento, linha verde abaixo da linha vermelha). FIG. 107. Concorrência das linhas principal e de sinal do Oscilador Estocástico. O próximo exemplo contém a implementação de um algoritmo simples que demonstra como os valores necessários de cada linha podem ser obtidos e os critérios comerciais podem ser formados. Para isso, os valores das funções de indicadores técnicos iStochastic () são usados nas chamadas EA para astic. mq4: para obter o valor de linha K (verde sólido) na barra de zero, a seguinte linha de cálculo é usada: Aqui o parâmetro MODEMAIN indica a linha, o valor Do que é solicitado, o último parâmetro 0 é o índice da barra, para o qual o valor da linha deve ser calculado. Nas três linhas de programa a seguir, outras variáveis são calculadas por analogia - para a linha D (linha tracejada vermelha, parâmetro MODESIGNAL) para o zero e a primeira barra. No próximo bloco, a correlação dos valores obtidos é analisada e a EA relata o estado atual em cada marca. Por exemplo, em linhas: o fato de uma linha vermelha ser cruzada pelo verde para cima é detectado. Se na barra anterior a linha verde estava abaixo do vermelho (ou seja, a expressão M1 lt S1 é verdadeira) e na barra atual a linha verde sobe acima da vermelha ou os seus valores são iguais (ou seja, a expressão M0 gt S0 é Verdadeiro), isso significa que, da formação anterior da barra para o momento atual, o solitário verde cruzou o vermelho para cima. Assim, a condição calculada em se o operador é verdade, é por isso que o controle é passado para o corpo do operador, como resultado Alert () é executado para mostrar a mensagem correspondente. Em um consultor especialista destinado a negociar se o corpo do operador, uma função de negociação para abrir uma ordem de compra deve ser indicada. Neste caso, a variante analisada do cruzamento de linhas de indicadores conduzirá à formação de uma ordem comercial e, finalmente, à execução de uma operação comercial. Para a variante quando a linha verde cruza o vermelho para baixo, em se for indicado um corpo para abrir uma ordem de Venda. FIG. 108 mostra o resultado das chamadas para a operação hmtica. mq4. O uso de funções de indicadores técnicos para a criação de consultores especializados e scripts é muito conveniente. A quantidade de funções de indicadores técnicos usadas em um consultor especialista é ilimitada. Um desenvolvedor de estratégia de negociação pode decidir definir diferentes critérios de negociação com base na combinação de valores de indicadores técnicos. Exemplo de um consultor de consultoria comercial simples, cujos critérios de negociação são baseados em indicadores técnicos, são analisados na seção Consultor de especialistas simples. Problema do consultor de especialistas simples 29. Crie um consultor de especialistas em negociação. Argumentos preliminares Antes de começar a programar um consultor especialista em negociação, é necessário definir princípios gerais de um programa futuro. Não existem regras estritas de criação de programas. No entanto, uma vez que criou um programa, um programador geralmente continua a melhorar. Para poder entender facilmente o programa no futuro, ele deve ser criado de acordo com um esquema bem pensado e fácil de entender (é especialmente importante se um programa for melhorado por outro programador). O programa mais conveniente é aquele que consiste em blocos funcionais, cada um dos quais é responsável pela parte dos cálculos. Para criar um algoritmo de um consultor de especialistas em negociação, vamos analisar o que um programa operacional deve fazer. Um dos dados mais importantes na formação de ordens comerciais é a informação sobre pedidos que já existem em um terminal de cliente. Algumas das estratégias de negociação permitem apenas uma ordem unidirecional. Geralmente, se uma estratégia de negociação permitir, vários pedidos podem ser abertos em um terminal ao mesmo tempo, embora seu número seja razoavelmente limitado. Ao usar qualquer estratégia, as decisões comerciais devem ser feitas levando em consideração a situação atual. Antes de uma decisão comercial ser tomada em um programa, é necessário saber quais ordens comerciais já foram abertas ou colocadas. Antes de tudo, um programa deve conter um bloco de contabilidade de pedidos que está entre os primeiros a serem executados. Durante uma execução EA, as decisões comerciais devem ser tomadas, cuja implementação leva à execução de operações comerciais. A parte do código responsável pela formação de pedidos comerciais é melhor escrita em um bloco separado. Um Consultor Especialista pode formar uma solicitação comercial para abrir uma nova ordem pendente ou de mercado, fechar ou modificar qualquer uma das ordens existentes ou não realizar nenhuma ação. Uma EA também deve calcular os preços das ordens dependendo do desejo dos usuários. As decisões comerciais devem ser tomadas em um programa com base em critérios comerciais. O sucesso de todo o programa depende da correção da detecção de critérios comerciais no programa. Ao calcular critérios de comércio, um programa pode (e deve) ter em conta todas as informações que podem ser úteis. Por exemplo, um Consultor Especialista pode analisar a combinação de valores de indicadores técnicos, tempo de lançamentos de notícias importantes, tempo atual, valores de alguns níveis de preços, etc. Por conveniência, a parte do programa responsável pelo cálculo dos critérios de negociação deve ser escrita de forma separada. quadra. Um consultor especialista em negociação deve necessariamente conter o bloco de processamento de erros. Analisar os erros que podem ocorrer na execução da operação comercial permite, por um lado, repetir um pedido comercial e, por outro lado, informar um usuário sobre uma possível situação de conflito. Estrutura de um consultor de especialistas simples Abaixo está um esquema estrutural de um consultor de especialistas simples construído com base em vários blocos funcionais, em cada bloco uma certa parte dos cálculos. Na fase de desenvolvimento de EA a seguir, ainda não existe um código de programa. Ao mesmo tempo, o algoritmo de um programa é formado em grande parte. A forma como a EA construída nas bases do esquema oferecido irá operar pode ser facilmente entendida simplesmente olhando o esquema e orientando-se sobre nomes de blocos e matrizes de relações (controle de passagem) entre eles. Após o início do programa, o controle é passado para o bloco de processamento preliminar. Neste bloco, alguns parâmetros gerais podem ser analisados. Por exemplo, se não houver barras suficientes em uma janela (barras necessárias para calcular parâmetros de indicadores técnicos), uma EA não poderá operar adequadamente. Nesse caso, uma EA deve encerrar a operação informando preliminarmente um usuário sobre isso e informando sobre o motivo do término. Se não houver contra-indicações de caráter geral, o controle é passado para o bloco de contabilização de pedidos. No bloco de ordens contábeis, o número e a qualidade das ordens existentes em um terminal cliente para uma segurança (para a janela da qual o EA está anexado) são detectados. Neste bloqueio, as ordens de outros títulos devem ser eliminadas. Se uma estratégia de negociação programada requer o uso de apenas ordens de mercado (e não usa ordens pendentes), o fato da presença de ordens pendentes deve ser detectado. Se uma estratégia admite apenas uma ordem de mercado e existem várias ordens, esse fato também deve ser conhecido. A tarefa do bloco de contabilidade de ordem (neste esquema) é definir se a situação comercial atual corresponde a uma esperada, ou seja, na qual a EA pode operar adequadamente. Se a situação corresponder, o controle deve ser passado para o próximo bloco para continuar a operação EAs, caso contrário, a operação EAs deve ser encerrada e esse fato deve ser reportado a um usuário. Se não houver pedidos no terminal ou o número e a qualidade das ordens existentes correspondem ao esperado, o controle é passado para o bloco de definir os critérios de negociação. Neste bloco são calculados todos os critérios necessários para tomar decisões comerciais, nomeadamente critérios para abertura, encerramento e modificação de pedidos. O controle adicional é passado para o bloco de pedidos de fechamento. É fácil entender por que no esquema oferecido o bloco de ordens de fechamento é executado antes do bloco de ordens de abertura. É sempre mais razoável processar as primeiras ordens existentes (fechar ou modificar) e somente depois disso para abrir novos pedidos. Geralmente, é correto guiar pelo desejo de ter tão poucas ordens quanto possível. Durante a execução deste bloco, todos os pedidos, para os quais o critério de fechamento foi ativado, devem ser fechados. Depois de todas as ordens necessárias terem sido fechadas, o controle é passado para um bloco de cálculo de novos tamanhos de pedidos. Há muitos algoritmos para calcular um volume de pedidos. O mais simples é usar um tamanho de lote constante e fixo. É conveniente usar esse algoritmo em um programa para testar estratégias. O método mais popular de definir um tamanho de pedido é definir o número de lotes dependendo da quantidade de margem livre, por exemplo, 30-40. Se a margem livre não for suficiente, o programa encerra sua operação informando um usuário sobre o motivo. Depois que o número de lotes para abrir novos pedidos é definido, o controle é passado para o bloco de abertura de pedidos. Se algum dos critérios calculados anteriormente aponta para a necessidade de abrir uma ordem de um determinado tipo, um pedido comercial para abrir um pedido é formado neste bloco. Há também erro de análise de bloqueio em um consultor especialista. Se alguma operação comercial falhou, o controle (somente neste caso) é passado para o bloco de processamento de erros. Se um erro retornado por um servidor ou terminal cliente não for crucial, mais uma tentativa é feita para executar uma operação comercial. Se um erro crucial for retornado (por exemplo, uma conta é bloqueada), uma EA deve encerrar sua operação. Lembre-se, no MQL4 não há possibilidade de um programa encerrar uma operação de EAs em uma janela de segurança (diferente dos scripts, consulte Funções especiais). O que pode ser feito de uma forma de programa é o término do início (). Em um novo começo da função start () em um novo tick, o valor de uma certa bandeira de variáveis que proíbe a negociação (neste caso, habilitado como resultado de um erro crítico) pode ser analisado e o controle pode ser passado para o término do Operação de função especial, não é permitida a formação de novo pedido comercial. No esquema oferecido, o valor da bandeira é analisado no bloco de processamento preliminar. Estratégia de negociação Os preços do mercado estão constantemente em movimento. O estado do mercado em qualquer momento pode ser condicionalmente caracterizado como uma tendência - forte mudança de preço unidirecional (aumento ou queda), ou como um movimento de preço plano - lateral com desvios fracos de uma certa média. Essas características de mercado são condicionais, porque não há critérios claros, segundo os quais a tendência ou o plano podem ser identificados. Por exemplo, movimentos laterais longos com fortes desvios que não podem ser traçados nem para um plano nem para uma tendência. Geralmente, é assumido que o mercado está principalmente no estado do movimento lateral e as tendências geralmente ocorrem 15-20 do tempo. Todas as estratégias comerciais também podem ser convencionalmente divididas em dois grupos principais. O primeiro grupo contém estratégias orientadas para o plano. A idéia principal de tais estratégias é que, após um preço de desvio evidente deve retornar à posição anterior, é por isso que as ordens são abertas na direção contrária ao último movimento de preços. As estratégias do segundo grupo são estratégias tendenciais, quando as ordens são abertas na mesma direção que o movimento do preço do sal. Existem estratégias mais complicadas (combinadas). Tais estratégias levam em consideração muitos fatores diferentes que caracterizam o mercado como resultado, a negociação pode ser executada tanto no plano como na tendência. Não é difícil implementar a negociação de acordo com esta ou essa estratégia tecnicamente - MQL4 contém todos os meios necessários para isso. O principal trabalho na criação de uma estratégia própria consiste na busca de critérios de negociação. Critérios de Negociação Neste exemplo, tentaremos construir uma Tendência Consultor Especialista, ou seja, aquele que abrirá ordens na direção do movimento de preços. Então, precisamos encontrar entre vários indicadores técnicos aqueles que detectam um início de tendência. Um dos métodos mais simples de busca de critérios comerciais baseia-se na análise da combinação de MAs com diferentes períodos de média. FIG. 111 e Fig. 112 mostram a posição de duas MA diferentes (com períodos de média 11 e 31) em diferentes partes do mercado. As médias com pequeno período de média (linhas vermelhas) estão mais próximas de um gráfico de preços, torção e móveis. As médias móveis com um período maior de média (linha azul) são mais inertes, têm atraso maior e estão mais distantes dos preços do mercado. Vamos prestar atenção aos lugares onde MAs com diferentes períodos de média cruzam e tentam decidir se o fato de cruzamento de MA pode ser usado como um critério de leitura. FIG. 111. Cruzamento de MA (11) e MA (31) quando a direção do movimento do preço muda. Na Fig. 111 vemos uma parte do mercado, onde as ordens de abertura na direção do movimento de preços no cruzamento de MA são justificadas. No ponto A, a linha vermelha cruza o azul de baixo para cima, depois disso o preço do mercado continua a crescer por algum tempo. O cruzamento posterior do MA indica a mudança na direção do movimento do preço. Se abrirmos uma ordem de compra no ponto A e fechá-la em B, obteremos lucro proporcional à diferença dos preços A e B. FIG. 112. Cruzamento de MA (11) e MA (31) quando a direção do movimento do preço muda. Ao mesmo tempo, há outros momentos no mercado quando MA atravessa, mas isso não leva a aumento ou queda considerável de preços (Fig. 112). As ordens abertas no cruzamento de MA em tais momentos levarão a perdas. Se a Vender for aberta em A e fechada em B, essa negociação trará perdas. O mesmo pode ser dito sobre uma ordem de compra aberta em B e fechada em C. O sucesso de toda a estratégia implementada com base no cruzamento de MA depende do número de peças que podem ser caracterizadas como tendência e plana. Em plano, muitas vezes o cruzamento de MA é um evento regular que interfere com qualquer estratégia de tendências. Numerosos sinais falsos, em regra, levam a perdas. É por isso que este sinal - cruzamento de MAs com diferentes períodos de média - pode ser usado para construir estratégias de negociação somente em combinação com outros sinais que comprovem uma tendência. In this example (for constructing a simple Expert Advisor) we will have to refuse using this sign. We will use another sign. Analyzing visually the character of price changes in the market, we can see that a long one-direction price rise or fall often appears as a result of a short strong movement. In other words, if within a short period a strong movement happened, we may expect its continuation in a medium-term period. FIG. 113 shows the market period when a strong movement resulted in the continuation of the price change in the same direction. As the quota strong movementquot we may use the difference of MAs with different averaging periods. The stronger the movement, the larger is the lag of MA with larger averaging period from MA with a small period of averaging. Moreover, even strong discontinuous price movements with further return do not result in a large difference between MAs, i. e. numerous false signals do not appear. For example, price jump by 50 points with further return (in the center in Fig. 113) entailed increase of difference between MAs only by 20 points. At the same time a really strong movement (which is not usually accompanied by a considerable correction) in point A resulted in the difference increase up to 25 - 30 points. If Buy order is opened when a certain value of difference between MAs is reached, for example in A, most probably the order will be profitable when a price reaches a preset Stop order value. Lets use this value as a trading criterion in our Expert Advisor. Number of Orders In this example we analyze an Expert Advisor that admits presence of only one market order, pending orders are not provided. Such an approach is justified not only in this certain example, but can be used as the basis for any strategy. Pending orders are usually used when a developer has quite a reliable criterion for forecasting the future price change with high probability. If there is no such criterion, no need to use pending orders. The situation when several opposite orders for one security are open also cannot be considered reasonable. It was written earlier that from economical point of view opposite orders are considered to be senseless, especially if the order prices are equal (see Closing and Deleting Orders ). In such a case we should close one order by another one and wait for a signal to open one market order in a certain direction. Relation of Trading Criteria From this position it becomes clear what relations are possible between trading criteria. FIG. 114 shows three variants of correlation of trading criteria, when each criterion is important (valid). Actions (opening and closing market orders) take place clockwise on the following pictures. FIG. 114. Order opening and closing criteria correlation (a and b - correct, c - incorrect). The most popular variant of a correctly formed trading criteria is the variant a . After being opened a market order Buy is held upon till the moment when criterion requiring its closing triggers. After that a pause occurs when no orders are opened. Further a market order Sell can be opened. Conditions for closing a Sell order (in accordance with correctly formed criteria) occur earlier, than conditions for opening a Buy order. However, a Buy order can be opened once again, if a trading criterion requires this. But according to this variant a market order cannot be opened if there is an open market order in the contrary direction. Similar criteria correlation is in the variant b . The difference is that a criterion for opening any market order is at the same time a criterion for closing the opposite order. This variant like the variant a does not allow several orders opened in the terminal at the same time on one security. The variant of criteria correlation is incorrect. According to this variant opening of a market order is allowed when contrary orders are not closed yet, which is senseless. There can be rare cases when this variant is partially justified. Opening of an opposite order is sometimes acceptable for compensating losses occurring at small corrections after strong price movements. In such cases an opposite order can be opened of the same or smaller value than the already existing one and then closed when the correction is over. Such a tactic allows not to interfere with the quotmainquot order opened in the trend direction. In general case several one-direction orders are also possible. This may be justified when an earlier opened order is protected by a Stop order and the criterion pointing at the price development in the same direction triggered once again. However, when creating such a strategy, a developer must be fully aware that in case of a sharp price movement change the placed stop orders may be unexecuted by some brokers at the first price touch. And the loss will be proportionate to the total value of one-directional market orders. In our example we use variant b of trading criteria correlation. All opened market orders are closed either by a stop order or after a criterion of opening an order in opposite direction triggers (here criterion of closing Buy coincides with that of opening Sell and vice versa). Size of Opened Orders In any trading strategy order sizes should be reasonably limited. In a simple case a fixed order size is used in an Expert Advisor. Before EA operation start, a user can set any size of future orders and leave it unchanged for some time. Further if balance changes, a user can set up a new value of lot numbers of opened orders. A too small order size provides more confidence in operation at the unpredictable market change, but the profit in case of success will be not so large. If the order size is too large, large profit can be acquired, but such an EA will be too risky. Usually the size of opened orders is set up so, that margin requirements do not exceed 2-35 percent of the balance or free margin (if a strategy allows only one opened order, balance and free margin at the moment before the order opening will be equal). In this example both variants are implemented. A user may choose either to indicate directly values of orders or set the value in percentage from the free margin. Programming Details A simple trend Expert Advisor tradingexpert. mq4 constructed on the basis of previous arguments can look like this: Describing Variables One more criterion in program estimation is its readability. A program is considered to be correctly written, if it can be easily read by other programmers, thats why all main program parts and main moments characterizing the strategy must be commented. This is also why it is recommended to declare and comment all variables at the beginning of the program. In the block 1-2 external and global variables are described. According to rules, external and global variables must be opened before their first usage (see Types of Variables ), thats why they are declared in the program head part. All local variables of the function start() are gathered and described in the upper function part (block 2-3) immediately after the function header. Rules of declaring local variables do not require it, but also do not prohibit. If a programmer faces difficulties in understanding the meaning of a variable when reading the program, he can refer to the upper program part and find out the meaning and type of any variable. It is very convenient in programming practice. Block of preliminary processing In this example the preprocessing consists of two parts (block 3-4). The program terminates operation if there are not enough bars in a security window in such a case it is impossible to detect correctly (in block 5-6) values of moving averages necessary for calculating criteria. Besides here the value of the variable Work is analyzed. In the normal EA operation the variable value is always true (it is set once during initialization). If a critical error occurs in the program operation, false is assigned to this variable and start() finishes its operation. This value will not change in future, that is why the following code is not executed. In such a case the program operation must be stopped and the reason for the critical error must be detected (if needed, a dealing center must be contacted). After the situation is solved, the program can be started once again, i. e. the EA can be attached to a security window. Accounting orders The described Expert Advisor allows working only with one market order. The task of the orders accounting block (block 4-5) is to define characteristics of an opened order, if there is one. In the loop going through orders for all existing market and pending orders are checked, namely from the first (int i1) to the last one (iampltOrdersTotal()). In each cycle iteration the next order is selected by the function OrderSelect(). The selection is made from a source of opened and pending orders (SELECTBYPOS). If the selection is executed successfully (i. e. there is one more order in the terminal), further this order and the situation must be analyzed: whether the order is opened for the security, at which the EA operates, whether the order is market or pending it also must be taken into account when counting orders. In the line: all orders opened for another security are eliminated. Operator continue stops the iteration and characteristics of such an order are not processed. But if the order is opened for the security, to the window of which the EA is attached, it is further analyzed. If OrderType() returns value more than 1 (see Types of Trades ), the selected order is a pending one. But in this Expert Advisor managing pending orders is not provided. It means the execution of start() must be terminated, because a conflict situation occurred. In such a case after a message about the operation termination start() execution is stopped by the operator return. If the last check showed that the analyzed order is a market order, the total number of orders for a security is calculated and analyzed. For the first of such orders all necessary characteristics are defined. If in the next iteration the order counter (variable Total) finds the second market order, the situation is also considered to be conflict, because the EA cannot manage more than one market order. In such a case start() execution is stopped after showing a corresponding message. As a result of the order accounting block execution (if all checks were successful) the variable Total preserves its zero value if there are no market orders, or gets the value 1 if there is a market order for our security. In the latter case some variables set in correspondence with the order characteristics (number, type, opening price, stop levels and order value) also get their values. Calculating Trading Criteria In the analyzed example definition of trading criteria (block 5-6) is calculated on the bases of difference between Moving Averages with different periods of averaging. According to accepted criteria a chart is bull-directed if the current value of the MA with smaller period is larger than the value of MA with larger period, and the difference between the values is larger than a certain value. In a bear movement MA with smaller period is lower than MA with larger period and the difference is also larger than a certain critical value. At the block beginning values of MAs with averaging periods PeriodMA1 and PeriodMA2 are calculated. The fact of significance of any trading criterion is expressed via the value of a corresponding variable. Variables OpnB and OpnS denote the criterion triggering for opening Buy and Sell orders, variables Cls and ClsS - for closing. For example, if a criterion for opening Buy has not triggered, the value of OpnB remains false (set at the variable initialization) if it has triggered, OpnB gets the value true. In this case the criterion for closing Sell coincides with that for opening Buy, criterion for opening Sell coincides with that for closing Buy. Trading criteria accepted in this example are used for educational purpose only and must not be considered as a guideline when trading on a real account. Closing Orders It was written earlier that this Expert Advisor is intended for operation only with one market order opened for a security, to which window the EA is attached. To the moment when control in the program is passed to the order closing block it is known for sure that at the current moment there are either no orders for the security, or there is only one market order. Thats why the code in orders closing block is written so that only one order can be closed successfully. This block is based on the infinite loop while, the body of which consists of two analogous parts: one for closing a Buy order, another for closing a Sell order. While is used here for the purpose that in case of a trade operation failure it could be repeated once again. In the header of the first operator if condition for closing a Buy order is calculated (Sell orders are closed in the analogous way). If the type of an earlier opened order corresponds to Buy (see Types of Trades ) and the sign for closing Buy is relevant, control is passed to the body of if operator where a request to close is formed. As an order closing price in the function OrderClose() the value of a two-sided quote corresponding to the order type is indicated (see Requirements and Limitations in Making Trades ). If a trade operation is executed successfully, after a message about the order closing is shown the current while iteration is stopped and the execution of the order closing block is over. But if the operation fails, the user-defined function for processing errors FunError() is called (block 10-11). Processing Errors As a passed parameter in FunError() the last error code calculated by GetLastError() is used. Depending on the error code FunError() returns 1 if the error is not critical and the operation can be repeated, and 0 if the error is critical. Critical errors are divided into two types - those, after which a program execution can be continued (for example, a common error) and those, after which execution of any trade operations must be stopped (for example, blocked account). if after an unsuccessful trade operation the user-defined function returns 1, the current while iteration is terminated and during the next iteration another attempt is made to execute the operation - to close the order. If the function returns 0, the current start() execution is stopped. On the next tick start() will be started by the client terminal again and if conditions for order closing are preserved, another attempt to close the order will be made. If during error processing it is found out that further program execution is senseless (for example the program operates on an old client terminal version) during the next start the execution of the special function start() will be terminated in the block of preliminary processing when analyzing the value of the variable Work. Calculating Amount of Lots for New Orders Amount of lots can be calculated in accordance with a users settings following one of the two variants. The first variant is a certain constant value set up by a user. According to the second variant the amount of lots is calculated on the basis of a sum equal to a certain percentage (set by a user) of a free margin. At the beginning of the block of defining the amount of lots for new orders (block 7-8) necessary values of some variables are calculated - minimal allowed amount of lots and step of lot change set up by a broker, free margin and price of one lot for the security. In this example the following is provided. If a user has set up a certain non-zero value of the external variable Lts, for example 0.5, it is accepted as the amount of lots Lts when a trade request to open an order is formed. If 0 is assigned to Lts, the number of lots Lts is defined on the basis of the variable Prots (percentage), free margin and conditions set up by a broker. After Lts is calculated, a check is conducted. If this value is lower than the minimal allowed value, the minimal allowed value is accepted. but if free margin is not enough, after a corresponding message the start() execution is terminated. Opening Orders The block of opening orders (block 8-9) like the bloke of opening orders is an infinite loop while. In the header of the first operator if conditions for opening a Buy order are calculated: if there are no orders for the security (variable Total is equal to 0) and the sign for opening a Buy order is relevant (OpnB is true ), control is passed to if operator body for opening an order. In such a case after rates are refreshed prices for stop levels are calculated. Values of stop levels are initially set by a user in external variables StopLoss and TakeProfit. In a general case a user can set values for this parameters smaller that a broker allows. Besides a broker may change the minimal allowed distance at any moment (it is an often case at strong market movements, for example, before important news release). Thats why before each order opening stop levels must be calculate taking into account values set bu a user and the minimal allowed value set up by a broker. For calculating stop levels the user-defined function NewStop() is used as a passed parameter the stop level value set by a user is used. In NewStop() first the current minimal allowed distance is calculated. If the value set by a user corresponds to a brokers requirements, this value is returned. If it is smaller than the allowed value, the value allowed by a broker is used. Prices of stop requests are calculated from the corresponding two-sided quote (see Requirements and Limitations in Making Trades ). A trade request to open an order is formed using the function OrderSend(). For the calculation of order opening price and prices of stop requests the two-sided quote values corresponding to the order type are used. If a trade operation was successful (i. e. a server returned the number of an opened order) after a message about a successful order opening is shown. start() execution is finished. If an order was not opened and the client terminal returned an error, the error is processed according to the algorithm described earlier. Some Code Peculiarities The analyzed Expert Advisor code is oriented to the implementation of a certain strategy. Note, some program lines contain variables and calculations that would be changed, if the strategy were changed. For example, according to the accepted strategy the Expert Advisor is developed to work only with one order. This allowed to use the variable Ticket both for the identification of a closing order number (in block of closing 6-7) and for the identification of a success of a trade operation execution when opening an order (in the block of opening 8-9). In this case such a solution is acceptable. However, if we take the analyzed code as the basis for the implementation of another strategy (for example allow opposite orders) we will have to introduce one or several variables to be able to recognize numbers of opened orders and identify the success of trade operations. In further strategy modifications we will have to change come program lines containing part of logics contained in the source strategy. Namely in the order accounting block we will not have to terminate the program operation if there are several open orders for a security. Besides, conditions for opening and closing orders will alslo change. This will entail the code changing in blocks of opening and closing orders. On the basis of this analysis we can easily conclude that the described simple Expert Advisor is not perfect. In a general case, for the implementation of order accounting one should use a universal function based on using data arrays and not containing logics of a certain strategy. The same can be said about the blocks of opening and closing orders. A more complete program must contain a main analytical function, all other user-defined functions must be subordinate to it. This analytical function must contain a program code, in which all conditions for the implementation of any strategy are analyzed all subordinate functions must perform limited actions. The function of accounting orders must only account orders, functions of opening and closing orders must only open and close orders, and the analytical function must quotthinkquot and manage all other functions, i. e. call them when needed.
Pesquisa CARACTERÍSTICAS Opções de ações: Demonstração de resultados, balanço patrimonial O impacto das opções de ações nas demonstrações financeiras é um assunto muitas vezes mal interpretado para os investidores. Esta coluna explorará o impacto das opções de compra de ações no balanço e demonstração de resultados. Também incluirá um exemplo do impacto das opções sobre lucros diluídos por ação. Por Phil Weiss (TMF Grape) 12 de outubro de 2000 No mês passado, escrevi uma introdução às opções de estoque em que revisei os aspectos de compensação, as principais vantagens e desvantagens e os diferentes tipos de opções que podem ser concedidas. Gostaria de continuar esta série com uma discussão sobre o impacto das opções de compra de ações no balanço e demonstração de resultados. Minha discussão esta noite será centrada em opções de estoque não qualificadas (NSOs). Se você não está familiarizado com esse termo, volte para a minha coluna introdutória. Uma das maiores objeções à contabilizaçã...
Comments
Post a Comment