Невозможно заставить работать оболочку binance.net

Я установил оболочку с https://github.com/JKorf/Binance.Net

Используя их пример кода, в моем приложении есть следующее:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Binance.Net;
using Binance.Net.Enums;
using Binance.Net.Objects;
using Binance.Net.Objects.Spot;
using CryptoExchange.Net.Authentication;
using CryptoExchange.Net.Logging;

namespace binance_stream_user_data_updates
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new BinanceClient(new BinanceClientOptions{
                ApiCredentials = new ApiCredentials("key","secret"),
                BaseAddress = "https://testnet.binance.vision",
                LogVerbosity = LogVerbosity.Debug,
                LogWriters = new List<TextWriter> { Console.Out }
            });

            var startResult = client.Spot.UserStream.StartUserStream();

            if(!startResult.Success)
                throw new Exception($"Failed to start user stream: {startResult.Error}");

            var socketClient = new BinanceSocketClient();

            socketClient.Spot.SubscribeToUserDataUpdates(startResult.Data,
            null,
            data => {
                Console.WriteLine(data.Orders);
                },
            null,
            null);

            Console.ReadLine();

            socketClient.UnsubscribeAll();


        }
    }
}

Затем я запускаю указанное выше приложение, которое, кажется, подключается и начинает ждать, как показано в терминале:

dotnet run
2021/02/26 20:36:51:863 | Binance    | Debug | Client configuration: LogVerbosity: Debug, Writers: 1, Credentials: Set, BaseAddress: https://testnet.binance.vision/, Proxy: -, RateLimiters: 0, RateLimitBehaviour: Wait, RequestTimeout: 00:00:30
2021/02/26 20:36:51:903 | Binance    | Debug | [1] Creating request for https://testnet.binance.vision/api/v3/time
2021/02/26 20:36:51:911 | Binance    | Debug | [1] Sending GET request to https://testnet.binance.vision/api/v3/time 
2021/02/26 20:36:53:242 | Binance    | Debug | [1] Response received in 1320ms: {"serverTime":1614371813101}
2021/02/26 20:36:53:345 | Binance    | Debug | [2] Creating request for https://testnet.binance.vision/api/v3/time
2021/02/26 20:36:53:346 | Binance    | Debug | [2] Sending GET request to https://testnet.binance.vision/api/v3/time 
2021/02/26 20:36:54:028 | Binance    | Debug | [2] Response received in 681ms: {"serverTime":1614371813881}
2021/02/26 20:36:54:029 | Binance    | Info | Time offset set to 535.073ms
2021/02/26 20:36:54:031 | Binance    | Debug | [3] Creating request for https://testnet.binance.vision/api/v1/userDataStream
2021/02/26 20:36:54:037 | Binance    | Debug | [3] Sending POST request to https://testnet.binance.vision/api/v1/userDataStream with request body 
2021/02/26 20:36:54:732 | Binance    | Debug | [3] Response received in 694ms: {"listenKey":"key"}

Затем я размещаю заказ

POST https: //testnet.binance.vision/api/v3/order?symbol=BNBUSDT&side=SELL&type=MARKET&quantity=0.1&newClientOrderId=my_order_id_201&newOrderRespType=FULL×tamp=1614f14370483ec8cfc8cfc8cfc8cf2f6fcf6fcf6f6fcf6e6fcfcf6f6f6e6f6fcf6e6e6fcf6e6e6fcf6e6e6e6e6ecf6e6e6ecf6e6e6ec

Когда я это делаю, веб-сокет, запущенный из приведенного выше кода, ничего не выводит. Есть идеи, что я делаю не так?


person oshirowanen    schedule 26.02.2021    source источник


Ответы (3)


Есть вещи, которые необходимо сделать, чтобы получить должный результат:

  1. Вы должны указать параметры для BinanceSocketClient
  2. Вы должны дождаться какого-то события, прежде чем отказаться от подписки
  3. Во время ожидания вам необходимо добавить новый заказ (или новый заказ OCO) с помощью приложения Postman (или другого подобного) с вашими учетными данными. (Это не покрывается приведенным ниже кодом)

Обратите внимание на следующий код:

async static Task Main(string[] args)
{
    var client = new BinanceClient(new BinanceClientOptions
    {
        ApiCredentials = new ApiCredentials("key", "secret"),
        BaseAddress = "https://testnet.binance.vision",
        LogVerbosity = LogVerbosity.Debug,
        LogWriters = new List<TextWriter> { Console.Out }
    });

    var startResult = client.Spot.UserStream.StartUserStream();

    if (!startResult.Success)
        throw new Exception($"Failed to start user stream: {startResult.Error}");

    var socketClient = new BinanceSocketClient(new BinanceSocketClientOptions
    {
        ApiCredentials = new ApiCredentials("key", "secret"),
        BaseAddress = "wss://testnet.binance.vision",
        LogVerbosity = LogVerbosity.Debug,
        LogWriters = new List<TextWriter> { Console.Out }
    });

    var stop = false;
    var subscribeResponse = socketClient.Spot.SubscribeToUserDataUpdates(
        startResult.Data,
        data =>
        {
            stop = true;
            Console.WriteLine($"Order updated: {data}");
        },
        data =>
        {
            stop = true;
            Console.WriteLine($"OCO Orders updated: {data.Orders}");
        },
        null,
        data =>
        {
            stop = true;
            Console.WriteLine($"Balance updated: ${data}");
        });
    
    if (subscribeResponse.Success)
    {
        while (!stop)
        {
            await Task.Delay(100);
        }
    }

    await socketClient.UnsubscribeAll();
}
person Igor Goyda    schedule 02.03.2021
comment
Я использую .NET 3.1. Кажется, что «Задача» не существует до .NET 4. Внесены некоторые изменения в ваш примерный код, и теперь он работает. Спасибо! - person oshirowanen; 02.03.2021

Ваш socketClient отписывается от событий сразу после подписки.

Вам нужно поменять местами строки

socketClient.UnsubscribeAll();
Console.ReadLine();

иметь подписку на события до тех пор, пока не будет прочитана строка из консоли.

person ruslan.gilmutdinov    schedule 01.03.2021
comment
Поменял местами строки, и, похоже, это не имеет значения для вывода, когда я размещаю заказ. - person oshirowanen; 02.03.2021
comment
Похоже обновления приходят только при смене баланса. См. здесь. - person ruslan.gilmutdinov; 02.03.2021
comment
Да, я изменяю баланс с помощью этой команды api endpoint POST testnet.binance.vision/api/v3/ Я вижу изменение баланса, когда я вхожу в binance, но из приведенного выше кода ничего не выводится. - person oshirowanen; 02.03.2021

В предоставленном вами коде вы создаете BinanceClient с параметрами, используя URL-адрес тестовой сети, а затем создаете BinanceSocketClient с параметрами по умолчанию, которые будут использовать wss://stream.binance.com:9443/ в качестве базового URL-адреса.

Но если вы используете тестовую сеть, вы должны использовать соответствующий wss://testnet.binance.vision/ URL-адрес веб-сокета; в противном случае вы подписываетесь на нефункциональный listenKey в реальной сети, который не будет информировать вас об обновлениях порядка, которые происходят в тестовой сети.

Просто создайте экземпляр BinanceSocketClient следующим образом:

socketClient = new BinanceSocketClient(new BinanceSocketClientOptions
{
    BaseAddress = "wss://testnet.binance.vision",
    LogWriters = new List<TextWriter> { Console.Out }
});
person György Kőszeg    schedule 02.03.2021