Files
sfgrid/grid_flow.md
T
2026-06-12 16:25:41 +08:00

99 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 统一网格逻辑
## 核心规则
对任意 `grid_index`,两个方向各挂一单:
| 方向 | 条件 | 价格 | 含义 |
|------|------|------|------|
| 卖出(上移) | `grid_index > 0` | `grid[grid_index - 1]` | 涨回到上一格时卖出获利 |
| 买入(下移) | `grid_index < len(grid)-1` | `grid[grid_index + 1]` | 跌到下一格时补仓 |
不需要"建仓"概念,`grid_index=0` 自然表示空仓。
## 流程图
```mermaid
flowchart TD
START["refreshGridOrder()"] --> GUARD{"isMarketActive AND enabled ?"}
GUARD -->|No| EXIT0["跳过不下单"]
GUARD -->|Yes| QUERY["查询未成交订单<br/>queryPendingOrder()"]
QUERY --> IDX["currentIdx = grid_index"]
IDX --> SELL{"currentIdx > 0 ?"}
SELL -->|"No<br/>(空仓,无持仓可卖)"| BUY
SELL -->|"Yes"| SELL_IDX["sellIdx = currentIdx - 1<br/>卖价 = grid[sellIdx]"]
SELL_IDX --> SELL_EXIST{"已有同 remark 卖单?"}
SELL_EXIST -->|No| SELL_CHECK{"卖价 > 涨停价 ?"}
SELL_CHECK -->|Yes| SELL_SKIP["跳过(超出涨停)"]
SELL_CHECK -->|No| SELL_PLACE["挂卖出单<br/>orderGrid[sellIdx] = seq"]
SELL_EXIST -->|Yes| SELL_DUP["跳过(已挂单)"]
SELL_SKIP --> BUY
SELL_PLACE --> BUY
SELL_DUP --> BUY
BUY{"currentIdx < len(grid)-1 ?"}
BUY -->|"No<br/>(已到最低价)"| EXIT["结束"]
BUY -->|"Yes"| BUY_IDX["buyIdx = currentIdx + 1<br/>买价 = grid[buyIdx]"]
BUY_IDX --> BUY_EXIST{"已有同 remark 买单?"}
BUY_EXIST -->|No| BUY_CHECK{"买价 < 跌停价 ?"}
BUY_CHECK -->|Yes| BUY_SKIP["跳过(低于跌停)"]
BUY_CHECK -->|No| BUY_PLACE["挂买入单<br/>orderGrid[buyIdx] = seq"]
BUY_EXIST -->|Yes| BUY_DUP["跳过(已挂单)"]
BUY_SKIP --> EXIT
BUY_PLACE --> EXIT
BUY_DUP --> EXIT
```
## 三种典型状态
```
grid = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
↑ ↑ ↑ ↑
0 1 2 3 ...
grid_index=0(空仓):
┌────┬────┬────┬────┐
│ 11 │ 10 │ 9 │ 8 │ ...
└────┴────┴────┴────┘
sell=无 buy=10 ← 第一笔买单
grid_index=1(持1份@10元):
┌────┬────┬────┬────┐
│ 11 │ 10 │ 9 │ 8 │ ...
└────┴────┴────┴────┘
sell=11 → buy=9 →
grid_index=3(持3份@8,9,10元):
┌────┬────┬────┬────┐
│ 11 │ 10 │ 9 │ 8 │ ...
└────┴────┴────┴────┘
↑ sell=9 buy=7 →
当前位置=3
成交后处理(onOrderTrade:
卖单成交 gridIdx < currentIdx → grid_index -= 1(上移,赚差价)
买单成交 gridIdx > currentIdx → grid_index += 1(下移,补仓)
然后 refreshGridOrder → 在新位置重新挂单
```
## 和之前的区别
| | 之前 | 之后 |
|---|---|---|
| 分支数 | 2 个(status=0 / status=1 | 1 个(统一网格逻辑) |
| 空仓第一笔 | INIT 单 @ grid[0]=11 | 普通买单 @ grid[1]=10 |
| grid[0]=11 的用途 | 建仓买入 | 永远只卖不买 |
| 状态字段 | status + grid_index | 仅 grid_index |