Make get_signals async. This should speed up create_trade calls by at least 10x. (#223)
This commit is contained in:
parent
433bf409f4
commit
6768658300
@ -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
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user