diff --git a/README.md b/README.md index 56bd1ce..e46964a 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ The selected `ACCOUNT_GROUP` is now the runtime identity. Keep broker-specific i | `ACCOUNT_GROUP` | Yes | Account-group selector. Set explicitly for each deployment. | | `IBKR_FEATURE_SNAPSHOT_PATH` | Conditionally required | Required for snapshot-backed profiles such as `russell_1000_multi_factor_defensive`, `tech_communication_pullback_enhancement`, and `mega_cap_leader_rotation_top50_balanced`. Path to the latest feature snapshot file (`.csv`, `.json`, `.jsonl`, `.parquet`). | | `IBKR_FRACTIONAL_SHARES_ENABLED` | No | Defaults to `false`; set `true` only after verifying fractional order support for this account/API path. | -| `IBKR_ORDER_QUANTITY_STEP` | No | Explicit order quantity step override; e.g. `1` for whole shares or `0.000001` for fractional sizing. Takes precedence over `IBKR_FRACTIONAL_SHARES_ENABLED`. | +| `IBKR_ORDER_QUANTITY_STEP` | No | Explicit order quantity step override; e.g. `1` for whole shares or `0.0001` for fractional sizing. Takes precedence over `IBKR_FRACTIONAL_SHARES_ENABLED`. | | `IBKR_MIN_ORDER_NOTIONAL_USD` | No | Minimum buy notional for fractional sizing; defaults to `50.0`. | | `IB_ACCOUNT_GROUP_CONFIG_SECRET_NAME` | Yes for Cloud Run | Secret Manager secret name for account-group config JSON. Recommended production source. | | `IB_ACCOUNT_GROUP_CONFIG_JSON` | No | Local/dev JSON fallback for account-group config. Not recommended for production Cloud Run. | @@ -162,7 +162,7 @@ IBKR_FEATURE_SNAPSHOT_MANIFEST_PATH=/var/manifests/tech_communication_pullback_e IBKR_DRY_RUN_ONLY=true # Keep whole-share sizing unless fractional API support has been verified for this account/API path. # IBKR_FRACTIONAL_SHARES_ENABLED=true -# IBKR_ORDER_QUANTITY_STEP=0.000001 +# IBKR_ORDER_QUANTITY_STEP=0.0001 GLOBAL_TELEGRAM_CHAT_ID= NOTIFY_LANG=zh ``` @@ -351,7 +351,7 @@ IBKR 账户 | `ACCOUNT_GROUP` | 是 | 账号组选择器,每个部署都要显式设置。 | | `IBKR_FEATURE_SNAPSHOT_PATH` | 条件必填 | `russell_1000_multi_factor_defensive`、`tech_communication_pullback_enhancement`、`mega_cap_leader_rotation_top50_balanced` 等快照策略需要。指向最新特征快照文件(`.csv`、`.json`、`.jsonl`、`.parquet`)。 | | `IBKR_FRACTIONAL_SHARES_ENABLED` | 否 | 默认 `false`;只有确认当前账户/API 路径支持碎股单后再设为 `true`。 | -| `IBKR_ORDER_QUANTITY_STEP` | 否 | 显式覆盖下单数量步进;如 `1` 表示整数股,`0.000001` 表示碎股数量步进。优先级高于 `IBKR_FRACTIONAL_SHARES_ENABLED`。 | +| `IBKR_ORDER_QUANTITY_STEP` | 否 | 显式覆盖下单数量步进;如 `1` 表示整数股,`0.0001` 表示碎股数量步进。优先级高于 `IBKR_FRACTIONAL_SHARES_ENABLED`。 | | `IBKR_MIN_ORDER_NOTIONAL_USD` | 否 | 碎股买入的最小名义金额;默认 `50.0`。 | | `IB_ACCOUNT_GROUP_CONFIG_SECRET_NAME` | Cloud Run 建议必填 | 账号组配置 JSON 在 Secret Manager 里的密钥名。生产环境推荐使用。 | | `IB_ACCOUNT_GROUP_CONFIG_JSON` | 否 | 本地开发用的账号组配置 JSON fallback。不建议在生产 Cloud Run 直接使用。 | diff --git a/requirements.txt b/requirements.txt index 69e09d2..207b6e0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ flask gunicorn -quant-platform-kit @ git+https://github.com/QuantStrategyLab/QuantPlatformKit.git@08ed04ae9796f54a2218ffb700f97e0e33bf312f -us-equity-strategies @ git+https://github.com/QuantStrategyLab/UsEquityStrategies.git@c9ec484c9a12cdffedf7d87c8906b93b21f50b1c +quant-platform-kit @ git+https://github.com/QuantStrategyLab/QuantPlatformKit.git@268171a74a1b522f03940af399f71c37e9a32c70 +us-equity-strategies @ git+https://github.com/QuantStrategyLab/UsEquityStrategies.git@47685bce6187b5e7d3f93bab72b72a7fc0d119d7 pandas numpy requests diff --git a/runtime_config_support.py b/runtime_config_support.py index a82efd7..0cdd112 100644 --- a/runtime_config_support.py +++ b/runtime_config_support.py @@ -144,6 +144,7 @@ def load_platform_runtime_settings( step_env="IBKR_ORDER_QUANTITY_STEP", fractional_env="IBKR_FRACTIONAL_SHARES_ENABLED", fractional_default=False, + fractional_step=0.0001, ), min_order_notional=resolve_float_env( os.environ, diff --git a/tests/test_execution_service.py b/tests/test_execution_service.py index 5b682e3..713587d 100644 --- a/tests/test_execution_service.py +++ b/tests/test_execution_service.py @@ -168,7 +168,7 @@ def fake_fetch_quote_snapshots(_ib, symbols): cash_reserve_ratio=0.0, rebalance_threshold_ratio=0.02, limit_buy_premium=1.005, - quantity_step=0.000001, + quantity_step=0.0001, min_order_notional=50.0, sell_settle_delay_sec=0, execution_lock_dir=tmp_path, @@ -177,7 +177,7 @@ def fake_fetch_quote_snapshots(_ib, symbols): assert summary["execution_status"] == "executed" assert len(submitted) == 1 - assert math.isclose(submitted[0].quantity, 0.298507, rel_tol=0.0, abs_tol=0.000001) + assert math.isclose(submitted[0].quantity, 0.2985, rel_tol=0.0, abs_tol=1e-9) def test_execute_rebalance_zero_target_sell_uses_position_quantity(monkeypatch, tmp_path): diff --git a/tests/test_runtime_config_support.py b/tests/test_runtime_config_support.py index d154416..49c3650 100644 --- a/tests/test_runtime_config_support.py +++ b/tests/test_runtime_config_support.py @@ -148,7 +148,7 @@ def test_load_platform_runtime_settings_supports_fractional_quantity_step(monkey settings = load_platform_runtime_settings(project_id_resolver=lambda: "project-1") - assert settings.quantity_step == 0.000001 + assert settings.quantity_step == 0.0001 assert settings.min_order_notional == 5.0