Skip to content

Commit edc6dc5

Browse files
committed
Set max_leverage to output a warning by default
Signed-off-by: Nikola Losic <nikolalosic@protonmail.ch>
1 parent 052c5d7 commit edc6dc5

3 files changed

Lines changed: 16 additions & 3 deletions

File tree

ziplime/core/run_simulation.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ async def run_simulation(
129129
benchmark_asset_symbol=benchmark_asset_symbol,
130130
stop_on_error=stop_on_error,
131131
custom_data_sources=custom_data_sources,
132+
max_leverage=max_leverage
132133
)
133134

134135

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import structlog
2+
13
from ziplime.finance.controls.account_control import AccountControl
24

35

@@ -6,20 +8,27 @@ class MaxLeverage(AccountControl):
68
by the algorithm.
79
"""
810

9-
def __init__(self, max_leverage):
11+
def __init__(self, max_leverage:float, fail_on_error: bool = True,
12+
logger = structlog.get_logger(__name__)):
1013
"""max_leverage is the gross leverage in decimal form. For example,
1114
2, limits an algorithm to trading at most double the account value.
1215
"""
1316
super(MaxLeverage, self).__init__(max_leverage=max_leverage)
1417
self.max_leverage = max_leverage
18+
self._logger = logger
1519

1620
if max_leverage is None:
1721
raise ValueError("Must supply max_leverage")
1822

1923
if max_leverage < 0:
2024
raise ValueError("max_leverage must be positive")
25+
self.fail_on_error = fail_on_error
2126

2227
def validate(self, _portfolio, _account, _algo_datetime, _algo_current_data):
2328
"""Fail if the leverage is greater than the allowed leverage."""
2429
if _account.leverage > self.max_leverage:
25-
self.fail()
30+
if self.fail_on_error:
31+
self._logger.error(f"Current leverage {_account.leverage} exceeds max_leverage of {self.max_leverage}.", dt=_algo_current_data.current_dt)
32+
self.fail()
33+
else:
34+
self._logger.warning(f"Current leverage {_account.leverage} exceeds max_leverage of {self.max_leverage}.", dt=_algo_current_data.current_dt)

ziplime/utils/run_algo.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from ziplime.core.algorithm_file import AlgorithmFile
99
from ziplime.data.services.data_source import DataSource
1010
from ziplime.exchanges.exchange import Exchange
11+
from ziplime.finance.controls.max_leverage import MaxLeverage
1112

1213
from ziplime.finance.blotter.in_memory_blotter import InMemoryBlotter
1314
from ziplime.gens.domain.trading_clock import TradingClock
@@ -175,6 +176,8 @@ def choose_loader(column):
175176
custom_data_sources=custom_data_sources
176177
)
177178

178-
tr.set_max_leverage(max_leverage=max_leverage)
179+
if max_leverage is not None:
180+
max_leverage = MaxLeverage(max_leverage, fail_on_error=False)
181+
tr.register_account_control(control=max_leverage)
179182

180183
return tr

0 commit comments

Comments
 (0)