Book de ofertas das opções B3

 

Pessoal, tudo bem?

Gostaria de ajuda de vocês para tentar resolver um problema. Eu desenvolvi um EA que faz análise de algumas operações estruturadas (opções de ações). Basicamente eu pego as informações das opções para identificar se o lucro máximo e o prejuízo máximo da estrutura me atendem com base nos meus parâmetros.

Estou tendo o seguinte problema com o EA: Quando eu abro o MT5 e imediatamente executo o EA, ele consegue obter várias informações das opções selecionadas para análise. Strike, data de vencimento, tudo isso o EA reconhece. Porém, ele não consegue obter justamente os preços BID e ASK. Justo as informações que são comuns entre os demais ativos (por exemplo, BID e ASK do papel que pretendo incluir na estrutura o robô obtém normalmente).

Como eu estou obtendo os valores BID e ASK das opçoes? Bom... se eu abrir o metatrader e rodar imediatamente o robô ele não carrega os valores. Mas se posterior a isso eu carregar o QUADRO DE OPÇÕES dos ativos e dos vencimentos que eu pretendo analisar, aí sim o EA obtém os valores normalmente e o robô funciona da forma como eu o programei. Segue imagem em anexo para melhor entendimento.

Já tentei usar várias funções no código para obter o BID e o ASK, como:

- MarketBook com a estrutura MqlBookInfo

- CopyTick

SymbolInfoDouble(nomeOpcao,SYMBOL_ASK) (esta é a que eu deixei no código do EA).

Porém, para todas elas, os valores apresentados são sempre 0 (zero) até que eu faça o procedimento com o QUADRO DE OPÇÕES.

Então queria ver com vocês se já passaram por este problema e se conhecem alguma solução para tal. Preciso de uma forma automática de obter este book das opções, para não ter que ficar clicando no quadro de opções todas as vezes que eu iniciar o METATRADER 5.


Desde já agradeço a atenção.

Arquivos anexados:
 
Joao Henrique:

Pessoal, tudo bem?

Gostaria de ajuda de vocês para tentar resolver um problema. Eu desenvolvi um EA que faz análise de algumas operações estruturadas (opções de ações). Basicamente eu pego as informações das opções para identificar se o lucro máximo e o prejuízo máximo da estrutura me atendem com base nos meus parâmetros.

Estou tendo o seguinte problema com o EA: Quando eu abro o MT5 e imediatamente executo o EA, ele consegue obter várias informações das opções selecionadas para análise. Strike, data de vencimento, tudo isso o EA reconhece. Porém, ele não consegue obter justamente os preços BID e ASK. Justo as informações que são comuns entre os demais ativos (por exemplo, BID e ASK do papel que pretendo incluir na estrutura o robô obtém normalmente).

Como eu estou obtendo os valores BID e ASK das opçoes? Bom... se eu abrir o metatrader e rodar imediatamente o robô ele não carrega os valores. Mas se posterior a isso eu carregar o QUADRO DE OPÇÕES dos ativos e dos vencimentos que eu pretendo analisar, aí sim o EA obtém os valores normalmente e o robô funciona da forma como eu o programei. Segue imagem em anexo para melhor entendimento.

Já tentei usar várias funções no código para obter o BID e o ASK, como:

- MarketBook com a estrutura MqlBookInfo

- CopyTick

SymbolInfoDouble(nomeOpcao,SYMBOL_ASK) (esta é a que eu deixei no código do EA).

Porém, para todas elas, os valores apresentados são sempre 0 (zero) até que eu faça o procedimento com o QUADRO DE OPÇÕES.

Então queria ver com vocês se já passaram por este problema e se conhecem alguma solução para tal. Preciso de uma forma automática de obter este book das opções, para não ter que ficar clicando no quadro de opções todas as vezes que eu iniciar o METATRADER 5.


Desde já agradeço a atenção.

CARA você esta confuso, você esta achando que OPÇÕES funcionam igual AÇÕES .... uma coisa nada tem haver com a outra .... opções tem prazo de vencimento, e ações não ... o simples fato de isto acontecer faz toda a diferença ... mercado de opções se parece muito mais com o mercado de futuros do que com o mercado de ações, isto pelo ponto de vista do EA, ou seja cada uma das opções ( ISTO DENTRO DO MESMO VENCIMENTO ) é como se fosse um ativo diferente, ou seja se o vencimento da opção é igual, mas o strike não ... isto indica que se trata de um ativo diferente ... é meio complicado de entender, mas é assim que é o mercado de opções e é desta forma que você tem que construir o EA, então para que o seu EA consiga ler os dados de BID CALL ---- ASK CALL ---- BID PUT ----- ASK PUT .... você terá que tratar cada uma das opções como se fosse um ativo, e então fazer o seu EA navegar pelo quadro usando algum loop até conseguir ler os dados que você precisa ... um detalhe não espere milagres, já que opções tem vida própria e em alguns momentos ficam sem liquidez e neste ponto o EA irá indicar um valor igual a 0 ou algum valor aparentemente absurdo ... espero ter ajudado ....

 
Daniel Jose #:

CARA você esta confuso, você esta achando que OPÇÕES funcionam igual AÇÕES .... uma coisa nada tem haver com a outra .... opções tem prazo de vencimento, e ações não ... o simples fato de isto acontecer faz toda a diferença ... mercado de opções se parece muito mais com o mercado de futuros do que com o mercado de ações, isto pelo ponto de vista do EA, ou seja cada uma das opções ( ISTO DENTRO DO MESMO VENCIMENTO ) é como se fosse um ativo diferente, ou seja se o vencimento da opção é igual, mas o strike não ... isto indica que se trata de um ativo diferente ... é meio complicado de entender, mas é assim que é o mercado de opções e é desta forma que você tem que construir o EA, então para que o seu EA consiga ler os dados de BID CALL ---- ASK CALL ---- BID PUT ----- ASK PUT .... você terá que tratar cada uma das opções como se fosse um ativo, e então fazer o seu EA navegar pelo quadro usando algum loop até conseguir ler os dados que você precisa ... um detalhe não espere milagres, já que opções tem vida própria e em alguns momentos ficam sem liquidez e neste ponto o EA irá indicar um valor igual a 0 ou algum valor aparentemente absurdo ... espero ter ajudado ....

Daniel, obrigado pela resposta e disponibilidade.

Desculpe se não deixei clara minha dúvida, mas vamos lá.

Primeiramente, eu estudo opções a mais de 2 anos e monto estruturas desde então. Já estou elaborando meu próprio educacional sobre opções (sou investidor e educador financeiro). Ou seja, eu sei muito bem como as opções funcionam, sei a diferença entre opções e ações, sei que muitas não tem liquidez aqui no BR, etc. Enfim, entendo toda a dinâmica deste tipo de ativo.

Agora vamos ao meu problema: Se eu colocar o seguinte comando no EA

 SymbolInfoDouble(PETR4,SYMBOL_ASK);

ele retorna a informação que eu preciso, ou seja, ou valor ASK da ação PETR4, sem que eu faça intervenções manuais na interface do MT5

Agora, se eu colocar o comando

 SymbolInfoDouble(PETRE280,SYMBOL_ASK); //(este nome PETRE280 eu coloquei como exemplo, não sei se existe esta opção mas a nomenclatura tem este formato)

considerando que a opção tenha liquidez, tenha intenções no BOOK, ao meu ver o EA deveria me retornar o valor ASK da opção PETRE280 através do comando acima. Porém, ele não retorna e esta é minha dificuldade. Ele só passa a retornar este valor se eu for MANUALMENTE no quadro de opções e carregar as opções de PETR4. Aí sim o robô passa a funcionar sem que eu altere o código, pois o comando que citei funciona após eu executar o procedimento manual no quadro de opções.

O EA consegue obter normalmente, sem nenhuma intervenção manual na plataforma, o STRIKE da opção por exemplo (que é uma informação bem específica deste tipo de ativo, mas que o EA carrega normalmente quando executo comando para tal). Porém, a informação que é "comum" entre todo tipo de ativo na bolsa (preços BID e ASK) o EA não consegue obter se o ativo for uma opção.

E aí você escreveu " você terá que tratar cada uma das opções como se fosse um ativo..." e isso eu já faço. Você também escreveu " fazer o seu EA navegar pelo quadro usando algum loop até conseguir ler os dados que você precisa". Eu faço o LOOP para ler as opções de um determinado ativo, mas não tenho como base o quadro de opções. Eu "monto" o nome da opção através da regra de nomenclatura (sigla do ativo + letra que representa tipo e mês de vencimento + sequencia de números que representam o strike), identifico se é um ativo que existe no mercado e, se existir, obtenho as informações que preciso.

E com isso te faço uma nova pergunta: você conhece o comando MQL5 que faça esta navegação pelo quadro de opções? É justamente o que eu preciso, realizar a carga dos dados do quadro de opções de forma automatizada. Isso resolve meu problema pois eu não precisaria fazer esta navegação de forma manual e o EA iria reconhecer os valores.

Novamente, obrigado pela disponibilidade e atenção.

 

Pessoal, deixando um código simplificado para melhor compreensão do meu problema. Atentem-se para os comentários no código.

Agraço a quem puder ajudar.

//Quando eu abro o MT5, carrego o EA SEM ANTES CARREGAR O QUADRO DE OPÇÕES MANUALMENTE

   string nomeOpcaoCall = "";
   datetime dataVencimentoCall;
   double strikeCall = 0;
   double precoBIDCall = 0;

   nomeOpcaoCall = "PETRE318";

   if (SymbolInfoInteger(nomeOpcaoCall, SYMBOL_EXIST)) //Obtem o resultado correto
   {
      dataVencimentoCall = SymbolInfoInteger(nomeOpcaoCall, SYMBOL_EXPIRATION_TIME); //Obtem o resultado correto
      strikeCall = SymbolInfoDouble(nomeOpcaoCall, SYMBOL_OPTION_STRIKE); //Obtem o resultado correto
      precoBIDCall = SymbolInfoDouble(nomeOpcaoCall,SYMBOL_BID); //NÃO obtem o resultado correto, sempre retorna zero.
   }


//Mesmo código acima, quando eu abro o MT5, CARREGO MANUALMENTE O QUADRO DE OPÇÕES DE PETR4 VENC. 20/05/2022 e em seguida carrego o EA.

   string nomeOpcaoCall = "";
   datetime dataVencimentoCall;
   double strikeCall = 0;
   double precoBIDCall = 0;

   nomeOpcaoCall = "PETRE318";

   if (SymbolInfoInteger(nomeOpcaoCall, SYMBOL_EXIST)) //Obtem o resultado correto
   {
      dataVencimentoCall = SymbolInfoInteger(nomeOpcaoCall, SYMBOL_EXPIRATION_TIME); //Obtem o resultado correto
      strikeCall = SymbolInfoDouble(nomeOpcaoCall, SYMBOL_OPTION_STRIKE); //Obtem o resultado correto
      precoBIDCall = SymbolInfoDouble(nomeOpcaoCall,SYMBOL_BID); //Passa a obter o valor correto, preço BID no BOOK do ativo (caso tenha oferta).
   }
 
Joao Henrique #:

Pessoal, deixando um código simplificado para melhor compreensão do meu problema. Atentem-se para os comentários no código.

Agraço a quem puder ajudar.

Olá João,

para resolver seu problema, leia esse tópico:  Organizando Acesso aos Dados - Séries Temporais e Acesso a Indicadores - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5

Documentação sobre MQL5: Séries Temporais e Acesso a Indicadores / Organizando Acesso aos Dados
Documentação sobre MQL5: Séries Temporais e Acesso a Indicadores / Organizando Acesso aos Dados
  • www.mql5.com
Organizando Acesso aos Dados - Séries Temporais e Acesso a Indicadores - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 

Rogério, muito obrigado pela sua resposta.

O tópico que você citou ajudou a resolver meu problema. Utilizei o comando "SeriesInfoInteger" para sincronizar as informações previamente. Como são muitos ativos (muitas opções) o robô ficou um pouco lento, mas nada que atrapalhe o resultado final (ele não executa as operações, só faz o rastreamento da estrutura).

Segue o código funcional para melhor entendimento.


   string nomeOpcaoCall = "";
   string nomeAtivo = "";
   datetime dataVencimentoCall;
   double strikeCall = 0;
   double precoBIDCall = 0;

   nomeAtivo = "PETR4";
   nomeOpcaoCall = "PETRE318";

   if (SymbolInfoInteger(nomeOpcaoCall, SYMBOL_EXIST)) //Obtem o resultado correto sempre
   {
      while(!SeriesInfoInteger(nomeAtivo,PERIOD_D1,SERIES_SYNCHRONIZED) && !IsStopped())
         Sleep(5);
      while(!SeriesInfoInteger(nomeOpcaoCall,PERIOD_D1,SERIES_SYNCHRONIZED) && !IsStopped())
         Sleep(5);
         
      dataVencimentoCall = SymbolInfoInteger(nomeOpcaoCall, SYMBOL_EXPIRATION_TIME); //Obtem o resultado correto sempre
      strikeCall = SymbolInfoDouble(nomeOpcaoCall, SYMBOL_OPTION_STRIKE); //Obtem o resultado correto sempre
      precoBIDCall = SymbolInfoDouble(nomeOpcaoCall,SYMBOL_BID); //Passou a obter o resultado correto sem necessidade de intervenção manual
   }