[Mod] complete send/cancel order function

This commit is contained in:
vn.py 2019-09-25 15:34:13 +08:00
parent 04ad1cb981
commit d741221c41

View File

@ -7,14 +7,15 @@ import hashlib
import hmac
import sys
import time
import re
import uuid
from copy import copy
from datetime import datetime, timedelta
from urllib.parse import urlencode
from typing import Dict, Set
from typing import Dict
from vnpy.api.rest import Request, RestClient
import requests
from vnpy.api.rest import Request, RestClient, RequestStatus
from vnpy.api.websocket import WebsocketClient
from vnpy.trader.constant import (
@ -31,7 +32,6 @@ from vnpy.trader.object import (
OrderData,
TradeData,
BarData,
PositionData,
AccountData,
ContractData,
OrderRequest,
@ -82,6 +82,7 @@ TIMEDELTA_MAP = {
symbol_name_map = {}
name_symbol_map = {}
class BitstampGateway(BaseGateway):
@ -199,7 +200,6 @@ class BitstampRestApi(RestClient):
self.query_contract()
self.query_account()
self.query_order()
def sign(self, request: Request):
"""
@ -244,11 +244,54 @@ class BitstampRestApi(RestClient):
"X-Auth-Version": "v2",
"Content-Type": content_type
}
print(payload_str)
request.data = payload_str
return request
def _process_request(
self, request: Request
):
"""
Sending request to server and get result.
"""
try:
request = self.sign(request)
url = self.make_full_url(request.path)
response = requests.request(
request.method,
url,
headers=request.headers,
params=request.params,
data=request.data,
proxies=self.proxies,
)
request.response = response
status_code = response.status_code
if status_code // 100 == 2: # 2xx codes are all successful
if status_code == 204:
json_body = None
else:
json_body = response.json()
request.callback(json_body, request)
request.status = RequestStatus.success
else:
request.status = RequestStatus.failed
if request.on_failed:
request.on_failed(status_code, request)
else:
self.on_failed(status_code, request)
except Exception:
request.status = RequestStatus.error
t, v, tb = sys.exc_info()
if request.on_error:
request.on_error(t, v, tb, request)
else:
self.on_error(t, v, tb, request)
def query_order(self):
""""""
path = "/open_orders/all/"
@ -266,19 +309,21 @@ class BitstampRestApi(RestClient):
local_orderid = self.order_manager.get_local_orderid(sys_orderid)
direction = DIRECTION_BITSTAMP2VT[d["type"]]
name = d["currency_pair"]
symbol = name_symbol_map[name]
order = OrderData(
orderid=local_orderid,
symbol=d["currency_pair"],
symbol=symbol,
exchange=Exchange.BITSTAMP,
price=float(d["price"]),
volume=float(d["amount"]),
traded=float(0),
direction=direction,
status=Status.NOTTRADED,
time=d["datetime"],
gateway_name=self.gateway_name,
)
self.order_manager.on_order(order)
self.gateway.write_log("委托信息查询成功")
@ -336,9 +381,12 @@ class BitstampRestApi(RestClient):
self.gateway.on_contract(contract)
symbol_name_map[contract.symbol] = contract.name
name_symbol_map[contract.name] = contract.symbol
self.gateway.write_log("合约信息查询成功")
self.query_order()
def cancel_order(self, req: CancelRequest):
""""""
path = "/cancel_order/"
@ -366,7 +414,7 @@ class BitstampRestApi(RestClient):
else:
order.status = Status.CANCELLED
self.gateway.write_log(f"委托撤单成功:{order.orderid}")
self.gateway.write_log(f"撤单成功:{order.orderid}")
self.order_manager.on_order(order)
@ -412,17 +460,23 @@ class BitstampRestApi(RestClient):
def on_send_order(self, data, request):
""""""
print("on_send", data)
order = request.extra
if ["reason"] in data:
status = data.get("status", None)
if status and status == "error":
order.status = Status.REJECTED
self.order_manager.on_order(order)
msg = data["reason"]["__all__"][0]
self.gateway.write_log(msg)
return
sys_orderid = data["id"]
self.order_manager.update_orderid_map(order.orderid, sys_orderid)
order.status = Status.NOTTRADED
self.order_manager.on_order(order)
def on_send_order_error(
self, exception_type: type, exception_value: Exception, tb, request: Request
):
@ -441,7 +495,7 @@ class BitstampRestApi(RestClient):
reason = data["reason"]
code = data["code"]
msg = f"{request.path} 请求失败,状态码:{status_code}信息: {reason} code: {code}"
msg = f"{request.path} 请求失败,状态码:{status_code}错误信息:{reason},错误代码: {code}"
self.gateway.write_log(msg)
def on_error(