Modified:
trunk/profit/lib/session/__init__.py
trunk/profit/lib/session/collection.py
trunk/profit/workbench/accountdisplay.py
trunk/profit/workbench/centraltabs.py
trunk/profit/workbench/executionsdisplay.py
trunk/profit/workbench/tickerdisplay.py
Log:
Less crap.
Modified: trunk/profit/lib/session/__init__.py
==============================================================================
--- trunk/profit/lib/session/__init__.py (original)
+++ trunk/profit/lib/session/__init__.py Wed Jul 23 02:08:37 2008
@@ -22,12 +22,15 @@
from profit.lib.session.savethread import SaveThread
from profit.lib.strategy.builder import SessionStrategyBuilder
-from profit.lib.models import accountdata
-class SessionModels(object):
+class DataMaps(object):
def __init__(self, session):
- self.accountDataAll = accountdata.AllAccountData(session)
- self.accountDataLast = accountdata.LatestAccountData(session)
+ self.account = collection.AccountCollection(session)
+ self.historical = collection.HistoricalDataCollection(session)
+ self.ticker = collection.TickerCollection(session)
+ self.error = collection.ErrorDataCollection(session)
+ self.order = collection.OrderDataCollection(session)
+
class Session(QObject):
""" This is the big-honkin Session class.
@@ -38,12 +41,10 @@
self.strategy = strategy if strategy else SessionStrategyBuilder(self)
self.connection = self.filename = None
self.messages = []
- self.bareMessages = []
+ self.messagesBare = []
+ self.messagesTyped = {}
self.savedLength = 0
- self.typedMessages = {}
- self.tickerCollection = collection.TickerCollection(self)
- self.historicalDataCollection = collection.HistoricalDataCollection(self)
- self.models = SessionModels(self)
+ self.dataMaps = DataMaps(self)
def __str__(self):
""" x.__str__() <==> str(x)
@@ -184,18 +185,18 @@
@keyparam mtime=time message timestamp or function to generate timestamp
@return None
"""
- messages = self.messages
try:
mtime = mtime()
except (TypeError, ):
pass
+ messages = self.messages
current = (mtime, message)
messages.append(current)
- typename = message.typeName
- typed = self.typedMessages.setdefault(typename, [])
- typed.append(current + (len(messages), ))
- self.bareMessages.append(message)
- self.emit(SIGNAL(typename), message)
+ self.messagesBare.append(message)
+ typeName = message.typeName
+ typedMessages = self.messagesTyped.setdefault(typeName, [])
+ typedMessages.append(current + (len(messages), ))
+ self.emit(SIGNAL(typeName), message)
def requestTickers(self):
""" Request market data and depth for each of the strategy contracts.
@@ -384,3 +385,12 @@
self.connect(thread, Signals.terminated, self.exportTerminated)
thread.start()
self.emit(Signals.sessionStatus, 'Started session export.')
+
+ def iterMessageTypes(self, *types):
+ for key in types:
+ try:
+ key = key.__name__
+ except (AttributeError, ):
+ pass
+ for msgTimeIndex in self.messagesTyped.get(key, ()):
+ yield msgTimeIndex
Modified: trunk/profit/lib/session/collection.py
==============================================================================
--- trunk/profit/lib/session/collection.py (original)
+++ trunk/profit/lib/session/collection.py Wed Jul 23 02:08:37 2008
@@ -21,10 +21,9 @@
QObject.__init__(self)
self.session = session
self.data = {}
- if session:
- session.registerMeta(self)
- for signal in self.sessionResendSignals:
- self.connect(self, signal, session, signal)
+ session.registerMeta(self)
+ for signal in self.sessionResendSignals:
+ self.connect(self, signal, session, signal)
def __contains__(self, item):
return item in self.data
@@ -38,6 +37,9 @@
def keys(self):
return self.data.keys()
+ def items(self):
+ return self.data.items()
+
def setdefault(self, key, default):
return self.data.setdefault(key, default)
@@ -57,7 +59,6 @@
try:
iv = float(message.value)
except (ValueError, ):
- ## log this
return
else:
acctdata = self[key] = \
@@ -115,7 +116,7 @@
if message.date.startswith('finished'):
reqId = message.reqId
reqData = self.setdefault(reqId, {})
- histMsgs = self.session.typedMessages['HistoricalData']
+ histMsgs = self.session.messagesTyped['HistoricalData']
reqData['messages'] = self.historyMessages(reqId, histMsgs)
self.emit(Signals.historicalDataFinish, reqId)
Modified: trunk/profit/workbench/accountdisplay.py
==============================================================================
--- trunk/profit/workbench/accountdisplay.py (original)
+++ trunk/profit/workbench/accountdisplay.py Wed Jul 23 02:08:37 2008
@@ -22,14 +22,9 @@
self.setHorizontalHeaderLabels(self.columnTitles)
self.items = {}
self.session = session
- try:
- messages = session.typedMessages['UpdateAccountValue']
- except (KeyError, ):
- pass
- else:
- slot = self.on_session_UpdateAccountValue
- for mrec in messages:
- slot(mrec[1])
+ fillSlot = self.on_session_UpdateAccountValue
+ for mrec in session.iterMessageTypes('UpdateAccountValue'):
+ fillSlot(mrec[1])
session.registerMeta(self)
def on_session_UpdateAccountValue(self, message):
@@ -66,13 +61,13 @@
self.dataModel = model = AccountTableModel(session, self)
plot = self.plot
plot.plotButton.setVisible(False)
- plot.setSessionPlot(session, session.accountCollection, 'account')
+ plot.setSessionPlot(session, session.dataMaps.account, 'account')
plot.controlsTreeModel = model
plot.controlsTree.setModel(model)
plot.controlsTree.header().show()
- for key, series in session.accountCollection.data.items():
+ for key, series in session.dataMaps.account.items():
self.newPlotSeries(
- key, series, session.accountCollection.last.get(key, None))
+ key, series, session.dataMaps.account.last.get(key, None))
connect = self.connect
connect(session, Signals.createdAccountData, self.newPlotSeries)
connect(
Modified: trunk/profit/workbench/centraltabs.py
==============================================================================
--- trunk/profit/workbench/centraltabs.py (original)
+++ trunk/profit/workbench/centraltabs.py Wed Jul 23 02:08:37 2008
@@ -99,7 +99,7 @@
if tickerIdValid:
widget = TickerPlotDisplay(self)
session = self.session
- widget.setSessionPlot(session, session.tickerCollection, tickerId)
+ widget.setSessionPlot(session, session.dataMaps.ticker, tickerId)
index = self.addTab(widget, symbol)
icon = QIcon(item.data(Qt.DecorationRole))
self.setTextIconCurrentTab(index, symbol, icon)
Modified: trunk/profit/workbench/executionsdisplay.py
==============================================================================
--- trunk/profit/workbench/executionsdisplay.py (original)
+++ trunk/profit/workbench/executionsdisplay.py Wed Jul 23 02:08:37 2008
@@ -98,7 +98,7 @@
@param message ExecDetails message instance
@return None
"""
- self.messageIndexes.append(self.session.bareMessages.index(message))
+ self.messageIndexes.append(self.session.messagesBare.index(message))
self.emit(Signals.layoutChanged)
def data(self, index, role):
Modified: trunk/profit/workbench/tickerdisplay.py
==============================================================================
--- trunk/profit/workbench/tickerdisplay.py (original)
+++ trunk/profit/workbench/tickerdisplay.py Wed Jul 23 02:08:37 2008
@@ -8,21 +8,23 @@
from itertools import ifilter
from string import Template
-from PyQt4.QtCore import QUrl, QVariant, Qt, pyqtSignature
-from PyQt4.QtGui import QAction, QApplication, QFrame, QIcon, QMenu
+from PyQt4.QtCore import QVariant, Qt, pyqtSignature
+from PyQt4.QtGui import QAction, QFrame, QIcon, QMenu
from ib.ext.TickType import TickType
from ib.opt.message import TickPrice
from profit.lib import defaults
-from profit.lib.core import (SessionHandler, Settings, Signals,
- nameIn, DataRoles, )
+from profit.lib.core import (SessionHandler, SettingsHandler, Signals,
+ nameIn, DataRoles, instance)
from profit.lib.gui import (UrlRequestor, ValueTableItem, separator,
makeUrlAction, )
from profit.workbench.portfoliodisplay import replayPortfolio
from profit.workbench.widgets.ui_tickerdisplay import Ui_TickerDisplay
+##
+# Maps ticktype fields to column numbers
fieldColumns = {
TickType.ASK_SIZE : 3,
TickType.ASK : 4,
@@ -34,6 +36,13 @@
def replayTick(messages, symbols, callback):
+ """ Sends callback last message for every symbol and field
+
+ @param messages session message sequence
+ @param symbols mapping of symbol:tickerIds
+ @param callback function to call with replayed messages
+ @return None
+ """
isMsg = nameIn('TickSize', 'TickPrice')
for symbol, tickerId in symbols.items():
for field in fieldColumns.keys():
@@ -44,36 +53,43 @@
break
-def fakeTickerMessages(symbol, tickerId):
+def fakeTickerMessages(tickerId):
+ """ Generates fake TickPrice messages for every ticker field
+
+ @param tickerId ticker id
+ @return None
+ """
for field in fieldColumns:
- yield TickPrice(tickerId=tickerId, field=field, price=0, canAutoExecute=False)
+ yield TickPrice(tickerId=tickerId, field=field, price=0,
+ canAutoExecute=False)
+
+class TickerDisplay(QFrame, Ui_TickerDisplay, SessionHandler,
+ SettingsHandler, UrlRequestor):
+ """
-class TickerDisplay(QFrame, Ui_TickerDisplay, SessionHandler, UrlRequestor):
+ """
def __init__(self, parent=None):
QFrame.__init__(self, parent)
self.setupUi(self)
- self.symbols = {}
self.tickerItems = {}
- self.settings = Settings()
self.tickerTable.verticalHeader().hide()
- self.contextActions = [separator(), self.actionChart,
self.actionOrder, separator(), ]
- app = QApplication.instance()
- self.connect(self, Signals.openUrl, app, Signals.openUrl)
- self.connect(self, Signals.tickerClicked, app, Signals.tickerClicked)
+ app = instance()
+ connect = self.connect
+ connect(self, Signals.openUrl, app, Signals.openUrl)
+ connect(self, Signals.tickerClicked, app, Signals.tickerClicked)
self.requestSession()
def setSession(self, session):
self.session = session
- symbols = self.symbols
- symbols.update(session.strategy.symbols())
+ symbols = session.strategy.symbols()
replayTick(session.messages, symbols,
self.on_session_TickPrice_TickSize)
replayPortfolio(session.messages, self.on_session_UpdatePortfolio)
session.registerMeta(self)
if not session.messages:
- for symbol, tickerId in symbols.items():
- for msg in fakeTickerMessages(symbol, tickerId):
+ for tickerId in symbols.values():
+ for msg in fakeTickerMessages(tickerId):
self.on_session_TickPrice_TickSize(msg)
@pyqtSignature('')
@@ -96,12 +112,17 @@
def on_closePosition(self):
print '## close position order dialog'
- def menuActions(self, index):
+ def basicActions(self, index):
data = index.data()
symbol = data.toString()
icon = QIcon(index.data(Qt.DecorationRole))
- actions = [QAction(icon, symbol, None), ]
- actions.extend(self.contextActions)
+ actions = [
+ QAction(icon, symbol, None),
+ separator(),
+ self.actionChart,
+ self.actionOrder,
+ separator(),
+ ]
for act in actions:
act.setData(data)
return actions
@@ -145,7 +166,7 @@
row = item.row()
index = table.model().index(row, 0)
if index and index.isValid():
- actions = self.menuActions(index)
+ actions = self.basicActions(index)
close = self.closePositionAction(row)
if close:
actions.insert(-1, close)
@@ -158,27 +179,25 @@
col = index.column()
row = index.row()
item = self.tickerTable.item(row, 0)
- import __builtin__
- __builtin__.__dict__['i'] = item
-
sym = str(index.data().toString())
+ symbols = self.session.strategy.symbols()
try:
- tid = self.symbols[sym]
+ tid = symbols[sym]
except (KeyError, ):
- return
-
- item.setData(DataRoles.tickerId, QVariant(tid), )
- item.setData(DataRoles.tickerSymbol, QVariant(sym))
-
- if (0 <= col <= 2):
- self.emit(Signals.tickerClicked, item)
- elif (2 < col < 9):
- self.emit(Signals.tickerClicked, item, col)
+ pass
+ else:
+ item.setData(DataRoles.tickerId, QVariant(tid), )
+ item.setData(DataRoles.tickerSymbol, QVariant(sym))
+ if (0 <= col <= 2):
+ self.emit(Signals.tickerClicked, item)
+ elif (2 < col < 9):
+ self.emit(Signals.tickerClicked, item, col)
def on_session_UpdatePortfolio(self, message):
sym = message.contract.m_symbol
+ symbols = self.session.strategy.symbols()
try:
- tid = self.symbols[sym]
+ tid = symbols[sym]
items = self.tickerItems[tid]
except (KeyError, ):
pass
@@ -197,7 +216,8 @@
items = self.tickerItems[tid]
except (KeyError, ):
items = self.tickerItems[tid] = table.newItemsRow()
- sym = dict([(b, a) for a, b in self.symbols.items()])[tid]
+ symbols = self.session.strategy.symbols()
+ sym = dict([(b, a) for a, b in symbols.items()])[tid]
items[0].setSymbol(sym)
items[0].tickerId = tid
for item in items[1:]:
@@ -211,4 +231,3 @@
pass
else:
items[index].setValue(value)
- #table.resizeColumnToContents(index)