Um checklist dos riscos dos robôs antes de operar em conta real - página 9

 
Trader_Patinhas:

Um dos melhores tópicos do fórum!

Aprendi muito!

Parabéns!

Obrigado @Trader_Patinhas, vamos em frente que riscos, erros e falhas é que não faltam nesse universo dos robôs, embora eles tenham chegado para ficar e dominem cada vez mais o mercado.
Sds.,
Rogério Figurelli

 

Pessoal,

Independentemente do mérito ou de quem é a culpa, considero a thread https://www.mql5.com/pt/forum/309198 como um bom case de estudo para o item 13 abaixo:

13. Existe proteção contra falhas nos valores dos preços recebidos para os instrumentos financeiros, como por exemplo valores zerados ou com erros grosseiros?

Sds.,
Rogério Figurelli

Corretora XP - Erro em BBDC4
Corretora XP - Erro em BBDC4
  • 2019.04.01
  • www.mql5.com
Gostaria de saber se mais alguém teve esse problema do gráfico BBCD4 no dia 1º de Abril... (poderia até ser mentira, mas não é...
 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Você tem alguma questão sobre Programação, com código fonte exemplo! Pergunte Aqui!

Rogerio Figurelli, 2019.04.10 23:54

Olá @Joscelino Celso de Oliveira,
Perfeitamente, agora ficou mais claro seu questionamento, que considero um ponto bastante relevante, principalmente para segurança de operações na B3.
Acredito que não existe uma forma determinística de garantir essa sincronização no MT5 apenas do lado do cliente, principalmente porque o robô depende de toda configuração e arquitetura cliente/servidor de cada corretora.
Dessa forma, nessa questão, sou bastante conservador, e utilizo uma abordagem de buscar trabalhar com o máximo de informações que a plataforma disponibiliza, como por exemplo validar a abertura e fazer o acompanhamento de posições, para comparar com a realidade de mercado e com a realidade apresentada nos dados do ativo em tempo real, de forma a poder agir imediatamente no caso de detecção de algum problema de sincronização.
Em outra palavras, infelizmente, me parece que a tecnologia para isso, do lado do cliente, está mais em trabalhar nos efeitos que nas causas dos problemas, uma vez que nem sempre esses problemas de sincronização são de simples detecção.
Evidentemente que essa abordagem está considerando apenas uma plataforma MT5 e corretora específica, pois sem dúvida é possível pensar em abordagens com arquiteturas bem mais complexas e de maior investimento, como tipicamente em sistemas organizacionais e com maior volume operacional, mas que no meu entender perdem o sentido em termos de custo/benefício para serem disseminadas para a maior parte dos usuários aqui nesse fórum.
Espero ter ajudado.
Sds.,
Rogério Figurelli


 

 Bom dia pessoal.

Primeiramente desculpa por ressuscitar o tópico mas é que eu sou iniciante (apenas sonhando em desenvolver um EA funcional para Bovespa) e achei esse tópico sensacional, um dos melhores do fórum todo com certeza, leitura obrigatória para qualquer um que quiser começar nesse mundo. 


Parabéns ao @Rogerio Figurelli por posta-lo. 


Todavia, eu fiquei com algumas duvidas por falta de exemplificação, não sei se eu entendi direito certos itens do checklists que o Rogério postou ou como cumpri-los corretamente, afinal eu nem programador sou, sou apenas uma pessoa que gosta de aprender coisas no tempo livre.


Então se me permitem, gostaria de escrever o que entendi de cada item do checklist e o jeito de cumpri-lo.


1-Existe tratamento para todas as situações de exceção das funções chamadas internamente pelo EA?

Pelo o que eu entendi, todas funções devem ter seu retorno checadas com if e caso não retornem o que seja esperado, é preciso ter algum tratamento. Então por exemplo:

int OnInit()
  {
double arr[];    
if(ArraySetAsSeries(arr, true) == false) return(INIT_FAILED);
   return(INIT_SUCCEEDED);
  }

Só fiquei com dúvida em relação a funções que não é possível checar com precisão o seu retorno porque justamente seu valor de retorno será usada posteriormente no código, como SymbolInfoDouble(_Symbol, SYMBOL_BID);


2-O fechamento de posições é garantidamente realizado antes da abertura de uma nova posição contrária utilizando um mesmo lote?

Para isso seria necessário checar o código de retorno de uma posição para abrir a contrária?

if(condição para compra)
{
 trade.buy(volume, _Symbol);
 if(trade.ResultRetcode() == TRADE_RETCODE_DONE || trade.ResultRetcode() == TRADE_RETCODE_PLACED) bool VendaAutorizada = true;

};
 if(condição para venda && VendaAutorizada == true)
{

trade.sell(volume, _Symbol)
if(trade.ResultRetcode() == TRADE_RETCODE_DONE || trade.ResultRetcode() == TRADE_RETCODE_PLACED) VendaAutorizada = false;

};


Obs: deve ser feito a mesma checagem para compra, mas para deixar mais simples, só fiz para venda. 


3-Foram feitos testes de situações de latência em conta real que não são visualizadas nas simulações em contas demonstração e no backtesting?

Essa eu realmente não entendi como poderia ser feito.


4-Existe limitação de lote encaminhado por falha ou erro do EA?

O artigo postado pelo Rogerio explica perfeitamente


5-Existe limitação de margem e saldo em conta para operação, principalmente no caso de falha ou erro do EA?

Aqui, eu penso em usar a Struct MqlTradeCheckResult para verificar se há margem e saldo  antes de enviar a ordem, além disso, usando a função AccountInfoDouble eu posso verificar a margem que eu possuo disponível. Eu acho, inclusive, interessante deixar uma boa margem de segurança (em relação a margem da conta) para o robô não ser stoppado pela corretora, então seria preciso criar uma regra que se a margem se aproximasse de uma determinada margem minima o robô pararia de enviar ordens para aumentar sua posição. 

6-Existe tratamento para situações de exceção de conectividade ou de disponibilidade do sistema operacional e da plataforma?

Aqui, eu usaria a solução apresentada pelo Andrew R. Young no livro Expert Advisor Programming, porém, a solução foi desenvolvida para o mercado Forex, não sei se seria o suficiente para BMF Bovespa. A solução consiste em usar um loop Do-While para continuar tentando o envio de uma ordem até ela ser aceita pela corretora:

int retryCount = 0;
int checkCode = 0;
do
{
if(pType == ORDER_TYPE_BUY) request.price = SymbolInfoDouble(pSymbol,SYMBOL_ASK);
else if(pType == ORDER_TYPE_SELL) request.price = SymbolInfoDouble(pSymbol,SYMBOL_BID);
OrderSend(request,result);
checkCode = CheckReturnCode(result.retcode);
if(checkCode == CHECK_RETCODE_OK) break;
else if(checkCode == CHECK_RETCODE_ERROR)
{
string errDesc = TradeServerReturnCodeDescription(result.retcode);
Alert("Open market order: Error ",result.retcode," - ",errDesc);
break;
}
else
{
Print("Server error detected, retrying...");
Sleep(RETRY_DELAY);
retryCount++;
}
}
while(retryCount < MAX_RETRIES);


7- O robô consegue operar por mais de 5 dias consecutivos de forma totalmente automática sem necessitar intervenções manuais?

Eu nunca nem testei robôs, nem na DEMO (só backtesting) então, só irei descobrir, quem sabe, no futuro isso kkk


8-Existe verificação e controle das ordens executadas e das situações de exceção na comunicação com o servidor da corretora?

Essa parte eu não entendi direito, sobre a exceção na comunicação com o servidor da corretora, o código no item 6 já resolveria? Agora sobre a verificação de controle de ordens executadas, não entendi o que você quiser exatamente.


9-Existe definição de limites operacionais e análise das posições atuais no que se refere à adequação às situações limites definidas?

Então, nesse item eu pensei em criar um mecanismo para detectar o valor atual da posição e colocar algum limite máximo, que se fosse passado o robô seria desligado.

PositionSelect(_Symbol);
double VolumeFinanceiro = PositionGetDouble(POSITION_VOLUME)*PositionGetDouble(POSITION_PRICE_OPEN);
if(VolumeFinanceiro > VolumeMaximo)
{
 Parar o robô e alertar ao usuário
};

Não sei se esse código ficaria redundante com o do item 5, mas é como dizem por ai better save than sorry.


10-Existe um modo de pânico no Expert Advisor para administrar situações de risco de perda de capital por falhas ou erros dos algoritmos?

Penso em fazer algo +/- assim:

OnTick() {
PositionSelect(_Symbol);
if(PositionGetDouble(POSITION_PROFIT) < MaxPrejuizo)
{
 Parar o robô e alertar o usuário
};
}

11-Você compara os trades executados pela plataforma MT5 e pelo home-broker?

Bom, nesse item acho que não tem nada programável que possa ser feito, né? 

12-Existe controle de risco para operações sem limite de perda, como abertura de venda a seco de opções?

Nunca mexi com opções na minha vida e não pretendo mexer por enquanto, talvez por isso nem entendi direit o que você quis dizer kkk


13-Existe proteção contra falhas nos valores dos preços recebidos para os instrumentos financeiros, como por exemplo valores zerados ou com erros grosseiros?

Na corretora que eu uso (Clear), isso já acontece automaticamente no pit de negociação (se eu enviar uma ordem de valor discrepante ela é rejeitada), não sei se através do Metatrader também é assim? Queria até deixar a pergunta.

Mas se fosse criar um código, acho que eu teria que comparar o preço da ordem com o preço de fechamento do dia anterior ou algo assim, se fosse mais de 10% de diferença o robô não enviaria a ordem. 


14-Existe proteção contra mudanças abruptas de volumes e preços dos instrumentos financeiros?

Acho que seria importante usar uma variável VolumeMaximo para fazer com que o Volume usado para compra e venda fosse no máximo determinado Volume.

Quanto mudanças abruptas de preço, a solução seria comparar com alguns candles anteriores? 


15-Existe limitação de perda máxima a partir de uma sequencia de StopLoss?

Se o stoploss fosse acionado umas 3x consecutivos deveria ser alertado ao usuário. Não sei escrever um código assim agora...


16-Existe proteção contra quedas ou indisponibilidade do servidor MT5 na corretora?

Esse também é outro ponto que eu acho meio complicado. Se a corretora ou o servidor caiu por muito tempo, vai acontecer que o código no item 6 chegará no MaxRetries e quando isso acontecer, o usuário deve ser alertado, a partir desse ponto, acho que o usuário deve saber o que fazer.


17-Existe proteção de limite nos loops do código fonte?

Nesse ponto, acho que bastaria fazer algo assim

for(int i = 0; i < Loops; i++)
{
 (Execução do código)
 if(Loops > MaxLops) break;
};



18-O código fonte que você está utilizando já foi testado em conta real na BM&FBovespa?

Ainda não.


19-O código fonte foi testado em contas no modo netting e hedging?

Nesse ponto eu fiquei com uma dúvida, afinal, pelo o que eu andei lendo, existem diferenças entre o modo Nett e o Hedge na hora de enviar ordens e na parte do stoploss, então, me corrijam se eu estiver errado, mas eu acho que um código que funcionasse na conta Nett não funcionaria logo de cara no modo Hedge sem alterações.


20-Existem proteções contra falhas de outros robôs, se esses forem colocados em paralelo, por engano ou propositalmente, com seu robô?

Seria necessário colocar um magic number diferente em cada EA certo? Acho que isso seria um bom começo. Na conta hedge o EA consegue identificar ordens distintas, agora na conta Nett não, então eu não sei ao certo como fazer na conta nett.


Enfim, obrigado pra quem leu até o fim. 

Eu realmente nunca fiz um robô em conta real e embora eu esteja bem ansioso pra fazer um, também morro de medo de dar algum problema e acabar perdendo muito dinheiro. Então, talvez possa ter vários erros nos códigos que eu coloquei aqui.

Esse tópico foi de muita ajuda pra mim, então queria agradecer, de novo, o Rogério por cria-lo e também todo mundo, que comentou nesse post, a fim de ajudar a elucidar esse tema tão importante.


Abs.

 
HT Saul:

 Bom dia pessoal.

Primeiramente desculpa por ressuscitar o tópico mas é que eu sou iniciante (apenas sonhando em desenvolver um EA funcional para Bovespa) e achei esse tópico sensacional, um dos melhores do fórum todo com certeza, leitura obrigatória para qualquer um que quiser começar nesse mundo. 


Parabéns ao @Rogerio Figurelli por posta-lo. 


Todavia, eu fiquei com algumas duvidas por falta de exemplificação, não sei se eu entendi direito certos itens do checklists que o Rogério postou ou como cumpri-los corretamente, afinal eu nem programador sou, sou apenas uma pessoa que gosta de aprender coisas no tempo livre.


Então se me permitem, gostaria de escrever o que entendi de cada item do checklist e o jeito de cumpri-lo.

...

Olá  HT Saul, antes de mais nada, excelente post e obrigado pelo comentário a meu respeito.

Pela necessidade de "ressuscitar o tópico" e suposta popularidade dessa thread, de duas, uma: ou nossos robôs já estão todos seguros e não precisam mais de análise nesse sentido, ou estamos deixando de lado a segurança, acreditando que esse é um assunto resolvido e sem riscos!

Seja como for, na minha opinião, segurança é um processo, e não um ponto final, e portanto seus ótimos comentários podem ajudar muito nesse sentido.

Para não contaminar as respostas, e colaboração dos colegas, vou começar abordando o primeiro item e pergunta: 1-Existe tratamento para todas as situações de exceção das funções chamadas internamente pelo EA?

Pelo que você entendeu, "todas funções devem ter seu retorno checadas com if e caso não retornem o que seja esperado, é preciso ter algum tratamento". Eu diria que está correto, em parte, pois o mínimo que deve ser feito é checar o retorno das funções. 

Mas o ponto principal são as exceções, e como já foi discutido em vários pontos nesse Fórum, um dos problemas do MT4/MT5 é não prever o tratamento de exceções. Dessa forma, considero o mais seguro para qualquer robô prever uma possível exceção em toda e qualquer rotina utilizada, principalmente nas chamadas de função. 

Como por exemplo um retorno de valor fora da faixa prevista em documentação, um grande delay ou até mesmo travamento no retorno, no pior caso.

Para ser mais pragmático, vou citar um exemplo real: imagine que você está operando com uma exposição grande, e em determinado ponto decide chamar um Sleep(). O que acontece se o Sleep() dormir, literalmente, para sempre?

Não por menos, esse é um exemplo de função que evito ao máximo, pois me pare tão crítica quanto o GO TO de linguagens de programação do passado.

E esse é um ponto também relevante: muitas vezes a melhor decisão de segurança está em evitar o que tem maior chances de riscos. 

E qualquer programador tem essa decisão nas mãos.

Sds.,
Rogério Figurelli

 

Como por exemplo um retorno de valor fora da faixa prevista em documentação, um grande delay ou até mesmo travamento no retorno, no pior caso.

Para ser mais pragmático, vou citar um exemplo real: imagine que você está operando com uma exposição grande, e em determinado ponto decide chamar um Sleep(). O que acontece se o Sleep() dormir, literalmente, para sempre?


Olá Rogério, obrigado por responder. 

Sobre esse seu comentário, eu fiquei pensando, seria a linguagem MQL5 tão instável assim? Vc disse que o exemplo é real, então suponho que vc já viu isso acontecendo? 

Nossa se o MQL5 for tão instável assim perde completamente sua funcionalidade, de criar sistemas de automatização de trading confiáveis.

Abs.
 
HT Saul:
Olá Rogério, obrigado por responder. 

Sobre esse seu comentário, eu fiquei pensando, seria a linguagem MQL5 tão instável assim? Vc disse que o exemplo é real, então suponho que vc já viu isso acontecendo? 

Nossa se o MQL5 for tão instável assim perde completamente sua funcionalidade, de criar sistemas de automatização de trading confiáveis.

Abs.

Olá  HT Saul, obrigado por compartilhar mas note que o que eu comentei é um caso pragmático utilizando de fato funções do MQL5, para sair da teoria, mas isso não tem nada a ver com experiência de utilização em conta real, que me parece que foi sua leitura. Por exemplo, para ficar mais claro, se você fizer uma busca nesse site, verá que o uso do Sleep() é feito de forma disseminada e constante, no meu entender nem sempre com uma abordagem segura ou que considero necessária, e é apenas esse o ponto que estou referindo.
Quanto à confiabilidade, como já comentei várias vezes nesse fórum, considero o MQL5 e o MT5 uma plataforma estável e com uma grande vantagem competitiva sobre outras plataformas, por ter o expertise internacional, com uma grande comunidade, não apenas em mercado acionário, mas no mercado de maior volume, que envolve o câmbio internacional, que é o Forex.
Seja como for, no meu entender, a questão não é apenas o MQL5 ser ou não instável ou confiável, mas sim as falhas e erros sistêmicos. Para ajudar nesse entendimento, imagine que você tem todos cuidados de segurança com seu carro, e é um motorista dedicado e disciplinado, mas mesmo assim quando for enfrentar o trânsito, vai encontrar erros e falhas sistêmicos, como por exemplo outros motoristas sem a mesma dedicação, ou problemas de sinalização, manutenção dos veículos, engarrafamentos, etc., etc.
E, nesse sentido, toda e qualquer plataforma terá seus pontos fortes e fracos, já que a automação de operações, principalmente em nosso mercado, ou ainda quando envolve maior exposição, não é nada simples, e não podemos subestimar a incerteza e complexidade de todo sistema e o grande crescimento de tecnologias na área, em constante evolução, que, se por um lado trazem melhores condições de competitividade, por outro lado aumentam a exposição para falhas e erros.
Sds.,
Rogério Figurelli

 
Rogerio Figurelli:

Parabéns pela discussão de alto nível.


É lendário que não se pode rodar Scalper na B3, com muito estudo e muiiiiiiitas verificações de segurança conseguimos rodar Scalper com alvos curtíssimos na B3.
De toda forma só foi viabilizado monitorando tudo que a corretora ocasiona de falhas no Trade.
Infelizmente um alerta que o robô já está sem o que fazer é exibido ao Trader que fica ciente e pode tomar suas providências, digo infelizmente por que em uma janela mensal é difícil um assinante que fique sem receber esse alerta, todos sabem que após o RLP a infra de TI das corretoras piorou drasticamente.

 

Rogério,

Fantástico tópico! Estou usando ele de base para repaginar passo-a-passo do meu EA. 

Parabéns ao seu trabalho e dos demais que somaram conteúdo neste tópico muito bacana :)

 

Estou utilizando essa lista para verificar o meu programa. Durante os testes, descobri um comportamento que eu não tinha imaginado. Ao enviar uma ordem no mini indice essa ordem ficou muito tempo na fila. Acho que aconteceu um congestionamento de ordens e deu tempo de eu ver que estava travada, tentar cancelar na mão (porque achei que tinha acontecido um erro), fechar e abrir novamente o Metatrader... Pensei que tinha acontecido algum erro e a ordem tinha ficado "fantasma". Mas depois de algum tempo ela foi executada.

Pensando nesse travamento, imaginei o seguinte: se o robô não testar se existe uma ordem "enfileirada", ele pode se enganar e enviar algum tipo de ordem "duplicada". Então coloquei um teste no programa para esperar caso exista no histórico de ordens do dia alguma ordem com os estados:


                                        ORDER_STATE_STARTED
                                        ORDER_STATE_REQUEST_ADD
                                        ORDER_STATE_REQUEST_MODIFY
                                        ORDER_STATE_REQUEST_CANCEL

Na documentação tem os estados possíveis, de ENUM_ORDER_STATE 

A ideia é esperar caso exista alguma ordem na fila.

Ainda não testei isso (e estou em duvida sobre o significado desses estados). Então vou registrar no log caso ocorra essa situação de travamento novamente.

Razão: