[profitpy commit] r310 - in trunk: examples profit/lib profit/lib/models profit/lib/session profit/lib/strategy pro...

3 views
Skip to first unread message

codesite...@google.com

unread,
Jul 26, 2008, 1:15:35 AM7/26/08
to profitp...@googlegroups.com
Author: troy.melhase
Date: Fri Jul 25 22:14:14 2008
New Revision: 310

Added:
trunk/profit/lib/__init__.py
- copied, changed from r307, /trunk/profit/lib/core.py
Removed:
trunk/profit/lib/core.py
trunk/profit/workbench/collectordisplay.py
trunk/profit/workbench/widgets/ui_collectordisplay.ui
Modified:
trunk/examples/accountsummary.py
trunk/profit/lib/gui.py
trunk/profit/lib/models/__init__.py
trunk/profit/lib/models/messages.py
trunk/profit/lib/scripttools.py
trunk/profit/lib/session/__init__.py
trunk/profit/lib/session/collection.py
trunk/profit/lib/strategy/builder.py
trunk/profit/lib/widgets/filterbar.py
trunk/profit/lib/widgets/plotitemdialog.py
trunk/profit/lib/widgets/shell.py
trunk/profit/lib/widgets/sourceeditor.py
trunk/profit/lib/widgets/webbrowser.py
trunk/profit/neuralnetdesigner/main.py
trunk/profit/neuralnetdesigner/network_test.py
trunk/profit/neuralnetdesigner/test.py
trunk/profit/neuralnetdesigner/train_test.py
trunk/profit/strategydesigner/main.py
trunk/profit/workbench/accountdisplay.py
trunk/profit/workbench/centraltabs.py
trunk/profit/workbench/connectiondisplay.py
trunk/profit/workbench/executionsdisplay.py
trunk/profit/workbench/historicaldatadisplay.py
trunk/profit/workbench/main.py
trunk/profit/workbench/messagedisplay.py
trunk/profit/workbench/orderdisplay.py
trunk/profit/workbench/portfoliodisplay.py
trunk/profit/workbench/sessionreplay.py
trunk/profit/workbench/sessiontree.py
trunk/profit/workbench/settingsdialog.py
trunk/profit/workbench/strategydisplay.py
trunk/profit/workbench/tickerdisplay.py
trunk/profit/workbench/tickerplotdisplay.py

Log:
Merged profit.lib.core into just profit.lib. Updated references to reflect.

Modified: trunk/examples/accountsummary.py
==============================================================================
--- trunk/examples/accountsummary.py (original)
+++ trunk/examples/accountsummary.py Fri Jul 25 22:14:14 2008
@@ -8,7 +8,7 @@
from PyQt4.QtGui import QItemDelegate, QStandardItem, QStandardItemModel
from PyQt4.QtGui import QApplication, QFrame, QLCDNumber

-from profit.lib.core import Settings, Signals
+from profit.lib import Settings, Signals
from profit.lib.gui import ValueColorItem

from .ui_accountsummary import Ui_AccountSummary

Copied: trunk/profit/lib/__init__.py (from r307, /trunk/profit/lib/core.py)
==============================================================================
--- /trunk/profit/lib/core.py (original)
+++ trunk/profit/lib/__init__.py Fri Jul 25 22:14:14 2008
@@ -5,21 +5,52 @@
# Distributed under the terms of the GNU General Public License v2
# Author: Troy Melhase <tr...@gci.net>

+import logging
+import sys
+from cPickle import dumps, loads
+from PyQt4.QtCore import (QCoreApplication, QPoint, QSettings, QSize,
+ QVariant, Qt, SIGNAL, SLOT)

## this module is generally the first to get imported by one of the
## gui apps, so we execute our ugly hack here.
-import sys
if 'profit_rc' not in sys.modules:
- import profit.lib.widgets.profit_rc
- sys.modules['profit_rc'] = profit.lib.widgets.profit_rc
+ from profit.lib.widgets import profit_rc
+ sys.modules['profit_rc'] = profit_rc
+ del(profit_rc)
## now back to our regularly scheduled programming.

+logging.basicConfig(level=logging.DEBUG,
+ format='%(asctime)s %(levelname)s %(message)s')

-from cPickle import dumps, loads

-from PyQt4.QtCore import (QCoreApplication, QPoint, QSettings, QSize,
- QVariant, Qt, SIGNAL, SLOT)
-from profit.lib import logging
+def importName(name, reloaded=False):
+ """ import and return a module by name in dotted form
+
+ Copied from the Python lib docs.
+
+ @param name module name as string
+ @return module object
+ """
+ mod = __import__(name)
+ if reloaded:
+ reload(mod)
+ for comp in name.split('.')[1:]:
+ mod = getattr(mod, comp)
+ if reloaded:
+ reload(mod)
+ return mod
+
+
+def importItem(name, reloaded=False):
+ """ import an item from a module by dotted name
+
+ @param name module and attribute string, i.e., foo.bar.baz
+ @return value of name from module
+ """
+ names = name.split('.')
+ modname, itemname = names[0:-1], names[-1]
+ mod = importName(str.join('.', modname), reloaded=True)
+ return getattr(mod, itemname)


class Signals:
@@ -191,6 +222,7 @@
url = nextRoleId()
urlTitle = nextRoleId()
strategyName = nextRoleId()
+ displayImportName = nextRoleId()

typeMap = {
tickerId:int,

Modified: trunk/profit/lib/gui.py
==============================================================================
--- trunk/profit/lib/gui.py (original)
+++ trunk/profit/lib/gui.py Fri Jul 25 22:14:14 2008
@@ -9,7 +9,7 @@
from PyQt4.QtGui import QAction, QBrush, QColor, QDesktopServices,
QIcon, QMessageBox
from PyQt4.QtGui import QPixmap, QTableWidgetItem, QStandardItem

-from profit.lib.core import DataRoles, Signals, valueAlign
+from profit.lib import DataRoles, Signals, valueAlign


class ValueColorItem(object):
@@ -181,3 +181,11 @@
action.setData(QVariant(url))
action.setToolTip(toolTip)
return action
+
+
+def makeUrlItem(v):
+ item = QStandardItem(v)
+ item.setData(QVariant(v), DataRoles.url)
+ item.setData(QVariant(''), DataRoles.urlTitle)
+ return item
+

Modified: trunk/profit/lib/models/__init__.py
==============================================================================
--- trunk/profit/lib/models/__init__.py (original)
+++ trunk/profit/lib/models/__init__.py Fri Jul 25 22:14:14 2008
@@ -6,7 +6,7 @@
# Author: Troy Melhase <tr...@gci.net>

from PyQt4.QtCore import Qt, QModelIndex, QObject,
QAbstractTableModel, QVariant, QAbstractItemModel
-from profit.lib.core import Signals
+from profit.lib import Signals


class ListStorage(QObject):

Modified: trunk/profit/lib/models/messages.py
==============================================================================
--- trunk/profit/lib/models/messages.py (original)
+++ trunk/profit/lib/models/messages.py Fri Jul 25 22:14:14 2008
@@ -6,7 +6,7 @@

from time import ctime
from PyQt4.QtCore import Qt, QAbstractTableModel, QModelIndex, QVariant
-from profit.lib.core import Signals
+from profit.lib import Signals


class MessagesTableModel(QAbstractTableModel):

Modified: trunk/profit/lib/scripttools.py
==============================================================================
--- trunk/profit/lib/scripttools.py (original)
+++ trunk/profit/lib/scripttools.py Fri Jul 25 22:14:14 2008
@@ -13,7 +13,7 @@

from PyQt4.QtCore import QCoreApplication, QThread

-from profit.lib.core import Signals
+from profit.lib import Signals
from profit.lib.session import Session

Modified: trunk/profit/lib/session/__init__.py
==============================================================================
--- trunk/profit/lib/session/__init__.py (original)
+++ trunk/profit/lib/session/__init__.py Fri Jul 25 22:14:14 2008
@@ -17,7 +17,7 @@
from ib.ext.ExecutionFilter import ExecutionFilter

from profit.lib import logging
-from profit.lib.core import Signals
+from profit.lib import Signals
from profit.lib.session import collection
from profit.lib.session.savethread import SaveThread
from profit.lib.strategy.builder import SessionStrategyBuilder

Modified: trunk/profit/lib/session/collection.py
==============================================================================
--- trunk/profit/lib/session/collection.py (original)
+++ trunk/profit/lib/session/collection.py Fri Jul 25 22:14:14 2008
@@ -11,7 +11,7 @@

from PyQt4.QtCore import QObject, QThread
from profit.lib import logging
-from profit.lib.core import Signals
+from profit.lib import Signals


class DataCollection(QObject):

Modified: trunk/profit/lib/strategy/builder.py
==============================================================================
--- trunk/profit/lib/strategy/builder.py (original)
+++ trunk/profit/lib/strategy/builder.py Fri Jul 25 22:14:14 2008
@@ -11,7 +11,7 @@

from PyQt4.QtCore import QObject

-from profit.lib.core import Signals, instance
+from profit.lib import Signals, instance
from profit.lib.series import Series, MACDHistogram

from ib.ext.Contract import Contract

Modified: trunk/profit/lib/widgets/filterbar.py
==============================================================================
--- trunk/profit/lib/widgets/filterbar.py (original)
+++ trunk/profit/lib/widgets/filterbar.py Fri Jul 25 22:14:14 2008
@@ -7,7 +7,7 @@
from PyQt4.QtCore import pyqtSignature
from PyQt4.QtGui import QWidget

-from profit.lib.core import Signals
+from profit.lib import Signals
from profit.lib.widgets.ui_filterbar import Ui_FilterBar

Modified: trunk/profit/lib/widgets/plotitemdialog.py
==============================================================================
--- trunk/profit/lib/widgets/plotitemdialog.py (original)
+++ trunk/profit/lib/widgets/plotitemdialog.py Fri Jul 25 22:14:14 2008
@@ -16,7 +16,7 @@
from PyQt4.QtGui import QPainter, QPen, QPixmap
from PyQt4.Qwt5 import QwtPlot, QwtPlotCurve, QwtPlotMarker, QwtSymbol

-from profit.lib.core import Settings
+from profit.lib import Settings
from profit.lib.gui import colorIcon, complementColor
from profit.lib.widgets.ui_plotitemdialog import Ui_PlotItemDialog


Modified: trunk/profit/lib/widgets/shell.py
==============================================================================
--- trunk/profit/lib/widgets/shell.py (original)
+++ trunk/profit/lib/widgets/shell.py Fri Jul 25 22:14:14 2008
@@ -22,7 +22,7 @@
from PyQt4.QtCore import Qt, QString
from PyQt4.QtGui import QApplication, QBrush, QColor, QFont,
QTextCursor, QTextEdit, QTextCharFormat

-from profit.lib.core import Settings, Signals, SessionHandler
+from profit.lib import Settings, Signals, SessionHandler


# disable the help function because it reads directly from stdin and

Modified: trunk/profit/lib/widgets/sourceeditor.py
==============================================================================
--- trunk/profit/lib/widgets/sourceeditor.py (original)
+++ trunk/profit/lib/widgets/sourceeditor.py Fri Jul 25 22:14:14 2008
@@ -16,7 +16,7 @@
except (ImportError, ):
QsciLexerPython = None

-from profit.lib.core import Signals
+from profit.lib import Signals


class SourceEditor(QFrame, Editor):

Modified: trunk/profit/lib/widgets/webbrowser.py
==============================================================================
--- trunk/profit/lib/widgets/webbrowser.py (original)
+++ trunk/profit/lib/widgets/webbrowser.py Fri Jul 25 22:14:14 2008
@@ -11,7 +11,7 @@
from PyQt4.QtCore import pyqtSignature, QEvent, QObject, Qt, QUrl
from PyQt4.QtGui import QWidget

-from profit.lib.core import Signals
+from profit.lib import Signals
from profit.lib.widgets.ui_webbrowser import Ui_WebBrowserDisplay

Modified: trunk/profit/neuralnetdesigner/main.py
==============================================================================
--- trunk/profit/neuralnetdesigner/main.py (original)
+++ trunk/profit/neuralnetdesigner/main.py Fri Jul 25 22:14:14 2008
@@ -8,7 +8,7 @@
from functools import partial

from profit.lib.breadfan import make_network
-from profit.lib.core import Signals, Slots
+from profit.lib import Signals, Slots

from profit.lib.widgets.dock import Dock
from profit.lib.widgets.shell import PythonShell

Modified: trunk/profit/neuralnetdesigner/network_test.py
==============================================================================
--- trunk/profit/neuralnetdesigner/network_test.py (original)
+++ trunk/profit/neuralnetdesigner/network_test.py Fri Jul 25 22:14:14 2008
@@ -11,8 +11,8 @@
from PyQt4.QtGui import (QApplication, QFrame, QIcon,
QStandardItem, QStandardItemModel, QToolBar)

-from profit.lib.core import SessionHandler
-from profit.lib.core import Signals, tickerIdRole
+from profit.lib import SessionHandler
+from profit.lib import Signals, tickerIdRole
from profit.lib.widgets.ui_breadfan_network import Ui_NetworkControlFrame

Modified: trunk/profit/neuralnetdesigner/test.py
==============================================================================
--- trunk/profit/neuralnetdesigner/test.py (original)
+++ trunk/profit/neuralnetdesigner/test.py Fri Jul 25 22:14:14 2008
@@ -11,8 +11,8 @@
from PyQt4.QtGui import (QApplication, QFrame, QIcon,
QStandardItem, QStandardItemModel)

-from profit.lib.core import SessionHandler
-from profit.lib.core import Signals, tickerIdRole
+from profit.lib import SessionHandler
+from profit.lib import Signals, tickerIdRole

from profit.neuralnetdesigner.widgets.ui_test import Ui_TestTree


Modified: trunk/profit/neuralnetdesigner/train_test.py
==============================================================================
--- trunk/profit/neuralnetdesigner/train_test.py (original)
+++ trunk/profit/neuralnetdesigner/train_test.py Fri Jul 25 22:14:14 2008
@@ -11,8 +11,8 @@
from PyQt4.QtGui import (QApplication, QFrame, QIcon,
QStandardItem, QStandardItemModel)

-from profit.lib.core import SessionHandler
-from profit.lib.core import Signals, tickerIdRole
+from profit.lib import SessionHandler
+from profit.lib import Signals, tickerIdRole
from profit.lib.widgets.ui_breadfan_train import Ui_BreadFanTrainTree

Modified: trunk/profit/strategydesigner/main.py
==============================================================================
--- trunk/profit/strategydesigner/main.py (original)
+++ trunk/profit/strategydesigner/main.py Fri Jul 25 22:14:14 2008
@@ -16,7 +16,7 @@

from profit.lib import series
from profit.lib import defaults
-from profit.lib.core import Settings, Signals
+from profit.lib import Settings, Signals
from profit.lib.widgets.syspathdialog import SysPathDialog
from profit.strategydesigner.treeitems import (
CallableItem, TickerItem, FieldItem, IndexItem, RunnerItem)

Modified: trunk/profit/workbench/accountdisplay.py
==============================================================================
--- trunk/profit/workbench/accountdisplay.py (original)
+++ trunk/profit/workbench/accountdisplay.py Fri Jul 25 22:14:14 2008
@@ -7,17 +7,28 @@
from PyQt4.QtCore import QAbstractTableModel, QSize, QVariant, Qt
from PyQt4.QtGui import QFrame, QStandardItemModel, QStandardItem

-from profit.lib.core import SessionHandler, Signals, valueAlign
+from profit.lib import SessionHandler, Signals, valueAlign
from profit.lib.gui import colorIcon, complementColor
from profit.lib.series import Series
from profit.lib.widgets.plot import PlotCurve, ControlTreeValueItem
from profit.workbench.widgets.ui_accountdisplay import Ui_AccountDisplay


+## TODO: clean up cross-wired signals if possible
+
+
class AccountTableModel(QStandardItemModel):
- columnTitles = ['Item', 'Currency', 'Value', 'Account',]
+ """ AccountTableModel -> item model of latest account data.
+
+ """
+ columnTitles = ['Item', 'Currency', 'Value', 'Account', ]

def __init__(self, session, parent=None):
+ """ Initializer.
+
+ @param session Session instance
+ @param parent ancestor object
+ """
QStandardItemModel.__init__(self, parent)
self.setHorizontalHeaderLabels(self.columnTitles)
self.items = {}
@@ -28,6 +39,11 @@
session.registerMeta(self)

def on_session_UpdateAccountValue(self, message):
+ """ Changes model items to match latest account data.
+
+ @param message message instance
+ @return None
+ """
key = (message.key, message.currency, message.accountName)
try:
items = self.items[key]
@@ -38,11 +54,11 @@


class AccountDisplay(QFrame, Ui_AccountDisplay, SessionHandler):
- """ Table view of an account.
+ """ AccountDisplay -> displays account data and associated plot controls.

"""
def __init__(self, parent=None):
- """ Constructor.
+ """ Initializer.

@param parent ancestor object
"""
@@ -66,18 +82,23 @@
plot.controlsTree.setModel(model)
plot.controlsTree.header().show()
for key, series in session.dataMaps.account.items():
- self.newPlotSeries(
- key, series, session.dataMaps.account.last.get(key, None))
+ value = session.dataMaps.account.last.get(key, None)
+ self.newPlotSeries(key, series, value)
connect = self.connect
connect(session, Signals.createdAccountData, self.newPlotSeries)
- connect(
- model, Signals.standardItemChanged,
- plot.on_controlsTree_itemChanged)
- connect(model, Signals.rowsInserted, self.modelRowsInserted)
+ connect(model, Signals.standardItemChanged, plot.on_controlsTree_itemChanged)
+ connect(model, Signals.rowsInserted, self.updateModelItems)
plot.loadSelections()
- self.plot.controlsTree.sortByColumn(0, Qt.AscendingOrder)
+ self.resizePlotControls()

def newPlotSeries(self, key, series, value):
+ """ Called when the session creates a new series for account data.
+
+ @param key triple of account data key, currency, and account name
+ @param series newly created data series
+ @param value value for account data key; may be float or string
+ @return None
+ """
cols = range(len(self.dataModel.columnTitles))
items = [ControlTreeValueItem('') for i in cols[1:]]
items[0].setText(key[1])
@@ -90,7 +111,23 @@
checkable = False
self.plot.addSeries(key, series, items=items, checkable=checkable)

- def modelRowsInserted(self, parent, start, end):
+ def resizePlotControls(self):
+ """ Adjusts column sizes and sort order.
+
+ @return None
+ """
+ for i in range(3): ## why 3 and not 4?
+ self.plot.controlsTree.resizeColumnToContents(i)
+ self.plot.controlsTree.sortByColumn(0, Qt.AscendingOrder)
+
+ def updateModelItems(self, parent, start, end):
+ """ Called when rows are inserted into the item model.
+
+ @param parent QModelIndex instance
+ @param start first row number
+ @param end last row number
+ @return None
+ """
model = self.dataModel
item = model.itemFromIndex(parent)
if item:
@@ -98,8 +135,3 @@
key = tuple(str(i.text()) for i in (item, others[0], others[2]))
model.items[key] = [item, ] + others
self.resizePlotControls()
- self.plot.controlsTree.sortByColumn(0, Qt.AscendingOrder)
-
- def resizePlotControls(self):
- for i in range(3):
- self.plot.controlsTree.resizeColumnToContents(i)

Modified: trunk/profit/workbench/centraltabs.py
==============================================================================
--- trunk/profit/workbench/centraltabs.py (original)
+++ trunk/profit/workbench/centraltabs.py Fri Jul 25 22:14:14 2008
@@ -9,47 +9,31 @@
from sys import platform

from PyQt4.QtCore import QTimer, QVariant, Qt, pyqtSignature
-from PyQt4.QtGui import QApplication, QIcon, QTabWidget, QStandardItem
+from PyQt4.QtGui import QIcon, QTabWidget, QStandardItem

from profit.lib import importItem, logging
-from profit.lib.core import SessionHandler, Signals, DataRoles
-from profit.lib.gui import addCloseAction
+from profit.lib import SessionHandler, Signals, DataRoles, instance
+from profit.lib.gui import addCloseAction, makeUrlItem
from profit.lib.widgets.buttons import CloseTabButton, DetachTabButton
from profit.lib.widgets.webbrowser import WebBrowserDisplay
from profit.workbench.tickerplotdisplay import TickerPlotDisplay


-displayClasses = {
- 'account' : 'profit.workbench.accountdisplay.AccountDisplay',
- 'connection' : 'profit.workbench.connectiondisplay.ConnectionDisplay',
- 'executions' : 'profit.workbench.executionsdisplay.ExecutionsDisplay',
- 'historical data' : 'profit.workbench.historicaldatadisplay.HistoricalDataDisplay',
- 'messages' : 'profit.workbench.messagedisplay.MessageDisplay',
- 'orders' : 'profit.workbench.orderdisplay.OrderDisplay',
- 'portfolio' : 'profit.workbench.portfoliodisplay.PortfolioDisplay',
- 'strategy' : 'profit.workbench.strategydisplay.StrategyDisplay',
- 'tickers' : 'profit.workbench.tickerdisplay.TickerDisplay',
-}
-
-
-def makeUrlItem(v):
- item = QStandardItem(v)
- item.setData(QVariant(v), DataRoles.url)
- item.setData(QVariant(''), DataRoles.urlTitle)
- return item
-
-
class CentralTabs(QTabWidget, SessionHandler):
""" CentralTabs -> tab widget with special powers

"""
def __init__(self, parent=None):
+ """ Initializer.
+
+ @param parent ancestor of this widget
+ """
QTabWidget.__init__(self, parent)
self.closeTabButton = CloseTabButton(self)
self.detachTabButton = DetachTabButton(self)
self.setCornerWidget(self.closeTabButton, Qt.TopRightCorner)
self.setCornerWidget(self.detachTabButton, Qt.TopLeftCorner)
- app, connect = QApplication.instance(), self.connect
+ app, connect = instance(), self.connect
connect(app, Signals.sessionItemActivated, self.createTab)
connect(app, Signals.openUrl, self.createTab)
connect(app, Signals.tickerClicked, self.createTab)
@@ -58,19 +42,24 @@
self.requestSession()

def createTab(self, value):
- """ create or display a tab from a value; value may be a
string or a model item
+ """ Create or display a tab from a value

+ @param value string or model item
+ @return None
"""
hs = [self.createBrowserTab, self.createTickerPlotTab, self.createDisplayTab]
for handler in hs:
try:
- if handler(value):break
+ if handler(value):
+ break
except (Exception, ), exc:
logging.debug("Exception (debug): %r:%s (h:%s)", exc,
exc, handler, )

def createBrowserTab(self, item):
- """ creates a new web browser tab.
+ """ Creates a new web browser tab.

+ @param value string or model item
+ @return True if display widget created, otherwise None
"""
if isinstance(item, (basestring, )):
item = makeUrlItem(item)
@@ -89,8 +78,10 @@
return True

def createTickerPlotTab(self, item):
- """ creates or displays a ticker plot tab
+ """ Creates or displays a ticker plot tab.

+ @param value string or model item
+ @return True if display widget created, otherwise None
"""
tickerId, tickerIdValid = item.data(DataRoles.tickerId).toInt()
symbol = str(item.data(DataRoles.tickerSymbol).toString())
@@ -106,13 +97,15 @@
return True

def createDisplayTab(self, item):
- """ creates or displays a name-based display
+ """ Creates or displays a name-based display.

+ @param value string or model item
+ @return True if display widget created, otherwise None
"""
text = str(item.data().toString())
if self.setCurrentLabel(text):
return True
- name = displayClasses.get(text.lower())
+ name = str(item.data(DataRoles.displayImportName).toString())
if name:
cls = importItem(name)
widget = cls(self)
@@ -122,14 +115,16 @@
return True

def pageMap(self):
- """ makes a mapping like {'connection':1, 'account':3, ...}
+ """ Makes a mapping like {'connection':1, 'account':3, ...}

+ @return mapping of tab name to tab index
"""
return dict([(str(self.tabText(i)), i) for i in range(self.count())])

def closeTab(self):
- """ slot that closes the current tab tab
+ """ Closes the current tab tab.

+ @return None
"""
index = self.currentIndex()
widget = self.widget(index)
@@ -139,8 +134,9 @@
widget.close()

def detachTab(self):
- """ slot that deatches the current tab and makes it a
top-level window
+ """ Deatches the current tab and makes it a top-level window.

+ @return None
"""
index = self.currentIndex()
text = str(self.tabText(index))
@@ -164,8 +160,11 @@
QTimer.singleShot(100, show)

def resetBrowserTab(self, okay, browser=None):
- """ slot to reconfigure a tab based on a web browser widget state
+ """ Reconfigures a tab based on a web browser widget state.

+ @param okay True if browser page load is finished
+ @keyparam browser=None WebBrowserDispay object
+ @return None
"""
if not okay or not browser:
return
@@ -177,16 +176,22 @@
self.setTabToolTip(index, tooltip)

def setTextIconCurrentTab(self, index, text, icon):
- """ sets a tabs text and icon, and makes tab current
+ """ Sets tab text and icon, and makes tab current.

+ @param index index of tab to modify and display
+ @param text text for tab
+ @param icon icon for tab
+ @return None
"""
self.setTabText(index, text)
self.setTabIcon(index, icon)
self.setCurrentIndex(index)

def setCurrentLabel(self, label):
- """ sets current tab by name if available; returns true if successful
+ """ Sets current tab by name if possible.

+ @param label text of tab to make current
+ @return True if successful, otherwise None
"""
index = self.pageMap().get(label)
if index is not None:

Modified: trunk/profit/workbench/connectiondisplay.py
==============================================================================
--- trunk/profit/workbench/connectiondisplay.py (original)
+++ trunk/profit/workbench/connectiondisplay.py Fri Jul 25 22:14:14 2008
@@ -19,7 +19,7 @@
from PyQt4.Qwt5 import QwtThermo; QtGui.QwtThermo = QwtThermo

from profit.lib import defaults, logging
-from profit.lib.core import SessionHandler, SettingsHandler, Signals
+from profit.lib import SessionHandler, SettingsHandler, Signals
from profit.workbench.widgets.ui_connectionwidget import Ui_ConnectionWidget

Modified: trunk/profit/workbench/executionsdisplay.py
==============================================================================
--- trunk/profit/workbench/executionsdisplay.py (original)
+++ trunk/profit/workbench/executionsdisplay.py Fri Jul 25 22:14:14 2008
@@ -9,7 +9,7 @@
from PyQt4.QtCore import QAbstractTableModel, QVariant, Qt
from PyQt4.QtGui import QFrame

-from profit.lib.core import SessionHandler, Signals, Slots, nameIn, valueAlign
+from profit.lib import SessionHandler, Signals, Slots, nameIn, valueAlign
from profit.lib.gui import symbolIcon
from profit.workbench.widgets.ui_executionsdisplay import Ui_ExecutionsDisplay


Modified: trunk/profit/workbench/historicaldatadisplay.py
==============================================================================
--- trunk/profit/workbench/historicaldatadisplay.py (original)
+++ trunk/profit/workbench/historicaldatadisplay.py Fri Jul 25 22:14:14 2008
@@ -9,7 +9,7 @@
from PyQt4.QtCore import Qt
from PyQt4.QtGui import QFrame, QIcon

-from profit.lib.core import SessionHandler, nameIn
+from profit.lib import SessionHandler, nameIn
from profit.lib.gui import ValueTableItem
from profit.workbench.widgets.ui_historicaldatadisplay import Ui_HistoricalDataDisplay


Modified: trunk/profit/workbench/main.py
==============================================================================
--- trunk/profit/workbench/main.py (original)
+++ trunk/profit/workbench/main.py Fri Jul 25 22:14:14 2008
@@ -22,7 +22,7 @@
from PyQt4.QtGui import QIcon, QDesktopServices

from profit.lib import defaults
-from profit.lib.core import Signals, Settings
+from profit.lib import Signals, Settings, instance
from profit.lib.gui import ValueColorItem, warningBox
from profit.lib.session import Session

@@ -32,11 +32,9 @@

from profit.workbench.widgets.ui_main import Ui_ProfitWorkbenchWindow
from profit.workbench.sessiontree import SessionTree
-from profit.workbench.collectordisplay import CollectorDisplay


applicationName = QApplication.applicationName
-instance = QApplication.instance
processEvents = QApplication.processEvents


@@ -215,7 +213,7 @@
dlg = SessionReplay()
dlg.setWindowTitle('Reading session file.')
dlg.setWindowModality(Qt.WindowModal)
- dlg.setImport(self.session, filename, types)
+ dlg.setImportParameters(self.session, filename, types)
dlg.exec_()

@pyqtSignature('bool')
@@ -389,8 +387,7 @@
bottom = Qt.BottomDockWidgetArea
tabify = self.tabifyDockWidget
self.sessionDock = Dock('Session', self, SessionTree)
- self.collectorDock = Dock('Collector', self, CollectorDisplay)
- tabify(self.sessionDock, self.collectorDock) # self.strategyDock)
+ tabify(self.sessionDock, self.sessionDock)
self.stdoutDock = Dock('Standard Output', self, OutputWidget, bottom)
self.stderrDock = Dock('Standard Error', self, OutputWidget, bottom)
makeShell = partial(

Modified: trunk/profit/workbench/messagedisplay.py
==============================================================================
--- trunk/profit/workbench/messagedisplay.py (original)
+++ trunk/profit/workbench/messagedisplay.py Fri Jul 25 22:14:14 2008
@@ -14,7 +14,7 @@
from ib.opt.message import messageTypeNames

from profit.lib import defaults
-from profit.lib.core import SessionHandler, SettingsHandler, Slots
+from profit.lib import SessionHandler, SettingsHandler, Slots
from profit.lib.gui import colorIcon
from profit.lib.models.messages import MessagesTableModel
from profit.workbench.widgets.ui_messagedisplay import Ui_MessageDisplay

Modified: trunk/profit/workbench/orderdisplay.py
==============================================================================
--- trunk/profit/workbench/orderdisplay.py (original)
+++ trunk/profit/workbench/orderdisplay.py Fri Jul 25 22:14:14 2008
@@ -9,9 +9,13 @@
from PyQt4.QtCore import Qt
from PyQt4.QtGui import QFrame

-from profit.lib.core import SessionHandler, nameIn
+from profit.lib import SessionHandler, nameIn
from profit.workbench.widgets.ui_orderdisplay import Ui_OrderDisplay

+## TODO: orders should be displayed in a parent/child relationship,
+## with the OpenOrder message as the parent and the related
+## OrderStatus messages as children.
+

def replayOrderMessages(messages, openOrder, orderStatus):
"""
@@ -33,7 +37,6 @@
""" Initializer.

@param parent ancestor of this object
- @return None
"""
QFrame.__init__(self, parent)
self.setAttribute(Qt.WA_DeleteOnClose)
@@ -58,12 +61,7 @@

def on_session_OrderStatus(self, message):
orderId = message.orderId
- try:
- items = self.orderItems[orderId]
- except (KeyError, ):
- ## status received before open order message received.
- ## should log this.
- return
+ items = self.getTableRowItems(orderId)
table = self.orderTable
items[3].setText(message.status)
items[9].setText(message.filled)
@@ -78,12 +76,7 @@
def on_session_OpenOrder(self, message):
order = message.order
orderId = order.m_orderId
- try:
- items = self.orderItems[orderId]
- except (KeyError, ):
- table = self.orderTable
- items = self.orderItems[orderId] = table.newItemsRow()
- table.resizeRowsToContents()
+ items = self.getTableRowItems(orderId)
contract = message.contract
items[0].setText(str(orderId))
items[1].setSymbol(contract.m_symbol)
@@ -98,3 +91,17 @@
#items[10].setText('') # remaining
for col in [0, 2, 6, 7, 9, 10, 11, 12, 13, 14, 15]:
items[col].setValueAlign()
+
+ def makeTableRowItems(self, orderId):
+ table = self.orderTable
+ items = self.orderItems[orderId] = table.newItemsRow()
+ table.resizeRowsToContents()
+ return items
+
+ def getTableRowItems(self, orderId):
+ try:
+ items = self.orderItems[orderId]
+ except (KeyError, ):
+ items = self.makeTableRowItems(orderId)
+ return items
+

Modified: trunk/profit/workbench/portfoliodisplay.py
==============================================================================
--- trunk/profit/workbench/portfoliodisplay.py (original)
+++ trunk/profit/workbench/portfoliodisplay.py Fri Jul 25 22:14:14 2008
@@ -9,7 +9,7 @@
from PyQt4.QtCore import Qt
from PyQt4.QtGui import QFrame, QIcon

-from profit.lib.core import SessionHandler, nameIn
+from profit.lib import SessionHandler, nameIn
from profit.lib.gui import ValueTableItem
from profit.workbench.widgets.ui_portfoliodisplay import Ui_PortfolioDisplay


Modified: trunk/profit/workbench/sessionreplay.py
==============================================================================
--- trunk/profit/workbench/sessionreplay.py (original)
+++ trunk/profit/workbench/sessionreplay.py Fri Jul 25 22:14:14 2008
@@ -13,12 +13,12 @@
# associated slider, and also a button to restart the session replay.
##

-import logging

from PyQt4.QtCore import QTimer
from PyQt4.QtGui import QDialog, QMessageBox

-from profit.lib.core import Signals
+from profit.lib import logging
+from profit.lib import Signals
from profit.workbench.widgets.ui_sessionreplay import Ui_SessionReplayWidget


@@ -31,7 +31,7 @@
Clients should use 'exec_()' to display the dialog, not 'show'.
"""
def __init__(self, interval=50, parent=None):
- """ Constructor.
+ """ Initializer.

@param interval=50 milliseconds between message delivery
@param parent=None ancestor of this dialog
@@ -39,14 +39,17 @@
QDialog.__init__(self, parent)
self.setupUi(self)
self.interval = interval
- self.session = self.filename = self.types = self.loader = \
- self.importer = None
+ self.session = None
+ self.filename = None
+ self.types = None
+ self.loader = None
+ self.importer = None
self.timer = QTimer()

def exec_(self):
""" Dialog main loop.

- @return DialogCode result
+ @return QDialog.DialogCode result
"""
connect = self.connect
setInterval = self.timer.setInterval
@@ -96,12 +99,14 @@
'Imported %s messages from file "%s".',
self.count, self.filename)

- def setImport(self, session, filename, types):
- self.session = session
- self.filename = filename
- self.types = types
-
def importSession(self, session, filename, types):
+ """ Initiates session import.
+
+ @param session Session instance
+ @param filename name of file with serialized messages
+ @param types sequence of message types to import
+ @return None
+ """
importer = session.importMessages(str(filename), types)
loader = importer()
try:
@@ -116,3 +121,16 @@
self.importProgress.setMaximum(self.last)
self.importer = importer
self.loader = loader
+
+ def setImportParameters(self, session, filename, types):
+ """ Sets the parameters for the import (replay) of session messages.
+
+ @param session Session instance
+ @param filename name of file with serialized messages
+ @param types sequence of message types to import
+ @return None
+ """
+ self.session = session
+ self.filename = filename
+ self.types = types
+

Modified: trunk/profit/workbench/sessiontree.py
==============================================================================
--- trunk/profit/workbench/sessiontree.py (original)
+++ trunk/profit/workbench/sessiontree.py Fri Jul 25 22:14:14 2008
@@ -15,12 +15,24 @@

from profit.lib import defaults, logging
from profit.lib.gui import UrlRequestor, makeUrlAction
-from profit.lib.core import SessionHandler, SettingsHandler
-from profit.lib.core import Settings, Signals, DataRoles
-from profit.workbench.centraltabs import displayClasses
+from profit.lib import SessionHandler, SettingsHandler
+from profit.lib import Settings, Signals, DataRoles
from profit.workbench.widgets.ui_sessiontree import Ui_SessionTree


+displayClasses = {
+ 'account' : 'profit.workbench.accountdisplay.AccountDisplay',
+ 'connection' : 'profit.workbench.connectiondisplay.ConnectionDisplay',
+ 'executions' : 'profit.workbench.executionsdisplay.ExecutionsDisplay',
+ 'historical data' : 'profit.workbench.historicaldatadisplay.HistoricalDataDisplay',
+ 'messages' : 'profit.workbench.messagedisplay.MessageDisplay',
+ 'orders' : 'profit.workbench.orderdisplay.OrderDisplay',
+ 'portfolio' : 'profit.workbench.portfoliodisplay.PortfolioDisplay',
+ 'strategy' : 'profit.workbench.strategydisplay.StrategyDisplay',
+ 'tickers' : 'profit.workbench.tickerdisplay.TickerDisplay',
+}
+
+
iconNameMap = {
'account':'identity',
'connection':'server',
@@ -154,8 +166,10 @@
root = self.invisibleRootItem()
clsmap = dict.fromkeys([k for k in displayClasses], {})
items = sorted(clsmap.items())
+ importRole = DataRoles.displayImportName
for key, values in items:
item = SessionTreeItem(key)
+ item.setData(QVariant(displayClasses[key]), importRole)
root.appendRow(item)
connect = self.connect
connect(session, Signals.createdTicker, self.on_session_createdTicker)

Modified: trunk/profit/workbench/settingsdialog.py
==============================================================================
--- trunk/profit/workbench/settingsdialog.py (original)
+++ trunk/profit/workbench/settingsdialog.py Fri Jul 25 22:14:14 2008
@@ -10,7 +10,7 @@
from PyQt4.QtGui import QFileDialog, QFont, QFontDialog, QListWidgetItem

from profit.lib import defaults
-from profit.lib.core import Settings
+from profit.lib import Settings
from profit.lib.gui import colorIcon
from profit.lib.widgets.syspathdialog import SysPathDialog
from profit.workbench.widgets.ui_settingsdialog import Ui_SettingsDialog

Modified: trunk/profit/workbench/strategydisplay.py
==============================================================================
--- trunk/profit/workbench/strategydisplay.py (original)
+++ trunk/profit/workbench/strategydisplay.py Fri Jul 25 22:14:14 2008
@@ -13,7 +13,7 @@
QStandardItemModel, QFileDialog, )

from profit.lib import defaults, logging
-from profit.lib.core import SessionHandler, SettingsHandler, Signals,
DataRoles, instance
+from profit.lib import SessionHandler, SettingsHandler, Signals,
DataRoles, instance
from profit.lib.gui import StandardItem
from profit.workbench.widgets.ui_strategydisplay import Ui_StrategyDisplay


Modified: trunk/profit/workbench/tickerdisplay.py
==============================================================================
--- trunk/profit/workbench/tickerdisplay.py (original)
+++ trunk/profit/workbench/tickerdisplay.py Fri Jul 25 22:14:14 2008
@@ -15,7 +15,7 @@
from ib.opt.message import TickPrice

from profit.lib import defaults
-from profit.lib.core import (SessionHandler, SettingsHandler, Signals,
+from profit.lib import (SessionHandler, SettingsHandler, Signals,
nameIn, DataRoles, instance)
from profit.lib.gui import (UrlRequestor, ValueTableItem, separator,
makeUrlAction, )
@@ -260,7 +260,15 @@
except (KeyError, ):
items = self.tickerItems[tid] = table.newItemsRow()
symbols = self.session.strategy.symbols()
- sym = dict([(b, a) for a, b in symbols.items()])[tid]
+ try:
+ sym = dict([(b, a) for a, b in symbols.items()])[tid]
+ except (KeyError, ):
+ ## something wrong -- we don't have data for the
+ ## ticker symbol. this can happen if the connection
+ ## sends tick messages and we don't have a strategy
+ ## loaded with the symbol (tickerId) defined. how can
+ ## this be fixed?
+ return
items[0].setSymbol(sym)
items[0].tickerId = tid
for item in items[1:]:

Modified: trunk/profit/workbench/tickerplotdisplay.py
==============================================================================
--- trunk/profit/workbench/tickerplotdisplay.py (original)
+++ trunk/profit/workbench/tickerplotdisplay.py Fri Jul 25 22:14:14 2008
@@ -7,7 +7,7 @@
from PyQt4.QtCore import QVariant, pyqtSignature
from PyQt4.QtGui import QFrame

-from profit.lib.core import Settings, Signals
+from profit.lib import Settings, Signals
from profit.lib.widgets.plot import Plot
from profit.workbench.widgets.ui_tickerplotdisplay import Ui_TickerPlotDisplay

Reply all
Reply to author
Forward
0 new messages