getCmc.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. # -*- coding:utf-8 -*-
  2. __author__ = 'weijie'
  3. from EmQuantAPI import *
  4. from datetime import timedelta, datetime
  5. import time
  6. import traceback
  7. import json
  8. from StockRestPojo import StockRestPojo
  9. # from dbOperation import dbOperation
  10. from dbOperationStock import dbOperationStock
  11. from threading import Thread
  12. import numpy as np
  13. import db_config
  14. print("开始了")
  15. def mainCallback(quantdata):
  16. print ("mainCallback",str(quantdata))
  17. #登录掉线或者 登陆数达到上线(即登录被踢下线) 这时所有的服务都会停止
  18. if str(quantdata.ErrorCode) == "10001011" or str(quantdata.ErrorCode) == "10001009":
  19. print ("Your account is disconnect. You can force login automatically here if you need.")
  20. #行情登录验证失败(每次连接行情服务器时需要登录验证)或者行情流量验证失败时,会取消所有订阅,用户需根据具体情况处理
  21. elif str(quantdata.ErrorCode) == "10001021" or str(quantdata.ErrorCode) == "10001022":
  22. print ("Your all csq subscribe have stopped.")
  23. #行情服务器断线自动重连连续6次失败(1分钟左右)不过重连尝试还会继续进行直到成功为止,遇到这种情况需要确认两边的网络状况
  24. elif str(quantdata.ErrorCode) == "10002009":
  25. print ("Your all csq subscribe have stopped, reconnect 6 times fail.")
  26. # 行情订阅遇到一些错误(这些错误会导致重连,错误原因通过日志输出,统一转换成EQERR_QUOTE_RECONNECT在这里通知),正自动重连并重新订阅,可以做个监控
  27. elif str(quantdata.ErrorCode) == "10002012":
  28. print ("csq subscribe break on some error, reconnect and request automatically.")
  29. # 资讯服务器断线自动重连连续6次失败(1分钟左右)不过重连尝试还会继续进行直到成功为止,遇到这种情况需要确认两边的网络状况
  30. elif str(quantdata.ErrorCode) == "10002014":
  31. print ("Your all cnq subscribe have stopped, reconnect 6 times fail.")
  32. # 资讯订阅遇到一些错误(这些错误会导致重连,错误原因通过日志输出,统一转换成EQERR_INFO_RECONNECT在这里通知),正自动重连并重新订阅,可以做个监控
  33. elif str(quantdata.ErrorCode) == "10002013":
  34. print ("cnq subscribe break on some error, reconnect and request automatically.")
  35. # 资讯登录验证失败(每次连接资讯服务器时需要登录验证)或者资讯流量验证失败时,会取消所有订阅,用户需根据具体情况处理
  36. elif str(quantdata.ErrorCode) == "10001024" or str(quantdata.ErrorCode) == "10001025":
  37. print("Your all cnq subscribe have stopped.")
  38. else:
  39. pass
  40. def updateStockInfo(code, stockRestPojo):
  41. db = dbOperationStock(db_config.db_stock)
  42. sql = "update stock set `now` = '" + str(stockRestPojo.now) + "', `change` = '" + str(stockRestPojo.change) + "', `pct_change` = '" + str(stockRestPojo.pctchange) + "' where stock_code = '" + str(code) + "'"
  43. db.update(sql)
  44. db.close()
  45. try:
  46. #调用登录函数(激活后使用,不需要用户名密码)
  47. loginResult = c.start("ForceLogin=1", '', mainCallback)
  48. if(loginResult.ErrorCode != 0):
  49. print("login in fail")
  50. exit()
  51. db = dbOperationStock(db_config.db_stock)
  52. stockPojoList = db.query_list("select id, code, name, list_date listDate, seralid from t_stock_base_info where is_rest_add = 0 and id = 1 order by id asc")
  53. for stockPojo in stockPojoList:
  54. # data = c.cmc(stockPojo['code'], "Date,Time,High,Open,Low,Close,Volume,Amount,Change,PctChange", "20201101090000", "20201108150000", "RowIndex=2,Ispandas=0")
  55. data = c.cmc(stockPojo['code'], "Date,Time,High,Open,Low,Close,Volume,Amount,Change,PctChange", (datetime.today() + timedelta(-6)).strftime("%Y-%m-%d"), datetime.today().strftime("%Y-%m-%d"), "RowIndex=2,Ispandas=0")
  56. print("cmc输出结果======分隔线======")
  57. if(not isinstance(data, c.EmQuantData)):
  58. print(data)
  59. else:
  60. if(data.ErrorCode != 0):
  61. print("request cmc Error, ", data.ErrorMsg)
  62. else:
  63. for i in range(0, len(data.Dates)):
  64. stockRestPojo = StockRestPojo()
  65. stockRestPojo.date = str(data.Data[0][i])
  66. stockRestPojo.time = str(data.Data[1][i])
  67. stockRestPojo.high = str(data.Data[2][i])
  68. stockRestPojo.open = str(data.Data[3][i])
  69. stockRestPojo.low = str(data.Data[4][i])
  70. stockRestPojo.now = str(data.Data[5][i])
  71. stockRestPojo.volume = str(data.Data[6][i])
  72. stockRestPojo.amount = str(data.Data[7][i])
  73. stockRestPojo.change = str(data.Data[8][i])
  74. stockRestPojo.pctchange = str(data.Data[9][i])
  75. if i != 0:
  76. stockRestPojo.preclose = str(data.Data[3][i-1])
  77. else :
  78. stockRestPojo.preclose = str(data.Data[3][i])
  79. stockRestPojo.roundlot = ""
  80. stockRestPojo.volumeratio = ""
  81. stockRestPojo.commissionratio = ""
  82. stockRestPojo.commissiondiff = ""
  83. stockRestPojo.tradestatus = ""
  84. stockRestPojo.outvolume = ""
  85. stockRestPojo.involume = ""
  86. stockRestPojo.highlimit = ""
  87. stockRestPojo.lowlimit = ""
  88. stockRestPojo.speed = ""
  89. stockRestPojo.averageprice = ""
  90. stockRestPojo.buyprice1 = ""
  91. stockRestPojo.buyprice2 = ""
  92. stockRestPojo.buyprice3 = ""
  93. stockRestPojo.buyprice4 = ""
  94. stockRestPojo.buyprice5 = ""
  95. stockRestPojo.buyvolume1 = ""
  96. stockRestPojo.buyvolume2 = ""
  97. stockRestPojo.buyvolume3 = ""
  98. stockRestPojo.buyvolume4 = ""
  99. stockRestPojo.buyvolume5 = ""
  100. stockRestPojo.sellprice1 = ""
  101. stockRestPojo.sellprice2 = ""
  102. stockRestPojo.sellprice3 = ""
  103. stockRestPojo.sellprice4 = ""
  104. stockRestPojo.sellprice5 = ""
  105. stockRestPojo.sellvolume1 = ""
  106. stockRestPojo.sellvolume2 = ""
  107. stockRestPojo.sellvolume3 = ""
  108. stockRestPojo.sellvolume4 = ""
  109. stockRestPojo.sellvolume5 = ""
  110. stockRestPojo.closedtime = ""
  111. stockRestPojo.closedvolume = ""
  112. stockRestPojo.closedamount = ""
  113. datTime = time.mktime(time.strptime(str(data.Data[0][i]) + str(data.Data[1][i]), "%Y%m%d%H%M%S"))
  114. stockRestPojo.realTime = str(int(datTime))
  115. min_ = time.localtime(datTime).tm_min # 获取分钟
  116. sec_ = time.localtime(datTime).tm_sec # 获取秒数
  117. # 1分钟数据
  118. if sec_ != 0:
  119. tempDatTime = datTime + 60 - sec_
  120. stockRestPojo.dateOne = str(int(tempDatTime))
  121. else:
  122. stockRestPojo.dateOne = str(int(datTime))
  123. # 5分钟数据
  124. if sec_ != 0 or min_%5 != 0:
  125. tempDatTime = datTime + (5 * 60) - sec_ - (min_%5 * 60)
  126. stockRestPojo.dateFive = str(int(tempDatTime))
  127. else:
  128. stockRestPojo.dateFive = str(int(datTime))
  129. # 15分钟数据
  130. if sec_ != 0 or min_%15 != 0:
  131. tempDatTime = datTime + (15 * 60) - sec_ - (min_%15 * 60)
  132. stockRestPojo.dateFifteen = str(int(tempDatTime))
  133. else:
  134. stockRestPojo.dateFifteen = str(int(datTime))
  135. # 30分钟数据
  136. if sec_ != 0 or min_%30 != 0:
  137. tempDatTime = datTime + (30 * 60) - sec_ - (min_%30 * 60)
  138. stockRestPojo.dateThirty = str(int(tempDatTime))
  139. else:
  140. stockRestPojo.dateThirty = str(int(datTime))
  141. # 60分钟数据
  142. if sec_ != 0 or min_%60 != 0:
  143. tempDatTime = datTime + (60 * 60) - sec_ - (min_%60 * 60)
  144. stockRestPojo.dateSixty = str(int(tempDatTime))
  145. else:
  146. stockRestPojo.dateSixty = str(int(datTime))
  147. sql = "insert into data_rt_" + str(stockPojo['code'].replace(".", "_").lower()) + "(`realTime`,`date`,`time`,`now`,`high`,`low`,`open`,`preclose`,`roundlot`,`change`,`pctchange`,`volume`,`amount`,`volumeratio`,`commissionratio`,`commissiondiff`,`tradestatus`,`outvolume`,`involume`,`highlimit`,`lowlimit`,`speed`,`averageprice`,`buyprice1`,`buyprice2`,`buyprice3`,`buyprice4`,`buyprice5`,`buyvolume1`,`buyvolume2`,`buyvolume3`,`buyvolume4`,`buyvolume5`,`sellprice1`,`sellprice2`,`sellprice3`,`sellprice4`,`sellprice5`,`sellvolume1`,`sellvolume2`,`sellvolume3`,`sellvolume4`,`sellvolume5`,`closedtime`,`closedvolume`,`closedamount`,`dateOne`,`dateFive`,`dateFifteen`,`dateThirty`,`dateSixty`,`addTime`) values('" + str(stockRestPojo.realTime) + "','" + str(stockRestPojo.date) + "','" + str(stockRestPojo.time) + "','" + str(stockRestPojo.now) + "','" + str(stockRestPojo.high) + "','" + str(stockRestPojo.low) + "','" + str(stockRestPojo.open) + "','" + str(stockRestPojo.preclose) + "','" + str(stockRestPojo.roundlot) + "','" + str(stockRestPojo.change) + "','" + str(stockRestPojo.pctchange) + "','" + str(stockRestPojo.volume) + "','" + str(stockRestPojo.amount) + "','" + str(stockRestPojo.volumeratio) + "','" + str(stockRestPojo.commissionratio) + "','" + str(stockRestPojo.commissiondiff) + "','" + str(stockRestPojo.tradestatus) + "','" + str(stockRestPojo.outvolume) + "','" + str(stockRestPojo.involume) + "','" + str(stockRestPojo.highlimit) + "','" + str(stockRestPojo.lowlimit) + "','" + str(stockRestPojo.speed) + "','" + str(stockRestPojo.averageprice) + "','" + str(stockRestPojo.buyprice1) + "','" + str(stockRestPojo.buyprice2) + "','" + str(stockRestPojo.buyprice3) + "','" + str(stockRestPojo.buyprice4) + "','" + str(stockRestPojo.buyprice5) + "','" + str(stockRestPojo.buyvolume1) + "','" + str(stockRestPojo.buyvolume2) + "','" + str(stockRestPojo.buyvolume3) + "','" + str(stockRestPojo.buyvolume4) + "','" + str(stockRestPojo.buyvolume5) + "','" + str(stockRestPojo.sellprice1) + "','" + str(stockRestPojo.sellprice2) + "','" + str(stockRestPojo.sellprice3) + "','" + str(stockRestPojo.sellprice4) + "','" + str(stockRestPojo.sellprice5) + "','" + str(stockRestPojo.sellvolume1) + "','" + str(stockRestPojo.sellvolume2) + "','" + str(stockRestPojo.sellvolume3) + "','" + str(stockRestPojo.sellvolume4) + "','" + str(stockRestPojo.sellvolume5) + "','" + str(stockRestPojo.closedtime) + "','" + str(stockRestPojo.closedvolume) + "','" + str(stockRestPojo.closedamount) + "','" + str(stockRestPojo.dateOne) + "','" + str(stockRestPojo.dateFive) + "','" + str(stockRestPojo.dateFifteen) + "','" + str(stockRestPojo.dateThirty) + "','" + str(stockRestPojo.dateSixty) +"', now());"
  148. db.insert(sql)
  149. if stockRestPojo.now != 0:
  150. updateStockInfo(stockPojo['code'], stockRestPojo)
  151. #退出
  152. data = logoutResult = c.stop()
  153. except Exception as ee:
  154. print("error >>>",ee)
  155. traceback.print_exc()
  156. else:
  157. print("demo end")