Open Net Worth
Open Net Worth is an open-source personal AI wealth assistant you run yourself: one ledger for your whole financial life, worked by an AI agent you control.
翻訳待ち
TradePicker — a rule-based decision-support screen for Nifty, Bank Nifty and Sensex index options. Shows its working, places no orders unless you switch them on, and was measured negative after costs.
翻訳待ち
金融Python · ShellGitHub @Snsureshkumar97オンライン所有者未確認
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Trading tool Nifty/Sensex/BankNifty
翻訳待ち
Loading the full README. The saved excerpt is shown below.
Nifty / BankNifty / Sensex CE-PE Signal Tool
A rule-based decision-support tool for index options trading: a TradingView
Pine Script indicator for on-chart signals, and a Python script that
combines trend + momentum + option-chain OI into a BUY CE / BUY PE / WAIT
suggestion with a suggested strike, 3-tier targets (T1/T2/T3), a stop-loss,
and — when option-chain/live data is available — the real live option
premium (LTP) for that strike with its own 3 premium-based targets.Read the full README ↗A rule-based decision-support tool for index options trading: a TradingView Pine Script indicator for on-chart signals, and a Python script that combines trend + momentum + option-chain OI into a BUY CE / BUY PE / WAIT suggestion with a suggested strike, 3-tier targets (T1/T2/T3), a stop-loss, and — when option-chain/live data is available — the real live option premium (LTP) for that strike with its own 3 premium-based targets.
The screen is drawn by skin.py on a single canvas — no native buttons, tabs or
checkboxes anywhere in the main view. That is deliberate. Tk's own widgets look
different on macOS, Windows and Linux and cannot do gradients or rounded
corners, so the layout would have drifted apart on each machine. Painting it
means one appearance everywhere, and it means the whole screen can be rendered
to a PNG without a display, which is how the layout is checked.
Three files:
| File | Does |
|---|---|
theme.py | every colour and font, with the validator's verdict recorded beside the ones that carry meaning |
ui_kit.py | gradients, rounded cards, pill tabs, the ring gauge, the sparkline, the rail icons |
skin.py | the layout itself, plus hit-testing for clicks |
skin_bridge.py | connects gui.py's existing render code to the painted screen |
gui.py was not rewritten. It still calls .config(text=…) on about forty
labels; skin_bridge.py hands it stand-ins that file each value under a name
and repaint. All the trading logic — the worker thread, the ticket lock, the
trade tracking — is untouched.
| Icon | Page |
|---|---|
| pulse | the signal board (Signal and Chart tabs) |
| grid | Market Map — the sector heat map, full width |
| bars | Your trades — the summary from trades.csv |
| bell | switches the popup alerts on and off |
| gear | Settings — token state, where credentials live, which files are written |
The bell is a switch rather than a destination. The icons are spaced by solving for the room between the logo and the theme toggle rather than by a fixed pitch, so the rail stays clear of the bottom controls at every window size the app allows.
The Market Map used to open in its own window. It is a page on the rail now, which gives it the whole area instead of a third of it.
A live signal and an issued ticket are different things. Five rules sit between them, and the ticket now names the one that is holding it rather than asserting a reason:
| Badge | What is actually happening |
|---|---|
CONFIRMING | the direction has to hold for SIGNAL_CONFIRM_SECONDS before anything is issued |
COOLDOWN | MIN_MINUTES_BETWEEN_TICKETS since the last ticket has not elapsed |
POSITION OPEN | a ticket is already running on this index and is left alone |
ALREADY TAKEN | this index was ticketed in this direction today, and re-entry is off |
DAY LIMIT | the daily brake in entry_block() |
The screen used to print "a ticket is issued when the direction changes" whatever the reason. That sentence is true for exactly one of those five rows, and it is the least common one — so a 100%-confidence signal waiting out a cooldown read as though the tool disagreed with a screen full of agreement.
MIN_MINUTES_BETWEEN_TICKETS is 0 — the twenty-minute hold was removed by
request, so COOLDOWN no longer appears for that reason. Put a number of
minutes back in config.py to restore it; TICKET_GAP_PER_INDEX then decides
whether that gap is shared across the three indices or counted separately.
Auto re-arm keeps its own floor, REARM_MIN_SECONDS = 60, which is not a churn
brake and is not meant to be tuned. Re-arm skips the confirmation window by
design, so with the gap at 0 and the daily limits switch off, nothing else
stands between a close and the next open: a ticket whose stop is already
breached closes on the next evaluation and re-arms immediately, four times a
second, until the option chain refreshes. That was thirteen tickets in twelve
seconds when it happened. A genuine re-entry a minute later is still taken.
The three tiers were never partial exits. The comment in config.py said
"scale out at each tier" — that is how a person would trade them, but the tool
has never done it: it holds the whole position and closes on one exit. T1
and T2 tick, timestamp and tell you the move is working. They book nothing.
So this is already a single-target system, and EXIT_AT_TARGET is that target:
PREMIUM_TARGET_PCTS = [20, 40, 75] # where T1, T2, T3 sit
EXIT_AT_TARGET = "T3" # which one ends the trade
Nearer target = higher win rate, smaller wins. Further = the reverse. Measured on the 162 logged trades, counting only the ones the market actually decided:
| Exit at | Win rate | Avg reward:risk | Break-even needs | R per trade |
|---|---|---|---|---|
| T1 +20% | 75.0% | 0.54 : 1 | 64.8% | +0.12R |
| T2 +40% | 61.2% | 0.95 : 1 | 51.2% | +0.09R |
| T3 +75% | 48.9% | 1.36 : 1 | 42.4% | −0.05R |
Read that with care. Between 98 and 117 of the 162 were closed early by a
signal flip before the market answered, and the ones that DID resolve are the
ones that moved decisively — which flatters every row. target_study.py prints
this table for any trades.csv and shows the size of the unknown column.
The setting is frozen into each ticket at entry, like the lots are, so changing it at lunchtime cannot move where a running trade was supposed to get out.
This is the beginning of the README. Read the rest at the original. Read the full README ↗