Skip to content

交易请求生成机制

fasiondog edited this page Nov 22, 2025 · 1 revision

交易请求生成机制

**本文档引用的文件** - [System.h](file://hikyuu_cpp/hikyuu/trade_sys/system/System.h) - [System.cpp](file://hikyuu_cpp/hikyuu/trade_sys/system/System.cpp) - [TradeRequest.h](file://hikyuu_cpp/hikyuu/trade_sys/system/TradeRequest.h) - [TradeRequest.cpp](file://hikyuu_cpp/hikyuu/trade_sys/system/TradeRequest.cpp)

目录

  1. 引言
  2. 交易请求生成流程
  3. 核心组件分析
  4. 延迟交易模式
  5. 资金管理联动机制
  6. 代码示例

引言

交易请求(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([结束])
Loading

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["执行卖出空头操作"]
Loading

Diagram sources

  • System.cpp

Section sources

  • System.cpp

核心组件分析

TradeRequest数据结构

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 : "获取目标盈利价"
Loading

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 : 执行买入操作
Loading

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["暂存请求"]
Loading

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 : "返回交易数量"
Loading

Diagram sources

  • System.h
  • System.cpp

Section sources

  • System.h
  • System.cpp

风险计算

资金管理组件根据交易价格和止损价计算交易风险,从而确定交易数量:

flowchart TD
GetPrice["获取交易价格"] --> GetStoploss["获取止损价"]
GetStoploss --> CalculateRisk["计算风险 = 交易价格 - 止损价"]
CalculateRisk --> GetMM["获取资金管理策略"]
GetMM --> CalculateNumber["计算可交易数量"]
CalculateNumber --> ReturnNumber["返回交易数量"]
Loading

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 : 暂存或执行请求
Loading

Diagram sources

  • System.cpp
  • System.cpp

Section sources

  • System.cpp
  • System.cpp

Clone this wiki locally