Open renatoramiro opened 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.
Eu tentei fazer o rtd pegar até 200 linhas do livro de oferta, e funcionou perfeitamente, Renato...
Abraços...
@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
@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;
@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.
@andpena tudo bom?
Tu sabe se é possível exibir alguns níveis do livro de ofertas? Porque minha ideia é criar um bookmap simples.