Exemplo n.º 1
0
    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))
Exemplo n.º 2
0
    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,
                    ))
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
    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)
Exemplo n.º 5
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)
Exemplo n.º 6
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)