Skip to content

Commit

Permalink
Merge pull request #222 from fasiondog/bugfix
Browse files Browse the repository at this point in the history
crtSL -> 更名 crtSP;fixed 缺失的 hku_save / hku_load 函数;crtMM和crtSP实际接口未纳入;update OrderBroker
  • Loading branch information
fasiondog committed Apr 5, 2024
2 parents 8524ff3 + 20f22e5 commit 433ebe4
Show file tree
Hide file tree
Showing 8 changed files with 125 additions and 74 deletions.
4 changes: 2 additions & 2 deletions docs/source/base/other_utils.rst
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,12 @@
:param var: hikyuu内建类型的变量
:param str filename: 指定的文件名

.. py:function:: hku_load(var, filename)
.. py:function:: hku_load(filename)
将通过 hku_save 保存的变量,读取到var中。

:param var: 指定的变量
:param str filename: 待载入的序列化文件。
:return: 之前被序列化保存的文件

.. py:function:: roundUp(arg1[, arg2=0])
Expand Down
17 changes: 7 additions & 10 deletions docs/source/trade_manage/OrderBroker.rst
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,14 @@ Python中的订单代理包装
sys.run(sm['sz000001'], Query(-150))

.. py:class:: OrderBrokerWrap(broker[, real=True, slip=0.03])
.. py:class:: OrderBrokerWrap
订单代理包装类,用户可以参考自定义自己的订单代理,加入额外的处理

:param bool real: 下单前是否重新实时获取实时分笔数据
:param float slip: 如果当前的卖一价格和指示买入的价格绝对差值不超过slip则下单,否则忽略; 对卖出操作无效,立即以当前价卖出

.. py:method:: __init__(self, broker, name)
:param broker: python broker 实例
:param str name: 名称

.. py:method:: _buy(self, code, price, num)
Expand All @@ -59,15 +61,10 @@ Python中的订单代理包装
:param int num: 卖出数量


.. py:function:: crtOB(broker[, real=True, slip=0.03])
.. py:function:: crtOB(broker[, name="NO_NAME"])
快速生成订单代理包装对象

:param broker: 订单代理示例,必须拥有buy和sell方法,并且参数为 code, price, num
:param bool real: 下单前是否重新实时获取实时分笔数据
:param float slip: 如果当前的卖一价格和指示买入的价格绝对差值不超过slip则下单,否则忽略; 对卖出操作无效,立即以当前价卖出



内建的订单代理类
------------------
Expand Down
25 changes: 25 additions & 0 deletions hikyuu/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@

import traceback
import sys
import pickle

from .util import *

try:
Expand Down Expand Up @@ -92,6 +94,29 @@ def close():
iodog.open()


def hku_save(var, filename):
"""
序列化,将hikyuu内建类型的变量(如Stock、TradeManager等)保存在指定的文件中,格式为XML。
:param var: hikyuu内建类型的变量
:param str filename: 指定的文件名
"""
with open(filename, 'wb') as f:
pickle.dump(var, f)


def hku_load(filename):
"""
将通过 hku_save 保存的变量,读取到var中。
:param str filename: 待载入的序列化文件。
:return: 之前被序列化保存的文件
"""
with open(filename, 'rb') as f:
out = pickle.load(f)
return out


# ==============================================================================
#
# 设置关键类型简称
Expand Down
95 changes: 53 additions & 42 deletions hikyuu/examples/notebook/006-TradeManager.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,29 @@
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2024-04-06 01:24:41,451 [INFO] hikyuu version: 2.0.0_202404040113_RELEASE_windows_x64 [<module>] (D:\\workspace\\hikyuu\\hikyuu\\__init__.py:93) [hikyuu::hku_info]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"warning: can't import TA-Lib, will be ignored! You can fetch ta-lib from https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib\n",
"std::cout are redirected to python::stdout\n",
"std::cerr are redirected to python::stderr\n",
"2023-10-14 02:24:00.639 [HKU-I] - Using SQLITE3 BaseInfoDriver (BaseInfoDriver.cpp:58)\n",
"2023-10-14 02:24:00.640 [HKU-I] - Loading market information... (StockManager.cpp:499)\n",
"2023-10-14 02:24:00.640 [HKU-I] - Loading stock type information... (StockManager.cpp:512)\n",
"2023-10-14 02:24:00.641 [HKU-I] - Loading stock information... (StockManager.cpp:426)\n",
"2023-10-14 02:24:00.691 [HKU-I] - Loading stock weight... (StockManager.cpp:529)\n",
"2023-10-14 02:24:01.039 [HKU-I] - Loading KData... (StockManager.cpp:134)\n",
"2023-10-14 02:24:01.043 [HKU-I] - Preloading all day kdata to buffer! (StockManager.cpp:157)\n",
"2023-10-14 02:24:01.043 [HKU-I] - Preloading all week kdata to buffer! (StockManager.cpp:160)\n",
"2023-10-14 02:24:01.044 [HKU-I] - Preloading all month kdata to buffer! (StockManager.cpp:163)\n",
"2023-10-14 02:24:01.055 [HKU-I] - 0.02s Loaded Data. (StockManager.cpp:145)\n",
"Wall time: 1.09 s\n"
"2024-04-06 01:24:41.867 [HKU-I] - Using MYSQL BaseInfoDriver (BaseInfoDriver.cpp:58)\n",
"2024-04-06 01:24:41.890 [HKU-I] - Loading market information... (StockManager.cpp:532)\n",
"2024-04-06 01:24:41.902 [HKU-I] - Loading stock type information... (StockManager.cpp:545)\n",
"2024-04-06 01:24:41.914 [HKU-I] - Loading stock information... (StockManager.cpp:460)\n",
"2024-04-06 01:24:42.064 [HKU-I] - Loading stock weight... (StockManager.cpp:562)\n",
"2024-04-06 01:24:43.250 [HKU-I] - Loading KData... (StockManager.cpp:133)\n",
"2024-04-06 01:24:43.958 [HKU-I] - Preloading all day kdata to buffer! (StockManager.cpp:171)\n",
"2024-04-06 01:24:43.959 [HKU-I] - Preloading all week kdata to buffer! (StockManager.cpp:174)\n",
"2024-04-06 01:24:43.959 [HKU-I] - Preloading all month kdata to buffer! (StockManager.cpp:177)\n",
"2024-04-06 01:24:43.963 [HKU-I] - 0.71s Loaded Data. (StockManager.cpp:150)\n",
"CPU times: total: 500 ms\n",
"Wall time: 3.35 s\n"
]
}
],
Expand Down Expand Up @@ -64,6 +69,7 @@
" firstDatetime: 2017-01-03 00:00:00,\n",
" lastDatetime: 2017-01-03 00:00:00,\n",
" TradeCostFunc: TradeCostFunc(TC_Zero, params[]),\n",
" current total funds: 100005.00,\n",
" current cash: 99089.00,\n",
" current market_value: 916.00,\n",
" current short_market_value: 0.00,\n",
Expand All @@ -72,7 +78,7 @@
" current borrow_cash: 0.00,\n",
" current borrow_asset: 0.00,\n",
" Position: \n",
" SZ000001 平安银行 2017-01-03 00:00:00 1646 100.00 911.00 1100.00 189.00 20.75% 0.19%\n",
" SZ000001 平安银行 2017-01-03 00:00:00 1762 100.00 911.00 1046.00 135.00 14.82% 0.14%\n",
" Short Position: \n",
" Borrow Stock: \n",
"}\n"
Expand Down Expand Up @@ -142,21 +148,21 @@
" <th>SZ000001</th>\n",
" <td>平安银行</td>\n",
" <td>2017-01-03</td>\n",
" <td>1646</td>\n",
" <td>1762</td>\n",
" <td>100</td>\n",
" <td>911.0</td>\n",
" <td>1100.0</td>\n",
" <td>189.0</td>\n",
" <td>20.746432</td>\n",
" <td>1046.0</td>\n",
" <td>135.0</td>\n",
" <td>14.81888</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 证券名称 买入日期 已持仓天数 持仓数量 投入金额 当前市值 盈亏金额 盈亏比例\n",
"证券代码 \n",
"SZ000001 平安银行 2017-01-03 1646 100 911.0 1100.0 189.0 20.746432"
" 证券名称 买入日期 已持仓天数 持仓数量 投入金额 当前市值 盈亏金额 盈亏比例\n",
"证券代码 \n",
"SZ000001 平安银行 2017-01-03 1762 100 911.0 1046.0 135.0 14.81888"
]
},
"execution_count": 3,
Expand Down Expand Up @@ -186,6 +192,7 @@
" firstDatetime: 2017-01-03 00:00:00,\n",
" lastDatetime: 2017-02-21 00:00:00,\n",
" TradeCostFunc: TradeCostFunc(TC_Zero, params[]),\n",
" current total funds: 100049.00,\n",
" current cash: 100049.00,\n",
" current market_value: 0.00,\n",
" current short_market_value: 0.00,\n",
Expand Down Expand Up @@ -252,7 +259,7 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
Expand All @@ -264,14 +271,13 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"#载入已保存的TM对象\n",
"#filename = \"{}/my_trade/my_trade_record_{}.xml\".format(sm.tmpdir(), date.today())\n",
"new_my_tm = crtTM()\n",
"hku_load(new_my_tm, filename)"
"new_my_tm = hku_load(filename)"
]
},
{
Expand All @@ -292,25 +298,28 @@
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"买入:SZ000001 12.930 1000\n",
"卖出:SZ000001 12.480 1000\n",
"买入:SZ000001 12.940 1000\n",
"卖出:SZ000001 12.580 1000\n",
"买入:SZ000001 11.410 1000\n",
"卖出:SZ000001 11.230 1000\n",
"买入:SZ000001 11.330 1000\n",
"卖出:SZ000001 11.450 1000\n",
"买入:SZ000001 11.650 1000\n",
"卖出:SZ000001 11.690 1000\n",
"买入:SZ000001 11.400 1000\n",
"卖出:SZ000001 11.280 1000\n"
"买入:SZ000001 11.470 1000\n",
"卖出:SZ000001 11.140 1000\n",
"买入:SZ000001 11.500 1000\n",
"卖出:SZ000001 11.290 1000\n",
"买入:SZ000001 10.580 1000\n",
"卖出:SZ000001 10.460 1000\n",
"买入:SZ000001 9.420 1000\n",
"卖出:SZ000001 9.100 1000\n",
"买入:SZ000001 9.330 1000\n",
"卖出:SZ000001 9.160 1000\n",
"买入:SZ000001 9.330 1000\n",
"卖出:SZ000001 10.550 1000\n",
"买入:SZ000001 10.560 1000\n",
"卖出:SZ000001 10.350 1000\n",
"买入:SZ000001 10.560 1000\n"
]
}
],
Expand All @@ -319,8 +328,10 @@
"my_tm = crtTM(init_cash=300000, date=Datetime(201701010000))\n",
"\n",
"#注册实盘交易订单代理\n",
"my_tm.reg_broker(crtOB(TestOrderBroker(), False)) #TestOerderBroker是测试用订单代理对象,只打印\n",
"#my_tm.regBroker(crtOB(MailOrderBroker(\"smtp.sina.com\", \"yourmail@sina.com\", \"yourpwd\", \"receivermail@XXX.yy)))\n",
"ob = crtOB(TestOrderBroker())\n",
"my_tm.reg_broker(ob) #TestOerderBroker是测试用订单代理对象,只打印\n",
"# 注意:pybind 不支持下面这种方式调用,必须先生成实例再传入!!!\n",
"# my_tm.reg_broker(crtOB(TestOrderBroker(), False))\n",
"\n",
"#根据需要修改订单代理最后的时间戳,后续只有大于该时间戳时,订单代理才会实际发出订单指令\n",
"my_tm.broker_last_datetime=Datetime(201701010000)\n",
Expand Down Expand Up @@ -360,7 +371,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.16"
"version": "3.11.7"
}
},
"nbformat": 4,
Expand Down
20 changes: 9 additions & 11 deletions hikyuu/trade_manage/broker.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

#===============================================================================
# ===============================================================================
# History:
# 1. 20170704, Added by fasiondog
#===============================================================================
# ===============================================================================

from hikyuu import OrderBrokerBase

Expand All @@ -36,16 +36,13 @@ class OrderBrokerWrap(OrderBrokerBase):
"""订单代理包装类,用户可以参考自定义自己的订单代理,加入额外的处理
包装只有买卖操作参数只有(code, price, num)的交易接口类
"""
def __init__(self, broker, slip=0.03):

def __init__(self, broker, name):
"""
订单代理包装类,用户可以参考自定义自己的订单代理,加入额外的处理
:param float slip: 如果当前的卖一价格和指示买入的价格绝对差值不超过slip则下单,
否则忽略; 对卖出操作无效,立即以当前价卖出
"""
super(OrderBrokerWrap, self).__init__()
super(OrderBrokerWrap, self).__init__(name)
self._broker = broker
self._slip = slip

def _buy(self, datetime, market, code, price, num):
"""实现 OrderBrokerBase 的 _buy 接口"""
Expand All @@ -60,6 +57,7 @@ def _sell(self, datetime, market, code, price, num):

class TestOrderBroker:
"""用于测试的订单代理,仅在执行买入/卖出时打印信息"""

def __init__(self):
pass

Expand All @@ -70,12 +68,12 @@ def sell(self, code, price, num):
print("卖出:%s %.3f %i" % (code, price, num))


def crtOB(broker, slip=0.03):
def crtOB(broker, name="NO_NAME"):
"""
快速生成订单代理包装对象
:param broker: 订单代理示例,必须拥有buy和sell方法,并且参数为 code, price, num
:param float slip: 如果当前的卖一价格和指示买入的价格绝对差值不超过slip则下单,
否则忽略; 对卖出操作无效,立即以当前价卖出
"""
return OrderBrokerWrap(broker, slip)
return OrderBrokerWrap(broker, name)
25 changes: 19 additions & 6 deletions hikyuu/trade_sys/trade_sys.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,17 +82,25 @@ def crtEV(func, params={}, name='crtEV'):
# ------------------------------------------------------------------
# moneymanager
# ------------------------------------------------------------------
def crtMM(func, params={}, name='crtMM'):
def crtMM(get_buy_num, get_sell_num, params={}, name='crtMM', buy_notify=None, sell_notify=None):
"""
快速创建资金管理策略
:param func: 资金管理策略计算函数
:param get_buy_num: 买入数量接口
:param sell_buy_num: 卖出数量接口
:param {} params: 参数字典
:param str name: 自定义名称
:param buy_notify: 接收买入交易记录通知
:param sell_notify: 接收卖出交易记录通知
:return: 自定义资金管理策略实例
"""
meta_x = type(name, (MoneyManagerBase, ), {'__init__': part_init, '_clone': part_clone})
meta_x._calculate = func
meta_x._get_buy_num = get_buy_num
meta_x._get_sell_num = get_sell_num
if buy_notify is not None:
meta_x._buy_notify = buy_notify
if sell_notify is not None:
meta_x._sell_notify = sell_notify
return meta_x(name, params)


Expand Down Expand Up @@ -188,17 +196,22 @@ def crtMF(calculate_func, params={}, name='crtMF'):
# ------------------------------------------------------------------
# slippage
# ------------------------------------------------------------------
def crtSL(func, params={}, name='crtSL'):
def crtSP(get_real_buy_price, get_real_sell_price, params={}, name='crtSP', calculate=None):
"""
快速创建移滑价差算法
:param func: 移滑价差算法函数
:param get_real_buy_price: 移滑价差算法接口计算实际买入价格
:param get_real_sell_price: 移滑价差算法接口计算实际买入价格
:param {} params: 参数字典
:param str name: 自定义名称
:param calculate: 预处理函数
:return: 移滑价差算法实例
"""
meta_x = type(name, (SlippageBase, ), {'__init__': part_init, '_clone': part_clone})
meta_x._calculate = func
meta_x.get_real_buy_price = get_real_buy_price
meta_x.get_real_sell_price = get_real_sell_price
if calculate is not None:
meta_x._calculate = calculate
return meta_x(name, params)


Expand Down

0 comments on commit 433ebe4

Please sign in to comment.