#!/usr/bin/env pyston3 import argparse import logging import os import os.path import sys import traceback from datetime import timedelta from decimal import Decimal from threading import Thread sys.path.insert(0, os.path.abspath( os.path.join(os.path.dirname(__file__), '..'))) import mango # nopep8 import mango.marketmaking.simplemarketmaker # nopep8 parser = argparse.ArgumentParser(description="Runs a simple market-maker.") mango.Context.add_command_line_parameters(parser) mango.Wallet.add_command_line_parameters(parser) parser.add_argument("--market", type=str, required=True, help="market symbol to buy (e.g. ETH/USDC)") parser.add_argument("--spread-ratio", type=Decimal, required=True, help="fraction of the mid price to be added and subtracted to calculate buy and sell prices") parser.add_argument("--position-size-ratio", type=Decimal, required=True, help="fraction of the token inventory to be bought or sold in each order") parser.add_argument("--existing-order-tolerance", type=Decimal, default=Decimal("0.0001"), help="fraction of the token inventory to be bought or sold in each order") parser.add_argument("--pause-duration", type=int, default=10, help="number of seconds to pause between placing orders and cancelling them") parser.add_argument("--dry-run", action="store_true", default=False, help="runs as read-only and does not perform any transactions") args = parser.parse_args() logging.getLogger().setLevel(args.log_level) logging.warning(mango.WARNING_DISCLAIMER_TEXT) try: context = mango.Context.from_command_line_parameters(args) wallet = mango.Wallet.from_command_line_parameters_or_raise(args) market_symbol = args.market.upper() market = context.market_lookup.find_by_symbol(market_symbol) if market is None: raise Exception(f"Could not find spot market {market_symbol}") order_placer: mango.OrderPlacer if args.dry_run: order_placer = mango.NullOrderPlacer(market_symbol, print) elif isinstance(market, mango.SpotMarket): order_placer = mango.SerumOrderPlacer(context, wallet, market, print) else: raise Exception(f"Could not find order placer for market {market_symbol}") oracle_provider: mango.OracleProvider = mango.create_oracle_provider("serum") oracle = oracle_provider.oracle_for_market(context, market) if oracle is None: raise Exception(f"Could not find oracle for spot market {market_symbol}") pause_duration = timedelta(seconds=args.pause_duration) market_maker = mango.marketmaking.simplemarketmaker.SimpleMarketMaker( context, wallet, market, order_placer, oracle, args.spread_ratio, args.position_size_ratio, args.existing_order_tolerance, pause_duration) print(f"Starting {market_maker} - use to stop.") thread = Thread(target=market_maker.start) thread.start() input() print(f"Stopping {market_maker} on next iteration...") market_maker.stop() except Exception as exception: logging.critical(f"Market maker stopped because of exception: {exception} - {traceback.format_exc()}") except: logging.critical(f"Market maker stopped because of uncatchable error: {traceback.format_exc()}")