diff --git a/bot_new.py b/bot_new.py index dc39251..c8606d0 100644 --- a/bot_new.py +++ b/bot_new.py @@ -112,6 +112,17 @@ class StateManager: self.CONVERSION_FEE = 10 self.ETF_COMPONENTS = {"XLF": {"BOND": 3, "GS": 2, "MS": 3, "WFC": 2}} self.ETF_SHARES = {"XLF": 10} + self.POSITION_LIMIT = { + "BOND": 100, + "VALBZ": 10, + "VALE": 10, + "GS": 100, + "MS": 100, + "WFC": 100, + "XLF": 100, + } + self.last_strategy_time = 0 + self.strategy_interval = 0.1 def position_for_symbol(self, symbol): return self.positions_by_symbol.get(symbol, 0) @@ -227,22 +238,40 @@ class StateManager: self.average_xlf_price.pop(0) self.average_xlf_price.append(price) + def can_add_position(self, symbol, size, is_buy): + current = self.position_for_symbol(symbol) + if is_buy: + return current + size <= self.POSITION_LIMIT.get(symbol, 100) + else: + return current - size >= -self.POSITION_LIMIT.get(symbol, 100) + def execute_strategies(self): + now = time.time() + if now - self.last_strategy_time < self.strategy_interval: + return + self.last_strategy_time = now + avg_valbz = self.get_average_price(self.average_valbz_price) avg_vale = self.get_average_price(self.average_vale_price) avg_xlf = self.get_average_price(self.average_xlf_price) if len(self.average_valbz_price) >= 5: - self.set_orders_in_symbol_for_direction("VALBZ", "SELL", {avg_valbz + 1: 1}) - self.set_orders_in_symbol_for_direction("VALBZ", "BUY", {avg_valbz - 1: 1}) + sell_size = 1 if self.can_add_position("VALBZ", 1, False) else 0 + buy_size = 1 if self.can_add_position("VALBZ", 1, True) else 0 + self.set_orders_in_symbol_for_direction("VALBZ", "SELL", {avg_valbz + 1: sell_size}) + self.set_orders_in_symbol_for_direction("VALBZ", "BUY", {avg_valbz - 1: buy_size}) if len(self.average_vale_price) >= 5: - self.set_orders_in_symbol_for_direction("VALE", "SELL", {avg_vale + 1: 1}) - self.set_orders_in_symbol_for_direction("VALE", "BUY", {avg_vale - 1: 1}) + sell_size = 1 if self.can_add_position("VALE", 1, False) else 0 + buy_size = 1 if self.can_add_position("VALE", 1, True) else 0 + self.set_orders_in_symbol_for_direction("VALE", "SELL", {avg_vale + 1: sell_size}) + self.set_orders_in_symbol_for_direction("VALE", "BUY", {avg_vale - 1: buy_size}) if len(self.average_xlf_price) >= 25: - self.set_orders_in_symbol_for_direction("XLF", "SELL", {avg_xlf + 1: 1}) - self.set_orders_in_symbol_for_direction("XLF", "BUY", {avg_xlf - 1: 1}) + sell_size = 1 if self.can_add_position("XLF", 1, False) else 0 + buy_size = 1 if self.can_add_position("XLF", 1, True) else 0 + self.set_orders_in_symbol_for_direction("XLF", "SELL", {avg_xlf + 1: sell_size}) + self.set_orders_in_symbol_for_direction("XLF", "BUY", {avg_xlf - 1: buy_size}) self.execute_arb() @@ -257,12 +286,12 @@ class StateManager: spread = avg_valbz - avg_vale if spread > self.CONVERSION_FEE: - if abs(vale_pos + 1) <= 10 and abs(valbz_pos - 1) <= 10: + if self.can_add_position("VALE", 1, True) and self.can_add_position("VALBZ", 1, False): self.send_order("VALE", "BUY", avg_vale, 1) self.convert("VALE", Dir.SELL, 1) self.send_order("VALBZ", "SELL", avg_valbz, 1) elif spread < -self.CONVERSION_FEE: - if abs(vale_pos - 1) <= 10 and abs(valbz_pos + 1) <= 10: + if self.can_add_position("VALE", 1, False) and self.can_add_position("VALBZ", 1, True): self.send_order("VALE", "SELL", avg_vale, 1) self.convert("VALE", Dir.BUY, 1) self.send_order("VALBZ", "BUY", avg_valbz, 1) @@ -270,9 +299,9 @@ class StateManager: def on_startup(self): bond_pos = self.position_for_symbol("BOND") if bond_pos > 0: - self.send_order("BOND", "SELL", 1001, bond_pos) + self.send_order("BOND", "SELL", 1001, min(bond_pos, self.POSITION_LIMIT["BOND"])) elif bond_pos < 0: - self.send_order("BOND", "BUY", 999, -bond_pos) + self.send_order("BOND", "BUY", 999, min(-bond_pos, self.POSITION_LIMIT["BOND"])) def parse_arguments():