Skip to content
fasiondog edited this page Nov 22, 2025 · 1 revision

市场环境判断

**本文档引用的文件** - [EnvironmentBase.h](file://hikyuu_cpp/hikyuu/trade_sys/environment/EnvironmentBase.h) - [EV_Bool.h](file://hikyuu_cpp/hikyuu/trade_sys/environment/crt/EV_Bool.h) - [EV_Manual.h](file://hikyuu_cpp/hikyuu/trade_sys/environment/crt/EV_Manual.h) - [EV_TwoLine.h](file://hikyuu_cpp/hikyuu/trade_sys/environment/crt/EV_TwoLine.h) - [BoolEnvironment.cpp](file://hikyuu_cpp/hikyuu/trade_sys/environment/imp/BoolEnvironment.cpp) - [ManualEnvironment.cpp](file://hikyuu_cpp/hikyuu/trade_sys/environment/imp/ManualEnvironment.cpp) - [TwoLineEnvironment.cpp](file://hikyuu_cpp/hikyuu/trade_sys/environment/imp/TwoLineEnvironment.cpp) - [AndEnvironment.cpp](file://hikyuu_cpp/hikyuu/trade_sys/environment/imp/logic/AndEnvironment.cpp) - [OrEnvironment.cpp](file://hikyuu_cpp/hikyuu/trade_sys/environment/imp/logic/OrEnvironment.cpp) - [trade_sys.py](file://hikyuu/trade_sys/trade_sys.py) - [System.cpp](file://hikyuu_cpp/hikyuu/trade_sys/system/System.cpp)

目录

  1. 简介
  2. 核心组件
  3. 基类设计
  4. 具体实现
  5. 逻辑组合
  6. Python使用示例
  7. 与交易系统集成

简介

市场环境判断模块是Hikyuu量化交易系统中的顶层过滤器,用于基于宏观或市场指标(如指数趋势、波动率水平)来决定整个策略的激活状态。该模块通过判断市场环境的有效性,控制交易策略的执行,从而在不利市场条件下避免交易,提高系统的风险控制能力。

核心组件

市场环境判断模块的核心组件包括基类EnvironmentBase和多个具体实现类,如EV_Bool、EV_Logic、EV_Manual和EV_TwoLine。这些组件共同构成了一个灵活的市场环境判断框架,允许用户根据不同的市场条件配置相应的判断策略。

核心功能特点:

  • 作为交易系统的顶层过滤器
  • 基于宏观或市场指标进行判断
  • 支持多种判断逻辑的组合
  • 可配置的市场环境判断策略
  • 与交易系统无缝集成

组件关系:

  • EnvironmentBase:所有环境判断器的基类
  • EV_Bool:基于布尔信号指标的环境判断
  • EV_Manual:手动设置环境有效性的判断器
  • EV_TwoLine:基于快慢线比较的环境判断
  • EV_Logic:支持逻辑运算的环境判断组合器

Section sources

  • EnvironmentBase.h
  • EV_Bool.h
  • EV_Manual.h
  • EV_TwoLine.h

基类设计

EnvironmentBase 类

EnvironmentBase是所有市场环境判断器的抽象基类,定义了环境判断器的基本接口和公共功能。该基类不与特定的交易对象绑定,可以被多个系统共享使用。

classDiagram
class EnvironmentBase {
+string name()
+void name(string)
+void reset()
+void setQuery(KQuery)
+KQuery getQuery()
+bool isValid(Datetime)
+price_t getValue(Datetime)
+Indicator getValues()
+void _addValid(Datetime, price_t)
+EnvironmentPtr clone()
+EnvironmentPtr _clone()
+void _calculate()
+void _reset()
}
class BoolEnvironment {
+Indicator m_ind
+string getParam("market")
+void _checkParam(string)
+void _calculate()
+EnvironmentPtr _clone()
}
class ManualEnvironment {
+void _calculate()
+EnvironmentPtr _clone()
}
class TwoLineEnvironment {
+Indicator m_fast
+Indicator m_slow
+string getParam("market")
+void _checkParam(string)
+void _calculate()
+EnvironmentPtr _clone()
}
class AndEnvironment {
+EnvironmentPtr m_ev1
+EnvironmentPtr m_ev2
+void _calculate()
+void _reset()
+EnvironmentPtr _clone()
}
class OrEnvironment {
+EnvironmentPtr m_ev1
+EnvironmentPtr m_ev2
+void _calculate()
+void _reset()
+EnvironmentPtr _clone()
}
EnvironmentBase <|-- BoolEnvironment
EnvironmentBase <|-- ManualEnvironment
EnvironmentBase <|-- TwoLineEnvironment
EnvironmentBase <|-- AndEnvironment
EnvironmentBase <|-- OrEnvironment
Loading

Diagram sources

  • EnvironmentBase.h
  • BoolEnvironment.cpp
  • ManualEnvironment.cpp
  • TwoLineEnvironment.cpp
  • AndEnvironment.cpp
  • OrEnvironment.cpp

主要成员函数

公共接口:

  • isValid(Datetime datetime):判断指定日期的外部环境是否有效
  • getValue(Datetime datetime):获取指定日期的环境判断值
  • getValues():以指标形式获取所有日期的环境判断值
  • setQuery(KQuery query):设置查询条件
  • clone():克隆环境判断器实例

保护接口:

  • _addValid(Datetime datetime, price_t value):在计算过程中添加有效日期
  • _calculate():子类必须实现的计算接口
  • _reset():子类可选实现的复位接口
  • _clone():子类必须实现的克隆接口

数据结构

EnvironmentBase使用以下数据结构来存储环境判断结果:

  • m_date_index:日期到索引的映射表,用于快速查找
  • m_values:存储每个有效日期的判断值
  • m_query:查询条件,定义了环境判断的时间范围
  • m_name:环境判断器的名称

这些数据结构共同支持高效的环境有效性查询和结果管理。

Section sources

  • EnvironmentBase.h

具体实现

EV_Bool 实现

EV_Bool环境判断器基于布尔信号指标进行判断,当指标值大于0时认为市场环境有效,否则无效。

sequenceDiagram
participant 用户 as 用户
participant EV_Bool as EV_Bool
participant 指标 as 指标
participant 市场 as 市场
用户->>EV_Bool : 创建EV_Bool(指标, 市场)
EV_Bool->>市场 : 获取市场信息
EV_Bool->>市场 : 获取市场股票
EV_Bool->>市场 : 获取K线数据
EV_Bool->>指标 : 设置上下文
指标->>EV_Bool : 返回指标数据
loop 遍历指标数据
EV_Bool->>EV_Bool : 检查指标值>0
alt 指标值>0
EV_Bool->>EV_Bool : _addValid(日期)
end
end
EV_Bool->>用户 : 返回环境判断器
Loading

Diagram sources

  • BoolEnvironment.cpp

EV_Manual 实现

EV_Manual环境判断器仅能通过手工方式添加环境有效性,主要用于测试或其他特殊用途。

sequenceDiagram
participant 用户 as 用户
participant EV_Manual as EV_Manual
用户->>EV_Manual : 创建EV_Manual()
EV_Manual->>用户 : 返回环境判断器
用户->>EV_Manual : 手动添加有效日期
EV_Manual->>EV_Manual : _addValid(日期)
用户->>EV_Manual : 查询日期有效性
EV_Manual->>用户 : 返回有效性结果
Loading

Diagram sources

  • ManualEnvironment.cpp

EV_TwoLine 实现

EV_TwoLine环境判断器通过比较市场指数的快线和慢线来判断市场环境,当快线大于慢线时认为市场有效。

sequenceDiagram
participant 用户 as 用户
participant EV_TwoLine as EV_TwoLine
participant 市场 as 市场
participant 快线 as 快线指标
participant 慢线 as 慢线指标
用户->>EV_TwoLine : 创建EV_TwoLine(快线, 慢线, 市场)
EV_TwoLine->>市场 : 获取市场信息
EV_TwoLine->>市场 : 获取市场股票
EV_TwoLine->>市场 : 获取K线数据
EV_TwoLine->>快线 : 计算快线指标
EV_TwoLine->>慢线 : 计算慢线指标
loop 比较快慢线
EV_TwoLine->>EV_TwoLine : 检查快线>慢线
alt 快线>慢线
EV_TwoLine->>EV_TwoLine : _addValid(日期)
end
end
EV_TwoLine->>用户 : 返回环境判断器
Loading

Diagram sources

  • TwoLineEnvironment.cpp

逻辑组合

逻辑与(AND)组合

逻辑与组合通过AndEnvironment类实现,只有当两个环境判断器都有效时,组合结果才有效。

flowchart TD
Start([开始]) --> CheckEV1["检查环境判断器1"]
CheckEV1 --> GetValues1["获取EV1的值序列"]
GetValues1 --> CreateMap["创建日期-值映射"]
CreateMap --> CheckEV2["检查环境判断器2"]
CheckEV2 --> GetValues2["获取EV2的值序列"]
GetValues2 --> FindIntersection["查找交集日期"]
FindIntersection --> AddValid["添加有效日期"]
AddValid --> End([结束])
subgraph "交集查找逻辑"
FindIntersection --> LoopDates["遍历EV2日期"]
LoopDates --> CheckInMap{"日期在EV1映射中?"}
CheckInMap --> |是| AddToResult["添加到结果"]
CheckInMap --> |否| NextDate["下一个日期"]
AddToResult --> NextDate
NextDate --> EndLoop{"所有日期处理完?"}
EndLoop --> |否| LoopDates
EndLoop --> |是| Continue
end
Loading

Diagram sources

  • AndEnvironment.cpp

逻辑或(OR)组合

逻辑或组合通过OrEnvironment类实现,只要有一个环境判断器有效,组合结果就有效。

flowchart TD
Start([开始]) --> CheckBoth["检查两个环境判断器"]
CheckBoth --> BothNull{"都为空?"}
BothNull --> |是| ReturnEmpty["返回空结果"]
BothNull --> |否| CheckOnlyEV1{"只有EV1?"}
CheckOnlyEV1 --> |是| ProcessEV1["处理EV1结果"]
CheckOnlyEV1 --> |否| CheckOnlyEV2{"只有EV2?"}
CheckOnlyEV2 --> |是| ProcessEV2["处理EV2结果"]
CheckOnlyEV2 --> |否| ProcessBoth["处理两者结果"]
ProcessEV1 --> LoopEV1["遍历EV1日期"]
LoopEV1 --> AddIfValid["如果有效则添加"]
AddIfValid --> NextEV1["下一个日期"]
NextEV1 --> EndLoopEV1{"所有EV1日期处理完?"}
EndLoopEV1 --> |否| LoopEV1
EndLoopEV1 --> |是| End
ProcessEV2 --> LoopEV2["遍历EV2日期"]
LoopEV2 --> AddIfValid2["如果有效则添加"]
AddIfValid2 --> NextEV2["下一个日期"]
NextEV2 --> EndLoopEV2{"所有EV2日期处理完?"}
EndLoopEV2 --> |否| LoopEV2
EndLoopEV2 --> |是| End
ProcessBoth --> ProcessFirst["先处理EV1"]
ProcessFirst --> ProcessSecond["再处理EV2"]
ProcessSecond --> CheckDuplicate{"日期已存在?"}
CheckDuplicate --> |否| AddNew["添加新日期"]
CheckDuplicate --> |是| Skip["跳过"]
AddNew --> End
Skip --> End
ReturnEmpty --> End
Loading

Diagram sources

  • OrEnvironment.cpp

Python使用示例

创建基本环境判断器

from hikyuu import *
from hikyuu.trade_sys import crtEV

# 创建基于布尔指标的环境判断器
def bool_ev_func(self):
    ind = self.get_stock().get_kdata(Datetime(20200101), Datetime(20231231))
    # 这里可以添加任何布尔判断逻辑
    return ind.close > ind.ma(20)

ev_bool = crtEV(bool_ev_func, name='MyBoolEV')

# 创建手动环境判断器
ev_manual = EV_Manual()

# 创建双线环境判断器
ev_two_line = EV_TwoLine(MA(n=5), MA(n=20), market='SH')

逻辑组合示例

# 逻辑与组合
ev_and = ev_bool & ev_two_line

# 逻辑或组合
ev_or = ev_bool | ev_manual

# 复杂组合
ev_complex = (ev_bool & ev_two_line) | ev_manual

参数配置

# 配置市场参数
ev_two_line.set_param('market', 'SZ')

# 获取参数
market = ev_two_line.get_param('market')

Section sources

  • trade_sys.py
  • EV_Bool.h
  • EV_Manual.h
  • EV_TwoLine.h

与交易系统集成

系统集成流程

sequenceDiagram
participant System as 交易系统
participant Environment as 环境判断器
participant TradeManager as 交易管理器
System->>Environment : _environmentIsValid(日期)
Environment->>Environment : 调用isValid(日期)
Environment->>System : 返回有效性结果
alt 环境无效
System->>TradeManager : 清仓卖出
TradeManager->>System : 返回交易记录
else 环境从无效变为有效
System->>System : 检查ev_open_position参数
alt ev_open_position为True
System->>System : _buy(建仓)
end
end
System->>System : 继续条件判断
Loading

Diagram sources

  • System.cpp

集成参数

交易系统通过以下参数控制环境判断器的行为:

参数名称 类型 默认值 说明
delay bool True 是否延迟到下一个bar开盘时交易
delay_use_current_price bool True 延迟操作时是否使用当前价格
max_delay_count int 3 连续延迟交易的限制次数
ev_open_position bool False 是否使用环境判断进行初始建仓
cn_open_position bool False 是否使用条件判断进行初始建仓

集成代码示例

# 创建交易系统并集成环境判断器
system = System(
    trade_manager=tm,
    money_manager=mm,
    environment=ev_complex,  # 使用复杂的环境判断组合
    condition=cn,
    signal=sg,
    stoploss=sl,
    stopprofit=sp,
    profit_goal=pg,
    slippage=sg
)

# 设置环境判断参数
system.set_param('ev_open_position', True)  # 允许环境判断器进行初始建仓

# 运行系统
result = system.run()

Section sources

  • System.cpp
  • System.cpp
  • trade_sys.py

Clone this wiki locally