信号指示器

信号指示器负责产生买入、卖出信号。

公共参数:

  • alternate (bool|True) :买入和卖出信号是否交替出现。单线型的信号通常通过拐点、斜率等判断信号的产生,此种情况下可能出现连续出现买入信号或连续出现卖出信号的情况,此时可通过该参数控制买入、卖出信号是否交替出现。而双线交叉型的信号通常本身买入和卖出已经是交替出现,此时该参数无效。

通用信号指示器

通常使用技术指标判断买入、卖出时,依据的是快线和慢线的交叉、或是单曲线的拐点。下面的通用信号指示器足够应付大部分的情况。

双线交叉信号指示器

hikyuu.trade_sys.SG_Cross(fast, slow)

双线交叉指示器,当快线从下向上穿越慢线时,买入;当快线从上向下穿越慢线时,卖出。如:5日MA上穿10日MA时买入,5日MA线下穿MA10日线时卖出:

SG_Cross(MA(CLOSE(), n=10), OP(MA(n=30)))
参数:
返回:

信号指示器

金叉信号指示器

hikyuu.trade_sys.SG_CrossGold(fast, slow)

金叉指示器,当快线从下向上穿越慢线且快线和慢线的方向都是向上时为金叉,买入; 当快线从上向下穿越慢线且快线和慢线的方向都是向下时死叉,卖出。:

SG_CrossGold(MA(CLOSE(), n=10), MA(CLOSE(), n=30))
参数:
返回:

信号指示器

单线拐点信号指示器

hikyuu.trade_sys.SG_Single(ind[, filter_n = 10, filter_p = 0.1])

生成单线拐点信号指示器。使用《精明交易者》 [BOOK1] 中给出的曲线拐点算法判断曲线趋势,公式见下:

filter = percentage * STDEV((AMA-AMA[1], N)

Buy  When AMA - AMA[1] > filter
or Buy When AMA - AMA[2] > filter
or Buy When AMA - AMA[3] > filter
参数:
  • ind (Indicator)

  • filer_n (int) – N日周期

  • filter_p (float) – 过滤器百分比

返回:

信号指示器

hikyuu.trade_sys.SG_Single2(ind[, filter_n = 10, filter_p = 0.1])

生成单线拐点信号指示器2 [BOOK1]:

filter = percentage * STDEV((AMA-AMA[1], N)

Buy  When AMA - @lowest(AMA,n) > filter
Sell When @highest(AMA, n) - AMA > filter
参数:
  • ind (Indicator)

  • filer_n (int) – N日周期

  • filter_p (float) – 过滤器百分比

返回:

信号指示器

自交叉单线拐点指示器

hikyuu.trade_sys.SG_Flex(ind, slow_n)

使用自身的EMA(slow_n)作为慢线,自身作为快线,快线向上穿越慢线买入,快线向下穿越慢线卖出。

参数:
  • ind (Indicator)

  • slow_n (int) – 慢线EMA周期

返回:

信号指示器

布尔信号指示器

hikyuu.trade_sys.SG_Bool(buy, sell)

布尔信号指示器,使用运算结果为类似bool数组的Indicator分别作为买入、卖出指示。

参数:
  • buy (Indicator) – 买入指示(结果Indicator中相应位置>0则代表买入)

  • sell (Indicator) – 卖出指示(结果Indicator中相应位置>0则代表卖出)

返回:

信号指示器

自定义信号指示器

快速创建不带私有属性的自定义信号指示器

hikyuu.trade_sys.crtSG(func, params={}, name='crtSG')

快速创建自定义不带私有属性的信号指示器

参数:
  • func – 信号策略函数

  • params ({}) – 参数字典

  • name (str) – 自定义名称

返回:

自定义信号指示器实例

示例:

#!/usr/bin/python
# -*- coding: utf8 -*-
# cp936

# ===============================================================================
# Aothor: fasiondog
# History: 20160407, Added by fasiondog
# ===============================================================================

from hikyuu import *


def TurtleSG(self, k):
    n = self.get_param("n")
    c = CLOSE(k)
    h = REF(HHV(c, n), 1)  # 前n日高点
    L = REF(LLV(c, n), 1)  # 前n日低点
    for i in range(h.discard, len(k)):
        if (c[i] >= h[i]):
            self._add_buy_signal(k[i].datetime)
        elif (c[i] <= L[i]):
            self._add_sell_signal(k[i].datetime)


if __name__ == "__main__":
    from examples_init import *

    sg = crtSG(TurtleSG, {'n': 20}, 'TurtleSG')
    s = get_stock("sh000001")
    k = s.get_kdata(Query(-500))

    # 只有设置交易对象时,才会开始实际计算
    sg.to = k
    dates = k.get_datetime_list()
    for d in dates:
        if (sg.should_buy(d)):
            print("买入:%s" % d)
        elif (sg.should_sell(d)):
            print("卖出: %s" % d)

自定义的信号指示器接口:

示例1(不含私有变量,海龟交易策略):

#!/usr/bin/python
# -*- coding: utf8 -*-
# cp936

# ===============================================================================
# Aothor: fasiondog
# History: 20160407, Added by fasiondog
# ===============================================================================

from hikyuu import *


class TurtleSignal(SignalBase, k):
    def __init__(self, n=20):
        super(TurtleSignal, self).__init__("TurtleSignal")
        self.set_param("n", 20)

    def _clone(self):
        return TurtleSignal()

    def _calculate(self):
        n = self.get_param("n")
        c = CLOSE(k)
        h = REF(HHV(c, n), 1)  # 前n日高点
        L = REF(LLV(c, n), 1)  # 前n日低点
        for i in range(h.discard, len(k)):
            if (c[i] >= h[i]):
                self._add_buy_signal(k[i].datetime)
            elif (c[i] <= L[i]):
                self._add_sell_signal(k[i].datetime)


if __name__ == "__main__":
    from examples_init import *

    sg = TurtleSignal()
    s = get_stock("sh000001")
    k = s.get_kdata(Query(-500))

    # 只有设置交易对象时,才会开始实际计算
    sg.to = k
    dates = k.get_datetime_list()
    for d in dates:
        if (sg.should_buy(d)):
            print("买入:%s" % d)
        elif (sg.should_sell(d)):
            print("卖出: %s" % d)

示例2(含私有属性):

class SignalPython(SignalBase):
    def __init__(self):
        super(SignalPython, self).__init__("SignalPython")
        self._x = 0 #私有属性
        self.setParam("test", 30)

    def _reset(self):
        self._x = 0

    def _clone(self):
        p = SignalPython()
        p._x = self._x
        return p

    def _calculate(self):
        self._addBuySignal(Datetime(201201210000))
        self._addSellSignal(Datetime(201201300000))

信号指示器基类

class hikyuu.trade_sys.SignalBase

信号指示器基类

name 名称
__init__(self[, name="SignalBase"])
参数:

name (str) – 名称

get_param(self, name)

获取指定的参数

参数:

name (str) – 参数名称

返回:

参数值

抛出:

out_of_range – 无此参数

set_param(self, name, value)

设置参数

参数:
  • name (str) – 参数名称

  • value (int | bool | float | string) – 参数值

抛出:

logic_error – Unsupported type! 不支持的参数类型

should_buy(self, datetime)

指定时刻是否可以买入

参数:

datetime (Datetime) – 指定时刻

返回类型:

bool

should_sell(self, datetime)

指定时刻是否可以卖出

参数:

datetime (Datetime) – 指定时刻

返回类型:

bool

next_time_should_buy(self)

下一时刻是否可以买入,相当于最后时刻是否指示买入

next_time_should_sell(self)

下一时刻是否可以卖出,相当于最后时刻是否指示卖出

get_buy_signal(self)

获取所有买入指示日期列表

返回类型:

DatetimeList

get_sell_signal(self)

获取所有卖出指示日期列表

返回类型:

DatetimeList

_add_buy_signal(self, datetime)

加入买入信号,在_calculate中调用

参数:

datetime (Datetime) – 指示买入的日期

_add_sell_signal(self, datetime)

加入卖出信号,在_calculate中调用

参数:

datetime (Datetime) – 指示卖出的日期

reset(self)

复位操作

clone(self)

克隆操作

_calculate(self, kdata)

【重载接口】子类计算接口

_reset(self)

【重载接口】子类复位接口,复位内部私有变量

_clone(self)

【重载接口】子类克隆接口