-
Notifications
You must be signed in to change notification settings - Fork 724
条件策略
条件策略模块是Hikyuu量化交易系统中的核心组件之一,负责控制系统在特定时间是否有效。与信号指示器(Signal)不同,条件策略不生成交易信号,而是用于组合多个信号指示器,通过逻辑运算构建复杂的策略组合。本文档将详细阐述条件策略模块的设计、实现和使用方法。
条件策略与信号指示器的区别:
- 信号指示器(Signal):生成具体的买入/卖出信号
- 条件策略(Condition):控制策略系统在何时有效,用于组合信号而非生成信号
条件策略作为系统内子策略的组合逻辑控制器,其主要功能是确定交易系统在特定时间点是否有效。一个有效的条件策略可以包含多个子条件,通过逻辑运算(如AND、OR)进行组合,从而构建复杂的策略逻辑。
条件策略的核心特点:
- 组合性:能够将多个简单条件组合成复杂条件
- 逻辑性:支持布尔逻辑运算(与、或、非等)
- 可扩展性:通过继承ConditionBase基类可自定义新的条件类型
- 时序性:基于时间序列数据进行有效性判断
ConditionBase是所有条件策略的基类,定义了条件策略的基本接口和功能。该基类提供了条件策略所需的核心方法和属性。
classDiagram
class ConditionBase {
+name() string
+set_param(name, value) void
+get_param(name) any
+is_valid(datetime) bool
+reset() void
+clone() ConditionPtr
+get_datetime_list() DatetimeList
+get_values() Indicator
+_calculate() void
+_reset() void
+_clone() ConditionPtr
}
ConditionBase <|-- BoolCondition
ConditionBase <|-- ManualCondition
ConditionBase <|-- OPLineCondition
ConditionBase <|-- AndCondition
ConditionBase <|-- OrCondition
图示来源
- ConditionBase.h
- _Condition.cpp
- name: 条件策略的名称
- set_param/get_param: 参数设置和获取接口
- is_valid: 判断指定时间系统是否有效
- reset: 复位操作,重置内部状态
- clone: 克隆操作,用于复制条件策略实例
- get_datetime_list: 获取系统有效的日期列表
- get_values: 以指标形式获取实际值
- _calculate: 【必须重载】子类计算接口
- _reset: 【可选重载】子类复位接口
- _clone: 【必须重载】子类克隆接口
节来源
- ConditionBase.h
- _Condition.cpp
Hikyuu提供了多种内置的条件策略实现,每种实现都有其特定的应用场景。
CN_Bool是基于布尔信号指标的系统有效条件,当指标值大于0时系统有效,否则无效。
flowchart TD
Start([开始]) --> SetContext["设置指标上下文"]
SetContext --> GetData["获取指标数据"]
GetData --> Loop["遍历指标数据"]
Loop --> CheckValid{"指标值 > 0?"}
CheckValid --> |是| AddValid["添加有效时间"]
CheckValid --> |否| Continue["继续"]
AddValid --> Continue
Continue --> Next["下一个数据"]
Next --> LoopEnd{"遍历完成?"}
LoopEnd --> |否| Loop
LoopEnd --> |是| End([结束])
图示来源
- CN_Bool.h
- BoolCondition.cpp
- 将技术指标转换为系统有效条件
- 基于简单规则的系统有效性判断
- 作为复杂条件组合的基础组件
节来源
- CN_Bool.h
- BoolCondition.cpp
CN_Manual是仅能手工添加有效性的条件策略,主要用于测试或其他特殊用途。
- 不进行任何自动计算
- 通过手动方式添加有效时间
- 适用于需要精确控制有效时间的场景
- 策略测试和验证
- 特殊事件驱动的系统有效性控制
- 调试和开发过程中的临时条件
节来源
- CN_Manual.h
- ManualCondition.cpp
CN_OPLine基于权益曲线与指定指标的比较来判断系统有效性,当权益曲线高于指定指标时系统有效。
sequenceDiagram
participant 条件策略 as CN_OPLine
participant 交易管理 as TradeManager
participant 系统 as System
participant 权益曲线 as ProfitCurve
条件策略->>系统 : 创建简单系统(SYS_Simple)
条件策略->>交易管理 : 创建交易管理账户(crtTM)
条件策略->>系统 : 设置交易管理、资金管理、信号指示器
条件策略->>系统 : 运行系统获取权益曲线
条件策略->>权益曲线 : 计算权益曲线与OP指标的差值
条件策略->>条件策略 : 遍历差值,>0则添加为有效时间
图示来源
- CN_OPLine.h
- OPLineCondition.cpp
- 基于资金曲线的系统有效性控制
- 风险控制和止损策略
- 动态调整系统有效性的高级策略
节来源
- CN_OPLine.h
- OPLineCondition.cpp
逻辑条件是构建复杂策略组合的核心,通过AND(与)和OR(或)运算符将多个条件策略组合在一起。
AndCondition实现了两个条件策略的逻辑与运算,只有当两个条件都有效时,组合条件才有效。
flowchart TD
A["条件1: 有效"] --> C["AND运算"]
B["条件2: 有效"] --> C
C --> D["结果: 有效"]
E["条件1: 有效"] --> F["AND运算"]
G["条件2: 无效"] --> F
F --> H["结果: 无效"]
I["条件1: 无效"] --> J["AND运算"]
K["条件2: 有效"] --> J
J --> L["结果: 无效"]
M["条件1: 无效"] --> N["AND运算"]
O["条件2: 无效"] --> N
N --> P["结果: 无效"]
图示来源
- CN_Logic.h
- AndCondition.cpp
OrCondition实现了两个条件策略的逻辑或运算,只要有一个条件有效,组合条件就有效。
flowchart TD
A["条件1: 有效"] --> C["OR运算"]
B["条件2: 有效"] --> C
C --> D["结果: 有效"]
E["条件1: 有效"] --> F["OR运算"]
G["条件2: 无效"] --> F
F --> H["结果: 有效"]
I["条件1: 无效"] --> J["OR运算"]
K["条件2: 有效"] --> J
J --> L["结果: 有效"]
M["条件1: 无效"] --> N["OR运算"]
O["条件2: 无效"] --> N
N --> P["结果: 无效"]
图示来源
- CN_Logic.h
- OrCondition.cpp
-
运算符重载:通过重载
&和|运算符实现AND和OR操作 - 短路优化:在OR运算中,如果第一个条件有效,则无需计算第二个条件
- 状态同步:确保子条件的交易管理、信号指示器和交易对象与父条件同步
- 复位机制:递归调用子条件的复位方法,确保状态一致性
节来源
- CN_Logic.h
- AndCondition.cpp
- OrCondition.cpp
以下是在Python中定义和使用条件策略的实例,展示如何将多个信号指示器通过条件进行逻辑连接。
# 创建基于RSI指标的条件
rsi = indicator.RSI(n=14)
cn_rsi = CN_Bool(rsi < 30) # RSI低于30时系统有效
# 创建基于均线的条件
ma5 = indicator.MA(n=5)
ma20 = indicator.MA(n=20)
cn_ma = CN_Bool(ma5 > ma20) # 5日均线在20日均线上方时系统有效# 使用AND运算符组合条件
cn_combined = cn_rsi & cn_ma # RSI低于30且5日均线上穿20日均线时系统有效
# 使用OR运算符组合条件
cn_alternative = cn_rsi | cn_ma # RSI低于30或5日均线上穿20日均线时系统有效
# 复杂条件组合
cn_complex = (cn_rsi & cn_ma) | CN_Manual() # 复合条件或手动条件def create_strategy():
# 创建信号指示器
signal_buy = SG_Single()
signal_buy.set_param("buy_filter", indicator.CROSSOVER(MA(5), MA(20)))
# 创建条件策略
# 条件1: 市场处于上升趋势
trend_condition = CN_Bool(indicator.MA(20) > indicator.MA(60))
# 条件2: 波动率适中
volatility_condition = CN_Bool(indicator.ATR(14) < 2.0)
# 组合条件:上升趋势且波动率适中
combined_condition = trend_condition & volatility_condition
# 创建系统
sys = SYS_Simple()
sys.set_sg(signal_buy)
sys.set_cn(combined_condition)
return sys节来源
- Condition.py
- _Condition.cpp
条件策略模块作为Hikyuu量化交易系统的重要组成部分,提供了强大的策略组合能力。通过ConditionBase基类和多种内置实现,用户可以灵活地构建复杂的策略逻辑。
关键要点总结:
- 角色定位:条件策略是系统内子策略的组合逻辑控制器,用于控制策略系统的有效性
- 与信号指示器的区别:条件策略用于组合信号,而非生成信号
-
核心基类:
ConditionBase提供了条件策略的基本接口和功能 -
内置实现:包括
CN_Bool、CN_Manual、CN_OPLine等多种实用的条件类型 - 逻辑组合:通过AND/OR等逻辑运算符可以构建复杂的策略组合
- Python接口:提供了简洁易用的Python接口,支持运算符重载和链式调用
通过合理使用条件策略模块,可以构建出更加智能和稳健的量化交易系统,有效提升策略的适应性和风险控制能力。