ТД Америтрейд. NET - PullRequest
       31

ТД Америтрейд. NET

0 голосов
/ 25 апреля 2020

Кто-нибудь получил потоковый API TD Ameritrade для работы с C#? У них есть некоторая документация и JavaScript примеры здесь https://developer.tdameritrade.com/content/streaming-data. Я получил JavaScript примеров для работы на https://js.do/, но не могу получить ничего похожего на работу. NET. Это сокращенная версия того, что я пытаюсь сделать. Я не могу точно указать, что я отправляю, потому что я пытаюсь отправить сообщение для входа, которое содержит информацию об учетной записи, но я могу сказать, что скопировал и вставил точное сообщение JSON, которое работает в моих тестах JavaScript в файл Login JSON .txt в этом примере. В этом примере сокет просто закроется, как только я отправлю сообщение, текстовый ответ вообще не будет. Однако, если я отправлю намеренно искаженное сообщение, я получу текстовый ответ о том, что сообщение неверно отформатировано, а затем получу разъединение сокета. Их поддержка не отвечала, что я понимаю, к норме. Здесь есть python примеров https://www.youtube.com/channel/UCBsTB02yO0QGwtlfiv5m25Q, но я просмотрел их все и ничего не узнал, чтобы помочь мне заставить мой код работать.

        ClientWebSocket socket = new ClientWebSocket();
        var connectAsync = socket.ConnectAsync(new Uri("wss://streamer-ws.tdameritrade.com/ws"), CancellationToken.None);
        string loginRequest;
        using (StreamReader re = new StreamReader("LoginJSON.txt")) {
            loginRequest = re.ReadToEnd();
        }

        connectAsync.Wait();

        Thread readThread = new Thread(
            delegate(object obj)
            {
                while (true) {
                    if (socket.State == WebSocketState.Open) {
                        Console.Out.WriteLine("Waiting");
                        byte[] recBytes = new byte[1024];
                        var clientBuffer = new ArraySegment<byte>(recBytes);
                        var receiveAsync = socket.ReceiveAsync(clientBuffer, CancellationToken.None);
                        receiveAsync.Wait();
                        switch (receiveAsync.Result.MessageType) {
                            case WebSocketMessageType.Text:
                                var s = Encoding.UTF8.GetString(recBytes);
                                Console.Out.WriteLine(s.Trim());
                                break;
                            case WebSocketMessageType.Close:
                                Console.Out.WriteLine("Close message received");
                                break;
                            default:
                                throw new ArgumentOutOfRangeException();
                        }
                    }
                }
            });

        readThread.Start();
        socket.SendAsync(Encoding.UTF8.GetBytes(loginRequest), WebSocketMessageType.Text, true, CancellationToken.None);
        Console.ReadLine();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...