async def connect(self): with open(self._filename) as csvfile: self._reader = csv.DictReader(csvfile, delimiter=',') for row in self._reader: order = Order(volume=float(row['volume']), price=float(row['close']), side=Side.BUY, exchange=self.exchange(), instrument=Instrument( row['symbol'].split('-')[0], InstrumentType(row['symbol'].split('-')[1].upper()) ) ) order.filled = float(row['volume']) if 'time' in row: order.timestamp = datetime.fromtimestamp(float(row['time'])) elif 'date' in row: order.timestamp = datetime.fromisoformat(row['date']) elif 'datetime' in row: order.timestamp = datetime.fromisoformat(row['datetime']) self._data.append(Trade(volume=float(row['volume']), price=float(row['close']), maker_orders=[], taker_order=order))
async def connect(self) -> None: with open(self._filename) as csvfile: self._reader = csv.DictReader(csvfile, delimiter=",") for row in self._reader: order = Order( volume=float(row["volume"]), price=float(row["close"]), side=Side.BUY, exchange=self.exchange(), instrument=Instrument( row["symbol"].split("-")[0], InstrumentType(row["symbol"].split("-")[1].upper()), ), filled=float(row["volume"]), ) if "time" in row: order.timestamp = datetime.fromtimestamp(float( row["time"])) elif "date" in row: order.timestamp = datetime.fromisoformat(row["date"]) elif "datetime" in row: order.timestamp = datetime.fromisoformat(row["datetime"]) self._data.append( Trade( volume=float(row["volume"]), price=float(row["close"]), maker_orders=[], taker_order=order, ))
async def tick(self): now = self._start for i in range(1000): if self._client_order: self._client_order.filled = self._client_order.volume t = Trade(self._client_order.volume, i, [], self._client_order) t.taker_order.timestamp = now self._client_order = None yield Event(type=EventType.TRADE, target=t) continue o = Order(1, i, Side.BUY, self._instrument, self.exchange()) o.filled = 1 o.timestamp = now t = Trade(1, i, [], o) yield Event(type=EventType.TRADE, target=t) now += timedelta(minutes=30)
async def tick(self): '''return data from exchange''' dfs = [] for i in self._subscriptions: df = self._client.chartDF(i.name, timeframe='6m') df = df[['close', 'volume']] df.columns = ['close:{}'.format(i.name), 'volume:{}'.format(i.name)] dfs.append(df) data = pd.concat(dfs, axis=1) data.sort_index(inplace=True) data = data.groupby(data.index).last() data.drop_duplicates(inplace=True) data.fillna(method='ffill', inplace=True) for index in data.index: for i in self._subscriptions: volume = data.loc[index]['volume:{}'.format(i.name)] price = data.loc[index]['close:{}'.format(i.name)] o = Order(volume=volume, price=price, side=Side.BUY, instrument=i, exchange=self.exchange()) o.timestamp = index.to_pydatetime() t = Trade(volume=volume, price=price, taker_order=o, maker_orders=[]) yield Event(type=EventType.TRADE, target=t) await asyncio.sleep(0) while self._queued_orders: order = self._queued_orders.popleft() order.timestamp = index t = Trade(volume=order.volume, price=order.price, taker_order=order, maker_orders=[]) t.my_order = order yield Event(type=EventType.TRADE, target=t) await asyncio.sleep(0)
async def tick(self): '''return data from exchange''' if self._timeframe == 'live': data = deque() def _callback(record): data.append(record) self._client.tradesSSE(symbols=",".join( [i.name for i in self._subscriptions]), on_data=_callback) while True: while data: record = data.popleft() volume = record['volume'] price = record['price'] instrument = Instrument(record['symbol'], InstrumentType.EQUITY) o = Order(volume=volume, price=price, side=Side.BUY, instrument=instrument, exchange=self.exchange()) t = Trade(volume=volume, price=price, taker_order=o, maker_orders=[]) yield Event(type=EventType.TRADE, target=t) await asyncio.sleep(0) else: dfs = [] insts = set() if self._timeframe != '1d': for i in tqdm(self._subscriptions, desc="Fetching data..."): if i.name in insts: # already fetched the data, multiple subscriptions continue if self._cache_data: # first, check if we have this data and its cached already os.makedirs('_aat_data', exist_ok=True) data_filename = os.path.join( '_aat_data', 'iex_{}_{}_{}_{}.pkl'.format( i.name, self._timeframe, datetime.now().strftime('%Y%m%d'), 'sand' if self._is_sandbox else '')) if os.path.exists(data_filename): print('using cached IEX data for {}'.format( i.name)) df = pd.read_pickle(data_filename) else: df = self._client.chartDF( i.name, timeframe=self._timeframe) df.to_pickle(data_filename) else: df = self._client.chartDF(i.name, timeframe=self._timeframe) df = df[['close', 'volume']] df.columns = [ 'close:{}'.format(i.name), 'volume:{}'.format(i.name) ] dfs.append(df) insts.add(i.name) data = pd.concat(dfs, axis=1) data.sort_index(inplace=True) data = data.groupby(data.index).last() data.drop_duplicates(inplace=True) data.fillna(method='ffill', inplace=True) else: for i in tqdm(self._subscriptions, desc="Fetching data..."): if i.name in insts: # already fetched the data, multiple subscriptions continue date = self._start_date subdfs = [] while date <= self._end_date: if self._cache_data: # first, check if we have this data and its cached already os.makedirs('_aat_data', exist_ok=True) data_filename = os.path.join( '_aat_data', 'iex_{}_{}_{}_{}.pkl'.format( i.name, self._timeframe, date, 'sand' if self._is_sandbox else '')) if os.path.exists(data_filename): print( 'using cached IEX data for {} - {}'.format( i.name, date)) df = pd.read_pickle(data_filename) else: df = self._client.chartDF( i.name, timeframe='1d', date=date.strftime('%Y%m%d')) df.to_pickle(data_filename) else: df = self._client.chartDF( i.name, timeframe='1d', date=date.strftime('%Y%m%d')) if not df.empty: df = df[['average', 'volume']] df.columns = [ 'close:{}'.format(i.name), 'volume:{}'.format(i.name) ] subdfs.append(df) date += timedelta(days=1) dfs.append(pd.concat(subdfs)) insts.add(i.name) data = pd.concat(dfs, axis=1) data.index = [ x + timedelta(hours=int(y.split(':')[0]), minutes=int(y.split(':')[1])) for x, y in data.index ] data = data.groupby(data.index).last() data.drop_duplicates(inplace=True) data.fillna(method='ffill', inplace=True) for index in data.index: for i in self._subscriptions: volume = data.loc[index]['volume:{}'.format(i.name)] price = data.loc[index]['close:{}'.format(i.name)] if volume == 0: continue o = Order(volume=volume, price=price, side=Side.BUY, instrument=i, exchange=self.exchange()) o.filled = volume o.timestamp = index.to_pydatetime() t = Trade(volume=volume, price=price, taker_order=o, maker_orders=[]) yield Event(type=EventType.TRADE, target=t) await asyncio.sleep(0) while self._queued_orders: order = self._queued_orders.popleft() order.timestamp = index order.filled = order.volume t = Trade(volume=order.volume, price=order.price, taker_order=order, maker_orders=[]) t.my_order = order yield Event(type=EventType.TRADE, target=t) await asyncio.sleep(0)
async def tick(self): '''return data from exchange''' if self._timeframe == 'live': data = deque() def _callback(record): data.append(record) self._client.tradesSSE(symbols=",".join([i.name for i in self._subscriptions]), on_data=_callback) while True: while data: record = data.popleft() volume = record['volume'] price = record['price'] instrument = Instrument(record['symbol'], InstrumentType.EQUITY) o = Order(volume=volume, price=price, side=Side.BUY, instrument=instrument, exchange=self.exchange()) t = Trade(volume=volume, price=price, taker_order=o, maker_orders=[]) yield Event(type=EventType.TRADE, target=t) await asyncio.sleep(0) else: dfs = [] if self._timeframe != '1d': for i in tqdm(self._subscriptions, desc="Fetching data..."): df = self._client.chartDF(i.name, timeframe=self._timeframe) df = df[['close', 'volume']] df.columns = ['close:{}'.format(i.name), 'volume:{}'.format(i.name)] dfs.append(df) data = pd.concat(dfs, axis=1) data.sort_index(inplace=True) data = data.groupby(data.index).last() data.drop_duplicates(inplace=True) data.fillna(method='ffill', inplace=True) else: for i in tqdm(self._subscriptions, desc="Fetching data..."): date = self._start_date subdfs = [] while date <= self._end_date: df = self._client.chartDF(i.name, timeframe='1d', date=date.strftime('%Y%m%d')) if not df.empty: df = df[['average', 'volume']] df.columns = ['close:{}'.format(i.name), 'volume:{}'.format(i.name)] subdfs.append(df) date += timedelta(days=1) dfs.append(pd.concat(subdfs)) data = pd.concat(dfs, axis=1) data.index = [x + timedelta(hours=int(y.split(':')[0]), minutes=int(y.split(':')[1])) for x, y in data.index] data = data.groupby(data.index).last() data.drop_duplicates(inplace=True) data.fillna(method='ffill', inplace=True) for index in data.index: for i in self._subscriptions: volume = data.loc[index]['volume:{}'.format(i.name)] price = data.loc[index]['close:{}'.format(i.name)] if volume == 0: continue o = Order(volume=volume, price=price, side=Side.BUY, instrument=i, exchange=self.exchange()) o.timestamp = index.to_pydatetime() t = Trade(volume=volume, price=price, taker_order=o, maker_orders=[]) yield Event(type=EventType.TRADE, target=t) await asyncio.sleep(0) while self._queued_orders: order = self._queued_orders.popleft() order.timestamp = index t = Trade(volume=order.volume, price=order.price, taker_order=order, maker_orders=[]) t.my_order = order yield Event(type=EventType.TRADE, target=t) await asyncio.sleep(0)