Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
zengbin93
czsc
提交
8494f37a
C
czsc
项目概览
zengbin93
/
czsc
通知
23
Star
2
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
4
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
czsc
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
4
Issue
4
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
8494f37a
编写于
2月 27, 2020
作者:
Z
zengbin93
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
新增第一、二买卖点识别
Former-commit-id: b31f874da3df6334c563a278d44a1302ad777608
上级
14122e01
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
158 addition
and
28 deletion
+158
-28
README.md
README.md
+13
-11
chan/__init__.py
chan/__init__.py
+1
-1
chan/analyze.py
chan/analyze.py
+142
-2
examples/combine_with_goldminer.py
examples/combine_with_goldminer.py
+1
-5
examples/combine_with_tushare.py
examples/combine_with_tushare.py
+1
-9
未找到文件。
README.md
浏览文件 @
8494f37a
...
@@ -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
=
"000
300.SH"
,
end_date
=
"20200202"
,
freq
=
'D
'
,
asset
=
"I"
)
kline
=
get_kline
(
ts_code
=
"000
009.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
()
...
...
chan/__init__.py
浏览文件 @
8494f37a
...
@@ -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"
...
...
chan/analyze.py
浏览文件 @
8494f37a
...
@@ -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
)
}
"
...
...
examples/combine_with_goldminer.py
浏览文件 @
8494f37a
...
@@ -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
()
...
...
examples/combine_with_tushare.py
浏览文件 @
8494f37a
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录