Skip to content

Commit

Permalink
simplify logging, fixes #34
Browse files Browse the repository at this point in the history
  • Loading branch information
timkpaine committed Jul 1, 2019
1 parent 05bf0b2 commit 2948841
Show file tree
Hide file tree
Showing 16 changed files with 66 additions and 236 deletions.
4 changes: 2 additions & 2 deletions aat/backtest.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import pandas as pd
from .config import BacktestConfig
from .data_source import StreamingDataSource
from .logging import LOG as log, DATA as dlog
from .logging import log
from .structs import MarketData, Instrument
from .enums import PairType, TickType, ExchangeType_from_string, Side

Expand Down Expand Up @@ -39,7 +39,7 @@ def receive(self, data: MarketData) -> None:
# TODO allow if market data for bid/ask
if data.type == TickType.TRADE:
self.callback(TickType.TRADE, data)
dlog.info(data)
log.info(data)
else:
self.callback(TickType.ERROR, data)

Expand Down
16 changes: 8 additions & 8 deletions aat/callback.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from abc import ABCMeta, abstractmethod
from .structs import MarketData
from .logging import LOG as log, DATA as dlog
from .logging import log


class Callback(metaclass=ABCMeta):
Expand Down Expand Up @@ -100,25 +100,25 @@ def __init__(self,
setattr(self, 'onError', False)

def onTrade(self, data: MarketData) -> None:
dlog.info(str(data))
log.info(str(data))

def onReceived(self, data: MarketData) -> None:
dlog.info(str(data))
log.info(str(data))

def onOpen(self, data: MarketData) -> None:
dlog.info(str(data))
log.info(str(data))

def onFill(self, data: MarketData) -> None:
dlog.info(str(data))
log.info(str(data))

def onCancel(self, data: MarketData) -> None:
dlog.info(str(data))
log.info(str(data))

def onChange(self, data: MarketData) -> None:
dlog.info(str(data))
log.info(str(data))

def onError(self, data: MarketData) -> None:
dlog.info(str(data))
log.info(str(data))

def onAnalyze(self, data) -> None:
log.info('Analysis')
Expand Down
2 changes: 1 addition & 1 deletion aat/exchanges/gemini.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from ..define import EXCHANGE_MARKET_DATA_ENDPOINT
from ..enums import TickType
from ..exchange import Exchange
from ..logging import LOG as log
from ..logging import log


class GeminiExchange(GeminiMixins, Exchange):
Expand Down
6 changes: 3 additions & 3 deletions aat/execution.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from .exchange import Exchange
from .enums import Side
from .structs import TradeRequest, TradeResponse
from .logging import EXEC as exlog
from .logging import log


class Execution(object):
Expand All @@ -13,12 +13,12 @@ def __init__(self, options: ExecutionConfig, exchanges: List[Exchange]) -> None:

def requestBuy(self, req: TradeRequest) -> TradeResponse:
resp = self._exs[req.exchange].buy(req)
exlog.info('Order info: %s' % resp)
log.info('Order info: %s' % resp)
return resp

def requestSell(self, req: TradeRequest) -> TradeResponse:
resp = self._exs[req.exchange].sell(req)
exlog.info('Order info: %s' % resp)
log.info('Order info: %s' % resp)
return resp

def request(self, req: TradeRequest) -> TradeResponse:
Expand Down
126 changes: 1 addition & 125 deletions aat/logging.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,138 +37,14 @@
'mode': 'w',
'encoding': 'utf-8'
},
'file_strat': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'formatter': 'whenAndWhere',
'filename': 'logs/' + moment + '/strat.log',
'mode': 'w',
'encoding': 'utf-8'
},

'file_data': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'formatter': 'whenAndWhere',
'filename': 'logs/' + moment + '/data.log',
'mode': 'w',
'encoding': 'utf-8'
},
'file_risk': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'formatter': 'whenAndWhere',
'filename': 'logs/' + moment + '/risk.log',
'mode': 'w',
'encoding': 'utf-8'
},
'file_execution': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'formatter': 'whenAndWhere',
'filename': 'logs/' + moment + '/exec.log',
'mode': 'w',
'encoding': 'utf-8'
},
'file_slippage': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'formatter': 'whenAndWhere',
'filename': 'logs/' + moment + '/slip.log',
'mode': 'w',
'encoding': 'utf-8'
},
'file_transaction_costs': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'formatter': 'whenAndWhere',
'filename': 'logs/' + moment + '/txns.log',
'mode': 'w',
'encoding': 'utf-8'
},
'file_manual': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'formatter': 'whenAndWhere',
'filename': 'logs/' + moment + '/manual.log',
'mode': 'w',
'encoding': 'utf-8'
},
'file_errors': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'formatter': 'whenAndWhere',
'filename': 'logs/' + moment + '/errors.log',
'mode': 'w',
'encoding': 'utf-8'
},
},
'loggers': {
'': { # 'root' logger
'level': 'CRITICAL',
'handlers': ['console', 'file']
},
'strat': {
'level': 'CRITICAL',
'handlers': ['console', 'file_strat']
},
'data': {
'level': 'CRITICAL',
'handlers': ['console', 'file_data']
},
'risk': {
'level': 'CRITICAL',
'handlers': ['console', 'file_risk']
},
'execution': {
'level': 'CRITICAL',
'handlers': ['console', 'file_execution']
},
'slippage': {
'level': 'CRITICAL',
'handlers': ['console', 'file_slippage']
},
'transactionCost': {
'level': 'CRITICAL',
'handlers': ['console', 'file_transaction_costs']
},
'manual': {
'level': 'CRITICAL',
'handlers': ['console', 'file_manual']
},
'errors': {
'level': 'CRITICAL',
'handlers': ['console', 'file_errors']
},

}
}

logging.config.dictConfig(LOGGING_CONFIG)
LOG = logging.getLogger('') # factory method
STRAT = logging.getLogger('strat')
DATA = logging.getLogger('data')
RISK = logging.getLogger('risk')
EXEC = logging.getLogger('execution')
SLIP = logging.getLogger('slippage')
TXNS = logging.getLogger('transactionCost')
MANUAL = logging.getLogger('manual')
ERROR = logging.getLogger('errors')

STRAT.propagate = False
DATA.propagate = False
RISK.propagate = False
EXEC.propagate = False
SLIP.propagate = False
TXNS.propagate = False
MANUAL.propagate = False
ERROR.propagate = False

STRAT.setLevel(logging.CRITICAL)
DATA.setLevel(logging.CRITICAL)
RISK.setLevel(logging.CRITICAL)
EXEC.setLevel(logging.CRITICAL)
SLIP.setLevel(logging.CRITICAL)
TXNS.setLevel(logging.CRITICAL)
MANUAL.setLevel(logging.CRITICAL)
ERROR.setLevel(logging.CRITICAL)
log = logging.getLogger('') # factory method
2 changes: 1 addition & 1 deletion aat/market_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from .data_source import StreamingDataSource
from .define import EXCHANGE_MARKET_DATA_ENDPOINT
from .structs import MarketData
from .logging import LOG as log
from .logging import log


class MarketData(StreamingDataSource):
Expand Down
2 changes: 1 addition & 1 deletion aat/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from .exceptions import ConfigException
from .structs import Instrument
from .utils import str_to_exchange, set_verbose, str_to_currency_pair_type
from .logging import LOG as log
from .logging import log


def parse_file_config(filename: str) -> TradingEngineConfig:
Expand Down
10 changes: 5 additions & 5 deletions aat/risk.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from .config import RiskConfig
from .structs import TradeRequest, TradeResponse, Instrument
from .enums import Side, TradeResult, OrderType, RiskReason, ExchangeType
from .logging import RISK as rlog
from .logging import log


class Risk(object):
Expand Down Expand Up @@ -56,14 +56,14 @@ def _constructResp(self,
return resp

def request(self, req: TradeRequest) -> TradeRequest:
rlog.info('Requesting %f @ %f', req.volume, req.price)
log.info('Requesting %f @ %f', req.volume, req.price)
total = req.volume * req.price
total = total * -1 if req.side == Side.SELL else total
max = self.max_risk/100.0 * self.total_funds

if (total + self.outstanding) <= max:
# room for full volume
rlog.info('Risk check passed for order: %s' % req)
log.info('Risk check passed for order: %s' % req)
return self._constructResp(side=req.side,
exchange=req.exchange,
instrument=req.instrument,
Expand All @@ -77,7 +77,7 @@ def request(self, req: TradeRequest) -> TradeRequest:
elif self.outstanding < max:
# room for some volume
volume = (max - self.outstanding) / req.price
rlog.info('Risk check passed for partial order: %s' % req)
log.info('Risk check passed for partial order: %s' % req)
return self._constructResp(side=req.side,
exchange=req.exchange,
instrument=req.instrument,
Expand All @@ -89,7 +89,7 @@ def request(self, req: TradeRequest) -> TradeRequest:
reason=RiskReason.PARTIAL)

# no room for volume
rlog.info('Risk check failed for order: %s' % req)
log.info('Risk check failed for order: %s' % req)
return self._constructResp(side=req.side,
exchange=req.exchange,
instrument=req.instrument,
Expand Down
8 changes: 4 additions & 4 deletions aat/strategies/backtest.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from ..strategy import TradingStrategy
from ..structs import MarketData, TradeRequest, TradeResponse
from ..enums import Side, OrderType
from ..logging import STRAT as slog, ERROR as elog
from ..logging import log


class CustomStrategy(TradingStrategy):
Expand All @@ -22,14 +22,14 @@ def __init__(self, size: int) -> None:
def onBuy(self, res: TradeResponse) -> None:
self.bought = res.volume*res.price
self.bought_qty = res.volume
slog.info('d->g:bought %.2f @ %.2f for %.2f', res.volume, res.price, self.bought)
log.info('d->g:bought %.2f @ %.2f for %.2f', res.volume, res.price, self.bought)

def onSell(self, res: TradeResponse) -> None:
sold = res.volume*res.price
profit = sold - self.bought
self.profits += profit

slog.info('g->d:sold %.2f @ %.2f for %.2f - %.2f - %.2f', res.volume, res.price, sold, profit, self.profits)
log.info('g->d:sold %.2f @ %.2f for %.2f - %.2f - %.2f', res.volume, res.price, sold, profit, self.profits)

self.bought = 0.0
self.bought_qty = 0.0
Expand Down Expand Up @@ -88,7 +88,7 @@ def onTrade(self, data: MarketData):
self.requestSell(self.onSell, req)

def onError(self, e: MarketData):
elog.critical(e)
log.critical(e)

def onAnalyze(self, engine) -> None:
import pandas
Expand Down
8 changes: 4 additions & 4 deletions aat/strategies/buy_and_hold.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from ..strategy import TradingStrategy
from ..structs import MarketData, TradeRequest, TradeResponse
from ..enums import Side, OrderType
from ..logging import STRAT as slog, ERROR as elog
from ..logging import log


class BuyAndHoldStrategy(TradingStrategy):
Expand All @@ -11,7 +11,7 @@ def __init__(self) -> None:

def onBuy(self, res: TradeResponse) -> None:
self.bought = res
slog.info('d->g:bought %.2f @ %.2f' % (res.volume, res.price))
log.info('d->g:bought %.2f @ %.2f' % (res.volume, res.price))

def onSell(self, res: TradeResponse) -> None:
pass
Expand All @@ -25,11 +25,11 @@ def onTrade(self, data: MarketData) -> bool:
exchange=data.exchange,
price=data.price,
time=data.time)
slog.info("requesting buy : %s", req)
log.info("requesting buy : %s", req)
self.requestBuy(self.onBuy, req)

def onError(self, e) -> None:
elog.critical(e)
log.critical(e)

def onAnalyze(self, engine) -> None:
import pandas
Expand Down

0 comments on commit 2948841

Please sign in to comment.