提交 8494f37a 编写于 作者: Z zengbin93

新增第一、二买卖点识别


Former-commit-id: b31f874da3df6334c563a278d44a1302ad777608
上级 14122e01
...@@ -65,6 +65,7 @@ from datetime import datetime, timedelta ...@@ -65,6 +65,7 @@ from datetime import datetime, timedelta
from chan import KlineAnalyze, SolidAnalyze from chan import KlineAnalyze, SolidAnalyze
# 首次使用,需要在这里设置你的 tushare token,用于获取数据;在同一台机器上,tushare token 只需要设置一次 # 首次使用,需要在这里设置你的 tushare token,用于获取数据;在同一台机器上,tushare token 只需要设置一次
# 没有 token,到 https://tushare.pro/register?reg=7 注册获取
# ts.set_token("your tushare token") # ts.set_token("your tushare token")
...@@ -145,7 +146,7 @@ def get_klines(ts_code, end_date, freqs='1min,5min,30min,D', asset='E'): ...@@ -145,7 +146,7 @@ def get_klines(ts_code, end_date, freqs='1min,5min,30min,D', asset='E'):
def use_kline_analyze(): def use_kline_analyze():
print('=' * 100, '\n') print('=' * 100, '\n')
print("KlineAnalyze 的使用方法:\n") print("KlineAnalyze 的使用方法:\n")
kline = get_kline(ts_code="000300.SH", end_date="20200202", freq='D', asset="I") kline = get_kline(ts_code="000009.SZ", end_date="20200210", freq='30min', asset="I")
ka = KlineAnalyze(kline) ka = KlineAnalyze(kline)
print("线段:", ka.xd, "\n") print("线段:", ka.xd, "\n")
print("中枢:", ka.zs, "\n") print("中枢:", ka.zs, "\n")
...@@ -158,13 +159,9 @@ def use_solid_analyze(): ...@@ -158,13 +159,9 @@ def use_solid_analyze():
sa = SolidAnalyze(klines) sa = SolidAnalyze(klines)
# 查看指定级别的三买 # 查看指定级别的三买
tb = sa.is_third_buy('30min') tb, _ = sa.is_third_buy('30min')
print("指定级别三买:", tb, "\n") print("指定级别三买:", tb, "\n")
# 查看多个级别的三买
tb = sa.check_third_buy(['1min', '5min', '30min', "D"])
print("多级别三买:", tb, "\n")
if __name__ == '__main__': if __name__ == '__main__':
use_kline_analyze() use_kline_analyze()
...@@ -176,6 +173,15 @@ if __name__ == '__main__': ...@@ -176,6 +173,15 @@ if __name__ == '__main__':
py 文件地址: examples/combine_with_goldminer.py py 文件地址: examples/combine_with_goldminer.py
```python ```python
# coding: utf-8
"""
结合掘金的数据使用 chan 进行缠论技术分析
author: zengbin93
email: zeng_bin8888@163.com
date: 2020-02-02
========================================================================================================================
"""
from gm.api import * from gm.api import *
from datetime import datetime from datetime import datetime
...@@ -243,13 +249,9 @@ def use_solid_analyze(): ...@@ -243,13 +249,9 @@ def use_solid_analyze():
sa = SolidAnalyze(klines) sa = SolidAnalyze(klines)
# 查看指定级别的三买 # 查看指定级别的三买
tb = sa.is_third_buy('1800s') tb, _ = sa.is_third_buy('1800s')
print("指定级别三买:", tb, "\n") print("指定级别三买:", tb, "\n")
# 查看多个级别的三买
tb = sa.check_third_buy(['60s', '300s', '1800s'])
print("多级别三买:", tb, "\n")
if __name__ == '__main__': if __name__ == '__main__':
use_kline_analyze() use_kline_analyze()
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
from .analyze import KlineAnalyze, SolidAnalyze from .analyze import KlineAnalyze, SolidAnalyze
__version__ = "0.2.0" __version__ = "0.2.1"
__author__ = "zengbin93" __author__ = "zengbin93"
__email__ = "zeng_bin8888@163.com" __email__ = "zeng_bin8888@163.com"
......
...@@ -196,7 +196,8 @@ class KlineAnalyze(object): ...@@ -196,7 +196,8 @@ class KlineAnalyze(object):
"""识别笔标记:从已经识别出来的分型中确定能够构建笔的分型 """识别笔标记:从已经识别出来的分型中确定能够构建笔的分型
划分笔的步骤: 划分笔的步骤:
(1)确定所有符合标准的分型,能够构成笔的标准底分型一定小于其前后的底分型,顶分型反之。 (1)确定所有符合标准的分型,能够构成笔的标准底分型一定小于其前后的底分型,顶分型反之;
两个相邻的顶底分型之间,如果没有共用K线,也可以认为是符合标准的分型。
(2)如果前后两分型是同一性质的,对于顶,前面的低于后面的,只保留后面的,前面那个可以忽略掉;对于底, (2)如果前后两分型是同一性质的,对于顶,前面的低于后面的,只保留后面的,前面那个可以忽略掉;对于底,
前面的高于后面的,只保留后面的,前面那个可以忽略掉。不满足上面情况的,例如相等的,都可以先保留。 前面的高于后面的,只保留后面的,前面那个可以忽略掉。不满足上面情况的,例如相等的,都可以先保留。
(3)经过步骤(2)的处理后,余下的分型,如果相邻的是顶和底,那么这就可以划为一笔。 (3)经过步骤(2)的处理后,余下的分型,如果相邻的是顶和底,那么这就可以划为一笔。
...@@ -460,6 +461,7 @@ class SolidAnalyze: ...@@ -460,6 +461,7 @@ class SolidAnalyze:
这只是一个样例,展示如何结合多个K线级别进行买卖点分析。 这只是一个样例,展示如何结合多个K线级别进行买卖点分析。
你可以根据自己对缠论的理解,利用 KlineAnalyze 的分析结果在多个级别之间进行联合分析,找出符合自己要求的买卖点。 你可以根据自己对缠论的理解,利用 KlineAnalyze 的分析结果在多个级别之间进行联合分析,找出符合自己要求的买卖点。
""" """
def __init__(self, klines): def __init__(self, klines):
""" """
...@@ -492,6 +494,144 @@ class SolidAnalyze: ...@@ -492,6 +494,144 @@ class SolidAnalyze:
raise ValueError raise ValueError
return ka, ka1, ka2 return ka, ka1, ka2
def is_xd_end(self, freq):
"""判断最后一个线段是否可以认为已经结束了(只能判断由小级别一买引发的线段结束)"""
ka, ka1, ka2 = self._get_ka(freq)
last_xd = ka.xd[-1]
end = False
# 向上线段结束的判断
if last_xd['fx_mark'] == 'd' and ka.bi[-1]['fx_mark'] == 'g' and ka.bi[-1]['bi'] >= ka.bi[-3]['bi']:
zs1 = [ka.bi[-2]['dt'], ka.bi[-1]['dt']]
zs2 = [ka.bi[-4]['dt'], ka.bi[-3]['dt']]
if is_bei_chi(ka, zs1, zs2, direction="up", mode="bi"):
end = True
if isinstance(ka1, KlineAnalyze) and ka1.bi[-1]['fx_mark'] == 'd':
end = False
if isinstance(ka2, KlineAnalyze) and ka2.xd[-1]['fx_mark'] == 'd':
end = False
# 向下线段结束的判断
elif last_xd['fx_mark'] == 'g' and ka.bi[-1]['fx_mark'] == 'd' and ka.bi[-1]['bi'] <= ka.bi[-3]['bi']:
zs1 = [ka.bi[-2]['dt'], ka.bi[-1]['dt']]
zs2 = [ka.bi[-4]['dt'], ka.bi[-3]['dt']]
if is_bei_chi(ka, zs1, zs2, direction="down", mode="bi"):
end = True
if isinstance(ka1, KlineAnalyze) and ka1.bi[-1]['fx_mark'] == 'g':
end = False
if isinstance(ka2, KlineAnalyze) and ka2.xd[-1]['fx_mark'] == 'g':
end = False
else:
raise ValueError
return end
def is_first_buy(self, freq):
"""确定某一级别一买,包括由盘整背驰引发的类一买
注意:如果本级别上一级别的 ka 不存在,默认返回 False !!!
:param freq:
:return:
"""
ka, ka1, ka2 = self._get_ka(freq)
if not isinstance(ka, KlineAnalyze) or len(ka.xd) < 6:
return False
b = False
if isinstance(ka1, KlineAnalyze) and ka1.xd[-1]['fx_mark'] == 'g':
# 以上一级别线段终点为走势分解的起点
xds = [x for x in ka.xd if x['dt'] <= ka1.xd[-1]['dt']]
# 盘整至少有三段次级别走势,趋势至少有5段;底背驰一定要创新低
if xds[-1]['fx_mark'] == 'd' and len(xds) >= 4 and xds[-1]['xd'] < xds[-3]['xd']:
zs1 = [xds[-2]['dt'], xds[-1]['dt']]
zs2 = [xds[-4]['dt'], xds[-3]['dt']]
if is_bei_chi(ka, zs1, zs2, direction='down', mode='xd'):
b = True
if isinstance(ka2, KlineAnalyze) and ka2.xd[-1]['fx_mark'] == 'g':
b = False
return b
def is_first_sell(self, freq):
"""确定某一级别一卖,包括由盘整背驰引发的类一卖
注意:如果本级别上一级别的 ka 不存在,默认返回 False !!!
:param freq:
:return:
"""
ka, ka1, ka2 = self._get_ka(freq)
if not isinstance(ka, KlineAnalyze) or len(ka.xd) < 6:
return False
b = False
if isinstance(ka1, KlineAnalyze) and ka1.xd[-1]['fx_mark'] == 'd':
# 以上一级别线段终点为走势分解的起点
xds = [x for x in ka.xd if x['dt'] <= ka1.xd[-1]['dt']]
# 盘整至少有三段次级别走势,趋势至少有5段;顶背驰一定要创新高
if xds[-1]['fx_mark'] == 'g' and len(xds) >= 4 and xds[-1]['xd'] > xds[-3]['xd']:
zs1 = [xds[-2]['dt'], xds[-1]['dt']]
zs2 = [xds[-4]['dt'], xds[-3]['dt']]
if is_bei_chi(ka, zs1, zs2, direction='up', mode='xd'):
b = True
if isinstance(ka2, KlineAnalyze) and ka2.xd[-1]['fx_mark'] == 'd':
b = False
return b
def is_second_buy(self, freq):
"""确定某一级别二买,包括类二买
注意:如果本级别上一级别的 ka 不存在,默认返回 False !!!
:param freq:
:return:
"""
ka, ka1, ka2 = self._get_ka(freq)
if not isinstance(ka, KlineAnalyze) or len(ka.xd) < 6:
return False
b = False
if isinstance(ka1, KlineAnalyze) and ka1.xd[-1]['fx_mark'] == 'd':
# 以上一级别线段终点为走势分解的起点
xds = [x for x in ka.xd if x['dt'] <= ka1.xd[-1]['dt']]
# 次级别向下走势不创新低,就认为是类二买,其中第一个是真正的二买;
# 如果一个向上走势内部已经有5段次级别走势,则认为该走势随后不再有二买机会
if xds[-1]['fx_mark'] == 'd' and len(xds) <= 5 and xds[-1]['xd'] > xds[-3]['xd']:
b = True
if isinstance(ka2, KlineAnalyze) and ka2.xd[-1]['fx_mark'] == 'g':
b = False
return b
def is_second_sell(self, freq):
"""确定某一级别二卖,包括类二卖
注意:如果本级别上一级别的 ka 不存在,默认返回 False !!!
:param freq:
:return:
"""
ka, ka1, ka2 = self._get_ka(freq)
if not isinstance(ka, KlineAnalyze) or len(ka.xd) < 6:
return False
b = False
if isinstance(ka1, KlineAnalyze) and ka1.xd[-1]['fx_mark'] == 'g':
# 以上一级别线段终点为走势分解的起点
xds = [x for x in ka.xd if x['dt'] <= ka1.xd[-1]['dt']]
# 次级别向上走势不创新高,就认为是类二卖,其中第一个是真正的二卖;
# 如果一个向下走势内部已经有5段次级别走势,则认为该走势随后不再有二卖机会
if xds[-1]['fx_mark'] == 'g' and len(xds) <= 5 and xds[-1]['xd'] < xds[-3]['xd']:
b = True
if isinstance(ka2, KlineAnalyze) and ka2.xd[-1]['fx_mark'] == 'd':
b = False
return b
# 一个第三类买卖点,至少需要有5段次级别的走势,前三段构成中枢,第四段离开中枢,第5段构成第三类买卖点。 # 一个第三类买卖点,至少需要有5段次级别的走势,前三段构成中枢,第四段离开中枢,第5段构成第三类买卖点。
def is_third_buy(self, freq): def is_third_buy(self, freq):
...@@ -518,7 +658,7 @@ class SolidAnalyze: ...@@ -518,7 +658,7 @@ class SolidAnalyze:
b = False b = False
detail = { detail = {
"操作提示": freq+"三买", "操作提示": freq + "三买",
"出现时间": "", "出现时间": "",
"确认时间": "", "确认时间": "",
"其他信息": f"向上中枢数量为{up_zs_number(ka)}" "其他信息": f"向上中枢数量为{up_zs_number(ka)}"
......
...@@ -74,13 +74,9 @@ def use_solid_analyze(): ...@@ -74,13 +74,9 @@ def use_solid_analyze():
sa = SolidAnalyze(klines) sa = SolidAnalyze(klines)
# 查看指定级别的三买 # 查看指定级别的三买
tb = sa.is_third_buy('1800s') tb, _ = sa.is_third_buy('1800s')
print("指定级别三买:", tb, "\n") print("指定级别三买:", tb, "\n")
# 查看多个级别的三买
tb = sa.check_third_buy(['60s', '300s', '1800s'])
print("多级别三买:", tb, "\n")
if __name__ == '__main__': if __name__ == '__main__':
use_kline_analyze() use_kline_analyze()
......
...@@ -98,10 +98,6 @@ def use_kline_analyze(): ...@@ -98,10 +98,6 @@ def use_kline_analyze():
ka = KlineAnalyze(kline) ka = KlineAnalyze(kline)
print("线段:", ka.xd, "\n") print("线段:", ka.xd, "\n")
print("中枢:", ka.zs, "\n") print("中枢:", ka.zs, "\n")
print("三买:", ka.is_third_buy(), "\n")
print("线买:", ka.is_xd_buy(), "\n")
print("三卖:", ka.is_third_sell(), "\n")
print("线卖:", ka.is_xd_sell(), "\n")
def use_solid_analyze(): def use_solid_analyze():
...@@ -111,13 +107,9 @@ def use_solid_analyze(): ...@@ -111,13 +107,9 @@ def use_solid_analyze():
sa = SolidAnalyze(klines) sa = SolidAnalyze(klines)
# 查看指定级别的三买 # 查看指定级别的三买
tb = sa.is_third_buy('30min') tb, _ = sa.is_third_buy('30min')
print("指定级别三买:", tb, "\n") print("指定级别三买:", tb, "\n")
# 查看多个级别的三买
tb = sa.check_third_buy(['1min', '5min', '30min', "D"])
print("多级别三买:", tb, "\n")
if __name__ == '__main__': if __name__ == '__main__':
use_kline_analyze() use_kline_analyze()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册