diff --git a/examples/vn_trader/run.py b/examples/vn_trader/run.py index a540f399..a841933f 100644 --- a/examples/vn_trader/run.py +++ b/examples/vn_trader/run.py @@ -4,21 +4,21 @@ from vnpy.event import EventEngine from vnpy.trader.engine import MainEngine from vnpy.trader.ui import MainWindow, create_qapp -from vnpy.gateway.binance import BinanceGateway +# from vnpy.gateway.binance import BinanceGateway # from vnpy.gateway.bitmex import BitmexGateway # from vnpy.gateway.futu import FutuGateway # from vnpy.gateway.ib import IbGateway # from vnpy.gateway.ctp import CtpGateway # from vnpy.gateway.ctptest import CtptestGateway -from vnpy.gateway.mini import MiniGateway +# from vnpy.gateway.mini import MiniGateway # from vnpy.gateway.femas import FemasGateway # from vnpy.gateway.tiger import TigerGateway # from vnpy.gateway.oes import OesGateway -# from vnpy.gateway.okex import OkexGateway +from vnpy.gateway.okex import OkexGateway # from vnpy.gateway.huobi import HuobiGateway # from vnpy.gateway.bitfinex import BitfinexGateway # from vnpy.gateway.onetoken import OnetokenGateway -# from vnpy.gateway.okexf import OkexfGateway +from vnpy.gateway.okexf import OkexfGateway # from vnpy.gateway.xtp import XtpGateway # from vnpy.gateway.hbdm import HbdmGateway # from vnpy.gateway.tap import TapGateway @@ -43,21 +43,21 @@ def main(): main_engine = MainEngine(event_engine) - main_engine.add_gateway(BinanceGateway) + # main_engine.add_gateway(BinanceGateway) # main_engine.add_gateway(CtpGateway) # main_engine.add_gateway(CtptestGateway) - main_engine.add_gateway(MiniGateway) + # main_engine.add_gateway(MiniGateway) # main_engine.add_gateway(FemasGateway) # main_engine.add_gateway(IbGateway) # main_engine.add_gateway(FutuGateway) # main_engine.add_gateway(BitmexGateway) # main_engine.add_gateway(TigerGateway) # main_engine.add_gateway(OesGateway) - # main_engine.add_gateway(OkexGateway) + main_engine.add_gateway(OkexGateway) # main_engine.add_gateway(HuobiGateway) # main_engine.add_gateway(BitfinexGateway) # main_engine.add_gateway(OnetokenGateway) - # main_engine.add_gateway(OkexfGateway) + main_engine.add_gateway(OkexfGateway) # main_engine.add_gateway(HbdmGateway) # main_engine.add_gateway(XtpGateway) # main_engine.add_gateway(TapGateway) diff --git a/vnpy/gateway/okexf/okexf_gateway.py b/vnpy/gateway/okexf/okexf_gateway.py index c42248ea..4abd94f6 100644 --- a/vnpy/gateway/okexf/okexf_gateway.py +++ b/vnpy/gateway/okexf/okexf_gateway.py @@ -25,6 +25,7 @@ from vnpy.trader.constant import ( Product, Status, Offset, + Interval ) from vnpy.trader.gateway import BaseGateway from vnpy.trader.object import ( @@ -33,10 +34,12 @@ from vnpy.trader.object import ( TradeData, AccountData, ContractData, + PositionData, + BarData, OrderRequest, CancelRequest, SubscribeRequest, - PositionData, + HistoryRequest ) REST_HOST = "https://www.okex.com" WEBSOCKET_HOST = "wss://real.okex.com:10442/ws/v3" @@ -61,6 +64,19 @@ TYPE_OKEXF2VT = { } TYPE_VT2OKEXF = {v: k for k, v in TYPE_OKEXF2VT.items()} +INTERVAL_VT2OKEXF = { + Interval.MINUTE: "60", + Interval.HOUR: "3600", + Interval.DAILY: "86400", +} + +TIMEDELTA_MAP = { + Interval.MINUTE: timedelta(minutes=1), + Interval.HOUR: timedelta(hours=1), + Interval.DAILY: timedelta(days=1), +} + + instruments = set() currencies = set() @@ -130,6 +146,10 @@ class OkexfGateway(BaseGateway): """""" pass + def query_history(self, req: HistoryRequest): + """""" + return self.rest_api.query_history(req) + def close(self): """""" self.rest_api.stop() @@ -337,6 +357,7 @@ class OkexfRestApi(RestClient): product=Product.FUTURES, size=int(instrument_data["trade_increment"]), pricetick=float(instrument_data["tick_size"]), + history_data=True, gateway_name=self.gateway_name, ) self.gateway.on_contract(contract) @@ -510,6 +531,68 @@ class OkexfRestApi(RestClient): self.exception_detail(exception_type, exception_value, tb, request) ) + def query_history(self, req: HistoryRequest): + """""" + buf = {} + end_time = None + + for i in range(10): + path = f"/api/futures/v3/instruments/{req.symbol}/candles" + + # Create query params + params = {} + if end_time: + params["end"] = end_time + + # Get response from server + resp = self.request( + "GET", + path, + params=params + ) + + # Break if request failed with other status code + if resp.status_code // 100 != 2: + msg = f"获取历史数据失败,状态码:{resp.status_code},信息:{resp.text}" + self.gateway.write_log(msg) + break + else: + data = resp.json() + if not data: + msg = f"获取历史数据为空" + break + + for l in data: + ts, o, h, l, c, v, _ = l + dt = datetime.strptime(ts, "%Y-%m-%dT%H:%M:%S.%fZ") + bar = BarData( + symbol=req.symbol, + exchange=req.exchange, + datetime=dt, + interval=req.interval, + volume=float(v), + open_price=float(o), + high_price=float(h), + low_price=float(l), + close_price=float(c), + gateway_name=self.gateway_name + ) + buf[bar.datetime] = bar + + begin = data[-1][0] + end = data[0][0] + msg = f"获取历史数据成功,{req.symbol} - {req.interval.value},{begin} - {end}" + self.gateway.write_log(msg) + + # Update start time + end_time = begin + + index = list(buf.keys()) + index.sort() + + history = [buf[i] for i in index] + return history + class OkexfWebsocketApi(WebsocketClient): """"""