i think it is working

This commit is contained in:
2023-01-23 11:28:12 +01:00
parent 3a421ceb34
commit 89dc8ed54a
22 changed files with 540 additions and 28 deletions

View File

@@ -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