BTC285,0k zł2,20%
ETH9,03k zł3,44%
XRP4,88 zł7,76%
LTC192 zł2,89%
BCH826 zł1,08%
DOT3,57 zł4,04%

Zestaw kodu tradera — Python i Pine Script

Sześć fragmentów kodu do skopiowania: cztery w Pythonie (wczytanie dziennika CSV, metryki, krzywa kapitału z obsunięciem, sizer pozycji z ATR) i dwa w Pine Script (zakres dnia względem ATR z alertem oraz okna sesji z planu na wykresie). Wszystko to narzędzia ANALITYCZNE — liczą, rysują i przypominają; żaden fragment nie generuje sygnałów i nie podejmuje decyzji, bo od tego jest playbook. Kod i komentarze są celowo po angielsku (język dokumentacji i komunikatów o błędach — ten sam wzorzec, który wymusza warsztat AI), a opisy wokół prowadzą krok po kroku. Środowisko: instalacja Pythona i pierwsze uruchomienia są w 11.8; nagłówki kolumn dziennika — w dodatku F.

Zestaw startowy kodu tradera — edytor z fragmentem Pythona liczącym expectancy z dziennika CSV obok wykresu krzywej kapitału i wskaźnika Pine Script z oknami sesji
Najważniejsze w 60 sekund
  • Narzędzia, nie strategie: kod liczy metryki z TWOICH danych i pilnuje TWOJEGO planu — granica jest ta sama, co w bloku „czego AI nie robi" dodatku H, i z tych samych powodów
  • Wspólny format danych: fragmenty Pythona czytają nagłówki z arkusza dziennika (dodatek F) — win rate liczy break-even w mianowniku, expectancy z wyniku netto; te same definicje co w prompcie P5
  • Pine Script bez lookahead: oba wskaźniki używają wzorca lookahead=barmerge.lookahead_off — tego samego, którego brak wykrywa przegląd kodu promptem P3
  • Sizer zaokrągla wolumen W DÓŁ: przy przeliczaniu ryzyka na loty zaokrąglenie w górę systematycznie podnosi ryzyko ponad plan — ta jedna linijka kodu to różnica między 1% a „około 1%"

Zanim uruchomisz: trzy zasady

  • Czytasz, zanim uruchomisz. Każdy fragment jest krótki celowo — masz rozumieć każdą linijkę. Kod, którego nie rozumiesz, modyfikujesz z pomocą przeglądu z promptu P3, nie „na czuja"; a fragmentów z forów i czatów ta zasada dotyczy podwójnie.
  • Dane wchodzą z plików, decyzje nie wychodzą z kodu. Skrypty czytają eksport dziennika (format z dodatku F) i parametry, które podajesz jawnie. Wynik to liczby i wykresy do przeglądu tygodniowego — wnioski wyciągasz Ty, w rytmie audytu z 15.10, na próbie, która coś znaczy.
  • Środowisko z 11.8: Python 3 z pakietami pandas i matplotlib (instalacja i pierwszy skrypt — tam). Pine Script wklejasz w edytorze wskaźników platformy wykresowej; oba wskaźniki są wersji 6.
Pipeline analityczny: eksport dziennika CSV wchodzi do skryptów Pythona, wychodzą metryki i wykres krzywej kapitału, a wnioski trafiają do przeglądu tygodniowego i playbooka Dziennik CSVformat z dodatku F Python: S1–S3metryki · krzywa · obsunięcie Przegląd EOWliczby czytane na próbie 50+ Playbookzmiany tylko kwartalnie w tym pipelinie nie ma strzałki „kod → zlecenie" — i to nie jest przeoczenie
S1 · Wczytanie dziennika CSV Python 3 · pandas

Punkt wejścia dla S2 i S3: czyta eksport arkusza z dodatku F, waliduje nagłówki i czyści kolumnę r_net. Ustaw separator i przecinek dziesiętny zgodnie z wariantem CSV (PL: średnik i przecinek, EN: przecinek i kropka).

import pandas as pd

CSV_PATH = "dziennik.csv"   # journal export (add-on F structure)
CSV_SEP  = ";"              # ";" for PL-locale CSV, "," for EN
DECIMAL  = ","              # "," for PL-locale CSV, "." for EN

REQUIRED = ["r_net", "setup", "setup_class", "error_code"]

df = pd.read_csv(CSV_PATH, sep=CSV_SEP, decimal=DECIMAL)

missing = [c for c in REQUIRED if c not in df.columns]
if missing:
    raise SystemExit(f"Missing columns: {missing} — check headers against add-on F.")

df["r_net"] = pd.to_numeric(df["r_net"], errors="coerce")
skipped = int(df["r_net"].isna().sum())
df = df.dropna(subset=["r_net"]).reset_index(drop=True)

print(f"Loaded {len(df)} trades ({skipped} rows skipped: empty or invalid r_net).")

Dostaniesz: ramkę danych df gotową dla kolejnych fragmentów plus informację, ile wierszy odpadło. Jeśli odpada więcej niż kilka — napraw dziennik, nie skrypt.

S2 · Metryki dziennika Python 3 · pandas

Te same definicje co w prompcie P5 i dashboardzie arkusza: win rate z break-even w mianowniku, profit factor z komunikatem zamiast dzielenia przez zero, expectancy jako średnia z r_net, obsunięcie z krzywej skumulowanej. Uruchamiaj po S1.

def metrics(r):
    """Core journal metrics on a series of net R-multiples.
    Definitions (same as add-on F dashboard):
    - win rate: trades with r > 0 over ALL valid trades (break-even stays in denominator)
    - profit factor: sum of positive r over abs(sum of negative r)
    - expectancy: arithmetic mean of r (net of costs)
    - max drawdown: max drop of the cumulative R curve from its running peak"""
    n = len(r)
    if n == 0:
        raise SystemExit("No valid trades — nothing to measure.")
    wins   = r[r > 0]
    losses = r[r < 0]
    equity   = r.cumsum()
    drawdown = equity.cummax() - equity
    pf = "no losses in sample" if losses.empty else round(wins.sum() / abs(losses.sum()), 2)
    return {
        "trades":         n,
        "win_rate":       round(len(wins) / n, 3),
        "profit_factor":  pf,
        "expectancy_R":   round(r.mean(), 3),
        "sum_R":          round(r.sum(), 2),
        "max_drawdown_R": round(drawdown.max(), 2),
    }

for key, value in metrics(df["r_net"]).items():
    print(f"{key:>16}: {value}")

Dostaniesz: sześć liczb do przeglądu tygodniowego. Nie oczekuj: oceny systemu na 20 transakcjach — interpretacja progów jest w tabeli dashboardu dodatku F.

S3 · Krzywa kapitału i obsunięcie Python 3 · pandas + matplotlib

Rysuje krzywą skumulowanego R i pod nią obsunięcie od szczytu, zapisuje PNG obok skryptu. Krzywa kapitału mówi o charakterze systemu więcej niż każda pojedyncza liczba — zwłaszcza o klastrach strat. Uruchamiaj po S1.

import matplotlib.pyplot as plt

equity   = df["r_net"].cumsum()
drawdown = equity.cummax() - equity

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(9, 6), sharex=True,
                               gridspec_kw={"height_ratios": [3, 1]})
ax1.plot(equity.index + 1, equity.values)
ax1.set_ylabel("equity (R)")
ax1.set_title("Equity curve — cumulative net R")
ax1.grid(True, alpha=0.3)

ax2.fill_between(drawdown.index + 1, -drawdown.values, 0, alpha=0.5)
ax2.set_ylabel("drawdown (R)")
ax2.set_xlabel("trade #")
ax2.grid(True, alpha=0.3)

fig.tight_layout()
fig.savefig("equity_curve.png", dpi=150)
print("Saved: equity_curve.png")

Dostaniesz: plik equity_curve.png. Porównaj maksimum dolnego panelu z limitem tygodniowym z planu (dodatek E) — historia głębsza niż limit oznacza niespójny sizing.

S4 · Sizer pozycji z ATR Python 3 · biblioteka standardowa

Wolumen w lotach dla stopa o szerokości k × ATR: kwota ryzyka z kapitału i procentu, dystans z ATR, zaokrąglenie W DÓŁ do 0,01 lota — żeby faktyczne ryzyko nigdy nie przekroczyło planu. Wartość pipsa dla 1 lota znajdziesz w specyfikacji instrumentu (albo policzysz kalkulatorem z dodatku C).

import math

def atr_position_size(capital, risk_pct, atr_pips, atr_mult, pip_value_per_lot):
    """Volume in lots for a stop of atr_mult × ATR.
    pip_value_per_lot: value of 1 pip for 1.00 lot, in account currency
    (e.g. ~10 USD for EURUSD on a USD account — check instrument specs).
    Rounds DOWN to 0.01 lot so real risk never exceeds the plan."""
    if min(capital, risk_pct, atr_pips, atr_mult, pip_value_per_lot) <= 0:
        raise ValueError("All inputs must be positive numbers.")
    risk_amount = capital * risk_pct / 100.0
    sl_pips     = atr_mult * atr_pips
    lots_exact  = risk_amount / (sl_pips * pip_value_per_lot)
    lots        = math.floor(lots_exact * 100) / 100
    if lots < 0.01:
        return {"warning": "Risk too small for 0.01 lot — widen capital or accept higher %."}
    return {"risk_amount": round(risk_amount, 2),
            "sl_pips":     round(sl_pips, 1),
            "lots":        lots,
            "real_risk":   round(lots * sl_pips * pip_value_per_lot, 2)}

print(atr_position_size(capital=10_000, risk_pct=1.0,
                        atr_pips=80, atr_mult=1.5, pip_value_per_lot=10.0))
# {'risk_amount': 100.0, 'sl_pips': 120.0, 'lots': 0.08, 'real_risk': 96.0}

Dostaniesz: loty plus RZECZYWISTĄ kwotę ryzyka po zaokrągleniu (zawsze ≤ plan). Nie oczekuj: decyzji, czy wchodzić — sizer liczy „ile", nigdy „czy".

S5 · Zakres dnia vs ATR z alertem Pine Script v6 · wskaźnik

Narzędzie świadomości zmienności: pokazuje, jaki procent dziennego ATR rynek już „zużył", i alarmuje po przekroczeniu progu — moment na pytanie z planu, nie na pogoń. Dane dzienne pobierane bez lookahead (wzorzec z przeglądu P3).

//@version=6
indicator("Daily range vs ATR (awareness tool)", overlay=false)

atrLen  = input.int(14, "ATR length", minval=2)
warnPct = input.int(80, "Alert when day range reaches % of ATR", minval=10, maxval=200)

// higher-timeframe data WITHOUT lookahead — the pattern prompt P3 checks for
dayHigh = request.security(syminfo.tickerid, "D", high,            lookahead=barmerge.lookahead_off)
dayLow  = request.security(syminfo.tickerid, "D", low,             lookahead=barmerge.lookahead_off)
dayAtr  = request.security(syminfo.tickerid, "D", ta.atr(atrLen),  lookahead=barmerge.lookahead_off)

rangePct = dayAtr > 0 ? 100.0 * (dayHigh - dayLow) / dayAtr : na

plot(rangePct, "Day range as % of ATR", linewidth=2)
hline(100, "100% of ATR")
hline(80,  "Default alert level", linestyle=hline.style_dotted)

alertcondition(ta.crossover(rangePct, warnPct),
     title="Range reached % of ATR",
     message="Daily range reached your % of ATR — re-read the plan before any new entry.")

Dostaniesz: panel pod wykresem plus alert platformy. Nie oczekuj: sygnału kierunku — wysoki odczyt mówi „ruch już się odbył", a co z tym zrobić, mówi playbook.

S6 · Okna sesji z planu na wykresie Pine Script v6 · wskaźnik

Sekcja 3 planu (dodatek E) narysowana na wykresie: podświetla godziny, w których WOLNO otwierać pozycje, i alarmuje, gdy okno się zamyka. Godziny podajesz w strefie Europe/Warsaw — wskaźnik sam dba o zmiany czasu.

//@version=6
indicator("Trading-plan session windows", overlay=true)

tz   = input.string("Europe/Warsaw", "Time zone of the windows")
win1 = input.session("0900-1200", "Window 1")
win2 = input.session("1400-1700", "Window 2")

inWin = not na(time(timeframe.period, win1, tz)) or not na(time(timeframe.period, win2, tz))

bgcolor(inWin ? color.new(color.teal, 88) : na, title="Inside a plan window")

windowJustClosed = inWin[1] and not inWin
alertcondition(windowJustClosed,
     title="Plan window closed",
     message="Your trading window just closed — manage open positions only, no new entries (plan, section 3).")

Dostaniesz: tło w godzinach handlu i alert na zamknięcie okna. Nie oczekuj: blokady zleceń — wskaźnik przypomina o planie; egzekwuje go Twoja checklista pre-trade.

Cały zestaw jednym plikiem generowany lokalnie w przeglądarce

Sześć fragmentów z nagłówkami w jednym pliku tekstowym — do archiwum przy dzienniku albo do wklejenia we własne repozytorium.

Wynik skryptu S3 — wykres krzywej kapitału w R z panelem obsunięcia poniżej, obok edytor z otwartym fragmentem kodu i terminal z wydrukiem metryk dziennika
Wynik skryptu S3 — wykres krzywej kapitału w R z panelem obsunięcia poniżej, obok edytor z otwartym fragmentem kodu i terminal z wydrukiem metryk dziennika

FAQ

Dlaczego kod i komentarze są po angielsku, skoro kurs jest polski?

Bo angielski jest językiem środowiska, w którym ten kod żyje: dokumentacji pandas i Pine Script, komunikatów o błędach, odpowiedzi na forach i — coraz częściej — przeglądów robionych z pomocą modeli AI, które na angielskim kodzie pracują stabilniej (P3). Polskie opisy wokół fragmentów mówią, CO kod robi i kiedy go użyć; angielskie komentarze w środku mówią JAK — i pozostają zrozumiałe dla każdego narzędzia i człowieka, któremu kiedyś ten kod pokażesz. Wyjątek z promptu P5 (komentarze po polsku w kodzie generowanym na Twoje zamówienie) dotyczy kodu jednorazowego, nie biblioteki.

Jak uruchomić fragmenty Pythona?

Instalację Pythona, środowiska i pakietów prowadzi krok po kroku 11.8 — na potrzeby tego zestawu wystarczą pandas i matplotlib. Fragmenty S1–S3 sklejasz w jeden plik (S1 na górze) i uruchamiasz w katalogu z eksportem dziennika; S4 działa samodzielnie. Jeśli terminal odpowiada błędem, którego nie rozumiesz — wklej kod i pełny komunikat do przeglądu P3 z dodatku H, zamiast zgadywać.

Mogę te fragmenty modyfikować i rozbudowywać?

Po to są — to zestaw STARTOWY. Naturalne rozszerzenia: metryki per setup (grupowanie po kolumnie setup przed wywołaniem funkcji z S2), filtr po error_code, żeby policzyć expectancy czystego wykonania, albo osobne krzywe dla klas A+/B. Dwie zasady przy modyfikacjach: każdą zmianę przepuszczasz przez przegląd P3 (zwłaszcza wszystko, co dotyka request.security w Pine), a definicji metryk nie zmieniasz w trakcie kwartału — porównywalność tygodni jest ważniejsza od doskonałości wzoru.

Dlaczego w zestawie nie ma strategii ani EA?

Z tego samego powodu, dla którego warsztat AI nie generuje sygnałów: gotowa strategia z internetu ma nieznaną przewagę, nieznane założenia i zero związku z Twoim planem — a EA wykonujący cudzą logikę na Twoim rachunku to delegowanie decyzji, za które płacisz wyłącznie Ty. Kod w tym kursie wzmacnia proces (pomiar, wizualizacja, pilnowanie planu), nie zastępuje go. Jeśli chcesz automatyzować własną, przetestowaną strategię — ścieżka prowadzi przez backtest z 15.10 i przegląd kodu P3, nie przez kopiowanie „zyskownych" skryptów.

Z praktyki: zaokrąglanie „bo równiej". Scenariusz modelowy z audytów dzienników: sizer wyliczał 0,07 lota, trader klikał 0,1 — „różnica kosmetyczna, a okrągło". Kosmetyka po przeliczeniu: +43% ryzyka na każdej transakcji, systematycznie, przez cały kwartał; limit dzienny −2R był faktycznie limitem −2,9R, a obsunięcie z krzywej kapitału przekroczyło plan, choć żadna pojedyncza decyzja „nie łamała zasad". Stąd math.floor w S4 zamiast round: maszyna zaokrągla w dół bez dyskusji, człowiek — w górę z uzasadnieniem.
Z praktyki: klaster strat widoczny dopiero na krzywej. Metryki kwartału wyglądały przyzwoicie: expectancy dodatnie, obsunięcie w normie. Dopiero wykres z S3 pokazał, że całe obsunięcie to jeden tydzień — a filtr po godzinie wejścia dodany do S2 doprecyzował: wszystkie wpadki między 21:00 a 23:00, po rolowaniu, na szerokich spreadach, „bo jeszcze chwilę posiedzę". Liczba zbiorcza uśrednia; krzywa pokazuje KIEDY system krwawi. Jedna linijka w planie (koniec wejść o 21:00) zrobiła dla wyniku więcej niż jakakolwiek zmiana strategii — i to jest dokładnie ten rodzaj wniosku, do którego ten zestaw istnieje.

Powiązane w kursie

Zastrzeżenie: strona ma charakter edukacyjny i nie jest poradą inwestycyjną. Fragmenty kodu są narzędziami analitycznymi uruchamianymi na własną odpowiedzialność: przed użyciem czytasz kod, wyniki weryfikujesz (np. kalkulatorem z dodatku C), a decyzje handlowe podejmujesz według własnego planu. Kod nie łączy się z internetem ani rachunkiem — czyta lokalne pliki i rysuje wykresy; nie generuje sygnałów i nie składa zleceń.

Źródła

  1. Dokumentacje: pandas i matplotlib (funkcje użyte w S1–S3), TradingView Pine Script v6 Reference Manual (request.security z parametrem lookahead, input.session, alertcondition) — zgodność zweryfikowana lipiec 2026.
  2. Wewnętrzne: 11.8 Python w tradingu (środowisko), 15.9 (definicje metryk i format dziennika), 15.10 (zasady wnioskowania) — zestaw jest ich wykonawczym skrótem.
  3. Van K. Tharp, Trade Your Way to Financial Freedom, wyd. 2, McGraw-Hill 2007 — R-multiple i expectancy, wspólny język S2, arkusza F i promptu P5.

Jarosław Wasiński LinkedIn

Redaktor naczelny MyBank.pl • Analityk finansowy i rynkowy

mgr Jarosław Wasiński — niezależny analityk i praktyk z ponad 20-letnim doświadczeniem w sektorze finansowym. Twórca i redaktor naczelny portalu MyBank.pl, dostarczającego rzetelną wiedzę o finansach osobistych, bankowości i inwestycjach od 2004 roku.

  • Bankowość i produkty finansowe: porównania kont osobistych i firmowych, analiza taryf opłat, testy aplikacji mobilnych, recenzje kredytów, lokat i kart kredytowych — z naciskiem na realne koszty i ukryte opłaty.
  • Rynki finansowe i makroekonomia: analiza fundamentalna rynków walutowych (Forex) i makroekonomicznych od 2007 roku, zarządzanie ryzykiem kapitału, struktura rynków OTC.
  • Kryptowaluty: analiza rynku kryptowalut, mechanizmów blockchain i tokenizacji aktywów w kontekście portfela inwestycyjnego.

Autor setek komentarzy rynkowych, analiz porównawczych produktów bankowych i materiałów edukacyjnych. Zwolennik transparentności — każdy ranking i recenzja na MyBank.pl opiera się na jawnej metodologii i zweryfikowanych źródłach (taryfy banków, regulaminy promocji, dane NBP).

Treści mają charakter edukacyjny i informacyjny — nie stanowią porady inwestycyjnej, rekomendacji ani oferty. Decyzje finansowe podejmuj na podstawie własnej analizy i konsultacji z doradcą.