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

信号指示器

**本文档引用的文件** - [SignalBase.h](file://hikyuu_cpp/hikyuu/trade_sys/signal/SignalBase.h) - [SignalBase.cpp](file://hikyuu_cpp/hikyuu/trade_sys/signal/SignalBase.cpp) - [SG_Cross.h](file://hikyuu_cpp/hikyuu/trade_sys/signal/crt/SG_Cross.h) - [CrossSignal.cpp](file://hikyuu_cpp/hikyuu/trade_sys/signal/imp/CrossSignal.cpp) - [SG_CrossGold.h](file://hikyuu_cpp/hikyuu/trade_sys/signal/crt/SG_CrossGold.h) - [CrossGoldSignal.cpp](file://hikyuu_cpp/hikyuu/trade_sys/signal/imp/CrossGoldSignal.cpp) - [SG_Flex.h](file://hikyuu_cpp/hikyuu/trade_sys/signal/crt/SG_Flex.h) - [SG_Flex.cpp](file://hikyuu_cpp/hikyuu/trade_sys/signal/crt/SG_Flex.cpp) - [SG_Band.h](file://hikyuu_cpp/hikyuu/trade_sys/signal/crt/SG_Band.h) - [BandSignal.cpp](file://hikyuu_cpp/hikyuu/trade_sys/signal/imp/BandSignal.cpp) - [BandSignal2.cpp](file://hikyuu_cpp/hikyuu/trade_sys/signal/imp/BandSignal2.cpp) - [SG_Logic.h](file://hikyuu_cpp/hikyuu/trade_sys/signal/crt/SG_Logic.h) - [hub.py](file://hikyuu/hub.py) - [Turtle_SG.py](file://hikyuu/examples/Turtle_SG.py)

目录

  1. 引言
  2. 核心职责
  3. 基类设计
  4. 关键实现
  5. 使用示例
  6. 信号生成流程
  7. 结论

引言

信号指示器模块是交易系统的核心决策引擎,负责根据市场数据生成具体的买入/卖出信号。该模块通过分析K线数据和各种技术指标,为交易系统提供明确的交易指令。信号指示器的设计基于面向对象原则,通过基类定义统一接口,各类具体实现则针对不同的交易策略逻辑。

核心职责

信号指示器作为交易系统的核心决策引擎,主要承担以下职责:

  • 接收K线数据作为输入
  • 根据预设的交易策略算法分析市场数据
  • 生成明确的买入/卖出交易信号
  • 管理交易状态和持仓情况
  • 支持多种信号组合和逻辑运算
  • 提供信号查询和验证接口

这些职责使得信号指示器成为连接市场数据分析和实际交易执行的关键桥梁,确保交易决策的自动化和一致性。

信号指示器的核心职责

  • 作为交易系统的核心决策引擎
  • 分析K线数据并生成具体的买入/卖出信号
  • 支持多种技术分析策略的实现
  • 提供统一的信号管理和查询接口
  • 支持信号的组合与逻辑运算

基类设计

信号指示器模块的核心是SignalBase基类,它定义了所有信号指示器的通用接口和基础功能。该基类采用C++实现,通过继承机制为各类具体信号指示器提供统一的框架。

接口设计

SignalBase基类提供了以下主要接口:

classDiagram
class SignalBase {
+shouldBuy(datetime) bool
+shouldSell(datetime) bool
+getBuyValue(datetime) double
+getSellValue(datetime) double
+getValue(datetime) double
+nextTimeShouldBuy() bool
+nextTimeShouldSell() bool
+getBuySignal() DatetimeList
+getSellSignal() DatetimeList
+setTO(kdata) void
+getTO() KData
+reset() void
+clone() SignalPtr
+name() string
+name(name) void
+_reset() void
+_clone() SignalPtr
+_calculate(kdata) void
}
Loading

图示来源

  • SignalBase.h

核心方法

基类中的核心方法包括:

  1. 信号判断方法shouldBuyshouldSell用于判断指定时刻是否可以进行买入或卖出操作。
  2. 信号值获取方法getBuyValuegetSellValue返回指定时刻的信号数值。
  3. 交易对象管理setTOgetTO用于设置和获取K线数据。
  4. 复位和克隆resetclone用于状态管理和对象复制。

内部状态

SignalBase维护了以下内部状态:

  • m_name:信号指示器名称
  • m_kdata:关联的K线数据
  • m_calculated:计算状态标志
  • m_hold_longm_hold_short:多头和空头持仓状态
  • m_buySigm_sellSig:买入和卖出信号的日期映射

这些设计确保了信号指示器的可扩展性和一致性,为各类具体实现提供了坚实的基础。

基类设计来源

  • SignalBase.h
  • SignalBase.cpp

关键实现

信号指示器模块提供了多种具体的实现,每种实现针对不同的交易策略逻辑。这些实现继承自SignalBase基类,并重写了核心的计算方法。

SG_Cross(金叉死叉)

SG_Cross是最基础的双线交叉信号指示器,当快线从下向上穿越慢线时产生买入信号,当快线从上向下穿越慢线时产生卖出信号。

sequenceDiagram
participant KData as K线数据
participant FastLine as 快线指标
participant SlowLine as 慢线指标
participant CrossSignal as CrossSignal
KData->>FastLine : 计算快线值
KData->>SlowLine : 计算慢线值
FastLine->>CrossSignal : 提供快线数据
SlowLine->>CrossSignal : 提供慢线数据
CrossSignal->>CrossSignal : 检查交叉条件
alt 快线上穿慢线
CrossSignal->>CrossSignal : 添加买入信号
else 快线下穿慢线
CrossSignal->>CrossSignal : 添加卖出信号
end
Loading

图示来源

  • SG_Cross.h
  • CrossSignal.cpp

SG_CrossGold(金叉死叉增强版)

SG_CrossGoldSG_Cross的增强版本,不仅要求线的交叉,还要求交叉时两条线的方向一致。当快线从下向上穿越慢线且两条线都呈上升趋势时为金叉,产生买入信号;当快线从上向下穿越慢线且两条线都呈下降趋势时为死叉,产生卖出信号。

flowchart TD
Start([开始]) --> CalculateFast["计算快线指标"]
CalculateFast --> CalculateSlow["计算慢线指标"]
CalculateSlow --> CheckCross["检查交叉条件"]
CheckCross --> IsCross{"发生交叉?"}
IsCross --> |是| CheckDirection["检查方向一致性"]
CheckDirection --> IsUpward{"方向向上?"}
IsUpward --> |是| AddBuy["添加买入信号"]
IsUpward --> |否| IsDownward{"方向向下?"}
IsDownward --> |是| AddSell["添加卖出信号"]
IsDownward --> |否| NoSignal["无信号"]
IsCross --> |否| NoSignal
AddBuy --> End([结束])
AddSell --> End
NoSignal --> End
Loading

图示来源

  • SG_CrossGold.h
  • CrossGoldSignal.cpp

SG_Band(通道突破)

SG_Band是指标区间信号指示器,适用于有绝对值区间的指标如RSI。当指标值超过上轨时产生买入信号,当指标值低于下轨时产生卖出信号。

该实现有两种模式:

  1. 固定阈值模式:使用固定的上下轨数值
  2. 动态指标模式:使用其他指标作为上下轨
classDiagram
class SG_Band {
+SG_Band(ind, lower, upper) SignalPtr
+SG_Band(ind, lower_ind, upper_ind) SignalPtr
}
class BandSignal {
-m_ind Indicator
-m_lower price_t
-m_upper price_t
+_calculate(kdata) void
}
class BandSignal2 {
-m_ind Indicator
-m_lower Indicator
-m_upper Indicator
+_calculate(kdata) void
}
SG_Band --> BandSignal : "创建"
SG_Band --> BandSignal2 : "创建"
BandSignal --> SignalBase : "继承"
BandSignal2 --> SignalBase : "继承"
Loading

图示来源

  • SG_Band.h
  • BandSignal.cpp
  • BandSignal2.cpp

SG_Flex(灵活规则)

SG_Flex是自交叉单线拐点信号指示器,使用自身的EMA作为慢线,自身作为快线。当快线向上穿越慢线时产生买入信号,当快线向下穿越慢线时产生卖出信号。

sequenceDiagram
participant Input as 输入指标
participant EMA as EMA慢线
participant FlexSignal as SG_Flex
Input->>FlexSignal : 提供原始数据
Input->>EMA : 计算EMA值
EMA->>FlexSignal : 提供慢线数据
FlexSignal->>FlexSignal : 计算交叉
alt 快线上穿慢线
FlexSignal->>FlexSignal : 添加买入信号
else 快线下穿慢线
FlexSignal->>FlexSignal : 添加卖出信号
end
Loading

图示来源

  • SG_Flex.h
  • SG_Flex.cpp

SG_Logic(逻辑组合)

SG_Logic提供信号的逻辑组合功能,支持多种运算符和组合函数,使得复杂的交易策略可以通过简单的信号组合实现。

classDiagram
class SG_Logic {
+operator+(sg1, sg2) SignalPtr
+operator-(sg1, sg2) SignalPtr
+operator*(sg1, sg2) SignalPtr
+operator/(sg1, sg2) SignalPtr
+operator&(sg1, sg2) SignalPtr
+operator|(sg1, sg2) SignalPtr
+SG_Add(sg_list, alternate) SignalPtr
+SG_Sub(sg_list, alternate) SignalPtr
+SG_Mul(sg_list, alternate) SignalPtr
+SG_Div(sg_list, alternate) SignalPtr
+SG_And(sg_list, alternate) SignalPtr
+SG_Or(sg_list, alternate) SignalPtr
}
class OperatorSignal {
+_calculate(kdata) void
}
class AddSignal {
+_calculate(kdata) void
}
class SubSignal {
+_calculate(kdata) void
}
class MulSignal {
+_calculate(kdata) void
}
class DivSignal {
+_calculate(kdata) void
}
class AndSignal {
+_calculate(kdata) void
}
class OrSignal {
+_calculate(kdata) void
}
SG_Logic --> OperatorSignal : "创建"
OperatorSignal <|-- AddSignal : "继承"
OperatorSignal <|-- SubSignal : "继承"
OperatorSignal <|-- MulSignal : "继承"
OperatorSignal <|-- DivSignal : "继承"
OperatorSignal <|-- AndSignal : "继承"
OperatorSignal <|-- OrSignal : "继承"
Loading

图示来源

  • SG_Logic.h

使用示例

信号指示器模块提供了丰富的使用方式,包括内置信号指示器的直接使用和自定义信号指示器的注册。

内置信号指示器使用

以下示例展示了如何使用内置的信号指示器:

from hikyuu import *

# 使用SG_Cross:5日MA上穿10日MA时买入
sg_cross = SG_Cross(MA(C, n=5), MA(C, n=10))

# 使用SG_Band:RSI超过70卖出,低于30买入
sg_band = SG_Band(RSI(n=14), 30, 70)

# 使用SG_Flex:自身与EMA交叉
sg_flex = SG_Flex(CLOSE(), 20)

# 信号组合:金叉且成交量放大
sg_combined = SG_And([SG_Cross(MA(C,5), MA(C,10)), VOL() > REF(VOL(), 1)], True)

代码示例来源

  • Turtle_SG.py

自定义信号指示器注册

通过hub.py文件,用户可以注册自定义的信号指示器:

from hikyuu import *
from hikyuu.util import SingletonType

class MyCustomSignal(SignalBase):
    def __init__(self):
        super().__init__("MyCustomSignal")
        self.param1 = 0
        self.param2 = 0
    
    def _calculate(self, kdata):
        # 自定义信号计算逻辑
        close = CLOSE()(kdata)
        ma = MA(C, n=20)(kdata)
        
        for i in range(1, len(close)):
            if close[i] > ma[i] and close[i-1] <= ma[i-1]:
                self._addBuySignal(kdata[i].datetime)
            elif close[i] < ma[i] and close[i-1] >= ma[i-1]:
                self._addSellSignal(kdata[i].datetime)

# 注册自定义信号指示器
def part():
    return MyCustomSignal()

# 在hub中注册
# add_local_hub('myhub', '/path/to/myhub')

注册机制来源

  • hub.py

信号生成流程

信号指示器接收K线数据并输出交易信号的完整流程如下:

flowchart TD
Start([开始]) --> SetTO["setTO(kdata)"]
SetTO --> CheckCalculated{"已计算?"}
CheckCalculated --> |是| ReturnResult["返回缓存结果"]
CheckCalculated --> |否| Calculate["_calculate(kdata)"]
Calculate --> ProcessData["处理K线数据"]
ProcessData --> GenerateSignal["生成买入/卖出信号"]
GenerateSignal --> StoreSignal["存储信号到m_buySig/m_sellSig"]
StoreSignal --> UpdateStatus["更新持仓状态m_hold_long/m_hold_short"]
UpdateStatus --> SetCalculated["设置m_calculated=True"]
SetCalculated --> ReturnResult
ReturnResult --> End([结束])
style Start fill:#f9f,stroke:#333,stroke-width:2px
style End fill:#f9f,stroke:#333,stroke-width:2px
Loading

图示来源

  • SignalBase.cpp
  • SignalBase.h

该流程的核心步骤包括:

  1. 通过setTO方法接收K线数据
  2. 检查是否已计算过相同数据,避免重复计算
  3. 调用_calculate方法执行具体的信号计算逻辑
  4. 使用_addBuySignal_addSellSignal方法添加信号
  5. 更新内部状态和持仓信息
  6. 返回计算结果

整个流程确保了信号生成的高效性和一致性,同时通过缓存机制避免了不必要的重复计算。

结论

信号指示器模块作为交易系统的核心决策引擎,通过精心设计的基类和丰富的具体实现,为量化交易提供了强大而灵活的信号生成能力。SignalBase基类定义了统一的接口和基础功能,确保了各类信号指示器的一致性和可扩展性。各种具体的实现如SG_CrossSG_BandSG_FlexSG_Logic覆盖了常见的技术分析策略,满足了多样化的交易需求。

通过hub.py提供的注册机制,用户可以轻松地扩展系统功能,添加自定义的信号指示器。这种模块化的设计使得系统既强大又灵活,能够适应不断变化的市场环境和交易策略需求。信号生成流程的优化设计确保了计算的高效性和结果的可靠性,为交易系统的稳定运行提供了坚实的基础。

Clone this wiki locally