-
Notifications
You must be signed in to change notification settings - Fork 724
交易请求生成机制
交易请求(TradeRequest)是量化交易系统中的核心数据结构,用于在信号触发后生成具体的交易指令。本文档深入解析System组件如何在runMoment执行过程中,通过信号指示器(SG)、市场环境(EV)和系统条件(CN)的判断结果生成TradeRequest对象。详细说明TradeRequest中各字段的赋值逻辑,以及延迟交易模式下买入和卖出请求的暂存与执行机制。
System组件的runMoment方法是交易请求生成的核心入口。该方法在每个交易时刻被调用,通过一系列判断和计算生成交易请求。执行流程如下:
flowchart TD
Start([开始]) --> EnvironmentCheck["检查市场环境 (EV)"]
EnvironmentCheck --> EVValid{"环境有效?"}
EVValid --> |否| SellAll["立即清仓卖出"]
EVValid --> |是| ConditionCheck["检查系统条件 (CN)"]
ConditionCheck --> CNValid{"条件有效?"}
CNValid --> |否| SellAll
CNValid --> |是| SignalCheck["检查信号指示器 (SG)"]
SignalCheck --> BuySignal{"买入信号?"}
BuySignal --> |是| GenerateBuyRequest["生成买入请求"]
BuySignal --> |否| SellSignal{"卖出信号?"}
SellSignal --> |是| GenerateSellRequest["生成卖出请求"]
SellSignal --> |否| StoplossCheck["检查止损止盈"]
StoplossCheck --> StoplossTriggered{"触及止损?"}
StoplossTriggered --> |是| GenerateSellRequest
StoplossTriggered --> |否| GoalReached{"达到目标盈利?"}
GoalReached --> |是| GenerateSellRequest
GoalReached --> |否| End([结束])
Diagram sources
- System.cpp
Section sources
- System.cpp
- System.h
System组件首先检查信号指示器(SG)是否发出买入或卖出信号。信号判断基于当前交易日的数据,通过shouldBuy和shouldSell方法进行:
flowchart TD
CheckBuySignal["检查买入信号"] --> HaveShort{"持有空头仓位?"}
HaveShort --> |是| BuyShort["执行买入空头操作"]
HaveShort --> |否| Buy["执行买入操作"]
CheckSellSignal["检查卖出信号"] --> HaveLong{"持有多头仓位?"}
HaveLong --> |是| Sell["执行卖出操作"]
HaveLong --> |否| SellShort["执行卖出空头操作"]
Diagram sources
- System.cpp
Section sources
- System.cpp
TradeRequest是交易请求的核心数据结构,包含以下关键字段:
| 字段 | 类型 | 描述 |
|---|---|---|
| valid | bool | 请求是否有效 |
| business | BUSINESS | 业务类型(买入、卖出等) |
| datetime | Datetime | 请求时间 |
| stoploss | price_t | 止损价 |
| goal | price_t | 目标盈利价 |
| number | double | 交易数量 |
| from | SystemPart | 请求来源组件 |
| count | int | 延迟次数 |
Section sources
- TradeRequest.h
各字段的赋值逻辑如下:
classDiagram
class TradeRequest {
+bool valid
+BUSINESS business
+Datetime datetime
+price_t stoploss
+price_t goal
+double number
+SystemPart from
+int count
+KRecord krecord
+void clear() noexcept
}
class System {
+void _submitBuyRequest(const KRecord&, const KRecord&, Part)
+void _submitSellRequest(const KRecord&, const KRecord&, Part)
+double _getBuyNumber(const Datetime&, price_t, price_t, Part)
+double _getSellNumber(const Datetime&, price_t, price_t, Part)
+price_t _getStoplossPrice(const KRecord&, const KRecord&, price_t)
+price_t _getGoalPrice(const Datetime&, price_t)
}
System --> TradeRequest : "生成"
System --> MoneyManager : "获取交易数量"
System --> Stoploss : "获取止损价"
System --> ProfitGoal : "获取目标盈利价"
Diagram sources
- TradeRequest.h
- System.h
Section sources
- TradeRequest.h
- System.h
当系统参数buy_delay或sell_delay设置为true时,系统会启用延迟交易模式。在这种模式下,买入和卖出请求不会立即执行,而是暂存并在下一交易日执行:
sequenceDiagram
participant System
participant TradeRequest
participant NextDay
System->>TradeRequest : 检测到买入信号
TradeRequest->>TradeRequest : 创建买入请求并暂存
TradeRequest->>NextDay : 等待下一交易日
NextDay->>System : 到达下一交易日开盘
System->>TradeRequest : 处理暂存的买入请求
TradeRequest->>System : 执行买入操作
Diagram sources
- System.cpp
- System.cpp
Section sources
- System.cpp
- System.cpp
系统通过count字段记录延迟次数,并通过max_delay_count参数限制最大延迟次数:
flowchart TD
CheckDelayCount["检查延迟次数"] --> ExceedMax{"超过最大延迟次数?"}
ExceedMax --> |是| ClearRequest["清除请求"]
ExceedMax --> |否| IncrementCount["延迟次数+1"]
IncrementCount --> UpdateRequest["更新请求信息"]
UpdateRequest --> StoreRequest["暂存请求"]
Diagram sources
- System.cpp
- System.cpp
Section sources
- System.cpp
- System.cpp
System组件通过_getBuyNumber和_getSellNumber私有方法与资金管理(MM)组件联动:
classDiagram
class System {
-TradeManagerPtr m_tm
-MoneyManagerPtr m_mm
-EnvironmentPtr m_ev
-ConditionPtr m_cn
-SignalPtr m_sg
+_getBuyNumber(Datetime, price_t, price_t, Part) double
+_getSellNumber(Datetime, price_t, price_t, Part) double
}
class MoneyManager {
+getBuyNumber(Datetime, Stock, price_t, price_t, Part) double
+getSellNumber(Datetime, Stock, price_t, price_t, Part) double
}
System --> MoneyManager : "调用"
MoneyManager --> System : "返回交易数量"
Diagram sources
- System.h
- System.cpp
Section sources
- System.h
- System.cpp
资金管理组件根据交易价格和止损价计算交易风险,从而确定交易数量:
flowchart TD
GetPrice["获取交易价格"] --> GetStoploss["获取止损价"]
GetStoploss --> CalculateRisk["计算风险 = 交易价格 - 止损价"]
CalculateRisk --> GetMM["获取资金管理策略"]
GetMM --> CalculateNumber["计算可交易数量"]
CalculateNumber --> ReturnNumber["返回交易数量"]
Diagram sources
- System.cpp
- System.cpp
Section sources
- System.cpp
- System.cpp
以下示例展示从信号触发到请求创建的完整流程:
sequenceDiagram
participant SG as 信号指示器
participant System as System组件
participant MM as 资金管理
participant TR as 交易请求
SG->>System : 发出买入信号
System->>System : 检查市场环境(EV)
System->>System : 检查系统条件(CN)
System->>MM : 调用_getBuyNumber
MM-->>System : 返回交易数量
System->>System : 计算止损价和目标盈利价
System->>TR : 创建TradeRequest对象
TR-->>System : 返回交易请求
System->>System : 暂存或执行请求
Diagram sources
- System.cpp
- System.cpp
Section sources
- System.cpp
- System.cpp