import portfolio
+def make_order(market, value, currency, action="acquire",
+ close_if_possible=False, base_currency="BTC", follow=True,
+ compute_value="average"):
+ """
+ Make an order on market
+ "market": The market on which to place the order
+ "value": The value in *base_currency* to acquire,
+ or in *currency* to dispose.
+ use negative for margin trade.
+ "action": "acquire" or "dispose".
+ "acquire" will buy long or sell short,
+ "dispose" will sell long or buy short.
+ "currency": The currency to acquire or dispose
+ "base_currency": The base currency. The value is expressed in that
+ currency (default: BTC)
+ "follow": Whether to follow the order once run (default: True)
+ "close_if_possible": Whether to try to close the position at the end
+ of the trade, i.e. reach exactly 0 at the end
+ (only meaningful in "dispose"). May have
+ unwanted effects if the end value of the
+ currency is not 0.
+ "compute_value": Compute value to place the order
+ """
+ market.report.log_stage("make_order_begin")
+ market.balances.fetch_balances(tag="make_order_begin")
+ if action == "acquire":
+ trade = portfolio.Trade(
+ portfolio.Amount(base_currency, 0),
+ portfolio.Amount(base_currency, value),
+ currency, market)
+ else:
+ amount = portfolio.Amount(currency, value)
+ trade = portfolio.Trade(
+ amount.in_currency(base_currency, market, compute_value=compute_value),
+ portfolio.Amount(base_currency, 0),
+ currency, market)
+ market.trades.all.append(trade)
+ order = trade.prepare_order(
+ close_if_possible=close_if_possible,
+ compute_value=compute_value)
+ market.report.log_orders([order], None, compute_value)
+ market.trades.run_orders()
+ if follow:
+ market.follow_orders()
+ market.balances.fetch_balances(tag="make_order_end")
+ else:
+ market.report.log_stage("make_order_end_not_followed")
+ return order
+ market.report.log_stage("make_order_end")
+
+def get_user_market(config_path, user_id, debug=False):
+ import market
+ pg_config, report_path = main_parse_config(config_path)
+ market_config = list(main_fetch_markets(pg_config, str(user_id)))[0][0]
+ return market.Market.from_config(market_config, debug=debug)
+
def main_parse_args(argv):
parser = argparse.ArgumentParser(
description="Run the trade bot")
parser.add_argument("--debug",
default=False, action='store_const', const=True,
help="Run in debug mode")
+ parser.add_argument("--user",
+ default=None, required=False, help="Only run for that user")
+ parser.add_argument("--action",
+ default=None, required=False,
+ help="Do a different action than trading")
args = parser.parse_args(argv)
return [config["postgresql"], report_path]
-def main_fetch_markets(pg_config):
+def main_fetch_markets(pg_config, user):
connection = psycopg2.connect(**pg_config)
cursor = connection.cursor()
- cursor.execute("SELECT config,user_id FROM market_configs")
+ if user is None:
+ cursor.execute("SELECT config,user_id FROM market_configs")
+ else:
+ cursor.execute("SELECT config,user_id FROM market_configs WHERE user_id = %s", user)
for row in cursor:
yield row
-def main_process_market(user_market, before=False, after=False):
- if before:
- process_sell_all__1_all_sell(user_market)
- if after:
- portfolio.Portfolio.wait_for_recent(user_market)
- process_sell_all__2_all_buy(user_market)
+def main_process_market(user_market, action, before=False, after=False):
+ if action is None:
+ if before:
+ process_sell_all__1_all_sell(user_market)
+ if after:
+ portfolio.Portfolio.wait_for_recent(user_market)
+ process_sell_all__2_all_buy(user_market)
+ elif action == "print_balances":
+ print_balances(user_market)
+ elif action == "print_orders":
+ print_orders(user_market)
+ else:
+ raise NotImplementedError("Unknown action {}".format(action))
def main_store_report(report_path, user_id, user_market):
try:
market.trades.prepare_orders(compute_value="average")
def print_balances(market, base_currency="BTC"):
+ market.report.log_stage("print_balances")
market.balances.fetch_balances()
if base_currency is not None:
market.report.print_log("total:")