Estratégias de ordem. Expert Advisor de propósito múltiplo.

Dmitry Fedoseev | 13 janeiro, 2014

Introdução

O principal elemento inicial de qualquer estratégia de negócio é a análise de preço e análise de indicadores técnicos para abrir uma posição. Chamaremos isso de análise de mercado, ou seja, tudo que acontece no mercado e está além de nosso controle.

Além disso, as estratégias podem requerer outro tipo de análise. Chamaremos isso de análise da situação de negócio atual. Compreende a análise do estado na posição de negociação e análise de qualquer ordem pendente faltando/disponível (se alguma for usada em um estratégia). Os resultados de tal análise nos coloca frente a decisões como se determinadas ações com posições ou ordens precisassem ser realizadas, por exemplo, fechar, mover Stop Loss, posicionar ou excluir ordens pendentes, etc. Em outras palavras, tal análise inclui o estudo de nossa atividade de mercado, ações de acordo com a situação que nós (ou um Expert Advisor) criamos e as regras da estratégia em uso.

Um Limite Móvel comumente conhecido pode até certo ponto ser considerado o segundo tipo dos elementos em uma estratégia de negócio. Considere a seguinte análise: se existe uma posição aberta com o lucro maior que o valor ajustado, enquanto o Stop Loss não está definido ou está além da distância do preço atual como especificado nas configurações, o Stop Loss será movido.

O Limite Móvel é uma função bastante simples de ser de particular interesse. Além disso, ele pode ser classificado como uma categoria totalmente diferente dos elementos de estratégia de negócio, sendo uma função de gerenciamento de posição. Assim, uma estratégia de negócio pode ser composta por três categorias de elementos:

  1. Análise de mercado e ações nela baseadas.

  2. Análise de situação de negócio e ações nela baseadas.

  3. Gerenciamento de posição.

Este artigo centraliza estratégias que usam ativamente ordens pendentes (chamaremos de estratégias de ordem para encurtar), uma metalinguagem que pode ser criada para descrever tais estratégias e o desenvolvimento e uso de uma ferramenta de propósito múltiplo (Expert Advisor) em que a operação baseia-se nestas descrições.

Exemplos de estratégias de ordem

A negociação geralmente começa com a abertura de uma posição inicial. Isso pode ser feito de diversas maneiras:

  1. Abrindo uma posição de mercado:

    • Na direção sugerida por indicadores.

    • Na direção selecionada pelo usuário na janela de propriedades do Expert Advisor.

    • Com base nos resultados do fechamento da última posição. Em vez de começar uma posição inicial, tal posição pode ser uma fase de operação intermediária.

  2. Duas ordens de parada opostas. Quando qualquer uma das ordens é ativada, a segunda ordem é excluída.

  3. Duas ordens de limite opostas. Quando qualquer uma das ordens é ativada, a segunda ordem é excluída.

  4. Ordem de limite e ordem de parada colocadas na mesma direção. Neste caso, é necessário decidir sobre a direção das ordens, como em 1.

Uma vez que a posição inicial seja aberta, você pode usar diferentes estratégias de ordem.

Escalando utilizando ordens de limite (Fig. 1)

Você abre uma posição inicial e define uma ou mais ordens de limite na mesma direção com o tamanho de lote maior. Conforme a ordem de limite é acionada, as novas ordens de limite são definidas até a posição ser fechada em Take Profit. Quando a posição é fechada em Take Profit, as ordens pendentes restantes são excluídas.

Fig. 1.  Escalando utilizando ordens de limite
Fig. 1. Escalando utilizando ordens de limite

Parar e reverso (Fig.2.)

Você abre uma posição inicial e define a ordem parar oposta com um tamanho de lote maior no nível Stop Loss da posição inicial. Quando a posição é fechada em Stop Loss, a ordem pendente contribui, uma nova ordem de parada oposta é novamente definida em seu nível Stop Loss, e assim até a posição ser fechada em Take Profit. Quando a posição é fechada em Take Profit, a ordem pendente restante é excluída.

Fig. 2. Parar e reverter
Fig. 2. Parar e reverter

Piramidação (Fig. 3.)

Você pode abrir uma posição inicial e, se ela parecer estar ganhando, você pode aumentar seu volume (escalar) e mover Stop Loss para Breakeven. Se a posição estiver fechada em Take Profit, é esperado que tenha atingido um volume bastante grande e, consequentemente, o lucro. Se, no entanto, Stop Loss acionar durante a fase intermediária, simplesmente não haverá lucro.

Fig. 3. Piramidação
Fig. 3. Piramidação

Reabertura (Fig. 4.)

Você abre uma posição de mercado: O fechamento em Stop Loss é seguido por uma nova abertura com um tamanho de lote aumentado, e até a posição ser fechada em Take Profit. Esta estratégia é similar a escalar usando ordens de limite.

Fig. 4. Reabertura
Fig. 4. Reabertura

É bem possível combinar todas as estratégias acima. Se uma posição parecer ganhar, a piramidação é útil; caso contrário, se perdas estiverem a caminho, pode ser apropriado escalar utilizando ordens de limite. Dito isso, escalar utilizando ordens limite não deve ser contínuo. Por exemplo, você pode escalar primeiro em três momentos, depois fazer diversas Paradas e Reversões e mudar para escalar utilizando ordens limite novamente, etc.

Na prática, o desenvolvimento das estratégias de ordem pode ser muito demorado não apenas devido ao escopo da codificação necessária, mas também por causa da necessidade de uso de um pensamento criativo em cada caso único. Vamos tentar facilitar a programação de tais estratégias criando um Expert Advisor de propósito múltiplo que poderia nos permitir implementar qualquer estratégia de ordem.

O princípio básico

O princípio básico do desenvolvimento de estratégia de ordem é a identificação da fase de operação de estratégia atual e realização de ações de acordo com esta fase.

Vamos dar uma olhada no seguinte exemplo: precisamos abrir uma posição de mercado, ou seja, esta será uma posição de compra. Uma vez a posição seja aberta, duas ordens pendentes são necessárias ser definidas: uma ordem de parada acima e uma ordem de limite abaixo. Conforme começamos, não há uma posição ou ordem no mercado, assim, identificamos a fase como a fase de operação inicial onde precisamos abrir uma posição. A existência de uma posição de mercado poderia sugerir que esta é a próxima fase de operação. Então, as fases que podem ser identificadas são da seguinte forma:

  1. Não há posição ou ordem. Uma posição precisa ser aberta.

  2. Há uma posição, mas não há uma ordem definida. Uma ordem de parada é necessária.

  3. Existe uma posição e uma ordem de parada. Uma ordem de limite é necessária.

O trabalho de acordo com estas regras será confiavelmente implementado, porém, precisará de três ticks: o primeiro tick para identificar a falta de posição e abertura da posição, o próximo tick para identificar a posição e falta de ordens e o terceiro tick para identificar a posição e ordem. A estratégia requer que todas as três ações sejam realizadas de uma vez.

Devemos, portanto, tentar realizar todas as ações de uma vez: se não houver posição ou ordem, devemos abrir uma posição. Se a posição for aberta com sucesso, devemos mandar uma solicitação para definir uma ordem de parada e outra solicitação para definir a ordem limite. Pode ser também que nenhuma das solicitações enviadas para definir uma ordem pendente será aceita (devido a problemas de conectividade, falta de informações de preço, etc.), mas a situação de negociação transicionou para outra fase onde temos uma posição aberta. Isso significa que todas as possíveis fases intermediárias devem ser cobertas:

  1. Não há posição. Uma posição precisa ser aberta. Se a posição for aberta com sucesso, as solicitações para ordem de parada e ordem de limite devem ser enviadas.

  2. Há posição, mas não há ordem pendente. As solicitações para ordem de parada e ordem de limite devem ser enviadas.

  3. Há uma posição e ordem de parada, mas falta a ordem de limite. Uma solicitação para uma ordem limite deve ser enviada.

  4. Há uma posição e ordem de limite, mas falta a ordem de parada. Uma solicitação para uma ordem de parada deve ser enviada.

Observe que para identificar a fase em dado exemplo, a situação de negociação deve ser uma combinação completa para a identificação de regras fornecidas. Deve haver certas definições de ordem: apenas uma posição e nenhuma ordem ou posição e nenhuma das ordens - pode não haver outro jeito. A descrição das fases de operação de estratégia seguindo este princípio pode ficar muito longa e tornar todo o processo muito demorado devido à necessidade de contar todas as opções possíveis o que pode, em último caso, se tornar impossível. As regras de operação para o exemplo acima podem ser definidas de uma forma um pouco diferente:

  1. Não há posição. Uma posição precisa ser aberta. Se a posição for aberta com sucesso, as solicitações para a ordem de parada e ordem de limite devem ser enviadas.

  2. Há uma posição. Neste caso, deve haver duas ordens pendentes no mercado. Verifique se há uma ordem de parada no mercado e a defina se estiver faltando. Verifique se há uma ordem de limite no mercado e a defina se estiver faltando.

Neste caso, temos uma conjunto de regras mínimo para a identificação da fase de operação e uma descrição completa de uma situação de negócio onde podemos estar naquela fase.

A aplicação deste princípio requer a posição em si ser identificada para distinguir se é uma posição inicial ou se uma determinada ordem já foi acionada. Nestas circunstâncias, não haverá a necessidade de tentar colocar uma segunda ordem devido ao sistemas estarem em uma nova fase de operação. A identificação das ordens também será necessária, mas veremos a posição e identificação da ordem um pouco mais tarde. Vamos definir agora o princípio básico para descrição de estratégias de ordem de uma forma mais clara e compacta:

  1. Precisamos de um método para identificação da fase de operação atual com a menor quantia possível de informações.

  2. Cada fase de operação deve ter uma descrição completa da situação correspondente àquela fase.

  3. Se ações de mercado (abertura, fechamento, scaling in, scaling out, etc.) ou ordens pedentes forem necessárias em qualquer fase dada, tal fase deve ser dividida em duas subfases: antes do desempenho da ação de mercado e após (de modo a nos permitir realizar todas ações de uma vez e repetir tentativas falhas de ordem pendente).

  4. Se as ações de mercado (abertura, fechamento, scaling in, scaling out, etc.) ou ordens pendentes forem necessárias em qualquer fase dada, as ordens pendentes devem ser negociadas após a conclusão bem sucedida da ação de mercado.

  5. Uma fase pode corresponder apenas a uma ação de mercado e qualquer número de ações com ordens pendentes.

Identificação de ordem e posição

As posições e ordens podem ser identificadas de diversas formas: utilizando o comentário da ordem, número mágico ou variáveis globais. Vamos usar os comentários. Os principais problemas que surgem do uso dos comentários são o tamanho limitado do comentário e o fato de que o corretor pode adicionar algo seu nos comentários. Se não houver espaço suficiente para as informações do corretor, uma parte do comentário será cortada.

Você deve, então, tomar o mínimo espaço possível no comentário e tentar encontrar uma forma de separá-lo das possíveis informações do corretor. Cada ordem precisa apenas de um identificador. Na prática, pode ser 1 ou 2 símbolos ou uma combinação de letra e uma ou duas figuras. No final do identificador colocaremos uma marca, ou seja, "=" (isso nunca foi observado ser usado por corretores em suas entradas). Então temos 4 caracteres no máximo. Para obter a identificação de um comentário, podemos usar a seguinte função:

//+------------------------------------------------------------------+
//|   Function for obtaining the identifier from the aComment string |
//+------------------------------------------------------------------+
string GetID(string aComment)
  {
   int    p =StringFind(aComment,"=",0); // Determine the position of the separator
   string id=StringSubstr(aComment,0,p); // Get the substring located before the separator
   return(id);
  }
//+------------------------------------------------------------------+

Se a posição ou ordem precisar ser verificada com relação a qualquer identificador conhecido, isso pode ser feito da seguinte forma:

//+------------------------------------------------------------------+
//|   Checking the comment against the set identifier                |
//+------------------------------------------------------------------+
bool FitsID(string aID,string aComment)
  {
   return(StringFind(aComment,aID+"=",0)==0);
  }
//+------------------------------------------------------------------+

Metalinguagem para descrição de estratégias de ordem

Vamos definir agora a linguagem a ser usada para estabelecer estratégias de ordem. Ela deve ser concisa, clara e intuitiva enquanto ao mesmo tempo precisa estar alinhada com o MQL5 para garantir uma rápida execução de seus comandos sem cálculos desnecessários. Ficará a cargo dos leitores decidirem se o resultado foi ou não bem sucedido.

A descrição da estratégia é feita em um arquivo de texto que é então conectado ao Expert Advisor especificando seu nome na janela de propriedades do Expert Advisor.

Uma linha do arquivo corresponde a uma fase de operação do sistema. A linha é dividida em dois campos. O primeiro campo contém as regras de identificação da fase. O segundo cobre a lista de ações. Os campos são separados pela linha vertical "|". As regras de identificação e itens da lista de ação são definidas, separadas por ponto e vírgula ";".

Além dos comandos, o lado correto de cada linha pode obter um comentário separado do resto do texto por "#", por exemplo:

Nothing | Buy(M1,1,0,0) #If there is no position or order in the market, open a Buy position, mark it with "М1", lot 1, no Stop Loss, no Take Profit.

Identificação de fase

A identificação de fase pode requerer informações sobre a posição atual de mercado, ordens pendentes ou a última negociação. Além do estado da posição, alguns detalhes da posição podem ser necessários, como preço, lucro, valor Stop Loss, se estiver definido, etc. As informações necessárias na última negociação podem incluir os resultados do negócio. Para ordens pendentes, pode ser necessário especificar seu preço de abertura, Stop Loss, Take Profit (o que será mais provável ser necessário na fase de execução).

Estas informações são obtidas utilizando os comando de acesso aos dados de negociação. A maioria destes comandos terá dois parâmetros: identificação de ordem ou posição e identificador de parâmetro. Se o identificador de parâmetro não estiver especificado, apenas a existência do objeto de negócio especificado pelo comando e identificador será sujeito à verificação.

Por exemplo, o comando Buy(M1) sugere que deve haver uma posição de mercado com o identificador "M1". O comando Buy() sozinho (ou simplesmente Buy, sem os parenteses) significa que deve haver uma posição de compra com qualquer identificador. Se você especificar o identificador de parâmetro, ele indicará o valor do parâmetro, ou seja, Buy(M1, StopLossInPoints) - Valor Stop Loss em pontos definidos para uma posição de compra com o identificador "M1". Se não houver identificador especificado - Buy(,StopLossInPoints), consideramos como uma posição Stop Loss ou de compra com qualquer identificador (desde que haja uma posição de compra).

O valor obtido pode ser utilizado na expressão para verificações de condições, por ex., Buy(M1,StopLossInPoints)>=0 - a posição está em equilíbrio. Se não houver posição ou houver posição com um identificador diferente, a fase expressa desta maneira nas regras de identificação não será identificada, ou seja, não há necessidade de contar com duas condições - verificar o estado da posição e valor Stop Loss. Porém, neste caso, a existência de Stop Loss precisará ser verificada antecipadamente - Buy(M1,StopLossExists); Buy(M1,StopLossInPoints)>=0.

Ao verificar os valores, qualquer expressão de comparação pode ser utilizada: ">=", "<=", "==", "!=", ">", "<". O valor no lado direito da comparação pode ser expresso como um número ou ser representado por variáveis especiais: Var1, Var2 ... Var20. "p" adicionado a um número ou uma variável sugere que o valor será adicionalmente multiplicado pelo valor de ponto (a variável _Point).

Alternativamente, pode haver uma expressão aritmética mais complexa no lado direito da expressão de comparação. Ela pode ser a seguinte: X1*X2+X3*X4 ("+" pode certamente ser substituído por "-"), onde X1, X2, X3 e X4 podem ser números, variáveis ou comando de acessos a dados. O exemplo abaixo pode ser teoricamente considerado correto (se desconsiderarmos seu valor prático):

-BuyStop(BS1,StopLossInPoints)*-SellLimit(SL1,StopLossInPoints)+-SellStop(SS1,StopLossInPoints)*-BuyLimit(SL1,StopLossInPoints)

A tabela 1 mostra a lista de todos os comando de acesso.

Tabela 1. Comando de acesso de dados

Índice Comando Parâmetros possíveis Propósito
0 Nada Sem parâmetros Não há posição ou ordem pendente no mercado
1 NoPos Sem parâmetros Não há posição no mercado
2 Pendente Identificador de objeto, identificador de parâmetro de ordem Qualquer ordem pendente com o identificador de objeto especificado. Se o identificador do objeto não for especificado, então qualquer ordem pendente, independente do valor do identificador do objeto
3 Buy Identificador de objeto, identificador de parâmetro de posição Uma posição de compra com o identificador de objeto especificado. Se o identificador de objeto não for especificado, então apenas uma posição de compra
4 Sell Identificador de objeto, identificador de parâmetro de posição Uma posição de venda com o identificador de objeto especificado. Se o identificador de objeto não for especificado, então apenas uma posição de venda
5 BuyStop Identificador de objeto, identificador de parâmetro de ordem Uma ordem BuyStop com o identificador de objeto especificado. Se o identificador de objeto não for especificado, então apenas uma ordem BuyStop
6 SellStop Identificador de objeto, identificador de parâmetro de ordem Uma ordem SellStop com o identificador de objeto especificado. Se o identificador de objeto não for especificado, então apenas uma ordem SellStop
7 BuyLimit Identificador de objeto, identificador de parâmetro de ordem Uma ordem BuyLimit com o identificador de objeto especificado. Se o identificador de objeto não for especificado, então apenas uma ordem BuyLimit
8 SellLimit Identificador de objeto, identificador de parâmetro de ordem Uma ordem SellLimit com o identificador de objeto especificado. Se o identificador de objeto não for especificado, então apenas uma ordem SellLimit
9 BuyStopLimit Identificador de objeto, identificador de parâmetro de ordem Uma ordem BuyStopLimit com o identificador de objeto especificado. Se o identificador de objeto não for especificado, então apenas uma ordem BuyStopLimit
10 SellStopLimit Identificador de objeto, identificador de parâmetro de ordem Uma ordem SellStopLimit com o identificador de objeto especificado. Se o identificador de objeto não for especificado, então apenas uma ordem SellStopLimit
11 LastDeal Vazio, identificador de parâmetro de negócio A última negociação
12 LastDealBuy Vazio, identificador de parâmetro de negócio A última negociação é a negociação Buy
13 LastDealSell Vazio, identificador de parâmetro de negócio A última negociação é a negociação Sell
14 NoLastDeal Sem parâmetros Não há dados sobre a negociação no histórico; isto é necessário no caso do Expert Advisor ter acabado de começar a operar na conta
15 SignalOpenBuy Sem parâmetros Sinal indicador para abrir uma posição Buy
16 SignalOpenSell Sem parâmetros Sinal indicador para abrir uma posição Sell
17 SignalCloseBuy Sem parâmetros Sinal indicador para fechar uma posição Buy
18 SignalCloseSell Sem parâmetros Sinal indicador para fechar uma posição Sell
19 UserBuy Sem parâmetros Comando para usuário comprar
20 UserSell Sem parâmetros Comando para usuário vender
21 Bid Sem parâmetros Preço Bid
22 Ask Sem parâmetros Preço Ask
23 ThisOpenPrice Sem parâmetros Preço de abertura da ordem na qual o parâmetro é calculado. É usado nos comando de ação para ordens pendentes, exceto ordens do tipo StopLimit
24 ThisOpenPrice1 Sem parâmetros Preço de abertura-1 da ordem na qual o parâmetro é calculado. É usado nos comando de ação para ordens pendentes do tipo StopLimit
25 ThisOpenPrice2 Sem parâmetros Preço de abertura-2 da ordem na qual o parâmetro é calculado. É usado nos comando de ação para ordens pendentes do tipo StopLimit
26 LastEADeal Identificador de objeto, identificador de parâmetro de negócio A última negociação executada pelo Expert Advisor. A última negociação que possui "=" em seu comentário é buscada no histórico e então verificada com relação ao identificador do objeto
27 LastEADealBuy Identificador de objeto, identificador de parâmetro de negócio A última negociação executada pelo Expert Advisor é a negociação Buy. A última negociação que possui "=" em seu comentário é buscada no histórico e então verificada com relação ao identificador do objeto e direção da negociação
28 LastEADealSell Identificador de objeto, identificador de parâmetro de negócio A última negociação executada pelo Expert Advisor é a negociação Sell. A última negociação que possui "=" em seu comentário é buscada no histórico e então verificada com relação ao identificador do objeto e direção da negociação
29 NoTradeOnBar Sem parâmetros Não há negociações na última barra

Os comando estabelecidos na Tabela 1 permitem que você acesse os seguintes tipos de objetos de negócio: posições, ordens, negócios e ordens a serem definidas. Objetos diferentes possuem diferentes conjuntos de parâmetros.

A Tabela 2 apresenta todos os identificadores de parâmetro junto com os tipos de objeto que podem ser aplicados.

Tabela 2. Identificadores de acesso de dados.

Índice Identificador Propósito Tipo de objeto de negócio
0 ProfitInPoints Lucro em pontos Posição
1 ProfitInValute Lucro na moeda de depósito Posições, negócios
2 OpenPrice Abertura de preço Posições, ordens pendentes (exceto por ordens StopLimit)
3 LastPrice Preço Negociações
4 OpenPrice1 Preço de transição StopLimit-para-limite Ordens pendentes do tipo StopLimit. O identificador OpenPrice é aplicado quando a ordem faz a transição para Limite.
5 OpenPrice2 Preço de transição StopLimit-para-posição Ordens pendentes do tipo StopLimit. O identificador OpenPrice é aplicado quando a ordem faz a transição para Limite.
6 StopLossValue Valor Stop Loss Posições, ordens pendentes
7 TakeProfitValue Valor Take Profit Posições, ordens pendentes
8 StopLossInPoints Stop Loss em pontos Posições, ordens pendentes
9 TakeProfitInPoints Take Profit em pontos Posições, ordens pendentes
10 StopLossExists Existência de Stop Loss Posições, ordens pendentes
11 TakeProfitExists Existência de Take Profit Posições, ordens pendentes
12 Direção Direção 1 - Buy, -1 - Sell Posições, ordens pendentes, negociações

Descrição das ações

Ações incluem abertura e fechamento das posições de mercado, definição, modificação e exclusão das ordens pendentes, execução das funções de gerenciamento: Trailing Stop, Breakeven, Trailing Stop para uma ordem pendente (qualquer outra função de gerenciamento de posição).

Ações de abertura de posição e configuração de uma ordem podem implicar no uso de parâmetros necessários para executar estas ações. Estes parâmetros serão especificados após o comando entre parenteses, no percurso as funções são geralmente chamadas. Identificador é o primeiro parâmetro para todos os comando. Quando especificar parâmetros, você pode usar valores numéricos, variáveis, assim como parâmetros da posição existente ou ordem. Você também pode usar expressões aritméticas como X1*X2+X3*X4 abordadas na seção Identificação da fase para todos os parâmetros de comandos de ação.

A Tabela 3 mostra todos os comandos de ação.

Tabela 3. Comandos de ação

Índice Comando Propósito
0 Buy(ID,Lot,StopLoss,TakeProfit) Abrindo uma posição de compra
1 Sell(ID,Lot,StopLoss,TakeProfit) Abrindo uma posição de venda
2 Close(ID) Fechando uma posição de mercado
3 BuyStop(ID,Lot,Price,StopLoss,TakeProfit) Definindo uma ordem BuyStop
4 SellStop(ID,Lot,Price,StopLoss,TakeProfit) Definindo uma ordem SellStop
5 BuyLimit(ID,Lot,Price,StopLoss,TakeProfit) Definindo uma ordem BuyLimit
6 SellLimit(ID,Lot,Price,StopLoss,TakeProfit) Definindo uma ordem SellLimit
7 BuyStopLimit(ID,Lot,Price1,Price2,StopLoss,TakeProfit) Definindo uma ordem BuyStopLimit
8 SellStopLimit(ID,Lot,Price1,Price2,StopLoss,TakeProfit) Definindo uma ordem SellStopLimit
9 Delete(ID) Excluindo uma ordem pendente
10 DeleteAll(ID,BuyStop,SellStop,BuyLimit,SellLimit,BuyStopLimit,SellStopLimit) Excluindo os tipos específicos de ordens pendentes
11 Modify(ID,Price1,Price2,StopLoss,TakeProfit) Modificação de ordem ou posição
12 TrailingStop Operação de função Trailing Stop. Os parâmetros de função são definidos na janela de propriedades do Expert Advisor
13 BreakEven Operação da função de equilíbrio. Os parâmetros de função são definidos na janela de propriedades do Expert Advisor

As descrições do parâmetro de comando de ação são fornecidas na Tabela 4.

Tabela 4. Parâmetros de comando de ação

Parâmetro Propósito
ID Identificador de objeto de negócio (posição, ordem)
Lot Tamanho de lote em unidades. A variável Lot que define o valor da unidade pode ser encontrada na janela de propriedades do Expert Advisor
StopLoss Valor Stop Loss
TakeProfit Valor Take Profit
Preço Valor da ordem pendente (exceto para ordens do tipo StopLimit)
Preço1 Preço de transição StopLimit-para-limite
Preço2 Preço de transição StopLimit-para-posição

Vamos tentar agora colocar as estratégias de ordem revisadas anteriormente em nossa nova metalinguagem.

Exemplos de estratégias de ordem em metalinguagem

Os programas são exibidos em tabelas onde todos os comandos de ação e identificação de fase são organizados em colunas para uma melhor compreensão e anotados com comandos. Anexo ao artigo estão todos os programas em arquivos de texto na forma que eles devem ser usados no Expert Advisor.

Observação importante: "+", "-" e "*" são agora permitidos nos identificadores. É melhor simplesmente usar números.

Escalando utilizando ordens de limite

A posição inicial será aberta de acordo com a direção especificada pelo usuário na janela de propriedades. Escalar é permitido até 5 vezes (ordens de limite). Pode haver apenas três ordens no mercado ao mesmo tempo.

Tabela 5. Metaprograma para escalar utilizando ordens de limite

Número da fase Identificação de fase Ações Comentários
1 Nothing;
UserBuy
Buy(1,1,0,Ask+Var1p);
BuyLimit(2,2,Buy(1,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(3,4,BuyLimit(2,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(4,8,BuyLimit(3,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p)
Se não houver posição ou ordem no mercado, a direção Buy é definida nas propriedades do Expert Advisor, abrimos uma posição com lote inicial. Se a posição for aberta com sucesso, tentamos definir três ordens limite. Ou seja, cada ordem subsequente irá apenas ser definida com sucesso se a anterior tiver sido definida, porque o preço da ordem é calculado com base no preço da ordem anterior.
2 Buy(1) BuyLimit(2,2,Buy(1,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(3,4,BuyLimit(2,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(4,8,BuyLimit(3,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p)
Se a posição for aberta com sucesso na fase 1, mas nem todas as ordens forem definidas, a tentativa de vender todas as ordens pendentes irá continuar.
3 Buy(2) BuyLimit(3,4,Buy(2,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(4,8,BuyLimit(3,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(5,16,BuyLimit(4,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p)
Se a primeira ordem limite (com identificador 2) retroceder, a tentativa de definir as outras duas ordens que deveriam ser definidas (mas falharam) durante as fases anteriores continua e uma nova ordem é definida para que sempre tenha o total de três ordens limite no mercado.
4 Buy(3) BuyLimit(4,8,Buy(3,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(5,16,BuyLimit(4,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(6,32,BuyLimit(4,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p)
Outra ordem limite foi acionada e temos que garantir a presença das três ordens limite no mercado, como na fase anterior.
5 Buy(4) BuyLimit(5,16,Buy(4,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(6,32,BuyLimit(5,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p)
Esta fase garante a presença das duas ordens pendentes apenas enquanto o total de ordens fechem o número máximo de ordens.
6 Buy(5) BuyLimit(6,32,Buy(5,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p) Esta fase tem apenas uma ordem.
7 Buy(6) Modify(6,,,Buy(6,OpenPrice)-Var4p,) Se a última ordem retroceder, um Stop Loss é definido para isso.
8 Nothing;
UserSell
Sell(1,1,0,Var1p); SellLimit(2,2,Sell(1,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(3,4,SellLimit(2,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(4,8,SellLimit(3,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p)
Similar à fase 1, mas para a direção Sell.
9 Sell(1) SellLimit(2,2,Sell(1,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(3,4,SellLimit(2,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(4,8,SellLimit(3,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p)
Similar à fase 2, mas para a direção Sell.
10 Sell(2) SellLimit(3,4,Sell(2,OpenPrice)+Var2p,0,Var3);
SellLimit(4,8,SellLimit(3,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(5,16,SellLimit(4,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p)
Similar à fase 3, mas para a direção Sell.
11 Sell(3) SellLimit(4,8,Sell(3,OpenPrice)+Var2p,0,Var3);
SellLimit(5,16,SellLimit(4,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(6,32,SellLimit(4,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p)
Similar à fase 4, mas para a direção Sell.
12 Sell(4) SellLimit(5,16,Sell(4,OpenPrice)+Var2p,0,Var3);
SellLimit(6,32,SellLimit(5,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p)
Similar à fase 5, mas para a direção Sell.
13 Sell(5) SellLimit(6,32,Sell(5,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p) Similar à fase 6, mas para a direção Sell.
14 Sell(6) Modify(6,,,Sell(6,OpenPrice)+Var4p,) Similar à fase 7, mas para a direção Sell.
15 NoPos;
Pending
DeleteAll(,0,0,1,1,0,0) Existem ordens pendentes, mas sem posição. Isso acontece quando Take Profit da posição é acionado. Neste caso, as ordens devem ser excluídas. Após a exclusão das ordens, o sistema muda para fase 1 ou 9. Se o usuário desativou a direção inicial durante a operação do sistema, não haverá ação.

Uso de variáveis: Var1 - Take Profit da ordem inicial, Var2 - nível no qual a ordem limite é definida relativa ao preço de abertura da ordem anterior, Var3 - Stop Loss da última ordem.

A Fig. 5 é o gráfico que mostra o desempenho deste metaprograma.

Fig. 5. Desempenho do metaprograma para escalar utilizando ordens de limite
Fig. 5. Desempenho do metaprograma para escalar utilizando ordens de limite

Observe: regras para direções Sell e Buy são destacadas separadamente. Cada nível de ordem pendente subsequente é calculado com base no nível da ordem anterior. Se uma tentativa de definir alguma ordem falhar, a próxima ordem não será definida devido a falta do parâmetro necessário. Isso deve ser errado para calcular o nível baseado no preço de posição de mercado. Em tal caso, algumas das ordens podem ser perdidas.

Parar e reverter

O trabalho começa com duas ordens Stop pendentes É permitido ter até cinco reversões.

Tabela 6. Metaprograma para Stop e Reverse

Número da fase Identificação de fase Ações Comentários
1 Nada BuyStop(1,1,Ask+Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p);
SellStop(1,1,Bid-Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p)
Não há posição ou ordem no mercado; tentamos definir duas ordens Stop com identificador 1.
2 NoPos;
BuyStop(1)
SellStop(1,1,Bid-Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) Não há posição, mas há um BuyStop com identificador 1, o que significa que deve haver um SellStop com identificador 1.
3 NoPos;
SellStop(1)
BuyStop(1,1,Ask+Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) Não há posição, mas há um SellStop com identificador 1, o que significa que deve haver um BuyStop com identificador 1.
4 Buy(1) Delete(1);
SellStop(2,2,Buy(1,StopLossValue),ThisOpenPrice+Var2p,ThisOpenPrice-Var3p)
Há uma posição Buy com identificador 1 no mercado; neste caso, não deve haver outras ordens com identificador 1, mas deve haver um SellStop com identificador 2.
5 Sell(1) Delete(1);
BuyStop(2,2,Sell(1,StopLossValue),ThisOpenPrice-Var2p,ThisOpenPrice+Var3p)
Similar à fase 4, mas o primeiro Sell Stop foi acionado.
6 Buy(2) SellStop(3,4,Buy(2,StopLossValue),ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) O segundo BuyStop retrocedeu, então o terceiro SellStop deve ser definido.
7 Sell(2) BuyStop(3,4,Sell(2,StopLossValue),ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) O segundo SellStop retrocedeu, então o terceiro BuyStop deve ser definido.
8 Buy(3) SellStop(4,8,Buy(3,StopLossValue),ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) O terceiro BuyStop retrocedeu, então o quarto SellStop deve ser definido.
9 Sell(3) BuyStop(4,8,Sell(3,StopLossValue),ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) O terceiro SellStop retrocedeu, então o quarto BuyStop deve ser definido.
10 Buy(4) SellStop(5,16,Buy(4,StopLossValue),ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) O quarto BuyStop retrocedeu, então o quinto SellStop deve ser definido.
11 Sell(4) BuyStop(5,16,Sell(4,StopLossValue),ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) O quarto SellStop retrocedeu, então o quinto BuyStop deve ser definido.
12 Buy(5) SellStop(6,32,Buy(5,StopLossValue),ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) O quinto BuyStop retrocedeu, então o sexto SellStop deve ser definido.
13 Sell(5) BuyStop(6,32,Sell(5,StopLossValue),ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) O quinto SellStop retrocedeu, então o sexto BuyStop deve ser definido.
14 NoPos;
BuyStop(2)
Delete(2) Não há posição, mas ainda temos o BuyStop; isso pode acontecer quando a posição fechou em Take Profit. Neste caso, a ordem remanescente é excluída e o sistema muda para fase 1.
15 NoPos;
SellStop(2)
Delete(2) Similar à fase 14.
16 NoPos;
BuyStop(3)
Delete(3) Similar à fase 14.
17 NoPos;
SellStop(3)
Delete(3) Similar à fase 14.
18 NoPos;
BuyStop(4)
Delete(4) Similar à fase 14.
19 NoPos;
SellStop(4)
Delete(4) Similar à fase 14.
20 NoPos;
BuyStop(5)
Delete(5) Similar à fase 14.
21 NoPos;
SellStop(5)
Delete(5) Similar à fase 14.
22 NoPos;
BuyStop(6)
Delete(6) Similar à fase 14.
23 NoPos;
SellStop(6) |
Delete(6) Similar à fase 14.

Uso de variáveis: Var1 - nível no qual as ordens limite são definidas a partir do preço de mercado atual, Var2 - Stop Loss, Var3 - Take Profit.

A Fig. 6 é o gráfico que mostra o desempenho deste metaprograma.

Fig. 6. Desempenho do metaprograma para Stop e Reverse
Fig. 6. Desempenho do metaprograma para Stop e Reverse

Piramidação

Uma posição inicial é aberta com base no sinal indicador. É permitido escalar até cinco vezes.

Tabela 7. Metaprograma para piramidação"

Número da fase Identificação de fase Ações Comentários
1 Nothing;
SignalOpenBuy
Buy(1,1,Ask-Var1p,Ask+Var2p*6) Não há posição ou ordem no mercado; temos um sinal dos indicadores para abrir uma posição Buy após a posição ser aberta. Take Profit é primeiro definido à distância igual a Var2p*6, na próxima etapa será definido em Var2p*5 e assim por diante para garantir que Take Profit seja igual ao nível de preço.
2 Buy(1);
Buy(1,ProfitInPoints)>=Var3
Buy(2,1,Ask-Var1p,Ask+Var2p*5) Há uma posição Buy que mostra um bom lucro para que possamos escalar.
3 Buy(2) Modify(2,,,Buy(2,OpenPrice),) A posição no mercado tem índice 2, sugerindo que esta posição não é inicial e deve ser escalada; Stop Loss deve estar em equilíbrio.
4 Buy(2);
Buy(2,ProfitInPoints)>=Var3
Buy(3,1,Ask-Var1p,Ask+Var2p*4) A posição está novamente ganhando, então podemos escalar.
5 Buy(3) Modify(3,,,Buy(3,OpenPrice),) Stop Loss é movido para equilíbrio sempre que escalarmos.
6 Buy(3);
Buy(3,ProfitInPoints)>=Var3
Buy(4,1,Ask-Var1p,Ask+Var2p*3) Similar à fase 4.
7 Buy(4) Modify(4,,,Buy(4,OpenPrice),) Similar à fase 5.
8 Buy(4);
Buy(4,ProfitInPoints)>=Var3
Buy(5,1,Ask-Var1p,Ask+Var2p*2) Similar à fase 4.
9 Buy(5) Modify(5,,,Buy(5,OpenPrice),) Similar à fase 5.
10 Buy(5);
Buy(5,ProfitInPoints)>=Var3
Buy(6,1,Ask-Var1p,Ask+Var2p) Similar à fase 4.
11 Buy(6) Modify(6,,,Buy(6,OpenPrice),) Similar à fase 5.
12 Nothing;
SignalOpenSell
Sell(1,1,Bid+Var1p,Bid-Var2p*6) Similar à fase 1, mas com respeito à posição Sell.
13 Sell(1);
Sell(1,ProfitInPoints)>=Var3
Sell(2,1,Bid+Var1p,Bid-Var2p*5) Similar à fase 2, mas com respeito à posição Sell.
14 Sell(2) Modify(2,,,Sell(2,OpenPrice),) Similar à fase 3, mas com respeito à posição Sell.
15 Sell(2);
Sell(2,ProfitInPoints)>=Var3
Sell(3,1,Bid+Var1p,Bid-Var2p*4) Similar à fase 4, mas com respeito à posição Sell.
16 Sell(3); Modify(3,,,Sell(3,OpenPrice),) Similar à fase 5, mas com respeito à posição Sell.
17 Sell(3);
Sell(3,ProfitInPoints)>=Var3
Sell(4,1,Bid+Var1p,Bid-Var2p*3) Similar à fase 6, mas com respeito à posição Sell.
18 Sell(4); Modify(4,,,Sell(4,OpenPrice),) Similar à fase 7, mas com respeito à posição Sell.
19 Sell(4);
Sell(4,ProfitInPoints)>=Var3
Sell(5,1,Bid+Var1p,Bid-Var2p*2) Similar à fase 8, mas com respeito à posição Sell.
20 Sell(5); Modify(5,,,Sell(5,OpenPrice),) Similar à fase 9, mas com respeito à posição Sell.
21 Sell(5);
Sell(5,ProfitInPoints)>=Var3
Sell(6,1,Bid+Var1p,Bid-Var2p) Similar à fase 10, mas com respeito à posição Sell.
22 Sell(6); Modify(6,,,Sell(6,OpenPrice),) Similar à fase 11, mas com respeito à posição Sell.

Uso de variáveis: Var1 - Stop Loss inicial, Var2 - Take Profit da última ordem, Var3 - lucro em pontos no qual escalamos e movemos Stop Loss para equilíbrio.

A Fig. 7 é o gráfico que mostra o desempenho deste metaprograma.

Fig. 7. Desempenho do metaprograma para piramidação
Fig. 7. Desempenho do metaprograma para piramidação

Reabertura

Primeiro, definimos duas ordens limite. Assim que uma é acionada, a outra é excluída. Depois, quando Stop Loss retrocede, uma nova posição é aberta até fechar em Take Profit ou o número máximo de posições for utilizado (5).

Tabela 8. Metaprograma para reabertura

Número da fase Identificação de fase Ações Comentários
1 Nothing;
NoLastDeal
BuyLimit(1,1,Ask-Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p);
SellLimit(1,1,Bid+Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p)
Não há posição ou ordem no mercado e o histórico de conta não mostra negócios ou símbolos. Isso significa que é o começo da operação de sistema. Duas ordens limite são definidas como a ação inicial.
2 Nothing;
LastDeal(,ProfitInValute)>0
BuyLimit(1,1,Ask-Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p);
SellLimit(1,1,Bid+Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p)
Não há posição ou ordem no mercado, mas o histórico mostra uma negociação que fechou com lucro. Ele sugere que a fase anterior está concluída e precisamos começar do começa e definir duas ordens limite como na fase 1.
3 Nothing;
LastEADeal(5)
BuyLimit(1,1,Ask-Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p);
SellLimit(1,1,Bid+Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p)
Não há posição ou ordem no mercado, mas o histórico contém uma negociação com o último identificador. Neste caso, o lucro ganho na negociação não tem importância já que a fase é considerada ser concluída de qualquer forma; começamos do começo e definimos duas ordens limite como na fase 1.
4 NoPos;
BuyLimit(1)
SellLimit(1,1,Bid+Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) Não há posição no mercado, mas sabemos que existe uma ordem limite que significa que deve haver uma segunda.
5 NoPos;
SellLimit(1)
BuyLimit(1,1,Ask-Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) Similar à fase 4.
6 Buy(1);
SellLimit(1)
Delete(1) Existe uma posição com identificador 1. Isso significa que ambas ordens limite foram acionadas e a segunda ordem deve ser excluída.
7 Sell(1);
BuyLimit(1)
Delete(1) Similar à fase 6.
8 Nothing;
LastDeal(1,ProfitInValute)<=0;
LastEADeal(1,Direction)==1
Buy(2,2,Ask-Var2p,Ask+Var3p) Não há posição e a última negociação não teve lucro. Verifique a direção da última negociação executada pelo Expert Advisor; se foi uma negociação Buy, a próxima posição que você precisa abrir é uma posição Buy;
9 Nothing;
LastDeal(1,ProfitInValute)<=0;
LastEADeal(1,Direction)==-1
Sell(2,2,Bid+Var2p,Bid-Var3p) Não há posição e a última negociação não teve lucro. Verifique a direção da última negociação executada pelo Expert Advisor; se foi uma negociação Sell, a próxima posição que você precisa abrir é uma posição Sell;
10 Nothing;
LastDeal(2,ProfitInValute)<=0;
LastEADeal(2,Direction)==1
Buy(3,4,Ask-Var2p,Ask+Var3p) Similar à fase 8.
11 Nothing;
LastDeal(2,ProfitInValute)<=0;
LastEADeal(2,Direction)==-1
Sell(3,4,Bid+Var2p,Bid-Var3p) Similar à fase 9.
12 Nothing;
LastDeal(3,ProfitInValute)<=0;
LastEADeal(3,Direction)==1
Buy(4,8,Ask-Var2p,Ask+Var3p) Similar à fase 8.
13 Nothing;
LastDeal(3,ProfitInValute)<=0;
LastEADeal(3,Direction)==-1
Sell(4,8,Bid+Var2p,Bid-Var3p) Similar à fase 9.
14 Nothing;
LastDeal(4,ProfitInValute)<=0;
LastEADeal(4,Direction)==1
Buy(5,16,Ask-Var2p,Ask+Var3p) Similar à fase 8.
15 Nothing;
LastDeal(4,ProfitInValute)<=0;
LastEADeal(4,Direction)==-1
Sell(5,16,Bid+Var2p,Bid-Var3p) Similar à fase 9.

Uso de variáveis: Var1 - nível do preço de mercado que as ordens limite são definidas, Var2 - Stop Loss, Var3 - Take Profit.

A Fig. 8 é o gráfico que mostra o desempenho deste metaprograma.

Fig. 8. Desempenho do metaprograma para reabertura
Fig. 8. Desempenho do metaprograma para reabertura

Abaixo, você pode encontrar alguns programas a mais para ver a operação de tais funções como Trading Signals (Sinais de negociação), Trailing Stop (Limite móvel) e Breakeven (Equilíbrio).

Sinais de negociação

Entradas e saídas são baseadas em sinais de negociação.

Tabela 9. Metaprograma para Sinais de negociação"

Número da fase Identificação de fase Ações Comentários
1 Nothing;
SignalOpenBuy;
NoTradeOnBar
Buy(1,1,0,0) Não há posição ou ordem no mercado, mas podemos ver um sinal para abrir uma posição Buy. Não existem negociações na barra atual e abrimos uma posição Buy.
2 Nothing;
SignalOpenSell;
NoTradeOnBar
Sell(1,1,0,0) Não há posição ou ordem no mercado, mas podemos ver um sinal para abrir uma posição Sell. Não existem negociações na barra atual e abrimos uma posição Sell.
3 SignalCloseBuy;
Buy(1)
Close(1); Existe uma posição Buy e um sinal para fechar; a posição Buy está sendo fechada.
4 SignalCloseSell;
Sell(1)
Close(1); Existe uma posição Sell e um sinal para fechar; a posição Sell está sendo fechada.

A Fig. 9 é o gráfico que mostra o desempenho deste metaprograma.

Fig. 9. Desempenho do metaprograma para sinais de negociação
Fig. 9. Desempenho do metaprograma para sinais de negociação

Sinais de negociação com um limite móvel

Tabela 10. Metaprograma para sinais de negociação com um limite móvel

Número da fase Identificação de fase Ações Comentários
1 Nothing;
SignalOpenBuy;
NoTradeOnBar
Buy(1,1,0,0) Não há posição ou ordem no mercado, mas podemos ver um sinal para abrir uma posição Buy. Não existem negociações na barra atual e abrimos uma posição Buy.
2 Nothing;
SignalOpenSell;
NoTradeOnBar
Sell(1,1,0,0) Não há posição ou ordem no mercado, mas podemos ver um sinal para abrir uma posição Sell. Não existem negociações na barra atual e abrimos uma posição Sell.
3 SignalCloseBuy;
Buy(1)
Close(1); Existe uma posição Buy e um sinal para fechar; a posição Buy está sendo fechada.
4 SignalCloseSell;
Sell(1)
Close(1); Existe uma posição Sell e um sinal para fechar; a posição Sell está sendo fechada.
5 Buy(1) TrailingStop Há uma posição Buy no mercado; a função Trailing Stop deve ser ativada.
6 Sell(1) TrailingStop Há uma posição Sell no mercado; a função Trailing Stop deve ser ativada.

A Fig. 10 é o gráfico que mostra o desempenho deste metaprograma.

Fig. 10. Desempenho do metaprograma para sinais de negociação com um limite móvel
Fig. 10. Desempenho do metaprograma para sinais de negociação com um limite móvel

Sinais de negociação com função Breakeven

Tabela 11. Metaprograma para sinais de negociação com função Breakeven

Número da fase Identificação de fase Ações Comentários
1 Nothing;
SignalOpenBuy;
NoTradeOnBar
Buy(1,1,0,0) Não há posição ou ordem no mercado, mas podemos ver um sinal para abrir uma posição Buy. Devido a não haver negociações na barra atual, a posição Buy está sendo aberta.
2 Nothing;
SignalOpenSell;
NoTradeOnBar
Sell(1,1,0,0) Não há posição ou ordem no mercado, mas podemos ver um sinal para abrir uma posição Sell. Devido a não haver negociações na barra atual, a posição Sell está sendo aberta.
3 SignalCloseBuy;
Buy(1)
Close(1); Existe uma posição Buy e um sinal para fechar; a posição Buy está sendo fechada.
4 SignalCloseSell;
Sell(1)
Close(1); Existe uma posição Sell e um sinal para fechar; a posição Sell está sendo fechada.
5 Buy(1) BreakEven Há uma posição Buy no mercado; a função Breakeven deve ser ativada.
6 Sell(1) BreakEven Há uma posição Sell no mercado; a função Breakeven deve ser ativada.

A Fig. 11 é o gráfico que mostra o desempenho deste metaprograma.

Fig. 11. Desempenho do metaprograma para sinais de negociação com função Breakeven

Fig. 11. Desempenho do metaprograma para sinais de negociação com função Breakeven

Interpretador de comando

A abordagem acima para formalizar as estratégias de ordem nos permite entendê-las melhor e trabalhar em um algoritmo para sua futura implementação em um Expert Advisor, assim como interpretar diretamente e seguir as regras elaboradas. O eInterpretator Expert Advisor foi criado com este objetivo em mente (veja os arquivos anexos). Os parâmetros do Expert Advisor e suas descrições são fornecidos na Tabela 12.

Tabela 12. Parâmetros do eInterpretator Expert Advisor

Parâmetros Propósito
Lotes Volume da ordem quando o coeficiente de lote é igual a 1.
UserTradeDir Direção da negociação especificada pelo usuário (é verificado na identificação de fase ao executar os comando UserBuy e UserSell).
ProgramFileName Nome do arquivo do metaprograma (ao trabalhar na conta). Ao testar ou otimizar, o metaprograma deve ser posicionado no arquivo TesterMetaProgram.txt
DeInterpritate Interpretação inversa dos comandos. Com a conclusão, um arquivo com o prefixo "De_" aparecerá na pasta Arquivos e você poderá ver como o Expert Advisor "entende" o metaprograma a partir do arquivo ProgramFileName.
Variáveis do usuário
Var1 - Var20 Variáveis do usuário.
Trailing Stop (Limite móvel)
TR_ON Ativação da função Trailing Stop.
TR_Start Lucro da posição em pontos nos qual o limite móvel começa a trabalhar.
TR_Level Nível de limite móvel. Distância em pontos do preço de mercado atual para o Stop Loss.
TR_Step Etapas em pontos para modificação do Stop Loss.
Break Even
BE_ON Ativação da função Breakeven.
BE_Start Lucro da posição em pontos que ativam o Breakeven.
BE_Level Nível no qual Stop Loss é movido quando o Breakeven é acionado. O BE_Start-BE_Level dos pontos de lucro é fixo.
Sinais de abertura
OS_ON Ativação de sinais para abertura.
OS_Shift Barra na qual os indicadores são verificados: 0 - novo, 1 - concluído.
OS_TimeFrame Período de tempo do indicador.
OS_MA2FastPeriod Período MA rápido.
OS_MA2FastShift Troca MA rápida.
OS_MA2FastMethod Método MA rápida.
OS_MA2FastPrice Preço MA rápido.
OS_MA2SlowPeriod Período MA lento.
OS_MA2SlowShift Troca MA lenta.
OS_MA2SlowMethod Método MA lento.
OS_MA2SlowPrice Preço MA lento.
Sinais de fechamento
CS_ON Ativação de sinais para fechamento.
CS_Shift Barra na qual os indicadores são verificados: 0 - novo, 1 - concluído.
CS_TimeFrame Período de tempo do indicador.
CS_CCIPeriod Período CCI.
CS_CCIPrice Preço CCI.
CS_CCILevel Nível CCI superior (para fechamento de uma posição Buy). Um sinal para fechamento de uma posição Buy aparece no cruzamento inferior do nível. É exatamente o oposto para fechar uma posição Sell.

Como o Expert Advisor funciona

No começo, o Expert Advisor carrega o metaprograma a partir do arquivo para rever e analisá-lo. Se algum erro grave for encontrado no metaprograma, um alerta de erro aparecerá em pop-up. Analisando o metaprograma, o Expert Advisor preenche as estruturas de dados com valores numéricos correspondentes aos comandos de texto para garantir o desempenho máximo do Expert Advisor. Com a análise bem sucedida do metaprograma, a seguinte mensagem é impressa no registro: "Inicialização do interpretador concluída".

Se a variável DeInterpritate for inclusa, o Expert Advisor rodará um teste de interpretação reversa dos comando (por onde se desconecta do gráfico e qualquer teste no Strategy Tester é realizado no momento que for abortado). Quando realizar a interpretação reversa, o Expert Advisor transforma os valores numéricos encontrados nas estruturas em comandos de texto. E, embora as entradas de comando no arquivo sejam diferentes, o metaprograma interpretado ao contrário permitirá que você tenha uma ideia melhor de como o Expert Advisor analisa os comandos.

Vamos ver utilizando a seguinte string do arquivo do metaprograma:

Buy(6) | Modify(6,,,ThisOpenPrice-Var4p,)

Seguindo a interpretação reversa, esta string parecerá da seguinte forma:

Buy(6)==1*1+0*0; | Modify(6,,,ThisOpenPrice()*1-0.0025*1,)

Como podemos ver, um simples comando Buy(6) é transformado em uma expressão de comparação onde o lado direito contém a expressão aritmética X1*X2+X3*X4 que fornece 1 como resultados dos cálculos. No campo de ação, a variável do usuário é substituída com um valor numérico.

Dicas sobre personalização do Expert Advisor

Alguns de você podem provavelmente querer personalizar este Expert Advisor adicionando seus próprios comandos, tanto para a fase de análise como execução de comando e incluir outras funções de gerenciamento de posição. Devido a estrutura do Expert Advisor, tal personalização pode ser bastante direta, caso contrário, o trabalho inteiro feito no Expert Advisor terá sido sem valor prático.

Adicionando comandos de dados

Uma lista de comandos para obter dados pode ser encontrada no array InfoCommand. Os comandos são organizados em colunas com cinco comando em uma linha, o que nos permite facilmente contar seus números e encontrar o valor do índice para o comando ser adicionado.

Após adicionar o comando no array InfoCommand, adicionamos um novo caso correspondente ao índice do novo comando para a estrutura de troca na função SetValue(). Para obter o valor, precisamos primeiro selecionar o objeto no qual o valor será obtido e apenas depois obter o valor. Dependendo do tipo do objeto no qual os dados são obtidos, diferentes funções são usadas para selecionar o objeto. Estas funções são mostradas na Tabela 13.

Tabela 13. Funções do Expert Advisor para selecionar objetos de negociação

Função Propósito e parâmetros
Pos.Select(_Symbol) Seleção de símbolo. Método de classe padrão similar à função PositionSelect().
SelectOrder(long aType,string aID,bool & aSelected) Função para selecionar uma ordem pelo símbolo do Expert Advisor, tipo (aType) e valor de identificador (aID). Se o objeto for encontrado e selecionado, a variável aSelected por referência retorna verdadeira.
bool SelectLastDeal(int aType,bool & aSelected) Função para selecionar a última negociação pelo símbolo do Expert Advisor e tipo (aType). Se o objeto for encontrado e selecionado, a variável aSeleted por referência retorna verdadeira.
SelectLastEADeal(int aType,string aID,bool & aSelected) Função para selecionar a última negociação executada pelo Expert Advisor pelo símbolo do Expert Advisor e tipo (aType). Se o objeto for encontrado e selecionado, a variável aSeleted por referência retorna verdadeira.

A diferença entre a última negociação e a última negociação executada pelo Expert Advisor está que a última negociação cobre as negociações Stop Loss e Take Profit. Os dados da última negociação podem ser necessários para determinar o resultado do fechamento da última posição, enquanto as informações sobre a última negociação executada pelo Expert Advisor podem ser necessárias para identificar a última direção da negociação ou a fase de operação do Expert Advisor.

Além dos dados do objeto de negociação, o acesso pode ser conseguido para os dados de mercado, como preço, etc. O importante é se certificar que os dados podem ser obtidos. Depois de uma tentativa de selecionar o objeto, temos que nos certificar que o objeto foi realmente selecionado (verificando o valor de aSelected), obter o parâmetro necessário, atribuir seu valor para a variável Val.Value e retorná-lo verdadeiro.

A Tabela 14 apresenta funções que são usadas para obter parâmetros de vários objetos de negócio.

Tabela 14. Funções do Expert Advisor para obter parâmetros do objeto de negócio selecionado

Função Propósito e parâmetros
double SelPosParam(int aIndex) Obtém o parâmetro de posição pela definição de índice aIndex.
double SelOrdParam(int aIndex) Obtém o parâmetro de ordem pela definição de índice aIndex.
double SelDealParam(int aIndex) Obtém o parâmetro de negociação pela definição de índice aIndex.

O índice do identificador de dados a serem obtidos é passado na função. O valor do índice é contido na variável Val.InfoIdentifierIndex.

Ao adicionar um novo comando de acesso, você pode ser solicitado a também adicionar o identificador de dados a serem obtidos ou apenas adicionar o identificador de dados a serem retirados.

Adicionando identificadores de dados

Uma lista de identificadores pode ser encontrada no array InfoIdentifier. Precisamos adicionar o novo identificador ao array, encontrar seu índice e atualizar as funções SelPosParam(), SelOrdParam() e SelDealParam(). As atualizações podem ser relacionadas a todas as funções dependendo se o novo identificador pode ser aplicado a todos os objetos de negócio. As atualizações de função consistem em adicionar um novo caso correspondente ao novo índice do identificador à estrutura de mudança.

Adicionando comandos de ação

Os comandos de ação são adicionados ao array ActCommand. Os comandos no array são organizados em uma string, tornando um pouco mais difícil encontrar o índice necessário. Os elementos representam uma string, devido a além de adicionar um comando precisamos especificar o número de seus parâmetros e tipo. O número de parâmetros é especificado no array ActCmndPrmCnt e o tipo é indicado no array ActCmndType. Possíveis tipos incluem: 0 - ação de mercado, 1 - ação com uma ordem pendente, 2 - gerenciamento de posição.

Após o comando ser adicionado ao array, encontramos a função DoAction() e adicionamos outro caso para a nova chamada de função para sua mudança. A nova função deve ser do tipo boleano e retornar verdadeira se executada com sucesso ou falso em caso de erro. Se a verificação do desempenho da função não for necessária, como na função Trailing Stop, ela pode simplesmente retornar verdadeira.

Tenha em mente que as funções que lidam com ordens pendentes, como funções para definir o mesmo, precisam de verificações preliminares para a existência da ordem.

Mudanças nas funções de sinal de negociação

Todo trabalho pertencente a obter sinais de negociação no Expert Advisor é feito em duas funções (duas funções para sinais para fechamento e duas funções sinais para abertura).

A função CloseSignalsInit() (inicialização de sinais para fechamento) e a função OpenSignalsInit() (inicialização de sinais para abertura) são chamadas a partir da função OnInit() do Expert Advisor. Estas funções são responsáveis por carregar indicadores. As principais funções - CloseSignalsMain() (identificação de sinais de negócio para fechamento) e OpenSignalsMain() (identificação de sinais de negócio para abertura) são chamadas a partir da função OnTick() em cada tick.

No começo da execução da função, GlobalCloseBuySignal, GlobalCloseSellSignal (sinais para fechamento) e GlobalOpenBuySignal, GlobalOpenSellSignal (sinais para abertura) devem ser atribuídos como falsos e, então, verdadeiros com as leituras do indicador correspondente.

Além disso, na função OnDeinit() do Expert Advisor, você precisa executar IndicatorRelease().

Anexos

Nota. Ao utilizar programas com sinais de negociação, limite móvel e equilíbrio, sempre lembre-se de ativar as funções correspondentes na janela de propriedades do Expert Advisor. Ao testar estratégias no Strategy Tester, copie os arquivos do metaprograma no arquivo TesterMetaProgram.txt (isso é necessário para permitir o uso de agentes de teste remotos). O arquivo deve ser posicionado em MQL5/Files do diretório de dados do terminal (você pode abrí-lo a partir do terminal: File -> Open Data Folder).

O desempenho dos programas exibidos nos gráficos é encontrado em Exemplos de estratégias de ordem na seção Metalinguagem baseado em parâmetros especificados nos arquivos de parâmetro. O teste foi realizado durante os últimos meses (desde 29.08.2012), para EURUSD H1, modelo OHLC em M1.

Conclusão

Muito frequentemente, provavelmente, o primeiro sentimento que terá ao começar o desenvolvimento da estratégia de ordem é confusão - começar com que, o que ter em mente, como garantir a estabilidade do Expert Advisor no ambiente real, como combinar a execução de um algoritmo de estratégia de negócio com a confiança desta operação?

Este artigo é destinado a, em última instância, ajudar tanto desenvolvedores como negociadores que posicionam ordens para desenvolvimento de EAs com a formalização inicial de suas estratégias e ajudá-los a entender os estágios do desenvolvimento de estratégia, o que cada estágio envolve e o que deve ser levado em consideração. O eInterpretator Expert Advisor abre grandes possibilidades para experimentar outras estratégias com mínimo tempo e esforço.

Além disso, gostaria de dizer que não posso conter minha admiração pelo terminal MetaTrader 5. A velocidade de operação do eInterpretator Expert Advisor no Strategy Tester foi além das minhas expectativas!