[Mod]move RQData related function into rqdata.py

This commit is contained in:
vn.py 2019-04-18 10:46:55 +08:00
parent 71995aeb13
commit 1d6d191ac6
2 changed files with 124 additions and 76 deletions

View File

@ -5,7 +5,7 @@ import os
import traceback import traceback
from collections import defaultdict from collections import defaultdict
from pathlib import Path from pathlib import Path
from typing import Any, Callable, List from typing import Any, Callable
from datetime import datetime, timedelta from datetime import datetime, timedelta
from threading import Thread from threading import Thread
from queue import Queue from queue import Queue
@ -37,7 +37,7 @@ from vnpy.trader.constant import (
) )
from vnpy.trader.utility import load_json, save_json, extract_vt_symbol from vnpy.trader.utility import load_json, save_json, extract_vt_symbol
from vnpy.trader.database import database_manager from vnpy.trader.database import database_manager
from vnpy.trader.setting import SETTINGS from vnpy.trader.rqdata import rqdata_client
from .base import ( from .base import (
APP_NAME, APP_NAME,
@ -124,26 +124,9 @@ class CtaEngine(BaseEngine):
""" """
Init RQData client. Init RQData client.
""" """
username = SETTINGS["rqdata.username"] result = rqdata_client.init()
password = SETTINGS["rqdata.password"] if result:
if not username or not password: self.write_log("RQData数据接口初始化成功")
return
import rqdatac
self.rq_client = rqdatac
self.rq_client.init(username, password,
('rqdatad-pro.ricequant.com', 16011))
try:
df = self.rq_client.all_instruments(
type='Future', date=datetime.now())
for ix, row in df.iterrows():
self.rq_symbols.add(row['order_book_id'])
except RuntimeError:
pass
self.write_log("RQData数据接口初始化成功")
def query_bar_from_rq( def query_bar_from_rq(
self, symbol: str, exchange: Exchange, interval: Interval, start: datetime, end: datetime self, symbol: str, exchange: Exchange, interval: Interval, start: datetime, end: datetime
@ -151,36 +134,9 @@ class CtaEngine(BaseEngine):
""" """
Query bar data from RQData. Query bar data from RQData.
""" """
rq_symbol = to_rq_symbol(symbol, exchange) data = rqdata_client.query_bar(
if rq_symbol not in self.rq_symbols: symbol, exchange, interval, start, end
return None
end += timedelta(1) # For querying night trading period data
df = self.rq_client.get_price(
rq_symbol,
frequency=interval.value,
fields=["open", "high", "low", "close", "volume"],
start_date=start,
end_date=end
) )
data: List[BarData] = []
for ix, row in df.iterrows():
bar = BarData(
symbol=symbol,
exchange=exchange,
interval=interval,
datetime=row.name.to_pydatetime(),
open_price=row["open"],
high_price=row["high"],
low_price=row["low"],
close_price=row["close"],
volume=row["volume"],
gateway_name="RQ"
)
data.append(bar)
return data return data
def process_tick_event(self, event: Event): def process_tick_event(self, event: Event):
@ -916,28 +872,3 @@ class CtaEngine(BaseEngine):
self.main_engine.send_email(subject, msg) self.main_engine.send_email(subject, msg)
def to_rq_symbol(symbol: str, exchange: Exchange):
"""
CZCE product of RQData has symbol like "TA1905" while
vt symbol is "TA905.CZCE" so need to add "1" in symbol.
"""
if exchange is not Exchange.CZCE:
return symbol.upper()
for count, word in enumerate(symbol):
if word.isdigit():
break
# noinspection PyUnboundLocalVariable
product = symbol[:count]
year = symbol[count]
month = symbol[count + 1:]
if year == "9":
year = "1" + year
else:
year = "2" + year
rq_symbol = f"{product}{year}{month}".upper()
return rq_symbol

117
vnpy/trader/rqdata.py Normal file
View File

@ -0,0 +1,117 @@
from datetime import datetime, timedelta
from typing import List
from rqdatac import init as rqdata_init
from rqdatac.services.basic import all_instruments as rqdata_all_instruments
from rqdatac.services.get_price import get_price as rqdata_get_price
from .setting import SETTINGS
from .constant import Exchange, Interval
from .object import BarData
class RqdataClient:
"""
Client for querying history data from RQData.
"""
def __init__(self):
""""""
self.username = SETTINGS["rqdata.username"]
self.password = SETTINGS["rqdata.password"]
self.inited = False
self.symbols = set()
def init(self):
""""""
if self.inited:
return True
if not self.username or not self.password:
return False
rqdata_init(self.username, self.password,
('rqdatad-pro.ricequant.com', 16011))
try:
df = rqdata_all_instruments(
type='Future', date=datetime.now())
for ix, row in df.iterrows():
self.symbols.add(row['order_book_id'])
except RuntimeError:
return False
self.inited = True
return True
def to_rq_symbol(self, symbol: str, exchange: Exchange):
"""
CZCE product of RQData has symbol like "TA1905" while
vt symbol is "TA905.CZCE" so need to add "1" in symbol.
"""
if exchange is not Exchange.CZCE:
return symbol.upper()
for count, word in enumerate(symbol):
if word.isdigit():
break
# noinspection PyUnboundLocalVariable
product = symbol[:count]
year = symbol[count]
month = symbol[count + 1:]
if year == "9":
year = "1" + year
else:
year = "2" + year
rq_symbol = f"{product}{year}{month}".upper()
return rq_symbol
def query_bar(
self,
symbol: str,
exchange: Exchange,
interval: Interval,
start: datetime,
end: datetime
):
"""
Query bar data from RQData.
"""
rq_symbol = self.to_rq_symbol(symbol, exchange)
if rq_symbol not in self.symbols:
return None
end += timedelta(1) # For querying night trading period data
df = rqdata_get_price(
rq_symbol,
frequency=interval.value,
fields=["open", "high", "low", "close", "volume"],
start_date=start,
end_date=end
)
data: List[BarData] = []
for ix, row in df.iterrows():
bar = BarData(
symbol=symbol,
exchange=exchange,
interval=interval,
datetime=row.name.to_pydatetime(),
open_price=row["open"],
high_price=row["high"],
low_price=row["low"],
close_price=row["close"],
volume=row["volume"],
gateway_name="RQ"
)
data.append(bar)
return data
rqdata_client = RqdataClient()