Here's the current code:
from time import sleep, strftime, localtime
from ib.ext.Contract import Contract
from ib.opt import ibConnection, message
from Tkinter import *
import _mysql
import string
class App:
def __init__(self, master):
#list to keep data series, list for multiple symbols, j to keep track of current symbol
self.newDataList = []
self.new_symbolinput = []
self.j=0
#connect here to prevent double connections later on...
self.con = ibConnection()
self.con.register(self.historical_data_handler, message.HistoricalData)
self.con.connect()
#begin gui (labels should make it fairly self-explanatory)
frame = Frame(master)
frame.pack()
self.mysqlinfo_label = Label(frame, text='MySQL fields:')
self.mysqlinfo_label.grid(row=0)
self.label_host = Label(frame, text='Host:')
self.label_host.grid(row=1)
host_text = StringVar()
host_text.set("127.0.0.1")
self.entry_host = Entry(frame, textvariable=host_text)
self.entry_host.grid(row=1, column=1)
self.label_user = Label(frame, text='User:')
self.label_user.grid(row=2)
user_text = StringVar()
user_text.set("root")
self.entry_user = Entry(frame, textvariable=user_text)
self.entry_user.grid(row=2, column=1)
self.label_password = Label(frame, text='Password:')
self.label_password.grid(row=3)
self.entry_password = Entry(frame, show="*")
self.entry_password.grid(row=3, column=1)
self.label_database = Label(frame, text='Database:')
self.label_database.grid(row=4)
database_text = StringVar()
database_text.set("stocks")
self.entry_database = Entry(frame, textvariable=database_text)
self.entry_database.grid(row=4, column=1)
self.label_empty = Label(frame, text='')
self.label_empty.grid(row=5)
self.label_twsfields = Label(frame, text='TWS fields:')
self.label_twsfields.grid(row=6)
self.label_server = Label(frame, text='Server:')
self.label_server.grid(row=7)
twsserver_text = StringVar()
twsserver_text.set("127.0.0.1")
self.entry_server = Entry(frame, textvariable=twsserver_text)
self.entry_server.grid(row=7, column=1)
self.label_empty = Label(frame, text='')
self.label_empty.grid(row=8)
self.label_twscontractinfo = Label(frame, text='TWS contract info:')
self.label_twscontractinfo.grid(row=9)
self.label_symbol = Label(frame, text='Symbol:')
self.label_symbol.grid(row=10)
self.entry_symbol = Entry(frame)
self.entry_symbol.grid(row=10, column=1)
self.label_barsize = Label(frame, text='Bar Size:')
self.label_barsize.grid(row=11)
self.barsize_selected = StringVar(frame)
self.barsize_selected.set("1 min")
self.optionmenu_barsize = OptionMenu(frame, self.barsize_selected, "30 secs", "1 min", "5 mins", "10 mins", "15 mins", "1 hour", "4 hours", "1 day")
self.optionmenu_barsize.grid(row=11, column=1)
self.label_duration = Label(frame, text='Duration:')
self.label_duration.grid(row=12)
self.duration_selected = StringVar(frame)
self.duration_selected.set("1 W")
self.optionmenu_duration = OptionMenu(frame, self.duration_selected, "1 H", "4 H", "1 D", "1 W", "1 M", "1 Y")
self.optionmenu_duration.grid(row=12, column=1)
self.label_empty = Label(frame, text='')
self.label_empty.grid(row=13)
self.button_download = Button(frame, text="Download", command=self.tws_connect)
self.button_download.grid(row=14, column=1)
self.button_import = Button(frame, text="Import", command=self.mysql_connect)
self.button_import.grid(row=15, column=1)
self.label_empty = Label(frame, text='')
self.label_empty.grid(row=16)
#function for sending historical data requests
def tws_connect(self):
print "connecting to tws..."
print "tws server: " + self.entry_server.get()
self.new_symbolinput = string.split(self.entry_symbol.get(), ',')
print self.new_symbolinput
#run through all symbols, requesting historical data
self.symbol_id = 0
for i in self.new_symbolinput:
print i
qqq = Contract()
qqq.m_symbol = i
qqq.m_secType = 'STK'
qqq.m_exchange = 'SMART'
qqq.m_currency = 'USD'
endtime = strftime('%Y%m%d %H:%M:%S')
durationreq = '%s' % self.duration_selected.get()
barsizereq = '%s' % self.barsize_selected.get()
self.con.reqHistoricalData(self.symbol_id, qqq, '', durationreq, barsizereq, 'TRADES', 1, 2)
self.symbol_id = self.symbol_id + 1
#if doing more than 60 symbols, this is a simple way to avoid IB's 60symbol/10min limit...
#function for putting data into csv file and, eventually, into mysql database
def mysql_connect(self):
print "MySQL host: " + self.entry_host.get()
print "MySQL user: " + self.entry_user.get()
print "MySQL database: " + self.entry_database.get()
#required for IB API
def historical_data_handler(self, msg):
print msg.reqId, msg.date, msg.open, msg.high, msg.low, msg.close, msg.volume
#don't add 'finished...' statement to data list
if ('finished' in str(msg.date)) == False:
new_symbol = self.new_symbolinput[msg.reqId]
dataStr = '%s, %s, %s, %s, %s, %s, %s' % (new_symbol, strftime("%Y-%m-%d %H:%M:%S", localtime(int(msg.date))), msg.open, msg.high, msg.low, msg.close, msg.volume)
self.newDataList.append(dataStr)
#if 'finished...' appears jump to next symbol (THIS IS BROKEN because IB doesn't necessarily send requests back to you in the order sent to them...)
else:
new_symbol = self.new_symbolinput[msg.reqId]
filename = 'minutetrades' + new_symbol + '.csv'
csvfile = open('csv_day/' + filename,'wb')
for item in self.newDataList:
csvfile.write('%s \n' % item)
csvfile.close()
self.newDataList = []
root = Tk()
root.title('Historical Data: Download and Import')
app = App(root)
#run gui
root.mainloop()
No comments:
Post a Comment