Typ dynamic w C# przy wykorzystaniu API Binance

Kryptowaluty na Binance

Na próżno szukać osoby która nie słyszała o Bitcoinie. Od chwili gdy jego wartość gwałtownie się zwiększyła minęło jednak sporo czasu i temat kryptowalut lekko ucichł. W międzyczasie powstało mnóstwo miejsc, gdzie można nimi handlować.

Binance jest jednym z takich miejsc. Jest to giełda, gdzie po doładowaniu konta można handlować krypowalutami. Na pytanie czy można na tym zarobić musicie odpowiedzieć sobie sami 🙂

Czym jest API?

API Binance pozwala na wykonywanie wszystkich funkcji aplikacji związanych z giełdą za pomocą adresu URL (https://api.binance.com). Odpowiednio przygotowane zapytania HTTP są używane do kontaktu aplikacji z giełdą bez użycia UI strony. Endpointy, do których wysyłamy zapytania HTTP można znaleźć w oficjalnej dokumentacji API Binance pod tym linkiem.

Typ dynamic w C#

21 kwietnia 2018r prowadziłem prezentację na spotkaniu Grupy .NET PK, na którym dynamic zostało porównane do typu var w JavaScript. Poza zagrożeniami wynikającymi z dynamicznej zmiany typu stwierdziliśmy, że dynamic nadaje się doskonale do integracji systemu z jakimś zewnętrznym, niezależnym od nas systemem, np. API.

Prezentacja z wykładu dostępna jest pod tym linkiem.

Aplikacja

Program jest do pobrania z repozytorium GitHub.

1. Struktura

grupa_net_pk_binance_client
├─ Helpers
│  │─ StringOperations.cs
│  └─ TimeOperations.cs
│─ BinanceClient.cs
│─ BinanceConfiguration.cs
│─ BinanceService.cs
└─ Program.cs

2. Działanie

Helpers – folder z dwiema statycznymi klasami wykonującymi operacje przekształcające:
– aktualny czas na tzw odcisk czasu
– objekt na zapytanie URL

BinanceConfiguration.cs – klasa zawierająca podstawową konfigurację niezbędną do korzystania z API Binance: ApiKey oraz ApiSecret. Każde konto użytkownika musi wygenerować swoją parę kluczy. Instrukcja.

BinanceClient.cs – klasa zawierająca definicję metod GET i POST za pomocą których będą wysyłane zapytania do API. Jest tu także metoda podpisująca zapytanie:

public string GenerateSignature(string data)
{
    var shaHmac256 = new HMACSHA256(Encoding.UTF8
      .GetBytes(BinanceConfiguration.ApiSecret));
    var hash = shaHmac256.ComputeHash(Encoding.UTF8.GetBytes(data));
    var hashedString = BitConverter.ToString(hash).Replace("-", string.Empty);
    return hashedString;
}

BinanceService.cs – klasa zawiera 3 metody korzystające z metod GET i POST klasy BinanceClient:
– GetAccount() – do uzyskania informacji o koncie, takich jak saldo
– GetPrice(string symbol) – do uzyskania informacji o cenie danej waluty
– Buy(string symbol, double quantity) – do zakupu waluty w określonej ilości

Program.cs – klasa startowa programu, gdzie w metodzie Start():
– Tworzony jest obiekt typu BinanceService
– Wywoływana jest metoda GetAccount()
– Wywoływana jest metoda GetPrice(“LTCBTC”),  która zwraca aktualną, najniższą cenę LTC oraz ilość LTC w tej cenieGetPrice("LTCBTC")

– Wywoływana jest metoda Buy(“LTCBTC”, 2),  która zwróci informację o zbyt małej ilości funduszów na koncie 🙂

Gdyby jednak saldo konta nie wynosiło 0, informacja zwrotna wyglądałaby mniej więcej w ten sposób:

Metoda Buy() przyjmuje dwa parametry i zwraca obiekt typy dynamic. To właśnie dzięki temu można obsłużyć obydwie formy odpowiedzi od serwera nie tworząc obsługi wyjątków.

Podsumowanie

Używanie dynamicznych obiektów pozwala na szybsze tworzenie kodu, kiedy komunikujemy się z zewnętrznym serwisem, na temat którego mamy niewiele informacji lub nie mamy pewności jakie informacje zwróci. Zmiana definicji obiektu dynamic nie powoduje żadnych wyjątków, o czym należy pamiętać podczas pisania kodu. Nie powinno się nadużywać stosowania tego typu, ponieważ debuggowanie kodu staje się drogą przez mękę.