通达信插件获取并存储通达信商品指数的实时数据

news2024/9/23 11:27:53

一、引子

通达信商品指数一共有23个,如下图所示:

如果想获取历史数据,只需要通过通达信的数据下载和导出功能即可,现在我们需要获取这23个指数的实时数据,通过导出功能就没有办法了。

在最初的阶段,考虑的是合成的逻辑,即找到每一个指数的成份股,计算出对应的加权指数后再进行算术平均来计算对应的指数。这种方法的好处是每一样都可以算出来,缺点是总是有一点点误差,可能是商品指数的加权应该有一种修正逻辑,并且由于每次的计算都有误差,随着时日久远,误差会越来越大,造成完全不可用,后来没有办法,每天下载23个期货指数做为修正基数,勉强也用了一段时间。最近不知为何,忽然发现指数完全对不上,特别是通达信商品指数,乱的不像样,把之前的所有努力都废了。

自己计算看来没有办法了,可能是通达信中修正逻辑改了或是其它什么原因导致算不准了,只能考虑直接使用通达信的板块指数

二、pytdx

这种东西看起来可以获取到通达信的几乎所有数据,获取到

通过如下代码:

from pytdx.exhq import TdxExHq_API
from pytdx.exhq import TDXParams
api = TdxExHq_API()
with api.connect("182.175.240.157", 7727):
    df = api.to_df(api.get_markets())
    print(df)
data = api.to_df(api.get_instrument_bars(TDXParams.KLINE_TYPE_1MIN, 30, "AGL9", 0, 10))
print(data)

可以连接上期货的扩展板块,并且在交易日时也可以获取到除了商品期货指数的所有期货数据(试验了一下,今天是什么数据也获取不到,应该还是该接口对于扩展数据的不稳定支持有关)

看起来商品期货指数想通过简单的api获取是不可能了

三、通达信插件

1、通达信公式的逻辑

这一块的逻辑为针对特定数据,如代码为T开头的且必须是4个字符串的认为是商品期货指数,这样就不用所有数据都保存了,这一层过滤可在公式端进行,满足这些条件的传送对应的除T以外的代码,不满足的传递-1

T1: SUBSTR(CODE,1,1) == 'T',NODRAW;
S_CODE:= SUBSTR(CODE,2,3);
T2: STRLEN(CODE)==4, NODRAW;
S_DATE:= CON2STR(DATE+19000000,0);
S_TIME:= CON2STR(TIME,0);
T3: PERIOD==0, NODRAW;

D_CODE:=IF(T1 AND T2 AND T3, STR2CON(S_CODE), -1);

考虑到我们要存储的是分钟数据,因此至少要先传入日期和分钟,由于根据插件标准,一次最多3个入参且必须是浮点数,所以一个K线数据至少需要4个函数才能实现

MM1:TDXDLL2(1,D_CODE,STR2CON(S_DATE),STR2CON(S_TIME));
MM2:TDXDLL2(2,D_CODE,OPEN,HIGH);
MM3:TDXDLL2(3,D_CODE,LOW,CLOSE);
MM4:TDXDLL2(4,D_CODE,VOL,VOLINSTK);

这样我们在公式端就完成了一个K线的基本数据的传入了,至于为何每次都需要传入D_CODE,是为了2,3,4函数中识别是否为同一个商品指数而做。

2、通达信插件的逻辑

1)插件初始化

考虑到我们需要存储到文件中,每次打开文件写入再关闭文件可能会影响效率,可以在插件刚刚加载时将对应的23个文件全部打开

int init()
{
	table_init();
	char buf[512] = { 0 };

	for (auto it = g_tables.begin(); it != g_tables.end(); it++) {
		bool FileExist = false;
		memset(buf, 0, sizeof(buf));
		sprintf(buf, "C:/TdxFutureBk/%s_%s.csv", it->first.c_str(), it->second.c_str());
		if (!_access(buf, 0))
			FileExist = true;

		FILE *p = fopen(buf, "a");
		if (p != NULL) {
			g_fstreams[it->first] = p;
			if (!FileExist) {
				fflush(p);
			}
		}
	}

	return 0;
}

g_tables是为了后续将数据存入数据库而准备,每一个商品指数对应板块表名,这里可以不考虑

然后在动态库的入口先调用init即可

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		init();
		// 第一次将一个DLL映射到进程地址空间时调用
		// The DLL is being mapped into the process' address space.
		break;

2)void FutureBk1(int DataLen, float *pfOUT, float *pfINa, float *pfINb, float *pfINc)的逻辑

此函数首先需判断DataLen是否大于1,否的话退出

然后再判断pfINa是否大于0,否的话说明不是国内期货指数,也退出

接下来从INa中获取代码,与“T"拼接在一起作为指数代码code,从INb中获取日期,从INc中获取时间,

这些完成后进行全局的数据初始化

	char szTime[32] = { 0 };
	memset(szTime, 0, sizeof(szTime));
	sprintf(szTime, "%04d-%02d-%02d %02d:%02d:%02d", iDate / 10000, (iDate % 10000) / 100, 
		(iDate % 10000) % 100, iTime / 100, iTime % 100, 0);
	memset(buf, 0, sizeof(buf));
	sprintf(buf, "%s,%s,1", bkCode.c_str(), szTime);
	g_datas[code] = buf;

3)void FutureBk2,3(int DataLen, float *pfOUT, float *pfINa, float *pfINb, float *pfINc)

DataLen和pfINa的检查是与Bk1一致的

然后将INb转成open, INc转成high

然后检查code对应的g_datas不存在或是对应的值为空字符串,说明数据不合法,退出

如果通过检查,则将转换成的open,high追加到全局变量g_datas中

	memset(buf, 0, sizeof(buf));
	sprintf(buf, "%s,%s,%s", data.c_str(), open.c_str(), high.c_str());
	g_datas[code] = buf;

FutureBk3与2类似逻辑,只是追加的为low,close

4、void FutureBk4(int DataLen, float *pfOUT, float *pfINa, float *pfINb, float *pfINc)

FutureBk4与3的检查是一样的,通过后追加成交量和持仓量

然后需要通过code为K查找g_fstreams是否存在此code,存在的话调用g_fstreams将文本存入对应的文件中

至此,插件内容就写完了。

四、使用

生成的动态库TdxFutureBk.dll放置于T0002\dlls中然后绑定在2号库,然后开启通达信,将多股同列调成5*5,将调整成1分钟周期放置在那儿(在通达信公式中限定只存储1分钟板块数据),当有实时行情时,就会将所有板块自动存于相应的板块文件中(一个板块约一分钟存入8笔左右)

 

 

五、存储到数据库中

如果需要对数据进行实时处理,更好的办法是存于redis中或是mysql数据库中,这样就可以利用实时板块数据来计算相应的指标了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/176789.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务自动化管理【IDEA使用Docker插件进行一键部署】

本章目标 IDEA使用Docker插件实现springboot项目的一键部署 要开两个虚拟机 server registry server上进行操作 Docker开启远程api端口(注意这种配置方式只适用于开发和学习,在公共网络中不要这样配置,容易引发安全问题) 默认情况下dokcer是不支持远程…

linux基本功系列之find命令实战

文章目录前言🚀🚀🚀一. find命令介绍二. find常用参数及语法格式三. 示范案例3.1 查找符合文件名规则的文件3.2 根据文件类型类查找文件3.3 按照更改时间或访问时间等查找文件3.4 查找并执行相应的命令3.5 按照文件大小来查找3.6 按照文件所有…

启动hive报错no hbase in

启动hive报错no hbase in 将hdfs和yarn都启动成功之后,启动hive,如下所示:[atguiguhadoop102 conf]$ cd /opt/module/hive/ [atguiguhadoop102 hive]$ bin/hive报错信息如下which: no hbase in (/usr/local/bin:/usr/bin:/usr/local/sbin:/us…

C++ · 类和对象 · 02 | 类的6个默认成员函数

啊我摔倒了..有没有人扶我起来学习.... 👱个人主页:《CGod的个人主页》\color{Darkorange}{《CGod的个人主页》}《CGod的个人主页》交个朋友叭~ 💒个人社区:《编程成神技术交流社区》\color{Darkorange}{《编程成神技术交流社区》…

【操作系统】—— 如何安装双系统与多系统(带你快速了解)

📜 “作者 久绊A” 专注记录自己所整理的Java、web、sql等,IT技术干货、学习经验、面试资料、刷题记录,以及遇到的问题和解决方案,记录自己成长的点滴。 🍁 操作系统【带你快速了解】对于电脑来说,如果说…

博客系统项目的自动化测试

作者:~小明学编程 文章专栏:测试开发 格言:热爱编程的,终将被编程所厚爱。 目录 博客界面 测试用例 界面测试 功能测试 性能测试 兼容性测试 易用性测试 安全性测试 ​编辑自动化测试 登录界面的测试 界面文字模块 测…

ubuntu使用教程与常用命令

ubuntu使用教程 一、 Ubuntu简介 Ubuntu(乌班图)是一个基于Debian的以桌面应用为主的Linux操作系统,据说其名称来自非洲南部祖鲁语或科萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传…

Python爬虫之Scrapy框架系列(5)——项目实战【某瓣Top250电影所有信息的txt文本存储】

上篇文章已经成功解析提取到豆瓣Top250电影想要的所有数据。下一步就是将其交给管道进行存储。 目录:1. 编写items.py文件(定义结构化数据字段)2. 爬虫文件里将数据一一对应字段名:3. 将数据返回给管道:4. 编写pipelin…

MCAL系列介绍04-ICU

本文框架1. 前言2. 基本概念3. ICU采集过程3.1 获取周期占空比3.2 获取边沿数量3.3 获取时间戳4. Autosar系列文章快速链接1. 前言 ICU驱动器是使用Input Capture Uint模块(ICU)解调PWM信号、计数脉冲、测量频率和占空比、生成简单中断以及唤醒中断的模…

树莓派配置Python虚拟环境、安装PyQt5、安装PySide2

要从头设置好一台可用于开发的树莓派,可以参考树莓派 4B 无屏幕,连接WiFi、SSH、VNC,系统换源、pip换源,安装中文输入法 Python虚拟环境 树莓派(或者说arm平台)使用Python虚拟环境的正确方式是使用pipenv…

【手写 Vue2.x 源码】第三十九篇 - 组件部分 - 创建组件虚拟节点

一,前言 上篇,介绍了组件部分-组件的合并,主要涉及以下几个点: 组件初始化情况;组件合并的位置;组件合并的策略;组件合并后测试; 本篇,组件部分-组件的编译&#xff1…

【C语言】对<进阶版三子棋>的完善和改进

这篇文章主要是对前面三子棋游戏的完善和改进。 文章目录 目录 1.将棋子*和#,改为1和0; 2.电脑下棋显示坐标 3.可以选择电脑先手或玩家先手 4.在退出游戏时显示游戏信息 5.完善后的游戏效果 二、完整程序代码 1.game.h 2.test.c 3.game.c 总结 前言 h…

【教程】虚拟环境与Pytorch安装

【教程】虚拟环境与Pytorch安装NVIDIA驱动安装虚拟环境创建激活/删除相关库的安装Pytorch安装安装地址可能遇到的问题处理报错安装卡顿测试是否安装完成参考NVIDIA驱动安装 NVIDIA驱动可在官网进行安装:NVIDIA驱动官网 命令行输入nvidia-smi可查看cuda版本等信息&…

Linux常用命令——ss命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) ss 比 netstat 好用的socket统计信息,iproute2 包附带的另一个工具,允许你查询 socket 的有关统计信息。 补充说明 ss命令用来显示处于活动状态的套接字信息。ss命令可以用来获取socket…

XGBoost的原理、工程实现与优缺点

Xgboost简介 XGBoost是陈天奇等人开发的一个开源机器学习项目,高效地实现了GBDT算法并进行了算法和工程上的许多改进,被广泛应用在Kaggle竞赛及其他许多机器学习竞赛中并取得了不错的成绩。XGBoost本质上还是一个GBDT,但是力争把速度和效率发…

C++普通类,派生类,虚基类的成员构造顺序以及构造函数调用顺序详解

目录前言普通类构造析构顺序解析依赖关系产生的错误派生类构造析构顺序解析扩展菱形多继承场景含虚基类的派生类构造析构顺序解析扩展菱形多继承场景(引入虚继承)前言 C规定“对象的析构过程必须与其构造过程相反”这一语法规则。 因此我们研究透彻了构造过程,那么…

宕机了,Redis如何避免数据丢失?

今天是大年初一,祝大家新年快乐,新的一年技术增进,工资翻倍。 目前,Redis的持久化主要有两大机制,即AOF日志和RDB快照,在接下来的两节课里,我们就分别学习一下吧。 AOF日志是如何实现的&#…

结构型模式-装饰器模式

1.概述 快餐店有炒面、炒饭这些快餐,可以额外附加鸡蛋、火腿、培根这些配菜,当然加配菜需要额外加钱,每个配菜的价钱通常不太一样,那么计算总价就会显得比较麻烦。 使用继承的方式存在的问题: 扩展性不好 如果要再加…

Alibaba微服务组件Sentinel学习笔记

1 .Sentinel 是什么 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件,主要以 流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的…

一篇读懂图神经网络

来源:投稿 作者:张宇 编辑:学姐 近年来,作为一项新兴的图数据学习技术,图神经网络(GNN)受到了非常广泛的关注,在各大顶级学术会议上,图神经网络相关的论文也占了相当可观…