信号指示器¶
信号指示器负责产生买入、卖出信号。
公共参数:
alternate (bool|True) :买入和卖出信号是否交替出现。单线型的信号通常通过拐点、斜率等判断信号的产生,此种情况下可能出现连续出现买入信号或连续出现卖出信号的情况,此时可通过该参数控制买入、卖出信号是否交替出现。而双线交叉型的信号通常本身买入和卖出已经是交替出现,此时该参数无效。
通用信号指示器¶
通常使用技术指标判断买入、卖出时,依据的是快线和慢线的交叉、或是单曲线的拐点。下面的通用信号指示器足够应付大部分的情况。
双线交叉信号指示器¶
金叉信号指示器¶
单线拐点信号指示器¶
- 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.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):
n = self.get_param("n")
k = self.to
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)
自定义的信号指示器接口:
SignalBase._calculate()
- 【必须】子类计算接口SignalBase._clone()
- 【必须】克隆接口SignalBase._reset()
- 【可选】重载私有变量
示例1(不含私有变量,海龟交易策略):
#!/usr/bin/python
# -*- coding: utf8 -*-
# cp936
#===============================================================================
# Aothor: fasiondog
# History: 20160407, Added by fasiondog
#===============================================================================
from hikyuu import *
class TurtleSignal(SignalBase):
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")
k = self.to
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! 不支持的参数类型
- next_time_should_buy(self)¶
下一时刻是否可以买入,相当于最后时刻是否指示买入
- next_time_should_sell(self)¶
下一时刻是否可以卖出,相当于最后时刻是否指示卖出
- get_buy_signal(self)¶
获取所有买入指示日期列表
- 返回类型:
- get_sell_signal(self)¶
获取所有卖出指示日期列表
- 返回类型:
- reset(self)¶
复位操作
- clone(self)¶
克隆操作
- _calculate(self)¶
【重载接口】子类计算接口
- _reset(self)¶
【重载接口】子类复位接口,复位内部私有变量
- _clone(self)¶
【重载接口】子类克隆接口