Repository: vnpy/vnpy

Issue:
使用自带天勤数据解决方案更新历史数据
## 环境

* 操作系统: Windows 10
* Anaconda版本: 如Anaconda 4.0.0 Python 2.7 32位
* vn.py版本: 如v1.7.2

## Issue类型
三选一：Bug

## 预期程序行为
按wiki教程使用天勤历史数据解决方案，下载了天勤客户端，配置了需下载的品种

## 实际程序行为
![qq 20180321205009](https://user-images.githubusercontent.com/35967505/37710951-369af3d4-2d4a-11e8-9007-9fccfff5d976.png)

运行后，界面一直卡在“开始下载合约分钟线数据”，等待很久程序都不能完成，也未实现数据导入。




Discussion:
天勤最近在升级他们的客户端，可能API过段时间会升级

Resolving patch:
diff --git a/vnpy/data/tq/vntq.py b/vnpy/data/tq/vntq.py
--- a/vnpy/data/tq/vntq.py
+++ b/vnpy/data/tq/vntq.py
@@ -4,6 +4,7 @@
 对接天勤行情的网关接口，可以提供国内期货的报价/K线/Tick序列等数据的实时推送和历史仿真
 使用时需要在本机先启动一个天勤终端进程
 天勤行情终端: http://www.tq18.cn
+天勤接口文档: http://doc.tq18.cn/tq/latest/extension/wsapi/index.html
 """
 
 
@@ -47,10 +48,15 @@ def subscribe_quote(self, ins_list, callback_func=None):
         订阅实时行情.
         指定一个合约列表，订阅其实时报价信息
         每次调用此函数时，都会覆盖前一次的订阅设定，不在订阅列表里的合约，会停止行情推送
-        :param ins_list: ins_list 是一个列表，列出全部需要实时行情的合约代码。
+        :param ins_list: ins_list 是一个列表，列出全部需要实时行情的合约代码。注意：天勤接口从0.8版本开始，合约代码格式变更为 交易所代码.合约代码的格式. 交易所代码如下：
+                         CFFEX: 中金所
+                         SHFE: 上期所
+                         DCE: 大商所
+                         CZCE: 郑商所
+                         INE: 能源交易所(原油)
         :param callback_func (可选): callback_func 是一个回调函数，每当有报价数据变更时会触发。此函数应该接受一个参数 ins_id
         :example:
-            订阅 cu1803,SR709,IF1709 这三个合约的报价:  subscribe_quote(["cu1803", ”SR709", "IF1709"])
+            订阅 SHFE.cu1803,CZCE.SR709,CFFEX.IF1709 这三个合约的报价:  subscribe_quote(["SHFE.cu1803", ”CZCE.SR709", "CFFEX.IF1709"])
         """
         if callback_func:
             self.quote_callback_func = callback_func
@@ -74,8 +80,8 @@ def subscribe_chart(self, ins_id, duration_seconds, data_length=200, callback_fu
         :param data_length: 需要获取的序列长度。每个序列最大支持请求 8964 个数据
         :param callback_func (可选): callback_func 是一个回调函数，每当序列数据变更时会触发。此函数应该接受2个参数 ins_id, duration_seconds
         :example:
-            订阅 cu1803 的1分钟线： subscribe_chart("cu1803", 60)
-            订阅 IF1709 的tick线： subscribe_chart("IF1709", 0)
+            订阅 SHFE.cu1803 的1分钟线： subscribe_chart("SHFE.cu1803", 60)
+            订阅 CFFEX.IF1709 的tick线： subscribe_chart("CFFEX.IF1709", 0)
         """
         chart_id = self._generate_chart_id(ins_id, duration_seconds)
         
@@ -102,7 +108,7 @@ def get_quote(self, ins_id):
         :return: 若指定的数据不存在，返回None，否则返回如下所示的一个dict
         {
             u'datetime': u'2017-07-26 23:04:21.000001',# tick从交易所发出的时间(按北京时区)
-            u'instrument_id': u'SR801', # 合约代码
+            u'instrument_id': u'CZCE.SR801', # 合约代码
             u'last_price': 6122.0, # 最新价
             u'bid_price1': 6121.0, # 买一价
             u'ask_price1': 6122.0, # 卖一价
@@ -216,6 +222,7 @@ def on_receive_msg(self, msg):
             l = pack["data"]
         else:
             print u'on_receive_msg收到的数据中没有data字段，数据内容%s' %str(pack)
+            return
 
         for data in l:
             # 合并更新数据字典


Test patch:
diff --git a/vnpy/data/tq/test.py b/vnpy/data/tq/test.py
--- a/vnpy/data/tq/test.py
+++ b/vnpy/data/tq/test.py
@@ -32,7 +32,7 @@ def onChart(symbol, seconds):
     
 
 if __name__ == "__main__":
-    symbol = 'IF1710'
+    symbol = 'CFFEX.IF1710'
     
     api = TqApi()