|
@@ -4,8 +4,7 @@ from math import log2, ceil
|
|
|
|
|
|
import model
|
|
|
from debug import debug
|
|
|
-
|
|
|
-order_expiry = 43200
|
|
|
+from game import DEFAULT_ORDER_EXPIRY
|
|
|
|
|
|
|
|
|
def place_order(ownable_id):
|
|
@@ -14,24 +13,33 @@ def place_order(ownable_id):
|
|
|
:param ownable_id: on which ownable to place the order
|
|
|
:return: True iff a new order was placed
|
|
|
"""
|
|
|
- cheapest_buy_order, best_sell_order = model.abs_spread(ownable_id)
|
|
|
- if cheapest_buy_order is None or best_sell_order is None:
|
|
|
+ best_buy_order, cheapest_sell_order = model.abs_spread(ownable_id)
|
|
|
+ if best_buy_order is None or cheapest_sell_order is None:
|
|
|
return False
|
|
|
investors_id = model.bank_id()
|
|
|
|
|
|
orders = model.get_ownable_orders(investors_id, ownable_id)
|
|
|
orders = [random.choice(orders) for _ in range(int(ceil(log2(len(orders)))))]
|
|
|
amounts = [order[3] for order in orders]
|
|
|
- amount = sum(amounts) / len(amounts)
|
|
|
-
|
|
|
- expiry = datetime.strptime(model.current_db_time(), '%Y-%m-%d %H:%M:%S') + timedelta(minutes=order_expiry)
|
|
|
-
|
|
|
- model.place_order(buy=bool(random.getrandbits(1)),
|
|
|
- ownership_id=model.get_ownership_id(ownable_id, investors_id),
|
|
|
- limit=random.uniform(cheapest_buy_order, best_sell_order),
|
|
|
- stop_loss=False,
|
|
|
- amount=amount,
|
|
|
- expiry=expiry)
|
|
|
+ amount = ceil(sum(amounts) / len(amounts))
|
|
|
+
|
|
|
+ expiry = datetime.strptime(model.current_db_time(), '%Y-%m-%d %H:%M:%S') + timedelta(minutes=DEFAULT_ORDER_EXPIRY)
|
|
|
+
|
|
|
+ limit = random.uniform(best_buy_order, cheapest_sell_order)
|
|
|
+ if limit - best_buy_order < cheapest_sell_order - limit:
|
|
|
+ model.place_order(buy=True,
|
|
|
+ ownership_id=model.get_ownership_id(ownable_id, investors_id),
|
|
|
+ limit=limit,
|
|
|
+ stop_loss=False,
|
|
|
+ amount=amount,
|
|
|
+ expiry=expiry)
|
|
|
+ else:
|
|
|
+ model.place_order(buy=False,
|
|
|
+ ownership_id=model.get_ownership_id(ownable_id, investors_id),
|
|
|
+ limit=limit,
|
|
|
+ stop_loss=False,
|
|
|
+ amount=amount,
|
|
|
+ expiry=expiry)
|
|
|
return True
|
|
|
|
|
|
|
|
@@ -88,24 +96,28 @@ def notify_order_traded(ownable_id):
|
|
|
raise AssertionError('The bot should have at most one order.')
|
|
|
|
|
|
model.cursor.execute('''
|
|
|
- SELECT rowid, amount, expiry
|
|
|
+ SELECT rowid, ordered_amount, expiry_dt
|
|
|
FROM orders
|
|
|
WHERE ownership_id = ?
|
|
|
- -- no need for ORDER since the bot should have only one order
|
|
|
- -- ORDER BY rowid DESC -- equivalent to ordering by time created
|
|
|
- -- LIMIT might still improve performance
|
|
|
+ -- no need for ORDER since the bot should have only one order
|
|
|
+ UNION ALL
|
|
|
+ SELECT * FROM (
|
|
|
+ SELECT NULL, ordered_amount, expiry_dt
|
|
|
+ FROM order_history
|
|
|
+ ORDER BY rowid DESC -- equivalent to ordering by time created
|
|
|
+ )
|
|
|
LIMIT 1
|
|
|
''', (ownership_id,))
|
|
|
- data = model.cursor.fechtall()
|
|
|
- # TODO Neu überdenken, das geht so nicht, wenn die order schon ausgeführt ist, ist sie nicht mehr in der DB
|
|
|
+ data = model.cursor.fetchall()
|
|
|
if not data:
|
|
|
return place_order(ownable_id)
|
|
|
|
|
|
- my_last_order = model.cursor.fechtone()
|
|
|
+ my_last_order = data[0]
|
|
|
+ last_order_open = my_last_order[0] is None
|
|
|
last_order_id = my_last_order[0]
|
|
|
last_amount = my_last_order[1]
|
|
|
expiry = my_last_order[2]
|
|
|
- dt_order_placed = datetime.strptime(expiry, '%Y-%m-%d %H:%M:%S') - timedelta(minutes=order_expiry)
|
|
|
+ dt_order_placed = datetime.strptime(expiry, '%Y-%m-%d %H:%M:%S') - timedelta(minutes=DEFAULT_ORDER_EXPIRY)
|
|
|
|
|
|
model.cursor.execute('''
|
|
|
SELECT 2 * SUM(amount) >= ?
|
|
@@ -114,8 +126,9 @@ def notify_order_traded(ownable_id):
|
|
|
AND dt >= ?
|
|
|
''', (last_amount, ownable_id, dt_order_placed))
|
|
|
|
|
|
- if model.cursor.fechtone()[0]:
|
|
|
- model.delete_order(last_order_id, 'Canceled')
|
|
|
+ if model.cursor.fetchone()[0]:
|
|
|
+ if last_order_open:
|
|
|
+ model.delete_order(last_order_id, 'Canceled')
|
|
|
return place_order(ownable_id)
|
|
|
|
|
|
return False
|