MERGE W/ 6003985a
simplify column printing

Column creation is still cumbersome to create a decent tabular data
layout -- even with the __queryWidths methods. This change simplifies
things a little bit leading to less lines of code being required to
create such a tabular view.
add support for listing trades

This change adds a new option to the program: --list-trades. When this
option is specified the currently open trades will be listed.
MERGE W/ 126813ce
MERGE W/ 2595df9b
MERGE W/ 126813ce
introduce Price class

Before this change we had the problem that prices were displayed with as
many post decimal positions as they have or as the currently set
precision allows for. This leads to confusingly large values being
printed.
This change introduces the Price class. Objects of this class have an
associated 'pip' value that quantifies the number of relevant post
decimal positions to print. Prices use Decimal internally so as to not
loose any precision.
They support the basic arithmetic operations +, -, *, and / and interact
well with Decimal objects. Prices are usually used in conjunction with
currencies, in other cases usage of Decimal objects might be favorable.
MERGE W/ e5396831
MERGE W/ 734ed21f
MERGE W/ ac0f0282
propagate timeout value to use in watchdog from fxBot.py
add unit test for automated testing of Program class
have exceptions in child threads tear down program

When one of the used threads (worker, watchdog, rate streamer, or event
streamer) raises an uncaught exception the thread itself is terminated
but the program keeps running. This behavior is not desired: an uncaught
exception in one of the threads should terminate the application after
printing some information.
This change implements the desired behavior. A newly introduced
decorator ('tryRun') is used to guard all functions running in separate
threads. Once it catches an exception, a trace back is printed and
SIGTERM send to the main thread, which will then terminate the
application gracefully.
terminate application if streams encounter an error

One scenario where the streams
fix destroy() problem in Watchdog when start() was not invoked

This change fixes a the problem that the unregister() method of the Poll
object is invoked even if no register() call has been made before. This
case can occur if the destroy() of the watchdog object is invoked on a
newly created object without having executed start().
MERGE W/ 637091325c5ff1dbd9f3d0c55932f773927026b6
MERGE W/ ac0f0282
MERGE W/ 45a1f888
add complete infrastructure test

This change adds a unit test that verifies the basic infrastructure for
pushing events from the various sources (rate and event streamer
threads, and watchdog) works as intended.
Focus is on execising all main paths so as to catch potential type
errors and the like. Correct evaluation of the events has to be verified
by a unit test for each component.