Skip to content

Commit

Permalink
Support class based strategy and stragyless specifications
Browse files Browse the repository at this point in the history
  • Loading branch information
MDUYN committed Jul 17, 2023
1 parent f171b4e commit 30034a4
Show file tree
Hide file tree
Showing 56 changed files with 872 additions and 476 deletions.
46 changes: 26 additions & 20 deletions investing_algorithm_framework/app/algorithm.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import logging
from typing import List

from investing_algorithm_framework.domain import OrderStatus, \
from investing_algorithm_framework.domain import OrderStatus, OrderFee, \
Position, Order, Portfolio, OrderType, OrderSide, ApiException

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -57,81 +57,81 @@ def create_order(
price,
type,
side,
amount_target_symbol=None,
amount_trading_symbol=None,
amount,
market=None,
execute=False,
validate=False
execute=True,
validate=True,
sync=True
):
portfolio = self.portfolio_service.find({"market": market})
return self.order_service.create(
{
"target_symbol": target_symbol,
"price": price,
"amount_target_symbol": amount_target_symbol,
"amount_trading_symbol": amount_trading_symbol,
"amount": amount,
"type": type,
"side": side,
"portfolio_id": portfolio.id,
"status": OrderStatus.PENDING.value,
"trading_symbol": portfolio.trading_symbol,
},
execute=execute,
validate=validate
validate=validate,
sync=sync
)

def create_limit_order(
self,
target_symbol,
price,
side,
amount_target_symbol=None,
amount_trading_symbol=None,
amount,
market=None,
execute=True,
validate=True
validate=True,
sync=True
):
portfolio = self.portfolio_service.find({"market": market})
return self.order_service.create(
{
"target_symbol": target_symbol,
"price": price,
"amount_target_symbol": amount_target_symbol,
"amount_trading_symbol": amount_trading_symbol,
"amount": amount,
"type": OrderType.LIMIT.value,
"side": OrderSide.from_value(side).value,
"portfolio_id": portfolio.id,
"status": OrderStatus.PENDING.value,
"trading_symbol": portfolio.trading_symbol,
},
execute=execute,
validate=validate
validate=validate,
sync=sync
)

def create_market_order(
self,
target_symbol,
side,
amount_target_symbol=None,
amount_trading_symbol=None,
amount,
market=None,
execute=False,
validate=False
validate=False,
sync=True
):
portfolio = self.portfolio_service.find({"market": market})
return self.order_service.create(
{
"target_symbol": target_symbol,
"amount_target_symbol": amount_target_symbol,
"amount_trading_symbol": amount_trading_symbol,
"amount": amount,
"type": OrderType.MARKET.value,
"side": OrderSide.from_value(side).value,
"portfolio_id": portfolio.id,
"status": OrderStatus.PENDING.value,
"trading_symbol": portfolio.trading_symbol,
},
execute=execute,
validate=validate
validate=validate,
sync=sync
)

def check_order_status(self, market=None, symbol=None, status=None):
Expand Down Expand Up @@ -223,6 +223,9 @@ def get_orders(
}
)

def get_order_fee(self, order_id) -> OrderFee:
return self.order_service.get_order_fee(order_id)

def get_positions(self, market=None, identifier=None) -> List[Position]:
query_params = {}

Expand Down Expand Up @@ -338,3 +341,6 @@ def get_allocated(self, market=None, identifier=None) -> float:
allocated = allocated + (position.amount * price["bid"])

return allocated

def get_portfolio_configurations(self):
return self.portfolio_configuration_service.get_all()
4 changes: 4 additions & 0 deletions investing_algorithm_framework/app/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,7 @@ def create_portfolios(self):
for portfolio_configuration in \
portfolio_configuration_service.get_all():
market_service.initialize(portfolio_configuration)

if portfolio_repository.exists(
{"identifier": portfolio_configuration.identifier}
):
Expand Down Expand Up @@ -365,3 +366,6 @@ def _create_database_if_not_exists(self):
raise OperationalException(
"Could not create database directory"
)

def get_portfolio_configurations(self):
return self.algorithm.get_portfolio_configurations()
3 changes: 1 addition & 2 deletions investing_algorithm_framework/app/web/schemas/order.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@ class OrderSerializer(Schema):
target_symbol = fields.String(dump_only=True)
trading_symbol = fields.String(dump_only=True)
price = fields.Float(dump_only=True)
amount_target_symbol = fields.Float(dump_only=True)
amount_trading_symbol = fields.Float(dump_only=True)
amount = fields.Float(dump_only=True)
status = fields.String(dump_only=True)
type = fields.String(dump_only=True)
side = fields.String(dump_only=True)
17 changes: 13 additions & 4 deletions investing_algorithm_framework/dependency_container.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
from dependency_injector import containers, providers

from investing_algorithm_framework.infrastructure import SQLOrderRepository, \
SQLPositionRepository, MarketService, SQLPortfolioRepository
SQLPositionRepository, MarketService, SQLPortfolioRepository, \
SQLPositionCostRepository, SQLOrderFeeRepository
from investing_algorithm_framework.services import OrderService, \
PositionService, PortfolioService, StrategyOrchestratorService, \
PortfolioConfigurationService, MarketDataService
PortfolioConfigurationService, MarketDataService, PositionCostService
from investing_algorithm_framework.app.algorithm import Algorithm


Expand All @@ -18,27 +19,35 @@ class DependencyContainer(containers.DeclarativeContainer):
config = providers.Configuration()
wiring_config = containers.WiringConfiguration()
order_repository = providers.Factory(SQLOrderRepository)
order_fee_repository = providers.Factory(SQLOrderFeeRepository)
position_repository = providers.Factory(SQLPositionRepository)
position_cost_repository = providers.Factory(SQLPositionCostRepository)
portfolio_repository = providers.Factory(SQLPortfolioRepository)
market_service = providers.Factory(MarketService)
market_data_service = providers.Factory(
MarketDataService,
market_service=market_service
)
portfolio_configuration_service = providers.Singleton(
portfolio_configuration_service = providers.ThreadSafeSingleton(
PortfolioConfigurationService,
market_service=market_service,
portfolio_repository=portfolio_repository,
position_repository=position_repository,
)
order_service = providers.Factory(
OrderService,
position_cost_repository=position_cost_repository,
order_repository=order_repository,
order_fee_repository=order_fee_repository,
portfolio_repository=portfolio_repository,
position_repository=position_repository,
market_service=market_service,
portfolio_configuration_service=portfolio_configuration_service,
)
position_cost_service = providers.Factory(
PositionCostService,
repository=position_cost_repository,
)
position_service = providers.Factory(
PositionService,
repository=position_repository,
Expand All @@ -48,7 +57,7 @@ class DependencyContainer(containers.DeclarativeContainer):
PortfolioService,
market_service=market_service,
position_repository=position_repository,
order_repository=order_repository,
order_service=order_service,
portfolio_repository=portfolio_repository,
portfolio_configuration_service=portfolio_configuration_service
)
Expand Down
6 changes: 4 additions & 2 deletions investing_algorithm_framework/domain/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from .models import OrderStatus, OrderSide, OrderType, TimeInterval, \
TimeUnit, TimeFrame, TradingTimeFrame, TradingDataType, Ticker, \
OHLCV, OrderBook, PortfolioConfiguration, AssetPrice, Portfolio, \
Position, Order
Position, Order, PositionCost, OrderFee
from .exceptions import OperationalException, ApiException, \
PermissionDeniedApiException, ImproperlyConfigured
from .constants import ITEMIZE, ITEMIZED, PER_PAGE, PAGE, ENVIRONMENT, \
Expand Down Expand Up @@ -59,5 +59,7 @@
"Order",
"Strategy",
"DATETIME_FORMAT",
"StatelessActions"
"StatelessActions",
"PositionCost",
"OrderFee"
]
8 changes: 5 additions & 3 deletions investing_algorithm_framework/domain/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
from .order import OrderStatus, OrderSide, OrderType, Order
from .order import OrderStatus, OrderSide, OrderType, Order, OrderFee
from .time_frame import TimeFrame
from .time_interval import TimeInterval
from .time_unit import TimeUnit
from .market_data import OHLCV, OrderBook, Ticker, AssetPrice
from .trading_data_types import TradingDataType
from .trading_time_frame import TradingTimeFrame
from .portfolio import PortfolioConfiguration, Portfolio
from .position import Position
from .position import Position, PositionCost

__all__ = [
"OrderStatus",
Expand All @@ -24,5 +24,7 @@
"PortfolioConfiguration",
"AssetPrice",
"Position",
"Portfolio"
"PositionCost",
"Portfolio",
"OrderFee"
]
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@
from .order_side import OrderSide
from .order_status import OrderStatus
from .order import Order
from .order_fee import OrderFee

__all__ = ["OrderType", "OrderStatus", "OrderSide", "Order"]
__all__ = ["OrderType", "OrderStatus", "OrderSide", "Order", "OrderFee"]
Loading

0 comments on commit 30034a4

Please sign in to comment.