maneshtrader/web_core/ui/help_content.py

242 lines
7.0 KiB
Python

from __future__ import annotations
import streamlit as st
_HELP_SCREENS: list[tuple[str, str]] = [
(
"Start Here",
"""
### What this app is for
Think of ManeshTrader like a **weather app for price candles**.
It does not place trades. It helps you answer:
- Is the market acting strong up, strong down, or messy?
- Did we get a real signal or just noise?
### The 10-second idea
Each candle gets a label:
- `real_bull`: a strong up break
- `real_bear`: a strong down break
- `fake`: noise inside the old range
Trend rule:
- 2 real up candles in a row => bullish trend
- 2 real down candles in a row => bearish trend
- Fake candles alone do not flip trend
### Why you should care
This turns a messy chart into simple states:
- **Go with up trend**
- **Go with down trend**
- **Wait when unclear**
""",
),
(
"How To Use",
"""
### A simple 5-step routine
1. Pick one symbol.
2. Use `1d` timeframe and `6mo` period.
3. Turn on `Show live decision guide` and `Show past behavior examples`.
4. Read trend + check latest examples.
5. Decide: follow trend, or stand aside if choppy.
### Important safety notes
- This app is **analysis-only**.
- It does **not** execute orders.
- Backtests and examples are educational.
- Never risk money you cannot afford to lose.
""",
),
(
"Main Setup",
"""
### Core controls (left sidebar)
These are your main knobs.
- `Symbol`: what you are looking at (`AAPL`, `BTC-USD`).
Why care: wrong symbol = wrong answer.
- `Timeframe`: candle size (`1d`, `4h`, `1h`, etc.).
Why care: smaller = noisier, bigger = smoother.
- `Period`: how much history to load.
Why care: too short can miss context, too long can feel slow.
- `Max bars`: cap on candles loaded.
Why care: helps performance and keeps chart readable.
- `Ignore potentially live last bar`: ignores the newest unfinished candle.
Why care: unfinished candles can lie before they close.
### Child-friendly default
Start with:
- `Timeframe = 1d`
- `Period = 6mo`
- `Ignore potentially live last bar = ON`
""",
),
(
"Filters",
"""
### Classification Filters
These help you reduce fake signals.
- `Use previous body range (ignore wicks)`
Means: compare against candle body, not long spikes.
Why care: reduces wick tricks.
- `Enable volume filter`
Means: low-volume moves are treated as fake.
Why care: weak moves often fail.
- `Volume SMA window`
Means: how many candles used for average volume.
Why care: bigger window = steadier average.
- `Min volume / SMA multiplier`
Means: how much volume is required vs average.
Why care: higher value = stricter filter.
- `Gray out fake bars`
Means: noise bars fade visually.
Why care: easier to focus on important candles.
- `Hide market-closed gaps (stocks)`
Means: removes weekend/closed-market blank spaces.
Why care: cleaner chart shape.
""",
),
(
"Training Mode",
"""
### Training & Guidance controls
Use this section to learn the model.
- `Show live decision guide`
Why care: tells bias (long/short/neutral) in plain English.
- `Show past behavior examples`
Why care: shows historical examples of how signals played out.
- `Overlay example entries/exits on chart`
Why care: lets you see examples directly on candles.
- `Focus chart on selected example`
Why care: zooms to one example so you can study it.
- `Max training examples`
Why care: more examples = more history, but busier table.
- `Replay mode (hide future bars)` + `Replay bars shown`
Why care: practice without seeing the future first.
### Kid version
Replay mode is like covering answers on a worksheet,
then checking if your guess was right.
""",
),
(
"Monitoring + Advanced",
"""
### Monitoring
- `Auto-refresh`
Why care: keeps data fresh while you watch.
- `Refresh interval (seconds)`
Why care: lower is faster updates, but more load.
- `Display Timezone (US)`
Why care: shows audit/event/training times in your preferred U.S. timezone (default CST/CDT).
- `Use 24-hour time`
Why care: choose `13:00` style (ON) or `1:00 PM` style (OFF).
### Advanced Signals
- `Auto-run advanced panels (slower)`
Why care: always-updated extras, but heavier.
- `Run advanced panels now`
Why care: one-time run when you want speed normally.
- `Show multi-timeframe confirmation`
Why care: checks if 1h/4h/1d agree.
- `Regime filter`
Why care: warns when market is choppy (messy).
### Compare Symbols + Alerts
- `Enable compare symbols panel`
- `Compare symbols (comma separated)`
Why care: quick side-by-side trend check.
- `Enable alert rules`
- `Alert on bullish confirmations`
- `Alert on bearish confirmations`
- `Webhook URL (optional)`
Why care: get notified instead of watching charts all day.
""",
),
(
"Backtest Controls",
"""
### What a backtest is
A backtest asks: "If we used these rules in the past, what happened?"
It is practice data, not a promise.
### Every backtest control explained
- `Slippage (bps per side)`
Meaning: extra price loss when entering/exiting.
Why care: real fills are rarely perfect.
- `Fee (bps per side)`
Meaning: trading cost paid on entry and exit.
Why care: costs can erase small wins.
- `Stop loss (%)`
Meaning: emergency exit if price moves against you by this percent.
Why care: limits damage.
Note: `0` means OFF.
- `Take profit (%)`
Meaning: lock gains once profit reaches this percent.
Why care: prevents giving back wins.
Note: `0` means OFF.
- `Min hold bars`
Meaning: shortest time a trade must stay open.
Why care: avoids instant in-and-out noise trades.
- `Max hold bars`
Meaning: longest time a trade can stay open.
Why care: forces an exit if nothing happens.
### Simple example
If `Stop loss = 2%`, you are saying:
"If I am down 2%, I am out."
If `Take profit = 4%`, you are saying:
"If I am up 4%, I will lock it."
""",
),
]
@st.dialog("Help & Quick Start", width="large")
def help_dialog() -> None:
total = len(_HELP_SCREENS)
if "help_screen_index" not in st.session_state:
st.session_state["help_screen_index"] = 0
options = [title for title, _ in _HELP_SCREENS]
safe_index = min(max(int(st.session_state["help_screen_index"]), 0), total - 1)
st.session_state["help_screen_index"] = safe_index
picker_col, _ = st.columns([3, 2])
with picker_col:
selected_title = st.selectbox("Help Screen", options, index=safe_index)
selected_index = options.index(selected_title)
if selected_index != st.session_state["help_screen_index"]:
st.session_state["help_screen_index"] = selected_index
safe_index = selected_index
st.caption(f"Screen {safe_index + 1} of {total}")
st.markdown(_HELP_SCREENS[safe_index][1])
nav_col, _ = st.columns([2, 5])
prev_col, next_col = nav_col.columns(2)
with prev_col:
if st.button("Previous", disabled=safe_index == 0):
st.session_state["help_screen_index"] = max(safe_index - 1, 0)
with next_col:
if st.button("Next", disabled=safe_index >= total - 1):
st.session_state["help_screen_index"] = min(safe_index + 1, total - 1)