def match_orders(sec, buysell): """Match orders in cross""" # Get buy and sell lists b = Order.query(Order.security == sec, Order.buysell == 'Buy', Order.active == True, ancestor=sec.key).order(-Order.price, Order.timestamp) s = Order.query(Order.security == sec, Order.buysell == 'Sell', Order.active == True, ancestor=sec.key).order(Order.price, Order.timestamp) b = list(b) s = list(s) # Match orders until market uncrosses bn = 0 sn = 0 while(1): if bn + 1 > len(b): break if sn + 1 > len(s): break if b[bn].price >= s[sn].price: t = Trade() t.timestamp = datetime.utcnow() t.buy_user = b[bn].user t.sell_user = s[sn].user t.security = b[bn].security if buysell == "Buy": t.price = s[sn].price else: t.price = b[bn].price b[bn] = b[bn].key.get() s[sn] = s[sn].key.get() b_ptf = Portfolio.query(Portfolio.user == b[bn].user).get() s_ptf = Portfolio.query(Portfolio.user == s[sn].user).get() if b[bn].volume > s[sn].volume: t.volume = s[sn].volume b[bn].volume += -s[sn].volume s[sn].active = False b_ptf.points += s[sn].volume s_ptf.points += s[sn].volume b[bn].put() s[sn].put() sn += 1 elif b[bn].volume < s[sn].volume: t.volume = b[bn].volume s[sn].volume += -b[bn].volume b[bn].active = False b_ptf.points += b[bn].volume s_ptf.points += b[bn].volume b[bn].put() s[sn].put() bn += 1 elif b[bn].volume == s[sn].volume: t.volume = b[bn].volume b[bn].active = False s[sn].active = False b_ptf.points += b[bn].volume s_ptf.points += b[bn].volume b[bn].put() s[sn].put() bn += 1 sn += 1 b_ptf.put() s_ptf.put() t.put() flash(u'Trade %s successfully completed.' % t.key.id(), 'success') continue break