Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 30 additions & 23 deletions agents/application/trade.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def clear_local_dbs(self) -> None:
except:
pass

def one_best_trade(self) -> None:
def one_best_trade(self, max_retries: int = 3) -> None:
"""

one_best_trade is a strategy that evaluates all events, markets, and orderbooks
Expand All @@ -34,35 +34,42 @@ def one_best_trade(self) -> None:
then executes that trade without any human intervention

"""
try:
self.pre_trade_logic()
retries_remaining = max(0, max_retries)

while True:
try:
self.pre_trade_logic()

events = self.polymarket.get_all_tradeable_events()
print(f"1. FOUND {len(events)} EVENTS")

events = self.polymarket.get_all_tradeable_events()
print(f"1. FOUND {len(events)} EVENTS")
filtered_events = self.agent.filter_events_with_rag(events)
print(f"2. FILTERED {len(filtered_events)} EVENTS")

filtered_events = self.agent.filter_events_with_rag(events)
print(f"2. FILTERED {len(filtered_events)} EVENTS")
markets = self.agent.map_filtered_events_to_markets(filtered_events)
print()
print(f"3. FOUND {len(markets)} MARKETS")

markets = self.agent.map_filtered_events_to_markets(filtered_events)
print()
print(f"3. FOUND {len(markets)} MARKETS")
print()
filtered_markets = self.agent.filter_markets(markets)
print(f"4. FILTERED {len(filtered_markets)} MARKETS")

print()
filtered_markets = self.agent.filter_markets(markets)
print(f"4. FILTERED {len(filtered_markets)} MARKETS")
market = filtered_markets[0]
best_trade = self.agent.source_best_trade(market)
print(f"5. CALCULATED TRADE {best_trade}")

market = filtered_markets[0]
best_trade = self.agent.source_best_trade(market)
print(f"5. CALCULATED TRADE {best_trade}")
amount = self.agent.format_trade_prompt_for_execution(best_trade)
# Please refer to TOS before uncommenting: polymarket.com/tos
# trade = self.polymarket.execute_market_order(market, amount)
# print(f"6. TRADED {trade}")
return

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

except Exception as e:
print(f"Error {e} \n \n Retrying")
self.one_best_trade()
print(f"Error {e} \n \n Retrying")
retries_remaining -= 1

def maintain_positions(self):
pass
Expand Down
60 changes: 60 additions & 0 deletions tests/test_trade.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import importlib
import sys
import types
import unittest
from unittest import mock


def load_trade_module():
sys.modules.pop("agents.application.trade", None)

executor_module = types.ModuleType("agents.application.executor")
gamma_module = types.ModuleType("agents.polymarket.gamma")
polymarket_module = types.ModuleType("agents.polymarket.polymarket")

class Executor:
pass

class GammaMarketClient:
pass

class Polymarket:
pass

executor_module.Executor = Executor
gamma_module.GammaMarketClient = GammaMarketClient
polymarket_module.Polymarket = Polymarket

with mock.patch.dict(
sys.modules,
{
"agents.application.executor": executor_module,
"agents.polymarket.gamma": gamma_module,
"agents.polymarket.polymarket": polymarket_module,
},
):
return importlib.import_module("agents.application.trade")


class TraderRetryTests(unittest.TestCase):
def test_one_best_trade_raises_original_error_after_bounded_retries(self):
trade_module = load_trade_module()
trader = trade_module.Trader.__new__(trade_module.Trader)

attempts = {"count": 0}

def always_fail():
attempts["count"] += 1
raise RuntimeError("boom")

trader.pre_trade_logic = always_fail

with mock.patch("builtins.print"):
with self.assertRaisesRegex(RuntimeError, "boom"):
trader.one_best_trade(max_retries=2)

self.assertEqual(attempts["count"], 3)


if __name__ == "__main__":
unittest.main()