Repository navigation
Poprawki przed live: S-5, S-8, precyzja cen, potwierdzenie usuwania - #37
Merged
Merged
Conversation
Idempotencja po samym orderLinkId przyjmowala JAKIEKOLWIEK zlecenie o tym id jako zlozone. StanZlecenia niesie teraz symbol i strone z odpowiedzi gieldy, a `sprawdz_zastane` porownuje symbol, strone i ilosc (nie wiecej niz plan) w zloz_plan oraz w obu adapterach. Rozjazd albo brak tozsamosci daje ExchangeError(wymaga_czlowieka=True), bez POST-u i bez zapisu. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017S4D5yYFQmJsfcLx14gnjE
…a w przod (S-8) compute_funding przenosil ostatnia stawke na kazda swiece bez wzgledu na wiek, wiec po zatrzymaniu pobierania funding_rate/funding_z wygladaly na swieze. Stawka starsza niz FUNDING_WIEK_MAX (2 interwaly ogloszenia) nie trafia ani do cechy, ani do okna z-score; potok wypisuje UWAGA z liczba swiec i wiekiem. Czujka `dozor --co swiezosc` dostaje market.funding_rate z tym samym progiem (tylko dla silnikow z funding_from). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017S4D5yYFQmJsfcLx14gnjE
Limit, cel i srednia cena szly przez fmtMoney (2 miejsca), wiec instrument ponizej 1 USDC tracil wiekszosc cyfr: 0.012345 -> "0,01". Nowy fmtPrice daje co najmniej 6 cyfr znaczacych i nie mniej niz 2 miejsca. Stend UI, scenariusz 7. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017S4D5yYFQmJsfcLx14gnjE
…erdzenia Jedno klikniecie wysylalo DELETE. Nowe okno aplikacji (Potwierdzenie.jsx, portal do body, alertdialog, fokus na "Anuluj", Escape i klik w tlo zamykaja) nazywa usuwany obiekt; DELETE idzie dopiero po jawnym potwierdzeniu. Bez natywnego confirm(). Stend UI, scenariusz 8. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017S4D5yYFQmJsfcLx14gnjE
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017S4D5yYFQmJsfcLx14gnjE
`fmtNum(qty, 4)` ucinalo male ilosci drogich instrumentow: 0.000123 BTC -> "0.0001". fmtQty dzieli z fmtPrice regule 6 cyfr znaczacych, bez minimum miejsc. Planowane zlecenia, pozycje, plany i transakcje. Stend UI, scenariusz 7. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017S4D5yYFQmJsfcLx14gnjE
- dozor: wiek fundingu PER INSTRUMENT, alarm z najstarszego z lista nieswiezych (aktywne instrumenty); max() po wszystkich perpach przykrywal przestoj jednego. Test na prawdziwej bazie z dwoma instrumentami. - fmtQty: roundingMode 'trunc' - 0.9999996 nie pokazuje „1". - Potwierdzenie: fokus tylko przy otwarciu, osobno od obslugi Escape. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017S4D5yYFQmJsfcLx14gnjE
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Cztery znaleziska z audytu kodu 09-10.10, które blokują live (
renacode-infra→docs/projekty/trader/08-przed-go-live.md, sekcja „Znaleziska audytu kodu”). N-2 (TOTP przy przepływach), S-6 i S-7 świadomie pominięte — to osobne decyzje.Każda poprawka ma test regresyjny, który sprawdzono na czerwono: po cofnięciu poprawki test pada, po przywróceniu przechodzi.
S-5 — idempotencja zleceń sprawdza symbol, stronę i ilość
Wada: gdy giełda znała zlecenie o naszym
orderLinkId, kod przyjmował je jako złożone (juz_istnialo=True). Nie sprawdzał, czy to w ogóle zlecenie z planu.Zmiana:
StanZleceniadostaje polasymbolistrona, wypełniane z tej samej odpowiedzi giełdy (Bybitsymbol/side, Alpacasymbol/side).base.sprawdz_zastane. Zastane zlecenie jest uznane za nasze tylko wtedy, gdy symbol i strona są równe planowi, a ilość mieści się w0 < ilość ≤ plan. Każdy rozjazd, a także brak symbolu lub strony, dajeExchangeError(code="tozsamosc-zlecenia", wymaga_czlowieka=True)bez POST-a i bez zapisu.zloz_planzaraz po odczycie stanu, więc obejmuje obie gałęzie:juz_istnialoi „giełda zna to zlecenie mimo odmowy”. Jest też w obu adapterach (zloz_zleceniebezistnienie_sprawdzone, w Alpace także w ścieżce 422).odmowa_gieldyskłada, gdy rachunek potwierdza mniej.Testy:
tests/test_egzekucja.py(adapter Bybita: inna strona, inny symbol, większa ilość, brak tożsamości oraz kanarek na mniejszą ilość) itests/test_gielda_exec.py(zloz_plan, 8 przypadków oraz kanarek zgodnego zlecenia). Bez poprawki pada 12 z 14 testów; przechodzą tylko 2 kanarki. Atrapy w 3 istniejących testach dostały symbol i stronę.S-8 — funding z limitem wieku
Wada:
compute_fundingprzenosił ostatnią stawkę na każdą kolejną świecę bez względu na jej wiek. Po zatrzymaniu pobieraniafunding_rateifunding_zwyglądały na świeże.Zmiana:
features.FUNDING_WIEK_MAX = 16 h(dwa interwały ogłoszenia Bybita). Starsza stawka nie trafia ani do cechy, ani do okna z-score: świeca dostaje brak wartości.UWAGA … funding PRZETERMINOWANY na N świecach (najstarsza stawka X h, limit 16 h).dozor.py --co swiezoscpyta też omarket.funding_rate, z progiem równym temu samemu limitowi. Dotyczy tylko silników, które mają instrumenty zmeta->>'funding_from', więc equity nie dostaje „brak danych”.ocen_swiezoscprzyjmuje opcjonalnyprog_minw wierszu. Zapytanie sprawdzone na prawdziwym Postgresie (timescaledb-ha:pg17).Testy:
tests/test_funding_wiek.py: stojące pobieranie, kanarek ze świeżymi stawkami, granica 16/17 h, czujka (próg i zapytanie). Bez poprawki padają oba testy cechy; kanarek przechodzi.Do zrobienia po scaleniu: zmiana dotyka cech, więc wynik trenera trzeba zmierzyć przed i po (kryterium zamknięcia w 08-przed-go-live.md). Przy zdrowym pobieraniu limit nie zabiera żadnej świecy (kanarek). Zmienić się może tylko historia z lukami w fundingu powyżej 16 h, jeśli ktoś przeliczy cechy wstecz.
Poprawka z recenzji: czujka liczy wiek fundingu dla każdego instrumentu osobno (tylko aktywne) i alarmuje według najstarszego, z listą nieświeżych instrumentów w treści. Wcześniej
max(event_time)po wszystkich perpach przykrywało przestój jednego: BTC sprzed 2 h zasłaniał SOL sprzed 3 dni. Alarm jest jeden, a nie jeden na instrument, bo padnięty zbieracz to jedna awaria. Test na prawdziwej bazie z dwoma instrumentami (test_czujka_fundingu_liczy_wiek_PER_INSTRUMENT_na_prawdziwej_bazie) na starym zapytaniu pada: wiek 120 min zamiast ~72 h.Znana luka trening–produkcja (bez naprawy w tym PR): wiersze
feat.feature_value(funding_rate,funding_z) policzone przed tą zmianą zostają w historii z wypełnieniem w przód, także przez przerwy w fundingu dłuższe niż 16 h. Trener uczy się więc na wartościach, których produkcja w tej samej sytuacji już nie dostanie (dostanie brak). Domknięcie wymaga przeliczenia cech wstecz (--backfill) i pomiaru trenera przed i po.Zapytanie dla właściciela (tylko SELECT): przerwy dłuższe niż 16 h w
market.funding_rate, czyli miejsca, gdzie stara historia cech ma przeterminowane wartości:Pusty wynik znaczy, że stara historia cech nie ma przeterminowanych wartości i luka jest czysto teoretyczna. Nie widać tu natomiast przerwy po OSTATNIEJ stawce, ale tę zgłasza teraz czujka.
Ceny ucięte do 2 miejsc
Wada: limit, cel i średnia cena szły przez
fmtMoney(2 miejsca), więc 0.012345 wyświetlało się jako „0,01”.Zmiana:
fmtPricewweb/src/utils/format.js: co najmniej 6 cyfr znaczących, nie mniej niż 2 miejsca po przecinku. Użyty wMoves.jsx(limit, cel, średnia cena) iOverview.jsx(planowane zlecenia, pozycje). API nie podaje tu kroku ceny instrumentu, więc zastosowano wariant „co najmniej 6 cyfr znaczących” z kryterium zamknięcia.Testy: stend UI, scenariusz 7 (0.012345 i 0.4567). Na buildzie z
origin/main4 błędy, na tej gałęzi zielono.Ilości (dołożone):
fmtNum(qty, 4)ucinało małe ilości drogich instrumentów (0.000123 BTC → „0.0001”).fmtQtyużywa tej samej reguły 6 cyfr znaczących, bez minimum miejsc po przecinku, i ucina zamiast zaokrąglać (roundingMode: 'trunc'): 0.9999996 pokazuje się jako 0,999999, a nie „1”. Zmiana obejmuje planowane zlecenia, pozycje, plany i transakcje. W scenariuszu 7 stendu są 2 nowe asercje, które na poprzednim buildzie padają.„Usuń” bez potwierdzenia
Wada: jedno kliknięcie wysyłało
DELETEprzy kluczu giełdy, kluczu usługi i portfelu.Zmiana: nowy komponent
web/src/components/Potwierdzenie.jsx, okno w aplikacji, a nie natywneconfirm():<body>, bo.glass-cardmabackdrop-filteri przycinałbyposition: fixed;role="alertdialog", fokus ustawiany na „Anuluj” tylko przy otwarciu, a Escape i kliknięcie w tło zamykają okno;index.css.DELETEidzie dopiero po kliknięciu „Usuń klucz” / „Usuń portfel”.Testy: stend UI, scenariusz 8, dla każdego z trzech obiektów:
DELETE;DELETE;DELETEna właściwy adres;Na buildzie z
origin/main5 błędów, a dalej stend przerywa się na braku okna.Wyniki
ruff check .: czysto.python -B -m pytest tests/zTEST_DB_URL(lokalny timescaledb-ha:pg17 z migracjami): 3791 passed, 0 skipped (po poprawkach z recenzji).npm ci && npm run build(web): OK.node tests/stend_ui.spec.mjs: PRZESZEDŁ (wszystkie scenariusze 1-8).Uwaga: stend i test dymny chodzą tylko w
docker-publish.yml, czyli dopiero po pushu namain. Na PR uruchamia się wyłącznie pytest.🤖 Generated with Claude Code
https://claude.ai/code/session_017S4D5yYFQmJsfcLx14gnjE