Historical Bars
Fetch one trading day of 5-minute SPY bars and print the first and last.
What this shows
- Building a
Contractwithcon_idso the request is unambiguous. - Calling
req_historical_datawith duration / bar size / what-to-show. - Driving the callback loop on a daemon thread with
EClient.run. - Reading OHLCV out of the bar object.
Run it
IB_USERNAME=... IB_PASSWORD=... python examples/hello_bar_data.py
Source
"""Recipe: fetch 1 day of 5-minute SPY bars, print first/last bar.
Usage:
IB_USERNAME=... IB_PASSWORD=... python examples/hello_bar_data.py
"""
import os
import threading
from ibx import EClient, EWrapper, Contract
class BarsWrapper(EWrapper):
def __init__(self):
self.connected = threading.Event()
self.bars = []
self.done = threading.Event()
def next_valid_id(self, order_id):
self.connected.set()
def historical_data(self, req_id, bar):
self.bars.append(bar)
def historical_data_end(self, req_id, start, end):
self.done.set()
def error(self, req_id, code, msg, advanced=""):
if code not in (2104, 2106, 2158):
print(f"[error] {code}: {msg}")
w = BarsWrapper()
c = EClient(w)
c.connect(
username=os.environ["IB_USERNAME"],
password=os.environ["IB_PASSWORD"],
host="cdc1.ibllc.com",
paper=True,
)
threading.Thread(target=c.run, daemon=True).start()
if not w.connected.wait(timeout=15):
raise RuntimeError("connect failed")
spy = Contract()
spy.con_id = 756733
spy.symbol = "SPY"
spy.sec_type = "STK"
spy.exchange = "SMART"
spy.currency = "USD"
c.req_historical_data(
1, spy,
end_date_time="",
duration_str="1 D",
bar_size_setting="5 mins",
what_to_show="TRADES",
use_rth=1,
)
if not w.done.wait(timeout=30):
raise RuntimeError("historical_data_end not received")
print(f"bars: {len(w.bars)}")
if w.bars:
first, last = w.bars[0], w.bars[-1]
print(f" first: {first.date} O={first.open} H={first.high} L={first.low} C={first.close} V={first.volume}")
print(f" last : {last.date} O={last.open} H={last.high} L={last.low} C={last.close} V={last.volume}")
c.disconnect()