缠论再学习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线的合并解决

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 通达信缠论插件是基于VC 2010编写的,下面我将用图文的形式,一步步教你编写k线包含处理。 第一步:创建项目 在VC 2010中,依次选择“文件”-“新建”-“项目”,选择“Win32项目”。填写项目名称,选择保存路径,点击“确定”按钮。 第二步:设置项目属性 在解决方案资源管理器中,右击项目名称,选择“属性”。 在“属性页”中选择“配置属性”-“常规”,将“项目类型”更改为“动态链接库(.dll)”。 在“属性页”中选择“配置属性”-“常规”,将“字符集”更改为“使用多字节字符集”。 点击“应用”按钮,再点击“确定”按钮。 第三步:添加头文件 在解决方案资源管理器中,右击“源文件”文件夹,选择“添加”-“新建项”。 选择“C++文件(.cpp)”,填写文件名称,点击“添加”按钮。 打开新增的文件,在代码编辑器中,添加以下头文件: #include <windows.h> #include <tchar.h> 第四步:编写k线包含处理函数 在代码编辑器中,添加以下函数: BOOL KLineContain(HDC hdc, int x1, int x2, int y1, int y2){ // 在这里编写k线包含处理函数的代码 // ... return TRUE; } 第五步:处理插件入口函数 在代码编辑器中,找到以下函数,并进行修改: BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){ switch(fdwReason){ case DLL_PROCESS_ATTACH: // 在这里进行初始化操作 // ... break; case DLL_PROCESS_DETACH: // 在这里进行清理操作 // ... break; } return TRUE; } 第六步:编译和运行插件 点击“生成”菜单,选择“生成解决方案”。 插件编译完成后,将生成的.dll文件复制到通达信安装目录的“/gpc”文件夹中。 重新打开通达信软件,插件已经加载成功。 以上是使用VC 2010编写通达信缠论插件的步骤,通过这个插件,你可以方便地进行k线包含处理。希望对你有帮助! ### 回答2: 通达信是一款流行的股票分析软件,而编写通达信插件是一项常见的需求。本文将用图文详细说明,在使用VC 2010编写通达信缠论插件中的第二个步骤,即K线包含处理。 首先,打开VC 2010软件,并创建一个新的项目。选择Visual C++空项目,并为其命名。 接下来,右键单击解决方案资源管理器上的项目名称,并选择添加->新建项。在对话框中选择基于文档的项目,并为其命名。 然后,在解决方案资源管理器中,找到新创建的项目文件,右键单击并选择属性。在属性窗口中,选择常规->字符集,将字符集选项设置为“使用多字节字符集”。 现在,创建一个新的类。右键单击项目文件,并选择添加->类。在类向导对话框中,填写类的名称,并选择该类的类型为“派生自”->“文件”。 在类编辑器中,找到OnRcvMsg函数并打开它。在该函数中,添加代码来处理K线包含逻辑,例如: ```c++ void OnRcvMsg(LPCSTR Msg) { // 从通达信软件接收到的消息处理 if (strstr(Msg, "K线包含处理")) { // 执行K线包含处理逻辑 } else { // 其他逻辑 } } ``` 在K线包含处理逻辑的代码块中,你可以添加任何你认为适合的代码。例如,你可以解析接收到的消息,并根据其中的指令执行相应的操作。 完成以上步骤后,保存并构建项目。确保没有任何错误或警告。如果有错误,可以通过检查代码并纠正错误来解决问题。 总结起来,这就是使用VC 2010编写通达信缠论插件(2-K线包含处理)的步骤。通过创建一个新的类,并在OnRcvMsg函数中添加K线包含处理的代码块,可以开始构建自己的插件。这只是一个简单的示例,你可以根据自己的需求进行修改和扩展。 ### 回答3: 编写通达信缠论插件是一项相对复杂的任务,需要有一定的编程基础和对通达信软件的了解。下面将以图文的方式,一步步教您用VC 2010编写通达信缠论插件中的K线包含处理部分。 第一步:打开VC 2010,创建一个新的项目。选择“Win32控制台应用程序”,命名为“ChanPlugin”。 第二步:在“stdafx.h”中添加必要的头文件,如包含“Windows.h”和“t2sdk.h”,以及定义一些常量和变量。 第三步:在“ChanPlugin.cpp”中,添加一个名为“HandleKLine”的函数来处理K线包含。 第四步:在“HandleKLine”函数中,首先获取通达信软件的K线数据。可以使用通达信提供的API函数来获取K线数据,如“T2SGetKLineData”。 第五步:对获取到的K线数据进行处理,判断K线之间的包含关系。可以使用循环来遍历每个K线,通过比较前后两个K线的最高价和最低价来判断是否有包含关系。 第六步:加入处理包含关系的代码,可以使用条件语句来处理不同的情况。例如,如果前一根K线包含后一根K线,可以做出相应的操作。 第七步:根据需要,在插件中显示处理结果。可以将结果输出到通达信软件的窗口或者绘制到图表上。 第八步:编译并运行插件,将其安装到通达信软件中。测试插件的功能是否正常,并根据需要进行调整和修改。 通过以上步骤,您可以一步步用VC 2010编写通达信缠论插件中的K线包含处理部分。当然,这只是一个示例,实际编写插件时还需要考虑更多的因素和细节。希望以上内容对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

永远的麦田

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

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

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

打赏作者

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

抵扣说明:

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

余额充值