1. Opis zadania
Konieczne jest opracowanie skryptu Python, który generuje obrazy z wynikami handlu (PnL), wizualnie całkowicie identyczne z projektem aplikacji Binance Futures (przykład w załączniku).
To NIE jest nałożenie tekstu na gotowy szablon. Obraz powinien być tworzony programowo „od zera” (tło, kształty, tekst), aby zapewnić elastyczność układu przy zmianie długości danych.
2. Stos technologiczny
Język: Python 3.9+
Grafika: Pillow (PIL)
Kody QR: biblioteka qrcode
API & Zapytania: ccxt lub requests (do pobierania aktualnych cen z Binance)
Czcionki: Używać rodziny czcionek Proxima Nova (lub wizualnie identycznego odpowiednika), aby cyfry i kerning zgadzały się z oryginałem.
3. Logika działania (Backend Logic)
Skrypt powinien działać w trybie kalkulatora. Na wejściu podawane są parametry transakcji, skrypt oblicza wynik.
A. Dane wejściowe: Skrypt przyjmuje JSON/Dict. Obowiązkowe pola: Symbol, Side (Long/Short), Leverage, Entry Price. Pole Last Price — opcjonalne.
B. Algorytm działań:
Pobieranie ceny: Jeśli Last Price nie jest podana w danych wejściowych, skrypt powinien wykonać zapytanie do publicznego API Binance (fapi) i uzyskać aktualną cenę (markPrice) dla podanej pary.
Uwzględnienie dokładności (Precision): Skrypt powinien uwzględniać tickSize konkretnej pary (na przykład, dla BTCUSDT — 2 miejsca po przecinku, dla PEPEUSDT — 7 miejsc po przecinku). Niedopuszczalne jest wyświetlanie „10.5000000” tam, gdzie powinno być „10.50”.
Obliczenie ROE (PnL %):
Dla Long: ((Last Price - Entry Price) / Entry Price) * Leverage * 100
Dla Short: ((Entry Price - Last Price) / Entry Price) * Leverage * 100
Zaokrąglanie i formatowanie: Ostateczny procent zaokrąglany jest do 2 miejsc po przecinku.
Jeśli > 0: Kolor tekstu zielony (#2EBD85), prefiks +.
Jeśli < 0: Kolor tekstu czerwony (#F6465D), prefiks -.
4. Wymagania wizualne (Frontend)
Tło: Ciemny gradient lub tekstura z geometrycznym wzorem (logo Binance), narysowane lub w wysokiej jakości.
Header:
Nazwa użytkownika (dynamiczna, domyślnie SyntrixBot).
Aktualna data i czas (UTC lub przekazana).
Body:
Para handlowa (np. OMGUSDT) i typ Perpetual.
Side (Long/Short) — kolorowe etykiety (zielona/czerwona).
Leverage (np. 125x).
Główna cyfra (ROE): Duża czcionka, kolor zależy od znaku (+/-).
Ceny (Entry / Last) — wyrównanie do lewej.
Footer:
Kod referencyjny (tekst).
Kod QR (generowany dynamicznie na podstawie przekazanego linku).
Konfiguracja: Wszystkie kolory (HEX), ścieżki do czcionek, marginesy i rozmiary czcionek powinny być przeniesione do oddzielnego pliku config.py lub stałych na początku skryptu dla łatwej edycji.
5. Przykład danych wejściowych (JSON)
JSON
{
"user_config": {
"username": "SyntrixBot",
"referral_code": "SyntrixRef",
"qr_link": "https://binance.com/ref/..."
},
"trade_data": {
"symbol": "BTCUSDT",
"type": "Perpetual",
"side": "SHORT",
"leverage": 50,
"entry_price": 65000.50,
"last_price": null
}
}
/* Komentarz: Ponieważ last_price jest null, skrypt sam idzie na giełdę,
pobiera aktualną cenę (np. 63000.00), oblicza zysk dla Shorta
i rysuje zieloną kartę.
*/
6. Wynik pracy (Deliverables)
Źródło kodu (.py), uporządkowane i z komentarzami.
Plik requirements.txt.
Folder assets z czcionkami (Proxima) i niezbędnymi obrazami (tło, domyślny awatar).
Funkcja generacji powinna zwracać obiekt BytesIO (do wysyłania w Telegramie bez zapisywania na dysku) lub zapisywać plik lokalnie (przełączany parametr).
7. Kryterium akceptacji
Przekazuję skryptowi parametry rzeczywistej transakcji. Otrzymany obraz przy nałożeniu na oryginalny zrzut ekranu z Binance powinien zgadzać się z siatką, czcionkami i marginesami. Cyfry PnL powinny być matematycznie poprawne.