i think it is working
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
_bal="balance"
|
||||
from lightmatchingengine.lightmatchingengine import LightMatchingEngine,Side,Trade,Order
|
||||
from lightmatchingengine.lightmatchingengine import LightMatchingEngine,Side,Trade,Order,OrderBook
|
||||
class Exchange():
|
||||
"""
|
||||
Basic Commodity exchange.
|
||||
@@ -13,7 +13,7 @@ class Exchange():
|
||||
self.order_account_map={}
|
||||
self.orders={}
|
||||
self.executed_trades=[]
|
||||
self.order_total_price={}
|
||||
self.order_trades_map={}
|
||||
self.market_rate={}
|
||||
self.best_ask={}
|
||||
self.best_bid={}
|
||||
@@ -116,12 +116,48 @@ class Exchange():
|
||||
# no sufficient resources
|
||||
return None
|
||||
# create order and execude any trades
|
||||
order,trades=self.lme.add_order(resource,price,amount,side)
|
||||
|
||||
order,trades=self.lme.add_order(resource,price,amount,side)
|
||||
|
||||
self.orders[order.order_id]=order
|
||||
self.order_account_map[order.order_id]=account_id
|
||||
self._execute_trades(trades)
|
||||
self.calculate_best_price(resource)
|
||||
return order
|
||||
|
||||
def cancel_order(self,order_id):
|
||||
"""
|
||||
Cancel open order.
|
||||
Returns True if order has been canceled.
|
||||
"""
|
||||
if not order_id in self.orders:
|
||||
return False
|
||||
order=self.orders[order_id]
|
||||
if self._is_order_complete(order):
|
||||
return False
|
||||
order=self.lme.cancel_order(order_id,order.instmt)
|
||||
|
||||
if order_id in self.order_trades_map: # has order any kind of trades
|
||||
trades=self.order_trades_map[order_id]
|
||||
# return assets from escrow to account
|
||||
if order.side==Side.BUY:
|
||||
total_payed=0
|
||||
total_submitted=order.price*order.qty
|
||||
for trade in trades:
|
||||
total_payed+=trade.trade_price*trade.trade_qty
|
||||
total_diff=total_submitted-total_payed
|
||||
self._move_to_account(self.order_account_map[order_id],_bal,total_diff)
|
||||
else:
|
||||
qty_traded=0
|
||||
qty_submitted=order.qty
|
||||
for trade in trades:
|
||||
qty_traded+=trade.trade_qty
|
||||
qty_diff=qty_submitted-qty_traded
|
||||
self._move_to_account(self.order_account_map[order_id],order.instmt,qty_diff)
|
||||
return True
|
||||
|
||||
|
||||
|
||||
def _execute_trades(self, trades):
|
||||
for i in trades:
|
||||
self._execute_trade(i)
|
||||
@@ -136,11 +172,13 @@ class Exchange():
|
||||
full_price=trade.trade_price*trade.trade_qty
|
||||
exprected_price=self.orders[trade.order_id].price*trade.trade_qty
|
||||
price_diff=exprected_price-full_price
|
||||
# add to order total
|
||||
if trade.order_id not in self.order_total_price:
|
||||
self.order_total_price[trade.order_id]=0
|
||||
|
||||
self.order_total_price[trade.order_id]+=full_price
|
||||
# save trade to order trade map
|
||||
if trade.order_id not in self.order_trades_map:
|
||||
self.order_trades_map[trade.order_id]=[]
|
||||
|
||||
self.order_trades_map[trade.order_id].append(trade)
|
||||
|
||||
|
||||
# init escrow if needet
|
||||
if trade.instmt not in self.escrow[account_id]:
|
||||
@@ -160,13 +198,24 @@ class Exchange():
|
||||
# move new bal into account
|
||||
self._move_to_account(account_id,_bal,full_price)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
self.executed_trades.append(trade)
|
||||
#update market rate
|
||||
self.market_rate[trade.instmt]=trade.trade_price
|
||||
|
||||
|
||||
def calculate_best_price(self, resource):
|
||||
order_book = self.lme.order_books.setdefault(resource, OrderBook())
|
||||
best_bid = max(order_book.bids.keys()) if len(order_book.bids) > 0 else None
|
||||
best_ask = max(order_book.asks.keys()) if len(order_book.asks) > 0 else None
|
||||
|
||||
|
||||
self.best_ask[resource]=best_ask
|
||||
self.best_bid[resource]=best_bid
|
||||
|
||||
def get_account_resource_amount(self,account_id,resource):
|
||||
"""
|
||||
Returns the amount of selected resource in account
|
||||
"""
|
||||
if account_id in self.account:
|
||||
if resource in self.account[account_id]:
|
||||
return self.account[account_id][resource]
|
||||
return 0
|
||||
Reference in New Issue
Block a user