Estratégias de ordem. Expert Advisor de propósito múltiplo.
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:
Análise de mercado e ações nela baseadas.
Análise de situação de negócio e ações nela baseadas.
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:
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.
Duas ordens de parada opostas. Quando qualquer uma das ordens é ativada, a segunda ordem é excluída.
Duas ordens de limite opostas. Quando qualquer uma das ordens é ativada, a segunda ordem é excluída.
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
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
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
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
É 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:
Não há posição ou ordem. Uma posição precisa ser aberta.
Há uma posição, mas não há uma ordem definida. Uma ordem de parada é necessária.
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:
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.
Há posição, mas não há ordem pendente. As solicitações para ordem de parada e ordem de limite devem ser enviadas.
Há uma posição e ordem de parada, mas falta a ordem de limite. Uma solicitação para uma ordem limite deve ser enviada.
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:
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.
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:
Precisamos de um método para identificação da fase de operação atual com a menor quantia possível de informações.
Cada fase de operação deve ter uma descrição completa da situação correspondente àquela fase.
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).
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.
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.
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
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
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
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
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
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
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
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
eInterpretator.mq5 - Expert Advisor que deve ser posicionado em MQL5/Experts do diretório de dados do terminal.
LimitAdd.txt - Metaprograma para escalar utilizando ordens de limite.
StopRev.txt - Metaprograma para Stop e Reverse.
Piramiding.txt - Metaprograma para piramidação.
ReOpen.txt.txt - Metaprograma para reabertura.
TradeSignals.txt - Metaprograma para sinais de negociação.
TradeSignalsTR.txt - Metaprograma para sinais de negociação com um limite móvel.
TradeSignalsBE.txt - Metaprograma para sinais de negociação com função Breakeven.
limitadd.set - arquivo de parâmetros para escalar utilizando ordens de limite.
stoprev.set - arquivo de parâmetros para Stop e Reverse.
piramiding.set - arquivo de parâmetros para piramidação.
reopen.set - arquivo de parâmetros para reabertura.
tradesignals.set - arquivo de parâmetros para sinais de negociação.
tradesignalstr.set - arquivo de parâmetros para sinais de negociação com um limite móvel.
tradesignalsbe.set - arquivo de parâmetros para sinais de negociação com função Breakeven.
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!
Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/495
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Hi Dmitry!
First of all, I try to understand the metalanguage concepts that you showed here, and then implement the code. The first part that I consider successful, the idea of the code is clear, and I thank you for introducing these concepts in the article above.
The problem for me in the second part ... I did not find a way to implement metalanguage code in MT5. Is it possible to implement this? I'm not an MT5 expert yet, and any help provided here is more than welcome!
My best wishes
C!