Пример работы с BinanceTrader |
Пример работы с BinanceTrader демонстрирует приложение SampleBinance, показанное на рисунке ниже. Исходные коды примера лежат в дистрибутиве в папке Samples/Binance.
В самом начале необходимо создать экземпляр класса шлюза BinanceTrader:
// создаем подключение Trader = new BinanceTrader();// { LogLevel = LogLevels.Debug }; ..... Trader.Key = Key.Text; Trader.Secret = Secret.Password;
Далее следует установить требуемые обработчики событий IConnector:
Trader.Restored += () => this.GuiAsync(() => { // разблокируем кнопку Экспорт (соединение было восстановлено) ChangeConnectStatus(true); MessageBox.Show(this, LocalizedStrings.Str2958); }); // подписываемся на событие успешного соединения Trader.Connected += () => { // возводим флаг, что соединение установлено _isConnected = true; // разблокируем кнопку Экспорт this.GuiAsync(() => ChangeConnectStatus(true)); }; Trader.Disconnected += () => this.GuiAsync(() => ChangeConnectStatus(false)); // подписываемся на событие разрыва соединения Trader.ConnectionError += error => this.GuiAsync(() => { // заблокируем кнопку Экспорт (так как соединение было потеряно) ChangeConnectStatus(false); MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2959); }); // подписываемся на ошибку обработки данных (транзакций и маркет) Trader.Error += error => this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2955)); // подписываемся на ошибку подписки маркет-данных Trader.MarketDataSubscriptionFailed += (security, msg, error) => this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2956Params.Put(msg.DataType, security))); Trader.NewSecurity += security => _securitiesWindow.SecurityPicker.Securities.Add(security); Trader.NewMyTrade += trade => _myTradesWindow.TradeGrid.Trades.Add(trade); Trader.NewTrade += trade => _tradesWindow.TradeGrid.Trades.Add(trade); Trader.NewOrder += order => _ordersWindow.OrderGrid.Orders.Add(order); Trader.NewPortfolio += portfolio => { // регистрирует портфели на обновление данных Trader.RegisterPortfolio(portfolio); _portfoliosWindow.PortfolioGrid.Portfolios.Add(portfolio); }; Trader.NewPosition += position => _portfoliosWindow.PortfolioGrid.Positions.Add(position); // subscribe on error of order registration event Trader.OrderRegisterFailed += _ordersWindow.OrderGrid.AddRegistrationFail; // subscribe on error of order cancelling event Trader.OrderCancelFailed += OrderFailed;
Далее необходимо выполнить подключение к серверу Binance:
Trader.Connect();
После подключения можно ожидать срабатывания событий:
IConnectorSecurityChanged – изменение инструмента (последней цены, цены спроса/предложения и т.д.) запрошенного через RegisterSecurity(Security).
IConnectorMarketDepthChanged – изменение стакана, запрошенного с помощью RegisterMarketDepth(Security).
IConnectorNewTrade – новые тики по подписанным с помощью RegisterTrades(Security) инструментам.
IPortfolioProviderPortfolioChanged – изменение портфелей, запрошенное с помощью RegisterPortfolio(Portfolio).
Поиск инструментов (подробнее):
Для получения обновлений и сделок по выбранному инструменту необходимо использовать методы RegisterSecurity(Security) и RegisterTrades(Security) соответственно:
private void QuotesClick(object sender, RoutedEventArgs e) { var security = SecurityPicker.SelectedSecurity; var trader = MainWindow.Instance.Trader; if (trader.RegisteredSecurities.Contains(security)) { trader.UnRegisterSecurity(security); trader.UnRegisterTrades(security); } else { trader.RegisterSecurity(security); trader.RegisterTrades(security); } }
Для запроса обновлений по стаканам необходимо воспользоваться методом RegisterMarketDepth(Security):
private void DepthClick(object sender, RoutedEventArgs e) { var trader = MainWindow.Instance.Trader; var window = _quotesWindows.SafeAdd(SecurityPicker.SelectedSecurity, security => { // начинаем получать котировки стакана trader.RegisterMarketDepth(security); // создаем окно со стаканом var wnd = new QuotesWindow { Title = security.Id + " " + LocalizedStrings.MarketDepth }; wnd.MakeHideable(); return wnd; }); if (window.Visibility == Visibility.Visible) window.Hide(); else window.Show(); if (!_initialized) { TraderOnMarketDepthChanged(trader.GetMarketDepth(SecurityPicker.SelectedSecurity)); trader.MarketDepthChanged += TraderOnMarketDepthChanged; _initialized = true; } }
Для регистрации заявок предусмотрена кнопка Новая заявка. Метод RegisterOrder(Order) отправляет заявку на сервер:
private void NewOrderClick(object sender, RoutedEventArgs e) { var newOrder = new OrderWindow { Order = new Order { Security = SecurityPicker.SelectedSecurity }, SecurityProvider = MainWindow.Instance.Trader, MarketDataProvider = MainWindow.Instance.Trader, Portfolios = new PortfolioDataSource(MainWindow.Instance.Trader), }; if (newOrder.ShowModal(this)) MainWindow.Instance.Trader.RegisterOrder(newOrder.Order); }
Для вывода средств необходимо сформировать заявку на вывод, для этого в коде следует написать:
var order = new Order { Type = OrderTypes.Conditional, Condition = new BinanceOrderCondition { IsWithdraw = true, WithdrawInfo = new WithdrawInfo { // заполняются необходимые реквизиты Comment = "My profit", //PaymentId = "45467dyjyttR8WBiTJXptyuTx4wbSerGZ5t45", //Riple CryptoAddress = "16zK3M53JBGnjs9ajTBGBfkRqoHtm4E573", } }, Security = new Security() { Code = "BTC" }, }; Trader.RegisterOrder(order);