Source code for flashcrashed.flashcrashed
from pybeehive import Streamer, Listener, Event
from btfx_trader import Trader
from twilio.rest import Client
import os
from .detector import BasicDetector
_type_key_map = {
'tickers': 'bid',
'trades': 'price'
}
[docs]class TradeDataStreamer(Streamer):
def __init__(self, _type, symbol, data, topic=None):
super(TradeDataStreamer, self).__init__(topic=topic)
self.type = _type
self.symbol = symbol
self.data = data
self.key = _type_key_map.get(_type, 'close')
[docs] def stream(self):
while self.alive:
data = self.data.get(self.type, self.symbol)
yield Event((self.symbol, data[self.key]))
[docs]class TradeListener(Listener):
def __init__(self, key, secret, detector_class=BasicDetector, **kwargs):
super(TradeListener, self).__init__(**kwargs)
self.trader = Trader(key, secret)
self.detector_class = detector_class
self.detectors = {}
self.trading = {}
[docs] def on_price(self, symbol, price):
if symbol not in self.detectors.keys():
self.detectors[symbol] = self.detector_class()
self.detectors[symbol].symbol = symbol
self.trading[symbol] = False
prediction = self.detectors[symbol].predict(price)
if prediction == 0 and not any(k for k in self.trading.values()):
self.trading[symbol] = True
_id = self.trader.order(symbol, price, ratio=1, pad_price=0.03)
order = self.trader.wait_execution(_id)
return Event((symbol, 'BOUGHT', order))
elif prediction == 2 and self.trading[symbol]:
self.trading[symbol] = False
_id = self.trader.order(symbol, price, ratio=-1, pad_price=0.01)
order = self.trader.wait_execution(_id)
return Event((symbol, 'SOLD', order))
[docs] def setup(self):
self.trader.connect()
[docs] def teardown(self):
self.trader.close()
[docs] def on_event(self, event):
return self.on_price(*event.data)
[docs]class NotificationListener(Listener):
[docs] @staticmethod
def notify_traded(symbol, action, order):
key, secret = os.environ['TWILIO_SID'], os.environ["TWILIO_SECRET"]
Client(key, secret).messages.create(
to=os.environ['NUMBER'],
from_=os.environ['TWILIO_NUMBER'],
body='%s was %s at $%.2f for $%.2f!' % (
symbol, action, order['execution_price'],
abs(order['executed'] * order['execution_price'])
)
)
[docs] def on_event(self, event):
self.notify_traded(*event.data)