Versão 3.0 – 13/10/2021

Esta é a nova geração dos robôs RobotCrowd, com diversas novidades e correções de problemas. Veja abaixo as principais modificações.

Novo Padrão de Interface

O painel de informações e a apresentação de mensagens dos robôs foram modernizados. Agora o painel utiliza uma janela dinâmica que pode ser totalmente minimizada para permitir uma melhor visualização do gráfico.

Novo painel de informações

As mensagens de log dos robôs podem ser apresentadas no próprio gráfico, facilitando a identificação dos alertas de um robô específico. Na aba Experts do terminal, as mensagens também serão apresentadas incluindo o número mágico do robô, de forma a diferenciar múltiplas instâncias de um mesmo robô com ajustes diferentes.

Apresentação de logs no gráfico

Com o parâmetro “A.21 Nivel das mensagens de log” é possível definir quais tipos de mensagens serão enviadas pelos robôs, podendo ser escolhidas as seguintes opções: “Nenhuma mensagem” (util durante backtests), “Apenas erros”, “Erros e informações” (padrão), e “Debug” (usado por desenvolvedores).

A imagem acima também mostra um padrão de cores que é aplicado automaticamente ao gráfico, criando uma identificação mais fácil dos gráficos com robôs da RobotCrowd. Caso o usuário queira desativar este template padrão, basta deixar o parâmetro “A.06 Aplicar padrao de cores no grafico” como false.

O robô RC-Boleta também foi modernizado, com a janela de ordens seguindo o mesmo padrão do painel de informações. Além do novo desenho, foram incluídos botões para realizar aumentos de posição e realizações parciais, além de um campo para inserir o volume operado.

Novo RC-Boleta

Equalização dos modos de teste

Foi criado um mecanismo que permite equalizar o resultados de testes Cada Tick, OHLC e Apenas preços de abertura. Com isso é possível garantir que uma otimização/backtest realizado em qualquer dos modos tenha um resultado previsível, mantendo a mesma característica na operação com dados ao vivo.

É importante destacar que a estratégia deve estar adaptada a esta funcionalidade, para que os resultados sejam satisfatórios. A tomada de decisão, em relação a sinais de entrada, deve acontecer a cada barra fechada, ou pelo menos a cada barra de 1 minuto. Deverão ser evitadas quaisquer ações que dependam de ticks durante a formação da barra, já que os mesmos poderão não ser processados. Para saber se uma estratégia está adaptada a este modelo de teste, é interessante realizar as simulações em cada um dos modos e comparar o resultado obtido. Se o resultado for similar, pode-se aplicar esta metodologia. Grande parte das estratégias pode se comportar bem usando fazendo o processamento uma vez a cada minuto.

Este comportamento será controlado pelo parâmetro “A.07 Tempo de ciclo para processamento”, que passa a apresentar uma lista de opções para escolha do usuário:

  • Todos os ticks: Neste caso o robô fará o processamento de todos os ticks recebidos, e o teste Cada Tick poderá apresentar grandes diferenças em relação aos demais modos.
  • A cada 1 segundo: O robô faz o processamento de 1 tick a cada 1 segundo.
  • A cada 2 segundos: O robô faz o processamento de 1 tick a cada 2 segundos.
  • A cada 5 segundos: O robô faz o processamento de 1 tick a cada 5 segundos.
  • A cada 10 segundos: O robô faz o processamento de 1 tick a cada 10 segundos.
  • 1o tick barras 1 minuto: Com esta opção o robô vai processar apenas o primeiro tick de cada barra de 1 minuto. Todos os demais ticks recebidos serão desprezados. Este modo faz com que os testes Cada Tick e OHLC 1min tenham resultados equivalentes, já que ambos passarão a utilizar a mesma base para tomada de decisão.
  • 1o tick no time frame do grafico: Usando esta opção, o robô processa apenas o primeiro tick a cada nova barra do gráfico. Isso permite utilizar o modo de teste “Apenas preços de aberura” e, consequentemente, faz com que os resultados dos testes “Cada Tick”, “OHLC 1min” e “Somente preços de abertura” sejam equivalentes.

Os dois últimos modos podem trazer um grande ganho de desempenho no processo de otimização, garantindo as mesmas características em operação com dados reais. Importante destacar que o parâmetro deve ser mantido com o mesmo valor na operação ao vivo.

A imagem abaixo mostra um comparativo de três backtests realizados com o parâmetro A.07 selecionado como “1o tick no time frame do grafico” nos modos “Cada tick”, “OHLC 1 min” e “Apenas preços de abertura”. Pode ser visto que os resultados são exatamente os mesmos, mas o ganho em tempo de simulação é considerável.

Comparação dos resultados para cada tipo de teste

Expressões Personalizadas

As expressões personalizadas permitem definir regras específicas para filtrar ou gerar sinais de entrada para as operações. As expressões podem envolver funções matemáticas, comparações de valores e devem sempre retornar um valor do tipo verdadeiro ou falso, sendo que verdadeiro autoriza a negociação e falso bloqueia. Podem ser usados valores explícitos, variáveis que correspondem a parâmetros de entrada, e arrays com histórico de preços ou indicadores. As expressões podem ser compostas por múltiplas subexpressões delimitadas por parênteses, e conectadas usando operadores lógicos do tipo E/OU.

As seguintes funções estão disponíveis para uso nas expressões:

abs: valor absoluto de um número. Ex: abs(-123) = 123;

ceil: arredondamento para o inteiro superior. Ex: ceil(9.6) = 10.0;

exp: exponencial para o número e;

floor: arredondamento para o inteiro inferior. Ex: floor(9.60) = 9.0;

log: Logaritmo (e);

log10: Logaritmo base 10;

max: Valor máximo entre dois números. Ex. max(10, 5) = 10;

min: Valor mínimo entre dois números. Ex. min(10, 5) = 5;

mod: Resto da divisão entre dois inteiros. Ex. mod(3, 2) = 1;

pow: Número elevado à potência especificada. Ex. pow(2, 3) = 8;

rand: Número gerado aleatoriamente;

round: Arredondamento para o inteiro mais próximo. Ex. round(2.3) = 2.0;

sqrt: Raiz quadrada de um número.

Operadores matemáticos:

+: Adição;

: Subtração;

/: Divisão;

*: Multiplicação;

%: Módulo.

Operadores lógicos e de comparação:

>: maior;

<: menor;

>=: maior ou igual;

<=: menor ou igual;

==: igual; 

!=: diferente;

&&: “E” lógico entre duas subexpressões;

||: “OU” lógico entre duas subexpressões.

Variáveis: cada tipo de filtro pode contar com variáveis diferentes, que serão usadas de forma literal nas expressões (ex. R1) e são vinculadas a parâmetros de configuração dos robôs, podendo ser aplicadas no processo de otimização. 


Arrays: Os arrays representam o histórico de preços ou conjuntos de valores dos indicadores. A notação usada é o nome do array seguido por colchetes [ ] com o índice da barra desejada (ex. C[1]). O índice 0 sempre representa a barra atual, 1 para a barra anterior, e assim sucessivamente.

A seguir, são listados os arrays comuns a todos os filtros:

O[ ]: preços de abertura;

H[ ]: maximas;

L[ ]: mínimas;

C[ ]: preços de fechamento;

R[ ]: range, diferença entre máxima e mínima;

B[ ]: tamanho do corpo, diferença entre abertura e fechamento.

Cada tipo de filtro que permite expressões pode contar com variáveis e/ou arrays específicos, que são listados a seguir.

*Obs.: As variáveis podem ser usadas de forma livre, independente da semântica e descrição usada para os filtros pré-definidos.

1. Filtros de Price Action:

Variáveis específicas :  

ID: Parâmetro H.06.19 Afastamento de referencia em % (INTRADAY);

LD: Parâmetro H.06.20 Afastamento de referencia em % (LASTDAY);

IW: Parâmetro H.06.21 Afastamento de referencia em % (INTRAWEEK);

RG: Parâmetro H.06.22 Afastamento das minimas/maximas;

R1: Parâmetro H.06.23 Referencia 1;

R2: Parâmetro H.06.24 Referencia 2.

2. Filtros de Média Móvel (MA1 e MA2):

Variáveis específicas:

AF: Parâmetros H.07.8 Afastamento da media movel 1 ou H.08.8 Afastamento da media movel 2.

Arrays específicos:

M[ ]: Valor da média móvel.

3. Filtro VolatilityChannel:

Variáveis específicas:

R1: Parâmetro H.26.13 Valor de referencia 1 VolatilityChannel;

R2: Parâmetro H.26.14 Valor de referencia 2 VolatilityChannel.

Arrays específicos:

MA[ ]: Valor da média móvel;

LB[ ]: Valor da banda inferior;

UB[ ]: Valor da banda superior.

4. Filtro Donchian/Phibo:

Arrays específicos:

BLO[ ]: Valor das mínimas;

B214[ ]: Valor da linha de 21,4%;

B382[ ]: Valor da linha de 38,2%;

B500[ ]: Valor da linha de 50%;

B618[ ]; Valor da linha de 61,8%;

B786[ ]: Valor da linha de 78,6%;

BHI[ ]: Valor das máximas.

5. Filtros personalizados:

Variáveis específicas:

R1: Parâmetros H.98.11 Valor de referencia 1 para indicador ou H.99.11 Valor de referencia 1 para indicador

R2: Parâmetros H.98.12 Valor de referencia 2 para indicador ou H.99.12 Valor de referencia 2 para indicador

Arrays específicos:

B0[ ]: Valor do Buffer 0 do indicador personalizado

B1[ ]: Valor do Buffer 1 do indicador personalizado

B2[ ]: Valor do Buffer 2 do indicador personalizado

B3[ ]: Valor do Buffer 3 do indicador personalizado

B4[ ]: Valor do Buffer 4 do indicador personalizado

B5[ ]: Valor do Buffer 5 do indicador personalizado

B6[ ]: Valor do Buffer 6 do indicador personalizado

B7[ ]: Valor do Buffer 7 do indicador personalizado

B8[ ]: Valor do Buffer 8 do indicador personalizado

B9[ ]: Valor do Buffer 9 do indicador personalizado

Os exemplos abaixo mostram algumas expressões válidas:

C[0]<C[1] – Preço de fechamento atual menor que fechamento anterior;

(H[1]>H[2]) && (L[1]>L[2]) – Máxima da última barra maior que anterior e mínima maior que anterior;

ABS(C[0]-C[1]) > R1: Valor absoluto da diferença entre fechamento atual e da última barra maior que o parâmetro de referência 1;

C[1]>M[1]: Fechamento da barra anterior maior que a média;

(C[2]>UB[2]) && (C[1]<UB[1]): Fechou fora e fechou dentro da banda superior;

C[1]>B2[1]: Fechamento anterior maior que o buffer #2 do filtro personalizado.

Cada campo de expressão personalizada permite definir expressões diferentes para compra e para venda. Neste caso as expressões devem ser separadas por um caracter ponto e vírgula (;). Caso apenas uma expressão seja colocada, a mesma será usada tanto para compras como para vendas:

C[0]>BHI[1] ; C[0]<BLO[1]: Para compras, espera que o fechamento atual fique maior que a linha de máxima da barra anterior; e para vendas, espera fechamento atual fique menor que a linha das mínimas.

C[1]>M[1] ; C[1]<M[1]: Para compras, espera que o fechamento anterior seja acima da média.; e para vendas o fechamento anterior deve ser abaixo da média.

Função de otimização personalizada

Além das expressões utilizadas para os filtros, é possível também definir uma função de otimização para calcular o resultado de cada teste (result), que será utilizado para classificar os conjuntos de parâmetros durante a otimização. Esta expressão deve retornar um valor, sendo que quanto maior o valor melhor classificado estará o conjunto de parâmetros em uma otimização.

As seguintes variáveis podem ser usadas no cálculo de um resultado de otimização:

profit: Lucro líquido;

gp: Lucro bruto;

gl: Perda bruta;

pf: Fator de lucro;

sharpe: Sharpe ratio;

trades: Número de trades (operações fechadas);

ddbal: Drawdown no saldo;

ddeqt: Drawdown no capital (considerando resultado em aberto);

wins: Número de trades com lucro;

losses: Número de trades com perda;

deposit: Saldo inicial;

rf: Fator de recuperação;

wdraw: Valor de saque durante o teste;

payoff: Payoff no período;

mxprofit: Maior lucro em um trade;

mxloss: Maior perda em um trade;

mxconsprofit: Maior lucro consecutivo;

mxconsloss: Maior perda consecutiva;

mxconswins: Máximo de ganhos em sequência;

mxconslosses: Máximo de perdas em sequência;

mibal: Menor saldo atingido;

mieqt: Menor capital atingido (incluindo resultado em aberto);

nbuy: Número de operações de compra;

nsell: Número de operações de venda.

Realização parcial de aumentos de posição

A partir desta versão foram incluídos parâmetros para definir o ponto de saída para cada um dos aumentos de posição realizados pelo robô. Esta funcionalidade é independente da realização parcial que já existia anteriormente, e não pode ser utilizada em conjunto.

Para cada nível de aumento é possível definir uma distância para realização do aumento (ex. “V.02.5.3 Distancia fixa para realizacao do aumento #1”), que deve fazer a saída com o mesmo volume que foi executado no aumento de posição. A distância é sempre definida de forma fixa, com valores absolutos em preço ou pips.

Configuração da realização de aumentos

As realizações dos aumentos serão feitas até o número definido nos parâmetros “Numero de realizacoes do aumento #n (loop)”, sendo que após o número limite o aumento de posição ficará até o encerramento da operação.

Agora também é possível fazer as saídas parciais com ordem limit em contas hedge, caso o parâmetro “V.03 Utilizar ordens pendentes para RPs, APs e RAs” esteja definido como true.

Obs.: Com a implementação desta funcionalidade, os robôs de gradiente linear foram descontinuados, já que é possível configurar setups semelhantes com a realização dos aumentos.

Integração com Trading Portfolios

Os robôs agora estão totalmente integrados com o site Trading Portfolios, o que permite utilizar a funcionalidade de acompanhamento e controle dos EAs diretamente a partir do site. Este controle possibilita a habilitação, desabilitação ou bloqueio temporário dos robôs, bem como a definição do volume operado sem que seja necessária a intervenção do usuário no terminal onde os robôs estão rodando.

Status do EA no site Trading Portfolios

Para habilitar a interface de controle com o site, os robôs devem estar com o parâmetro “A.22 Habilitar interface com Trading Portfolios” marcado como true, e o mesmo terminal deve estar rodando o EA de publicação do site Trading Portfolios (a troca de informações acontece usando este EA, que deve estar no mesmo terminal).

Parâmetros Interface com Trading Portfolios

Já para a definição de volume operado a partir do site, o parâmetro ” B.01 Metodo para calculo de volume” deve estar selecionado como “Definido pelo Trading Portfolios”. No site, estão disponíveis alguns métodos de gerenciamento de capital, além do lote fixo. Podem ser aplicados os métodos percentual de risco fixo, fixed ratio ou incremento de capital fixo, que vão levar em conta os resultados passados do robô para calcular o volume.

Robô desabilitado pelo site, e com volume definido

Esta funcionalidade faz parte da assinatura Basic do site Trading Portfolios. Com o lançamento desta versão dos robôs RobotCrowd foi criado um código promocional em comemoração, que vai dar um grande desconto no valor da assinatura:

RC3BR

Novas opções de gerenciamento de risco

Foram disponibilizadas novas opções para gerenciamento de capital (parâmetro “B.01 Metodo para calculo de volume”), com cálculo do volume operado:

Capital total definido em B.04 (acoes): Com esta opção, o usuário deve definir um capital a ser operado no parâmetro B.04, e este valor será usado para calcular a quantidade de ações que pode ser operada, levando em consideração o preço atual do papel. Esta opção é útil para setups com ações.

Incremento por passo de drawdown: Nesta opção deve ser definido no parâmetro B.03 um valor de drawdown que será considerado para aumentar o lote operado. Até este limite, será mantido o volume inicial, e incrementado a cada vez que um múltiplo completo for alcançado. Por exemplo, se o volume inicial for 1.0, e o passo 100, o robô fará operações com volume 1.0 até chegar em um drawdown de 200, quando passaria a operar com volume 2.0, e assim sucessivamente.

Martingale: Com esta opção, o volume inicial será dobrado a cada perda verificada em sequência. Quando uma operação terminar com lucro, o volume retorna para o inicial.

Para possibilitar a definição de objetivos de lucro e limites de perda financeiros independente do volume operado, foi incluído o parâmetro “F.01.1 Medida usada nos limites de lucro e perda”. Este parâmetro pode ser selecionado como “Valor financeiro total”, que é a opção já existente anteriormente, ou “Valor por contrato”, que define os valores financeiros para uma unidade do papel operado (contrato, ação, etc.). Neste caso, todo resultado de operação será normalizado pelo volume para calcular o resultado acumulado por contrato.

No caso das realizações parciais e aumentos de posição, é possível indicar os volumes correspondentes como proporção do volume inicial da operação. Isto é controlado pelos parâmetros “V.01.2 Unidade de volume das realizacoes parciais” e “V.02.2 Unidade de volume dos aumentos de posicao”, que podem assumir os valores “Quantidade exata”, que é o método tradicional definindo explicitamente o volume que será negociado, ou “Proporcao volume inicial”, que indicará um multiplicador aplicado ao volume inicial para definir a quantidade a ser executada.

Utilização da VPS MetaTrader

O código dos robôs foi revisado e retiradas dependências de indicadores que impediam a correta migração dos robôs RobotCrowd para a VPS MetaTrader. A partir desta versão é possível sincronizar os robôs com esta VPS normalmente.

Acompanhamento da VPS MetaTrader com os robôs em operação

Usando a integração com o site Trading Portfolios é possível ter uma monitoração e controle maior dos robôs nesta VPS, que não é diretamente acessível pelo usuário. Por esta interface é possível acompanhar o estado dos robôs e inclusive desativar robôs individualmente.

Acompanhamento dos EAs na VPS em um portfolio no site Trading Portfolios

Outras melhorias

  • Modificado o tratamento para entradas a mercado, de forma que o posicionamento dos stops possa ser realizado com o preço de referência correspondente ao preço atual do ativo.
  • Nova opção no parâmentro E.06 “exact”: “E.06 Corrigir stops se houver slippage (false/true/exact)”. Esta opção faz a correção “exata” do SL e TP (inclusive, antes da abertura da ordem), conforme foi calculada no ponto de início da operação.
  • Novas opções para os Filtros MA1 e MA2: “Toque ma média e preco acima” e “Toque ma média e preco abaixo”.
  • Renomeado o robô RC-Filtros para RC-Free.
  • Incluída opção para escolher a hora de referência usada para a definição dos horários de operação. O padrão usa referência das 00:00 no horário do servidor, e a segunda opção considera o horário de abertura das negociações. Com este último, é possível utilizar um mesmo ajuste em corretoras com horários diferentes.
  • Criados parâmetros para permitir ou não operações a cada semana do mês (1 a 4).
  • Criado parâmetro “C.05 Tipo de ordem pendente para entradas” para seleção do tipo de ordem pendente usado nas entradas. Por padrão (modo automático) o robô tenta determinar qual a ordem mais apropriada com base no preço atual de mercado, o ponto de entrada e o offset definido. Além do modo automático, neste parâmetro pode ser fixado o tipo de ordem como Buy/Sell Stop ou Buy/Sell limit.
  • Incluído parâmetro geral para definição do preço de referência para as entradas, que antes estava disponível apenas para alguns robôs. O preço de referência pode ser selecionado no parâmetro “C.06 Preco de referencia para ponto de entrada”. Algumas funcionalidades dos robôs, em especial as operações baseadas em rompimento sem confirmação (durante a formação das barras), não serão afetadas por este parâmetro. Mas toda lógica que for baseada em barras fechadas, poderá contar com esta seleção do preço de entrada.
  • Para os casos de bloqueio ou erro crítico nos EAs, foi feita a mudança da cor de frente (texto) do gráfico para vermelho.
  • Criada opção de distância para aumentos e realização parcial baseada em variação percentual em relação ao preço de entrada.
  • Incluído parâmetro “H.05.3 Criterio para acionar condicao de saida” para definir quando as condições de saída podem ser acionadas com base no lucro da operação: sempre, apenas com lucro, ou apenas com prejuízo.
  • Adaptado o processamento dos filtros para que as expressões personalizadas sempre sejam referenciadas como a barra atual sendo [0], independente da seleção barra atual ou barra anterior para filtros e condições de saída.
  • Inclusão de novos modos para o filtro MACD.
  • Flexibilização dos níveis superior e inferior para o filtro CCI.
  • Nova função de otimização “Ajuste por razao”.
  • Novo modo de entrada para o robô RC-Stochastic baseado no cruzamento das linhas K e D.
  • Correções e melhorias no robô RC-IFR-2.
  • Criada opção no RC-PontoContinuo para aguardar o toque na média para definir o ponto de entrada, no caso de entrada ao tocar na média. Anteriormente as condições eram verificadas somente no início da barra (que continua o padrão), então dependendo da combinação de filtros poderia gerar entradas indevidas.
  • Adicionada a verificação do número mínimo de trades para todas as funções de otimização.
  • Incluídos novos modos de funcionamento para o filtro VolatilityChannel, fazendo comparações com a média.
  • Novo parâmetro com um segundo valor de referência para o filtro BBW.
  • Novo parâmetro “B.05 Volume maximo permitido” que permite definir um limite máximo para as estratégias com volume progressivo, evitando o crescimento indefinido. Se estiver como zero, não aplica nenhum limite. Qualquer valor maior que zero será usado como limitador na definição do volume a ser operado.
  • Adicionados valores e informações nas mensagens de correção de slippage, realização parcial e acréscimo de posicao.
  • Nova opção: ” V.02.15 Atualizar RP em relacao ao novo preco medio” (que também funciona para a realização dos aumentos).
  • Incluído novo parâmetro no robô RC-MeanReversal para evitar entradas se o preço já estiver além das bandas: “R.15.9.2 Bloquear entradas se estiver alem do afastamento”. Neste caso, para a opção funcionar corretamente o parâmetro “R.15.9.1 Aguardar superação do afastamento para colocar ordens” deve ficar selecionado como false.
  • Implementada rotina para salvar em arquivo os arrays de posições abertas e ordens pendentes, para permitir a restauração dos dados no caso de reinicialização do robô. A função restorePositionInfo passou a priorizar o carregamento de informações a partir do arquivo salvo, e se não tiver sucesso tenta obter os dados a partir do histórico. Da mesma forma, se o robô detectar uma ordem pendente já existente, vai tentar restaurar as informações salvas e, caso não consiga, enviará um cancelamento da ordem.

Correção de bugs

  • Correções de caminho para o indicador hma, incluído como #resource.
  • Retirada do indicador RAFI da biblioteca TradeFilterLib. Usuários que precisem deste filtro podem utilizar como filtro personalizado. Agora só serão incluídos nos robôs indicadores que tiverem o código fonte aberto, para permitir recompilação com novas versões do MetaTrader.
  • Correção do erro na atualização dos stops que, em algumas situações, estava disparando o breakeven logo no início do trade, quando se tinha a atualização dos stops “a cada nova barra”.
  • Incluídos pontos de saída da função checkPrices quando é realizado o fechamento de posições ou cancelamento de triggers. Em algumas situações ocorria o bloqueio de novas operações pelo robô após duas tentativas de fechamento simultâneo da posição.
  • Corrigida abertura de arquivos com sinais do SignalTrader para aceitar leitura e escrita compartilhada. Incluída proteção para avisar usuário caso o SignalTrader seja configurado para publicar posições com o mesmo nome do sinal monitorado, o que pode causar um loop no envio de ordens.
  • Corrigida a função de stop no tempo, que atuava indevidamente logo após a abertura da posição quando o número de barras era definido como 1.
  • Correção nos procedimentos de ‘realização parcial usando ordem limit’ e a opção ‘V.01.22’ (fazer RP apenas após aumento de mesmo nível), que não estava funcionando com Ordens Limit.
  • Correção em ‘checkPartialProfit’: quando usada a opção V.01.22 ‘Fazer RP apenas apos aumento de mesmo nivel’, em conta Hedge, estava fazendo a baixa total da posição ‘origem’ e, deixando como posição aberta o ‘aumento’. Agora, baixa primeiro os aumentos e depois, se for o caso, parcialmente a posição origem.