Make get_signals async. This should speed up create_trade calls by at least 10x. (#223)

This commit is contained in:
Pan Long 2017-12-25 14:01:01 +08:00 committed by Michael Egger
parent 433bf409f4
commit 6768658300
3 changed files with 19 additions and 3 deletions

View File

@ -144,6 +144,9 @@ def get_signal(pair: str, signal: SignalType) -> bool:
except ValueError as ex:
logger.warning('Unable to analyze ticker for pair %s: %s', pair, str(ex))
return False
except Exception:
logger.exception('Unexpected error when analyzing ticker for pair %s.', pair)
return False
if dataframe.empty:
return False

View File

@ -3,6 +3,7 @@
import enum
import logging
from random import randint
from threading import RLock
from typing import List, Dict, Any, Optional
import arrow
@ -14,6 +15,7 @@ from freqtrade.exchange.bittrex import Bittrex
from freqtrade.exchange.interface import Exchange
logger = logging.getLogger(__name__)
lock = RLock()
# Current selected exchange
_API: Exchange = None
@ -138,7 +140,7 @@ def get_ticker(pair: str) -> dict:
return _API.get_ticker(pair)
@cached(TTLCache(maxsize=100, ttl=30))
@cached(TTLCache(maxsize=100, ttl=30), lock=lock)
def get_ticker_history(pair: str, tick_interval: Optional[int] = 5) -> List[Dict]:
return _API.get_ticker_history(pair, tick_interval)

View File

@ -1,10 +1,12 @@
#!/usr/bin/env python3
import asyncio
import copy
import json
import logging
import sys
import time
import traceback
from concurrent.futures import ThreadPoolExecutor
from datetime import datetime
from typing import Dict, Optional, List
@ -210,8 +212,17 @@ def create_trade(stake_amount: float) -> bool:
raise DependencyException('No pair in whitelist')
# Pick pair based on StochRSI buy signals
for _pair in whitelist:
if get_signal(_pair, SignalType.BUY):
with ThreadPoolExecutor() as pool:
awaitable_signals = [
asyncio.wrap_future(pool.submit(get_signal, pair, SignalType.BUY))
for pair in whitelist
]
loop = asyncio.get_event_loop()
signals = loop.run_until_complete(asyncio.gather(*awaitable_signals))
for idx, _pair in enumerate(whitelist):
if signals[idx]:
pair = _pair
break
else: