Skip to content
This repository was archived by the owner on May 11, 2026. It is now read-only.

Commit 9b9a85a

Browse files
committed
Bound retry loop in Trader.one_best_trade
1 parent 081f2b5 commit 9b9a85a

2 files changed

Lines changed: 90 additions & 23 deletions

File tree

agents/application/trade.py

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def clear_local_dbs(self) -> None:
2424
except:
2525
pass
2626

27-
def one_best_trade(self) -> None:
27+
def one_best_trade(self, max_retries: int = 3) -> None:
2828
"""
2929
3030
one_best_trade is a strategy that evaluates all events, markets, and orderbooks
@@ -34,35 +34,42 @@ def one_best_trade(self) -> None:
3434
then executes that trade without any human intervention
3535
3636
"""
37-
try:
38-
self.pre_trade_logic()
37+
retries_remaining = max(0, max_retries)
38+
39+
while True:
40+
try:
41+
self.pre_trade_logic()
42+
43+
events = self.polymarket.get_all_tradeable_events()
44+
print(f"1. FOUND {len(events)} EVENTS")
3945

40-
events = self.polymarket.get_all_tradeable_events()
41-
print(f"1. FOUND {len(events)} EVENTS")
46+
filtered_events = self.agent.filter_events_with_rag(events)
47+
print(f"2. FILTERED {len(filtered_events)} EVENTS")
4248

43-
filtered_events = self.agent.filter_events_with_rag(events)
44-
print(f"2. FILTERED {len(filtered_events)} EVENTS")
49+
markets = self.agent.map_filtered_events_to_markets(filtered_events)
50+
print()
51+
print(f"3. FOUND {len(markets)} MARKETS")
4552

46-
markets = self.agent.map_filtered_events_to_markets(filtered_events)
47-
print()
48-
print(f"3. FOUND {len(markets)} MARKETS")
53+
print()
54+
filtered_markets = self.agent.filter_markets(markets)
55+
print(f"4. FILTERED {len(filtered_markets)} MARKETS")
4956

50-
print()
51-
filtered_markets = self.agent.filter_markets(markets)
52-
print(f"4. FILTERED {len(filtered_markets)} MARKETS")
57+
market = filtered_markets[0]
58+
best_trade = self.agent.source_best_trade(market)
59+
print(f"5. CALCULATED TRADE {best_trade}")
5360

54-
market = filtered_markets[0]
55-
best_trade = self.agent.source_best_trade(market)
56-
print(f"5. CALCULATED TRADE {best_trade}")
61+
amount = self.agent.format_trade_prompt_for_execution(best_trade)
62+
# Please refer to TOS before uncommenting: polymarket.com/tos
63+
# trade = self.polymarket.execute_market_order(market, amount)
64+
# print(f"6. TRADED {trade}")
65+
return
5766

58-
amount = self.agent.format_trade_prompt_for_execution(best_trade)
59-
# Please refer to TOS before uncommenting: polymarket.com/tos
60-
# trade = self.polymarket.execute_market_order(market, amount)
61-
# print(f"6. TRADED {trade}")
67+
except Exception as e:
68+
if retries_remaining == 0:
69+
raise
6270

63-
except Exception as e:
64-
print(f"Error {e} \n \n Retrying")
65-
self.one_best_trade()
71+
print(f"Error {e} \n \n Retrying")
72+
retries_remaining -= 1
6673

6774
def maintain_positions(self):
6875
pass

tests/test_trade.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import importlib
2+
import sys
3+
import types
4+
import unittest
5+
from unittest import mock
6+
7+
8+
def load_trade_module():
9+
sys.modules.pop("agents.application.trade", None)
10+
11+
executor_module = types.ModuleType("agents.application.executor")
12+
gamma_module = types.ModuleType("agents.polymarket.gamma")
13+
polymarket_module = types.ModuleType("agents.polymarket.polymarket")
14+
15+
class Executor:
16+
pass
17+
18+
class GammaMarketClient:
19+
pass
20+
21+
class Polymarket:
22+
pass
23+
24+
executor_module.Executor = Executor
25+
gamma_module.GammaMarketClient = GammaMarketClient
26+
polymarket_module.Polymarket = Polymarket
27+
28+
with mock.patch.dict(
29+
sys.modules,
30+
{
31+
"agents.application.executor": executor_module,
32+
"agents.polymarket.gamma": gamma_module,
33+
"agents.polymarket.polymarket": polymarket_module,
34+
},
35+
):
36+
return importlib.import_module("agents.application.trade")
37+
38+
39+
class TraderRetryTests(unittest.TestCase):
40+
def test_one_best_trade_raises_original_error_after_bounded_retries(self):
41+
trade_module = load_trade_module()
42+
trader = trade_module.Trader.__new__(trade_module.Trader)
43+
44+
attempts = {"count": 0}
45+
46+
def always_fail():
47+
attempts["count"] += 1
48+
raise RuntimeError("boom")
49+
50+
trader.pre_trade_logic = always_fail
51+
52+
with mock.patch("builtins.print"):
53+
with self.assertRaisesRegex(RuntimeError, "boom"):
54+
trader.one_best_trade(max_retries=2)
55+
56+
self.assertEqual(attempts["count"], 3)
57+
58+
59+
if __name__ == "__main__":
60+
unittest.main()

0 commit comments

Comments
 (0)