2020-07-15 22:50:22 +08:00
|
|
|
# -*- coding: utf8 -*-
|
|
|
|
|
2024-01-26 04:46:44 +08:00
|
|
|
from hikyuu.core import (
|
2023-12-29 17:19:14 +08:00
|
|
|
System, SystemPart, ConditionBase, EnvironmentBase, MoneyManagerBase,
|
2024-03-16 04:24:31 +08:00
|
|
|
ProfitGoalBase, SelectorBase, SignalBase, SlippageBase, StoplossBase, AllocateFundsBase
|
2020-07-15 22:50:22 +08:00
|
|
|
)
|
|
|
|
|
2024-02-18 00:01:24 +08:00
|
|
|
|
|
|
|
def part_iter(self):
|
|
|
|
for i in range(len(self)):
|
|
|
|
yield self[i]
|
|
|
|
|
|
|
|
|
|
|
|
ConditionBase.__iter__ = part_iter
|
|
|
|
|
|
|
|
|
2024-03-29 01:10:05 +08:00
|
|
|
def part_init(self, name='', params={}):
|
2024-03-16 04:24:31 +08:00
|
|
|
super(self.__class__, self).__init__(name)
|
|
|
|
self._name = name
|
|
|
|
self._params = params
|
|
|
|
for k, v in params.items():
|
|
|
|
self.set_param(k, v)
|
|
|
|
|
|
|
|
|
2024-03-29 01:10:05 +08:00
|
|
|
def part_clone(self):
|
|
|
|
cloned = self.__class__.__new__(self.__class__)
|
|
|
|
self.__class__.__init__(cloned, self)
|
|
|
|
cloned.__dict__.update(self.__dict__)
|
|
|
|
return cloned
|
|
|
|
|
|
|
|
|
2023-12-28 02:21:36 +08:00
|
|
|
# ------------------------------------------------------------------
|
2020-07-15 22:50:22 +08:00
|
|
|
# System
|
2023-12-28 02:21:36 +08:00
|
|
|
# ------------------------------------------------------------------
|
|
|
|
System.Part = SystemPart
|
2020-07-15 22:50:22 +08:00
|
|
|
System.ENVIRONMENT = System.Part.ENVIRONMENT
|
|
|
|
System.CONDITION = System.Part.CONDITION
|
|
|
|
System.SIGNAL = System.Part.SIGNAL
|
|
|
|
System.STOPLOSS = System.Part.STOPLOSS
|
|
|
|
System.TAKEPROFIT = System.Part.TAKEPROFIT
|
|
|
|
System.MONEYMANAGER = System.Part.MONEYMANAGER
|
|
|
|
System.PROFITGOAL = System.Part.PROFITGOAL
|
|
|
|
System.SLIPPAGE = System.Part.SLIPPAGE
|
|
|
|
System.INVALID = System.Part.INVALID
|
|
|
|
|
|
|
|
|
2023-12-28 02:21:36 +08:00
|
|
|
# ------------------------------------------------------------------
|
|
|
|
# condition
|
|
|
|
# ------------------------------------------------------------------
|
2024-03-29 01:10:05 +08:00
|
|
|
def crtCN(func, params={}, name='crtCN'):
|
2020-07-15 22:50:22 +08:00
|
|
|
"""
|
2024-03-16 16:56:37 +08:00
|
|
|
快速创建系统有效条件
|
2023-12-28 02:21:36 +08:00
|
|
|
|
2020-07-15 22:50:22 +08:00
|
|
|
:param func: 系统有效条件函数
|
|
|
|
:param {} params: 参数字典
|
|
|
|
:param str name: 自定义名称
|
|
|
|
:return: 自定义系统有效条件实例
|
|
|
|
"""
|
2024-03-29 01:10:05 +08:00
|
|
|
meta_x = type(name, (ConditionBase, ), {'__init__': part_init, '_clone': part_clone})
|
2020-07-15 22:50:22 +08:00
|
|
|
meta_x._calculate = func
|
|
|
|
return meta_x(name, params)
|
|
|
|
|
|
|
|
|
2023-12-28 02:21:36 +08:00
|
|
|
# ------------------------------------------------------------------
|
2020-07-15 22:50:22 +08:00
|
|
|
# environment
|
2023-12-28 02:21:36 +08:00
|
|
|
# ------------------------------------------------------------------
|
2024-03-29 01:10:05 +08:00
|
|
|
def crtEV(func, params={}, name='crtEV'):
|
2020-07-15 22:50:22 +08:00
|
|
|
"""
|
2024-03-16 16:56:37 +08:00
|
|
|
快速创建市场环境判断策略
|
2023-12-28 02:21:36 +08:00
|
|
|
|
2020-07-15 22:50:22 +08:00
|
|
|
:param func: 市场环境判断策略函数
|
|
|
|
:param {} params: 参数字典
|
|
|
|
:param str name: 自定义名称
|
|
|
|
:return: 自定义市场环境判断策略实例
|
|
|
|
"""
|
2024-03-29 01:10:05 +08:00
|
|
|
meta_x = type(name, (EnvironmentBase, ), {'__init__': part_init, '_clone': part_clone})
|
2020-07-15 22:50:22 +08:00
|
|
|
meta_x._calculate = func
|
|
|
|
return meta_x(name, params)
|
|
|
|
|
|
|
|
|
2023-12-28 02:21:36 +08:00
|
|
|
# ------------------------------------------------------------------
|
2020-07-15 22:50:22 +08:00
|
|
|
# moneymanager
|
2023-12-28 02:21:36 +08:00
|
|
|
# ------------------------------------------------------------------
|
2024-03-29 01:10:05 +08:00
|
|
|
def crtMM(func, params={}, name='crtMM'):
|
2020-07-15 22:50:22 +08:00
|
|
|
"""
|
2024-03-16 16:56:37 +08:00
|
|
|
快速创建资金管理策略
|
2023-12-28 02:21:36 +08:00
|
|
|
|
2020-07-15 22:50:22 +08:00
|
|
|
:param func: 资金管理策略计算函数
|
|
|
|
:param {} params: 参数字典
|
|
|
|
:param str name: 自定义名称
|
|
|
|
:return: 自定义资金管理策略实例
|
|
|
|
"""
|
2024-03-29 01:10:05 +08:00
|
|
|
meta_x = type(name, (MoneyManagerBase, ), {'__init__': part_init, '_clone': part_clone})
|
2020-07-15 22:50:22 +08:00
|
|
|
meta_x._calculate = func
|
|
|
|
return meta_x(name, params)
|
|
|
|
|
|
|
|
|
2023-12-28 02:21:36 +08:00
|
|
|
# ------------------------------------------------------------------
|
2020-07-15 22:50:22 +08:00
|
|
|
# profitgoal
|
2023-12-28 02:21:36 +08:00
|
|
|
# ------------------------------------------------------------------
|
2024-03-29 01:10:05 +08:00
|
|
|
def crtPG(func, params={}, name='crtPG'):
|
2020-07-15 22:50:22 +08:00
|
|
|
"""
|
2024-03-16 16:56:37 +08:00
|
|
|
快速创建盈利目标策略
|
2023-12-28 02:21:36 +08:00
|
|
|
|
2020-07-15 22:50:22 +08:00
|
|
|
:param func: 盈利目标策略函数
|
|
|
|
:param {} params: 参数字典
|
|
|
|
:param str name: 自定义名称
|
|
|
|
:return: 盈利目标策略实例
|
|
|
|
"""
|
2024-03-29 01:10:05 +08:00
|
|
|
meta_x = type(name, (ProfitGoalBase, ), {'__init__': part_init, '_clone': part_clone})
|
2020-07-15 22:50:22 +08:00
|
|
|
meta_x._calculate = func
|
|
|
|
return meta_x(name, params)
|
|
|
|
|
|
|
|
|
2023-12-28 02:21:36 +08:00
|
|
|
# ------------------------------------------------------------------
|
2020-07-15 22:50:22 +08:00
|
|
|
# signal
|
2023-12-28 02:21:36 +08:00
|
|
|
# ------------------------------------------------------------------
|
2024-03-29 01:10:05 +08:00
|
|
|
def crtSG(func, params={}, name='crtSG'):
|
2020-07-15 22:50:22 +08:00
|
|
|
"""
|
2024-03-16 16:56:37 +08:00
|
|
|
快速创建信号指示器
|
2023-12-28 02:21:36 +08:00
|
|
|
|
2020-07-15 22:50:22 +08:00
|
|
|
:param func: 信号策略函数
|
|
|
|
:param {} params: 参数字典
|
|
|
|
:param str name: 自定义名称
|
|
|
|
:return: 自定义信号指示器实例
|
|
|
|
"""
|
2024-03-29 01:10:05 +08:00
|
|
|
meta_x = type(name, (SignalBase, ), {'__init__': part_init, '_clone': part_clone})
|
2020-07-15 22:50:22 +08:00
|
|
|
meta_x._calculate = func
|
|
|
|
return meta_x(name, params)
|
|
|
|
|
|
|
|
|
2023-12-28 02:21:36 +08:00
|
|
|
# ------------------------------------------------------------------
|
2020-08-31 23:51:24 +08:00
|
|
|
# Selector
|
2023-12-28 02:21:36 +08:00
|
|
|
# ------------------------------------------------------------------
|
2020-08-31 23:51:24 +08:00
|
|
|
def se_add_stock_list(self, stk_list, proto_sys):
|
|
|
|
result = True
|
|
|
|
for stk in stk_list:
|
|
|
|
success = self.add_stock(stk, proto_sys)
|
|
|
|
if not success:
|
|
|
|
result = False
|
|
|
|
break
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
SelectorBase.add_stock_list = se_add_stock_list
|
|
|
|
|
2024-03-16 04:24:31 +08:00
|
|
|
|
2024-03-29 01:10:05 +08:00
|
|
|
def crtSE(calculate, get_selected, is_match_af=None, params={}, name='crtSE'):
|
2024-03-16 04:24:31 +08:00
|
|
|
"""
|
2024-03-16 16:56:37 +08:00
|
|
|
快速创建交易对象选择算法
|
2024-03-16 04:24:31 +08:00
|
|
|
|
2024-03-16 16:56:37 +08:00
|
|
|
:param calculate function: 计算函数
|
|
|
|
:param get_selected_on_close function: 收盘时刻选择算法
|
|
|
|
:param get_selected_on_open function: 开盘时刻选择算法
|
2024-03-16 04:24:31 +08:00
|
|
|
:param {} params: 参数字典
|
|
|
|
:param str name: 自定义名称
|
|
|
|
:return: 自定义交易对象选择算法实例
|
|
|
|
"""
|
2024-03-29 01:10:05 +08:00
|
|
|
meta_x = type(name, (SelectorBase, ), {'__init__': part_init, '_clone': part_clone})
|
2024-03-16 16:56:37 +08:00
|
|
|
meta_x._calculate = calculate
|
2024-03-20 18:22:30 +08:00
|
|
|
meta_x.get_selected = get_selected
|
2024-03-27 17:48:21 +08:00
|
|
|
meta_x.is_match_af = (lambda self, af: True) if is_match_af is None else is_match_af
|
2024-03-16 04:24:31 +08:00
|
|
|
return meta_x(name, params)
|
|
|
|
|
|
|
|
|
2023-12-28 02:21:36 +08:00
|
|
|
# ------------------------------------------------------------------
|
2024-03-16 04:24:31 +08:00
|
|
|
# allocatefunds
|
2023-12-28 02:21:36 +08:00
|
|
|
# ------------------------------------------------------------------
|
2024-03-29 01:10:05 +08:00
|
|
|
def crtAF(allocate_weight_func, params={}, name='crtAF'):
|
2024-03-16 04:24:31 +08:00
|
|
|
"""
|
2024-03-16 16:56:37 +08:00
|
|
|
快速创建资产分配算法
|
2024-03-16 04:24:31 +08:00
|
|
|
|
2024-03-16 16:56:37 +08:00
|
|
|
:param allocate_weight_func: 资产分配算法
|
2024-03-16 04:24:31 +08:00
|
|
|
:param {} params: 参数字典
|
|
|
|
:param str name: 自定义名称
|
|
|
|
:return: 自定义资产分配算法实例
|
|
|
|
"""
|
2024-03-29 01:10:05 +08:00
|
|
|
meta_x = type(name, (AllocateFundsBase, ), {'__init__': part_init, '_clone': part_clone})
|
2024-03-16 16:56:37 +08:00
|
|
|
meta_x._allocate_weight = allocate_weight_func
|
2024-03-16 04:24:31 +08:00
|
|
|
return meta_x(name, params)
|
2020-07-15 22:50:22 +08:00
|
|
|
|
|
|
|
|
2024-03-16 04:24:31 +08:00
|
|
|
# ------------------------------------------------------------------
|
|
|
|
# slippage
|
|
|
|
# ------------------------------------------------------------------
|
2024-03-29 01:10:05 +08:00
|
|
|
def crtSL(func, params={}, name='crtSL'):
|
2020-07-15 22:50:22 +08:00
|
|
|
"""
|
2024-03-16 16:56:37 +08:00
|
|
|
快速创建移滑价差算法
|
2023-12-28 02:21:36 +08:00
|
|
|
|
2020-07-15 22:50:22 +08:00
|
|
|
:param func: 移滑价差算法函数
|
|
|
|
:param {} params: 参数字典
|
|
|
|
:param str name: 自定义名称
|
|
|
|
:return: 移滑价差算法实例
|
|
|
|
"""
|
2024-03-29 01:10:05 +08:00
|
|
|
meta_x = type(name, (SlippageBase, ), {'__init__': part_init, '_clone': part_clone})
|
2020-07-15 22:50:22 +08:00
|
|
|
meta_x._calculate = func
|
|
|
|
return meta_x(name, params)
|
|
|
|
|
|
|
|
|
2023-12-28 02:21:36 +08:00
|
|
|
# ------------------------------------------------------------------
|
2020-07-15 22:50:22 +08:00
|
|
|
# stoploss
|
2023-12-28 02:21:36 +08:00
|
|
|
# ------------------------------------------------------------------
|
2024-03-29 01:10:05 +08:00
|
|
|
def crtST(func, params={}, name='crtST'):
|
2020-07-15 22:50:22 +08:00
|
|
|
"""
|
2024-03-16 16:56:37 +08:00
|
|
|
快速创建止损/止盈策略
|
2023-12-28 02:21:36 +08:00
|
|
|
|
2020-07-15 22:50:22 +08:00
|
|
|
:param func: 止损/止盈策略函数
|
|
|
|
:param {} params: 参数字典
|
|
|
|
:param str name: 自定义名称
|
|
|
|
:return: 止损/止盈策略实例
|
|
|
|
"""
|
2024-03-29 01:10:05 +08:00
|
|
|
meta_x = type(name, (StoplossBase, ), {'__init__': part_init, '_clone': part_clone})
|
2020-07-15 22:50:22 +08:00
|
|
|
meta_x._calculate = func
|
|
|
|
return meta_x(name, params)
|