Como obter o preço Médio de uma ação

Para adicionar comentários, por favor Faça o login ou registrar
Charles Adriano
432
Charles Adriano  

Olá...


aos que trabalham com a XP, por facor, considere a linha abaixo

double PrecoMedio = SymbolInfoDouble(_Symbol,SYMBOL_SESSION_AW);

quando executo o sistema no Indice/Mini indice e dolar/minidolar ele retorna os valores corretos, porem, se colocar em acoes e opcoes retorna zero. Alguma ideia de o porque?


O cálculo que preciso fazer é o Volume Financeiro do Ativo DIVIDIDO pelo Número de Ações Negociadas.
Por exemplo: imagine que PETR4 teve 10.000 ações negoiadas nos seguintes preços:

4000 ações a 10,00
3000 ações a 10,50
3000 ações a 10,60

O preço médio séra:

o Volume Financero: (4000 x 10 + 3000 x 10,50 + 3000 x 10,60) = R$103.300,00 DIVIDIDO pelo número de ações negociadas (4000+3000+3000) = 10.000

Logo o Preço Médio será: 103.300,00 DIVIDIDO por 10.000 = R$10,33


O problema é que MT5 disponibiliza 2 tipos de volumes o volume de tickes e o volume de lotes, e nenhum desses é o volume financeiro, e a propriedade SYMBOL_SESSION_AW em teoria deveria retornar esse valor. Então, 2 perguntas


1) porque SYMBOL_SESSION_AW retorna zero nas ações e opções?

2) existe alguma maneira de obter o volume financeiro negociado?


obrigado


charles

Rodrigo Malacarne
Moderador
8090
Rodrigo Malacarne  
Charles Adriano:

Olá...

O problema é que MT5 disponibiliza 2 tipos de volumes o volume de tickes e o volume de lotes, e nenhum desses é o volume financeiro, e a propriedade SYMBOL_SESSION_AW em teoria deveria retornar esse valor. Então, 2 perguntas

1) porque SYMBOL_SESSION_AW retorna zero nas ações e opções?

2) existe alguma maneira de obter o volume financeiro negociado?

obrigado

charles

Olá Charles Adriano,

A forma teoricamente correta de se obter o preço médio de um ativo seria, de fato, através do uso da opção SYMBOL_SESSION_AW na função SymbolInfoDouble. Entretanto, ao que me parece, a responsabilidade de atualização dessa informação no MT5 cabe à corretora, que é, na ponta final, responsável pela base de dados fornecida ao terminal cliente.

Logo, uma vez que a forma "correta" para se obter essa informação não está funcionando, uma alternativa seria o cálculo desse preço médio ponderado através de um indicador VWAP. Entretanto, é sabido que a função que retorna o históricos de ticks no MetaTrader 5 (a função CopyTicks) está com um bug que impede (pelo menos na atual build) a obtenção correta do histórico de ticks.

Conclusão: caso esse preço médio não possa ser obtido através da função SymbolInfoDouble, a forma atualmente confiável para se obter esse preço médio seria mesmo importando essa informação de uma fonte terceirizada, como por exemplo, algum website que fornecesse essa informação em tempo real, que pudesse ser obtida através da função WebRequest. Obviamente, também seria possível a obtenção dessa informação via algum arquivo compartilhado, a partir de onde o MT5 pudesse ler essa informação.

Uma última sugestão: se você consegue obter essa informação para mercado futuro, mas não para ativos de mercado à vista, valeria à pena entrar em contato com o time de TI responsável pelo fornecimento dos dados para o terminal MT5 e pedir a inclusão dessa informação também para ativos de mercado à vista.

Espero ter ajudado!

Abraços,
Malacarne 

Charles Adriano
432
Charles Adriano  

Bem imaginava isso...


Como paliativo, o sistema esta baixando a pagina da ADVFN (via wininet.dll e minerando o HTML retornado) para obter a informação, mas isso gera inconvenientes, como pagina fora do ar, modificação no HTML com a informação entre outros, mas é irônico ter uma facilidade e não poder utiliza-la...

Rogerio Figurelli
Moderador
58577
Rogerio Figurelli  
Charles Adriano:

Olá...


aos que trabalham com a XP, por facor, considere a linha abaixo

double PrecoMedio = SymbolInfoDouble(_Symbol,SYMBOL_SESSION_AW);

quando executo o sistema no Indice/Mini indice e dolar/minidolar ele retorna os valores corretos, porem, se colocar em acoes e opcoes retorna zero. Alguma ideia de o porque?


O cálculo que preciso fazer é o Volume Financeiro do Ativo DIVIDIDO pelo Número de Ações Negociadas.
Por exemplo: imagine que PETR4 teve 10.000 ações negoiadas nos seguintes preços:

4000 ações a 10,00
3000 ações a 10,50
3000 ações a 10,60

O preço médio séra:

o Volume Financero: (4000 x 10 + 3000 x 10,50 + 3000 x 10,60) = R$103.300,00 DIVIDIDO pelo número de ações negociadas (4000+3000+3000) = 10.000

Logo o Preço Médio será: 103.300,00 DIVIDIDO por 10.000 = R$10,33


O problema é que MT5 disponibiliza 2 tipos de volumes o volume de tickes e o volume de lotes, e nenhum desses é o volume financeiro, e a propriedade SYMBOL_SESSION_AW em teoria deveria retornar esse valor. Então, 2 perguntas


1) porque SYMBOL_SESSION_AW retorna zero nas ações e opções?

2) existe alguma maneira de obter o volume financeiro negociado?


obrigado


charles

Olá Charles,

Acredito que o volume financeiro que você procura é exatamente o volume (não o número de ticks) multiplicado pelo preço da ação.

Por exemplo, no dia de hoje (24/8) o volume informado pelo MT5 para PETR4 é de 70.434.800 (volume em D1).

Pelo site da ADVFN referido por você a informação é de 64.963 negócios, com volume de 70.645.700 e volume financeiro de R$553.226.476,70.

Por essa lógica, pode-se chegar nesse mesmo número multiplicando o valor D1 do MT5 de 70.434.800 x R$ 7,89 (valor de fechamento de PETR4) = R$ 555.730.572,00.

A questão é que você quer fazer o valor médio, e para isso não vai poder utilizar o valor total diário, mas sim em outra periodicidade, como hora (H1).

Mas o cálculo do volume financeiro manterá a mesma regra.

Espero que ajude! 

Abraço,

Rogério Figurelli 

Charles Adriano
432
Charles Adriano  

Olá Rogério...


no mais abaixo tem todas as informacoes de interesse na seção que penso poder obter, agora considere a chamada

SymbolInfoDouble(_Symbol,SYMBOL_SESSION_AW)

ela me retorna exatamente e corretamente o preço médio da seção no dólar e indice, o porem, é que se essa função for aplicada a ações, esta retornando zero como preço médio, ou seja, tem como obter mas esta retornando zero, acredito que seja algum problema no servidor da corretora, algo relacionado a configuração. mas não tenho como  afirmar amigo.

em resumo necessito 2 itens para calcular o preço médio

1 - total de ações negociadas

2 - total financeiro das negociações  dessas ações

Note que não estamos falando de media dos preços, mas sim preço médio (volume financeiro total dividido pelo total de contratos negociados). A principio, pelo WinInet.dll baixo a pagina da advfn e leio o preço médio diretamente do HTML da pagina, funciona, mas tem alguns problemas, como por exemplo, o windows as vezes me entrega uma versão anterior da pagina por causa do cache, mesmo que eu configure (segundo documentação da microsoft) para ele recarregar a pagina sem se importar com o cache, veja a pagina abaixo como exemplo da petr4

http://br.advfn.com/bolsa-de-valores/bmf/WDOU15/cotacao

por favor, se conseguir via MT5 sem usar a pagina uma maneira de obter o preço médio que funcões em todos os ativos, pediria a amabilidade de compartilhar o código amigo. abaixo o indicador para testar no índice dólar e ações para verificar e comparar o preço médio e outras informações da seção atual...

#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window

#property indicator_buffers 0
#property indicator_plots 0

int OnInit()
{
   
  return(INIT_SUCCEEDED);
}

#define DSD(T) DoubleToString(SymbolInfoDouble (_Symbol,T),8)
#define DSI(T) DoubleToString(SymbolInfoInteger(_Symbol,T),0)

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{  
    Comment(
            "\n\n SYMBOL_SESSION_VOLUME............................ = "     + DSD(SYMBOL_SESSION_VOLUME),
              "\n SYMBOL_SESSION_TURNOVER........................ = "       + DSD(SYMBOL_SESSION_TURNOVER),
              "\n SYMBOL_SESSION_INTEREST.......................... = "     + DSD(SYMBOL_SESSION_INTEREST),
              "\n SYMBOL_SESSION_BUY_ORDERS_VOLUME...... = "                + DSD(SYMBOL_SESSION_BUY_ORDERS_VOLUME),
              "\n SYMBOL_SESSION_SELL_ORDERS_VOLUME..... = "                + DSD(SYMBOL_SESSION_SELL_ORDERS_VOLUME),
              "\n SYMBOL_SESSION_OPEN................................ = "   + DSD(SYMBOL_SESSION_OPEN),
              "\n SYMBOL_SESSION_CLOSE............................... = "   + DSD(SYMBOL_SESSION_CLOSE),
              "\n",
              "\n SYMBOL_SESSION_AW.................................... = " + DSD(SYMBOL_SESSION_AW), // Preço medio
              "\n",
              "\n SYMBOL_SESSION_PRICE_SETTLEMENT......... = "              + DSD(SYMBOL_SESSION_PRICE_SETTLEMENT),
              "\n SYMBOL_SESSION_PRICE_LIMIT_MIN............. = "           + DSD(SYMBOL_SESSION_PRICE_LIMIT_MIN),
              "\n SYMBOL_SESSION_PRICE_LIMIT_MAX............. = "           + DSD(SYMBOL_SESSION_PRICE_LIMIT_MAX),
              "\n",
              "\n SYMBOL_SESSION_DEALS............................... = "   + DSI(SYMBOL_SESSION_DEALS),
              "\n SYMBOL_SESSION_BUY_ORDERS.................... = "         + DSI(SYMBOL_SESSION_BUY_ORDERS),
              "\n SYMBOL_SESSION_SELL_ORDERS.................... = "        + DSI(SYMBOL_SESSION_SELL_ORDERS),
              "\n",
              "\n volume............................................................. = " + DoubleToString(volume[0],8),     // execute on Daily TimeFrame
              "\n tick_volume....................................................... = "  + DoubleToString(tick_volume[0],8) // execute on Daily TimeFrame           );

  return(rates_total);
}


obrigado


Charles

Rodrigo Malacarne
Moderador
8090
Rodrigo Malacarne  
Charles Adriano:

Olá Rogério...

obrigado

Charles

Olá Charles,

Você precisa dessa informação em um indicador ou em um EA?

Abraços,
Malacarne 

Charles Adriano
432
Charles Adriano  

EA amigo...

Rogerio Figurelli
Moderador
58577
Rogerio Figurelli  

Olá Charles,

Entendi o que você quer, o que não entendo é porque que o que você busca no item 2 (total financeiro das negociações  dessas ações) não pode ser calculado pela multiplicação do preço de fechamento, uma vez que no exemplo que passei, comparando os dados do MT5 e da ADVFN, o resultado é o mesmo.

Abraço. 

Rodrigo Malacarne
Moderador
8090
Rodrigo Malacarne  
Rogerio Figurelli:

Olá Charles,

Entendi o que você quer, o que não entendo é porque que o que você busca no item 2 (total financeiro das negociações  dessas ações) não pode ser calculado pela multiplicação do preço de fechamento, uma vez que no exemplo que passei, comparando os dados do MT5 e da ADVFN, o resultado é o mesmo.

Abraço. 

Olá Figurelli,

A multiplicação do preço de fechamento pela quantidade não é a mesma coisa que o preço médio da barra. Imagine a seguinte situação:

HoraQuantidadePreço
10:07:03100010.00
10:07:17200010.03
10:07:2350010.02
10:07:3530009.99
10:07:39100010.00
10:07:57400010.01

O que temos aqui é um candle com as seguintes características:
Open : 10.00
High  : 10.03
Low   :   9.99
Close : 10.01

Logo, se levarmos em consideração o preço de fechamento da barra (10.01) e o volume total negociado (11500 ações), a multiplicação dos dois seria igual a 10.01 x 11500 = $ 115.115

Entretanto, se considerarmos o volume negociado em cada trade separadamente, o volume total negociado é dado pela soma da multiplicação de cada trade por seu respectivo volume, ou seja,

(1000 x 10.00) + (2000 x 10.03) + (500 x 10.02) + (3000 x 9.99) + (1000 x 10.00) + (4000 x 10.01) = $ 115.080

Obviamente os valores são muito próximos. Mas não são iguais. Se levarmos em conta que a maioria das ferramentas reportam o volume em múltiplos de 1000, como por exemplo $ 115k nós temos a impressão que o volume médio pode ser facilmente obtido pela multiplicação do peço de fechamento pelo volume total da barra. Entretanto, não é uma informação precisa, apesar de aproximada.

Acredito que o Charles precise da informação precisa, o que, obviamente, poderia ser informada diretamente pela fonte dos dados, no caso a corretora, atualizando corretamente a opção SYMBOL_SESSION_AW dentro do MT5.

Abraços,
Malacarne 

Paulo Carvalho
2144
Paulo Carvalho  

Charles,

 

Estou operando tbm pela mesma corretora e usando o  "SYMBOL_SESSION_AW" sem problemas. Retorna valores corretos para ações e índices.

Voce ainda esta com problemas ou ja foi resolvido?


 Aproveita e me diz como faço para criar uma variavel datetime que represente data...(todos os dias) e horario fixo (sempre 10:00:00) ...

A unica coisa que consegui foi ...

   datetime initialTime = D'10:00:00'; 

porem essa é a data ref as 10:00:00 hs do dia da compilação ...dai preciso ficar compilando todos os dias....): 

     Obrigado!

 

PH 

Rogerio Figurelli
Moderador
58577
Rogerio Figurelli  
Rodrigo Malacarne:

Olá Figurelli,

A multiplicação do preço de fechamento pela quantidade não é a mesma coisa que o preço médio da barra. Imagine a seguinte situação:

HoraQuantidadePreço
10:07:03100010.00
10:07:17200010.03
10:07:2350010.02
10:07:3530009.99
10:07:39100010.00
10:07:57400010.01

O que temos aqui é um candle com as seguintes características:
Open : 10.00
High  : 10.03
Low   :   9.99
Close : 10.01

Logo, se levarmos em consideração o preço de fechamento da barra (10.01) e o volume total negociado (11500 ações), a multiplicação dos dois seria igual a 10.01 x 11500 = $ 115.115

Entretanto, se considerarmos o volume negociado em cada trade separadamente, o volume total negociado é dado pela soma da multiplicação de cada trade por seu respectivo volume, ou seja,

(1000 x 10.00) + (2000 x 10.03) + (500 x 10.02) + (3000 x 9.99) + (1000 x 10.00) + (4000 x 10.01) = $ 115.080

Obviamente os valores são muito próximos. Mas não são iguais. Se levarmos em conta que a maioria das ferramentas reportam o volume em múltiplos de 1000, como por exemplo $ 115k nós temos a impressão que o volume médio pode ser facilmente obtido pela multiplicação do peço de fechamento pelo volume total da barra. Entretanto, não é uma informação precisa, apesar de aproximada.

Acredito que o Charles precise da informação precisa, o que, obviamente, poderia ser informada diretamente pela fonte dos dados, no caso a corretora, atualizando corretamente a opção SYMBOL_SESSION_AW dentro do MT5.

Abraços,
Malacarne 

Olá Malacarne, obrigado por compartilhar tua visão, mas note que comentei que a solução apresentada é uma aproximação para o candle diário, quando comparado com os dados do site da ADVFN, que é o que o Charles utilizou como referência e solução atual. 

Se a opção SYMBOL_SESSION_AW não está operacional, ainda me parece melhor fazer o proposto (solução aproximada nativa) do que fazer o download diário do site ADVFN, sem contar com as implicâncias legais disso, não te parece? 

Para adicionar comentários, por favor Faça o login ou registrar