예제 #1
0
class ArbitrerCLI:
    def __init__(self):
        self.inject_verbose_info()

    def inject_verbose_info(self):
        logging.VERBOSE = 15
        logging.verbose = lambda x: logging.log(logging.VERBOSE, x)
        logging.addLevelName(logging.VERBOSE, "VERBOSE")

    def exec_command(self, args):
        if "watch" in args.command:
            self.create_arbitrer(args)
            self.arbitrer.loop()
        if "replay-history" in args.command:
            self.create_arbitrer(args)
            self.arbitrer.replay_history(args.replay_history)
        if "get-balance" in args.command:
            self.get_balance(args)
        if "list-public-markets" in args.command:
            self.list_markets()

    def list_markets(self):
        markets = []
        for filename in glob.glob(os.path.join(public_markets.__path__[0], "*.py")):
            module_name = os.path.basename(filename).replace(".py", "")
            if not module_name.startswith("_"):
                module = __import__("arbitrage.public_markets." + module_name)
                test = eval("module.public_markets." + module_name)
                for name, obj in inspect.getmembers(test):
                    if inspect.isclass(obj) and "Market" in (j.__name__ for j in obj.mro()[1:]):
                        if not obj.__module__.split(".")[-1].startswith("_"):
                            markets.append(obj.__name__)
        markets.sort()
        print("\n".join(markets))
        sys.exit(0)

    def get_balance(self, args):
        if not args.markets:
            logging.error("You must use --markets argument to specify markets")
            sys.exit(2)
        pmarkets = args.markets.split(",")
        pmarketsi = []
        for pmarket in pmarkets:
            exec("import arbitrage.private_markets." + pmarket.lower())
            market = eval(
                "arbitrage.private_markets." + pmarket.lower() + ".Private" + pmarket + "()"
            )
            pmarketsi.append(market)
        for market in pmarketsi:
            print(market)

    def create_arbitrer(self, args):
        self.arbitrer = Arbitrer()
        if args.observers:
            self.arbitrer.init_observers(args.observers.split(","))
        if args.markets:
            self.arbitrer.init_markets(args.markets.split(","))

    def init_logger(self, args):
        level = logging.INFO
        if args.verbose:
            level = logging.VERBOSE
        if args.debug:
            level = logging.DEBUG
        logging.basicConfig(format="%(asctime)s [%(levelname)s] %(message)s", level=level)

    def main(self):
        parser = argparse.ArgumentParser()
        parser.add_argument("-d", "--debug", help="debug verbose mode", action="store_true")
        parser.add_argument("-v", "--verbose", help="info verbose mode", action="store_true")
        parser.add_argument(
            "-o", "--observers", type=str, help="observers, example: -oLogger,Emailer"
        )
        parser.add_argument(
            "-m", "--markets", type=str, help="markets, example: -m BitstampEUR,KrakenEUR"
        )
        parser.add_argument(
            "command",
            nargs="*",
            default="watch",
            help='verb: "watch|replay-history|get-balance|list-public-markets"',
        )
        args = parser.parse_args()
        self.init_logger(args)
        self.exec_command(args)
예제 #2
0
class ArbitrerCLI:
    def __init__(self):
        self.inject_verbose_info()

    def inject_verbose_info(self):
        logging.VERBOSE = 15
        logging.verbose = lambda x: logging.log(logging.VERBOSE, x)
        logging.addLevelName(logging.VERBOSE, "VERBOSE")

    def exec_command(self, args):
        if "watch" in args.command:
            self.create_arbitrer(args).loop()
        if "replay-history" in args.command:
            self.create_arbitrer(args)
            self.arbitrer.replay_history(args.replay_history)
        if "get-balance" in args.command:
            self.get_balance(args)
        if "list-public-markets" in args.command:
            self.list_markets()
        if "compare-depths" in args.command:
            self.compare_depths(args)
        if "generate-config" in args.command:
            self.generate_sample_config()

    def compare_depths(self, args):
        if not args.exchanges:
            logging.error(
                "You must use --exchanges argument to specify exchanges")
            sys.exit(2)
        pexchanges = args.exchanges.split(",")
        pexchangei = []
        for pexchange in pexchanges:
            exec("import arbitrage.public_markets._" + pexchange.lower())

            # FIXME: Fix the following hard-coded USDT and btc_usdt
            market = eval("arbitrage.public_markets._" + pexchange.lower() +
                          "." + pexchange +
                          "('USDT','btc_usdt').update_depth().depth_1pct()")
            pexchangei.append(('1%', pexchange, market))
            market = eval("arbitrage.public_markets._" + pexchange.lower() +
                          "." + pexchange +
                          "('USDT','btc_usdt').update_depth().depth_01pct()")
            pexchangei.append(('0.1%', pexchange, market))

        for market in pexchangei:
            print(market)

        sys.exit(0)

    def get_market_list(self):
        markets = []
        for filename in glob.glob(
                os.path.join(public_markets.__path__[0], "*.py")):
            module_name = os.path.basename(filename).replace(".py", "")
            if not module_name.startswith("_"):
                module = __import__("arbitrage.public_markets." + module_name)
                test = eval("module.public_markets." + module_name)
                for name, obj in inspect.getmembers(test):
                    if inspect.isclass(obj) and "Market" in (
                            j.__name__ for j in obj.mro()[1:]):
                        if not obj.__module__.split(".")[-1].startswith("_"):
                            markets.append(obj.__name__)
        return markets

    def list_markets(self):
        markets = self.get_market_list()
        markets.sort()
        print("\n".join(markets))
        sys.exit(0)

    def generate_sample_config(self):
        markets = self.get_market_list()
        markets.sort()
        print("markets = [")
        print('",\n'.join(['  "' + i for i in markets]) + '"')
        print("]")
        print('observers = ["Logger"]')
        print("""
refresh_rate = 60
market_expiration_time = 120  # in seconds: 2 minutes

# SafeGuards
max_tx_volume = 1  # in BTC
min_tx_volume = 0.01  # in BTC
balance_margin = 0.05  # 5%
profit_thresh = 0  # in USD
perc_thresh = 0  # in %""")
        sys.exit(0)

    def get_balance(self, args):
        if not args.markets:
            logging.error("You must use --markets argument to specify markets")
            sys.exit(2)
        pmarkets = args.markets.split(",")
        pmarketsi = []
        for pmarket in pmarkets:
            exec("import arbitrage.private_markets." + pmarket.lower())
            market = eval("arbitrage.private_markets." + pmarket.lower() +
                          ".Private" + pmarket + "()")
            pmarketsi.append(market)
        for market in pmarketsi:
            print(market)

    def create_arbitrer(self, args):
        self.arbitrer = Arbitrer()
        if args.observers:
            self.arbitrer.init_observers(args.observers.split(","))
        if args.markets:
            self.arbitrer.init_markets(args.markets.split(","))
        return self.arbitrer

    def init_logger(self, args):
        level = logging.INFO
        if args.verbose:
            level = logging.VERBOSE
        if args.debug:
            level = logging.DEBUG
        logging.basicConfig(format="%(asctime)s [%(levelname)s] %(message)s",
                            level=level)

    def main(self):
        parser = argparse.ArgumentParser()
        parser.add_argument("-d",
                            "--debug",
                            help="debug verbose mode",
                            action="store_true")
        parser.add_argument("-v",
                            "--verbose",
                            help="info verbose mode",
                            action="store_true")
        parser.add_argument("-o",
                            "--observers",
                            type=str,
                            help="observers, example: -oLogger,Emailer")
        parser.add_argument("-m",
                            "--markets",
                            type=str,
                            help="markets, example: -m BitstampEUR,KrakenEUR")
        parser.add_argument("-e",
                            "--exchanges",
                            type=str,
                            help="exchanges, example: -e OKCoin")
        parser.add_argument(
            "command",
            nargs="*",
            default="watch",
            help=
            'verb: "watch|replay-history|get-balance|list-public-markets|compare-depths"',
        )
        args = parser.parse_args()
        self.init_logger(args)
        self.exec_command(args)
예제 #3
0
class ArbitrerCLI:
    def __init__(self):
        self.inject_verbose_info()

    def inject_verbose_info(self):
        logging.VERBOSE = 15
        logging.verbose = lambda x: logging.log(logging.VERBOSE, x)
        logging.addLevelName(logging.VERBOSE, "VERBOSE")

    def exec_command(self, args):
        if "watch" in args.command:
            self.create_arbitrer(args)
            self.arbitrer.loop()
        if "replay-history" in args.command:
            self.create_arbitrer(args)
            self.arbitrer.replay_history(args.replay_history)
        if "get-balance" in args.command:
            self.get_balance(args)
        if "list-public-markets" in args.command:
            self.list_markets()

    def list_markets(self):
        markets = []
        for filename in glob.glob(
                os.path.join(public_markets.__path__[0], "*.py")):
            module_name = os.path.basename(filename).replace('.py', '')
            if not module_name.startswith('_'):
                module = __import__("arbitrage.public_markets." + module_name)
                test = eval('module.public_markets.' + module_name)
                for name, obj in inspect.getmembers(test):
                    if inspect.isclass(obj) and 'Market' in (
                            j.__name__ for j in obj.mro()[1:]):
                        if not obj.__module__.split('.')[-1].startswith('_'):
                            markets.append(obj.__name__)
        markets.sort()
        print("\n".join(markets))
        sys.exit(0)

    def get_balance(self, args):
        if not args.markets:
            logging.error("You must use --markets argument to specify markets")
            sys.exit(2)
        pmarkets = args.markets.split(",")
        pmarketsi = []
        for pmarket in pmarkets:
            exec('import arbitrage.private_markets.' + pmarket.lower())
            market = eval('arbitrage.private_markets.' + pmarket.lower() +
                          '.Private' + pmarket + '()')
            pmarketsi.append(market)
        for market in pmarketsi:
            print(market)

    def create_arbitrer(self, args):
        self.arbitrer = Arbitrer()
        if args.observers:
            self.arbitrer.init_observers(args.observers.split(","))
        if args.markets:
            self.arbitrer.init_markets(args.markets.split(","))

    def init_logger(self, args):
        level = logging.INFO
        if args.verbose:
            level = logging.VERBOSE
        if args.debug:
            level = logging.DEBUG
        logging.basicConfig(format='%(asctime)s [%(levelname)s] %(message)s',
                            level=level)

        if not os.path.exists('tmp'):
            os.makedirs('tmp')
        fh = logging.FileHandler('./tmp/log.txt')
        formatter = logging.Formatter(
            '%(asctime)s [%(levelname)s] %(message)s')
        fh.setFormatter(formatter)
        logging.getLogger('').addHandler(fh)

    def main(self):
        parser = argparse.ArgumentParser()
        parser.add_argument("-d",
                            "--debug",
                            help="debug verbose mode",
                            action="store_true")
        parser.add_argument("-v",
                            "--verbose",
                            help="info verbose mode",
                            action="store_true")
        parser.add_argument("-o",
                            "--observers",
                            type=str,
                            help="observers, example: -oLogger,Emailer")
        parser.add_argument("-m",
                            "--markets",
                            type=str,
                            help="markets, example: -m BitstampEUR,KrakenEUR")
        parser.add_argument(
            "command",
            nargs='*',
            default="watch",
            help='verb: "watch|replay-history|get-balance|list-public-markets"'
        )
        args = parser.parse_args()
        self.init_logger(args)
        try:
            send_message("Arbitrage Started!")
            self.exec_command(args)
        except Exception as e:
            s = traceback.format_exc()
            logging.info(e)
            logging.error(s)
            send_message("Exception: " + str(e))
예제 #4
0
class ArbitrerCLI:
    def __init__(self):
        self.inject_verbose_info()

    def inject_verbose_info(self):
        logging.VERBOSE = 15
        logging.verbose = lambda x: logging.log(logging.VERBOSE, x)
        logging.addLevelName(logging.VERBOSE, "VERBOSE")

    def exec_command(self, args):
        if "watch" in args.command:
            self.create_arbitrer(args)
            self.arbitrer.loop()
        if "replay-history" in args.command:
            self.create_arbitrer(args)
            self.arbitrer.replay_history(args.replay_history)
        if "get-balance" in args.command:
            self.get_balance(args)
        if "list-public-markets" in args.command:
            self.list_markets()

    def list_markets(self):
        markets = []
        for filename in glob.glob(
                os.path.join(public_markets.__path__[0], "*.py")):
            module_name = os.path.basename(filename).replace('.py', '')
            if not module_name.startswith('_'):
                module = __import__("arbitrage.public_markets." + module_name)
                test = eval('module.public_markets.' + module_name)
                for name, obj in inspect.getmembers(test):
                    if inspect.isclass(obj) and 'Market' in (
                            j.__name__ for j in obj.mro()[1:]):
                        if not obj.__module__.split('.')[-1].startswith('_'):
                            markets.append(obj.__name__)
        markets.sort()
        print("\n".join(markets))
        sys.exit(0)

    def get_balance(self, args):
        if not args.markets:
            logging.error("You must use --markets argument to specify markets")
            sys.exit(2)
        pmarkets = args.markets.split(",")
        pmarketsi = []
        for pmarket in pmarkets:
            exec('import arbitrage.private_markets.' + pmarket.lower())
            market = eval('arbitrage.private_markets.' + pmarket.lower() +
                          '.Private' + pmarket + '()')
            pmarketsi.append(market)
        for market in pmarketsi:
            print(market)

    def create_arbitrer(self, args):
        logging.info("creating")
        self.arbitrer = Arbitrer()
        if args.observers:
            self.arbitrer.init_observers(args.observers.split(","))
        if args.markets:
            self.arbitrer.init_markets(args.markets.split(","))

    def init_logger(self, args):
        level = logging.INFO
        if args.verbose:
            level = logging.VERBOSE
        if args.debug:
            level = logging.DEBUG

        file = "log/%s.log" % config.profit_thresh
        os.makedirs(os.path.dirname(file), exist_ok=True)
        logging.basicConfig(format='%(asctime)s [%(levelname)s] %(message)s',
                            filename=file,
                            filemode='a',
                            level=level)

    def init_config(self, args):
        if args.profit:
            config.profit_thresh = args.profit

    def main(self):
        parser = argparse.ArgumentParser()
        parser.add_argument("-d",
                            "--debug",
                            help="debug verbose mode",
                            action="store_true")
        parser.add_argument("-v",
                            "--verbose",
                            help="info verbose mode",
                            action="store_true")
        parser.add_argument("-o",
                            "--observers",
                            type=str,
                            help="observers, example: -oLogger,Emailer")
        parser.add_argument("-p",
                            "--profit",
                            type=int,
                            help="profit, example for 20USD: -p20")
        parser.add_argument("-m",
                            "--markets",
                            type=str,
                            help="markets, example: -mMtGox,Bitstamp")
        parser.add_argument(
            "command",
            nargs='*',
            default="watch",
            help='verb: "watch|replay-history|get-balance|list-public-markets"'
        )
        args = parser.parse_args()
        self.init_config(args)
        self.init_logger(args)
        self.exec_command(args)