From 2b5c9c950fce78393381a518833ce813af093a32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E9=B9=8F?= Date: Wed, 8 Jul 2026 17:18:12 +0800 Subject: [PATCH] chore: scaffold python desktop app --- README.md | 18 ++++++++++++++++++ pyproject.toml | 27 +++++++++++++++++++++++++++ src/grid_trading/__init__.py | 1 + src/grid_trading/app.py | 29 +++++++++++++++++++++++++++++ src/grid_trading/config.py | 20 ++++++++++++++++++++ tests/test_imports.py | 6 ++++++ 6 files changed, 101 insertions(+) create mode 100644 README.md create mode 100644 pyproject.toml create mode 100644 src/grid_trading/__init__.py create mode 100644 src/grid_trading/app.py create mode 100644 src/grid_trading/config.py create mode 100644 tests/test_imports.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..49c6255 --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# Grid Trading + +本项目是一个本地运行的 Python GUI 网格交易管理工具,第一阶段聚焦 A股/ETF 的账户、标的、手工成交、持仓成本、网格收益和回本价计算。 + +## 开发环境 + +```powershell +python -m venv .venv +.\.venv\Scripts\Activate.ps1 +python -m pip install -e ".[dev]" +pytest +``` + +## 启动 + +```powershell +python -m grid_trading.app +``` diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b129cdf --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,27 @@ +[build-system] +requires = ["setuptools>=68"] +build-backend = "setuptools.build_meta" + +[project] +name = "grid-trading" +version = "0.1.0" +description = "Local A-share and ETF grid trading management GUI" +requires-python = ">=3.11" +dependencies = [ + "PySide6>=6.7", +] + +[project.optional-dependencies] +dev = [ + "pytest>=8", +] + +[project.scripts] +grid-trading = "grid_trading.app:main" + +[tool.setuptools.packages.find] +where = ["src"] + +[tool.pytest.ini_options] +pythonpath = ["src"] +testpaths = ["tests"] diff --git a/src/grid_trading/__init__.py b/src/grid_trading/__init__.py new file mode 100644 index 0000000..3dc1f76 --- /dev/null +++ b/src/grid_trading/__init__.py @@ -0,0 +1 @@ +__version__ = "0.1.0" diff --git a/src/grid_trading/app.py b/src/grid_trading/app.py new file mode 100644 index 0000000..3fcd89e --- /dev/null +++ b/src/grid_trading/app.py @@ -0,0 +1,29 @@ +from __future__ import annotations + +import argparse +import sys + + +def build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="grid-trading", + description="Local A-share and ETF grid trading manager.", + ) + parser.add_argument( + "--db", + help="Path to the SQLite database. Defaults to data/grid_trading.db.", + ) + return parser + + +def main(argv: list[str] | None = None) -> int: + parser = build_parser() + args = parser.parse_args(argv) + + from grid_trading.ui.main_window import run_gui + + return run_gui(db_path=args.db) + + +if __name__ == "__main__": + raise SystemExit(main(sys.argv[1:])) diff --git a/src/grid_trading/config.py b/src/grid_trading/config.py new file mode 100644 index 0000000..25b622a --- /dev/null +++ b/src/grid_trading/config.py @@ -0,0 +1,20 @@ +from __future__ import annotations + +from dataclasses import dataclass +from decimal import Decimal +from pathlib import Path + + +PROJECT_ROOT = Path(__file__).resolve().parents[2] +DEFAULT_DB_PATH = PROJECT_ROOT / "data" / "grid_trading.db" + + +@dataclass(frozen=True) +class DefaultFeeConfig: + commission_rate: Decimal = Decimal("0.00025") + min_commission: Decimal = Decimal("5") + stamp_tax_rate: Decimal = Decimal("0.0005") + transfer_fee_rate: Decimal = Decimal("0.00001") + + +DEFAULT_FEE_CONFIG = DefaultFeeConfig() diff --git a/tests/test_imports.py b/tests/test_imports.py new file mode 100644 index 0000000..5547d3a --- /dev/null +++ b/tests/test_imports.py @@ -0,0 +1,6 @@ +def test_package_imports(): + import grid_trading + from grid_trading.config import DEFAULT_DB_PATH + + assert grid_trading.__version__ + assert DEFAULT_DB_PATH.name == "grid_trading.db"