Ejemplo n.º 1
0
    async def find_contract(
        self,
        symbol,
        currency: str = 'USD',
        **kwargs,
    ) -> Contract:
        # use heuristics to figure out contract "type"
        try:
            sym, exch = symbol.upper().rsplit('.', maxsplit=1)
        except ValueError:
            # likely there's an embedded `.` for a forex pair
            await tractor.breakpoint()

        # futes
        if exch in ('GLOBEX', 'NYMEX', 'CME', 'CMECRYPTO'):
            con = await self.get_cont_fute(symbol=sym, exchange=exch)

        elif exch in ('FOREX'):
            currency = ''
            symbol, currency = sym.split('/')
            con = ibis.Forex(
                symbol=symbol,
                currency=currency,
            )
            con.bars_kwargs = {'whatToShow': 'MIDPOINT'}

        # commodities
        elif exch == 'CMDTY':  # eg. XAUUSD.CMDTY
            con_kwargs, bars_kwargs = _adhoc_cmdty_data_map[sym]
            con = ibis.Commodity(**con_kwargs)
            con.bars_kwargs = bars_kwargs

        # stonks
        else:
            # TODO: metadata system for all these exchange rules..
            primaryExchange = ''

            if exch in ('PURE', 'TSE'):  # non-yankee
                currency = 'CAD'
                if exch in ('PURE', 'TSE'):
                    # stupid ib...
                    primaryExchange = exch
                    exch = 'SMART'

            con = ibis.Stock(
                symbol=sym,
                exchange=exch,
                primaryExchange=primaryExchange,
                currency=currency,
            )
        try:
            exch = 'SMART' if not exch else exch
            contract = (await self.ib.qualifyContractsAsync(con))[0]

            # head = await self.get_head_time(contract)
            # print(head)

        except IndexError:
            raise ValueError(f"No contract could be found {con}")
        return contract
Ejemplo n.º 2
0
    def add_instrument(self, instrument):
        """
        Adds a qualified contract to self.instrument_contracts.
        :param instrument: str. Ticker of the instrument to be added.
        """
        self.instruments_names.append(instrument)

        # Adding Forex contracts.
        contract = ib.Forex(instrument)
        self.ib.qualifyContracts(contract)
        self.instruments_contracts[instrument] = contract
Ejemplo n.º 3
0
async def test_request_error_raised(ib):
    contract = ibi.Forex('EURUSD')
    order = ibi.MarketOrder('BUY', 100)
    orderState = await ib.whatIfOrderAsync(contract, order)
    assert orderState.commission > 0

    ib.RaiseRequestErrors = True
    badContract = ibi.Stock('XXX')
    with pytest.raises(ibi.RequestError) as exc_info:
        await ib.whatIfOrderAsync(badContract, order)
    assert exc_info.value.code == 321
Ejemplo n.º 4
0
async def main():
    tickers = ['EURUSD']
    contracts = []
    ib = ibs.IB()
    await ib.connectAsync(port=4002, clientId=2)

    print('----------- Starting Positions -----------')
    print(ib.positions())
    # [ib.cancelOrder(order) for order in ib.openOrders()]
    # print(ib.openOrders())
    # print(ib.openTrades())

    for ticker in tickers:
        con = ibs.Forex(ticker)
        await ib.qualifyContractsAsync(con)
        contracts.append(con)

    bars = ib.reqRealTimeBars(contracts[0], 5, 'MIDPOINT', True)
    bars.updateEvent += show

    def print_yes():
        print('yes!')

    ib.updateEvent += print_yes

    # for i in range(2):
    #     trades = []
    #
    #     print('\n----------- New Trades -----------')
    #     for contract in contracts:
    #         order = ibs.MarketOrder('BUY', 10000) if i % 2 == 0 else ibs.MarketOrder('SELL', 10000)
    #         trade = ib.placeOrder(contract, order)
    #         trades.append(trade)
    #
    #     status = await asyncio.gather(*[wait_for_fill(ib, trade) for trade in trades])
    #     for trade in trades:
    #         print(trade)
    #         print(f'{trade.contract.symbol}: {trade.orderStatus.avgFillPrice}')
    #         if trade.fills[0].commissionReport == ibs.CommissionReport():
    #             await trade.commissionReportEvent
    #
    #         for fill in trade.fills:
    #             print(fill.commissionReport)
    #
    #     print('Positions After Fill ...')
    #     print(ib.positions())
    #
    #     # for fill in ib.fills():
    #
    #     await asyncio.sleep(5)

    await asyncio.sleep(700)
    # ib.cancelRealTimeBars(bars)
    ib.disconnect()
def get_forex_pairs(ib_conn):
    """
    Get a list of contract IDs from the database, and qualify them in IB
    :param ib_conn:
    :param db_conn:
    :return:
    """
    currency_pairs = ["USDAUD", "USDGBP", "USDEUR"]
    contracts = [ib_insync.Forex(pair) for pair in currency_pairs]
    ib_conn.qualifyContracts(*contracts)
    return contracts
Ejemplo n.º 6
0
 def to_ib_contract(self):
     if self.asset == const.AssetClass.FX:
         return ib.Forex(self.ticker)
     elif self.asset == const.AssetClass.STK:
         return ib.Stock(self.ticker, exchange='SMART', currency='USD')
Ejemplo n.º 7
0
def _forexContract(forex: Forex) -> IB.Contract:
    return IB.Forex(
        pair=forex.symbol,
        currency=forex.currency.name,
        exchange=forex.exchange or "IDEALPRO",
    )
Ejemplo n.º 8
0
import ib_insync as ib

client = ib.IB()
client.connect('127.0.0.1', 4002, clientId=10)

contract = ib.Forex('EURUSD')
client.qualifyContracts(contract)

order = ib.MarketOrder('BUY', 69385, account=client.managedAccounts()[0])
trade = client.placeOrder(contract, order)
while not trade.isDone():
    client.waitOnUpdate()