Skip to content

Commit 550972c

Browse files
committed
add signal builder tests
1 parent 0a784a9 commit 550972c

File tree

6 files changed

+43
-5
lines changed

6 files changed

+43
-5
lines changed

octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,11 @@ class BalancedTakeProfitAndStopOrderGroup(order_group.OrderGroup):
4545
UPDATED_PRICE = "updated_price"
4646
INITIAL_PRICE = "initial_price"
4747

48-
def __init__(self, name, orders_manager):
49-
super().__init__(name, orders_manager)
48+
def __init__(
49+
self, name, orders_manager,
50+
active_order_swap_strategy: typing.Optional[active_order_swap_strategies.ActiveOrderSwapStrategy] = None
51+
):
52+
super().__init__(name, orders_manager, active_order_swap_strategy=active_order_swap_strategy)
5053
# keep track of orders being balanced to avoid nested balance issues
5154
self.balancing_orders = []
5255

octobot_trading/personal_data/orders/order.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ def is_open(self):
380380
# also check is_initialized to avoid considering uncreated orders as open
381381
return (
382382
self.state is None or self.state.is_open() or (
383-
not self.is_active and self.status is enums.OrderStatus.OPEN
383+
not self.is_active and self.status is enums.OrderStatus.OPEN and not self.is_waiting_for_chained_trigger
384384
)
385385
)
386386

octobot_trading/signals/trading_signal_bundle_builder.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,12 @@ def _update_pending_orders(
185185
order_description[trading_enums.TradingSignalOrdersAttrs.GROUP_ID.value] = order.order_group.name
186186
order_description[trading_enums.TradingSignalOrdersAttrs.GROUP_TYPE.value] = \
187187
order.order_group.__class__.__name__
188+
order_description[trading_enums.TradingSignalOrdersAttrs.ACTIVE_SWAP_STRATEGY_TYPE.value] = \
189+
order.order_group.active_order_swap_strategy.__class__.__name__
190+
order_description[trading_enums.TradingSignalOrdersAttrs.ACTIVE_SWAP_STRATEGY_TIMEOUT.value] = \
191+
order.order_group.active_order_swap_strategy.swap_timeout
192+
order_description[trading_enums.TradingSignalOrdersAttrs.ACTIVE_SWAP_STRATEGY_TRIGGER_CONFIG.value] = \
193+
order.order_group.active_order_swap_strategy.trigger_price_configuration
188194
elif action is trading_enums.TradingSignalOrdersActions.EDIT:
189195
# avoid editing order that are not yet created
190196
order_description[trading_enums.TradingSignalOrdersAttrs.TARGET_AMOUNT.value] = \

octobot_trading/signals/util.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ def create_order_signal_content(
6060
None if order.order_group is None else order.order_group.name,
6161
trading_enums.TradingSignalOrdersAttrs.GROUP_TYPE.value:
6262
None if order.order_group is None else order.order_group.__class__.__name__,
63+
trading_enums.TradingSignalOrdersAttrs.ACTIVE_SWAP_STRATEGY_TYPE.value: \
64+
order.order_group.active_order_swap_strategy.__class__.__name__ if order.order_group else None,
65+
trading_enums.TradingSignalOrdersAttrs.ACTIVE_SWAP_STRATEGY_TIMEOUT.value: \
66+
order.order_group.active_order_swap_strategy.swap_timeout if order.order_group else None,
67+
trading_enums.TradingSignalOrdersAttrs.ACTIVE_SWAP_STRATEGY_TRIGGER_CONFIG.value: \
68+
order.order_group.active_order_swap_strategy.trigger_price_configuration if order.order_group else None,
6369
trading_enums.TradingSignalOrdersAttrs.TAG.value: order.tag,
6470
trading_enums.TradingSignalOrdersAttrs.ASSOCIATED_ORDER_IDS.value: order.associated_entry_ids,
6571
trading_enums.TradingSignalOrdersAttrs.UPDATE_WITH_TRIGGERING_ORDER_FEES.value:

octobot_trading/storage/orders_storage.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ def restore_order_storage_origin_value(origin_val):
280280
decimal.Decimal(str(
281281
origin_val[enums.ExchangeConstantsOrderColumns.FEE.value][enums.FeePropertyColumns.COST.value]
282282
))
283-
if origin_val[enums.ExchangeConstantsOrderColumns.ACTIVE_TRIGGER_PRICE.value] is not None:
283+
if origin_val.get(enums.ExchangeConstantsOrderColumns.ACTIVE_TRIGGER_PRICE.value) is not None:
284284
origin_val[enums.ExchangeConstantsOrderColumns.ACTIVE_TRIGGER_PRICE.value] = \
285285
decimal.Decimal(str(origin_val[enums.ExchangeConstantsOrderColumns.ACTIVE_TRIGGER_PRICE.value]))
286286
return origin_val

tests/signals/test_trading_signal_bundle_builder.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import octobot_trading.enums as enums
2323
import octobot_trading.errors as errors
24+
import octobot_trading.constants as constants
2425
import octobot_trading.signals as signals
2526

2627
from tests import event_loop
@@ -126,12 +127,18 @@ def test_add_created_order(trading_signal_bundle_builder, buy_limit_order):
126127
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.TARGET_AMOUNT.value] is None
127128
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.TARGET_POSITION.value] == "2%"
128129
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.TRIGGER_ABOVE.value] is False
130+
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.IS_ACTIVE.value] is True
131+
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.ACTIVE_TRIGGER_PRICE.value] is None
132+
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.ACTIVE_TRIGGER_ABOVE.value] is None
129133

130134
# add new order (orders are based on order_id)
131135
previous_order_id = buy_limit_order.order_id
132136
buy_limit_order.order_id = "other_id"
133137
buy_limit_order.order_type = enums.TraderOrderType.STOP_LOSS_LIMIT
134138
buy_limit_order.trigger_above = True
139+
buy_limit_order.is_active = False
140+
buy_limit_order.active_trigger_price = decimal.Decimal(12)
141+
buy_limit_order.active_trigger_above = True
135142
trading_signal_bundle_builder.add_created_order(buy_limit_order, buy_limit_order.exchange_manager, target_position="50")
136143
assert len(trading_signal_bundle_builder.signals) == 2
137144
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.ORDER_ID.value] == \
@@ -146,6 +153,9 @@ def test_add_created_order(trading_signal_bundle_builder, buy_limit_order):
146153
assert trading_signal_bundle_builder.signals[1].content[enums.TradingSignalOrdersAttrs.TARGET_AMOUNT.value] is None
147154
assert trading_signal_bundle_builder.signals[1].content[enums.TradingSignalOrdersAttrs.TARGET_POSITION.value] == "50"
148155
assert trading_signal_bundle_builder.signals[1].content[enums.TradingSignalOrdersAttrs.TRIGGER_ABOVE.value] is True
156+
assert trading_signal_bundle_builder.signals[1].content[enums.TradingSignalOrdersAttrs.IS_ACTIVE.value] is False
157+
assert trading_signal_bundle_builder.signals[1].content[enums.TradingSignalOrdersAttrs.ACTIVE_TRIGGER_PRICE.value] == 12
158+
assert trading_signal_bundle_builder.signals[1].content[enums.TradingSignalOrdersAttrs.ACTIVE_TRIGGER_ABOVE.value] is True
149159

150160

151161
def test_add_order_to_group(trading_signal_bundle_builder, buy_limit_order):
@@ -164,6 +174,9 @@ def test_add_order_to_group(trading_signal_bundle_builder, buy_limit_order):
164174

165175
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.GROUP_ID.value] is None
166176
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.GROUP_TYPE.value] is None
177+
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.ACTIVE_SWAP_STRATEGY_TYPE.value] is None
178+
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.ACTIVE_SWAP_STRATEGY_TIMEOUT.value] is None
179+
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.ACTIVE_SWAP_STRATEGY_TRIGGER_CONFIG.value] is None
167180

168181
order_group = personal_data.OneCancelsTheOtherOrderGroup(
169182
"group_name",
@@ -175,6 +188,9 @@ def test_add_order_to_group(trading_signal_bundle_builder, buy_limit_order):
175188
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.GROUP_ID.value] == "group_name"
176189
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.GROUP_TYPE.value] == \
177190
personal_data.OneCancelsTheOtherOrderGroup.__name__
191+
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.ACTIVE_SWAP_STRATEGY_TYPE.value] is personal_data.StopFirstActiveOrderSwapStrategy.__name__
192+
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.ACTIVE_SWAP_STRATEGY_TIMEOUT.value] == constants.ACTIVE_ORDER_STRATEGY_SWAP_TIMEOUT
193+
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.ACTIVE_SWAP_STRATEGY_TRIGGER_CONFIG.value] == enums.ActiveOrderSwapTriggerPriceConfiguration.FILLING_PRICE.value
178194

179195
# add the same order: do not add it twice
180196
trading_signal_bundle_builder.add_order_to_group(buy_limit_order, buy_limit_order.exchange_manager)
@@ -185,7 +201,11 @@ def test_add_order_to_group(trading_signal_bundle_builder, buy_limit_order):
185201
# update the same order
186202
other_order_group = personal_data.BalancedTakeProfitAndStopOrderGroup(
187203
"group_name_2",
188-
buy_limit_order.exchange_manager.exchange_personal_data.orders_manager
204+
buy_limit_order.exchange_manager.exchange_personal_data.orders_manager,
205+
active_order_swap_strategy=personal_data.StopFirstActiveOrderSwapStrategy(
206+
swap_timeout=3,
207+
trigger_price_configuration="plop",
208+
)
189209
)
190210
buy_limit_order.add_to_order_group(other_order_group)
191211
trading_signal_bundle_builder.add_order_to_group(buy_limit_order, buy_limit_order.exchange_manager)
@@ -202,6 +222,9 @@ def test_add_order_to_group(trading_signal_bundle_builder, buy_limit_order):
202222
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.GROUP_ID.value] == "group_name_2"
203223
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.GROUP_TYPE.value] == \
204224
personal_data.BalancedTakeProfitAndStopOrderGroup.__name__
225+
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.ACTIVE_SWAP_STRATEGY_TYPE.value] is personal_data.StopFirstActiveOrderSwapStrategy.__name__
226+
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.ACTIVE_SWAP_STRATEGY_TIMEOUT.value] == 3
227+
assert trading_signal_bundle_builder.signals[0].content[enums.TradingSignalOrdersAttrs.ACTIVE_SWAP_STRATEGY_TRIGGER_CONFIG.value] == "plop"
205228
assert trading_signal_bundle_builder.signals[1].content[enums.TradingSignalOrdersAttrs.GROUP_ID.value] == "group_name"
206229
assert trading_signal_bundle_builder.signals[1].content[enums.TradingSignalOrdersAttrs.GROUP_TYPE.value] == \
207230
personal_data.OneCancelsTheOtherOrderGroup.__name__

0 commit comments

Comments
 (0)