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
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
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
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
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')
def _forexContract(forex: Forex) -> IB.Contract: return IB.Forex( pair=forex.symbol, currency=forex.currency.name, exchange=forex.exchange or "IDEALPRO", )
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()