English Русский 中文 Español Deutsch 日本語
Raios Elder (Bulls Power e Bears Power)

Raios Elder (Bulls Power e Bears Power)

MetaTrader 5Exemplos | 5 novembro 2018, 12:57
4 606 0
Vladimir Karputov
Vladimir Karputov

Introdução

O sistema de negociação Raios Elder foi descrito por Alexander Elder em seu livro "Como se transformar em um operador e investidor de sucesso" (na versão original em inglês, 'Trading for a Living'). Ele é baseado tanto nos osciladores Bulls Power (Poder dos Touros), Bears Power (Poder dos Ursos) quanto no indicador de tendência Moving Average (EMA — MME, média móvel exponencial).

O sistema de negociação é simples e complexo:

  • sistema simples — se você ler e interpretar literalmente: sinal de compra — tendência de alta (MME) e Bears Power (Poder dos Ursos) abaixo de zero, mas se inclinando para cima;
  • sistema complexo — se você ler atentamente e examinar o gráfico em que a MME e o Bears Power estão sendo executados: acontece que tudo não é tão simples, e há muito poucas condições desse tipo.

Neste artigo, passaremos por todas as etapas - do simples ao complexo - e verificaremos dois tipos de sistema de negociação: 

  1. todos os indicadores num só gráfico (e, portanto, no mesmo timeframe);
  2. em conjunto com o sistema "Seleção tripla".

Os EAs no artigo estão focados em trabalhar somente com contas de compensação. 


Postulados essenciais

Para entender a essência do sistema de negociação, é necessário entender claramente o que significa cada elemento do Raio Elder, isto é: preço, MME, máximas e mínimas dos indicadores Bulls Power (Poder dos Touros) e Bears Power (Poder dos Ursos) em cada barra.

  • Preço — consenso momentâneo sobre valor atual do ativo. Todas as compras são feitas com base na alta do preço, enquanto as vendas — na queda. Só é quando o comprador concorda em comprar e o vendedor — em vender que é feita a transação.
  • MME — média móvel exponencial. Reflete o consenso médio sobre o valor do ativo durante um determinado período. Por exemplo, a MME(13) no timeframe D1 representa o consenso médio sobre o valor do ativo nos últimos 13 dias. Por que é melhor usar uma média móvel exponencial em vez de uma simples? Elder respondeu a essa pergunta no capítulo IV 25 ('Médias Móveis'). Em resumo, "(...) a média móvel exponencial (MME) (...) atribui maior peso aos dados mais recentes e reage com mais rapidez às mudanças do que a MM simples. (...) a MME não salta em resposta a velhos dados."
  • Máxima no Bulls Power — mostra a força máxima dos touros numa determinada barra. Quando o preço sobe, os touros ganham, logo, os touros compram até que o preço atinja sua máxima. A máxima no Bulls Power é aquele momento em que os touros desejam aumentar o preço, mas não há mais dinheiro.
  • Mínima no Bears Power — mostra a força máxima dos ursos numa determinada barra. Quando o preço cai, os ursos ganham, logo, os ursos vendem até que o preço atinja sua mínima. A mínima no Bears Power é aquele momento em que os ursos desejam baixar o preço, mas já não é possível continuar fazendo isso.
  • Bull Power — mostra a capacidade dos touros de elevar o preço acima do consenso médio do valor do ativo. Normalmente, o Bull Power está acima de zero, mas se estiver abaixo de zero, significa que há pânico no rebanho de touros, pois estão se afogando.
  • Bears Power — reflete a capacidade dos ursos de reduzir o preço abaixo do consenso médio do valor do ativo. Normalmente, o Bears Power está abaixo de zero, mas se estiver acima de zero, significa que touros extraordinariamente fortes levantam com seus chifres ursos, ficando suspensos no ar.


Tipo 1: todos os indicadores num gráfico

Vamos explorar futuros e ações no timeframe D1. Todos os três indicadores (Bulls Power, Bears Power e MME) localizados no mesmo gráfico. O período médio de todos os indicadores é 13.


Regras para compra

  • tendência de alta (orientamo-nos com a ajuda do indicador MME);
  • Poder dos Ursos (Bears Power) abaixo de zero, mas se inclinando para cima;
  • a ordem pendente Buy stop é colocada acima da máxima dos últimos dois dias e o Stop-Loss de proteção é posicionado abaixo da última mínima.

CATDaily Buy signals

CAT, Daily Buy signals

Regras para venda

  • tendência de baixa (com base nas leituras do indicador MME);
  • Poder dos Touros (Bulls Power) acima de zero, mas se inclinando para baixo;
  • a ordem pendente Sell stop é colocada abaixo da máxima dos últimos dois dias e o Stop-Loss de proteção é posicionado acima da última mínima.

CATDaily Sell signal

CAT, Daily Sell signals


Regras de negociação

Nas figuras 1 e 2, pode-se ver que, no tipo de sistema de negociação "Todos os indicadores num gráfico", as regras para compra e para venda são desencadeadas quando há uma reversão para uma tendência estável. Esses momentos favoráveis são raros, especialmente quado o timeframe analisado é D1. Portanto, no tipo "Todos os indicadores num gráfico", é necessário analisar um grade número de instrumentos para aumentar a frequência de transações na conta de negociação.

No entanto, os gráficos D1 têm uma vantagem significativa, isto é, a análise da inclinação da MME e das leituras dos indicadores Bulls Power e Bears Power só podem ser realizadas uma vez por dia — quando aparece uma nova barra. É assim que o EA vai funcionar, quer dizer, segundo o símbolo definido no timeframe D1 ele vai esperar uma nova barra para, em seguida, realizar uma análise das possibilidades de entrada. 

Como futuros ou ações são apenas de compensação, posições multidirecionais (hedge) são inválidas, porém, o aumento do volume de posições é completamente admissível. O EA pode negociar apenas no símbolo atual ou em vários símbolos armazenados num arquivo de texto. Tudo o relacionado com o símbolo atual pode estar esclarecido, mas a escolha de vários símbolos pode apresentar os seguintes problemas:

  • é necessário especificar cerca de cem símbolos de um só mercado (por exemplo, apenas títulos);
  • é necessário especificar vários símbolos de diferentes mercados (por exemplo, futuros e títulos).

Como selecionar todos os símbolos de um só mercado? Por exemplo, temos o símbolo "CAT", e está localizado no seguinte caminho: "Stock Markets\USA\NYSE/NASDAQ(SnP100)\CAT"

Symbols Specification

Vamos supor que este símbolo nos convém e queremos selecionar todos os outros instrumentos da ramificação "\NYSE/NASDAQ(SnP100)\". Nesse caso, podemos fazer o seguinte:

  1. abrir o gráfico deste símbolo;
  2. iniciar o script (vamos chamá-lo Symbols on the specified path.mq5), que receberá o caminho do símbolo (no exemplo acima, para o símbolo "CAT", será "Stock Markets\USA\NYSE/NASDAQ(SnP100)") e armazenará no arquivo de texto todos os símbolo do caminho resultante. O arquivo de texto será salvo na pasta compartilhada Common Data Folder;
  3. finalmente, especificar nas configurações do EA o nome do arquivo de texto.
Se forem necessários símbolos de vários mercados, executamos o script em cada um dos mercados (a lista de símbolos é salva em seu arquivo exclusivo) e, em seguida, combinamos manualmente os dois arquivos de texto.

Implementação de script Symbols on the specified path.mq5 será descrita abaixo.


Montagem do EA. Tipo 1: todos os indicadores num gráfico

Symbols on the specified path.mq5 — script com o qual obtemos o arquivo de texto com símbolos. 

ATENÇÃO: somente o texto "Everything is fine. There are no errors" exibido na guia "Experts" indica que o script funciona sem erros e o arquivo resultante com símbolos pode ser usado para o EA trabalhar!

Para encurtar o código do ficheiro, é inserida a classe CFileTxt, e m_file_txt trabalha com o arquivo de teste — objeto da classe CFileTxt. O script realiza o trabalho em sete passos:

//+------------------------------------------------------------------+
//|                                Symbols on the specified path.mq5 |
//|                              Copyright © 2018, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2018, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.002"
#property script_show_inputs
//---
#include <Files\FileTxt.mqh>
CFileTxt       m_file_txt;                   // file txt object
//--- input parameters
input string   InpFileName="Enter a unique name.txt";  // File name
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- STEP 1
   string current_path="";
   if(!SymbolInfoString(Symbol(),SYMBOL_PATH,current_path))
     {
      Print("ERROR: SYMBOL_PATH");
      return;
     }
//--- STEP 2
   string sep_="\\";                 // A separator as a character 
   ushort u_sep_;                    // The code of the separator character 
   string result_[];                 // An array to get strings 
//--- Get the separator code 
   u_sep_=StringGetCharacter(sep_,0);
//--- Split the string to substrings 
   int k_=StringSplit(current_path,u_sep_,result_);
//--- STEP 3
//--- Now output all obtained strings 
   if(k_>0)
     {
      current_path="";
      for(int i=0;i<k_-1;i++)
         current_path=current_path+result_[i]+sep_;
     }
//--- STEP 4
   string symbols_array[];
   int symbols_total=SymbolsTotal(false);
   for(int i=0;i<symbols_total;i++)
     {
      string symbol_name=SymbolName(i,false);
      string symbol_path="";
      if(!SymbolInfoString(symbol_name,SYMBOL_PATH,symbol_path))
         continue;
      if(StringFind(symbol_path,current_path,0)==-1)
         continue;
      
      int size=ArraySize(symbols_array);
      ArrayResize(symbols_array,size+1,10);
      symbols_array[size]=symbol_name];
     }
//--- STEP 5
   int size=ArraySize(symbols_array);
   if(size==0)
     {
      PrintFormat("ERROR: On path \"%s\" %d symbols",current_path,size);
      return;
     }
   PrintFormat("On path \"%s\" %d symbols",current_path,size);
//--- STEP 6
   if(m_file_txt.Open(InpFileName,FILE_WRITE|FILE_COMMON)==INVALID_HANDLE)
     {
      PrintFormat("ERROR: \"%s\" file in the Data Folder Common folder is not created",InpFileName);
      return;
     }
//--- STEP 7
   for(int i=0;i<size;i++)
      m_file_txt.WriteString(symbols_array[i]+"\r\n");
   m_file_txt.Close();
   Print("Everything is fine. There are no errors");
//---
  }
//+------------------------------------------------------------------+

Algoritmo do EA:

  • STEP 1: para o símbolo atual, é determinado SYMBOL_PATH — caminho na árvore de símbolos;
  • STEP 2: o caminho resultante é dividido em substrings com o separador "\";
  • STEP 3: montamos novamente o caminho atual, mas sem a última substring, já que a última substring é o nome do símbolo;
  • STEP 4: iteramos todos os símbolos disponíveis; se o caminho do símbolo na árvore de símbolos coincidir com o caminho atual, selecionamos o nome do símbolo para adicioná-lo à matriz de símbolos encontrados;
  • STEP 5: verificamos o tamanho da matriz dos símbolos encontrados;
  • STEP 6: criamos o arquivo;
  • STEP 7: escrevemos no arquivo nossa matriz de símbolos encontrados e fechamos o arquivo.


Elder-Ray 1 — EA (ou vários EAs) com número de versão 1.xxx que negociará com base no tipo 1: todos os indicadores num gráfico.

Como definir o volume da posição — o lote mínimo pode variar

Experimento simples: verificamos o tamanho do lote mínimo para futuros e títulos: por analogia com o script Symbols on the specified path.mq5, iteramos todos os símbolos localizados no mesmo caminho do símbolo atual, mas em vez de salvar os símbolos num arquivo, exibiremos estatísticas sobre o tamanho do lote mínimo.

Gets minimal volume.mq5 — script com o qual exibiremos estatísticas sobre o volume mínimo de um grupo de símbolos. O script itera um grupo de símbolos e acumula estatísticas (minimal volume to close a deal e counter) numa matriz bidimensional:

//--- STEP 4
/* 
   symbols_array[][2]:
   [*][minimal volume to close a deal]
   [*][counter]
*/

Código completo do script:

//+------------------------------------------------------------------+
//|                                          Gets minimal volume.mq5 |
//|                              Copyright © 2018, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2018, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- STEP 1
   string current_path="";
   if(!SymbolInfoString(Symbol(),SYMBOL_PATH,current_path))
     {
      Print("ERROR: SYMBOL_PATH");
      return;
     }
//--- STEP 2
   string sep_="\\";                 // A separator as a character 
   ushort u_sep_;                    // The code of the separator character 
   string result_[];                 // An array to get strings 
//--- Get the separator code 
   u_sep_=StringGetCharacter(sep_,0);
//--- Split the string to substrings 
   int k_=StringSplit(current_path,u_sep_,result_);
//--- STEP 3
//--- Now output all obtained strings 
   if(k_>0)
     {
      current_path="";
      for(int i=0;i<k_-1;i++)
         current_path=current_path+result_[i]+sep_;
     }
//--- STEP 4
/* 
   symbols_array[][2]:
   [*][minimal volume to close a deal]
   [*][counter]
*/
   double symbols_array[][2];
   int symbols_total=SymbolsTotal(false);
   for(int i=0;i<symbols_total;i++)
     {
      string symbol_name=SymbolName(i,false);
      string symbol_path="";
      if(!SymbolInfoString(symbol_name,SYMBOL_PATH,symbol_path))
         continue;
      if(StringFind(symbol_path,current_path,0)==-1)
         continue;

      double min_volume=0.0;
      if(!SymbolInfoDouble(symbol_name,SYMBOL_VOLUME_MIN,min_volume))
         continue;
      int size=ArrayRange(symbols_array,0);
      bool found=false;
      for(int j=0;j<size;j++)
        {
         if(symbols_array[j][0]==min_volume)
           {
            symbols_array[j][1]=symbols_array[j][1]+1;
            found=true;
            continue;
           }
        }
      if(!found)
        {
         ArrayResize(symbols_array,size+1,10);
         symbols_array[size][0]=min_volume;
         symbols_array[size][1]=1.0;
        }
     }
//--- STEP 5
   int size=ArrayRange(symbols_array,0);
   if(size==0)
     {
      PrintFormat("ERROR: On path \"%s\" %d symbols",current_path,size);
      return;
     }
//--- STEP 6
   for(int i=0;i<size;i++)
      PrintFormat("Minimal volume %.2f occurs %.1f times",symbols_array[i][0],symbols_array[i][1]);
   Print("Everything is fine. There are no errors");
//---
  }
//+------------------------------------------------------------------+

Algoritmo do EA:

  • STEP 1: para o símbolo atual, é determinado SYMBOL_PATH — caminho na árvore de símbolos;
  • STEP 2: o caminho resultante é dividido em substrings com o separador "\";
  • STEP 3: montamos novamente o caminho atual, mas sem a última substring, já que a última substring é o nome do símbolo;
  • STEP 4: iteramos todos os símbolos disponíveis; se o caminho do símbolo na árvore de símbolos coincidir com o caminho atual, obtemos o tamanho mínimo do símbolo e procuramos na matriz de símbolos. Se esse valor já estiver, incrementamos o contador. Se ainda não houver esse valor, adicionamos à matriz e definimos o contador como "1.0";
  • STEP 5: verificamos o tamanho da matriz dos símbolos encontrados;
  • STEP 6: exibimos estatísticas.

Resultado da inicialização em títulos:

Gets minimal volume (CAT,D1)    Minimal volume 1.00 occurs 100.0 times

e em futuros:

Gets minimal volume (RTSRIU8,D1)        Minimal volume 1.00 occurs 77.0 times

- nos dois mercados o lote é o mesmo — 1.0.

Por tanto, não vamos complicar o sistema e tomamos "1.0" como lote mínimo.


Visualização dos indicadores usados

Ao executar o teste visual no testador, você vê os indicadores que o EA usa. Mas quando este EA é iniciado no gráfico do terminal, não são mostrados os indicadores. Neste sistema de negociação, gostaria de ver esses indicadores no gráfico do terminal, a fim de controlar visualmente o funcionamento do EA:

CATDaily visual trading

Como você pode ver, aqui usei minhas próprias configurações de cor e espessura de linha para todos os indicadores (tudo manualmente). Mas para visualizar automaticamente os indicadores usados no gráfico do terminal, você precisa reescrever ligeiramente os indicadores Moving Average, Bulls Power e Bears Power. Já implementei algo semelhante no código Custom Moving Average Input Color — nos parâmetros de entrada foi colocada a cor do indicador: este parâmetro de entrada está disponível ao criar o indicador do EA. Resta escrever da mesma maneira mais três indicadores.

Estes indicadores (Custom Moving Average Inputs, Custom Bulls Power Inputs e Custom Bears Power Inputs) podem ser baixados no CodeBase. Note que os indicadores baixados devem ser colocados na raiz da pasta [data folder]\MQL5\Indicators\.


Elder-Ray 1.001.mq5visualização de indicadores usados em que a cor e a largura podem ser especificadas. Funciona tanto no testador de estratégias ao inicializar um EA no gráfico:

Elder-Ray 1.001

Como isso é implementado?

A principal condição é a presença de indicadores. Custom Moving Average InputsCustom Bulls Power Inputs e Custom Bears Power Inputs na pasta [data folder]\MQL5\Indicators

Three indicators

O gerenciamento da aparência dos indicadores, bem como a configuração do período são feitos nos parâmetros de entrada. Para trabalhar com indicadores são declaradas três variáveis em que serão armazenados mais tarde os identificadores de indicador (handle_iCustom_MA, handle_iCustom_Bulls e handle_iCustom_Bears).

//+------------------------------------------------------------------+
//|                                                  Elder-Ray 1.mq5 |
//|                              Copyright © 2018, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2018, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
//---

//---
enum ENUM_INPUT_SYMBOLS
  {
   INPUT_SYMBOLS_CURRENT=0,   // current symbol
   INPUT_SYMBOLS_FILE=1,      // text file
  };
//--- input parameters
input ENUM_INPUT_SYMBOLS   InpInputSymbol       = INPUT_SYMBOLS_FILE;   // works on ...
input uint                 InpNumberMinLots     = 1;                    // Number of minimum lots
//--- Custom Moving Average Inputs
input int                  Inp_MA_ma_period     = 13;                   // MA: averaging period 
input int                  Inp_MA_ma_shift      = 0;                    // MA: horizontal shift 
input ENUM_MA_METHOD       Inp_MA_ma_method     = MODE_EMA;             // MA: smoothing type 
input ENUM_APPLIED_PRICE   Inp_MA_applied_price = PRICE_CLOSE;          // MA: type of price 
input color                Inp_MA_Color         = clrChartreuse;        // MA: Color
input int                  Inp_MA_Width         = 2;                    // MA: Width
//--- Custom Bulls Power Inputs
input int                  Inp_Bulls_ma_period  = 13;                   // Bulls Power: averaging period 
input color                Inp_Bulls_Color      = clrBlue;              // Bulls Power: Color
input int                  Inp_Bulls_Width      = 2;                    // Bulls Power: Width
//--- Custom Bears Power Inputs
input int                  Inp_Bears_ma_period  = 13;                   // Bears Power: averaging period 
input color                Inp_Bears_Color      = clrRed;               // Bears Power: Color
input int                  Inp_Bears_Width      = 2;                    // Bears Power: Width

int    handle_iCustom_MA;                    // variable for storing the handle of the iCustom indicator
int    handle_iCustom_Bulls;                 // variable for storing the handle of the iCustom indicator 
int    handle_iCustom_Bears;                 // variable for storing the handle of the iCustom indicator 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()


Na OnInit() são criados identificadores de indicadores personalizados (é implementada iCustom), e os indicadores criados são adicionados ao gráfico (é implementada ChartIndicatorAdd).

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create handle of the indicator iCustom
   handle_iCustom_MA=iCustom(Symbol(),Period(),"Custom Moving Average Inputs",
                             Inp_MA_ma_period,
                             Inp_MA_ma_shift,
                             Inp_MA_ma_method,
                             Inp_MA_Color,
                             Inp_MA_Width,
                             Inp_MA_applied_price);
//--- if the handle is not created 
   if(handle_iCustom_MA==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code 
      PrintFormat("Failed to create handle of the iCustom indicator (\"Custom Moving Average Inputs\") for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early 
      return(INIT_FAILED);
     }

//--- create handle of the indicator iCustom
   handle_iCustom_Bulls=iCustom(Symbol(),Period(),"Custom Bulls Power Inputs",
                                Inp_Bulls_ma_period,
                                Inp_Bulls_Color,
                                Inp_Bulls_Width);
//--- if the handle is not created 
   if(handle_iCustom_Bulls==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code 
      PrintFormat("Failed to create handle of the iCustom indicator (\"Custom Bulls Power Inputs\") for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early 
      return(INIT_FAILED);
     }

//--- create handle of the indicator iCustom
   handle_iCustom_Bears=iCustom(Symbol(),Period(),"Custom Bears Power Inputs",
                                Inp_Bears_ma_period,
                                Inp_Bears_Color,
                                Inp_Bears_Width);
//--- if the handle is not created 
   if(handle_iCustom_Bears==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code 
      PrintFormat("Failed to create handle of the iCustom indicator (\"Custom Bears Power Inputs\") for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early 
      return(INIT_FAILED);
     }

   ChartIndicatorAdd(0,0,handle_iCustom_MA);
   int windows_total=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
   ChartIndicatorAdd(0,windows_total,handle_iCustom_Bulls);
   ChartIndicatorAdd(0,windows_total+1,handle_iCustom_Bears);
//---
   return(INIT_SUCCEEDED);
  }


Economizamos recursos. Elder-Ray 1.010.mq5

Os símbolo estudados de um grupo podem ser cerca de cem. Portanto, surge a pergunta de como economizar espaço de armazenamento, uma vez que haverá três indicadores em cada gráfico. Como no caso do lote mínimo, não há nada melhor do que tomar e verificar o consumo de recursos do EA. Ao mesmo tempo, vamos avançar um pouco na montagem do nosso EA - vamos adicionar um código que leia no arquivo de texto os nomes dos símbolos de um grupo e trabalhe com eles.

No EA é conectada a classe CFileTxt (nós já a usamos no script Symbols on the specified path.mq5) —o objeto desta classe m_file_txt é responsável pelo acesso ao arquivo de texto e pela leitura das informações do arquivo. Conectamos também a classe CSymbolInfo — o objeto desta classe m_symbol é responsável por verificar a existência de um símbolo e por adicionar o símbolo à janela "Observação do mercado". Por que a escolha caiu precisamente sobre CSymbolInfoe não na implementação através das funções SymbolInfoInteger e SymbolSelect функции? Tudo é simples: na classe CSymbolInfo, todo o código para verificação, adição ou mensagens de erro está oculto dentro da classe, e no EA você só precisa registrar estas três strings:

         if(!m_symbol.Name(name)) // sets symbol name
           {
            m_file_txt.Close();
            return(INIT_FAILED);
           }

Não é supérfluo lembrar que todos os símbolos de um EA multimoeda devem ser adicionados à janela "Observação do mercado": Inclusão dos símbolos necessários na janela "Observação do mercado" para EAs multimoedas

Assim, o EA trabalha segundo o seguinte algoritmo: OnInit() abre um arquivo de texto, lê o símbolo e, imediatamente, tenta criar três indicadores personalizados (Custom Moving Average Inputs, Custom Bulls Power Inputs e Custom Bears Power Inputs) de acordo com o símbolo lido no timeframe atual. Se o código não puder ser criado (por exemplo, simplesmente não há barras suficientes para criar Custom Moving Average Inputs), simplesmente prosseguimos com um ciclo adicional. Se os indicadores foram criados, colocamos o nome do símbolo na matriz m_symbols_array e os identificadores dos três indicadores na matriz tridimensional m_handles_array. Assim, na primeira dimensão, as duas matrizes contêm, de forma síncrona, informações sobre o nome do símbolo e sobre os identificadores neste símbolo:

//---
   if(m_file_txt.Open(InpFileName,FILE_READ|FILE_COMMON)==INVALID_HANDLE)
     {
      PrintFormat("ERROR: \"%s\" file in the Data Folder Common folder is not open: %d",InpFileName,GetLastError());
      return(INIT_FAILED);
     }
//--- symbol info object OR file txt object
   if(InpInputSymbol==INPUT_SYMBOLS_FILE)
     {
      //--- read data from the file 
      int counter=0;
      while(!m_file_txt.IsEnding())
        {
         counter++;
         Print("Iteration ",counter);
         string name=m_file_txt.ReadString();
         if(!m_symbol.Name(name)) // sets symbol name
           {
            m_file_txt.Close();
            return(INIT_FAILED);
           }
         int MA,Bulls,Bears;
         if(!CreateHandles(name,Period(),MA,Bulls,Bears))
            continue; //return(INIT_FAILED);
         int size=ArraySize(m_symbols_array);
         ArrayResize(m_symbols_array,size+1,10);
         ArrayResize(m_handles_array,size+1,10);
         m_symbols_array[size]=name;
         m_handles_array[size][0]=MA;
         m_handles_array[size][1]=Bulls;
         m_handles_array[size][2]=Bears;
        }
      m_file_txt.Close();
     }
   else
     {
      if(!m_symbol.Name(Symbol())) // sets symbol name
         return(INIT_FAILED);
     }
//---
   ChartIndicatorAdd(0,0,handle_iCustom_MA);

Indicadores de identificador são criados em CreateHandles().

Assim, o consumo de memória foi medido através de TERMINAL_MEMORY_USED e estimado visualmente no gerenciador de tarefas do Windows 10. Para determinar o consumo de memória por passos, na versão 1.010, algumas strings foram desativadas (as strings foram comentadas). Na versão final 1.010, todas as strings para adicionar caracteres e criar indicadores não são comentadas.

  • Inicialização do EA da maneira usual: o EA é anexado ao gráfico:
    • inicio do terminal (símbolos do arquivo de texto ainda não foram adicionados à janela "Observação do mercado") — TERMINAL_MEMORY_USED 345 MB, Gerenciador de Tarefas de 26 a 90 MB;
    • adicionamos cerca de cem símbolos à janela "Observação do mercado" — TERMINAL_MEMORY_USED 433 MB, Gerenciador de Tarefas + 10 MB;
    • agora para cada símbolo criamos três indicadores — TERMINAL_MEMORY_USED 5523 MB, Gerenciador de Tarefas 300 MB.
  • Inicialização de teste (sem visualização) — TERMINAL_MEMORY_USED 420 MB e no Gerenciador de Tarefas 5 GB.


Conclusão: TERMINAL_MEMORY_USED mostra o consumo total de RAM e espaço em disco. Como o consumo de RAM no modo normal não excede 300 MB, não economizamos nada.


Definimos a tendência (MME)...

O objetivo principal do EA é definir a tendência (MME). É impossível definir a tendência numa só barra, pois são necessárias as informações de várias barras. Designamos "bars" a esse parâmetro. Os três gráficos de títulos são CAT, MCD e V. As designações das tendências são as seguintes: tendência de alta "+1", sem tendência "0" e tendência de baixa "—1"

Trend (EMA) is ...

No gráfico "CAT" tendência "0" (4 barras descendentes, 4 ascendentes, nas outras barras a mudança do indicador é escassa), no "MCD" tendência "—1" (8 barras descendentes, o resto num estado incerto) e no "V" tendência"0" (6 barras ascendentes, 2 ou 3 descendentes). Talvez deveria ser melhor inserir o parâmetro different — diferença mínima entre as leituras do indicador nas barras vizinhas. 


Definimos a tendência. Elder-Ray 1.020.mq5

Condições de tendência: a MME durante bars deve ser direcionada num só sentido. Provavelmente seja necessário verificar dois parâmetros adicionais: 

  • different — diferença mínima entre as leituras do indicador nas barras vizinhas;
  • trend percentage — porcentagem mínima de leituras do indicador numa direção (na figura: símbolo CAT - MME direcionada em vários sentidos no trecho bars, enquanto no símbolo MCD todas (ou quase todas) as leituras da MME direcionadas num só sentido).


Alterações na versão 1.020: 

  • não implementado o parâmetro different — diferença mínima entre as leituras do indicador nas barras vizinhas;
  • "—" enumeração enum ENUM_INPUT_SYMBOLS — foi decidido que o EA funcionará apenas com símbolo de um arquivo de texto;
  • "+" parâmetro number of bars for identifying the trend — número de barras para identificar a tendência com base na MME;
  • "+" parâmetro minimum percentage of the trend — cota mínima da tendência (unidirecionalidade);
  • "+" matriz m_prev_bars — matriz para armazenar o horário de abertura da barra anterior;
  • "+" temporizador 60 segundos — no temporizador é verificada se há uma nova barra.


Bloco para capturar novas barras e definir a direção da tendência

Na OnTimer(), a cada 60 segundos iteramos a matriz de símbolos (m_symbols_array), carregada do arquivo de texto, e capturamos a nova barra no símbolo da matriz. Obtemos na matriz ema_array os dados do indicador MME, suficientes para determinar a tendência. Calculamos quantas barras o indicador subiu e quantas — caiu. Imprimimos os padrões encontrados.

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   int size=ArraySize(m_symbols_array);
   for(int i=0;i<size;i++)
     {
      //--- we work only at the time of the birth of new bar
      datetime PrevBars=m_prev_bars[i];
      datetime time_0=iTime(m_symbols_array[i],Period(),0);
      if(time_0==PrevBars)
         continue;
      m_prev_bars[i]=time_0;
      double ema_array[];
      ArraySetAsSeries(ema_array,true);
/*
      m_handles_array[*][MA][Bulls][Bears]
*/
      if(!iMAGetArray(m_handles_array[i][0],0,InpBarsEMA+2,ema_array))
         continue;
      int upwards=0;
      int downward=0;
      for(int j=1;j<InpBarsEMA+1;j++)
        {
         if(ema_array[j]>ema_array[j+1])
            upwards++;
         else if(ema_array[j]<ema_array[j+1])
            downward++;
        }
      if((double)upwards>InpBarsEMA*InpMinTrendPercentage/100.0)
         Print("On ",m_symbols_array[i]," trend UP!");
      else if((double)downward>InpBarsEMA*InpMinTrendPercentage/100.0)
         Print("On ",m_symbols_array[i]," trend DOWN!");
      else
         Print("On ",m_symbols_array[i]," trend NONE!");
     }
  }

Resultado da definição de tendência. Configurações: number of bars for identifying the trend — 6, minimum percentage of the trend — 75%. Lembramo-nos de que, se trabalharmos ao surgir uma nova barra, a barra zero não será levada em conta:

Trend on symbols


Trend on symbols


Colocamos ordens pendentes (Buy stop ou Sell stop). Elder-Ray 1.030.mq5

Como contornar o erro de falta de fundos ao abrir uma posição? Como estamos trabalhando com ordens pendentes, a resposta é: "isso é impossível!" Podem haver soluções incompletas, a principal razão é que ninguém sabe quando a ordem pendente será desencadeada.

Assim, o EA parece ter aprendido a definir a tendência, agora é necessário, usando as Regras de compra e as Regras de venda, encontrar os pontos em que é possível colocar uma ordem pendente. Para abrir BUY, haverá uma verificação simples: o valor do indicador Bears Power na barra #1 deve ser menor do que zero e maior do que o valor do Bears Power na barra #2. Para abrir BUY, a condição de espelhada: o valor do indicador Bears Power na barra #1 deve ser maior do que zero e menor do que o valor do Bears Power na barra #2.

Ao descrever a estratégia, Alexander Elder diz que para abrir uma posição BUY "(...) coloque um stop de proteção abaixo da mínima mais recente (...)", enquanto para abrir uma posição SELL "(...) coloque um stop de proteção acima da máxima mais recente (...)". Assim, o próprio conceito de “mais recente” acaba sendo confuso - verifiquei duas opções:

  1. coloquei stop-loss nos preços da barra #1 e
  2. procurei o extremo mais recente.

O tipo 1 não era viável, pois muitas vezes foi desencadeado o stop-loss, portanto, no código do EA Elder-Ray 1.030.mq5 fixei a atenção no tipo 2: busca do extremo mais próximo.


Busca do extremo mais recente

A função procura o extremo mais recente:

Nearest extremum

Se o extremo não for encontrado ou for encontrado um erro, será retornado false:

//+------------------------------------------------------------------+
//| Find the nearest extremum                                        |
//+------------------------------------------------------------------+
bool NearestExtremum(ENUM_SERIESMODE type,double &price)
  {
   if(type==MODE_LOW)
     {
      //--- search for the nearest minimum
      double low_array[];
      ArraySetAsSeries(low_array,true);
      int copy=CopyLow(m_symbol.Name(),Period(),0,100,low_array);
      if(copy==-1)
         return(false);
      double low=DBL_MAX;
      for(int k=0;k<copy;k++)
        {
         if(low_array[k]<low)
            low=low_array[k];
         else if(low_array[k]>low)
            break;
        }
      if(low!=DBL_MAX)
        {
         price=low;
         return(true);
        }
     }
   else if(type==MODE_HIGH)
     {
      //--- search for the nearest maximum
      double high_array[];
      ArraySetAsSeries(high_array,true);
      int copy=CopyHigh(m_symbol.Name(),Period(),0,100,high_array);
      if(copy==-1)
         return(false);
      double high=DBL_MIN;
      for(int k=0;k<copy;k++)
        {
         if(high_array[k]>high)
            high=high_array[k];
         else if(high_array[k]<high)
            break;
        }
      if(high!=DBL_MIN)
        {
         price=high;
         return(true);
        }
     }
//---
   return(false);
  }


Alterações na versão 1.030: 

  • "+" classe de negociação CPositionInfo (e m_position - objeto dessa classe);
  • "+" classe de negociação CTrade (e m_trade - objeto dessa classe);
  • "+" classe de negociação COrderInfo (e m_order - objeto dessa classe);
  • "+" trailing (parâmetro Trailing Stop e Trailing Step);
  • "+" magic number — identificador exclusivo do EA;
  • "+" OnInit() — verificação de tipo de conta: se for de compensação - proibir a negociação e exibir um erro;
  • OnInit() — alterada ordem de visualização: se inicializado o testador de estratégia e o símbolo atual (símbolo no qual o EA está sendo executado) estiver no arquivo de texto, não adicionaremos indicadores ao símbolo atual (não implementamos ChartIndicatorAdd);
  • OnTimer() — adicionado o código de confirmação de sinal e as operações de negociação para posicionar ordens pendentes Buy Stop e Sell Stop;
  • OnTradeTransaction() — adicionamos o mecanismo de compensação, se houve uma reversão da posição ou um fechamento parcial;
  • "+" quando se desencadeia o Algoritmo de compensação, NÃO SE COLOCA stop-loss em OnTradeTransaction(), ao invés disso é atualizada a função trailing: se a posição sem stop-loss for encontrada durante a pesquisa detalhada de posições, o stop-loss será definido de acordo com a regra de busca do extremo mais recente;
  • "+" adicionada a variável m_magic_compensation — identificador de transações de compensação.

Para lidar com situações em que é acionada uma ordem pendente oposta à posição atual, é necessário considerar três situações típicas após a ordem pendente Buy Stop se desencadear:

№ Posição existente, volumeDesencadeada ordem pendente, volumePosição resultante, volumeNota para o momento de desencadear uma ordem pendentemagic da posição Algoritmo de compensação (importante: antes da compensação, magic é definido em m_magic_compensation)magic final da posição
 1 Sell 1.0 Buy Stop 3.0 Buy 2.0Reversão da posição (direção da transação DEAL_ENTRY_INOUT) m_magicAdicionalmente, abrir Buy com volume de 3.0 — 2.0 = 1.0 m_magic_compensation
 2 Sell 1.0 Buy Stop 1.0 ---Fechamento total da posição (direção da transação DEAL_ENTRY_OUT) m_magicBusca da posição. Se não houver posição, abrir Buy com volume de 1.0 m_magic_compensation
 3 Sell 2.0 Buy Stop 1.0 Sell 1.0Fechamento parcial da posição (direção da transação DEAL_ENTRY_OUT) m_magicBusca da posição. Se houver uma posição e for oposta à Buy, abrir Buy com volume de 1.0 + 1.0 = 2.0 m_magic_compensation

Para cada um dos três casos, preparei uma lista de transações e ordens (teste numa conta de compensação real usando o testador). Para gerar o relatório sobre transações e ordens, usei o código do script History Deals and Orders.

#1: Sell 1.0 -> Buy Stop 3.0

Sell 1.0, Buy Stop 3.0

Deal:
|Ticket              |Order               |Time                |Time msc            |Type                |Entry               |Magic               |Reason              |Position ID        
|1                   |0                   |2016.12.08 00:00:00 |1481155200000       |DEAL_TYPE_BALANCE   |DEAL_ENTRY_IN       |0                   |DEAL_REASON_CLIENT  |0                  
|Volume              |Price               |Commission          |Swap                |Profit              |Symbol              |Comment                                  |External ID        
|0.00                |0.00000             |0.00                |0.00                |50000.00            |                    |                                         |                   
Order 0 is not found in the trade history between the dates 2010.08.07 11:06:20 and 2018.08.10 00:00:00

Deal:
|Ticket              |Order               |Time                |Time msc            |Type                |Entry               |Magic               |Reason              |Position ID        
|2                   |2                   |2016.12.08 00:00:00 |1481155200100       |DEAL_TYPE_SELL      |DEAL_ENTRY_IN       |15489               |DEAL_REASON_EXPERT  |2                  
|Volume              |Price               |Commission          |Swap                |Profit              |Symbol              |Comment                                  |External ID        
|1.00                |79.31               |0.00                |0.00                |0.00                |V                   |                                         |                   
Order:
|Ticket              |Time setup          |Type                |State               |Time expiration     |Time done           |Time setup msc      |Time done msc       |Type filling       
|2                   |2016.12.08 00:00:00 |ORDER_TYPE_SELL     |ORDER_STATE_FILLED  |2016.12.08 00:00:00 |2016.12.08 00:00:00 |1481155200100       |1481155200100       |ORDER_FILLING_FOK  
|Type time           |Magic               |Reason              |Position id         |Position by id     
|1970.01.01 00:00:00 |15489               |ORDER_REASON_EXPERT |2                   |0                  
|Volume initial      |Volume current      |Open price          |sl                  |tp                  |Price current       |Price stoplimit    
|1.00                |0.00                |79.31               |0.00                |0.00                |79.39               |0.00               
|Symbol              |Comment                                  |Extarnal id        
|V                   |                                         |                   

Deal:
|Ticket              |Order               |Time                |Time msc            |Type                |Entry               |Magic               |Reason              |Position ID        
|3                   |3                   |2016.12.08 17:27:37 |1481218057877       |DEAL_TYPE_BUY       |DEAL_ENTRY_INOUT    |15489               |DEAL_REASON_EXPERT  |2                  
|Volume              |Price               |Commission          |Swap                |Profit              |Symbol              |Comment                                  |External ID        
|3.00                |79.75               |0.00                |0.00                |-0.44               |V                   |                                         |                   
Order:
|Ticket              |Time setup          |Type                |State               |Time expiration     |Time done           |Time setup msc      |Time done msc       |Type filling       
|3                   |2016.12.08 14:30:00 |ORDER_TYPE_BUY_STOP |ORDER_STATE_FILLED  |2016.12.08 14:30:00 |2016.12.08 17:27:37 |1481207400100       |1481218057877       |ORDER_FILLING_RETURN
|Type time           |Magic               |Reason              |Position id         |Position by id     
|1970.01.01 00:00:00 |15489               |ORDER_REASON_EXPERT |2                   |0                  
|Volume initial      |Volume current      |Open price          |sl                  |tp                  |Price current       |Price stoplimit    
|3.00                |0.00                |79.74               |75.17               |0.00                |79.74               |0.00               
|Symbol              |Comment                                  |Extarnal id        
|V                   |                                         |                   

Deal:
|Ticket              |Order               |Time                |Time msc            |Type                |Entry               |Magic               |Reason              |Position ID        
|4                   |4                   |2016.12.09 23:59:00 |1481327940000       |DEAL_TYPE_SELL      |DEAL_ENTRY_OUT      |0                   |DEAL_REASON_CLIENT  |2                  
|Volume              |Price               |Commission          |Swap                |Profit              |Symbol              |Comment                                  |External ID        
|2.00                |79.13               |0.00                |0.00                |-1.24               |V                   |end of test                              |                   
Order:
|Ticket              |Time setup          |Type                |State               |Time expiration     |Time done           |Time setup msc      |Time done msc       |Type filling       
|4                   |2016.12.09 23:59:00 |ORDER_TYPE_SELL     |ORDER_STATE_FILLED  |2016.12.09 23:59:00 |2016.12.09 23:59:00 |1481327940000       |1481327940000       |ORDER_FILLING_FOK  
|Type time           |Magic               |Reason              |Position id         |Position by id     
|1970.01.01 00:00:00 |0                   |ORDER_REASON_CLIENT |2                   |0                  
|Volume initial      |Volume current      |Open price          |sl                  |tp                  |Price current       |Price stoplimit    
|2.00                |0.00                |79.13               |0.00                |0.00                |79.13               |0.00               
|Symbol              |Comment                                  |Extarnal id        
|V                   |end of test                              |                   


#2: Sell 1.0 -> Buy Stop 1.0

Sell 1.0, Buy Stop 1.0

Deal:
|Ticket              |Order               |Time                |Time msc            |Type                |Entry               |Magic               |Reason              |Position ID        
|1                   |0                   |2016.12.08 00:00:00 |1481155200000       |DEAL_TYPE_BALANCE   |DEAL_ENTRY_IN       |0                   |DEAL_REASON_CLIENT  |0                  
|Volume              |Price               |Commission          |Swap                |Profit              |Symbol              |Comment                                  |External ID        
|0.00                |0.00000             |0.00                |0.00                |50000.00            |                    |                                         |                   
Order 0 is not found in the trade history between the dates 2010.08.07 11:06:20 and 2018.08.10 00:00:00

Deal:
|Ticket              |Order               |Time                |Time msc            |Type                |Entry               |Magic               |Reason              |Position ID        
|2                   |2                   |2016.12.08 00:00:00 |1481155200100       |DEAL_TYPE_SELL      |DEAL_ENTRY_IN       |15489               |DEAL_REASON_EXPERT  |2                  
|Volume              |Price               |Commission          |Swap                |Profit              |Symbol              |Comment                                  |External ID        
|1.00                |79.31               |0.00                |0.00                |0.00                |V                   |                                         |                   
Order:
|Ticket              |Time setup          |Type                |State               |Time expiration     |Time done           |Time setup msc      |Time done msc       |Type filling       
|2                   |2016.12.08 00:00:00 |ORDER_TYPE_SELL     |ORDER_STATE_FILLED  |2016.12.08 00:00:00 |2016.12.08 00:00:00 |1481155200100       |1481155200100       |ORDER_FILLING_FOK  
|Type time           |Magic               |Reason              |Position id         |Position by id     
|1970.01.01 00:00:00 |15489               |ORDER_REASON_EXPERT |2                   |0                  
|Volume initial      |Volume current      |Open price          |sl                  |tp                  |Price current       |Price stoplimit    
|1.00                |0.00                |79.31               |0.00                |0.00                |79.39               |0.00               
|Symbol              |Comment                                  |Extarnal id        
|V                   |                                         |                   

Deal:
|Ticket              |Order               |Time                |Time msc            |Type                |Entry               |Magic               |Reason              |Position ID        
|3                   |3                   |2016.12.08 17:27:37 |1481218057877       |DEAL_TYPE_BUY       |DEAL_ENTRY_OUT      |15489               |DEAL_REASON_EXPERT  |2                  
|Volume              |Price               |Commission          |Swap                |Profit              |Symbol              |Comment                                  |External ID        
|1.00                |79.75               |0.00                |0.00                |-0.44               |V                   |                                         |                   
Order:
|Ticket              |Time setup          |Type                |State               |Time expiration     |Time done           |Time setup msc      |Time done msc       |Type filling       
|3                   |2016.12.08 14:30:00 |ORDER_TYPE_BUY_STOP |ORDER_STATE_FILLED  |2016.12.08 14:30:00 |2016.12.08 17:27:37 |1481207400100       |1481218057877       |ORDER_FILLING_RETURN
|Type time           |Magic               |Reason              |Position id         |Position by id     
|1970.01.01 00:00:00 |15489               |ORDER_REASON_EXPERT |2                   |0                  
|Volume initial      |Volume current      |Open price          |sl                  |tp                  |Price current       |Price stoplimit    
|1.00                |0.00                |79.74               |75.17               |0.00                |79.74               |0.00               
|Symbol              |Comment                                  |Extarnal id        
|V                   |                                         |                   



#3: Sell 2.0 -> Buy Stop 1.0

Sell 2.0, Buy Stop 1.0

Deal:
|Ticket              |Order               |Time                |Time msc            |Type                |Entry               |Magic               |Reason              |Position ID        
|1                   |0                   |2016.12.08 00:00:00 |1481155200000       |DEAL_TYPE_BALANCE   |DEAL_ENTRY_IN       |0                   |DEAL_REASON_CLIENT  |0                  
|Volume              |Price               |Commission          |Swap                |Profit              |Symbol              |Comment                                  |External ID        
|0.00                |0.00000             |0.00                |0.00                |50000.00            |                    |                                         |                   
Order 0 is not found in the trade history between the dates 2010.08.07 11:06:20 and 2018.08.10 00:00:00

Deal:
|Ticket              |Order               |Time                |Time msc            |Type                |Entry               |Magic               |Reason              |Position ID        
|2                   |2                   |2016.12.08 00:00:00 |1481155200100       |DEAL_TYPE_SELL      |DEAL_ENTRY_IN       |15489               |DEAL_REASON_EXPERT  |2                  
|Volume              |Price               |Commission          |Swap                |Profit              |Symbol              |Comment                                  |External ID        
|2.00                |79.31               |0.00                |0.00                |0.00                |V                   |                                         |                   
Order:
|Ticket              |Time setup          |Type                |State               |Time expiration     |Time done           |Time setup msc      |Time done msc       |Type filling       
|2                   |2016.12.08 00:00:00 |ORDER_TYPE_SELL     |ORDER_STATE_FILLED  |2016.12.08 00:00:00 |2016.12.08 00:00:00 |1481155200100       |1481155200100       |ORDER_FILLING_FOK  
|Type time           |Magic               |Reason              |Position id         |Position by id     
|1970.01.01 00:00:00 |15489               |ORDER_REASON_EXPERT |2                   |0                  
|Volume initial      |Volume current      |Open price          |sl                  |tp                  |Price current       |Price stoplimit    
|2.00                |0.00                |79.31               |0.00                |0.00                |79.39               |0.00               
|Symbol              |Comment                                  |Extarnal id        
|V                   |                                         |                   

Deal:
|Ticket              |Order               |Time                |Time msc            |Type                |Entry               |Magic               |Reason              |Position ID        
|3                   |3                   |2016.12.08 17:27:37 |1481218057877       |DEAL_TYPE_BUY       |DEAL_ENTRY_OUT      |15489               |DEAL_REASON_EXPERT  |2                  
|Volume              |Price               |Commission          |Swap                |Profit              |Symbol              |Comment                                  |External ID        
|1.00                |79.75               |0.00                |0.00                |-0.44               |V                   |                                         |                   
Order:
|Ticket              |Time setup          |Type                |State               |Time expiration     |Time done           |Time setup msc      |Time done msc       |Type filling       
|3                   |2016.12.08 14:30:00 |ORDER_TYPE_BUY_STOP |ORDER_STATE_FILLED  |2016.12.08 14:30:00 |2016.12.08 17:27:37 |1481207400100       |1481218057877       |ORDER_FILLING_RETURN
|Type time           |Magic               |Reason              |Position id         |Position by id     
|1970.01.01 00:00:00 |15489               |ORDER_REASON_EXPERT |2                   |0                  
|Volume initial      |Volume current      |Open price          |sl                  |tp                  |Price current       |Price stoplimit    
|1.00                |0.00                |79.74               |75.17               |0.00                |79.74               |0.00               
|Symbol              |Comment                                  |Extarnal id        
|V                   |                                         |                   

Deal:
|Ticket              |Order               |Time                |Time msc            |Type                |Entry               |Magic               |Reason              |Position ID        
|4                   |4                   |2016.12.09 23:59:00 |1481327940000       |DEAL_TYPE_BUY       |DEAL_ENTRY_OUT      |0                   |DEAL_REASON_CLIENT  |2                  
|Volume              |Price               |Commission          |Swap                |Profit              |Symbol              |Comment                                  |External ID        
|1.00                |79.13               |0.00                |0.00                |0.18                |V                   |end of test                              |                   
Order:
|Ticket              |Time setup          |Type                |State               |Time expiration     |Time done           |Time setup msc      |Time done msc       |Type filling       
|4                   |2016.12.09 23:59:00 |ORDER_TYPE_BUY      |ORDER_STATE_FILLED  |2016.12.09 23:59:00 |2016.12.09 23:59:00 |1481327940000       |1481327940000       |ORDER_FILLING_FOK  
|Type time           |Magic               |Reason              |Position id         |Position by id     
|1970.01.01 00:00:00 |0                   |ORDER_REASON_CLIENT |2                   |0                  
|Volume initial      |Volume current      |Open price          |sl                  |tp                  |Price current       |Price stoplimit    
|1.00                |0.00                |79.13               |0.00                |0.00                |79.13               |0.00               
|Symbol              |Comment                                  |Extarnal id        
|V                   |end of test                              |                   



Existe mais uma situação numa conta real e em tempo real (não no testador): segundo mercado Buy com volume de 2.0 (abertura de Buy bateu duas transações com volumes de 1.0 — 20087494 e 20087495), em seguida, foi colocado Sell limit com volume de 2.0 para fixação do lucro e fechamento de posições. Um pouco mais tarde, esse Sell limit foi concluído em duas entradas (transações 20088091 e 20088145). Registros:

Buy 2.0, Sell limit 2.0 

Deal:
|Ticket              |Order               |Time                |Time msc            |Type                |Entry               |Magic               |Reason              |Position ID        
|20087494            |29080489            |2018.08.10 07:23:34 |1533885814000       |DEAL_TYPE_BUY       |DEAL_ENTRY_IN       |0                   |DEAL_REASON_CLIENT  |29080489           
|Volume              |Price               |Commission          |Swap                |Profit              |Symbol              |Comment                                  |External ID        
|1.00                |14595               |-0.10               |0.00                |0.00                |RTSGZU8             |                                         |                   
Order:
|Ticket              |Time setup          |Type                |State               |Time expiration     |Time done           |Time setup msc      |Time done msc       |Type filling       
|29080489            |2018.08.10 07:23:34 |ORDER_TYPE_BUY      |ORDER_STATE_FILLED  |2018.08.10 07:23:34 |2018.08.10 07:23:34 |1533885814000       |1533885814000       |ORDER_FILLING_RETURN
|Type time           |Magic               |Reason              |Position id         |Position by id     
|1970.01.01 00:00:00 |0                   |ORDER_REASON_CLIENT |29080489            |0                  
|Volume initial      |Volume current      |Open price          |sl                  |tp                  |Price current       |Price stoplimit    
|2.00                |0.00                |0                   |0                   |0                   |14588               |0                  
|Symbol              |Comment                                  |External id        
|RTSGZU8             |                                         |13_31861873584     

Deal:
|Ticket              |Order               |Time                |Time msc            |Type                |Entry               |Magic               |Reason              |Position ID        
|20087495            |29080489            |2018.08.10 07:23:34 |1533885814000       |DEAL_TYPE_BUY       |DEAL_ENTRY_IN       |0                   |DEAL_REASON_CLIENT  |29080489           
|Volume              |Price               |Commission          |Swap                |Profit              |Symbol              |Comment                                  |External ID        
|1.00                |14595               |-0.10               |0.00                |0.00                |RTSGZU8             |                                         |                   
Order:
|Ticket              |Time setup          |Type                |State               |Time expiration     |Time done           |Time setup msc      |Time done msc       |Type filling       
|29080489            |2018.08.10 07:23:34 |ORDER_TYPE_BUY      |ORDER_STATE_FILLED  |2018.08.10 07:23:34 |2018.08.10 07:23:34 |1533885814000       |1533885814000       |ORDER_FILLING_RETURN
|Type time           |Magic               |Reason              |Position id         |Position by id     
|1970.01.01 00:00:00 |0                   |ORDER_REASON_CLIENT |29080489            |0                  
|Volume initial      |Volume current      |Open price          |sl                  |tp                  |Price current       |Price stoplimit    
|2.00                |0.00                |0                   |0                   |0                   |14588               |0                  
|Symbol              |Comment                                  |External id        
|RTSGZU8             |                                         |13_31861873584     

Deal:
|Ticket              |Order               |Time                |Time msc            |Type                |Entry               |Magic               |Reason              |Position ID        
|20088091            |29080662            |2018.08.10 08:03:08 |1533888188000       |DEAL_TYPE_SELL      |DEAL_ENTRY_OUT      |0                   |DEAL_REASON_CLIENT  |29080489           
|Volume              |Price               |Commission          |Swap                |Profit              |Symbol              |Comment                                  |External ID        
|1.00                |14626               |-0.10               |0.00                |0.46                |RTSGZU8             |                                         |                   
Order:
|Ticket              |Time setup          |Type                |State               |Time expiration     |Time done           |Time setup msc      |Time done msc       |Type filling       
|29080662            |2018.08.10 07:27:19 |ORDER_TYPE_SELL_LIMIT |ORDER_STATE_FILLED  |2018.08.10 07:27:19 |2018.08.10 08:05:42 |1533886039000       |1533888342000       |ORDER_FILLING_RETURN
|Type time           |Magic               |Reason              |Position id         |Position by id     
|1970.01.01 00:00:00 |0                   |ORDER_REASON_CLIENT |29080489            |0                  
|Volume initial      |Volume current      |Open price          |sl                  |tp                  |Price current       |Price stoplimit    
|2.00                |0.00                |14626               |0                   |0                   |14624               |0                  
|Symbol              |Comment                                  |External id        
|RTSGZU8             |                                         |13_31862155871     

Deal:
|Ticket              |Order               |Time                |Time msc            |Type                |Entry               |Magic               |Reason              |Position ID        
|20088145            |29080662            |2018.08.10 08:05:42 |1533888342000       |DEAL_TYPE_SELL      |DEAL_ENTRY_OUT      |0                   |DEAL_REASON_CLIENT  |29080489           
|Volume              |Price               |Commission          |Swap                |Profit              |Symbol              |Comment                                  |External ID        
|1.00                |14626               |-0.10               |0.00                |0.46                |RTSGZU8             |                                         |                   
Order:
|Ticket              |Time setup          |Type                |State               |Time expiration     |Time done           |Time setup msc      |Time done msc       |Type filling       
|29080662            |2018.08.10 07:27:19 |ORDER_TYPE_SELL_LIMIT |ORDER_STATE_FILLED  |2018.08.10 07:27:19 |2018.08.10 08:05:42 |1533886039000       |1533888342000       |ORDER_FILLING_RETURN
|Type time           |Magic               |Reason              |Position id         |Position by id     
|1970.01.01 00:00:00 |0                   |ORDER_REASON_CLIENT |29080489            |0                  
|Volume initial      |Volume current      |Open price          |sl                  |tp                  |Price current       |Price stoplimit    
|2.00                |0.00                |14626               |0                   |0                   |14624               |0                  
|Symbol              |Comment                                  |External id        
|RTSGZU8             |                                         |13_31862155871     



Dicas para o teste 1.xxx

  • Tente deixar títulos com aproximadamente o mesmo valor no arquivo de texto.
  • Ao testar num arquivo de texto, é melhor deixar um pequeno número de símbolos. Caso ideal: deixe um símbolo e realize um teste nele.


Tipo 2: em conjunto com o sistema "Seleção tripla"

No Tipo 1 (todos os indicadores num gráfico) o indicador de tendência estava no mesmo timeframe. No tipo 2, o indicador de tendência está num timeframe maior. Assim, é adicionado apenas um novo parâmetro — timeframe de tendência (Trend timeframe).

O tipo 2 é implementado no EA Elder-Ray 2.000.mq5.


Arquivos anexados ao artigo:

NomeTipo de arquivoDescrição
Symbols on the specified path.mq5ScriptGera um arquivo de texto com símbolos desse grupo, ele é salvo em Commom Data Folder
Gets minimal volume.mq5ScriptExibe estatísticas sobre o tamanho mínimo desse grupo.
Elder-Ray 1.001.mq5Expert AdvisorMostra os indicadores usados.
Elder-Ray 1.010.mq5Expert AdvisorComeçamos a trabalhar com o arquivo de texto e criamos indicadores por símbolos a partir de um arquivo. O EA é usado para monitorar o consumo de memória.
Elder-Ray 1.020.mq5Expert AdvisorDeterminamos e verificamos a tendência.
Elder-Ray 1.030.mq5Expert AdvisorVersão de trabalho baseada no Tipo 1: todos os indicadores num gráfico
Elder-Ray 2.000.mq5Expert AdvisorTipo 2: em conjunto com o sistema "Seleção tripla"


Fim do artigo

O sistema de negociação Raio Elder (Bulls Power e Bears Power) merece continuar vivendo, especialmente em combinação com o sistema "Seleção tripla", quando o indicador de tendência (MME) é calculado num timeframe maior em relação aos indicadores Bulls Power (índice Poder dos Touros) e Bears Power (índice Poder dos Ursos).

Ao testar o EA, no arquivo de texto preparado pode haver até 100 símbolos, nesse caso, a inicialização do teste pode tardar até 10 minutos e usar 5 GB de memória. 

Embora o EA seja confiável, existe a vontade de querer manipular o processo com nossas mãos. Por exemplo, enquanto o artigo era escrito e testadas as versões do EAs, eu fiz:

CAT and V manual

Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/5014

Reversão: o Santo Graal ou um equívoco perigoso? Reversão: o Santo Graal ou um equívoco perigoso?
Neste artigo, tentaremos entender, além do conceito de reversão, se vale a pena implementá-la para melhorar nossas estratégias de negociação. Após criarmos um Expert Advisor, usaremos dados históricos a fim de não só ver quais indicadores são mais indicados para reversão, mas também saber se é possível utilizar o EA sem indicadores como um sistema de negociação independente. Consideraremos se é possível converter um sistema de negociação desfavorável num lucrativo com a ajuda de reversões.
Combinando uma estratégia de tendência com outra de fase de correção Combinando uma estratégia de tendência com outra de fase de correção
Existem diversas estratégias de negociação - algumas procuram movimentos direcionais e operam com a tendência, já outras identificam faixas de preço e negociam dentro desses corredores. Neste ponto, surge a pergunta: é possível combinar as duas abordagens para aumentar a rentabilidade da negociação?
Modelando séries temporais usando símbolos personalizados de acordo com as leis de distribuição especificadas Modelando séries temporais usando símbolos personalizados de acordo com as leis de distribuição especificadas
O artigo fornece uma visão geral das capacidades do terminal para criar e trabalhar com símbolos personalizados, oferece opções para modelar um histórico de negociação usando símbolos personalizados, tendências e vários padrões gráficos.
Gráfico PairPlot baseado em CGraphic para analisar correlações entre arrays de dados (séries temporais) Gráfico PairPlot baseado em CGraphic para analisar correlações entre arrays de dados (séries temporais)
Comparar várias séries temporais durante uma análise técnica é uma tarefa bastante comum que requer ferramentas apropriadas. Neste artigo, eu sugiro o desenvolvimento de uma ferramenta para análise gráfica e a detecção de correlações entre duas ou mais séries temporais.