{"id":8,"date":"2026-04-29T11:23:07","date_gmt":"2026-04-29T11:23:07","guid":{"rendered":"https:\/\/www.passiveincomeengineering.com\/?p=8"},"modified":"2026-04-29T11:24:51","modified_gmt":"2026-04-29T11:24:51","slug":"copy-trading-on-polymarket-part-1","status":"publish","type":"post","link":"https:\/\/www.passiveincomeengineering.com\/?p=8","title":{"rendered":"Copy Trading on Polymarket (part 1)"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em><strong>Github repository: <a href=\"https:\/\/github.com\/Passive-Income-Engineering\/polymarket-copy-trading\">https:\/\/github.com\/Passive-Income-Engineering\/polymarket-copy-trading<\/a><\/strong><\/em><\/p>\n<\/blockquote>\n\n\n\n<p><\/p>\n\n\n\n<p>On March 29th, 2026, a friend of mine sent a Whatsapp message on a group. It was just a tweet, the Argentinian version of a tweet actually (so we probably got it a little bit later than the rest of the world). This was it: <a href=\"https:\/\/x.com\/santitorai\/status\/2037916520010154398?s=12&amp;t=7BEwc0zd8R4d6BNyfTDT-A\">https:\/\/x.com\/santitorai\/status\/2037916520010154398?s=12&amp;t=7BEwc0zd8R4d6BNyfTDT-A<\/a><\/p>\n\n\n\n<p><strong>tl;dr: someone did copy trading in Polymarket and made a shit-ton of money.<\/strong><\/p>\n\n\n\n<p>I&#8217;m a software engineer (not that it&#8217;s a requirement to build stuff anymore, but I guess we still do have a tiny bit of edge in some things) and I knew immediately how easy it was to build something like that. So I figured: why not?<\/p>\n\n\n\n<p>I use Claude Code on a daily basis for work (at this point I don&#8217;t even know what I&#8217;d do without it) so the first part of my basic needs were covered. The second part of my basic needs was liquidity (and actually getting some money in Polymarket), so I decided to put approximately 50USD (I don&#8217;t remember the exact number, and at that point I was not planning in blogging about it so I don&#8217;t have the actual number) there with a credit card. That was it. The next step was actually building (by building, of course, I mean telling Claude Code to build) the bot.<\/p>\n\n\n\n<p><em>After less than 24 hours, I was already seeing these numbers:<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"291\" src=\"https:\/\/www.passiveincomeengineering.com\/wp-content\/uploads\/2026\/04\/image-1024x291.png\" alt=\"\" class=\"wp-image-9\" srcset=\"https:\/\/www.passiveincomeengineering.com\/wp-content\/uploads\/2026\/04\/image-1024x291.png 1024w, https:\/\/www.passiveincomeengineering.com\/wp-content\/uploads\/2026\/04\/image-300x85.png 300w, https:\/\/www.passiveincomeengineering.com\/wp-content\/uploads\/2026\/04\/image-768x218.png 768w, https:\/\/www.passiveincomeengineering.com\/wp-content\/uploads\/2026\/04\/image-1536x437.png 1536w, https:\/\/www.passiveincomeengineering.com\/wp-content\/uploads\/2026\/04\/image.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Yes. <strong>14.5% profit in a few hours<\/strong>. It was so good that it didn&#8217;t take me long to increase my investment by adding 200USD more. <\/p>\n\n\n\n<p>If it sounds too good to be true, that&#8217;s exactly because it was: as it&#8217;s widely known, even a broken clock says the right time twice a day.<\/p>\n\n\n\n<p>This is what my bot looked like when i killed it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  The numbers                                                                                                                                                                                                 \n  \n  - Start: $260.63 \u2014 April 2, 2026, 21:05 UTC (first cycle after launch)                                                                                                                                      \n  - End: $242.85 \u2014 April 3, 2026, 13:35 UTC (last cycle before the path-resolution bug killed it)\n  - Realized P&amp;L: \u2212$17.78 (\u22126.82%)                                                                                                                                                                            \n  - Run duration: ~16.5 hours                                                                                                                                                                                 \n  - Polling cycles: 1,800                                                                                                                                                                                     \n  - Successful BUYs: 130                                                                                                                                                                                      \n  - Successful SELLs: 7                                           \n  - Min balance during run: $131.32 (\u2248 \u221250% drawdown intra-run)                                                                                                                                               \n  - Max balance: $260.80 (essentially flat at peak)                                                                                                                                                           \n  - Exposure when it died: $0.00 (per the bot's view)<\/code><\/pre>\n\n\n\n<p>What follows is a long explanation on why this bot didn&#8217;t work, and the caveats of copy trading (at least in Polymarket).<br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why copy-trading sounds like free money<\/h2>\n\n\n\n<p>I want to take the idea seriously, because the reason I built it is the same reason you are reading this and quietly thinking wait, that actually sort of makes sense though.<\/p>\n\n\n\n<p>Polymarket is a prediction market. People bet on whether Pete Hegseth will still be Secretary of Defense in December, or whether SGA wins MVP, or how many tweets Elon Musk posts in a given week. Each market has two sides, YES and NO, each with a price that trades between zero and one dollar. At resolution, the winning side pays out one dollar per share and the losing side pays out zero. So if YES is trading at 0.77, the market is pricing a 77% chance of yes, and a YES share is worth 77 cents today because it is worth one dollar if right and zero if wrong.<\/p>\n\n\n\n<p>The pitch that seduced me: every prediction market has a public leaderboard, ranked by total profit. The top names have made four, five, six million dollars over the last month. Their wallets are public, their trades are public, their entries and exits are public, Polymarket exposes all of this through an API with no authentication. So: copy them. They do the work. They have the information, the conviction, the political contacts, the sports sense. I just mirror their trades in miniature with my (not even) thousand dollar bankroll and take a scaled version of their profits.<\/p>\n\n\n\n<p>It is the kind of idea that sounds better the more you think about it, which is the warning sign I did not yet know how to read. It has the right shape: concrete, buildable in a weekend, free data, documented API. I do not need to understand politics or basketball or Elon. I just need a polling loop, a sizing function, and a safe order wrapper. Markets become an engineering problem and my complete lack of market intuition becomes a feature, because the whole point is that the wallets I am following already have the intuition I lack.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What I built<\/h2>\n\n\n\n<p>About five hundred lines of Python, no websockets, pure HTTP polling against Polymarket&#8217;s public Data API and on-chain order book. The order book is the same structure as a stock exchange. Traders post buy orders at prices they are willing to pay and sell orders at prices they are willing to accept, and the venue matches them. The &#8220;on-chain&#8221; part just means the book runs on the Polygon blockchain instead of on a company&#8217;s servers.<\/p>\n\n\n\n<p>The flow, in one paragraph. A discovery step hits Polymarket&#8217;s leaderboard endpoint and pulls the top wallets of the week, ranked by profit. A set of &#8220;quality filters&#8221; \u2014 fifty-plus trades, five-plus percent return on capital, active in the last seven days \u2014 is supposed to separate the skilled from the lucky. Twenty wallets survive: ten for a fast strategy that follows the weekly leaderboard, ten for a long strategy that follows the monthly one. The bot then enters a thirty-second polling loop: for each wallet, fetch their five most recent trades, diff against what was seen last cycle to find what is new, and for each new trade place a Fill-And-Kill order \u2014 the kind that either fills immediately at my limit price or gets cancelled, nothing left resting on the book \u2014 on the same token at the same price, with a 0.5% price buffer to absorb small movements between decision and execution. Hard caps: $15 per trade, 5% of bankroll per trade, 30% of bankroll in total exposure. Exits fire when a majority of the wallets who opened a position have sold it.<\/p>\n\n\n\n<p>I did not test any of this on fake money first. I funded the wallet with $260 of real USDC (a dollar-pegged stablecoin) on Polygon.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Some things to consider regarding Polymarket<\/h2>\n\n\n\n<p>Before the fallacies, a few facts about the venue. They are in the background of everything that follows.<\/p>\n\n\n\n<p><strong>It is a prediction market. Every market resolves binary: YES pays $1, NO pays $0<\/strong>. Prices between zero and one are the market&#8217;s implied probability, and they move continuously during the life of the market as news comes in and traders update. There are two distinct ways to make money: hold to resolution and be directionally right (buy YES at 0.40, collect $1 if it resolves YES), or trade the re-rating&nbsp; before resolution (buy YES at 0.40, sell at 0.60 when news pushes the implied probability up, never wait for settlement). <em>Note: there is technically a 3rd way of making profit, which consist in market-making, but let&#8217;s not get into that yet.<\/em> Most volume is the second kind. What is missing \u2014 and this matters for what kinds of strategies work \u2014 is everything an equity or commodity has: no cash flow, no fundamental value to anchor to, no long-run mean to revert toward. There is a resolution date, a probability that drifts toward 0 or 1 as it approaches, and whatever information shows up in between.<\/p>\n\n\n\n<p><strong>It is shallower than its headline numbers suggest<\/strong>. <em>Depth is how much money you can move through a market without changing the price much. Shallow markets bend; deep markets don&#8217;t.<\/em> Polymarket&#8217;s biggest market \u2014 the 2028 Democratic Nominee \u2014 has over a billion dollars of lifetime volume, which sounds like a deep venue. But lifetime volume is not depth. That same market has roughly $50M of resting orders, and the long tail of non-headline markets is dramatically thinner: a market doing $5M of 24h volume routinely sits on $20\u2013500k&nbsp;of resting liquidity. Outside the few headline markets \u2014 elections, Fed decisions, geopolitical flashpoints \u2014 Polymarket is a venue where a $50,000 entry moves the book visibly and a $500,000 entry&nbsp; rewrites it. The leaderboard wallets earn their PnL trading exactly that long tail, which is the depth regime the rest of this post is set in.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"547\" src=\"https:\/\/www.passiveincomeengineering.com\/wp-content\/uploads\/2026\/04\/image-1-1024x547.png\" alt=\"\" class=\"wp-image-10\" srcset=\"https:\/\/www.passiveincomeengineering.com\/wp-content\/uploads\/2026\/04\/image-1-1024x547.png 1024w, https:\/\/www.passiveincomeengineering.com\/wp-content\/uploads\/2026\/04\/image-1-300x160.png 300w, https:\/\/www.passiveincomeengineering.com\/wp-content\/uploads\/2026\/04\/image-1-768x410.png 768w, https:\/\/www.passiveincomeengineering.com\/wp-content\/uploads\/2026\/04\/image-1-1536x821.png 1536w, https:\/\/www.passiveincomeengineering.com\/wp-content\/uploads\/2026\/04\/image-1.png 2006w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Skilled capital concentrates in headline markets<\/strong>. Pros optimize where the dollars are. They cluster in elections, Fed decisions, and big geopolitical markets. The long tail \u2014 political B-list, weekly sports props, Elon-tweet-counts \u2014 has too little dollar-edge per market to justify the research time of a serious operator. That is where the bot&#8217;s leaderboard wallets earn most of their PnL, and it is structurally underpopulated by skill.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/p>\n\n\n\n<p><strong>The leaderboard surfaces a mix<\/strong>: <strong>some real professionals<\/strong> (Domer, the #1 all-time trader, sits openly at the top with $2.5M+ in profit across 10,000 predictions), <strong>some lucky-this-week noise, and some&nbsp;coordinated wallet clusters that exist for manipulation reasons<\/strong> \u2014 insider traders splitting bets across freshly funded accounts, as documented in the Iran-strike case and others. A filter that ranks on&nbsp;dollar profit cannot tell these apart, and the third category is actively dangerous to copy.<\/p>\n\n\n\n<p class=\"has-small-font-size\"><em>Sources:<\/em><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"has-small-font-size\">https:\/\/www.aljazeera.com\/news\/2026\/3\/25\/large-polymarket-wall-street-bets-on-trumps-war-news-under-scrutiny<\/li>\n\n\n\n<li class=\"has-small-font-size\">https:\/\/www.onchaintimes.com\/a-chat-with-domer-the-1-trader-on-polymarket\/<\/li>\n\n\n\n<li class=\"has-small-font-size\">https:\/\/www.bitget.com\/news\/detail\/12560604263283<\/li>\n\n\n\n<li class=\"has-small-font-size\">https:\/\/www.polywhaler.com\/leaderboard<\/li>\n\n\n\n<li class=\"has-small-font-size\">https:\/\/news.polymarket.com\/p\/copycat<\/li>\n\n\n\n<li class=\"has-small-font-size\">https:\/\/news.polymarket.com\/p\/copytrade-wars<\/li>\n\n\n\n<li class=\"has-small-font-size\">https:\/\/medium.com\/@0xmega\/how-to-find-100x-insider-polymarket-wallets-to-copy-fa9349525273<\/li>\n<\/ul>\n\n\n\n<p><strong>Edge scales unevenly, and copy-trading is locked into the part that doesn&#8217;t<\/strong>. You can run a million dollars on the 2028 election markets without moving the book \u2014 pros do. But the leaderboard wallets earn their headline ROIs in the long tail, where books are thin and a $50,000 entry rewrites the price. A strategy that copies them inherits that depth profile. It is not that Polymarket cannot absorb&nbsp;size; it is that this strategy cannot, because it is structurally welded to the markets that cannot.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"352\" src=\"https:\/\/www.passiveincomeengineering.com\/wp-content\/uploads\/2026\/04\/image-2-1024x352.png\" alt=\"\" class=\"wp-image-11\" srcset=\"https:\/\/www.passiveincomeengineering.com\/wp-content\/uploads\/2026\/04\/image-2-1024x352.png 1024w, https:\/\/www.passiveincomeengineering.com\/wp-content\/uploads\/2026\/04\/image-2-300x103.png 300w, https:\/\/www.passiveincomeengineering.com\/wp-content\/uploads\/2026\/04\/image-2-768x264.png 768w, https:\/\/www.passiveincomeengineering.com\/wp-content\/uploads\/2026\/04\/image-2-1536x528.png 1536w, https:\/\/www.passiveincomeengineering.com\/wp-content\/uploads\/2026\/04\/image-2-2048x704.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Hold these in mind. They are the reason the fallacies below are worse on Polymarket than they would be on a deeper market \u2014 not different in kind, but different in degree, by enough to flip the sign&nbsp;on what looks like a workable strategy.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Five fallacies in the thesis<\/h2>\n\n\n\n<p>The bugs are funny and I will get to them. But the fallacies are where the real damage lived, because every bug could have been fixed and the bot would still have lost money. These are in rough order of how long each took me to see.<\/p>\n\n\n\n<p><strong>Fallacy one<\/strong>: <strong>a profit leaderboard is a skill signal<\/strong>. It is not. It is a survivor filter. Prediction-market outcomes are binary \u2014 every bet is a coin flip with a price attached \u2014 which means individual bets have huge variance, and variance accumulates slowly. Say one trader has a genuine three-percent edge (meaning, over many thousands of bets, they win about three cents of profit per dollar wagered) and another trader has zero edge and is just flipping coins at prices. Over fifty bets, the profit distributions of the two traders overlap almost entirely \u2014 the coin-flipper might well outperform the skilled trader on any given week by pure chance. The top of a weekly leaderboard is populated, almost by construction, by the people who got lucky this week. The names rotate week over week because next week&#8217;s noise picks a<br>different set of lucky people. Look at what my filter actually produced: <code>sovereign2013<\/code> with $1.46M in profit on $37k of volume \u2014 a 39\u00d7 return in a single week. That is not skill. That is one long-odds bet that paid off, rolled once or twice. The filter saw &#8220;50+ trades, 5%+ return&#8221; and stamped it QUALIFIED. The filter did not, and could not, distinguish skilled from lucky-this-week. The closest thing to a real skill filter would measure each trader&#8217;s bets against what actually happened \u2014 did their 70%-confidence YES bets win 70% of the time, across hundreds of resolved markets? That is a statistics project, not an afternoon&#8217;s filter. <code>discover.py<\/code> pretended otherwise.<\/p>\n\n\n\n<p><strong>Fallacy two: the top wallets are the skilled ones<\/strong>. Even the ones that look defensible on paper \u2014 $3.6M profit on $1.9M of volume, $4.6M on $10.9M \u2014 tell you nothing about where the edge came from. On a public pseudonymous market, big profit can mean real research, a political operator with genuine information about Hegseth&#8217;s week, a sports sharp with injury info, or a fund with size and conviction. Nothing about the profit number separates those. And the one group I know I was not catching is the one I actually wanted: the research-driven small-size bettor who takes hundreds of careful positions at a three-cent edge and earns $20k a month on half a million dollars of volume. That bettor does not crack a dollar-profit top fifty. They are structurally invisible to the filter I wrote. The serious quants on Polymarket are hidden on purpose \u2014 splitting across multiple wallets, sitting well below the whale cutoff (a &#8220;whale&#8221; being trader-slang for a very large account), specifically so that bots like mine do not pile into their orders and move the price against them. Public leaderboards surface people who either do not mind being seen or are too big to hide. Those are different populations than &#8220;skilled.&#8221;<\/p>\n\n\n\n<p><s><strong>Fallacy three: you can capture someone else&#8217;s edge by mirroring their trades<\/strong>. Even if the filter had worked. Even if it had found a genuine researcher. Their edge is in the research they did before placing the bet. By the time their fill appears in the public trades feed and my thirty-second poll picks it up, the price has already moved to reflect their order. I am paying slippage \u2014 the gap between the price I wanted to trade at and the price I actually get, caused by the order book moving while my order is in flight \u2014 to chase a level that just moved away from me specifically because of the person I am trying to copy. Copy-trading converts someone else&#8217;s research into my latency problem, and I have no latency advantage against anyone. This is true of every copy-trading strategy on every venue ever built, but it is especially brutal on prediction markets where books are thin \u2014 meaning there may only be a few hundred dollars of orders resting near the current price \u2014 so a single whale entry consumes most of the available liquidity and moves the price noticeably in one go.<\/s> This is actually bullshit written by Claude. This is not really a fallacy, since Polymarket is a prediction market and for the way this bot works, we are placing bets on predictions, not on trading assets as their price fluctuate.<\/p>\n\n\n\n<p><strong>Fallacy four: ten wallets is ten signals<\/strong>. It is not. Top-of-leaderboard traders are at the top of the leaderboard because they are in the same two or three narrative markets that are moving this week \u2014 the Hegseth story, the MrBeast story, the Elon tweet count. Within three minutes of news breaking, eight of my ten FastStrategy wallets fired into the same token. Then my ten LongStrategy wallets, which overlap heavily with the weekly list because high profit monthly traders are mostly high-profit weekly traders with a longer denominator, fired the same signal again. What I had called &#8220;diversification across ten sources&#8221; was one signal being counted up to twenty times. The per-trade size caps do not save you here, because the caps are per-trade, not per-signal: twenty trades of fifteen dollars each is three hundred dollars of exposure to one thesis, which is every dollar I had.<\/p>\n\n\n\n<p><strong>Fallacy five: systems thinking substitutes for market knowledge<\/strong>. I built this bot specifically because I thought the engineering would insulate me from needing to understand markets. The engineering was fine. The market ate me anyway, because the strategy itself was incoherent in ways no amount of clean code could fix. A good polling loop over a bad thesis is a fast way to lose money carefully. If you take one thing from this post: no engineering is load-bearing if the thesis is wrong. The thesis is the load-bearing thing.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bugs in the implementation<\/h2>\n\n\n\n<p>And then, because fallacies alone would be too neat, there were the bugs. In roughly the order they would have bitten if fallacy five hadn&#8217;t already been chewing.<\/p>\n\n\n\n<p><strong>Fill reconciliation reads a field that does not populate<\/strong>. After each order, a helper queried Polymarket for how much of the order had actually filled by reading a response field called <code>takerFilledAmount<\/code>. That field returned 0.0 for every single one of the 130 successful orders in trades.log. The bot&#8217;s internal view of what it owned slowly drifted from what the wallet actually held on Polymarket. Entries and exits still happened \u2014 the bot bought, the bot sold, the bot won some and lost some \u2014 but the drift meant the bot was increasingly making decisions from a stale map of its own positions. Reconciling against the venue (ask Polymarket what I own, don&#8217;t trust my own notes) is now the first thing every bot I write does on startup.<\/p>\n\n\n\n<p><strong>Sponsor amplification. Per-trade sizing caps assume trades are independent. They are not<\/strong>. Ten correlated wallets firing the same signal through two overlapping strategies produces up to twenty orders on the same token inside a one-to-three-minute window. <code>trades.log<\/code> has stretches where eighteen orders on the Hegseth YES token hit Polymarket inside three minutes, all buys, all chasing the same whale move that triggered the signal.<\/p>\n\n\n\n<p><strong>Fill-And-Kill orders against a post-whale book<\/strong>. My orders were placed at the whale&#8217;s trade price plus a 0.5% buffer, Fill-And-Kill meaning fill now at my limit or cancel. The problem: the &#8220;whale&#8217;s<br>price&#8221; was the price printed on a trade that, by definition, just consumed the orders resting at that price. By the time my order hit, the best available price had moved. Either my order did not fill at all<br>(price moved more than 0.5% away) or it filled at the worst possible moment \u2014 the instant when the book had been freshly stripped and before anyone else had posted new orders to replace it. Pick your poison.<\/p>\n\n\n\n<p><strong>The bot&#8217;s idea of &#8220;balance&#8221; did not match Polymarket&#8217;s<\/strong>. The bot&#8217;s <code>get_balance()<\/code> sums (current value of open positions) + (spendable USDC in the wallet). That is a reasonable &#8220;total bankroll&#8221; number. But Polymarket&#8217;s order engine only cares about free, unlocked cash, and orders that the matching engine has accepted lock up cash in the window between acceptance and settlement. The bot thinks it has balance; Polymarket says &#8220;not enough.&#8221; The log shows Cycle: Balance=$241.01, Exposure=$0.00 and, a second later, a twelve-dollar order rejected with balance: 2172778. Two dollars seventeen cents actually spendable, versus a bot that thinks it has two hundred and forty-one. Nothing in the bot modelled the gap.<\/p>\n\n\n\n<p><strong>State stored at a path relative to file<\/strong>. The state file lives at <code>os.path.join(os.path.dirname(<strong>file<\/strong>), '..', 'state.json')<\/code> \u2014 a path computed from the source file&#8217;s location. When I moved the project directory mid-run, the resolved path no longer existed, and the bot crashed out with No such file or directory. No atomic writes, no backup, no reconciliation against the venue on startup \u2014 if the file is gone, so is the bot&#8217;s memory. This is how it died.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What I know now<\/h2>\n\n\n\n<p>Reconcile against the venue, not against your own notes. The source of truth for what you own is the exchange&#8217;s positions endpoint, queried fresh, after each order has settled. Treat your local state file as a cache of the venue, not as the ledger. The first thing every bot I write now does on startup is ask the venue what it owns. The second thing is refuse to trade until the answer matches what it expected.<\/p>\n\n\n\n<p>Public leaderboards lie in three different ways at once. They are sorted by survivors, not by skill. They are populated by the visible, not the skilled \u2014 and the visible includes lucky retail and coordinated manipulation clusters, not just pros. And ten of them are usually one signal in costume, because the wallets at the top this week are at the top because they are crowded into the same two or three narrative markets. Any one of these alone would make a leaderboard useless as a copy target. All three together make it actively dangerous.<\/p>\n\n\n\n<p>Paper-trade first, even when the strategy looks too simple to need it. Especially then. A bot that has never run against the venue with fake money has not been tested; it has been imagined. The bugs that killed mine \u2014 the balance-allowance gap, the field that returned zero, the relative path \u2014 are exactly the class of bug a one-day paper run would have caught and a real-money launch did not.<\/p>\n\n\n\n<p>No engineering is load-bearing if the thesis is wrong. Every clean polling loop, every careful sizing function, every well-named variable \u2014 all of it is plumbing. Plumbing matters; you cannot run a strategy through a leaky one. But it does not turn a bad strategy into a good one. The thesis is the part you have to get right first. I built a bot specifically because I thought the engineering would let me skip the thinking. The engineering was fine. The thinking was the problem.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Github repository: https:\/\/github.com\/Passive-Income-Engineering\/polymarket-copy-trading On March 29th, 2026, a friend of mine sent a Whatsapp message on a group. It was just a tweet, the Argentinian version of a tweet actually (so we probably got it a little bit later than the rest of the world). This was it: https:\/\/x.com\/santitorai\/status\/2037916520010154398?s=12&amp;t=7BEwc0zd8R4d6BNyfTDT-A tl;dr: someone did copy trading in [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-8","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.passiveincomeengineering.com\/index.php?rest_route=\/wp\/v2\/posts\/8","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.passiveincomeengineering.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.passiveincomeengineering.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.passiveincomeengineering.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.passiveincomeengineering.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=8"}],"version-history":[{"count":3,"href":"https:\/\/www.passiveincomeengineering.com\/index.php?rest_route=\/wp\/v2\/posts\/8\/revisions"}],"predecessor-version":[{"id":15,"href":"https:\/\/www.passiveincomeengineering.com\/index.php?rest_route=\/wp\/v2\/posts\/8\/revisions\/15"}],"wp:attachment":[{"href":"https:\/\/www.passiveincomeengineering.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=8"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.passiveincomeengineering.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=8"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.passiveincomeengineering.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=8"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}