Skip to content

Commit 4253f16

Browse files
Merge pull request #1602 from bug-or-feature/bug-1524-error-getting-strategy
2 parents 9e9de09 + a3b8933 commit 4253f16

File tree

2 files changed

+38
-18
lines changed

2 files changed

+38
-18
lines changed

sysproduction/data/strategies.py

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from sysdata.data_blob import dataBlob
22
from syscore.constants import arg_not_supplied
3+
from syscore.exceptions import missingData
34
from syscore.interactive.menus import print_menu_of_values_and_get_response
45
from sysproduction.data.positions import diagPositions
56
from sysproduction.data.optimal_positions import dataOptimalPositions
@@ -47,15 +48,16 @@ def config(self):
4748

4849

4950
def get_list_of_strategies(data: dataBlob = arg_not_supplied, source="config") -> list:
50-
if source == "config":
51-
return get_list_of_strategies_from_config(data)
52-
elif source == "positions":
53-
return get_list_of_strategies_from_positions(data)
54-
elif source == "optimal_positions":
55-
return get_list_of_strategies_from_optimal_positions(data)
56-
else:
51+
handlers = {
52+
"config": get_list_of_strategies_from_config,
53+
"positions": get_list_of_strategies_from_positions,
54+
"optimal_positions": get_list_of_strategies_from_optimal_positions,
55+
}
56+
if source not in handlers.keys():
5757
raise Exception("Source %s not recognised!" % source)
5858

59+
return handlers[source](data)
60+
5961

6062
def get_list_of_strategies_from_config(data: dataBlob = arg_not_supplied) -> list:
6163
diag_strategies_config = diagStrategiesConfig(data)
@@ -87,8 +89,19 @@ def get_valid_strategy_name_from_user(
8789
allow_all: bool = False,
8890
all_code: str = "ALL",
8991
source: str = "config",
90-
):
92+
prompt: str = "Which strategy?",
93+
backup_source: str = None,
94+
) -> str:
95+
assert source != backup_source
96+
print(prompt)
9197
all_strategies = get_list_of_strategies(data=data, source=source)
98+
if not all_strategies and backup_source:
99+
print(f"No strategies found using source '{source}', trying '{backup_source}'")
100+
all_strategies = get_list_of_strategies(data=data, source=backup_source)
101+
102+
if not all_strategies:
103+
raise missingData("No strategies found")
104+
92105
if allow_all:
93106
default_strategy = all_code
94107
else:

sysproduction/interactive_order_stack.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
from sysexecution.algos.allocate_algo_to_order import get_list_of_algos
5151
from sysbrokers.IB.ib_connection import connectionIB
5252
from syscore.constants import arg_not_supplied
53+
from syscore.exceptions import missingData
5354

5455
from sysobjects.contracts import futuresContract
5556

@@ -199,17 +200,18 @@ def create_balance_trade(data):
199200

200201
broker_order = get_broker_order_details_for_balance_trade(data)
201202

202-
print(broker_order)
203-
ans = input("Are you sure? (Y/other)")
204-
if ans != "Y":
205-
return None
203+
if broker_order:
204+
print(broker_order)
205+
ans = input("Are you sure? (Y/other)")
206+
if ans != "Y":
207+
return
206208

207-
stack_handler = stackHandlerCreateBalanceTrades(data)
209+
stack_handler = stackHandlerCreateBalanceTrades(data)
208210

209-
stack_handler.create_balance_trade(broker_order)
211+
stack_handler.create_balance_trade(broker_order)
210212

211213

212-
def get_broker_order_details_for_balance_trade(data: dataBlob) -> brokerOrder:
214+
def get_broker_order_details_for_balance_trade(data: dataBlob) -> brokerOrder | None:
213215
ans = true_if_answer_is_yes(
214216
"Auto close an existing position (if not, manually enter details)?"
215217
)
@@ -242,10 +244,15 @@ def get_broker_order_details_for_balance_trade(data: dataBlob) -> brokerOrder:
242244
"Commission", type_expected=float, allow_default=True, default_value=0.0
243245
)
244246

245-
strategy_name = get_valid_strategy_name_from_user(data=data, source="positions")
247+
try:
248+
strategy_name = get_valid_strategy_name_from_user(
249+
data=data, source="positions", backup_source="config"
250+
)
251+
except missingData as md:
252+
print(f"Problem getting strategy name: {md}\n")
253+
return None
246254

247-
data_broker = dataBroker(data)
248-
default_account = data_broker.get_broker_account()
255+
default_account = data.config.get_element("broker_account")
249256
broker_account = get_input_from_user_and_convert_to_type(
250257
"Account ID",
251258
type_expected=str,

0 commit comments

Comments
 (0)