Como identificar opções?

Gustavo Enedir Hennemann  

Bom dia,

Estou tentando selecionar as opções da lista "Observação do Mercado" e colocá-las em um array para posterior processamento, mas não encontrei uma propriedade de diferencie ações e opções.

Estou usando o seguinte código pra teste:

string symbol = Symbol();
ENUM_SYMBOL_CALC_MODE symbol_calc_mode;
ENUM_SYMBOL_TRADE_MODE symbol_trade_mode;
ENUM_SYMBOL_OPTION_MODE symbol_option_mode;
ENUM_SYMBOL_OPTION_RIGHT symbol_option_right;
double strike;

symbol = "WINJ18";
symbol_calc_mode = SymbolInfoInteger(symbol, SYMBOL_TRADE_CALC_MODE);
symbol_trade_mode = SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE);
symbol_option_mode = SymbolInfoInteger(symbol, SYMBOL_OPTION_MODE);
symbol_option_right = SymbolInfoInteger(symbol, SYMBOL_OPTION_RIGHT);
strike = SymbolInfoDouble(symbol, SYMBOL_OPTION_STRIKE);
Print(symbol + " symbol_calc_mode: " + EnumToString(symbol_calc_mode));
Print(symbol + " symbol_trade_mode: " + EnumToString(symbol_trade_mode));
Print(symbol + " symbol_option_mode: " + EnumToString(symbol_option_mode));
Print(symbol + " symbol_option_right: " + EnumToString(symbol_option_right));
Print(symbol + " strike: " + strike);

symbol = "PETR4";
symbol_calc_mode = SymbolInfoInteger(symbol, SYMBOL_TRADE_CALC_MODE);
symbol_trade_mode = SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE);
symbol_option_mode = SymbolInfoInteger(symbol, SYMBOL_OPTION_MODE);
symbol_option_right = SymbolInfoInteger(symbol, SYMBOL_OPTION_RIGHT);
strike = SymbolInfoDouble(symbol, SYMBOL_OPTION_STRIKE);
Print(symbol + " symbol_calc_mode: " + EnumToString(symbol_calc_mode));
Print(symbol + "  symbol_trade_mode: " + EnumToString(symbol_trade_mode));
Print(symbol + "symbol_option_mode: " + EnumToString(symbol_option_mode));
Print(symbol + " symbol_option_right: " + EnumToString(symbol_option_right));
Print(symbol + " strike: " + strike);

symbol = "PETRD76";
symbol_calc_mode = SymbolInfoInteger(symbol, SYMBOL_TRADE_CALC_MODE);
symbol_trade_mode = SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE);
symbol_option_mode = SymbolInfoInteger(symbol, SYMBOL_OPTION_MODE);
symbol_option_right = SymbolInfoInteger(symbol, SYMBOL_OPTION_RIGHT);
strike = SymbolInfoDouble(symbol, SYMBOL_OPTION_STRIKE);
Print(symbol + " symbol_calc_mode: " + EnumToString(symbol_calc_mode));
Print(symbol + " symbol_trade_mode: " + EnumToString(symbol_trade_mode));
Print(symbol + " symbol_option_mode: " + EnumToString(symbol_option_mode));
Print(symbol + " symbol_option_right: " + EnumToString(symbol_option_right));
Print(symbol + " strike: " + strike);

Para contratos futuros, a propriedade SYMBOL_TRADE_CALC_MODE retorna SYMBOL_CALC_MODE_EXCH_FUTURES, até aí tudo bem, mas tanto para ações quanto para opções está retornando SYMBOL_CALC_MODE_EXCH_STOCKS.

Várias outras propriedades que testei retornam os mesmos valores para ações e opções.

Alguém sabe alguma maneira de diferenciar ações e opções?

zemo  

tenta isso.

você primeiro deverá ler o simbolo.

exemplo:

na XP:  

inicio WDO é Dólar

inicio  WIN é Indíce futuro


se o nome não é dolar ou indice.

comparece o campo "ISIN" (que você vê em "especificação" do ativo operado)


quando existe a palavra "AC" no campo 7 e 8,

então é uma "ação".

exemplo1:  (PETR4)


ISIN=BRPETRACNPR6

            ==


exemplo2:  (opção PETRA12)


ISIN=BRPETR4A0N84


o campo 7 e 8 está diferente de "AC" , pois está igual a "A0"

então é uma opção

Gustavo Enedir Hennemann  
zemo:

tenta isso.

você primeiro deverá ler o simbolo.

exemplo:

na XP:  

inicio WDO é Dólar

inicio  WIN é Indíce futuro


se o nome não é dolar ou indice.

comparece o campo "ISIN" (que você vê em "especificação" do ativo operado)


quando existe a palavra "AC" no campo 7 e 8,

então é uma "ação".

exemplo1:  (PETR4)


ISIN=BRPETRACNPR6

            ==


exemplo2:  (opção PETRA12)


ISIN=BRPETR4A0N84


o campo 7 e 8 está diferente de "AC" , pois está igual a "A0"

então é uma opção

Olá @zemo, obrigado pelo retorno, mas esta regra não é válida para todas as ações e opções. Acabei de olhar na lista completa e este código varia bastante, não formando um padrão.

Por enquanto o que estou fazendo é verificar o "modo" e a validade. Ou seja, se for ação e tiver validade, então é opção (já que ações não tem validade). Em outras palavras, opção nada mais é do que uma ação com validade.

ENUM_SYMBOL_CALC_MODE   symbolCalcMode = SymbolInfoInteger(symbol, SYMBOL_TRADE_CALC_MODE);
datetime                symbolExpiration = SymbolInfoInteger(symbol, SYMBOL_EXPIRATION_TIME);
if(symbolCalcMode == SYMBOL_CALC_MODE_EXCH_STOCKS
            && symbolExpiration >= TimeTradeServer() )
{
   // é opção!
}

Por enquanto este código está me atendendo.

Trader_Patinhas  


O problema é que as corretoras XP e Clear não preenchem os strikes e outras propriedades das opções no servidor MT5.

Nas corretoras Modalmais e Terra Investimentos, que preenchem corretamente essas informações, basta verificar se  SymbolInfoDouble(symbol,SYMBOL_OPTION_STRIKE) > 0  que vc vai saber se é opção ou não.

Dá uma olhada neste tópico aqui, onde postei um código que identifica todas as opções de um ativo, que funciona na Modalmais e na Terra Investimentos, mas não funciona na XP porque no servidor da XP os dados das opções (valor do strike, se é call ou put, se é americana ou europeia, etc.) não estão preenchidos.

Se você for operar com a XP ou com a Clear, poderá determinar se é opção ou não (e também obter outras informações sobre a opção) verificando o conteúdo do campo de descrição retornado por  SymbolInfoString(symbol,SYMBOL_DESCRIPTION) . Veja detalhes na sexta mensagem do tópico.

Como listar todas as opções em negociação de um ativo(symbol)?
Como listar todas as opções em negociação de um ativo(symbol)?
  • 2018.06.25
  • www.mql5.com
Olá. Gostaria de saber se é possivel pegar uma lista de todas as opções (simbolos) disponiveis para negociação de uma ação...
Gustavo Enedir Hennemann  
Trader_Patinhas:


O problema é que as corretoras XP e Clear não preenchem os strikes e outras propriedades das opções no servidor MT5.

Nas corretoras Modalmais e Terra Investimentos, que preenchem corretamente essas informações, basta verificar se  SymbolInfoDouble(symbol,SYMBOL_OPTION_STRIKE) > 0  que vc vai saber se é opção ou não.

Dá uma olhada neste tópico aqui, onde postei um código que identifica todas as opções de um ativo, que funciona na Modalmais e na Terra Investimentos, mas não funciona na XP porque no servidor da XP os dados das opções (valor do strike, se é call ou put, se é americana ou europeia, etc.) não estão preenchidos.

Se você for operar com a XP ou com a Clear, poderá determinar se é opção ou não (e também obter outras informações sobre a opção) verificando o conteúdo do campo de descrição retornado por  SymbolInfoString(symbol,SYMBOL_DESCRIPTION) . Veja detalhes na sexta mensagem do tópico.

Valeu @Trader_Patinhas, ajudou bastante. Que bom que no Brasil não temos padronização  >:(
Razão: