[ibpy] r344 committed - Adds ib.opt.messagetools module and a small demo for its use.

7 views
Skip to first unread message

ib...@googlecode.com

unread,
Dec 5, 2009, 5:18:35 PM12/5/09
to ibpy-...@googlegroups.com
Revision: 344
Author: troy.melhase
Date: Sat Dec 5 14:18:18 2009
Log: Adds ib.opt.messagetools module and a small demo for its use.
http://code.google.com/p/ibpy/source/detail?r=344

Added:
/trunk/demo/filters
/trunk/ib/opt/messagetools.py

=======================================
--- /dev/null
+++ /trunk/demo/filters Sat Dec 5 14:18:18 2009
@@ -0,0 +1,49 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+##
+# This script is an exmple of using the ib.opt.messagetools module.
+##
+
+from time import sleep
+from ib.ext.Contract import Contract
+from ib.ext.TickType import TickType
+from ib.opt import ibConnection, message
+from ib.opt import messagetools
+
+def my_account_handler(msg):
+ print msg
+
+
+def my_tick_handler(msg):
+ print msg
+
+
+# wrap our tick handler to get only bid size
+tick_handler = messagetools.messageFilter(my_tick_handler, lambda
m:m.field==TickType.BID_SIZE)
+
+
+# another way to do it
+tick_handler = messagetools.bidSizeFilter(my_tick_handler)
+
+
+# wrap our account handler to get only cash values
+cash_handler = messagetools.messageFilter(my_account_handler, lambda
m:m.key.lower().count('cash'))
+
+
+if __name__ == '__main__':
+ con = ibConnection()
+ con.register(cash_handler, 'UpdateAccountValue')
+ con.register(tick_handler, message.TickSize, message.TickPrice)
+ con.connect()
+
+ def inner():
+ con.reqAccountUpdates(1, '')
+ qqqq = Contract()
+ qqqq.m_symbol = 'QQQQ'
+ qqqq.m_secType = 'STK'
+ qqqq.m_exchange = 'SMART'
+ con.reqMktData(1, qqqq, '', False)
+
+ inner()
+ sleep(5)
=======================================
--- /dev/null
+++ /trunk/ib/opt/messagetools.py Sat Dec 5 14:18:18 2009
@@ -0,0 +1,38 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from functools import partial, wraps
+
+from ib.ext.TickType import TickType
+
+
+##
+# To programmatically generate the TickType filters, use something like
this sketch:
+#
+# vs = [(name, value) for name, value in [(name, getattr(TickType, name))
+# for name in dir(TickType)] if type(value)==int]
+# titlevalues = [(title[0].lower()+title[1:], value)
+# for title in [''.join([part.title() for part in name.split('_')])
+# for name, value in vs]]
+
+
+def messageFilter(function, predicate=lambda msg:True):
+ @wraps(function)
+ def inner(msg):
+ if predicate(msg):
+ return function(msg)
+ return inner
+
+
+askSizeFilter = partial(messageFilter, predicate=lambda
msg:msg.field==TickType.ASK_SIZE)
+askPriceFilter = partial(messageFilter, predicate=lambda
msg:msg.field==TickType.ASK)
+
+bidSizeFilter = partial(messageFilter, predicate=lambda
msg:msg.field==TickType.BID_SIZE)
+bidPriceFilter = partial(messageFilter, predicate=lambda
msg:msg.field==TickType.BID)
+
+lastSizeFilter = partial(messageFilter, predicate=lambda
msg:msg.field==TickType.LAST_SIZE)
+lastPriceFilter = partial(messageFilter, predicate=lambda
msg:msg.field==TickType.LAST)
+
+
+# We don't need functions for filtering by message type because that's
+# what the reader/receiver/dispatcher already does.
Reply all
Reply to author
Forward
0 new messages