getStockList_zhaiquanData.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. # -*- coding:utf-8 -*-
  2. __author__ = 'weijie'
  3. from EmQuantAPI import *
  4. from datetime import timedelta, datetime
  5. # import time as _time
  6. import time
  7. import traceback
  8. from StockPojo import StockPojo
  9. from StockHistPojo import StockHistPojo
  10. from dbOperation_zhaiquan import dbOperation
  11. import pandas as pd
  12. import json
  13. import array
  14. print("开始了")
  15. def mainCallback(quantdata):
  16. """
  17. mainCallback 是主回调函数,可捕捉如下错误
  18. 在start函数第三个参数位传入,该函数只有一个为c.EmQuantData类型的参数quantdata
  19. :param quantdata:c.EmQuantData
  20. :return:
  21. """
  22. print ("mainCallback",str(quantdata))
  23. print("开始了2222")
  24. #登录掉线或者 登陆数达到上线(即登录被踢下线) 这时所有的服务都会停止
  25. if str(quantdata.ErrorCode) == "10001011" or str(quantdata.ErrorCode) == "10001009":
  26. print ("Your account is disconnect. You can force login automatically here if you need.")
  27. #行情登录验证失败(每次连接行情服务器时需要登录验证)或者行情流量验证失败时,会取消所有订阅,用户需根据具体情况处理
  28. elif str(quantdata.ErrorCode) == "10001021" or str(quantdata.ErrorCode) == "10001022":
  29. print ("Your all csq subscribe have stopped.")
  30. #行情服务器断线自动重连连续6次失败(1分钟左右)不过重连尝试还会继续进行直到成功为止,遇到这种情况需要确认两边的网络状况
  31. elif str(quantdata.ErrorCode) == "10002009":
  32. print ("Your all csq subscribe have stopped, reconnect 6 times fail.")
  33. # 行情订阅遇到一些错误(这些错误会导致重连,错误原因通过日志输出,统一转换成EQERR_QUOTE_RECONNECT在这里通知),正自动重连并重新订阅,可以做个监控
  34. elif str(quantdata.ErrorCode) == "10002012":
  35. print ("csq subscribe break on some error, reconnect and request automatically.")
  36. # 资讯服务器断线自动重连连续6次失败(1分钟左右)不过重连尝试还会继续进行直到成功为止,遇到这种情况需要确认两边的网络状况
  37. elif str(quantdata.ErrorCode) == "10002014":
  38. print ("Your all cnq subscribe have stopped, reconnect 6 times fail.")
  39. # 资讯订阅遇到一些错误(这些错误会导致重连,错误原因通过日志输出,统一转换成EQERR_INFO_RECONNECT在这里通知),正自动重连并重新订阅,可以做个监控
  40. elif str(quantdata.ErrorCode) == "10002013":
  41. print ("cnq subscribe break on some error, reconnect and request automatically.")
  42. # 资讯登录验证失败(每次连接资讯服务器时需要登录验证)或者资讯流量验证失败时,会取消所有订阅,用户需根据具体情况处理
  43. elif str(quantdata.ErrorCode) == "10001024" or str(quantdata.ErrorCode) == "10001025":
  44. print("Your all cnq subscribe have stopped.")
  45. else:
  46. pass
  47. def startCallback(message):
  48. print("[EmQuantAPI Python]", message)
  49. return 1
  50. def csqCallback(quantdata):
  51. """
  52. csqCallback 是csq订阅时提供的回调函数模板。该函数只有一个为c.EmQuantData类型的参数quantdata
  53. :param quantdata:c.EmQuantData
  54. :return:
  55. """
  56. print ("csqCallback,", str(quantdata))
  57. def cstCallBack(quantdata):
  58. '''
  59. cstCallBack 是日内跳价服务提供的回调函数模板
  60. '''
  61. for i in range(0, len(quantdata.Codes)):
  62. length = len(quantdata.Dates)
  63. for it in quantdata.Data.keys():
  64. print(it)
  65. for k in range(0, length):
  66. for j in range(0, len(quantdata.Indicators)):
  67. print(quantdata.Data[it][j * length + k], " ",end = "")
  68. print()
  69. def cnqCallback(quantdata):
  70. """
  71. csqCallback 是cnq订阅时提供的回调函数模板。该函数只有一个为c.EmQuantData类型的参数quantdata
  72. :param quantdata:c.EmQuantData
  73. :return:
  74. """
  75. # print ("cnqCallback,", str(quantdata))
  76. print("cnqCallback,")
  77. for code in quantdata.Data:
  78. total = len(quantdata.Data[code])
  79. for k in range(0, len(quantdata.Data[code])):
  80. print(quantdata.Data[code][k])
  81. try:
  82. #调用登录函数(激活后使用,不需要用户名密码)
  83. loginResult = c.start("ForceLogin=1", '', mainCallback)
  84. if(loginResult.ErrorCode != 0):
  85. print("login in fail")
  86. exit()
  87. getDataTime = time.strftime('%Y-%m-%d',time.localtime(time.time()))
  88. #获取A股所有数据 并且入库
  89. data = c.sector("610020", getDataTime) # 001004 全部A股板块
  90. menu_one = "概念板块"
  91. menu_two = "可转债新"
  92. if data.ErrorCode != 0:
  93. print("request sector Error, ", data.ErrorMsg)
  94. else:
  95. print("sector输出结果======分隔线======")
  96. # print(data.Data)
  97. stockPojoList = []
  98. db = dbOperation()
  99. for inx, code in enumerate(data.Data):
  100. if(inx % 2 != 1):
  101. stockPojo = StockPojo()
  102. stockPojo.code = code
  103. else:
  104. stockPojo.name = code
  105. stockPojoList.append(stockPojo)
  106. countNum = db.query_one("select count(1) count from t_stock_base_info where code = '" + stockPojo.code + "'")
  107. if int(countNum['count']) == 0:
  108. # css使用范例
  109. cssData = c.css(stockPojo.code, "LISTDATE", "TradeDate="+getDataTime+", Ispandas=1")
  110. cssData.reset_index(inplace=True)
  111. jsonData = cssData.to_json()
  112. text = json.loads(jsonData)
  113. for i in range(len(text['LISTDATE'])):
  114. if(str(text['LISTDATE'][str(i)]) == "None"):
  115. stockPojo.listDate = "待上市"
  116. else:
  117. stockPojo.listDate = text['LISTDATE'][str(i)].replace("/", "-")
  118. db.insert("insert into t_stock_base_info(code,name,list_date,menu_one,menu_two) values('" + stockPojo.code + "', '" + stockPojo.name + "','" + stockPojo.listDate + "','" + menu_one + "','" + menu_two +"')")
  119. # 创建实时表
  120. restTableName = "data_rt_" + stockPojo.code.replace(".", "_").lower()
  121. restTableSql = "CREATE TABLE `" + restTableName + "` ( `id` int(11) NOT NULL AUTO_INCREMENT, `date` varchar(128) NOT NULL COMMENT '日期', `time` varchar(128) NOT NULL COMMENT '交易时间', `now` decimal(64,6) NOT NULL COMMENT '最新价', `high` decimal(64,6) NOT NULL COMMENT '最高价', `low` decimal(64,6) NOT NULL COMMENT '最低价', `open` decimal(64,6) NOT NULL COMMENT '开盘价', `preclose` decimal(64,6) NOT NULL COMMENT '前收盘价', `roundlot` varchar(128) NOT NULL COMMENT '现手', `change` varchar(128) NOT NULL COMMENT '涨跌', `pctchange` varchar(128) NOT NULL COMMENT '涨跌幅', `volume` varchar(128) NOT NULL COMMENT '成交量', `amount` varchar(128) NOT NULL COMMENT '成交额', `volumeratio` varchar(128) NOT NULL COMMENT '量比', `commissionratio` varchar(128) NOT NULL COMMENT '委比', `commissiondiff` varchar(128) NOT NULL COMMENT '委差', `tradestatus` varchar(128) NOT NULL COMMENT '交易状态', `outvolume` varchar(128) NOT NULL COMMENT '外盘', `involume` varchar(128) NOT NULL COMMENT '内盘', `highlimit` varchar(128) NOT NULL COMMENT '涨停价', `lowlimit` varchar(128) NOT NULL COMMENT '跌停价', `speed` varchar(128) NOT NULL COMMENT '涨速', `averageprice` varchar(128) NOT NULL COMMENT '均价', `buyprice1` varchar(128) NOT NULL COMMENT '买1价', `buyprice2` varchar(128) NOT NULL COMMENT '买2价', `buyprice3` varchar(128) NOT NULL COMMENT '买3价', `buyprice4` varchar(128) NOT NULL COMMENT '买4价', `buyprice5` varchar(128) NOT NULL COMMENT '买5价', `buyvolume1` varchar(128) NOT NULL COMMENT '买1量', `buyvolume2` varchar(128) NOT NULL COMMENT '买2量', `buyvolume3` varchar(128) NOT NULL COMMENT '买3量', `buyvolume4` varchar(128) NOT NULL COMMENT '买4量', `buyvolume5` varchar(128) NOT NULL COMMENT '买5量', `sellprice1` varchar(128) NOT NULL COMMENT '卖1价', `sellprice2` varchar(128) NOT NULL COMMENT '卖2价', `sellprice3` varchar(128) NOT NULL COMMENT '卖3价', `sellprice4` varchar(128) NOT NULL COMMENT '卖4价', `sellprice5` varchar(128) NOT NULL COMMENT '卖5价', `sellvolume1` varchar(128) NOT NULL COMMENT '卖1量', `sellvolume2` varchar(128) NOT NULL COMMENT '卖2量', `sellvolume3` varchar(128) NOT NULL COMMENT '卖3量', `sellvolume4` varchar(128) NOT NULL COMMENT '卖4量', `sellvolume5` varchar(128) NOT NULL COMMENT '卖5量', `closedtime` varchar(128) NOT NULL COMMENT '盘后时间', `closedvolume` varchar(128) NOT NULL COMMENT '盘后成交量', `closedamount` varchar(128) NOT NULL COMMENT '盘后成交额', `addTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `dateOne` bigint(15) DEFAULT '0', `dateFive` bigint(15) DEFAULT '0', `dateFifteen` bigint(15) DEFAULT '0', `dateThirty` bigint(15) DEFAULT '0', `dateSixty` bigint(15) DEFAULT '0', `realTime` bigint(15) DEFAULT '0', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"
  122. db.created_table(restTableSql, restTableName)
  123. # 创建历史表
  124. histTableName = "data_hist_" + stockPojo.code.replace(".", "_").lower()
  125. histTableSql = "CREATE TABLE `" + histTableName + "` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id', `open` decimal(64,6) NOT NULL COMMENT '开盘价', `close` decimal(64,6) NOT NULL COMMENT '收盘价', `high` decimal(64,6) NOT NULL COMMENT '最高价', `low` decimal(64,6) NOT NULL COMMENT '最低价', `preclose` decimal(64,6) NOT NULL COMMENT '前收盘价', `average` varchar(128) NOT NULL COMMENT '均价', `change` varchar(128) NOT NULL COMMENT '涨跌', `pctchange` varchar(128) NOT NULL COMMENT '涨跌幅', `volume` varchar(128) NOT NULL COMMENT '成交量', `highlimit` varchar(128) NOT NULL COMMENT '是否涨停', `amount` varchar(128) NOT NULL COMMENT '成交金额', `turn` varchar(128) NOT NULL COMMENT '换手率', `tradestatus` varchar(128) NOT NULL COMMENT '交易状态', `lowlimit` varchar(128) NOT NULL COMMENT '是否跌停', `amplitude` varchar(128) NOT NULL COMMENT '振幅', `tnum` varchar(128) NOT NULL COMMENT '成交笔数', `tafactor` varchar(128) NOT NULL COMMENT '复权因子(后)', `fronttafactor` varchar(128) NOT NULL COMMENT '前复权因子(定点复权)', `isststock` varchar(128) NOT NULL COMMENT '是否为ST股票', `isxststock` varchar(128) NOT NULL COMMENT '是否为*ST股票', `date_year` bigint(20) DEFAULT '0' COMMENT '年期', `date_month` bigint(20) DEFAULT '0' COMMENT '月期', `date_week` bigint(20) DEFAULT '0' COMMENT '周', `realTime` bigint(20) DEFAULT '0' COMMENT '日', `dates` varchar(128) DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8;"
  126. db.created_table(histTableSql, histTableName)
  127. db.close()
  128. #退出
  129. data = logoutResult = c.stop()
  130. except Exception as ee:
  131. print("error >>>",ee)
  132. traceback.print_exc()
  133. else:
  134. print("demo end")