mirror of
https://gitee.com/fasiondog/hikyuu.git
synced 2024-12-04 21:07:57 +08:00
193 lines
6.9 KiB
Python
193 lines
6.9 KiB
Python
#!/usr/bin/python
|
||
# -*- coding: utf8 -*-
|
||
# cp936
|
||
#
|
||
# The MIT License (MIT)
|
||
#
|
||
# Copyright (c) 2010-2017 fasiondog
|
||
#
|
||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
# of this software and associated documentation files (the "Software"), to deal
|
||
# in the Software without restriction, including without limitation the rights
|
||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||
# copies of the Software, and to permit persons to whom the Software is
|
||
# furnished to do so, subject to the following conditions:
|
||
#
|
||
# The above copyright notice and this permission notice shall be included in all
|
||
# copies or substantial portions of the Software.
|
||
#
|
||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||
# SOFTWARE.
|
||
|
||
# ===============================================================================
|
||
# History:
|
||
# 1. 20100224, Added by fasiondog
|
||
# ===============================================================================
|
||
"""
|
||
绘制佩里.J.考夫曼(Perry J.Kaufman) 自适应移动平均系统(AMA)
|
||
参见:《精明交易者》(2006年 广东经济出版社)
|
||
"""
|
||
|
||
from hikyuu import (
|
||
Query, StockManager, AMA, STDEV, CVAL, PRICELIST, EMA, CLOSE, HIGH, LOW, OPEN, KDATA, POS, SG_Single, SG_Cross,
|
||
SG_Flex, BUSINESS
|
||
)
|
||
from .drawplot import (show_gcf, create_figure, ax_set_locator_formatter, adjust_axes_show, ax_draw_macd)
|
||
|
||
|
||
def draw(
|
||
stock, query=Query(-130), n=10, filter_n=20, filter_p=0.1, sg_type="CROSS", show_high_low=False, arrow_style=1
|
||
):
|
||
"""绘制佩里.J.考夫曼(Perry J.Kaufman) 自适应移动平均系统(AMA)"""
|
||
kdata = stock.get_kdata(query)
|
||
|
||
ax1, ax2 = create_figure(2)
|
||
kdata.plot(axes=ax1)
|
||
|
||
cama = AMA(CLOSE(kdata), n=n)
|
||
cama.name = "CAMA"
|
||
cama.plot(axes=ax1, color='b', legend_on=True, kref=kdata)
|
||
|
||
hama = AMA(HIGH(kdata), n=n)
|
||
hama.name = "HAMA"
|
||
hstd = STDEV(hama, n)
|
||
lama = AMA(LOW(kdata), n=n)
|
||
lama.name = "LAMA"
|
||
lstd = STDEV(lama, n)
|
||
fy1 = list(lama - lstd)[lstd.discard:]
|
||
fy2 = list(hama + hstd)[hstd.discard:]
|
||
ax1.fill_between(range(lstd.discard, len(kdata)), fy1, fy2, alpha=0.2, color='y')
|
||
|
||
if show_high_low:
|
||
hama.plot(axes=ax1, color='r', legend_on=True, kref=kdata)
|
||
lama.plot(axes=ax1, color='g', legend_on=True, kref=kdata)
|
||
|
||
if sg_type == 'CROSS':
|
||
fast_op = AMA(CLOSE(), n=n)
|
||
slow_op = EMA(n=2 * n)(fast_op)
|
||
sg = SG_Cross(fast_op, slow_op)
|
||
sg.plot(axes=ax1, kdata=kdata)
|
||
ind = slow_op(KDATA(kdata))
|
||
ind.name = "EMA(CAMA)"
|
||
ind.plot(axes=ax1, color='m', legend_on=True, kref=kdata)
|
||
|
||
elif sg_type == 'SINGLE':
|
||
sg = SG_Single(cama, filter_n=filter_n, filter_p=filter_p)
|
||
sg.plot(axes=ax1, kdata=kdata)
|
||
|
||
else:
|
||
print("sg_type only in ('CORSS', 'SINGLE')")
|
||
|
||
cer = PRICELIST(cama, 1)
|
||
label = "ER(%s)" % cer[-1]
|
||
cer.plot(axes=ax2, color='b', marker='o', label=label, legend_on=False, text_on=True, kref=kdata)
|
||
|
||
c = CLOSE(kdata)
|
||
CVAL(c, 0.8).plot(axes=ax2, color='r', linestyle='--', kref=kdata)
|
||
CVAL(c, -0.6).plot(axes=ax2, color='r', linestyle='--', kref=kdata)
|
||
CVAL(c, -0.8).plot(axes=ax2, color='r', linestyle='--', kref=kdata)
|
||
CVAL(c, 0).plot(axes=ax2, color='k', linestyle='-', kref=kdata)
|
||
# ax2.hlines(0.8,0,len(kdata),color='r',linestyle='--')
|
||
# ax2.hlines(-0.6,0,len(kdata),color='r',linestyle='--')
|
||
# ax2.hlines(-0.8,0,len(kdata),color='r',linestyle='--')
|
||
# ax2.hlines(0,0,len(kdata))
|
||
|
||
ax1.set_xlim((0, len(kdata)))
|
||
ax_set_locator_formatter(ax1, kdata.get_datetime_list(), query.ktype)
|
||
adjust_axes_show([ax1, ax2])
|
||
return show_gcf()
|
||
|
||
|
||
def draw2(
|
||
block,
|
||
query=Query(-130),
|
||
ama1=None,
|
||
ama2=None,
|
||
n=10,
|
||
filter_n=20,
|
||
filter_p=0.1,
|
||
sg_type='CROSS',
|
||
show_high_low=True,
|
||
arrow_style=1
|
||
):
|
||
"""绘制佩里.J.考夫曼(Perry J.Kaufman) 自适应移动平均系统(AMA)"""
|
||
if ama1 is None:
|
||
ama1 = AMA(CLOSE(), n=10, fast_n=2, slow_n=30)
|
||
sm = StockManager.instance()
|
||
if block.name == 'SZ':
|
||
kdata = sm['sz000001'].get_kdata(query)
|
||
elif block.name == 'GEM':
|
||
kdata = sm['sz399006'].get_kdata(query)
|
||
else:
|
||
kdata = sm['sh000001'].get_kdata(query)
|
||
|
||
ax1, ax2, ax3 = create_figure(3)
|
||
kdata.plot(axes=ax1)
|
||
|
||
cama = AMA(CLOSE(kdata), n=n)
|
||
cama.name = "CAMA"
|
||
cama.plot(axes=ax1, color='b', legend_on=True, kref=kdata)
|
||
|
||
hama = AMA(HIGH(kdata), n=n)
|
||
hama.name = "HAMA"
|
||
hstd = STDEV(hama, n)
|
||
lama = AMA(LOW(kdata), n=n)
|
||
lama.name = "LAMA"
|
||
lstd = STDEV(lama, n)
|
||
fy1 = list(lama - lstd)[lstd.discard:]
|
||
fy2 = list(hama + hstd)[hstd.discard:]
|
||
ax1.fill_between(range(lstd.discard, len(kdata)), fy1, fy2, alpha=0.2, color='y')
|
||
|
||
if show_high_low:
|
||
hama.plot(axes=ax1, color='r', legend_on=True, kref=kdata)
|
||
lama.plot(axes=ax1, color='g', legend_on=True, kref=kdata)
|
||
|
||
if sg_type == 'CROSS':
|
||
fast_op = AMA(CLOSE(), n=n)
|
||
slow_op = EMA(n=2 * n)(fast_op)
|
||
sg = SG_Cross(fast_op, slow_op)
|
||
sg.plot(axes=ax1, kdata=kdata)
|
||
ind = slow_op(KDATA(kdata))
|
||
ind.name = "EMA(CAMA)"
|
||
ind.plot(axes=ax1, color='m', legend_on=True, kref=kdata)
|
||
|
||
elif sg_type == 'SINGLE':
|
||
sg = SG_Single(cama, filter_n=filter_n, filter_p=filter_p)
|
||
sg.plot(axes=ax1, kdata=kdata)
|
||
|
||
else:
|
||
print("sg_type only in ('CORSS', 'SINGLE')")
|
||
|
||
a = POS(block, query, SG_Flex(AMA(CLOSE(), n=3), 6))
|
||
a.name = "POS(3)"
|
||
a.plot(axes=ax2, color='b', marker='.', legend_on=True, kref=kdata)
|
||
a = POS(block, query, SG_Flex(AMA(CLOSE(), n=30), 60))
|
||
a.name = "POS(30)"
|
||
a.plot(axes=ax2, color='g', marker='.', legend_on=True, kref=kdata)
|
||
|
||
c = CLOSE(kdata)
|
||
CVAL(c, 0.8).plot(axes=ax2, color='r', linestyle='--', kref=kdata)
|
||
CVAL(c, 0.2).plot(axes=ax2, color='r', linestyle='--', kref=kdata)
|
||
|
||
if ama1.name == "AMA":
|
||
cer = PRICELIST(cama, 1)
|
||
label = "ER(%s)" % cer[-1]
|
||
cer.plot(axes=ax3, color='b', marker='.', label=label, legend_on=False, text_on=True, kref=kdata)
|
||
CVAL(c, 0.8).plot(axes=ax3, color='r', linestyle='--', kref=kdata)
|
||
CVAL(c, -0.6).plot(axes=ax3, color='r', linestyle='--', kref=kdata)
|
||
CVAL(c, -0.8).plot(axes=ax3, color='r', linestyle='--', kref=kdata)
|
||
CVAL(c, 0).plot(axes=ax3, color='k', linestyle='-', kref=kdata)
|
||
else:
|
||
ax_draw_macd(ax2, kdata)
|
||
# ax2.set_ylim(-1, 1)
|
||
|
||
ax1.set_xlim((0, len(kdata)))
|
||
ax_set_locator_formatter(ax1, kdata.get_datetime_list(), query.ktype)
|
||
adjust_axes_show([ax1, ax2])
|
||
return show_gcf()
|