缠论再学习1-K线标准化

之前学过几轮缠论,由于总总原因,止步于缠论的线段。最近发现有一点时间了,再来学习一下。

缠论的基础是K线,笔和线段,其中K线这一块需要先进行标准化的工作,即把有包含关系的K线合并成一根新K线,然后拿这根新K线和右边邻近的K线进行比较,判断是否形成新的包含关系,依此类推。

包含关系分两种:左包含,右包含(完全相等的视为左包含)
K线的方向分两种:向上,向下

处理合并时,还需要知道K线的方向,即当前K线与前一根K线相比,是非包含关系,若当前K线高于前一根K线,则视为向上,若当前K线低于前一根K线,则视为向下。若当前K线没有前一根K线(即是第一根K线),则初始化为向下(默认向上也可以)。

1.K线包含关系及方向说明图:

2.K线包含关系推论1

3、K线包含关系推论2

4、K线包含关系的分类

5、K线包含关系处理示范

至此概念学完,后面需要研究怎样实现。

实现逻辑也不是太难,大体逻辑如下:首先判断当前K线与前一根相比是否为独立K线,若是,则进行独立K线处理,否则进行简单包含K线处理,之后设置下一根K线为当前K线,然后进入for循环模式,判断是否存在下一根K线,不存在直接就结束了,存在则再次判断是否为独立K线,是的话进行独立K线处理,否则进入复杂包含K线处理,然后将下一根K线设置为当前K线,直到for循环结束退出程序。流程图如下所示:

独立K线的处理很简单,如下图所示:

简单包含K线的处理和复杂包含K线的处理略为复杂,复杂的原因是需要区分向上K线和向下K线的处理

最后,所有的包含处理都是调用了最基础的包含K线的处理逻辑

至此,K线标准化的主要逻辑就完成了,实现的效果图如下所示:

贴出核心代码:

K线定义:

class KLine:
    """K线类
    """
    def __init__(self, time=0, open=0, high=0, low=0, close=0, volume=0, symbol=""):
        self.time = time    # 时间
        self.open = open    # 开
        self.high = high    # 高
        self.low = low      # 低
        self.close = close  # 收
        self.volume = volume    # 成交量
        self.symbol = symbol    # 合约号

    def __str__(self):
        return "t:{},o:{},h:{},l:{},c:{},v:{}".\
            format(str(datetime.fromtimestamp(self.time)),
                   self.open, self.high, self.low, self.close, self.volume)

    def __repr__(self):
        return self.__str__()

合并K线定义:

class stCombineK:
    """K线合并类
    """
    def __init__(self, data, begin, end, base, isup):
        self.data: KLine = data     # K线数据
        self.pos_begin: int = begin      # 起始
        self.pos_end: int = end          # 结束
        self.pos_extreme: int = base     # 最高或者最低位置,极值点位置
        self.isUp: KSide = KSide(isup)            # 是否向上
        # print(self.isUp)

    def __str__(self):
        up = "up" if self.isUp == KSide.UP else "down"
        return "[{}]:begin:{},end:{},base:{}".format(up, self.pos_begin, self.pos_end, self.pos_extreme)

    def __repr__(self):
        return self.__str__()

独立K线和包含K线的处理逻辑:

    def IndependentK(b_up: KSide):
        """用于处理独立K线的情况,更新标志和指针,并进行值的拷贝"""
        nonlocal pPrev
        nonlocal pLast
        pPrev = pCur
        pLast += 1  # 每处理一根独立K线,pLast增加1
        combs[pLast] = copy.deepcopy(combs[pCur])    # 值的拷贝,而不是指针, 总是拷贝第一个
        combs[pLast].isUp = b_up
        return

    def ContainsK(low, high, index, pos_end):
        """用于处理包含K线的情况,更新K线的数据和位置"""
        nonlocal pPrev
        combs[pLast].data.low = low
        combs[pLast].data.high = high
        combs[pLast].pos_end = pos_end
        combs[pLast].pos_extreme = index

        pPrev = pLast
        return

合并所有K线一开始的初始化部分

    size = len(combs)
    if len(combs) < 2:    # <=2时,返回本身的长度
        return size

    pBegin = 0      # 起始位置
    pLast = pBegin  # 最后一个独立K线的位置
    pPrev = pBegin  # 前一个独立K线的位置
    pCur = pBegin + 1           # 当前K线的位置
    pEnd = pBegin + size - 1    # 最后一个K线位置

前两根K线的处理流程:

 # 初始合并逻辑
    if greater_than_0(combs[pCur].data.high - combs[pPrev].data.high) and \
        greater_than_0(combs[pCur].data.low - combs[pPrev].data.low):
        # 高点升,低点也升, 向上
        IndependentK(KSide.UP)
    elif less_than_0(combs[pCur].data.high - combs[pPrev].data.high) and \
        less_than_0(combs[pCur].data.low - combs[pPrev].data.low):
        # 高点降,低点也降,向下
        IndependentK(KSide.DOWN)
    else:
        if greater_than_0(combs[pCur].data.high - combs[pPrev].data.high) or \
            less_than_0(combs[pCur].data.low - combs[pPrev].data.low):
            # 高点高于前 或是 低点低于前, 右包含,向上合并
            ContainsK(combs[pPrev].data.low, combs[pCur].data.high, combs[pCur].pos_begin, combs[pCur].pos_begin)
        else:   # 左包函,即低点高于前,高点低于前,也向上合并
            ContainsK(combs[pCur].data.low, combs[pPrev].data.high, combs[pPrev].pos_begin, combs[pCur].pos_begin)
    pCur += 1   # 当前pCur向后走一步

两根K线之后循环处理的流程:

 while pCur <= pEnd:
        if greater_than_0(combs[pCur].data.high - combs[pPrev].data.high) and \
                greater_than_0(combs[pCur].data.low - combs[pPrev].data.low):
            IndependentK(KSide.UP)  # 独立K 向上
        elif less_than_0(combs[pCur].data.high - combs[pPrev].data.high) and \
                less_than_0(combs[pCur].data.low - combs[pPrev].data.low):
            IndependentK(KSide.DOWN)    # 独立K 向下
        else:
            # 包含
            if greater_than_0(combs[pCur].data.high - combs[pPrev].data.high) or \
                    less_than_0(combs[pCur].data.low - combs[pPrev].data.low):
                    # 右包含
                if combs[pLast].isUp == KSide.UP:    # 向上,一样高取左极值,不一样高肯定是右高,取右值
                    pos_index = combs[pPrev].pos_extreme if equ_than_0(combs[pCur].data.high - combs[pPrev].data.high) \
                        else combs[pCur].pos_begin
                    ContainsK(combs[pPrev].data.low, combs[pCur].data.high, pos_index, combs[pCur].pos_begin)
                else:         # 向下,一样低取左极值,不一样低肯定是右低,取右值
                    pos_index = combs[pPrev].pos_extreme if equ_than_0(combs[pCur].data.low - combs[pPrev].data.low) \
                        else combs[pCur].pos_begin
                    ContainsK(combs[pCur].data.low, combs[pPrev].data.high, pos_index, combs[pCur].pos_begin)
            else:   # 左包含
                if combs[pLast].isUp == KSide.UP:  # 向上,一样高取左极值,否则高肯定是右高,取右值
                    pos_index = combs[pPrev].pos_begin if combs[pPrev].pos_begin == combs[pPrev].pos_end \
                        else combs[pPrev].pos_extreme
                    ContainsK(combs[pCur].data.low, combs[pPrev].data.high, pos_index, combs[pCur].pos_begin)
                else:       # 向下,一样低取左极值,否则低肯定是右低,取右值
                    pos_index = combs[pPrev].pos_begin if combs[pPrev].pos_begin == combs[pPrev].pos_end \
                        else combs[pPrev].pos_extreme
                    ContainsK(combs[pPrev].data.low, combs[pCur].data.high, pos_index, combs[pCur].pos_begin)
        pCur += 1

至此K线的合并解决

论大师很多,在下才疏学浅,不到之处敬请点拔。另外声明一下,世间没有包赚钱的公式,只有适合的工具。想通过一个什么包赚钱的价格几万的公式来稳赚不赔,那股市就没有输家了。如果有缘份的话,本文最后将推出师最终没有告知大家的力度公式部分。真正得者,为见相非相,即见如来。 通达信版公式,因为定义不了全局变量、数组,以及没有循环语句等功能,相比大智慧在公式编程方面差了不少。但通达信的优势还是有的,在此推出一个通达信非DLL版本的论分笔公式,并在后续的文章中逐步讲解如何通过程序,将论转化公式。如果友仅想得到一公式而已,那就也无所谓细读本文。但凡得道,靠的是觉悟和缘份,在此也就不细说了。初学论的朋友也可以参考一些网站或专门的书籍,对阅读本文会有较大的帮助。 一、分形。 论集道氏、波浪、江恩学派于一体,结合浑沌理论,将K线形态以分形的方式进行规划,并以一套规则定义波浪起始点,以中枢的形式表达三角形调整(旗形、契形、钻石等形态,均是三角形形态的变种),以背驰的理论表述力度的衰竭。理论指导实战,行之有效。 分形分二种,一是顶分型,另一是底分型。分型也可以看成是酒田的三山形态,即中间K线高低点均高于二侧的,为顶分型,均低于二侧的,为底分形。当一根K线高低点均在前一根K线价格之类,或者前一根K线高低点均在本根K线价格之类,称为包含关系。在程序处理上,被前一根K线包含的,因为不可能作为分形的顶、底点,所以我们可以不进行处理。如果是后一种包含关系,则观察前一根K线处于什么分形关态,如果前一根是顶分形,则本根向上取值,作为顶分形处理,反之则向下处理为底分形。 但这里有一个特殊情况,在不成笔的情况下,如果这根K线的前一分形状态为低分形,但本K线高点却已经超出了前一个顶分形的顶点,应将这根K线作为顶分形处理,反之亦然。否则,笔的顶底点将不会处于笔内K线的高低点位置。同理,笔有被非笔打破高低点的情况,采取的也是这种办法,即笔的延伸。段亦如此,段被笔打破的,段仍然延续。所以,在最简单的顶底分形的处理上,也应如此。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远的麦田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值