English Русский 中文 Español Deutsch 日本語 한국어 Français Italiano Türkçe
Expert Advisor baseado em "New Trading Dimensions" por Bill Williams

Expert Advisor baseado em "New Trading Dimensions" por Bill Williams

MetaTrader 5Sistemas de negociação | 26 dezembro 2013, 15:58
3 039 1
Alexey Klenov
Alexey Klenov

Introdução

Nesse artigo discutiremos o desenvolvimento de um Expert Advisor de negociação, baseado no livro New Trading Dimensions: How to Profit from Chaos in Stocks, Bonds, and Commodities por B. Williams para a plataforma MetaTrader 5 na linguagem MQL5. A estratégia em si é bem conhecida e seu uso ainda é controverso entre os negociadores.

Ele atrai recém-chegados com seu estudo pronto de sinais que são "quase completamente" privados de um lado subjetivo, em contraste a, por exemplo, interpretação da teoria das ondas de Elliot. Mas isso é apenas a primeira vista, em alguns locais as decisões ainda deverão ser feitas pelo negociante. E isso será discutido mais adiante no artigo.

Os objetivos desse artigo:
  • Para desenvolver, utilizando o paradigma OOP (programação orientada a objetos), uma classe de CE, que implementa negociação, baseada na estratégia de B. Williams. Nós podemos chamá-lo de C_TS_BW;
  • Na nova classe C_TS_BW quando possível, utilize os códigos prontos para o uso da biblioteca padrão.
  • Escreva um CE, que utilize a classe C_TS_BW;
  • Teste o CE desenvolvido no verificador de estratégia em diversos instrumentos Forex e CFD;
  • Finalmente, confirmar ou refutar a aptidão dessa estratégia nas condições atuais do mercado.


1. Indicadores

Na base do sistema de negociação há sinais de 4 indicadores:

  1. Alligator (jacaré);
  2. Fractais;
  3. Oscilador maravilhoso;
  4. Aceleração/desaceleração.

1.1. Alligator

O indicador técnico Alligator é uma combinação das linhas de balanço (médias móveis), que utilizam geometria fractal e dinâmica não linear.

  • A linha azul (a mandíbula do Alligator) - é a linha de balanço para o período de tempo que foi utilizado para construir um gráfico (uma média móvel suavizada de 13 períodos, alterado por 8 barras para o futuro);
  • A linha vermelha (os dentes do Alligator) - é a linha de balanço para o período de tempo significante, mais baixo por uma ordem (uma média móvel suavizada de 8 períodos, alterado por 5 barras para o futuro);
  • A linha verde (os lábios do Alligator) - é a linha de balanço para o período de tempo significante, mais baixo por uma ordem (uma média móvel suavizada de 5 períodos, alterado por 3 barras para o futuro).

Os lábios, dentes e mandíbula do Aligattor ilustram a interação dos diferentes períodos de tempo. Uma vez que as tendências do mercado podem ser identificadas apenar em 15-30 por centro das vezes, nós devemos seguir as tendências, e não trabalhar em mercados que flutuam apena dentro de certos períodos de preço.

Quando as mandíbulas, dentes e lábios estão fechados ou entrelaçados, o Alligator irá dormir ou já estará dormindo. Quando ele dorme, sua fome cresce - então quanto mais ele dormir, com mais fome ele acordará. Quando ele acordar, a primeira coisa que fará é abrir a boca e começar a bocejar. Então ele começa a sentir o cheiro da comida: a carne de um touro ou urso, e começa a caçar ela. Quando o Alligator satisfaz a sua fome, ele começa a perder interesse no alimento-preço (as linhas de balanço se unem) - esse é o momento de fixar o lucro.

1.2. Fractais

Todos os mercados são caracterizados pelo fato de que, na maioria do tempo, os preços não flutuam muito, e apenas por um curto período de tempo (15-30 por cento) mudanças na tendência podem ser vistas. Os períodos mais favoráveis para a extração de lucro são quando os preços do mercado mudam de acordo com uma certa tendência.

Fractais (Fractais) - é um dos 4 indicadores do sistema de negociação de Bill Williams, que permite detectar o fundo e o topo. A definição técnica de um fractal em ascensão é uma série de ao menos cinco barras sucessivas, nas quais existem duas barras, antes e depois do maior máximo, que possuem máximos mais baixos. A configuração oposta (série de cinco barras, na qual antes e depois do mínimo mais baixo existem duas barras com mínimos mais altos) é um fractal em decadência. Em um gráfico os fractais possuem valores de alto e baixo, e são indicados por setas em ascensão ou decadência.

Os sinais do indicador técnico Fractais precisam ser filtrados, utilizando o indicador técnico Alligator. Em outras palavras, nós não devemos concluir um acordo para comprar se um fractal está localizado abaixo dos dentes do Alligator, e nós não deveríamos concluir um acordo para vender se um fractal está localizado acima dos dentes do Alligator. Após o sinal do fractal ser formado e estiver com força, o que é determinado por sua posição além das mandíbulas do Alligator, ele permanece um sinal até que é alcançado, ou até o aparecimento de um sinal de fractal mais recente.

1.3. O OM (Oscilador Maravilhoso)

O indicador técnico Oscilador Maravilhoso por Bill Williams (Awesome Oscillator, AO) - é uma média móvel simples de 34 períodos, construída pelos pontos médios das barras (H + L)/2, que é subtraída da média móvel simples de 5 períodos, que é construída pelos pontos centrais das barras (H + L)/2. Ele nos deixa saber o que está acontecendo no momento atual com a força motriz do mercado.

1.4. AO (oscilador acelerador)

O preço é o último elemento que muda. Antes de o preço mudar, a força motriz do mercado muda, e antes de a força motriz mudar sua direção, a aceleração da força motriz deve diminuir e alcançar zero. Então ela começa a acelerar até que o preço comece a mudar de direção.

O indicador técnico aceleração/desaceleração (Accelerator/Decelerator Oscillator, AC) mede a aceleração e desaceleração da força motriz atual. Esse indicador mudará de direção antes que a mudança na forma motriz ocorra, e ele, por sua vez, modificará sua direção antes que a mudança nos preços ocorra. Entendendo que o AC é um sinal de aviso precoce, possui vantagens óbvias.


2. Sinais

O sistema de negociação, descrito no livro "New Trading Dimensions" por B. Williams, utiliza sinais de cinco dimensões de negociação.

  • A primeira dimensão: superar o fractal além das mandíbulas do Alligator;
  • A segunda dimensão: os sinais do indicador OM (oscilador maravilhoso);
  • A terceira dimensão: os sinais do indicador AC (oscilador acelerador);
  • A quarta dimensão: negociação nas zonas;
  • A quinta dimensão: negociação da linha de balanço.

Mais sobre os sinais de cada dimensão.


2.1. Descrição de negociação por sinais da primeira dimensão

O fractal "A" (sinal de compra) é falso, porque a quebra do preço ocorre abaixo da linha da mandíbula do Alligator. O fractal "B" é executado e nós abrimos uma posição vendida. Com o aparecer do fractal "C", nós fechamos a nossa posição vendida, e já possuímos uma posição de compra.

Com a quebra do fractal "D", nós mudamos novamente a posição de compra para venda. Superando o fractal "E" para comprar, o mercado mais uma vez nos diz que a posição precisa ser modificada de venda pra compra. Com a execução dos sinais dos fractais "G" e "J", nós adicionamos mais um contrato para a posição de compra.

Figura 1. Um exemplo de negociação em sinais da primeira dimensão

Figura 1. Um exemplo de negociação em sinais da primeira dimensão

2.2. Descrição de sinais de negociação da segunda dimensão

Dois tipos de sinais da segunda dimensão foram implementados. Esse é o cruzamento da linha zero do indicador OM (oscilador maravilhoso) e o sinal "pires". Vamos aceitar a classificação de barras como fazemos no MetaTrader 5, isto é, como série temporal. A verificação do sinal será feita na barra zero-ismo.

Para a formação de um padrão de "cruzamento da linha zero", devem haver duas barras do indicador.

O sinal de compra é formado quando a segunda barra do indicador está abaixo da linha zero, e a primeira barra está acima da linha zero. O preço máximo da primeira barra será o sinal, e se ele exceder, a ordem de compra será enviada ao servidos, utilizando o preço atual. O sinal de venda é formado no cruzamento do caso oposto.

Para a formação do padrão "pires", devem haver três barras consecutivas, e a segunda deve ser de cor vermelha e acima da linha zero, enquanto que a primeira deve ser verde e mais alta que a segunda. O preço de sinalização será o preço mais alto da primeira barra, que será válido até ser superado pelo preço atual ou um novo sinal de compra ser formado. Os sinais de venda do padrão "pires" são formados de forma similar mas do lado oposto ao indicador.

Para a formação do padrão "pires", devem haver três barras consecutivas, e a segunda deve ser de cor vermelha e acima da linha zero, enquanto que a primeira deve ser verde e mais alta que a segunda. O preço de sinalização será o preço mais alto da primeira barra, que será válido até ser superado pelo preço atual ou um novo sinal de compra ser formado. Os sinais de venda do padrão "pires" são formados de forma similar mas do lado oposto ao indicador.

Os sinais de "picos gêmeos" ou "fundos gêmeos" não são considerados nesse artigo e não serão programados no CE devido ao fato de que sua formação quase sempre ocorre no lado oposto do Alligator: os fundos gêmeos estão abaixo da linha da mandíbula, e os picos gêmeos estão acima dessa linha. Negociar baseado em tais sinais contradiz o sistema que está com ordem de não alimentar o Alligator, nós não podemos comprar abaixo das mandíbulas, e nós não podemos vender acima das mandíbulas do Alligator.

Para uma descrição mais detalhada dos sinais eu encorajo você a ver a fonte original.

Figura 2. Um exemplo de negociação em sinais da segunda dimensão

Figura 2. Um exemplo de negociação em sinais da segunda dimensão


2.3. Descrição de sinais de negociação da terceira dimensão

Na terceira dimensão há os sinais "linha do comprar acima do zero" e "linha do comprar abaixo do zero", formados pelo indicador AC (Oscilador Acelerador).

Primeiramente nós olhamos para o padrão, especificado na figura 3. A verificação está feita para uma barra zero-ismo. Se a primeira barra estiver acima da linha zero (caso "A"), que consiste de duas barras verdes e uma vermelha de um histograma. Enquanto isso, a posição da segunda e terceira barras, com respeito à linha zero, não é importante.

Se a primeira barra está abaixo da linha zero (caso "B"), então precisaremos de três barras verdes e uma vermelha para a formação de um sinal de compra. Ela também não leva em conta as barras remanescentes, com respeito à linha zero. Os sinais de venda da terceira dimensão são inversamente análogos.

Para uma descrição mais detalhada e exemplos, consulte a fonte original.

Figura 3. Exemplo de negociação dos sinais da terceira dimensão

Figura 3. Exemplo de negociação dos sinais da terceira dimensão


2.4. Descrição dos sinais de negociação da quarta dimensão ("negociação por zona")

A zona verde é formada quando dois indicadores (AO+AC) estão verdes para alguma barra.

A formação de um sinal de negociação exige duas zonas verdes consecutivas, e o preço de fechamento da primeira barra deve ser maior do que o preço de fechamento da segunda barra.

Execução é implementada uma vez que a nova barra está aberta. No original, a execução deveria ser a ordem quando fechando uma barra. Há situações quando a última variação de fechamento da barra pode mudar a cor das barras OM e AC, e se isso ocorrer, então no final das contas a compra de acordo com o sinal da zona verde era falsa. Por essas razões, eu utilizei a abertura de uma nova barra para comprar.

Também, na quarta dimensão, há um sinal para rastrear uma ordem de stop para a posição de compra.

Isso exige cinco zonas verdes consecutivas. O valor mínimo do preço da primeira zona é utilizado para configurar uma ordem de stop. Se a ordem de stop não foi acionada na próxima barra (após seu fechamento), então configuramos o stop loss para o preço mínimo da última barra completa (deve ser maior do que a ordem de stop) com a abertura de uma nova, sem considerar a cor da zona na barra anterior.

Também usamos uma limitação além da posição de compra aberta pelo número consecutivo de zonas verdes: B. Williams recomenda 6 o 8 zonas. Depois disso, devemos esperar pelo aparecimento de uma zona cinza (isso é quando as cores das colunas para OM e AC são diferentes) ou vermelha, que novamente permitirão preencher a posição para comprar da zona verde.

O sinal para vender forma uma "zona vermelha" - uma imagem espelhada da zona verde. A cor da zona também afeta o número de barras que formam o sinal da "negociação da linha de balanço" (quinta dimensão). Para essa linha, B. Williams escolheu o "dente" do Alligator.

Nesse sinal, eu quero enfatizar que os preços OHLC da barra zero-ismo participam na formação do sinal.

Figura 4. Um exemplo de negociação dos sinais da quarta dimensão

Figura 4. Um exemplo de negociação dos sinais da quarta dimensão


2.5. Descrição de sinais de negociação da quinta dimensão

O padrão "comprar acima da linha de balanço" (se a zona estiver verde) é formado por duas barras. Se o preço de abertura de uma barra zero (também o preço mais alto da barra nesse momento) for menor do que o último preço mais alto da barra (pode ser encontrado algumas barras atrás), então o preço máximo encontrado, será o preço para abrir uma posição de compra na zona verde.

As zonas vermelha e cinza exigem outro máximo, mais alto do que o preço para entrar na zona verde. Assim que o descobrirmos (normalmente menos do que 10 barras para trás e acima do dente do Alligator [não encontrei quantas barras para trás devem ser observadas para tal padrão no texto do autor]), lembre-se dele como o preço para entrar na zona vermelha ou cinza, na direção para comprar.

Para abrir a posição pelo sinal "comprar acima da linha de balanço", nós verificamos o preço atual excedendo o preço em cada barra nova (para as zonas verde/vermelha/cinza).

Figura 5. Um exemplo de negociação dos sinais da quinta dimensão

Figura 5. Um exemplo de negociação dos sinais da quinta dimensão


3. A classe C_TS_BW

3.1. Propósito da classe:
  • Se possível, utilize as classes da biblioteca padrão;
  • Grandes quantidades de "dados similares" devem ser armazenados nas estruturas;
  • Configurações customizadas;
  • Obter o número exigido de dados calculados dos indicadores para análise;
  • Quando surgir uma nova barra, verifique os sinais das cinco dimensões de negociação;
  • Quando houver uma nova variação, verifique o sinal para a abertura de uma posição;
  • Calcule o lote, tanto fixo ou "piramidando" (você irá aprender sobre esse algoritmo no método CalcLot dessa classe);
  • Permita modificar o lote do CE diretamente para cada tipo de sinal. Implemente a necessidade customizada de algoritmos de gerenciamento de dinheiro;
  • Trilhe uma ordem do tipo stop para a posição aberta. Se necessário, modifique o preço da ordem do tipo stop, calculado pelo usuário a partir do CE.
  • Envie a ordem no servidor de negociação e faça um segundo pedido caso haja erro;
  • Proíba a duplicação dos sinais de negociação (insira apenar um por vez por cada sinal);
  • Minimize o número de métodos de classe públicas;
3.2. A implementação da classe C_TS_BW
  • ... se possível, utilize classes e métodos da biblioteca padrão;

Para realizar essa tarefa, você primeiro precisa incluir os arquivos apropriados da Biblioteca padrão.

Isso é implementado pelo código abaixo.

#include 
#include 
#include 
#include <trade\historyorderinfo.mqh</trade\historyorderinfo.mqh

Na seção privada da classe, declare os objetos para a organização dos pedidos de negociação, obtendo a informação no símbolo e posição aberta, assim como acessando o histórico de ordens.

CTrade            exp_trade;    // trading methods from the Standard Library
CSymbolInfo       s_info;       // methods of accessing the information on symbol
CPositionInfo     pos_info;     // methods of obtaining the information on position
CHistoryOrderInfo h_info;       // methods of accessing the history of orders
  • ... Grandes quantidades de "dados similares" são armazenados nas estruturas.

Essa classe utiliza quatro estruturas, duas delas são declaradas na seção privada. Essas são as estruturas:

struct l_signals            // structure of signals and time of the bar, on which they appeared
struct l_trade              // structure of the time of the last triggered signals

Também há duas estruturas na seção pública:

struct  s_input_parametrs   // structure of the tuning parameters
struct  s_actual_action     // structure of the appropriate trading order

Os objetos desses tipos de estruturas:

l_signals         last_signals;     // signals
l_trade           last_trade;       // processed signals
s_input_parametrs inp_param;        // internal structure of the accepted settings
s_input_parametrs inp_param_tmp;    // receiving structure of the settings (received through a link with the initialization of the class)
s_actual_action   actual_action;    // orders on the serve

Mais detalhes sobre o código das estruturas podem ser encontrados no arquivo de cabeçalho anexado.

  • ... personalize as configurações;

Essa tarefa é implementada utilizando o método Unidade da seção pública. Parâmetros para chamadas do CE:

string Symbol_for_trade             // symbol, on which the class will trade
ENUM_TIMEFRAMES Period_for_trade     // the period of the chart symbol, on which the search for signals and its processing will occur
s_input_parametrs &inp_param_tmp   // receiving structure of the class settings

Nesse método também ocorre a inicialização dos indicadores envolvidos e a organização dos amortecedores necessários para receber os dados deles.

  • ... obter o número exigido de dados calculados dos indicadores para análise;

Isso pode ser feito utilizando o método CopyIndValue da seção privada, os parâmetros

int type       // what we request  (0- Alligator, 2 - АО, 3 - АС  )
int countValue // amount of data

Dependendo do tipo de parâmetro, os amortecedores que recebem são automaticamente substituídos pelos dados calculados, organizados como uma série temporal para a inicialização da classe.

  • ... durante a abertura de uma nova barra ...

Uma procura por sinais será realizada apenar uma vez após a abertura de uma nova barra. Para fazer isso, nós precisamos determinar esse momento. Esse método NewBar faz isso, ele não possui parâmetros de entrada e em uma situação quando uma variação recebida abre uma nova barra, ele retorna verdadeiro, caso contrário, ele retorna falso.

  • ... verifique os sinais das cinco dimensões de negociação;

Para cada uma das dimensões de negociação, eu iniciei um método separado. Os sinais da primeira dimensão são verificados por FindSignal_1_dimension.

Chamando parâmetros:

int type               // direction of the fractal for the search (0- to buy, 1 to sell)
double &price_out[]   // this array, after a successful search, will contain the fractal price 
datetime &time_out[]  // in this array, after a successful search, will contain the time of the bar on which the fractal is found

A análise da segunda dimensão será realizada pelo método FindSignal_2_dimension. Chamando parâmetros:

int type               // direction of the search (0-in the direction of to buy, 1-in the direction to sell)
int sub_type         // subtype of the search (0- signal of transferring the zero line, 1- sign "saucer")
double &price_out[]   // this array, after a successful search, will contain the signal price 
datetime &time_out[]  // this array, after a successful search, will contain the time of the bar signal

A análise da terceira dimensão é realizada utilizando o método FindSignal_3_dimension sem entrada/saída de parâmetros:

int type              // direction of the search (0-in the direction of to buy, 1-in the direction of to sell)
int sub_type           // subtype of the search (0-  signal on two identical bars, 1- signal for "three identical bars)
double &price_out[]    // this array, after a successful search, will contain the signal price
datetime &time_out[]   // this array, after a successful search, will contain the time of the bar signal

O processamento da quarta dimensão é feito pelo método FindSignal_4_dimension, com entrada/saída de parâmetros:

int type               // direction of the search (0-in the direction to buy, 1-in the direction to sell)
int sub_type          // what we are looking for (0- signal from the zones, 1- tailing stop for five consecutive zones of one color)
double &price_out[]   // this array, after a successful search, will contain the signal price
datetime &time_out[]  // this array, after a successful search, will contain the time of the signal bar

A quinta dimensão é monitorada por FindSignal_5_dimension. Parâmetros desse método:

int type               // direction of the search (0-in the direction to buy, 1-in the direction to sell)
int sub_type          // subtype of the search (0-  signal for two bars, 1- signal for three bars)
double &price_out[]   // this array, after a successful search, will contain the signal price
datetime &time_out[]  // this array, after a successful search, will contain the time of the bar signal

Toda a verificação é unida pelo método CheckSignal , ele não possui parâmetros de entrada e contém:

  • Cópia de dados dos indicadores;
  • Uma verificação para o fechamento de uma posição (se for utilizada) para alguma linha do Alligator;
  • Restabelecimento dos sinais da barra anterior;
  • Procura por fractais em ambas as direções;
  • Dependendo da disponibilidade de uma posição, procura por sinais da segunda a quinta dimensão, na direção da uma posição aberta.

Esse método é declarado na seção pública, ele precisa ser chamado do CE.

  • ...com a chegada de uma nova variação, verifique a possibilidade de acionamento o sinal para abertura da posição.

Nessa classe, o método CheckForTradeSignal é implementado, que executa a procura pelas possibilidades de inserir uma posição pelo preço atual.

Chamando parâmetros:

int dimension        // number of the dimension (from the first to the fifth)
int type            // direction of the trade (0- buy, 1- sell)
int sub_type         // signal subtype from the trading dimension (described in the signal search)
double &price_out[]  // signal price
datetime &time_out[] // time of the signal bar

Se todos os regulamentos para a ativação de um sinal forem seguidos, então nós retornamos com verdadeiro, caso contrário - falso.

A verificação das capacidades de processamento de todos os sinais é combinada pelo método CheckActionOnTick, anunciado na seção pública, ele precisa ser chamado do CE. Não há parâmetros para a chamada. Cada sinal de sucesso é armazenado no objeto actual_action, eles serão posteriormente processados no método TradeActualSignals.

  • … calcule o lote; tanto fixo ou "piramidando".

O método CalcLot é declarado na seção pública, e pode ser chamado pelo CE. Ele é planejado para informação do lote e a modificação adicional do lote variável, declarada na seção privada da classe. Chamando parâmetros:

bool external // for the installation of the external calculated lot, you need to direct to this variable true, 
              // then the lot will be set by the value ext_lot. 
              // Inside this class (calculate the lot), the method is called with the parameter false.
double ext_lot // external size of the lot
int type // type of lot calculation 
         //(0- starting lot (use the value that was transferred during the initialization of the class, 
         //-1 turn over lot (the sum of the lot of the current position and the starting lot), 
         // the values from 5 to 2 are used if the aggressive trading mode is turned on (meaning "pyramiding").
         // In this mode: 5 – starting,  multiply by 5, 
         // 4 – starting,  multiply by 4,
         // 3 – starting,  multiply by 3, 
         // 2 – starting,  multiply by 2,
         // 1 - the filling lot is equal to the starting lot

Agora que nós consideramos o lote fixo, vamos falar mais sobre o lote "piramidado".

Deixei o lote inicial ser igual a 0,1. Por exemplo, abra pelo lote inicial para o sinal do fractal, fora das mandíbulas do Alligator, a posição total será 0,1 lotes. Após o que começamos a analisar os sinais de entrada da segunda a quinta dimensões. Assim que o sinal é acionado, preencha a posição aberta com 0,5 lotes (começando, multiplicado por 5), e obtenha o volume total da posição como 0,6 lotes. Durante o próximo sinal na direção da posição aberta, preencha com 0,4 lotes, e a posição total será igual a 1,0 lotes.

O próximo sinal na direção da posição nos fornecerá adicionais 0,3 lotes, e a posição total será igual a 1,3 lotes. O quinto preenchimento será feito com 0,2 lotes, e o volume total da posição se tornará 1,5 lotes. Os preenchimentos seguintes na direção da posição irão ocorrer apenar por 0,1 lotes.

Esse algoritmo de gerenciamento de dinheiro (MM) foi descrito por B. Williams em Trading Chaos. A possibilidade de instalação de um lote do usuário nos permite implementar praticamente qualquer gerenciamento de capital.

Para uma determinação correta da sequência de ordens em um acordo, eu utilizo vários números mágicos.

Número

Descrição da ordem

999

Ordem de transferência

1000

Ordem inicial

1001

Ordem de preenchimento (inicial X 1)

1002

Ordem de preenchimento (inicial X 2)

1003

Ordem de preenchimento (inicial X 3)

1004

Ordem de preenchimento (inicial X 4)

1005

Ordem de preenchimento (inicial X 5)


A classe calculou o número necessário (utilizando o método CalcMagic), que posteriormente estará identificando a operação de negociação no servidor antes de enviar uma nova ordem.

  • ... permita modificar o lote do CE diretamente para cada tipo de sinal.

Se desejado, você pode implementar no CE uma consulta da estrutura actual_action, na qual os sinais de negociação são armazenados na forma de variáveis bool. Cada tipo e direção são correspondidos por uma variável. Se nós possuímos um valor verdadeiro, então para essa variação, a classe irá tentar produzir uma operação de negociação pelo sinal de negociação específico, após o qual os lotes para esse sinal podem ser modificados. Para cada variação da mudança de preço, a classe envia apenas uma ordem para a posição aberta ou um preenchimento.

A configuração de um lote é possível no CE após a chamada do método CheckActionOnTick a antes da chamada de TradeActualSignals. Uma vez que na variação atual podem haver um número de sinais, esperando execução, apenas um será selecionado.

A sequência de execução de sinal:

  • Fechamento da posição;
  • Execução se um dos sinais do fractal (abertura, repreenchimento, derrubada da posição);
  • O sinal "pires";
  • O sinal "cruzamento da linha zero";
  • AC "duas barras igualmente coloridas";
  • AC "três barras igualmente coloridas";
  • Negociação em zonas;
  • A linha de balanço (sinal de 2 barras);
  • A linha de balanço (sinal de 3 barras);

É, portanto, necessário considerar essa sequência durante a instalação do tamanho do lote do "usuário".

  • ... trilhando uma parada para a posição aberta. Se necessário, modifique o preço da ordem do tipo stop, calculada pelo usuário a partir do CE.

Na classe descrita, há manutenção do preço de parada na posição, pelo método Trailing Stop, significando aumentar o Stop Loss, porém, na direção de aumentar os lucros na posição para o acionamento nesse preço. Há cinco modelos de manutenção:

  • Pela linha dos lábios do Alligator;
  • Pela linha dos dentes do Alligator;
  • Pela linha da mandíbula do Alligator;
  • Por cinco zonas consecutivas da mesma cor (zonas verdes para comprar, vermelhas para vender);
  • Configuração externa de um preço de parada.

A quinta opção da instalação de um stop loss é implementada pelo método SetStopLoss, com um único parâmetro double & stoploss. A chamada deve ser feita do CE e antes de executar o método TrailingStop, que verifica os preços para modificação da posição, e envia o pedido para o servidor. Após uma execução bem sucedida desse procedimento, o valor da variável interna StopLoss é redefinido para -1.

  • ... controle o envio da ordem do acordo de abertura para o servidor, e se for mal sucedido, faça um segundo pedido.

Para o envio de uma ordem de negociação para abertura, fechamento ou transferência de uma posição, o método boolSendOrder é utilizado. Os parâmetros de chamada:

ENUM_ORDER_TYPE type   // direction of the trading operation
double &price_out[]   // pointer to the signal price, after a successful execution of the operation, set in -1;
datetime &time_out[]  // the pointer to the signal time, after a successful execution of the operation, set in -1;
string comment         // the commentary for the order

A verificação de todos os sinais de negociação é combinada pelo método TradeActualSignals. A estrutura actual_action armazena ordens de negociação. Após o envio bem sucedido para o servidor da ordem (SendOrder retorna verdadeira), redefina o sinal de negociação na estrutura actual_action. O sinal de negociação será ativo até recebermos uma resposta positiva no envio.

Há também uma função na estrutura actual_action init,, sem parâmetros, que redefine todos os sinais atuais. Esse procedimento é utilizando quando abrindo a nova posição ou quando ocorre uma derrubada na posição existente.

  • ... proíba a duplicação dos sinais de negociação (insira apenar um por vez por cada sinal);

A estrutura last_trade armazena o tempo do último sinal de negociação para cada tipo e direção. Antes de você configurar uma ordem de negociação na estrutura actual_action, verifique esse sinal já está negociando na estrutura last_trade e, caso sim, ignore ele. Assim, isso fornece a implementação do controle da execução "descartável" de uma situação de negociação.

  • Minimize o número de métodos de classe públicas.

Aqui está uma lista de métodos de classe que estão disponíveis por chamado do CE:

void C_TS_BW();                                      // Constructor
bool Init(string Symbol_for_trade,
           ENUM_TIMEFRAMES Period_for_trade,
          s_input_parametrs  &inp_param_tmp);       // Initialization of the class
bool NewBar();                                           // Check for a new bar on the current symbol\time-frame
void CheckSignal();                                 // Search for signals
void CheckActionOnTick();                              // Collecting the desired actions on the current tick
void TrailingStop();                                // Trailing Stop
void TradeActualSignals();                             // Trading by the current signals
void SetStopLoss(double  &stoploss);                  // Set Stop Loss
void CalcLot(bool external,double ext_lot,int type); // Calculation of the lot

Também disponível nas estruturas:

actual_action    // Current trading orders for execution
inp_param_tmp;   // Reception of the structure of settings
                   // (receives the data by the link during the initialization of the class)


4. A implementação da CE utilizando a classe C_TS_BW

A primeira coisa que deve ser feita é incluir o arquivo h_TS_BW.mqh no conselheiro especialista.

#include 

Após isso, declare o objeto da classe C_TS_BW. Que ele seja o EA_TS_BW.

Você também precisará da estrutura dos parâmetros ajustáveis como s_input_parametrs, por exemplo, input_parametrs.

Aqui está uma descrição dos parâmetros, incorporada nessa estrutura:

input_parametrs.alligator_jaw_period        // The Alligator: period of the Jaws line
input_parametrs.alligator_jaw_shift         // The Alligatpr: shift of the Jaws line
input_parametrs.alligator_teeth_period      // Alligator: period of the Teeth line
input_parametrs.alligator_teeth_shift       // Alligator: shift of the Teeth line
input_parametrs.alligator_lips_period       // Alligator: period of the Lips line
input_parametrs.alligator_lips_shift        // Alligator: shift of the Lips line
input_parametrs.add_1_dimension              // Allow the addition by Fractals
input_parametrs.add_2_dimension_bludce     // Allow the addition by the "Saucer" (АО) signal
input_parametrs.add_2_dimension_cross_zero // Allow the addition by the "Crossing the zero line" (АО) signal 
input_parametrs.add_3_dimension_use_2_bars // Allow the addition by the "АС 2 bars" signal 
input_parametrs.add_3_dimension_use_3_bars // Allow the addition by the "АС 3 bars" signal
input_parametrs.add_4_dimension_zone       // Allow the addition by the red or the green zone
input_parametrs.add_5_dimension             // Allow the addition by the Balance Line
input_parametrs.max_4_dimension_zone       // The maximum amount of consecutive bars of zones of the same color 
input_parametrs.trall_4_dimension           // Allow a trail position using 5 consecutive bars of zones of the same color
input_parametrs.agress_trade_mm            // Aggressive style of filling in an open position
input_parametrs.support_position           // Type of trailing stop of the position
input_parametrs.lot                           // Trading lot

Na seção OnInit() do CE, você precisa:

  • Preencher todos os valores necessários da estrutura input_parametrs com dados que serão então passados para a classe.
  • Utilizando o método Init da classe, faça essa inicialização. Exemplo:
expert_TS_BW.Init(Symbol(),PERIOD_CURRENT,input_parametrs)

Nesse caso, o CE trabalhará no símbolo/período atual onde ele é instalado.

Exemplo da seção OnTick() do conselheiro especialista:

//   double Sl[1];  
   if(expert_TS_BW.NewBar()) // new bar on the chart
     {
      expert_TS_BW.CheckSignal();       // signal search
     }
   expert_TS_BW.CheckActionOnTick();    // check for the required actions on the current tick
//---******************* the place of the beginning of external control of the lot, the stop 
//--- example of setting the lot for trade by the signal from the zones

//   if(expert_TS_BW.actual_action.zone_buy || expert_TS_BW.actual_action.zone_sell)
//     {expert_TS_BW.CalcLot(true,0.11,0);}
//--- setting the stop by the parabolic

//   CopyBuffer(h_parabolic,0,0,1,Sl);
//   if (Sl[0]>0){expert_TS_BW.SetStopLoss(Sl[0]);}
//---*******************the place of the end of external control of the lot, the stop 

   expert_TS_BW.TrailingStop();           // pulling-up the stop (if necessary)  
   expert_TS_BW.TradeActualSignals();     // trading of current signals

Nesse caso, os exemplos do controle externo do preço de parada e do lote de negociação, para a execução das classes, são comentados.


5. Alguns testes na história

O autor do livro, baseado em cada CE que foi escrito, argumenta que esse sistema é focado em marcados de bolsas e mercadorias.

Primeiro, vamos verificar o conselheiro especialista no CFD. Suponha que o polígono de teste será parte da história do IBM. O sistema tem como alvo o segmento de tendências das cotações. Peguei o primeiro segmento disponível, no qual a tendência pode ser vista pelo olho nu.

Figura 6. Gráfico IBM

Figura 6. Gráfico IBM

Execute o Expert Advisor escrito nesse segmento e isso é o que obtemos como ordens.

Figura 7. Os sinais de negociação de Bill Williams (IBM)

Figura 7. Os sinais de negociação de Bill Williams (IBM)

Ao primeiro olhar, há várias negociações pela tendência, o que é bom. Aqui está o gráfico, criado pelo verificador de estratégia.

A negociação foi realizada em 0,1 lotes, sem fechar pelas linhas do Alligator, sem uma parada móvel utilizando cinco zonas consecutivas de uma cor e sem negociação agressiva (piramidamento).

Figura 8. Resultados do teste

Figura 8. Resultados do teste

Em geral, nós obtemos lucro.

Agora vamos tomar uma tendência prolongada com uma inclinação menor.

Figura 9. Gráfico IBM (fragmento 2)

Figura 9. Gráfico IBM (fragmento 2)

Que esse seja o mesmo símbolo e período de 13 meses (de 2008.12 a 2010.01)

Aqui está o gráfico do verificador de estratégia:

Figura 10. Os resultados do teste do sistema no histórico (fragmento 2)

Figura 10. Os resultados do teste do sistema no histórico (fragmento 2)

Vamos simplesmente dizer que, "não é satisfatório" ou "não correspondeu às nossas expectativas".

Em seguida eu gostaria de verificar o trabalho dos pares de moedas correntes.

Vamos tomar o par bem conhecido EURUSD e o período H1 do gráfico. A profundidade do histórico é o ano de 2010.

Figura 11. Os resultados do teste do sistema no histórico,  EURUSD, H1, 2010

Figura 11. Os resultados do teste do sistema no histórico, EURUSD, H1, 2010

Vamos tentar ele nas barras diárias de EURUSD para o mesmo ano (2010).

O relatório do verificador se parece com isso:

Figura 12. Os resultados do teste do sistema no histórico,  EURUSD, D1, 2010

Figura 12. Os resultados do teste do sistema no histórico, EURUSD, D1, 2010


Conclusão

O objetivo desse artigo era verificar o desempenho de uma das bem conhecidas estratégias de negociação por Bill Williams, não apenas nos mercados de ações e bolsa de mercadorias, mas também no mercado Forex. O sistema funciona "mais ou menos" sobre os gráficos diários do EURUSD do ano passado, mas não traz lucro em períodos menores, sem tentativas de otimização.

Os sinais de entrada do mercado no sistema são bem precisos (se nós olharmos para os gráficos diários), mas as saídas são claramente atrasadas, uma vez que mais da metade do lucro não é fixa. Esse campo é para o refinamento do sistema dado em termos de sua otimização para períodos de tempo menores.

O código completo da classe pode ser encontrado no arquivo anexado.


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

Arquivos anexados |
h_ts_bw.mqh (57.84 KB)
Últimos Comentários | Ir para discussão (1)
foguera
foguera | 15 nov 2017 em 14:03

Olá. Compilei o código e tentei utilizá-lo no testador, mas não ocorre nenhuma operação. O que devo mudar nos parâmetros? Obrigado.

O Histograma de preço (Perfil de mercado) e sua implementação no MQL5 O Histograma de preço (Perfil de mercado) e sua implementação no MQL5
O Perfil de mercado foi desenvolvido pelo pensador realmente brilhante Peter Steidlmayer. Ele sugeriu o uso da representação alternativa de informação sobre movimentos de mercados "horizontais" e "verticais" que levam a um conjunto de modelos completamente diferentes. Ele presumiu que existe um pulso subjacente do mercado ou de um padrão fundamental chamado de ciclo de equilíbrio e desequilíbrio. Neste artigo, considerarei o Histograma de preço - um modelo simplificado de Perfil de mercado e descreverei sua implementação no MQL5.
Avaliação de sistemas de negócio - A efetividade de entrada, saída e negócios em geral Avaliação de sistemas de negócio - A efetividade de entrada, saída e negócios em geral
Existem várias medidas que permitem determinar a eficácia e rentabilidade de um sistema de negócio. No entanto, os negociantes estão sempre prontos para colocar qualquer sistema em um novo teste de impacto. O artigo diz como as estatísticas baseadas em medidas de efetividade podem ser usadas para a plataforma MetaTrader 5. Ele inclui a classe para transformação da interpretação das estatísticas através de negócios para aquele que não contradiz a descrição dada no livro "Statistika dlya traderov" ("Statistics for Traders") por S.V. Bulashev. Ele também inclui um exemplo de uma função de personalização para otimização.
Como trocar dados: um DLL para o MQL5 em 10 minutos Como trocar dados: um DLL para o MQL5 em 10 minutos
Agora, não muitos desenvolvedores lembram como escrever um simples DLL e quais são os recursos especiais da diferente ligação do sistema. Usando vários exemplos, vou tentar mostrar todo o processo da criação de um simples DLL em 10 minutos, bem como discutir alguns detalhes técnicos da nossa implementação de ligação. Mostrarei o processo passo-a-passo da criação de DLL no Visual Studio com exemplos de troca de diferentes tipos de variáveis (números, arrys, strings, etc.). Além disso, explicarei como proteger seu terminal do cliente de travamentos nos DLLs personalizados.
Diversas maneiras de se encontrar uma tendência no MQL5 Diversas maneiras de se encontrar uma tendência no MQL5
Qualquer comerciante daria muito pela oportunidade de detectar precisamente uma tendência em qualquer dado momento. Talvez, este seja o Santo Graal que todo mundo esteja procurando por. Este artigo considerará diversas maneiras de detectar uma tendência. Para ser mais preciso - como programar diversas maneiras clássicas para detectar uma tendência pelos meios do MQL5.