-
Notifications
You must be signed in to change notification settings - Fork 724
市场环境判断
市场环境判断模块是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是所有市场环境判断器的抽象基类,定义了环境判断器的基本接口和公共功能。该基类不与特定的交易对象绑定,可以被多个系统共享使用。
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
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环境判断器基于布尔信号指标进行判断,当指标值大于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->>用户 : 返回环境判断器
Diagram sources
- BoolEnvironment.cpp
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->>用户 : 返回有效性结果
Diagram sources
- ManualEnvironment.cpp
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->>用户 : 返回环境判断器
Diagram sources
- TwoLineEnvironment.cpp
逻辑与组合通过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
Diagram sources
- AndEnvironment.cpp
逻辑或组合通过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
Diagram sources
- OrEnvironment.cpp
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 : 继续条件判断
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