[ts-gen] Handling commissions and fees

Michael Gruen gruenm at gmail.com
Thu Sep 17 09:30:55 EDT 2009


Folks,

Sorry for delay, I only caught the thread now - even with a
security-card-active account, the web service does not require login at all.

It works like this:

- in Account Management, you set up the Flex service, and generate a "token"
of some ~30 characters.
- you also set up a report(s) with desired fields, and IB associates an
ID(s) with it.
- With this token and query ID, you access a xml URL, which starts the
report execution and gives a "resultset-ID".
- After waiting a bit for execution, you then access a different URL, with
the resultset-ID, and retrieve the results

so after setting up the Flex service and report(s), no login is needed at
all, security is handled with the "token code".  I believe there is also an
option to limit access to specific originating IPs

below is my python code which may make the process clearer (sorry I'm a
beginner Python writer, so it may not be the most elegant - specifically, I
write to a local file and then import to a database, I could not get Python
to read directly to sqlite)




updateDB.py
-------------------------------------------------------------------------------------------------------------------------------------------------------------
import sqlite3, csv, urllib.request, urllib.parse, urllib.error, re, time

conn = sqlite3.connect("mydb9.sqlite")
cur = conn.cursor()

token = 632xxxxxxxxxxxxxxxx53730 ; query = 20xxx # this is the token issued
by IB

url = "
https://www.interactivebrokers.com/Universal/servlet/FlexStatementService.SendRequest?t=%s&q=%s"
% (token, query)
ibfile = urllib.request.urlopen(url).read().decode('utf-8')

pattern = re.compile(r'\d{10}')  #Search for 10-digit reference code
(resultset code)
m = pattern.search(ibfile)
reference_code = (m.group()) #retrieve reference code

url = "
https://www.interactivebrokers.com/Universal/servlet/FlexStatementService.GetStatement?q=%s&t=%s&v=2"
% (reference_code, token)

pattern = re.compile(r'in progress')  #If report is not completed, IB
returns an <in progress> message
for i in range(5): #try 5 times, 40s apart
    print('Try ', i,)
    time.sleep(40)
    ibfile = urllib.request.urlopen(url).read().decode('utf-8')
    if pattern.search(ibfile) == None:
        break
print('Succesfully retrieved report')

ibfile_object = open('ib.csv', 'w')
ibfile_object.write(ibfile.replace(',',''))
ibfile_object.close()
print('Saved file')

time.sleep(2) # Give the OS time to close the file


# Create table
cur.execute('''drop table IF EXISTS tbIB''')
sql = '''create table IF NOT EXISTS tbIB (
Symbol          TEXT,
Description     TEXT,
AssetClass      TEXT,
TradeID         INTEGER,
TradeDate       INTEGER,
TradeTime       INTEGER,
Quantity        INTEGER,
Multiplier       INTEGER,
TradePrice       REAL,
TradeMoney       REAL,
NetCash          REAL,
Taxes            REAL,
IBCommission     REAL,
CostBasis        REAL,
FifoPnlRealized  REAL,
NotesCodes       TEXT
)'''

cur.execute(sql)

cur.execute('''create unique index IF NOT EXISTS idx_TradeID ON
tbIB(TradeID)''')


ibfile_object = open('ib.csv', 'rt')

csvread = csv.reader(ibfile_object, delimiter='|', quotechar='"')
for line in csvread:
    if line != []:
        cur.execute('insert OR IGNORE into tbIB values
(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)', line)

conn.commit()

cur.execute('ALTER TABLE tbIB ADD COLUMN oldSymbol           TEXT')
cur.execute('ALTER TABLE tbIB ADD COLUMN Underlying          TEXT')
cur.execute('ALTER TABLE tbIB ADD COLUMN OptionType          TEXT')
cur.execute('ALTER TABLE tbIB ADD COLUMN QtyInShares         INTEGER')
cur.execute('ALTER TABLE tbIB ADD COLUMN QtyOpening          INTEGER
DEFAULT 0')
cur.execute('ALTER TABLE tbIB ADD COLUMN QtyClosing          INTEGER
DEFAULT 0')
cur.execute('ALTER TABLE tbIB ADD COLUMN QtyCumulative       INTEGER
DEFAULT 0')
cur.execute('ALTER TABLE tbIB ADD COLUMN QtyStillOpenTrx     INTEGER
DEFAULT 0')
cur.execute('ALTER TABLE tbIB ADD COLUMN QtyWashMatched      INTEGER
DEFAULT 0')
cur.execute('ALTER TABLE tbIB ADD COLUMN BasisAdjWash        Real
DEFAULT 0')
cur.execute('ALTER TABLE tbIB ADD COLUMN BasisAdjOption      Real
DEFAULT 0')
cur.execute('ALTER TABLE tbIB ADD COLUMN Trace               Text')
cur.execute('ALTER TABLE tbIB ADD COLUMN TraceWash           Text')
cur.execute('ALTER TABLE tbIB ADD COLUMN TraceOption         Text')


cur.close()
conn.close()
----------------------------------------------------------------------------------------------------------------------------------






On Thu, Sep 17, 2009 at 06:35, Ken Feng <kfmfe04 at gmail.com> wrote:

> On 9/17/09, Paul C <paulq2o0 at yahoo.co.uk> wrote:
> >
> > If the TWS is already running, it seems you can get to the IB website
> > Account Management without logging in again (i.e. without using the
> > security device a second time) by choosing "View->Account Management"
> > from the *TWS* menu.  It should then just appear in your browser (albeit
> > you may not know it, until you go find the browser window).  So if
> > you're running all week, maybe you're ok? - unless I'm misunderstanding
> > something.
> >
> > ( nb, I've just managed to automate retrieval of Trade Records from
> > the TWS 'Trades' page using the perl/ X11::GUITest approach, but it's
> > probably not robust, and is maybe asking for trouble, so I won't
> > elaborate here - it's not really shim related anyway.  The fact that
> > it's wrapped in html tags I don't see as a problem, and you can get
> > the Order_ID/Ref too, so presumably can associate a commission with an
> > order sent via the shim [and hence in a MySql table]. But it involves
> > sending keystrokes to the running TWS, which I don't much like. )
>
> That's great!  I wasn't aware of that feature - I thought I had to do
> it through the website by hand!
>
> Since I am already using Jemmy to manage the perpetual log-in, I can
> use it to bring up the browser - I need to figure out how to scrape it
> at that point.  I will try to use Jemmy or some java-related tool
> since I'm using it to drive TWS.
>
> Anyhow, thank you for pointing to a way out of this conundrum!
>
> - Ken
> _______________________________________________
> ts-general mailing list
> ts-general at trading-shim.org
> http://www.trading-shim.org/mailman/listinfo/ts-general
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.trading-shim.org/pipermail/ts-general/attachments/20090917/4eaf2419/attachment.html 


More information about the ts-general mailing list