Skip to content

Commit

Permalink
fixes #16
Browse files Browse the repository at this point in the history
  • Loading branch information
timkpaine committed Jun 1, 2019
1 parent 5312090 commit 6f58e03
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 86 deletions.
58 changes: 26 additions & 32 deletions aat/config.py
Original file line number Diff line number Diff line change
@@ -1,47 +1,41 @@
from .utils import config
from traitlets import HasTraits, List, Instance, Float, Type, Tuple, Dict, Bool
from .enums import TradingType, ExchangeType, PairType, InstrumentType
from .structs import Instrument


@config
class ExchangeConfig:
exchange_types = [ExchangeType], []
trading_type = TradingType, TradingType.NONE
currency_pairs = [PairType], [PairType.BTCUSD]
instruments = [Instrument], [Instrument(type=InstrumentType.PAIR, underlying=PairType.BTCUSD)]
class ExchangeConfig(HasTraits):
exchange_types = List(trait=Instance(ExchangeType), default_value=[])
trading_type = Instance(klass=TradingType, args=('NONE',), kwargs={})
currency_pairs = List(trait=Instance(PairType), default_value=[PairType.BTCUSD])
instruments = List(trait=Instance(Instrument), default_value=[Instrument(type=InstrumentType.PAIR, underlying=PairType.BTCUSD)])


@config
class BacktestConfig:
class BacktestConfig(HasTraits):
pass


@config
class RiskConfig:
max_drawdown = float, 100.0 # % Max strat drawdown before liquidation
max_risk = float, 100.0 # % Max to risk on any trade
total_funds = float, 0.0 # % Of total funds to use
trading_type = TradingType, TradingType.NONE
class RiskConfig(HasTraits):
max_drawdown = Float(default_value=100.0) # % Max strat drawdown before liquidation
max_risk = Float(default_value=100.0) # % Max to risk on any trade
total_funds = Float(default_value=0.0) # % Of total funds to use
trading_type = Instance(klass=TradingType, args=('NONE',), kwargs={})


@config
class ExecutionConfig:
trading_type = TradingType, TradingType.NONE
class ExecutionConfig(HasTraits):
trading_type = Instance(klass=TradingType, args=('NONE',), kwargs={})


@config
class StrategyConfig:
clazz = type
args = tuple, ()
kwargs = dict, {}
class StrategyConfig(HasTraits):
clazz = Type()
args = Tuple(default_value=())
kwargs = Dict(default_value={})


@config
class TradingEngineConfig:
type = TradingType, TradingType.NONE
print = bool, False
exchange_options = ExchangeConfig, ExchangeConfig()
backtest_options = BacktestConfig, BacktestConfig()
risk_options = RiskConfig, RiskConfig()
execution_options = ExecutionConfig, ExecutionConfig()
strategy_options = [StrategyConfig], [] # List of strategy options
class TradingEngineConfig(HasTraits):
type = Instance(klass=TradingType, args=('NONE',), kwargs={})
print = Bool(default_value=False)
exchange_options = Instance(klass=ExchangeConfig, args=(), kwargs={})
backtest_options = Instance(klass=BacktestConfig, args=(), kwargs={})
risk_options = Instance(klass=RiskConfig, args=(), kwargs={})
execution_options = Instance(klass=ExecutionConfig, args=(), kwargs={})
strategy_options = List(trait=Instance(StrategyConfig), default_value=[]) # List of strategy options
6 changes: 4 additions & 2 deletions aat/strategies/test_strat.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ def onTrade(self, data: MarketData) -> bool:
instrument=data.instrument,
order_type=OrderType.MARKET,
exchange=data.exchange,
price=data.price)
price=data.price,
time=data.time)
slog.info("requesting buy : %s", req)
self.requestBuy(self.onBuy, req)
self.active = True
Expand All @@ -65,7 +66,8 @@ def onTrade(self, data: MarketData) -> bool:
instrument=data.instrument,
exchange=data.exchange,
order_type=OrderType.MARKET,
price=data.price)
price=data.price,
time=data.time)
slog.info("requesting sell : %s", req)
self.requestSell(self.onSell, req)
self.active = False
Expand Down
52 changes: 0 additions & 52 deletions aat/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,58 +51,6 @@ def set(self, val):
return property(get, set)


def config(cls):
new_cls_dict = {}
vars = []
for k, v in cls.__dict__.items():
if isinstance(v, type):
# V is a type, no default value
v = create_pair(k, v)
vars.append(k)
elif isinstance(v, tuple) and \
isinstance(v[0], type) and \
isinstance(v[1], v[0]):
# v is a pair, (type, instance)
v = create_pair(k, v[0], v[1])
vars.append(k)
elif isinstance(v, list) and \
isinstance(v[0], type):
# v is a list [type]
v = create_pair(k, v[0], container=list)
vars.append(k)
elif isinstance(v, tuple) and \
isinstance(v[0], list) and \
isinstance(v[0][0], type) and \
isinstance(v[1], list):
# v is a pair, ([type], [instance?])
if len(v[1]) > 0 and isinstance(v[1][0], v[0][0]): # TODO check all
v = create_pair(k, v[0][0], v[1], container=list)
vars.append(k)
elif v[1] == []:
v = create_pair(k, v[0][0], v[1], container=list)
vars.append(k)
else:
raise Exception('Unexpected list instance: %s' % v[1][0])

new_cls_dict[k] = v
new_cls_dict['__init__'] = __init__config
new_cls_dict['__repr__'] = __repr__
new_cls_dict['_vars'] = vars
new_cls_dict['_excludes'] = []
return type(cls)(cls.__name__, cls.__bases__, new_cls_dict)


def __init__config(self, **kwargs) -> None:
for k, v in kwargs.items():
if k not in self._vars:
raise Exception('Attribute not found! %s' % k)
for item in self._vars:
if item not in kwargs:
log.debug('WARNING %s unset!', item)
else:
setattr(self, item, kwargs.get(item))


def __init__struct(self, **kwargs) -> None:
for item in self._vars:
if item not in kwargs:
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@ sphinx>=1.7.5
six>=1.10.0
requests>=2.13.0
tornado>=5.1
traitlets>=4.3.2
ujson>=1.35
websocket-client>=0.40.0

0 comments on commit 6f58e03

Please sign in to comment.