Um Administrador de ordem virtual para rastrear ordens dentro do ambiente MetaTrader 5 de posição centrada

22 janeiro 2014, 09:10
Paul
0
1 948

1. Introdução

Comprovadamente a maior mudança na transição do MetaTrader 4 para o MetaTrader 5 é o gerenciamento de trades abertos como posições. Em qualquer momento pode haver apenas uma posição aberta para cada símbolo e o tamanho desta posição ajusta-se para cima e para baixo cada vez que as ordens são processadas pelo corretor. Isto está em alinhamento com a NFA 2-43(b) FIFO rule introduzida nos EUA e também ajusta-se ao modo de trading em muitas outras entidades tais como futuras, básicas e CFDs.

Um exemplo claro da diferença seria quando dois EAs estão executando as mesmas ordens de emissão de símbolo em direções opostas. Isto pode ser uma situação comum com dois EAs operando em períodos de tempo diferentes, tais como um scalper e um trend-follower. No Meta Trader 4, a lista de trade aberta mostra ordens abertas de compra e venda com margem zero usada. No Meta Trader 5, nenhuma posição estaria aberta.

Observando o próprio código EA, funções como as mais geralmente usadas de MQL4 OpenOrders() abaixo ou variável similar, não funcionarão como esperado quando migradas para o MQL5.

int OpenOrders()  // MetaTrader 4 code to count total open orders for this EA
{
  int nOpenOrders=0;
  for (int i=OrdersTotal()-1; i>=0; i--)
  {
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
    if (OrderMagicNumber()==magic)
      if (OrderType()==OP_BUY || OrderType()==OP_SELL)
        if (OrderSymbol()==Symbol())
          nOpenOrders++;
  }
  return(nOpenOrders);
}

Então, o ambiente de posição centrada do MetaTrader 5 apresenta desafios desconhecidos para o programador utilizado para a abordagem de processamento de ordens utilizadas no MetaTrader 4. O que eram funções de gerenciamento de ordem simples no MetaTrader 4 tornaram-se mais complexas no MetaTrader 5, quando ordens múltiplas podem ser integradas em uma posição, como EAs múltiplas negociando um símbolo ou ordens múltiplas de um EA em um símbolo.


2. Formas de trabalhar com posições no MetaTrader 5

Há diversas formas de gerenciar este ambiente de posição centrada no MetaTrader 5, dependendo da complexidade das estratégias de negociação.

Primeiramente, observe que o manuseio de ordens pendentes é similar ao MetaTrader 4, então o código MQL5 escrito só para ordens pendentes poderia ser uma migração relativamente simples do código MQL4.

2.1 EA objetivo; um EA por símbolo por conta

A abordagem mais simples é limitar a negociação sobre uma conta para um EA objetivo por símbolo. “EA objetivo”, neste caso, significa um que apenas emita uma única ordem de cada vez, o que é um método comum, mas exclui estratégias como pirâmides e grid trading (negociação de rede). EAs objetivos podem ser escritos no MQL5 de uma forma simples para o MQL4, talvez utilizando a biblioteca wrapper CTrade fornecida em include\trade\trade.mqh.

2.2 EA complexo; um EA por símbolo por conta

Para EAs complexos, tais como aqueles que tenham uma estratégia como pirâmide ou grid trading (negociação de rede) que podem exigir mais do que uma ordem aberta para um símbolo, um código de rastreamento de ordem relativamente simples pode ser tudo o que se precise para gerenciar a estratégia. Isto será apenas possível se o EA nunca compartilhar posições com outros EA negociando o mesmo símbolo.

2.3 Mais de um EA de qualquer tipo por símbolo por conta

Isto apresenta a negociação e exigência de código mais complexa e é a razão para o desenvolvimento da biblioteca do Administrador de Ordem Virtual (VOM). Esta biblioteca é destinada a simplificar consideravelmente o desenvolvimento do código EA robusto que é completamente sociável com outros EAs.

O restante deste artigo descreve a biblioteca do Administrador de Ordem Virtual em detalhes.


3. Objetivos de plano, benefícios e vantagens do Administrador de Ordem Virtual

O VOM possui objetivos de plano principais:

  1. Sociabilidade: o comportamento de EAs escritas corretamente utilizando funções de negociação VOM será isolado de outra atividade EA.
  2. Robustez: manuseio elegante de eventos anormais tais como erros, quebras na comunicação cliente-servidor e preenchimentos de ordem incompletos.
  3. Facilidade de uso: fornecimento de funções de negociação fáceis e bem documentadas.
  4. Habilidade de uso em Strategy Tester (Testador de Estratégia).

Estes objetivos são implementados como a seguir:

  • Uso de ordens abertas virtuais, ordens pendentes, ordens de stoplosses e takeprofits. “Virtual”, neste contexto, significa que seu status é mantido no terminal do cliente, independente de posições no servidor. Estas ordens possuem linhas horizontais desenhadas no terminal da mesma maneira que as posições.
  • Uma parada de proteção baseada em servidor manteve uma distância das paradas virtuais para proteção contra desastres no caso de falhas da Internet ou do PC.

A abordagem VOM permite a um programador MQL5 EA:

  • Codificar EAs de uma forma de estilo "ordem centrada", por ex. similar à abordagem Meta Trader 4.
  • Implementar o que muitos dentro da comunidade MetaTrader referem-se a “hedge trading” ou, mais precisamente, a negociações mais simultâneas na direção oposta de um único símbolo.
  • Codificar outras estratégias de negociações modernas relativamente simples tais como grid trading (negociações de rede), pirâmides e abordagens de gerenciamento de dinheiro.
  • Emitir paradas e ordens pendentes mais curtas que o nível de parada mínimo.

Deve também ser observado que o aspecto negativo da abordagem VOM é que o seu stoplosses virtual, takeprofits e ordens pendentes possuem basicamente comportamento "invisível", ex. não podem ser vistos no servidor de corretor. Esconder níveis de stoploss é visto por alguns como necessário para prevenir o corretor de ser capaz de empregar stop-hunting.

O VOM também possui desvantagens. A quantidade de risco de equidade é aumentada devido a possibilidade de confiar na parada do servidor de proteção mais distante durante uma falha estendida da Internet ou do PC. E, também, o deslizamento ao alcançar uma ordem pendente virtual, ordem de stoploss ou takeprofit poderia ser muito mais alto do que para seu equivalente baseado em servidor durante horas de alta volatilidade tais como novos episódios. O impacto destas desvantagens pode ser minimizado se VOM EAs forem negociados de uma área de trabalho virtual de alta segurança comum com um curto tempo de atraso ao servidor do corretor.


4. O VOM na prática – um EA simples

Antes de ir além, é hora de mostrar como um VOM EA pode ser escrito. Escreveremos um simples EA transversal de MA, começando com o modelo EA fornecido no pacote de distribuição. Utilizaremos o Fractal Moving Average, que tem o potencial de reduzir negócios sem propósitos durante mercados diagonais, um problema notório com estratégias transversais de MA. Deve ser enfatizado que este EA foi fornecido como um simples exemplo e não é recomendado para negócios reais - o backtest é rentável mas o baixo número de negócios significa que o resultado não é de significância estatística.

O EA é armazenado em experts\Virtual Order Manager\VOM EAs.

//+------------------------------------------------------------------+
//|                                           FraMA Cross EA VOM.mq5 |
//+------------------------------------------------------------------+
#property copyright "Paul Hampton-Smith"
#property link      "http://paulsfxrandomwalk.blogspot.com"
#property version   "1.00"

// this is the only include required.  It points to the parent folder
#include "..\VirtualOrderManager.mqh"

input double   Lots=0.1;
input int      Fast_MA_Period=2;
input int      Slow_MA_Period=58;
/* 
Because the broker is 3/5 digit, stoplosses and takeprofits should be x10.  
Parece provável que todos os corretores que oferecem MetaTrader 5 serão 3/5 corretores dígitos, mas se isso for incorreto, não será uma tarefa muito importante para adicionar detecção de tamanho dígito. */
input int      Stop_Loss=5000;
input int      Take_Profit=0;
/*
We can also change the level of logging.  LOG_VERBOSE é o mais prolífico
nível de log.  Após um EA ser totalmente depurado, o nível pode ser reduzido a
LOG_MAJOR.  Os arquivos de log são escritos sob os arquivos pasta \ EAlogs e são
excluído automaticamente após 30 dias.  */
input ENUM_LOG_LEVEL Log_Level=LOG_VERBOSE;

// The following global variables will store the handles and values for the MAs 
double g_FastFrAMA[];
double g_SlowFrAMA[];
int g_hFastFrAMA;
int g_hSlowFrAMA;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   LogFile.LogLevel(Log_Level);

// Need to include this line in all EAs using CVirtualOrderManager  
   VOM.Initialise();
   Comment(VOM.m_OpenOrders.SummaryList());

   g_hFastFrAMA = iFrAMA(_Symbol,_Period,Fast_MA_Period,0,PRICE_CLOSE);
   g_hSlowFrAMA = iFrAMA(_Symbol,_Period,Slow_MA_Period,0,PRICE_CLOSE);
   ArraySetAsSeries(g_FastFrAMA,true);
   ArraySetAsSeries(g_SlowFrAMA,true);

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
// Need to include this line in all EAs using CVirtualOrderManager  
   VOM.OnTick();
   Comment(VOM.m_OpenOrders.SummaryList());

// We now obtain copies of the most recent two FrAMA values in the 
// g_FastFrAMA and  g_SlowFrAMA arrays.  
   if(CopyBuffer(g_hFastFrAMA,0,Shift,2,g_FastFrAMA)!=2) || 
      CopyBuffer(g_hSlowFrAMA,0,Shift,2,g_SlowFrAMA)!=2)
     {
      Print("Not enough history loaded");
      return;
     }

// And now we detect a cross of the fast FrAMA over the slow FrAMA,
// close any opposite orders and Buy a single new one
   if(g_FastFrAMA[0]>g_SlowFrAMA[0] && g_FastFrAMA[1]<=g_SlowFrAMA[1])
     {
      VOM.CloseAllOrders(_Symbol,VIRTUAL_ORDER_TYPE_SELL);
      if(VOM.OpenedOrdersInSameBar()<1 && VOM.OpenOrders()==0)
        {
         VOM.Buy(_Symbol,Lots,Stop_Loss,Take_Profit);
        }
     }

// Opposite for Sell
   if(g_FastFrAMA[0]<g_SlowFrAMA[0] && g_FastFrAMA[1]>=g_SlowFrAMA[1])
     {
      VOM.CloseAllOrders(_Symbol,VIRTUAL_ORDER_TYPE_BUY);
      if(VOM.OpenedOrdersInSameBar()<1 && VOM.OpenOrders()==0)
        {
         VOM.Sell(_Symbol,Lots,Stop_Loss,Take_Profit);
        }
     }
  }
//+------------------------------------------------------------------+

E agora com o lançamento do Strategy Tester (Testador de estratégia), ele pode ser testado, ver figura 1 abaixo:

 Figura 1. FrAMA Cross EA backtest

Figura 1. FrAMA Cross EA backtest

A seção de registro é mostrada na figura 2:

 Figura 2. Registro de teste de estratégia

Figura 2. Registro de teste de estratégia

5. Estrutura VOM

A figura 4 abaixo mostra como múltiplos VOM EAs são configurados:

Figura 3. Múltiplos VOM EAs

Figura 3. Múltiplos VOM EAs

Em seguida dentro do VOM, os componentes principais são mostrados na figura 4 abaixo:

Figura 4. Estrutura interna VOM

Figura 4. Estrutura interna VOM

Elementos da figura 4 explicados:

  • Configuração - o VOM utiliza CConfig para armazenar todos os principais itens de configuração em um local em uma Config de objeto global. Para tornar o acesso simples as variáveis membros são públicas e nenhuma função get/set (configuração/obtenção) é fornecida.
  • Variáveis globais - estas são as variáveis acessadas no MQL5 por funções tais como GlobalVariableGet(). O VOM utiliza variáveis globais para:
    • Gravar e adicionar o último número de licença de Ordem Virtual usando CGlobalVariable
    • Manter uma lista de todos os stoplosses virtuais para que paradas de servidor de proteção contra desastres possam ser mantidas
  • Trades abertos e arquivos de históricos - arquivos de disco rígido armazenados por CVirtualOrderArrays para garantir que o status da ordem possa ser restabelecido ao reiniciar. Um par destes arquivos é criado e armazenado em Files\\VOM para cada EA que utiliza o VOM. Uma CVirtualOrder inicia-se em VOM.m_OpenOrders array e é transferido ao VOM.m_OrderHistory array quando fechado ou deletado.
  • Atividade e registro de erro - a maioria dos códigos de qualquer complexidade necessita da habilidade de registrar atividade e esta função está sintetizada pela classe CLog. Isto permite o registro ser gravado em quatro diferentes níveis de detalhe e importância e inclui limpeza automática de arquivos de registro antigos para garantir que o espaço em disco seja gerenciado.

Especialistas que utilizam o VOM interagem com a biblioteca como mostrado na figura 5 abaixo:

 Figura 5. Interação EA com a biblioteca VOM

Figura 5. Interação EA com a biblioteca VOM


6. Mais sobre stoploss de proteção contra desastres

Paradas virtuais são bem comuns entre EAs MetaTrader 4. Se um stoploss é mantido somente na extremidade do cliente, o nível de saída para um negócio é invisível ao corretor, uma estratégia frequentemente implementada na esperança de que alguns corretores ajustem-se a stop-hunting. Por conta própria, as paradas virtuais aumentam extremamente o risco de negócio, uma vez que uma conexão cliente-corretor deva estar sempre no lugar para que a parada seja acionada.

O VOM controla este risco mantendo uma parada baseada em servidor a uma distância configurável longe da parada virtual mais curta. Este é chamado de stoploss de proteção contra desastres (DPSL) porque será normalmente acionado apenas se a conexão cliente-corretor for quebrada por algum tempo, como seria uma situação como quebra de conexão da Internet ou falha de um PC. Como as ordens virtuais são abertas e fechadas e convertidas a uma posição no servidor, a manutenção da DPSL ao nível correto pode ser um pouco mais complexa, como ilustrado na seguinte sequência.

Ação de ordem
virtual
Preço
aberto
SL virtual Posição
no servidor
Stoploss
no servidor
Comentário
0.1 lots BUY #1 2,00000 1,99000 0.1 lots BUY 1,98500 DPSL está 50 pontos abaixo de SL #1 virtual
0.1 lots BUY #2 2,00000 1,99500 0.2 lots BUY 1,99000 Ordem virtual #2 tem um SL mais curto então o DPSL
é ajustado para 50 pontos abaixo do SL #2 virtual
Fechar #2     0.1 lots BUY 1,98500 Reverter para DPSL mais folgado
0.1 lots SELL #3 2,00000 2,00500 Nenhum Nenhum Ordens virtuais #1 e #3 cancelaram uma à
outra no servidor
Fechar #1     0.1 lots SELL 2,01000 Ordem virtual #3 permanece aberta - o DPSL está
agora a 50 pontos acima do SL #3 virtual

7. Teste do Administrador de ordem virtual

Um projeto desse porte leva tempo para testar a fundo, então escrevi a EA VirtualOrderManaerTester.mq5 para permitir que ordens virtuais fossem criadas, modificadas, deletadas e fechadas facilmente com botões de comando no gráfico.

A figura 6 abaixo mostra uma ordem de compra virtual em lote de 0,1 na janela M5 e uma ordem de compra virtual de outro lote 0,1 aberto na janela H4 contra EURUSD (ver linhas de comentário), com o status do servidor mostrando corretamente uma posição em 0.2 lotes comprados. Por causa da longa posição geral, o StopLoss de proteção contra desastres pode ser visto abaixo da parada mais curta de ponto 20,0.

Figura 6. Dois EAs concordando em direção

Figura 6. Dois EAs concordando em direção

A figura 7 agora mostra os dois EAs testes com ordens virtuais opostas e nenhuma posição está aberta no corretor:

Figura 7. Dois EAs com ordens virtuais opostas e nenhuma posição está aberta no corretor

Figura 7. Dois EAs com ordens virtuais opostas e nenhuma posição está aberta no corretor


8. Uma tela muito simples de todas as ordens abertas VOM

Cada VOM EA pode apenas ver suas ordens, então escrevi um EA muito simples que combina com ordens abertas de todos os VOMs. A tela é muito simples e com o passar do tempo, uma versão muito melhor poderia ser escrita, talvez com botões de comando para executar modificar, deletar ou fechar ações como exigido em cada ordem. O EA é incluíso na embalagem de distribuição como VOM_OrderDisplay.mq5.


9. Conclusão

No momento da escrita deste artigo, o código VOM está em versão beta, assim como o próprio MetaTrader 5, e o tempo dirá se o conceito VOM se tornará popular ou acabará sendo considerado como apenas uma peça interessante de programação MQL5.

Vamos voltar para os objetivos do projeto na seção 3 e ver onde chegamos:

  1. Sociabilidade: o comportamento de EAs escritas corretamente utilizando funções de negociação VOM será isolado de outra atividade EA.
    • Resultado - sim, a abordagem VOM alcançou este objetivo
  2. Robustez: Manuseio elegante de eventos anormais tais como erros, quebras na comunicação cliente-servidor e preenchimentos de ordem incompletos.
    • Resultado - alguma robustez é evidente mas poderia ser melhorada, pois situações de negociações reais ocorrem e podem ser analisadas
  3. Facilidade de uso: fornecimento de funções de negociação fáceis e bem documentadas.
    • Resultado - Como será visto no pacote de distribuição de arquivos, um arquivo de ajuda .chm está incluso
  4. Habilidade de uso em Testador de Estratégia
    • Resultado - testes iniciais no testador de estratégia recentemente lançado indicam que o VOM executa o backtest corretamente, embora a abordagem VOM retarde o teste consideravelmente. Algum trabalho para melhorar o rendimento, provavelmente, será necessário

Várias mudanças futuras podem ser desejáveis:

  • Tais como acontecem com qualquer desenvolvimento de software complexo, é provável que existam erros restantes no código
  • Com cada lançamento de MetaTrader 5 pode ser exigido mudanças VOM para manter a compatibilidade
  • Funções VomGetLastError() e VomErrorDescription()
  • Habilidade de ler configuração de um arquivo
  • Paradas delimitadoras de vários tipos


10. Arquivos no pacote de distribuição zipado

O pacote VOM vem com um certo número de arquivos .mqh que devem ser instalados na pasta Experts\Virtual Order Manager folder.

  • ChartObjectsTradeLines.mqh - CEntryPriceLine, CStopLossLine, CTakeProfitLine
  • StringUtilities.mqh - descritores de enumeração global tais como ErrorDescription()
  • Log.mqh - CLog
  • GlobalVirtualStopList.mqh - CGlobalVirtualStopList
  • SimpleChartObject.mqh - CButton, CLabel e CEdit
  • VirtualOrder.mqh - CVirtualOrder
  • GlobalVariable.mqh - CGlobalVariable
  • VirtualOrderArray.mqh - CVirtualOrderArray
  • VirtualOrderManager.mqh - CVirtualOrderManager
  • VirtualOrderManagerConfig.mqh - CConfig
  • VirtualOrderManagerEnums.mqh - as várias enumerações definidas para o VOM
  • VOM_manual.mqh - esta página do manual
  • VOM_doc.chm***

Cinco arquivos EA mq5 também estão inclusos sob Experts\Virtual Order Manager\VOM EAs:

  • VOM_template_EA.mq5 - copie isto para fazer seus próprios EAs, e armazene-os em Experts\Virtual Order Manage\VOM EAs
  • VirtualOrderManagerTester.mq5
  • Support_Resistance_EA_VOM.mq5
  • FrAMA_Cross_EA_VOM.mq5
  • VOM_OrderDisplay.mq5

***Observe que o arquivo VOM_doc.chm pode necessitar estar desbloqueado:


Traduzido do Inglês pela MetaQuotes Software Corp.
Artigo original: https://www.mql5.com/en/articles/88

Arquivos anexados |
vom-doc.zip (727.63 KB)
vom2_0.zip (608.43 KB)
vom-sources.zip (40.33 KB)
Criando um indicador de várias moedas utilizando um número de buffers indicadores intermediários Criando um indicador de várias moedas utilizando um número de buffers indicadores intermediários

Houve um recente aumento de interesse em análises de cluster do mercado FOREX. O MQL5 abre novas possibilidades para pesquisa de tendências de movimento de pares de moeda. Um recurso chave do MQL5, diferenciando-o do MQL4 é a possibilidade de utilizar uma quantia ilimitada de buffers de indicador. Este artigo descreve um exemplo da criação de um indicador de diversas moedas.

Migrando do MQL4 para o MQL5 Migrando do MQL4 para o MQL5

Este artigo é um guia rápido para as funções da linguagem MQL4, ele o ajudará a migrar seus programas do MQL4 para MQL5. Para cada função do MQL4 (exceto funções de negociação), são apresentadas a implementação do MQL5 e descrição, isso permite a redução do tempo de conversão significativamente. Para conveniência, as funções do MQL4 são divididas em grupos, similar à referência MQL4.

Um exemplo de um Sistema de Comércio Baseado no indicador Heiken-Ashi Um exemplo de um Sistema de Comércio Baseado no indicador Heiken-Ashi

Neste artigo veremos a questão de uso de um indicador Heiken-Ashi na negociação. Com base neste indicador, um simples sistema de negócio é considerado e um Expert Advisor MQL5 é escrito. As operações de negócio são implementadas nas bases de classes da biblioteca de classe padrão. São fornecidos neste artigo os resultados de teste da estratégia de negócio revisada que são baseados no histórico e obtidos usando o strategy tester do MetaTrader 5 embutido.

Guia para escrever uma DLL para MQL5 em Delphi Guia para escrever uma DLL para MQL5 em Delphi

O artigo examina o mecanismo de criação de um módulo DLL, usando a linguagem de programação popular de ObjectPascal, dentro de um ambiente de programação Delphi. Os materiais, fornecidos neste artigo, são designados a focar principalmente em programadores iniciantes, que estejam trabalhando com problemas que rompem os limites da linguagem de programação embutidos do MQL5, conectando os módulos DLL externos.