修改期货的下单数量,为合约张数

This commit is contained in:
msincenselee 2018-11-10 16:17:15 +08:00
parent 06a271e5ee
commit 252f54b366

View File

@ -500,8 +500,11 @@ class OkexSpotApi(WsSpotApi):
error = VtErrorData() error = VtErrorData()
error.gatewayName = self.gatewayName error.gatewayName = self.gatewayName
error.errorID = 0 error.errorID = 0
if isinstance(evt,bytes):
decom_evt = self.inflate(evt) decom_evt = self.inflate(evt)
error.errorMsg = str(decom_evt) error.errorMsg = str(decom_evt)
else:
error.errorMsg = str(evt)
self.gateway.onError(error) self.gateway.onError(error)
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
@ -1640,9 +1643,11 @@ class OkexFuturesApi(WsFuturesApi):
"""重载WsFutureApi.onError错误Event推送""" """重载WsFutureApi.onError错误Event推送"""
error = VtErrorData() error = VtErrorData()
error.gatewayName = self.gatewayName error.gatewayName = self.gatewayName
#error.errorMsg = str(evt) if isinstance(evt,bytes):
decom_evt = self.inflate(evt) decom_evt = self.inflate(evt)
error.errorMsg = str(decom_evt) error.errorMsg = str(decom_evt)
else:
error.errorMsg = str(evt)
self.gateway.onError(error) self.gateway.onError(error)
# #---------------------------------------------------------------------- # #----------------------------------------------------------------------
@ -2142,7 +2147,6 @@ h_this_week_usd'}
del tick_bids_depth[price1] del tick_bids_depth[price1]
else: else:
tick_bids_depth[price1] = float(vol1) tick_bids_depth[price1] = float(vol1)
volume_rate = 100 if symbol.startswith('btc') else 10
try: try:
# 根据bidPrice价格排序 # 根据bidPrice价格排序
@ -2150,15 +2154,11 @@ h_this_week_usd'}
# 取后五个 # 取后五个
tick.bidPrice1, tick.bidVolume1 = arr[-1] tick.bidPrice1, tick.bidVolume1 = arr[-1]
tick.bidVolume1 = (tick.bidVolume1 / tick.bidPrice1) * volume_rate
tick.bidPrice2, tick.bidVolume2 = arr[-2] tick.bidPrice2, tick.bidVolume2 = arr[-2]
tick.bidVolume2 = (tick.bidVolume2 / tick.bidPrice2) * volume_rate
tick.bidPrice3, tick.bidVolume3 = arr[-3] tick.bidPrice3, tick.bidVolume3 = arr[-3]
tick.bidVolume3 = (tick.bidVolume3 / tick.bidPrice3) * volume_rate
tick.bidPrice4, tick.bidVolume4 = arr[-4] tick.bidPrice4, tick.bidVolume4 = arr[-4]
tick.bidVolume4 = (tick.bidVolume4 / tick.bidPrice4) * volume_rate
tick.bidPrice5, tick.bidVolume5 = arr[-5] tick.bidPrice5, tick.bidVolume5 = arr[-5]
tick.bidVolume5 = (tick.bidVolume5 / tick.bidPrice5) * volume_rate
except Exception as ex: except Exception as ex:
self.writeLog(u'ContractApi.onDepth exception:{},{}'.format(str(ex), traceback.format_exc())) self.writeLog(u'ContractApi.onDepth exception:{},{}'.format(str(ex), traceback.format_exc()))
@ -2173,15 +2173,10 @@ h_this_week_usd'}
arr = sorted(tick_asks_depth.items(), key=lambda x: x[0]) arr = sorted(tick_asks_depth.items(), key=lambda x: x[0])
# 取前五个 # 取前五个
tick.askPrice1, tick.askVolume1 = arr[0] tick.askPrice1, tick.askVolume1 = arr[0]
tick.askVolume1 = (tick.askVolume1 / tick.askPrice1) * volume_rate
tick.askPrice2, tick.askVolume2 = arr[1] tick.askPrice2, tick.askVolume2 = arr[1]
tick.askVolume2 = (tick.askVolume2 / tick.askPrice2) * volume_rate
tick.askPrice3, tick.askVolume3 = arr[2] tick.askPrice3, tick.askVolume3 = arr[2]
tick.askVolume3 = (tick.askVolume3 / tick.askPrice3) * volume_rate
tick.askPrice4, tick.askVolume4 = arr[3] tick.askPrice4, tick.askVolume4 = arr[3]
tick.askVolume4 = (tick.askVolume4 / tick.askPrice4) * volume_rate
tick.askPrice5, tick.askVolume5 = arr[4] tick.askPrice5, tick.askVolume5 = arr[4]
tick.askVolume5 = (tick.askVolume5 / tick.askPrice5) * volume_rate
except Exception as ex: except Exception as ex:
self.writeLog(u'ContractApi.onDepth exception:{},{}'.format(str(ex), traceback.format_exc())) self.writeLog(u'ContractApi.onDepth exception:{},{}'.format(str(ex), traceback.format_exc()))
@ -2477,7 +2472,7 @@ h_this_week_usd'}
# 更新持仓信息 # 更新持仓信息
pos = VtPositionData() pos = VtPositionData()
pos.gatewayName = self.gatewayName + u'_Future' pos.gatewayName = self.gatewayName #+ u'_Future'
pos.symbol = u'{}.{}_Future'.format(symbol, EXCHANGE_OKEX) pos.symbol = u'{}.{}_Future'.format(symbol, EXCHANGE_OKEX)
pos.vtSymbol = u'{}.{}_Future'.format(symbol, EXCHANGE_OKEX) pos.vtSymbol = u'{}.{}_Future'.format(symbol, EXCHANGE_OKEX)
pos.position = account.balance pos.position = account.balance
@ -2499,7 +2494,7 @@ h_this_week_usd'}
#if t_balance > 0 or t_rights > 0: #if t_balance > 0 or t_rights > 0:
account = VtAccountData() account = VtAccountData()
account.gatewayName = self.gatewayName + u'_Future' account.gatewayName = self.gatewayName #+ u'_Future'
account.accountID = u'[逐仓]{}'.format(symbol) account.accountID = u'[逐仓]{}'.format(symbol)
account.vtAccountID = account.accountID account.vtAccountID = account.accountID
account.balance = t_rights account.balance = t_rights
@ -2507,7 +2502,7 @@ h_this_week_usd'}
# 更新持仓信息 # 更新持仓信息
pos = VtPositionData() pos = VtPositionData()
pos.gatewayName = self.gatewayName + u'_Future' pos.gatewayName = self.gatewayName #+ u'_Future'
pos.symbol = u'{}.{}_Future'.format(symbol,EXCHANGE_OKEX) pos.symbol = u'{}.{}_Future'.format(symbol,EXCHANGE_OKEX)
pos.vtSymbol = u'{}.{}_Future'.format(symbol,EXCHANGE_OKEX) pos.vtSymbol = u'{}.{}_Future'.format(symbol,EXCHANGE_OKEX)
pos.position = t_rights pos.position = t_rights
@ -2541,13 +2536,10 @@ h_this_week_usd'}
result = resp.get('result', False) result = resp.get('result', False)
holdings = resp.get('holding', []) holdings = resp.get('holding', [])
# 100美金btc10美金其他/每份合约
volume_rate = 100 if symbol.startswith('btc') else 10
if result and len(holdings) > 0: if result and len(holdings) > 0:
for holding in holdings: for holding in holdings:
pos = VtPositionData() pos = VtPositionData()
pos.gatewayName = self.gatewayName pos.gatewayName = self.gatewayName #+ u'_Future'
contract_symbol = holding.get('symbol', '{}_usd'.format(symbol)) + ':' + contractType + ':' + str( contract_symbol = holding.get('symbol', '{}_usd'.format(symbol)) + ':' + contractType + ':' + str(
holding.get('lever_rate', leverage)) holding.get('lever_rate', leverage))
# 如果此合约不在已订阅清单中,重新订阅 # 如果此合约不在已订阅清单中,重新订阅
@ -2569,9 +2561,11 @@ h_this_week_usd'}
if price == 0.0: if price == 0.0:
continue continue
pos.position = volume_rate * holding.get('buy_amount') / price # 20181110 ,改回用多少份合约
pos.position = holding.get('buy_amount')
if holding.get('buy_available') > 0: if holding.get('buy_available') > 0:
pos.frozen = pos.position - (volume_rate * holding.get('buy_available') / price) pos.frozen = pos.position - holding.get('buy_available',0)
else: else:
pos.frozen = 0 pos.frozen = 0
@ -2585,9 +2579,11 @@ h_this_week_usd'}
price = tick.lastPrice if tick is not None else sell_pos.price price = tick.lastPrice if tick is not None else sell_pos.price
if price == 0: if price == 0:
continue continue
sell_pos.position = volume_rate * holding.get('sell_amount') / price
# 20181110 改回用多少份合约
sell_pos.position =holding.get('sell_amount')
if holding.get('sell_available', 0) > 0: if holding.get('sell_available', 0) > 0:
sell_pos.frozen = sell_pos.position - volume_rate * holding.get('sell_available') / price sell_pos.frozen = sell_pos.position - holding.get('sell_available')
else: else:
sell_pos.frozen = 0 sell_pos.frozen = 0
sell_pos.positionProfit = holding.get('sell_profit_real', 0.0) sell_pos.positionProfit = holding.get('sell_profit_real', 0.0)
@ -2610,13 +2606,10 @@ h_this_week_usd'}
result = resp.get('result', False) result = resp.get('result', False)
holdings = resp.get('holding', []) holdings = resp.get('holding', [])
# 100美金btc10美金其他/每份合约
volume_rate = 100 if symbol.startswith('btc') else 10
if result and len(holdings) > 0: if result and len(holdings) > 0:
for holding in holdings: for holding in holdings:
pos = VtPositionData() pos = VtPositionData()
pos.gatewayName = self.gatewayName pos.gatewayName = self.gatewayName #+ u'_Future'
contract_symbol = holding.get('symbol', '{}_usd'.format(symbol)) + ':' + contractType + ':' + str( contract_symbol = holding.get('symbol', '{}_usd'.format(symbol)) + ':' + contractType + ':' + str(
holding.get('lever_rate', 10)) holding.get('lever_rate', 10))
# 如果此合约不在已订阅清单中,重新订阅 # 如果此合约不在已订阅清单中,重新订阅
@ -2628,7 +2621,7 @@ h_this_week_usd'}
pos.symbol = '.'.join([contract_symbol, EXCHANGE_OKEX]) pos.symbol = '.'.join([contract_symbol, EXCHANGE_OKEX])
pos.vtSymbol = pos.symbol pos.vtSymbol = pos.symbol
tick = self.tickDict.get(contract_symbol, None) tick = self.tickDict.get(contract_symbol, None)
pos.gatewayName = self.gatewayName #+ u'_Future'
if holding.get('buy_amount', 0) > 0: if holding.get('buy_amount', 0) > 0:
# 持有多仓 # 持有多仓
pos.direction = DIRECTION_LONG pos.direction = DIRECTION_LONG
@ -2638,12 +2631,12 @@ h_this_week_usd'}
if price == 0.0: if price == 0.0:
continue continue
pos.position = volume_rate * holding.get('buy_amount') / price pos.position =holding.get('buy_amount')
if holding.get('buy_available') > 0: if holding.get('buy_available') > 0:
pos.frozen = pos.position - (volume_rate * holding.get('buy_available') / price) pos.frozen = pos.position - holding.get('buy_available',0)
else: else:
pos.frozen = 0 pos.frozen = 0
pos.positionProfit = holding.get('buy_profit_real', 0.0) pos.positionProfit = holding.get('profit_real', 0.0)
self.gateway.onPosition(pos) self.gateway.onPosition(pos)
if holding.get('sell_amount', 0) > 0: if holding.get('sell_amount', 0) > 0:
sell_pos = copy(pos) sell_pos = copy(pos)
@ -2653,12 +2646,12 @@ h_this_week_usd'}
price = tick.lastPrice if tick is not None else sell_pos.price price = tick.lastPrice if tick is not None else sell_pos.price
if price == 0: if price == 0:
continue continue
sell_pos.position = volume_rate * holding.get('sell_amount') / price sell_pos.position =holding.get('sell_amount')
if holding.get('sell_available', 0) > 0: if holding.get('sell_available', 0) > 0:
sell_pos.frozen = sell_pos.position - volume_rate * holding.get('sell_available') / price sell_pos.frozen = sell_pos.position - holding.get('sell_available',0)
else: else:
sell_pos.frozen = 0 sell_pos.frozen = 0
sell_pos.positionProfit = holding.get('sell_profit_real', 0.0) sell_pos.positionProfit = holding.get('profit_real', 0.0)
self.gateway.onPosition(sell_pos) self.gateway.onPosition(sell_pos)
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
""" 所有委托查询回报 ws_data """ 所有委托查询回报 ws_data
@ -2736,18 +2729,17 @@ h_this_week_usd'}
order.orderID = self.orderIdDict[orderId] # 更新orderId为本地的序列号 order.orderID = self.orderIdDict[orderId] # 更新orderId为本地的序列号
order.vtOrderID = '.'.join([self.gatewayName, order.orderID]) order.vtOrderID = '.'.join([self.gatewayName, order.orderID])
order.price = order_data['price'] order.price = order_data.get('price')
volume_rate = 100 if order.symbol.startswith('btc') else 10 #volume_rate = 100 if order.symbol.startswith('btc') else 10
order.totalVolume = order_data['amount'] * volume_rate order.totalVolume = order_data.get('amount')
order.direction, offset = priceContractOffsetTypeMap[str(order_data['type'])] order.direction, offset = priceContractOffsetTypeMap.get(str(order_data.get('type')))
order.orderTime = datetime.now().strftime("%H:%M:%S.%f") order.orderTime = datetime.now().strftime("%H:%M:%S.%f")
self.orderDict[orderId] = order self.orderDict[orderId] = order
self.gateway.writeLog(u'新增本地orderDict缓存,okex orderId:{},order.orderid:{}'.format(orderId, order.orderID)) self.gateway.writeLog(u'新增本地orderDict缓存,okex orderId:{},order.orderid:{}'.format(orderId, order.orderID))
else: else:
order = self.orderDict[orderId] order = self.orderDict[orderId]
volume_rate = 100 if order.symbol.startswith('btc') else 10
order.tradedVolume = order_data['deal_amount'] * volume_rate order.tradedVolume = order_data['deal_amount']
order.status = statusMap[int(order_data['status'])] order.status = statusMap[int(order_data['status'])]
# 推送期货委托单到vtGatway.OnOrder中 # 推送期货委托单到vtGatway.OnOrder中
self.gateway.onOrder(copy(order)) self.gateway.onOrder(copy(order))
@ -2838,22 +2830,21 @@ user_id': 6548935, u'contract_id': 201802160040063L, u'price': 24.555, u'create_
order.orderID = localNo order.orderID = localNo
order.vtOrderID = '.'.join([self.gatewayName, order.orderID]) order.vtOrderID = '.'.join([self.gatewayName, order.orderID])
order.price = float(data['price']) order.price = float(data['price'])
volume_rate = 100 if order.symbol.startswith('btc') else 10 order.totalVolume = float(data['amount'])
order.totalVolume = float(data['amount'])* volume_rate
order.direction, order.offset = priceContractOffsetTypeMap[str(data['type'])] order.direction, order.offset = priceContractOffsetTypeMap[str(data['type'])]
order.tradedVolume = float(data['deal_amount']) * volume_rate order.tradedVolume = float(data['deal_amount'])
order.status = statusMap[data['status']] order.status = statusMap[data['status']]
self.orderDict[orderId] = order self.orderDict[orderId] = order
self.gateway.writeLog(u'新增order,orderid:{},symbol:{},data:{}'.format(order.orderID,order.symbol,data)) self.gateway.writeLog(u'新增order,orderid:{},symbol:{},data:{}'.format(order.orderID,order.symbol,data))
else: else:
# 更新成交数量/状态 # 更新成交数量/状态
order = self.orderDict[orderId] order = self.orderDict[orderId]
volume_rate = 100 if order.symbol.startswith('btc') else 10
self.gateway.writeLog(u'orderid:{},tradedVolume:{}=>{},status:{}=>{}' self.gateway.writeLog(u'orderid:{},tradedVolume:{}=>{},status:{}=>{}'
.format(order.orderID, .format(order.orderID,
order.tradedVolume, float(data['deal_amount']*volume_rate), order.tradedVolume, float(data['deal_amount']),
order.status, statusMap[data['status']])) order.status, statusMap[data['status']]))
order.tradedVolume = float(data['deal_amount']) * volume_rate order.tradedVolume = float(data['deal_amount'])
order.status = statusMap[data['status']] order.status = statusMap[data['status']]
# 发出期货委托事件 # 发出期货委托事件
@ -2876,8 +2867,7 @@ user_id': 6548935, u'contract_id': 201802160040063L, u'price': 24.555, u'create_
trade.vtOrderID = '.'.join([self.gatewayName, trade.orderID]) trade.vtOrderID = '.'.join([self.gatewayName, trade.orderID])
trade.price = float(data['price']) trade.price = float(data['price'])
volume_rate = 100 if trade.symbol.startswith('btc') else 10 trade.volume = float(now_volume)
trade.volume = float(now_volume) * volume_rate
trade.direction, trade.offset = priceContractOffsetTypeMap[str(data['type'])] trade.direction, trade.offset = priceContractOffsetTypeMap[str(data['type'])]
@ -3142,7 +3132,7 @@ d', u'balance': 4.96199982}, u'channel': u'ok_sub_futureusd_userinfo'}
# print dic_inf # print dic_inf
pos = VtPositionData() pos = VtPositionData()
pos.gatewayName = self.gatewayName pos.gatewayName = self.gatewayName #+ u'_Future'
if int(inf["position"]) == 1: if int(inf["position"]) == 1:
pos.direction = DIRECTION_LONG pos.direction = DIRECTION_LONG
@ -3166,11 +3156,9 @@ d', u'balance': 4.96199982}, u'channel': u'ok_sub_futureusd_userinfo'}
if price == 0.0: if price == 0.0:
continue continue
volume_rate = 100 if symbol.startswith('btc') else 10 pos.frozen = float(inf.get("hold_amount",0.0)) - float(inf.get('eveningup',0.0))
pos.frozen = volume_rate * float(inf.get("hold_amount",0.0)) - float(inf.get('eveningup',0.0)) / price pos.position = float(inf.get("hold_amount",0.0))
pos.position = volume_rate * float(inf.get("hold_amount",0.0)) / price
pos.positionProfit = float(inf.get("profitreal",0.0)) pos.positionProfit = float(inf.get("profitreal",0.0))
# print inf , pos.symbol # print inf , pos.symbol
self.gateway.onPosition(pos) self.gateway.onPosition(pos)
else: else:
@ -3182,7 +3170,7 @@ d', u'balance': 4.96199982}, u'channel': u'ok_sub_futureusd_userinfo'}
# #
pos = VtPositionData() pos = VtPositionData()
pos.gatewayName = self.gatewayName pos.gatewayName = self.gatewayName #+ u'_Future'
# 持仓合约的方向 # 持仓合约的方向
pos.direction = DIRECTION_LONG if int(inf.get("position",0)) == 1 else DIRECTION_SHORT pos.direction = DIRECTION_LONG if int(inf.get("position",0)) == 1 else DIRECTION_SHORT
@ -3198,9 +3186,9 @@ d', u'balance': 4.96199982}, u'channel': u'ok_sub_futureusd_userinfo'}
if price == 0.0: if price == 0.0:
continue continue
# 计算持仓量/冻结量: 100(或10) * hold_amount/ 价格 # 计算持仓量/冻结量: 100(或10) * hold_amount/ 价格
volume_rate = 100 if symbol.startswith('btc') else 10
pos.frozen = volume_rate * (float(inf.get('hold_amount',0.0)) - float(inf.get('eveningup',0.0)))/price pos.frozen = (float(inf.get('hold_amount',0.0)) - float(inf.get('eveningup',0.0)))
pos.position = volume_rate * float(inf.get('hold_amount',0.0)) / price pos.position = float(inf.get('hold_amount',0.0))
pos.positionProfit = float(inf.get('realized',0.0)) pos.positionProfit = float(inf.get('realized',0.0))
# print inf , pos.symbol # print inf , pos.symbol
@ -3244,13 +3232,22 @@ d', u'balance': 4.96199982}, u'channel': u'ok_sub_futureusd_userinfo'}
order.orderTime = dt.strftime("%H:%M:%S.%f") order.orderTime = dt.strftime("%H:%M:%S.%f")
self.localOrderDict[vtOrderID] = order self.localOrderDict[vtOrderID] = order
self.writeLog(u'futureSendOrder 发送:symbol:{},合约类型:{},交易类型:{},价格:{},委托量:{}'. # 100美金btc10美金其他/每份合约
format(symbol + "_usd", contract_type , type_ , str(req.price), str(req.volume)))
try:
volume_rate = 100 if symbol.startswith('btc') else 10 volume_rate = 100 if symbol.startswith('btc') else 10
orginal_volume = req.volume # 预计冻结的币量
req.volume = 1 if round((req.volume * req.price)/volume_rate) == 0 else round((req.volume * req.price)/volume_rate) frozend_quote = (volume_rate/order.price) * req.volume
self.writeLog(u'转换为ok合约数:{}=>{}'.format(orginal_volume, req.volume)) # 计算杠杆后的币量
order_amount = frozend_quote * int(leverage)
self.writeLog(u'futureSendOrder 发送:symbol:{},合约类型:{},交易类型:{},价格:{},合约委托数:{},预计冻结{}:{},期货总额:{}'.
format(symbol + "_usd", contract_type , type_ , str(req.price), str(req.volume),
frozend_quote,symbol,order_amount,symbol))
try:
#orginal_volume = req.volume
#amount = round((req.volume * req.price)/volume_rate)
#req.volume = 1 if amount== 0 else amount
#self.writeLog(u'转换为ok合约数:{}=>{}'.format(orginal_volume, req.volume))
self.futureTrade(symbol + "_usd", contract_type, type_, str(req.price), str(req.volume), self.futureTrade(symbol + "_usd", contract_type, type_, str(req.price), str(req.volume),
_lever_rate=self._use_leverage) _lever_rate=self._use_leverage)