Сделал простенький пример-код как работать с веб сокетами АлгоПака.
Работа в действии выглядит так:
Пример кода<code>namespace OsaEngine.MoexAlgoPack; using System; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Net.WebSockets; public class MoexAlgoPackSocketClient(string url) : IAsyncDisposable { private readonly Uri _uri = new(url); private readonly ClientWebSocket _clientWebSocket = new(); public async ValueTask ConnectAsync(string domain = "DEMO", string login = "guest", string passcode = "guest", CancellationToken cancellationToken = default) { await _clientWebSocket.ConnectAsync(_uri, cancellationToken); await SendAsync($"CONNECT\ndomain:{domain}\nlogin:{login}\npasscode:{passcode}\n\n\0", cancellationToken); } public ValueTask SubscribeAsync(object id, string destination, string selector, CancellationToken cancellationToken = default) { return SendAsync($"SUBSCRIBE\nid:{id}\ndestination:{destination}\nselector:{selector}\n\n\0", cancellationToken); } public async ValueTask SendAsync(string message, CancellationToken cancellationToken = default) { var messageBytes = Encoding. <a name="cut"></a> UTF8.GetBytes(message); var segment = new ArraySegment<byte>(messageBytes); await _clientWebSocket.SendAsync(segment, WebSocketMessageType.Text, true, cancellationToken); } public async ValueTask ReceiveAsync(Action<string> received, CancellationToken cancellationToken = default) { var buffer = new byte[1024 * 4]; while (_clientWebSocket.State == WebSocketState.Open) { var result = await _clientWebSocket.ReceiveAsync(new(buffer), cancellationToken); if (result.MessageType == WebSocketMessageType.Close) { await _clientWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, default); } else { var message = Encoding.UTF8.GetString(buffer, 0, result.Count); received(message); } } } public async ValueTask CloseAsync() { await _clientWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", default); _clientWebSocket.Dispose(); } ValueTask IAsyncDisposable.DisposeAsync() { GC.SuppressFinalize(this); return CloseAsync(); } } </code>
<code>var client = new MoexAlgoPackSocketClient("wss://iss.moex.com/infocx/v3/websocket"); await client.ConnectAsync("passport", "<email>", "<password>"); _ = Task.Run(async () => { await Task.Yield(); await client.ReceiveAsync(Console.WriteLine); }); await Task.Delay(2000); await client.SubscribeAsync(Guid.NewGuid(), "MXSE.orderbooks", "TICKER=\"MXSE.TQBR.SBER\""); Console.ReadLine(); await client.CloseAsync(); </code>Заключение
Оригинал статья разместил у себя на сайте https://osaengine.ru/2024/07/01/moex-algopack-csharp-websocket.html
Нет, со Старой Школой у меня нет никаких пересечений. У меня сайт-каталог. Они — обучающая компания и продажа роботов. Из общего только акроним, по разному раскрывающийся.
Не пишите про них. У владельца школы свое представление о мире, он думает что я хочу завладеть его ноунейм проектом. Не хочу даже связываться с ним. Пусть живет и сделает свой проект популярным, только желаю ему успехов. Главное, чтобы вокруг меня не распространял ложь.
Чтобы поисковый трафик тырить у них, на тех кто ошибется в наименовании ???
Зачем мне это всё? Трафик на сайт у меня выше чем у них если верить их статистике. Тем более что коммерцией я не планирую заниматься.
p.s.
Я так понимаю, он про тебя писал что тебя забанили в чате Алора
Насчет названия — оно и так другое. У них Старая Школа. У меня — Открытые Коды. То, что акроним получается одинаковый, это нормально. OS распространенная абревиатура. Например, это операционная система. Это неправильно что кто-то под себя требует единолично такой акроним. А если бы они API или SDK сделали у себя в имени? Что, теперь никому больше нельзя иметь такое название?