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:
|
except ValueError as ex:
|
||||||
logger.warning('Unable to analyze ticker for pair %s: %s', pair, str(ex))
|
logger.warning('Unable to analyze ticker for pair %s: %s', pair, str(ex))
|
||||||
return False
|
return False
|
||||||
|
except Exception:
|
||||||
|
logger.exception('Unexpected error when analyzing ticker for pair %s.', pair)
|
||||||
|
return False
|
||||||
|
|
||||||
if dataframe.empty:
|
if dataframe.empty:
|
||||||
return False
|
return False
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
import enum
|
import enum
|
||||||
import logging
|
import logging
|
||||||
from random import randint
|
from random import randint
|
||||||
|
from threading import RLock
|
||||||
from typing import List, Dict, Any, Optional
|
from typing import List, Dict, Any, Optional
|
||||||
|
|
||||||
import arrow
|
import arrow
|
||||||
@ -14,6 +15,7 @@ from freqtrade.exchange.bittrex import Bittrex
|
|||||||
from freqtrade.exchange.interface import Exchange
|
from freqtrade.exchange.interface import Exchange
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
lock = RLock()
|
||||||
|
|
||||||
# Current selected exchange
|
# Current selected exchange
|
||||||
_API: Exchange = None
|
_API: Exchange = None
|
||||||
@ -138,7 +140,7 @@ def get_ticker(pair: str) -> dict:
|
|||||||
return _API.get_ticker(pair)
|
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]:
|
def get_ticker_history(pair: str, tick_interval: Optional[int] = 5) -> List[Dict]:
|
||||||
return _API.get_ticker_history(pair, tick_interval)
|
return _API.get_ticker_history(pair, tick_interval)
|
||||||
|
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
import asyncio
|
||||||
import copy
|
import copy
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
import traceback
|
import traceback
|
||||||
|
from concurrent.futures import ThreadPoolExecutor
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import Dict, Optional, List
|
from typing import Dict, Optional, List
|
||||||
|
|
||||||
@ -210,8 +212,17 @@ def create_trade(stake_amount: float) -> bool:
|
|||||||
raise DependencyException('No pair in whitelist')
|
raise DependencyException('No pair in whitelist')
|
||||||
|
|
||||||
# Pick pair based on StochRSI buy signals
|
# Pick pair based on StochRSI buy signals
|
||||||
for _pair in whitelist:
|
with ThreadPoolExecutor() as pool:
|
||||||
if get_signal(_pair, SignalType.BUY):
|
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
|
pair = _pair
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
|
Loading…
Reference in New Issue
Block a user