Пример #1
0
def main():
    try:

        f = FeedHandler()
        #f.add_feed(Kraken(max_depth=1, channels=[L2_BOOK], symbols=['ETH-USD'], callbacks={L2_BOOK: BookZMQ(port=5678)}))
        f.add_feed(
            Bittrex(max_depth=1,
                    channels=[L2_BOOK],
                    symbols=['BTC-USD'],
                    callbacks=DeltaBookZMQ("Bittrex", port=6000).L2))

        f.run()

    finally:
        print('done!')
Пример #2
0
def main():
    loop = asyncio.get_event_loop()
    f = FeedHandler()
    f.add_feed(Coinbase(pairs=['BTC-USD'], channels=[TRADES], callbacks={TRADES: trade}))
    f.run(start_loop=False)

    loop.call_later(5, stop)
    loop.run_forever()

    print("\n\n******* ADDING NEW TRADING PAIR *******\n\n")
    f.add_feed(Coinbase(pairs=['ETH-USD'], channels=[TRADES], callbacks={TRADES: trade}))
    f.run(start_loop=False)

    loop.call_later(5, stop)
    loop.run_forever()
Пример #3
0
def main():
    f = FeedHandler()
    # due to the way the test verification works, you can only run one for the test
    #f.add_feed(Bitmex(pairs=['XBTUSD'], channels=[L3_BOOK], callbacks={L3_BOOK: BookCallback(book), BOOK_DELTA: BookUpdateCallback(l3_delta)}))
    # f.add_feed(Bitfinex(pairs=['BTC-USD'], channels=[L3_BOOK], callbacks={L3_BOOK: BookCallback(book), BOOK_DELTA: BookUpdateCallback(l3_delta)}))
    # f.add_feed(Bitfinex(pairs=['BTC-USD'], channels=[L2_BOOK], callbacks={L2_BOOK: BookCallback(book), BOOK_DELTA: BookUpdateCallback(delta)}))
    # f.add_feed(Coinbase(pairs=['BTC-USD'], channels=[L3_BOOK], callbacks={L3_BOOK: BookCallback(book), BOOK_DELTA: BookUpdateCallback(l3_delta)}))
    # f.add_feed(Coinbase(pairs=['BTC-USD'], channels=[L2_BOOK], callbacks={L2_BOOK: BookCallback(book), BOOK_DELTA: BookUpdateCallback(delta)}))
    # f.add_feed(Gemini(book_interval=100, pairs=['BTC-USD'], callbacks={L2_BOOK: BookCallback(book), BOOK_DELTA: BookUpdateCallback(delta)}))
    # f.add_feed(HitBTC(book_interval=100, pairs=['BTC-USD'], channels=[L2_BOOK], callbacks={L2_BOOK: BookCallback(book), BOOK_DELTA: BookUpdateCallback(delta)}))
    # f.add_feed(Poloniex(book_interval=100, channels=['BTC-USDT'], callbacks={L2_BOOK: BookCallback(book), BOOK_DELTA: BookUpdateCallback(delta)}))
    # f.add_feed(Kraken(book_interval=100, pairs=['BTC-USD'], channels=[L2_BOOK], callbacks={L2_BOOK: BookCallback(book), BOOK_DELTA: BookUpdateCallback(delta)}))
    f.add_feed(OKCoin(book_interval=100, pairs=['BTC-USD'], channels=[L2_BOOK], callbacks={L2_BOOK: BookCallback(book), BOOK_DELTA: BookUpdateCallback(delta)}))

    f.run()
Пример #4
0
def main():
    fh = FeedHandler()

    callbacks = {
        TRADES: TradeCallback(trade),
        L2_BOOK: BookCallback(book),
        TICKER: TickerCallback(ticker)
    }
    pairs = OKEx.get_active_symbols()
    fh.add_feed(
        OKEx(pairs=pairs,
             channels=[TRADES_FUTURES, L2_BOOK_FUTURES, TICKER_FUTURES],
             callbacks=callbacks))

    fh.run()
Пример #5
0
def main(proxy):
    futures_symbols = BinanceFutures.info()['symbols']
    futures_symbols = [
        symbol for symbol in futures_symbols if 'PINDEX' not in symbol
    ]
    shuffle(futures_symbols)
    futures_symbols = futures_symbols[:20]

    # use high volume pairs for quick l2_book updates
    book_symbols = [
        'ETH-BTC', 'LTC-BTC', 'ADA-BTC', 'BTC-USDT', 'ETH-USDT', 'LTC-USDT',
        'BNB-BTC', 'BNB-ETH'
    ]

    f = FeedHandler()
    counter = Counter(f)
    f.add_feed(
        Binance(depth_interval='1000ms',
                http_proxy=proxy,
                max_depth=1,
                symbols=book_symbols,
                channels=[L2_BOOK],
                callbacks={
                    L2_BOOK:
                    counter.callback(BINANCE, L2_BOOK, book_symbols, False)
                }))
    f.add_feed(
        Binance(depth_interval='1000ms',
                http_proxy=proxy,
                max_depth=1,
                symbols=book_symbols,
                channels=[L2_BOOK],
                callbacks={
                    L2_BOOK: counter.callback(BINANCE, L2_BOOK, book_symbols,
                                              True)
                }))
    f.add_feed(
        BinanceFutures(http_proxy=proxy,
                       open_interest_interval=1.0,
                       symbols=futures_symbols,
                       channels=[OPEN_INTEREST],
                       callbacks={
                           OPEN_INTEREST:
                           counter.callback(BINANCE_FUTURES, OPEN_INTEREST,
                                            futures_symbols, False)
                       }))
    f.add_feed(
        BinanceFutures(http_proxy=proxy,
                       open_interest_interval=1.0,
                       symbols=futures_symbols,
                       channels=[OPEN_INTEREST],
                       callbacks={
                           OPEN_INTEREST:
                           counter.callback(BINANCE_FUTURES, OPEN_INTEREST,
                                            futures_symbols, True)
                       }))

    f.run()
Пример #6
0
def main():
    f = FeedHandler()

    # Deribit can't handle 400+ simultaneous requests, so if all
    # instruments are needed they should be fed in the different calls

    #config = {TRADES: ["BTC-PERPETUAL"], TICKER: ['ETH-PERPETUAL'], FUNDING: ['ETH-PERPETUAL'], OPEN_INTEREST: ['ETH-PERPETUAL']}
    #f.add_feed(Deribit(config=config, callbacks={OPEN_INTEREST: oi, FUNDING: funding, TICKER: TickerCallback(ticker), TRADES: TradeCallback(trade)}))
    f.add_feed(
        Deribit(pairs=['BTC-PERPETUAL'],
                channels=[L2_BOOK],
                callbacks={L2_BOOK: BookCallback(book)}))

    #f.add_feed(Deribit(pairs=['BTC-26JUN20', 'BTC-25SEP20-11000-P'], channels=[TICKER], callbacks={TICKER: TickerCallback(ticker)}))

    f.run()
Пример #7
0
def main():
    ftx = Rest(config='config.yaml', subaccount='subaccount')['ftx']
    print(ftx.ticker('ETH-USD'))
    print(ftx.orders(symbol='USDT-USD'))
    f = FeedHandler(config="config.yaml")
    f.add_feed(
        FTX(config="config.yaml",
            subaccount='subaccount',
            symbols=['BTC-USD', 'BCH-USD', 'USDT-USD'],
            channels=[TRADES, USER_FILLS, ORDER_INFO],
            callbacks={
                TRADES: TradeCallback(trade),
                USER_FILLS: fill,
                ORDER_INFO: order
            }))
    f.run()
Пример #8
0
def main():
    try:
        p = Process(target=receiver, args=(5678, ))

        p.start()

        f = FeedHandler()
        f.add_feed(
            Kraken(channels=[L2_BOOK],
                   pairs=['ETH-USD'],
                   callbacks={L2_BOOK: BookZMQ(depth=1, port=5678)}))

        f.run()

    finally:
        p.terminate()
Пример #9
0
def main():
    config = {'log': {'filename': 'gateio.log', 'level': 'INFO'}}
    # the config will be automatically passed into any exchanges set up by string. Instantiated exchange objects would need to pass the config in manually.
    f = FeedHandler(config=config)

    pairs = list(gateio_symbols().keys())
    f.add_feed(
        Gateio(symbols=pairs,
               channels=[L2_BOOK],
               callbacks={L2_BOOK: BookCallback(book)}))
    # f.add_feed(Gateio(symbols=['BTC-USDT', 'ETH-USDT', 'ETH-BTC', 'ZKS-ETH', 'ZKS-USDT'], channels=[L2_BOOK], callbacks={L2_BOOK: BookCallback(book)}))

    # huobi_pairs = list(huobi_us_symbols().keys())
    # f.add_feed(Huobi(symbols=huobi_pairs, channels=[L2_BOOK], callbacks={L2_BOOK: BookCallback(book)}))

    f.run()
Пример #10
0
def main():
    f = FeedHandler()
    configured = []

    print("Querying exchange metadata")
    for exchange_string, exchange_class in EXCHANGE_MAP.items():
        if LIQUIDATIONS in exchange_class.info()['channels']['websocket']:
            configured.append(exchange_string)
            symbols = [
                sym for sym in exchange_class.symbols() if 'PINDEX' not in sym
            ]
            f.add_feed(
                exchange_class(subscription={LIQUIDATIONS: symbols},
                               callbacks={LIQUIDATIONS: liquidations}))
    print("Starting feedhandler for exchanges:", ', '.join(configured))
    f.run()
Пример #11
0
def main():
    ftx = FTX(config='config.yaml', subaccount='subaccount')
    print(ftx.ticker_sync('ETH-USD'))
    print(ftx.orders_sync(symbol='USDT-USD'))
    f = FeedHandler(config="config.yaml")
    f.add_feed(
        FTX(config="config.yaml",
            subaccount='subaccount',
            symbols=['BTC-USD', 'BCH-USD', 'USDT-USD'],
            channels=[TRADES, FILLS, ORDER_INFO],
            callbacks={
                TRADES: trade,
                FILLS: fill,
                ORDER_INFO: order
            }))
    f.run()
Пример #12
0
def main():
    f = FeedHandler()
    f.add_feed(
        FTX(channels=[ORDER_INFO, FILLS],
            callbacks={
                ORDER_INFO: OrderInfoCallback(order_info),
                FILLS: FillsCallback(fills)
            },
            config={
                'ftx': {
                    'key_id': os.environ['key'],
                    'key_secret': os.environ['secret'],
                    'subaccount': 'm1'
                }
            }))
    f.run()
Пример #13
0
def main():

    f = FeedHandler()
    f.add_feed(Bitmex(channels=[FUNDING, L2_BOOK], symbols=['BTC-USD-PERP'], callbacks={FUNDING: FundingQuest(host=QUEST_HOST, port=QUEST_PORT), L2_BOOK: BookQuest(host=QUEST_HOST, port=QUEST_PORT)}))
    f.add_feed(Coinbase(channels=[TRADES], symbols=['BTC-USD'], callbacks={TRADES: TradeQuest(host=QUEST_HOST, port=QUEST_PORT)}))
    f.add_feed(Coinbase(channels=[L2_BOOK], symbols=['BTC-USD'], callbacks={L2_BOOK: BookQuest(host=QUEST_HOST, port=QUEST_PORT)}))
    f.add_feed(Coinbase(channels=[TICKER], symbols=['BTC-USD'], callbacks={TICKER: TickerQuest(host=QUEST_HOST, port=QUEST_PORT)}))
    f.add_feed(Binance(candle_closed_only=False, channels=[CANDLES], symbols=['BTC-USDT'], callbacks={CANDLES: CandlesQuest(host=QUEST_HOST, port=QUEST_PORT)}))
    f.run()
Пример #14
0
def main():
    f = FeedHandler()
    f.add_feed(Bitmex(channels=[TRADES, FUNDING], pairs=['XBTUSD'], callbacks={TRADES: TradeRedis(), FUNDING: FundingRedis()}))
    f.add_feed(Bitfinex(channels=[TRADES], pairs=['BTC-USD'], callbacks={TRADES: TradeRedis()}))
    f.add_feed(Coinbase(channels=[TRADES], pairs=['BTC-USD'], callbacks={TRADES: TradeRedis()}))
    f.add_feed(Coinbase(channels=[L2_BOOK], pairs=['BTC-USD'], callbacks={L2_BOOK: BookRedis(depth=10)}))
    f.add_feed(Gemini(pairs=['BTC-USD'], callbacks={TRADES: TradeRedis()}))

    f.run()
def crawl_book_and_trade_data(symbols: List[str],
                              exchanges: List[str]) -> None:
    postgres_cfg = get_postgres_cfg_details()
    feed_handler = FeedHandler()
    for exchange in exchanges:
        feed_handler.add_feed(EXCHANGE_MAP[exchange](
            channels=[L2_BOOK, TRADES],
            symbols=symbols,
            callbacks={
                BOOK_DELTA: BookDeltaPostgres(**postgres_cfg),
                L2_BOOK: BookPostgres(**postgres_cfg),
                TRADES: TradePostgres(**postgres_cfg),
            },
        ))
        logging.info(f"{exchange} feed added.")
    logging.info("Starting crawling.")
    feed_handler.run()
Пример #16
0
def main():
    """
    Because periods cannot be in keys in documents in mongo, the bids and asks dictionaries
    are converted to BSON. They will need to be decoded after being read
    """
    f = FeedHandler()
    f.add_feed(
        Coinbase(max_depth=10,
                 channels=[L2_BOOK, TRADES, TICKER],
                 symbols=['BTC-USD'],
                 callbacks={
                     TRADES: TradeMongo('coinbase', collection='trades'),
                     L2_BOOK: BookMongo('coinbase', collection='l2_book'),
                     TICKER: TickerMongo('coinbase', collection='ticker')
                 }))

    f.run()
Пример #17
0
def main():
    try:
        p = Process(target=receiver, args=(5555, ))
        p.start()

        f = FeedHandler()
        f.add_feed(
            Coinbase(channels=[L3_BOOK, TRADES],
                     pairs=['BTC-USD'],
                     callbacks={
                         TRADES: TradeUDP(),
                         L3_BOOK: BookUDP(depth=1)
                     }))

        f.run()
    finally:
        p.terminate()
Пример #18
0
def main():
    f = FeedHandler(config="config.yaml")
    all_subscription = get_new_subscription()
    for key, value in other_subscription.items():
        all_subscription[key].update(value)
    print(all_subscription)
    deribit = Deribit(config="config.yaml",
                      max_depth=1,
                      subscription=all_subscription,
                      callbacks=callbacks)
    f.add_feed(deribit)
    f.run(start_loop=True,
          tasks=[
              do_periodically_at(
                  8, 1, 1,
                  functools.partial(subscribe_to_new_subscription, deribit))
          ])
Пример #19
0
def main():
    fh = FeedHandler()

    config = {
        TRADES: ['PI_XBTUSD'],
        TICKER: ['PI_XBTUSD', 'PI_ETHUSD'],
        L2_BOOK: ['PI_XBTUSD']
    }
    fh.add_feed(
        KrakenFutures(config=config,
                      callbacks={
                          TICKER: TickerCallback(ticker),
                          TRADES: TradeCallback(trade),
                          L2_BOOK: BookCallback(book)
                      }))

    fh.run()
Пример #20
0
def main():
    try:
        p = Process(target=receiver, args=(5672, ))

        p.start()

        f = FeedHandler()
        f.add_feed(
            Kraken(max_depth=2,
                   channels=[L2_BOOK],
                   pairs=['BTC-USD', 'ETH-USD'],
                   callbacks={L2_BOOK: BookRabbit()}))

        f.run()

    finally:
        p.terminate()
Пример #21
0
def main():
    """
    Because periods cannot be in keys in documents in mongo, the prices in L2/L3 books
    are converted to integers in the following way:
    price is * 10000 and truncated
    """
    f = FeedHandler()
    f.add_feed(
        Coinbase(channels=[TRADES, L2_BOOK],
                 pairs=['BTC-USD'],
                 callbacks={
                     TRADES: TradeMongo('coinbase', collection='trades'),
                     L2_BOOK: BookMongo('coinbase', collection='l2_book'),
                     BOOK_DELTA: BookDeltaMongo('coinbase',
                                                collection='l2_book')
                 }))

    f.run()
Пример #22
0
def main():
    f = FeedHandler()
    #for ccypair in poloniex_trading_pairs2:f.add_feed(Poloniex(channels=[ccypair], callbacks={TICKER: TickerCallback(ticker)}))
#working
    #f.add_feed(Bitfinex(pairs=['BTC-USD'], channels=[L2_BOOK, TICKER], callbacks={L2_BOOK: BookCallback(book), TICKER: TickerCallback(ticker)}))
    #f.add_nbbo([Bitfinex, Gemini, HitBTC, Bitstamp], ['BTC-USD'], nbbo_ticker)
    #f.add_feed(Poloniex(channels=['USDT-BTC', 'USDC-BTC','BTC-LSK'], callbacks={TICKER: TickerCallback(ticker)}))
    #f.add_feed(Poloniex(channels=['USDT-BTC', 'USDC-BTC'], callbacks={L2_BOOK: BookCallback(book)}))
    #f.add_feed(Poloniex(channels=['USDT-BTC', 'USDC-BTC'], callbacks={TRADES: TradeCallback(trade)}))
    #f.add_feed(Gemini(pairs=['BTC-USD'], callbacks={L2_BOOK: BookCallback(book), TRADES: TradeCallback(trade)}))
    #f.add_feed(HitBTC(channels=[TRADES], pairs=['BTC-USD'], callbacks={TRADES: TradeCallback(trade)}))
    f.add_feed(HitBTC(channels=[L2_BOOK], pairs=['BTC-USD'], callbacks={L2_BOOK: BookCallback(book)}))
    #f.add_feed(Bitmex(pairs=['XBTUSD'], channels=[FUNDING, TRADES], callbacks={FUNDING: FundingCallback(funding), TRADES: TradeCallback(trade)}))
    #f.add_feed(Bitfinex(pairs=['BTC'], channels=[FUNDING], callbacks={FUNDING: FundingCallback(funding)}))
    #f.add_feed(Bitmex(pairs=['XBTUSD'], channels=[L3_BOOK], callbacks={L3_BOOK: BookCallback(book)}))
    #f.add_feed(Bitstamp(channels=[L2_BOOK, TRADES], pairs=['BTC-USD'], callbacks={L2_BOOK: BookCallback(book), TRADES: TradeCallback(trade)})) 

    f.run()
Пример #23
0
def main():
    try:
        p = Process(target=receiver, args=(5555, ))
        p.start()
        sleep(1)

        f = FeedHandler()
        f.add_feed(
            Coinbase(channels=[L2_BOOK, TRADES],
                     symbols=['BTC-USD'],
                     callbacks={
                         TRADES: TradeSocket('udp://127.0.0.1', port=5555),
                         L2_BOOK: BookSocket('udp://127.0.0.1', port=5555),
                     }))

        f.run()
    finally:
        p.terminate()
Пример #24
0
class FeedProcessor:
    def __init__(self, hub: Hub, exchange_class: str, pair: str) -> None:
        self.feed = FeedHandler()
        self.publisher = Publisher(hub, prefix='feed_processor')
        self.pair = pair
        self._add_feed(exchange_class)

    def _add_feed(self, exchange_class: str):
        trades_feed = exchange_class(pairs=[self.pair],
                                     channels=[TRADES],
                                     callbacks={TRADES: TradeCallback(self.trade)})
        self.feed.add_feed(trades_feed)

    def run(self) -> None:
        self.feed.run()

    async def trade(self, feed, pair, order_id, timestamp, side, amount, price):
        # print(f"Timestamp: {timestamp} Feed: {feed} Pair: {pair} ID: {order_id} Side: {side} Amount: {amount} Price: {price}")
        trade = Trade(timestamp=timestamp, price=price, amount=amount)
        self.publisher.publish([self.pair, 'new-trade'], trade)
def main():
    f = FeedHandler(config="config.yaml")

    f.add_feed(DERIBIT,
               channels=[FILLS, ORDER_INFO],
               symbols=[
                   "ETH-USD-PERP", "BTC-USD-PERP", "ETH-USD-22M24",
                   "BTC-50000-22M24-call"
               ],
               callbacks={
                   FILLS: UserFillsCallback(fill),
                   ORDER_INFO: OrderInfoCallback(order)
               },
               timeout=-1)
    f.add_feed(DERIBIT,
               channels=[BALANCES],
               symbols=["BTC", "ETH"],
               callbacks={BALANCES: BalancesCallback(balance)},
               timeout=-1)
    f.run()
Пример #26
0
def main():
    f = FeedHandler()

    f.add_feed(
        Coinbase(channels=[L2_BOOK, TRADES],
                 symbols=['BTC-USD'],
                 callbacks={
                     L2_BOOK:
                     BookElastic('http://localhost:9200', numeric_type=float),
                     TRADES:
                     TradeElastic('http://localhost:9200', numeric_type=float)
                 }))
    f.add_feed(
        Bitmex(channels=[FUNDING],
               symbols=['BTC-USD'],
               callbacks={
                   FUNDING:
                   FundingElastic('http://localhost:9200', numeric_type=float)
               }))

    f.run()
Пример #27
0
def main():
    f = FeedHandler()
    f.add_feed(FTX(symbols=FTX.info()['symbols'], channels=[OPEN_INTEREST, LIQUIDATIONS],
                   callbacks={OPEN_INTEREST: OpenInterestCallback(oi),
                              LIQUIDATIONS: LiquidationCallback(liquidations)}))

    symbols = [s for s in BinanceFutures.info()['symbols'] if 'PINDEX' not in s]
    f.add_feed(BinanceFutures(symbols=symbols, channels=[OPEN_INTEREST, LIQUIDATIONS], callbacks={OPEN_INTEREST: OpenInterestCallback(oi), LIQUIDATIONS: LiquidationCallback(liquidations)}))

    f.add_feed(Deribit(symbols=['BTC-USD-PERPETUAL', 'ETH-USD-PERPETUAL'], channels=[LIQUIDATIONS, OPEN_INTEREST],
                       callbacks={OPEN_INTEREST: OpenInterestCallback(oi),
                                  LIQUIDATIONS: LiquidationCallback(liquidations)}))

    f.add_feed(OKEx(symbols=['BTC-USD-SWAP', 'ETH-USD-SWAP'], channels=[LIQUIDATIONS, OPEN_INTEREST],
                    callbacks={OPEN_INTEREST: OpenInterestCallback(oi),
                               LIQUIDATIONS: LiquidationCallback(liquidations)}))

    f.add_feed(Bitmex(symbols=['BTC-USD', 'ETH-USD'], channels=[LIQUIDATIONS, OPEN_INTEREST],
                      callbacks={OPEN_INTEREST: OpenInterestCallback(oi),
                                 LIQUIDATIONS: LiquidationCallback(liquidations)}))
    f.run()
Пример #28
0
def main():
    try:
        p = Process(target=receiver, args=(5678, ))

        p.start()

        f = FeedHandler()
        f.add_feed(
            Kraken(max_depth=1,
                   channels=[L2_BOOK],
                   symbols=['ETH-USD'],
                   callbacks={L2_BOOK: BookZMQ(port=5678)}))
        f.add_feed(
            Coinbase(channels=[TICKER],
                     symbols=['BTC-USD'],
                     callbacks={TICKER: TickerZMQ(port=5678)}))

        f.run()

    finally:
        p.terminate()
def main():
    fh = FeedHandler()

    sub = {
        OPEN_INTEREST: ['PI-BTC-USD', 'PI-ETH-USD'],
        TRADES: ['PI-BTC-USD'],
        TICKER: ['PI-BTC-USD', 'PI-ETH-USD'],
        L2_BOOK: ['PI-ETH-USD', 'PI-XRP-USD'],
        FUNDING: ['PI-BTC-USD']
    }
    fh.add_feed(
        KrakenFutures(subscription=sub,
                      callbacks={
                          OPEN_INTEREST: oi,
                          FUNDING: funding,
                          TICKER: TickerCallback(ticker),
                          TRADES: TradeCallback(trade),
                          L2_BOOK: BookCallback(book)
                      }))

    fh.run()
Пример #30
0
def main():
    f = FeedHandler()
    f.add_feed(
        Bitmex(channels=[FUNDING, L3_BOOK],
               pairs=['XBTUSD'],
               callbacks={
                   FUNDING:
                   FundingInflux('http://localhost:8086', 'example'),
                   L3_BOOK:
                   BookInflux('http://localhost:8086', 'example', depth=10)
               }))
    f.add_feed(
        Coinbase(channels=[TRADES],
                 pairs=['BTC-USD'],
                 callbacks={
                     TRADES: TradeInflux('http://localhost:8086', 'example')
                 }))
    f.add_feed(
        Coinbase(channels=[L2_BOOK],
                 pairs=['BTC-USD'],
                 callbacks={
                     L2_BOOK:
                     BookInflux('http://localhost:8086', 'example', depth=10)
                 }))

    f.run()