{"action":"created","comment":{"url":"https://api.github.com/repos/gcarq/freqtrade/pulls/comments/177848127","pull_request_review_id":107798319,"id":177848127,"diff_hunk":"@@ -105,132 +94,231 @@ def validate_pairs(pairs: List[str]) -> None:\n         _API.load_markets()\n \n     try:\n-        markets = _API.markets\n-    except requests.exceptions.RequestException as e:\n+        markets = _API.load_markets()\n+    except ccxt.BaseError as e:\n         logger.warning('Unable to validate pairs (assuming they are correct). Reason: %s', e)\n         return\n \n     stake_cur = _CONF['stake_currency']\n     for pair in pairs:\n         # Note: ccxt has BaseCurrency/QuoteCurrency format for pairs\n-        pair = pair.replace('_', '/')\n         # TODO: add a support for having coins in BTC/USDT format\n         if not pair.endswith(stake_cur):\n             raise OperationalException(\n                 'Pair {} not compatible with stake_currency: {}'.format(pair, stake_cur)\n             )\n         if pair not in markets:\n             raise OperationalException(\n-                'Pair {} is not available at {}'.format(pair, _API.name.lower()))\n+                'Pair {} is not available at {}'.format(pair, _API.id.lower()))\n \n \n-def buy(pair: str, rate: float, amount: float) -> str:\n+def buy(pair: str, rate: float, amount: float) -> Dict:\n     if _CONF['dry_run']:\n         global _DRY_RUN_OPEN_ORDERS\n         order_id = 'dry_run_buy_{}'.format(randint(0, 10**6))\n         _DRY_RUN_OPEN_ORDERS[order_id] = {\n             'pair': pair,\n-            'rate': rate,\n+            'price': rate,\n             'amount': amount,\n-            'type': 'LIMIT_BUY',\n+            'type': 'limit',\n+            'side': 'buy',\n             'remaining': 0.0,\n-            'opened': arrow.utcnow().datetime,\n-            'closed': arrow.utcnow().datetime,\n+            'datetime': arrow.utcnow().isoformat(),\n+            'status': 'closed'\n         }\n-        return order_id\n+        return {'id': order_id}\n \n-    return _API.buy(pair, rate, amount)\n+    try:\n+        return _API.create_limit_buy_order(pair, amount, rate)\n+    except ccxt.InsufficientFunds as e:\n+        raise DependencyException(\n+            'Insufficient funds to create limit buy order on market {}.'\n+            'Tried to buy amount {} at rate {} (total {}).'\n+            'Message: {}'.format(pair, amount, rate, rate*amount, e)\n+        )\n+    except ccxt.InvalidOrder as e:\n+        raise DependencyException(\n+            'Could not create limit buy order on market {}.'\n+            'Tried to buy amount {} at rate {} (total {}).'\n+            'Message: {}'.format(pair, amount, rate, rate*amount, e)\n+        )\n+    except ccxt.NetworkError as e:\n+        raise NetworkException(\n+            'Could not place buy order due to networking error. Message: {}'.format(e)\n+        )\n+    except ccxt.BaseError as e:\n+        raise OperationalException(e)\n \n \n-def sell(pair: str, rate: float, amount: float) -> str:\n+def sell(pair: str, rate: float, amount: float) -> Dict:\n     if _CONF['dry_run']:\n         global _DRY_RUN_OPEN_ORDERS\n         order_id = 'dry_run_sell_{}'.format(randint(0, 10**6))\n         _DRY_RUN_OPEN_ORDERS[order_id] = {\n             'pair': pair,\n-            'rate': rate,\n+            'price': rate,\n             'amount': amount,\n-            'type': 'LIMIT_SELL',\n+            'type': 'limit',\n+            'side': 'sell',\n             'remaining': 0.0,\n-            'opened': arrow.utcnow().datetime,\n-            'closed': arrow.utcnow().datetime,\n+            'datetime': arrow.utcnow().isoformat(),\n+            'status': 'closed'\n         }\n-        return order_id\n+        return {'id': order_id}\n \n-    return _API.sell(pair, rate, amount)\n+    try:\n+        return _API.create_limit_sell_order(pair, amount, rate)\n+    except ccxt.InsufficientFunds as e:\n+        raise DependencyException(\n+            'Insufficient funds to create limit sell order on market {}.'\n+            'Tried to sell amount {} at rate {} (total {}).'\n+            'Message: {}'.format(pair, amount, rate, rate*amount, e)\n+        )\n+    except ccxt.InvalidOrder as e:\n+        raise DependencyException(\n+            'Could not create limit sell order on market {}.'\n+            'Tried to sell amount {} at rate {} (total {}).'\n+            'Message: {}'.format(pair, amount, rate, rate*amount, e)\n+        )\n+    except ccxt.NetworkError as e:\n+        raise NetworkException(\n+            'Could not place sell order due to networking error. Message: {}'.format(e)\n+        )\n+    except ccxt.BaseError as e:\n+        raise OperationalException(e)\n \n \n def get_balance(currency: str) -> float:\n     if _CONF['dry_run']:\n         return 999.9\n \n-    return _API.fetch_balance()[currency]\n+    # ccxt exception is already handled by get_balances\n+    balances = get_balances()\n+    return balances[currency]['free']\n \n \n-def get_balances():\n+def get_balances() -> dict:\n     if _CONF['dry_run']:\n-        return []\n+        return {}\n+\n+    try:\n+        balances = _API.fetch_balance()\n+        # Remove additional info from ccxt results\n+        balances.pop(\"info\", None)\n+        balances.pop(\"free\", None)\n+        balances.pop(\"total\", None)\n+        balances.pop(\"used\", None)\n+\n+        return balances\n+    except ccxt.NetworkError as e:\n+        raise NetworkException(\n+            'Could not get balance due to networking error. Message: {}'.format(e)\n+        )\n+    except ccxt.BaseError as e:\n+        raise OperationalException(e)\n \n-    return _API.fetch_balance()\n \n-# @cached(TTLCache(maxsize=100, ttl=30))\n @retrier\n def get_ticker(pair: str, refresh: Optional[bool] = True) -> dict:\n-    return _API.fetch_ticker(pair)\n+    global _TICKER_CACHE\n+    try:\n+        if not refresh:\n+            if _TICKER_CACHE and pair in _TICKER_CACHE:\n+                return _TICKER_CACHE[pair]\n+        _TICKER_CACHE[pair] = _API.fetch_ticker(pair)\n+        return _TICKER_CACHE[pair]\n+    except ccxt.NetworkError as e:\n+        raise NetworkException(\n+            'Could not load tickers due to networking error. Message: {}'.format(e)\n+        )\n+    except ccxt.BaseError as e:\n+        raise OperationalException(e)\n \n \n-# @cached(TTLCache(maxsize=100, ttl=30))\n @retrier\n-def get_ticker_history(pair: str, tick_interval) -> List[List]:\n-    # TODO: tickers need to be in format 1m,5m\n-    # fetch_ohlcv returns an [[datetime,o,h,l,c,v]]\n+def get_ticker_history(pair: str, tick_interval: str) -> List[Dict]:\n     if 'fetchOHLCV' not in _API.has or not _API.has['fetchOHLCV']:\n-        logger.warning('Exhange %s does not support fetching historical candlestick data.',\n-                       _API.name)\n-        return []\n+        raise OperationalException(\n+            'Exhange {} does not support fetching historical candlestick data.'.format(_API.name)\n+        )\n \n     try:\n-        ohlcv = _API.fetch_ohlcv(pair, timeframe=str(tick_interval)+\"m\")\n-        return ohlcv\n+        history = _API.fetch_ohlcv(pair, timeframe=tick_interval)\n+        history_json = []\n+        for candlestick in history:\n+            history_json.append({\n+                'T': arrow.get(candlestick[0]/1000.0).strftime('%Y-%m-%dT%H:%M:%S.%f'),\n+                'O': candlestick[1],\n+                'H': candlestick[2],\n+                'L': candlestick[3],\n+                'C': candlestick[4],\n+                'V': candlestick[5],\n+            })\n+        return history_json\n     except IndexError as e:\n         logger.warning('Empty ticker history. Msg %s', str(e))\n+        return []\n     except ccxt.NetworkError as e:\n-        logger.warning('Could not load ticker history due to networking error. Message: %s', str(e))\n+        raise NetworkException(\n+            'Could not load ticker history due to networking error. Message: {}'.format(e)\n+        )\n     except ccxt.BaseError as e:\n-        logger.warning('Could not fetch ticker data. Msg: %s', str(e))\n-    return []\n+        raise OperationalException('Could not fetch ticker data. Msg: {}'.format(e))\n \n \n-def cancel_order(order_id: str) -> None:\n+def cancel_order(order_id: str, pair: str) -> None:\n     if _CONF['dry_run']:\n         return\n \n-    return _API.cancel_order(order_id)\n+    try:\n+        return _API.cancel_order(order_id, pair)\n+    except ccxt.NetworkError as e:\n+        raise NetworkException(\n+            'Could not get order due to networking error. Message: {}'.format(e)\n+        )\n+    except ccxt.InvalidOrder as e:\n+        raise DependencyException(\n+            'Could not cancel order. Message: {}'.format(e)\n+        )\n+    except ccxt.BaseError as e:\n+        raise OperationalException(e)\n \n \n-def get_order(order_id: str) -> Dict:\n+def get_order(order_id: str, pair: str) -> Dict:\n     if _CONF['dry_run']:\n         order = _DRY_RUN_OPEN_ORDERS[order_id]\n         order.update({\n             'id': order_id\n         })\n         return order\n-\n-    return _API.get_order(order_id)\n+    try:\n+        return _API.fetch_order(order_id, pair)\n+    except ccxt.NetworkError as e:\n+        raise NetworkException(\n+            'Could not get order due to networking error. Message: {}'.format(e)\n+        )\n+    except ccxt.InvalidOrder as e:\n+        raise DependencyException(\n+            'Could not get order. Message: {}'.format(e)\n+        )\n+    except ccxt.BaseError as e:\n+        raise OperationalException(e)\n \n \n+# TODO: reimplement, not part of ccxt","path":"freqtrade/exchange/__init__.py","position":347,"original_position":346,"commit_id":"d04c87c5b3ea306d7c0913a6910c2c42209d4e9e","original_commit_id":"916165a7c5355498acb90476a9ef87adc0c412a5","user":{"login":"shusso","id":590002,"avatar_url":"https://avatars0.githubusercontent.com/u/590002?v=4","gravatar_id":"","url":"https://api.github.com/users/shusso","html_url":"https://github.com/shusso","followers_url":"https://api.github.com/users/shusso/followers","following_url":"https://api.github.com/users/shusso/following{/other_user}","gists_url":"https://api.github.com/users/shusso/gists{/gist_id}","starred_url":"https://api.github.com/users/shusso/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shusso/subscriptions","organizations_url":"https://api.github.com/users/shusso/orgs","repos_url":"https://api.github.com/users/shusso/repos","events_url":"https://api.github.com/users/shusso/events{/privacy}","received_events_url":"https://api.github.com/users/shusso/received_events","type":"User","site_admin":false},"body":"getting the exchange url for the pair is there already.","created_at":"2018-03-28T18:31:13Z","updated_at":"2018-03-28T18:31:13Z","html_url":"https://github.com/gcarq/freqtrade/pull/585#discussion_r177848127","pull_request_url":"https://api.github.com/repos/gcarq/freqtrade/pulls/585","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/gcarq/freqtrade/pulls/comments/177848127"},"html":{"href":"https://github.com/gcarq/freqtrade/pull/585#discussion_r177848127"},"pull_request":{"href":"https://api.github.com/repos/gcarq/freqtrade/pulls/585"}}},"pull_request":{"url":"https://api.github.com/repos/gcarq/freqtrade/pulls/585","id":177470555,"html_url":"https://github.com/gcarq/freqtrade/pull/585","diff_url":"https://github.com/gcarq/freqtrade/pull/585.diff","patch_url":"https://github.com/gcarq/freqtrade/pull/585.patch","issue_url":"https://api.github.com/repos/gcarq/freqtrade/issues/585","number":585,"state":"open","locked":false,"title":"[1/3] Add support for multiple exchanges with ccxt (objectified version)","user":{"login":"enenn","id":12987216,"avatar_url":"https://avatars1.githubusercontent.com/u/12987216?v=4","gravatar_id":"","url":"https://api.github.com/users/enenn","html_url":"https://github.com/enenn","followers_url":"https://api.github.com/users/enenn/followers","following_url":"https://api.github.com/users/enenn/following{/other_user}","gists_url":"https://api.github.com/users/enenn/gists{/gist_id}","starred_url":"https://api.github.com/users/enenn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/enenn/subscriptions","organizations_url":"https://api.github.com/users/enenn/orgs","repos_url":"https://api.github.com/users/enenn/repos","events_url":"https://api.github.com/users/enenn/events{/privacy}","received_events_url":"https://api.github.com/users/enenn/received_events","type":"User","site_admin":false},"body":"## Summary\r\nAdds support for multiple exchanges using the [ccxt library](https://github.com/ccxt/ccxt), and integrates with the new objectified structure. A previous PR implementing ccxt for the old procedural version can be found here: https://github.com/gcarq/freqtrade/pull/503\r\n\r\nccxt is a multi-exchange trading library that supports many different exchanges though a unified API, including Binance and Bittrex. \r\n\r\n**This is PR 1 out of 3 in adding support for ccxt**\r\n- PR 1 is mostly implementing ccxt based functions to ` exchange/__init__.py`, and writing tests that validates this part.\r\n- PR 2 is switching the pair format from BTC_XXX to XXX/BTX, and switching ticker interval format from integer minutes (1, 5, 60) to a string (1m, 5m, 1h)\r\n- PR 3 is changing the rest of the bot to use the data structures provided by ccxt when making orders and getting market, history data, and so on. And also various small fixes to make sure tests pass.\r\n\r\n## Feedback\r\n\r\n**Tests do not pass in this PR and the bot does not run.** That is fixed in the following PRs. Feedback for this specific part of the overarching project to add ccxt is appreciated. \r\n\r\nTesting is restricted to Bittrex and Binance to start with, to keep the testing focused to only a few exchanges.\r\n\r\n## Changelog in this PR\r\n\r\n- Replace python-bittrex with ccxt\r\n- Remove Bittrex class and exchange/interface class, since ccxt already has a common API\r\n- In tests related to the exchange , change pair format from \"BTC_XXX\" to \"XXX/BTC\", and change ticker_interval from integer minutes to string (1,5, 60, 1440) -> (1m, 5m, 1h, 1d)\r\n- Update old exchange tests to work with ccxt\r\n- Encapsulate all exceptions from ccxt to be able to use the same exception types in the entire project.\r\n- Add retrier decorator that retries failed API requests","created_at":"2018-03-26T14:48:06Z","updated_at":"2018-03-28T18:31:13Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9c4063c4dda71f4a2aac01c5e70df650c5996987","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/gcarq/freqtrade/pulls/585/commits","review_comments_url":"https://api.github.com/repos/gcarq/freqtrade/pulls/585/comments","review_comment_url":"https://api.github.com/repos/gcarq/freqtrade/pulls/comments{/number}","comments_url":"https://api.github.com/repos/gcarq/freqtrade/issues/585/comments","statuses_url":"https://api.github.com/repos/gcarq/freqtrade/statuses/d04c87c5b3ea306d7c0913a6910c2c42209d4e9e","head":{"label":"enenn:ccxt-objectify-pr1","ref":"ccxt-objectify-pr1","sha":"d04c87c5b3ea306d7c0913a6910c2c42209d4e9e","user":{"login":"enenn","id":12987216,"avatar_url":"https://avatars1.githubusercontent.com/u/12987216?v=4","gravatar_id":"","url":"https://api.github.com/users/enenn","html_url":"https://github.com/enenn","followers_url":"https://api.github.com/users/enenn/followers","following_url":"https://api.github.com/users/enenn/following{/other_user}","gists_url":"https://api.github.com/users/enenn/gists{/gist_id}","starred_url":"https://api.github.com/users/enenn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/enenn/subscriptions","organizations_url":"https://api.github.com/users/enenn/orgs","repos_url":"https://api.github.com/users/enenn/repos","events_url":"https://api.github.com/users/enenn/events{/privacy}","received_events_url":"https://api.github.com/users/enenn/received_events","type":"User","site_admin":false},"repo":{"id":120093252,"name":"freqtrade","full_name":"enenn/freqtrade","owner":{"login":"enenn","id":12987216,"avatar_url":"https://avatars1.githubusercontent.com/u/12987216?v=4","gravatar_id":"","url":"https://api.github.com/users/enenn","html_url":"https://github.com/enenn","followers_url":"https://api.github.com/users/enenn/followers","following_url":"https://api.github.com/users/enenn/following{/other_user}","gists_url":"https://api.github.com/users/enenn/gists{/gist_id}","starred_url":"https://api.github.com/users/enenn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/enenn/subscriptions","organizations_url":"https://api.github.com/users/enenn/orgs","repos_url":"https://api.github.com/users/enenn/repos","events_url":"https://api.github.com/users/enenn/events{/privacy}","received_events_url":"https://api.github.com/users/enenn/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/enenn/freqtrade","description":"Simple High Frequency Trading Bot for crypto currencies","fork":true,"url":"https://api.github.com/repos/enenn/freqtrade","forks_url":"https://api.github.com/repos/enenn/freqtrade/forks","keys_url":"https://api.github.com/repos/enenn/freqtrade/keys{/key_id}","collaborators_url":"https://api.github.com/repos/enenn/freqtrade/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/enenn/freqtrade/teams","hooks_url":"https://api.github.com/repos/enenn/freqtrade/hooks","issue_events_url":"https://api.github.com/repos/enenn/freqtrade/issues/events{/number}","events_url":"https://api.github.com/repos/enenn/freqtrade/events","assignees_url":"https://api.github.com/repos/enenn/freqtrade/assignees{/user}","branches_url":"https://api.github.com/repos/enenn/freqtrade/branches{/branch}","tags_url":"https://api.github.com/repos/enenn/freqtrade/tags","blobs_url":"https://api.github.com/repos/enenn/freqtrade/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/enenn/freqtrade/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/enenn/freqtrade/git/refs{/sha}","trees_url":"https://api.github.com/repos/enenn/freqtrade/git/trees{/sha}","statuses_url":"https://api.github.com/repos/enenn/freqtrade/statuses/{sha}","languages_url":"https://api.github.com/repos/enenn/freqtrade/languages","stargazers_url":"https://api.github.com/repos/enenn/freqtrade/stargazers","contributors_url":"https://api.github.com/repos/enenn/freqtrade/contributors","subscribers_url":"https://api.github.com/repos/enenn/freqtrade/subscribers","subscription_url":"https://api.github.com/repos/enenn/freqtrade/subscription","commits_url":"https://api.github.com/repos/enenn/freqtrade/commits{/sha}","git_commits_url":"https://api.github.com/repos/enenn/freqtrade/git/commits{/sha}","comments_url":"https://api.github.com/repos/enenn/freqtrade/comments{/number}","issue_comment_url":"https://api.github.com/repos/enenn/freqtrade/issues/comments{/number}","contents_url":"https://api.github.com/repos/enenn/freqtrade/contents/{+path}","compare_url":"https://api.github.com/repos/enenn/freqtrade/compare/{base}...{head}","merges_url":"https://api.github.com/repos/enenn/freqtrade/merges","archive_url":"https://api.github.com/repos/enenn/freqtrade/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/enenn/freqtrade/downloads","issues_url":"https://api.github.com/repos/enenn/freqtrade/issues{/number}","pulls_url":"https://api.github.com/repos/enenn/freqtrade/pulls{/number}","milestones_url":"https://api.github.com/repos/enenn/freqtrade/milestones{/number}","notifications_url":"https://api.github.com/repos/enenn/freqtrade/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/enenn/freqtrade/labels{/name}","releases_url":"https://api.github.com/repos/enenn/freqtrade/releases{/id}","deployments_url":"https://api.github.com/repos/enenn/freqtrade/deployments","created_at":"2018-02-03T13:24:07Z","updated_at":"2018-02-03T13:24:10Z","pushed_at":"2018-03-26T19:36:32Z","git_url":"git://github.com/enenn/freqtrade.git","ssh_url":"git@github.com:enenn/freqtrade.git","clone_url":"https://github.com/enenn/freqtrade.git","svn_url":"https://github.com/enenn/freqtrade","homepage":null,"size":26953,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":null,"forks":0,"open_issues":1,"watchers":0,"default_branch":"develop"}},"base":{"label":"gcarq:feat/objectify-ccxt","ref":"feat/objectify-ccxt","sha":"0a32d38ad97935fc24adc507a8237d146428e765","user":{"login":"gcarq","id":4720529,"avatar_url":"https://avatars3.githubusercontent.com/u/4720529?v=4","gravatar_id":"","url":"https://api.github.com/users/gcarq","html_url":"https://github.com/gcarq","followers_url":"https://api.github.com/users/gcarq/followers","following_url":"https://api.github.com/users/gcarq/following{/other_user}","gists_url":"https://api.github.com/users/gcarq/gists{/gist_id}","starred_url":"https://api.github.com/users/gcarq/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gcarq/subscriptions","organizations_url":"https://api.github.com/users/gcarq/orgs","repos_url":"https://api.github.com/users/gcarq/repos","events_url":"https://api.github.com/users/gcarq/events{/privacy}","received_events_url":"https://api.github.com/users/gcarq/received_events","type":"User","site_admin":false},"repo":{"id":91629816,"name":"freqtrade","full_name":"gcarq/freqtrade","owner":{"login":"gcarq","id":4720529,"avatar_url":"https://avatars3.githubusercontent.com/u/4720529?v=4","gravatar_id":"","url":"https://api.github.com/users/gcarq","html_url":"https://github.com/gcarq","followers_url":"https://api.github.com/users/gcarq/followers","following_url":"https://api.github.com/users/gcarq/following{/other_user}","gists_url":"https://api.github.com/users/gcarq/gists{/gist_id}","starred_url":"https://api.github.com/users/gcarq/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gcarq/subscriptions","organizations_url":"https://api.github.com/users/gcarq/orgs","repos_url":"https://api.github.com/users/gcarq/repos","events_url":"https://api.github.com/users/gcarq/events{/privacy}","received_events_url":"https://api.github.com/users/gcarq/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/gcarq/freqtrade","description":"Simple High Frequency Trading Bot for crypto currencies","fork":false,"url":"https://api.github.com/repos/gcarq/freqtrade","forks_url":"https://api.github.com/repos/gcarq/freqtrade/forks","keys_url":"https://api.github.com/repos/gcarq/freqtrade/keys{/key_id}","collaborators_url":"https://api.github.com/repos/gcarq/freqtrade/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/gcarq/freqtrade/teams","hooks_url":"https://api.github.com/repos/gcarq/freqtrade/hooks","issue_events_url":"https://api.github.com/repos/gcarq/freqtrade/issues/events{/number}","events_url":"https://api.github.com/repos/gcarq/freqtrade/events","assignees_url":"https://api.github.com/repos/gcarq/freqtrade/assignees{/user}","branches_url":"https://api.github.com/repos/gcarq/freqtrade/branches{/branch}","tags_url":"https://api.github.com/repos/gcarq/freqtrade/tags","blobs_url":"https://api.github.com/repos/gcarq/freqtrade/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/gcarq/freqtrade/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/gcarq/freqtrade/git/refs{/sha}","trees_url":"https://api.github.com/repos/gcarq/freqtrade/git/trees{/sha}","statuses_url":"https://api.github.com/repos/gcarq/freqtrade/statuses/{sha}","languages_url":"https://api.github.com/repos/gcarq/freqtrade/languages","stargazers_url":"https://api.github.com/repos/gcarq/freqtrade/stargazers","contributors_url":"https://api.github.com/repos/gcarq/freqtrade/contributors","subscribers_url":"https://api.github.com/repos/gcarq/freqtrade/subscribers","subscription_url":"https://api.github.com/repos/gcarq/freqtrade/subscription","commits_url":"https://api.github.com/repos/gcarq/freqtrade/commits{/sha}","git_commits_url":"https://api.github.com/repos/gcarq/freqtrade/git/commits{/sha}","comments_url":"https://api.github.com/repos/gcarq/freqtrade/comments{/number}","issue_comment_url":"https://api.github.com/repos/gcarq/freqtrade/issues/comments{/number}","contents_url":"https://api.github.com/repos/gcarq/freqtrade/contents/{+path}","compare_url":"https://api.github.com/repos/gcarq/freqtrade/compare/{base}...{head}","merges_url":"https://api.github.com/repos/gcarq/freqtrade/merges","archive_url":"https://api.github.com/repos/gcarq/freqtrade/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/gcarq/freqtrade/downloads","issues_url":"https://api.github.com/repos/gcarq/freqtrade/issues{/number}","pulls_url":"https://api.github.com/repos/gcarq/freqtrade/pulls{/number}","milestones_url":"https://api.github.com/repos/gcarq/freqtrade/milestones{/number}","notifications_url":"https://api.github.com/repos/gcarq/freqtrade/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/gcarq/freqtrade/labels{/name}","releases_url":"https://api.github.com/repos/gcarq/freqtrade/releases{/id}","deployments_url":"https://api.github.com/repos/gcarq/freqtrade/deployments","created_at":"2017-05-17T23:48:53Z","updated_at":"2018-03-28T15:14:41Z","pushed_at":"2018-03-28T07:54:28Z","git_url":"git://github.com/gcarq/freqtrade.git","ssh_url":"git@github.com:gcarq/freqtrade.git","clone_url":"https://github.com/gcarq/freqtrade.git","svn_url":"https://github.com/gcarq/freqtrade","homepage":null,"size":23625,"stargazers_count":652,"watchers_count":652,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":225,"mirror_url":null,"archived":false,"open_issues_count":62,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0"},"forks":225,"open_issues":62,"watchers":652,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/gcarq/freqtrade/pulls/585"},"html":{"href":"https://github.com/gcarq/freqtrade/pull/585"},"issue":{"href":"https://api.github.com/repos/gcarq/freqtrade/issues/585"},"comments":{"href":"https://api.github.com/repos/gcarq/freqtrade/issues/585/comments"},"review_comments":{"href":"https://api.github.com/repos/gcarq/freqtrade/pulls/585/comments"},"review_comment":{"href":"https://api.github.com/repos/gcarq/freqtrade/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/gcarq/freqtrade/pulls/585/commits"},"statuses":{"href":"https://api.github.com/repos/gcarq/freqtrade/statuses/d04c87c5b3ea306d7c0913a6910c2c42209d4e9e"}},"author_association":"NONE"}}
{"actor":{"display_login":"shusso"}}