andpena / FinancialData

Python and finacial data
GNU General Public License v3.0
88 stars 31 forks source link

Exibir n linhas do Livro de ofertas #12

Open renatoramiro opened 4 years ago

renatoramiro commented 4 years ago

@andpena tudo bom?

Tu sabe se é possível exibir alguns níveis do livro de ofertas? Porque minha ideia é criar um bookmap simples.

WebMat1 commented 2 years ago

@andpena tudo bom?

Tu sabe se é possível exibir alguns níveis do livro de ofertas? Porque minha ideia é criar um bookmap simples.

Eu tentei fazer o rtd pegar até 200 linhas do livro de oferta, e funcionou perfeitamente, Renato...

Abraços...

grade1000 commented 2 years ago

@andpena tudo bom? Tu sabe se é possível exibir alguns níveis do livro de ofertas? Porque minha ideia é criar um bookmap simples.

Eu tentei fazer o rtd pegar até 200 linhas do livro de oferta, e funcionou perfeitamente, Renato...

Abraços...

Você poderia colar seu exemplo aqui onde pega 200 linhas do book do mesmo ativo com o RTD Tryd? Ultima vez que testei era um limite bem pequeno, tipo 20 linhas. Até desisti de usar o RTD do tryd por causa desse limite que era insuficiente para pegar todas as ofertas da pedra no ativo que eu queria.

Tentei também o RTD do profitchart através de um exemplo C# no link abaixo, mas, também não obtive êxito. https://gist.github.com/bsommardahl/8605208

WebMat1 commented 2 years ago

@andpena tudo bom? Tu sabe se é possível exibir alguns níveis do livro de ofertas? Porque minha ideia é criar um bookmap simples.

Eu tentei fazer o rtd pegar até 200 linhas do livro de oferta, e funcionou perfeitamente, Renato... Abraços...

Você poderia colar seu exemplo aqui onde pega 200 linhas do book do mesmo ativo com o RTD Tryd? Ultima vez que testei era um limite bem pequeno, tipo 20 linhas. Até desisti de usar o RTD do tryd por causa desse limite que era insuficiente para pegar todas as ofertas da pedra no ativo que eu queria.

Tentei também o RTD do profitchart através de um exemplo C# no link abaixo, mas, também não obtive êxito. https://gist.github.com/bsommardahl/8605208

Eu utilizo c# tambem para me conectar ao rtd do TRYD. Atualmente pego 250 linhas de cada lado (compra e venda).

O código que vou deiaxr, roda em um projeto .net 5, e é um background Service, ou seja, se vc copia-lo para seu projeto .net5, não se esqueça de registrar o serviço em Startup.cs...

Abraços...

`public class BooksService : BackgroundService { private readonly CacheCustomers _cacheCustomers;

public static bool ForceFlyRestart { get; set; } = false;
public static ConcurrentDictionary<string, List<BookItem>> Books = new ConcurrentDictionary<string, List<BookItem>>();

public static readonly int BookRows = 250;

public BooksService(CacheCustomers cacheCustomers)
{
    _cacheCustomers = cacheCustomers;
}

protected async override Task ExecuteAsync(CancellationToken stoppingToken)
{

    await Task.Delay(20000);

    Console.WriteLine("Tryd Book Service is Running...");
    while (!stoppingToken.IsCancellationRequested)
    {
        try
        {
            if (_cacheCustomers.CachedCustomers != null && _cacheCustomers.CachedCustomers.Count > 0)
            {
                string[] ativos = _cacheCustomers.CachedCustomers.Select(q=>q.Symbol).ToArray();

                using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
                {
                    socket.Connect(Dns.GetHostAddresses("127.0.0.1"), 12002);

                    //Console.Write("Initializing list... ");

                    foreach (var item in ativos.OrderBy(q=>q))
                    {

                        for(int linha_book = 0; linha_book < BookRows; linha_book++)
                        {
                            for (int coluna_book = 0; coluna_book < 6; coluna_book++)
                            {
                                string str = @$"LVL2$S|0|{item}|{linha_book}|{coluna_book}#";
                                socket.Send(Encoding.ASCII.GetBytes(str));
                            }

                        }

                    }

                    byte[] data = new byte[0];

                    //Console.WriteLine("Finalazing list... ");

                    while (!stoppingToken.IsCancellationRequested)
                    {

                        byte[] chunk = new byte[8192];

                        int r = socket.Receive(chunk);

                        if (r >= 8192)
                        {
                            data = data.Concat(chunk).ToArray();

                            int indexSharp = Array.LastIndexOf(data, (byte)35);

                            //encontrou fim de info
                            if (indexSharp > -1)
                            {
                                byte[] partData = new byte[indexSharp];
                                Array.Copy(data, partData, indexSharp);

                                byte[] newdata = new byte[data.Length - indexSharp - 1];
                                Array.Copy(data, indexSharp + 1, newdata,0,data.Length - indexSharp - 1);

                                data = newdata;

                                //string onePaperInfo = Encoding.UTF8.GetString(partData);

                                await Decode(partData);
                            }
                        }
                        else
                        {
                            #region Tratamento da string recebida

                            data = data.Concat(chunk).ToArray();

                            await Decode(data);

                            #endregion

                            data = new byte[0];

                            //verifica se precisa reiniciar o serviço rodando, para que atualize os customers
                            if (ForceFlyRestart)
                            {
                                ForceFlyRestart = false;
                                throw new Exception("Restarting Tryd.BooksService...");
                            }
                        }

                        await Task.Delay(5);
                    }

                }

            }
        }
        catch (Exception expt)
        {
            Console.WriteLine(expt.Message);
        }
        await Task.Delay(10000);
    }
}

public async Task Decode(byte[] data)
{
    string[] manyPapersInfo = (Encoding.UTF8.GetString(data)).Split(@"#");

    for (int paperinfoCount = manyPapersInfo.Length - 1; paperinfoCount >= 0; paperinfoCount--)
    {
        string onePaperInfo = manyPapersInfo[paperinfoCount];

        if (!string.IsNullOrEmpty(onePaperInfo))
        {
            List<BookItem> PseudoBook = new List<BookItem>();

            string[] parameters = onePaperInfo.Split("|");
            if (parameters.Length > 1)
            {

                try
                {
                    string paper = parameters[0].Replace("LVL2!", "").ToUpper();
                    BookItem bi = new BookItem();

                    for (int bookParam = 1; bookParam < parameters.Length; bookParam++)
                    {
                        string[] bookitem = parameters[bookParam].Split(";");

                        if (bookitem.Length == 4)
                        {

                            int coluna = int.Parse(bookitem[2]);

                            switch (coluna)
                            {
                                case 0:
                                    int Intaux;
                                    if (!int.TryParse(bookitem[3], out Intaux)) continue;

                                    bi.Agent = (Ticks2.Agents)int.Parse(bookitem[3]);
                                    break;
                                case 1:

                                    int Intaux1;
                                    if (!int.TryParse(bookitem[3], out Intaux1)) continue;

                                    bi.Volume = int.Parse(bookitem[3]);
                                    break;
                                case 2:
                                    double aux;

                                    if (bookitem[3] == "Aber.")
                                        bi.Value = -1.0d;
                                    else
                                    {
                                        if (double.TryParse(bookitem[3], out aux))
                                            bi.Value = aux;
                                        else
                                            continue;
                                    }

                                    bi.Type = Ticks2.ActionType.Buy;

                                    PseudoBook.Add(bi);
                                    bi = new BookItem();
                                    break;
                                case 3:

                                    double aux1;

                                    if (bookitem[3] == "Aber.")
                                        bi.Value = -1.0d;
                                    else
                                    {
                                        if (double.TryParse(bookitem[3], out aux1))
                                            bi.Value = aux1;
                                        else
                                            continue;
                                    }

                                    break;
                                case 4:

                                    int Intaux2;
                                    if (!int.TryParse(bookitem[3], out Intaux2)) continue;

                                    bi.Volume = int.Parse(bookitem[3]);
                                    break;
                                case 5:

                                    int Intaux3;
                                    if (!int.TryParse(bookitem[3], out Intaux3)) continue;

                                    bi.Agent = (Ticks2.Agents)int.Parse(bookitem[3]);
                                    bi.Type = Ticks2.ActionType.Sale;

                                    PseudoBook.Add(bi);

                                    bi = new BookItem();
                                    break;
                            }
                        }

                    }

                    if (PseudoBook.Count > 0)
                    {
                        //Console.WriteLine(paper + " : " + DateTime.Now);
                        Add(PseudoBook.ToList(), paper);
                    }

                }
                catch (Exception err)
                {
                    Console.WriteLine("BookService - " + err.Message);
                    Console.WriteLine(onePaperInfo);
                }
            }

        }

    }
}

public void Add(List<BookItem> Book, string paper)
{
    Books.AddOrUpdate(paper, Book, (key, oldValue) => Book);
    try
    {
        OfferRenewService.Analyze(paper, Book);
    }catch(Exception extp)
    {
        Console.WriteLine($"{paper} : {extp.Message}");
    }
}

}`

e não se esqueça da class BookITem:

public class BookItem { public Ticks2.ActionType Type { get; set; } public Ticks2.Agents Agent { get; set; } public int Volume { get; set; } public double Value { get; set; } }

Desse jeito, vc terá os books de cada ativo, atualizados em: public static ConcurrentDictionary<string, List<BookItem>> Books = new ConcurrentDictionary<string, List<BookItem>>();

Espero ter ajudado;

grade1000 commented 2 years ago

@andpena tudo bom? Tu sabe se é possível exibir alguns níveis do livro de ofertas? Porque minha ideia é criar um bookmap simples.

Eu tentei fazer o rtd pegar até 200 linhas do livro de oferta, e funcionou perfeitamente, Renato... Abraços...

Você poderia colar seu exemplo aqui onde pega 200 linhas do book do mesmo ativo com o RTD Tryd? Ultima vez que testei era um limite bem pequeno, tipo 20 linhas. Até desisti de usar o RTD do tryd por causa desse limite que era insuficiente para pegar todas as ofertas da pedra no ativo que eu queria. Tentei também o RTD do profitchart através de um exemplo C# no link abaixo, mas, também não obtive êxito. https://gist.github.com/bsommardahl/8605208

Eu utilizo c# tambem para me conectar ao rtd do TRYD. Atualmente pego 250 linhas de cada lado (compra e venda).

O código que vou deiaxr, roda em um projeto .net 5, e é um background Service, ou seja, se vc copia-lo para seu projeto .net5, não se esqueça de registrar o serviço em Startup.cs...

Abraços...

...

}`

e não se esqueça da class BookITem:

public class BookItem { public Ticks2.ActionType Type { get; set; } public Ticks2.Agents Agent { get; set; } public int Volume { get; set; } public double Value { get; set; } }

Desse jeito, vc terá os books de cada ativo, atualizados em: public static ConcurrentDictionary<string, List<BookItem>> Books = new ConcurrentDictionary<string, List<BookItem>>();

Espero ter ajudado;

Obrigado por enviar o exemplo, eu testei ele e retornou apenas 40 ofertas, sendo 20 de compra e 20 de venda. Como você esta conseguindo 250? Qual versão do seu Tryd? A minha versão do Tryd Pro é a 6.7.0.999

Eu estou achando estranho, até porque eu ja tinha tentado com python e não consegui mais que 40 ofetas e com Csharp mesma com este teste. Tem como voce contar se realmente tem mais de 40 ofertas? Pega um ativo tipo PETR4.