<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>casatrick</title>
        <link>https://paragraph.com/@casatrick</link>
        <description>undefined</description>
        <lastBuildDate>Mon, 09 Nov 2026 12:34:35 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>casatrick</title>
            <url>https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/718327fa5eac07b4ee1bf1fa1007723dae9968a6d276d3a643d43551fab15a90.jpg</url>
            <link>https://paragraph.com/@casatrick</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Reconciling Polymarket's TWAP: A Python Monitoring Script]]></title>
            <link>https://paragraph.com/@casatrick/reconciling-polymarkets-twap-a-python-monitoring-script</link>
            <guid>ZMJ3fqzlMmZn2eaK7p8o</guid>
            <pubDate>Mon, 03 Aug 2026 14:08:29 GMT</pubDate>
            <description><![CDATA[Follow-up to a breakdown I wrote on why Polymarket is moving crypto market settlement to TWAP resolution starting August 7 - this post is the actual implementation. Chainlink doesn't publish the exact sampling boundaries or weighting methodology for the custom TWAP feed, so you can't independently derive the resolution price from first principles with full confidence. What you can do: store every raw tick you observe, compute your own TWAP over the same window Polymarket uses, and reconcile i...]]></description>
            <content:encoded><![CDATA[<p>Follow-up to a breakdown I wrote on why Polymarket is moving crypto market settlement to TWAP resolution starting August 7 - this post is the actual implementation. Chainlink doesn't publish the exact sampling boundaries or weighting methodology for the custom TWAP feed, so you can't independently derive the resolution price from first principles with full confidence. What you can do: store every raw tick you observe, compute your own TWAP over the same window Polymarket uses, and reconcile it against the published resolution price with a defined drift tolerance.</p><pre data-type="codeBlock" text="def reconcile_twap(my_twap, published_twap, tolerance_pct=0.05):
    drift_pct = abs(my_twap - published_twap) / published_twap
    return &quot;ok&quot; if drift_pct &lt;= tolerance_pct else &quot;drift_detected&quot;"><code>def reconcile_twap(my_twap, published_twap, tolerance_pct<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.05</span>):
    drift_pct <span class="hljs-operator">=</span> abs(my_twap <span class="hljs-operator">-</span> published_twap) <span class="hljs-operator">/</span> published_twap
    <span class="hljs-keyword">return</span> <span class="hljs-string">"ok"</span> <span class="hljs-keyword">if</span> drift_pct <span class="hljs-operator">&lt;</span><span class="hljs-operator">=</span> tolerance_pct <span class="hljs-keyword">else</span> <span class="hljs-string">"drift_detected"</span></code></pre><p>The script also handles a failure mode that didn't exist under the old single-tick resolution - feed gaps mid-window. If the last tick goes stale beyond a threshold, that needs to be caught before it matters for a live position.</p><p>Testnet TWAP feeds are live now. Mainnet and RTDS launch August 7, giving a three-day live-fire testing window before settlement actually depends on it.</p><p>Full code + walkthrough: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://dev.to/casatrick/how-polymarket-is-closing-the-manipulation-window-in-crypto-markets-5hag">[Dev.to link]</a><br></p>]]></content:encoded>
            <author>casatrick@newsletter.paragraph.com (Web3 Trading Systems)</author>
            <category>polymarket</category>
            <category>twap</category>
            <category>tradingbot</category>
            <category>strategy</category>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/3a08c2c98fee9862e0ca25a85cc905b0313fcfab9e549d7f7283bfce5de9297f.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[A Trend-Alignment Signal for Polymarket's BTC Up/Down Markets]]></title>
            <link>https://paragraph.com/@casatrick/a-trend-alignment-signal-for-polymarkets-btc-updown-markets</link>
            <guid>QsEGbS5FQjhDhudg2I91</guid>
            <pubDate>Fri, 31 Jul 2026 07:25:02 GMT</pubDate>
            <description><![CDATA[Most directional signals for Polymarket’s short-duration BTC markets look at one timeframe at a time - momentum on the 5-minute chart, or an oracle price crossing the window’s opening level. That works, but it misses something continuous futures traders take for granted: knowing whether a short-term move is happening with or against the broader trend. I wanted to see whether that idea - checking multiple timeframes before trusting a signal - could be adapted into a Polymarket bot’s decision p...]]></description>
            <content:encoded><![CDATA[<p>Most directional signals for Polymarket’s short-duration BTC markets look at one timeframe at a time - momentum on the 5-minute chart, or an oracle price crossing the window’s opening level. That works, but it misses something continuous futures traders take for granted: knowing whether a short-term move is happening <em>with</em> or <em>against</em> the broader trend.</p><p>I wanted to see whether that idea - checking multiple timeframes before trusting a signal - could be adapted into a Polymarket bot’s decision process, without pretending the whole trading style it comes from transfers cleanly. It doesn’t. But the core idea does, once you strip out everything that assumes a continuous, leveraged position.<br><br>Multi-timeframe trend alignment is a well-known structure in futures and perpetuals trading: use a higher timeframe to establish direction, a medium timeframe to confirm the current move isn’t exhausted, and a lower timeframe to time the actual entry. A common version of this looks something like:</p><ul><li><p><strong>Higher timeframe (1h):</strong> is price above or below its 200-period EMA? That’s the broad trend.</p></li><li><p><strong>Medium timeframe (15m):</strong> has RSI pulled back into oversold/overbought territory and started recovering? That confirms there’s room left in the move.</p></li><li><p><strong>Lower timeframe (3m):</strong> has a fast momentum oscillator (like Stochastic RSI) just crossed, signaling the pullback is ending?</p></li></ul><p>Only when all three line up does the signal count. It’s a filter designed to reject a lot of setups, not fire on every wiggle.</p><h3 id="h-why-you-cant-just-port-the-whole-strategy" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>Why you can’t just port the whole strategy</strong></h3><p>The full version of this kind of system usually pairs the signal with continuous position management: scaling into the trade with DCA layers if price moves against you, trailing a stop once it moves in your favor, letting a “runner” position stay open for hours to capture an extended trend.</p><p>None of that applies to a Polymarket BTC market. Every 5m, 15m, and 1h Up/Down contract is a discrete, expiring bet - it resolves to $0 or $1 at a fixed timestamp and then the window is gone. There’s no position to trail past expiry, no averaging into a bet that’s still “open” the way a futures position is, and no leverage to size against. Trying to import DCA layers or a trailing stop into that structure doesn’t just fail to help - it doesn’t map onto anything that exists in a binary, expiring market.</p><p>What <em>does</em> map cleanly is the filter itself: the yes/no question of “is this move aligned across timeframes, or is it noise.” That’s just a signal - and a signal is exactly what a Polymarket bot needs before it decides which side of a window to bet on.</p><p><strong>Building it as a signal instead of a strategy</strong><br><br>In a config-driven bot, this becomes one more sig_* column sitting alongside the ones you’re probably already computing - order-book imbalance, oracle-vs-window-open divergence, z-scores. Trend alignment just adds a filter for whether the broader context supports the signal you’re about to act on.</p><pre data-type="codeBlock" text="def trend_aligned(

price,

ema_200_1h,

rsi_15m,

stoch_rsi_3m,

stoch_rsi_3m_prev,

long_rsi_threshold=40,

short_rsi_threshold=60,

):"><code>def trend_aligned(

price,

ema_200_1h,

rsi_15m,

stoch_rsi_3m,

stoch_rsi_3m_prev,

<span class="hljs-attr">long_rsi_threshold</span>=<span class="hljs-number">40</span>,

<span class="hljs-attr">short_rsi_threshold</span>=<span class="hljs-number">60</span>,

):</code></pre><p>Returns 'up', 'down', or None if timeframes don't agree. <br>Adapted as a directional filter, not a full position strategy - no DCA layers, no trailing stop, since Polymarket markets resolve at a fixed expiry rather than staying open.</p><pre data-type="codeBlock" text="bullish_trend = price &gt; ema_200_1h

bearish_trend = price &lt; ema_200_1h

pullback_recovering = (

rsi_15m &lt; long_rsi_threshold

and stoch_rsi_3m &gt; stoch_rsi_3m_prev

)

rally_fading = (

rsi_15m &gt; short_rsi_threshold

and stoch_rsi_3m &lt; stoch_rsi_3m_prev

)

if bullish_trend and pullback_recovering:

return “up”

if bearish_trend and rally_fading:

return “down”

return None"><code>bullish_trend <span class="hljs-operator">=</span> price <span class="hljs-operator">&gt;</span> ema_200_1h

bearish_trend <span class="hljs-operator">=</span> price <span class="hljs-operator">&lt;</span> ema_200_1h

pullback_recovering <span class="hljs-operator">=</span> (

rsi_15m <span class="hljs-operator">&lt;</span> long_rsi_threshold

and stoch_rsi_3m <span class="hljs-operator">&gt;</span> stoch_rsi_3m_prev

)

rally_fading <span class="hljs-operator">=</span> (

rsi_15m <span class="hljs-operator">&gt;</span> short_rsi_threshold

and stoch_rsi_3m <span class="hljs-operator">&lt;</span> stoch_rsi_3m_prev

)

<span class="hljs-keyword">if</span> bullish_trend and pullback_recovering:

<span class="hljs-keyword">return</span> “up”

<span class="hljs-keyword">if</span> bearish_trend and rally_fading:

<span class="hljs-keyword">return</span> “down”

<span class="hljs-keyword">return</span> None</code></pre><p>This doesn't decide the trade on its own. It's a gate: if trend_aligned() returns None, the bot doesn't act, regardless of what any other signal says. If it returns a direction, that direction still has to clear the same net-edge check as any other signal before a position is opened.</p><pre data-type="codeBlock" text="def combined_decision(trend_signal, model_probability, execution_price, fee, slippage, buffer):

if trend_signal is None:

return None # no timeframe agreement, skip

gross_edge = model_probability - execution_price

net_edge = gross_edge - fee - slippage - buffer

if net_edge &lt;= 0:

return None # trend agrees, but no priced edge — still skip

return trend_signal"><code>def combined_decision(trend_signal, model_probability, execution_price, fee, slippage, buffer):

<span class="hljs-keyword">if</span> trend_signal <span class="hljs-keyword">is</span> None:

<span class="hljs-keyword">return</span> None # no timeframe agreement, skip

gross_edge <span class="hljs-operator">=</span> model_probability <span class="hljs-operator">-</span> execution_price

net_edge <span class="hljs-operator">=</span> gross_edge <span class="hljs-operator">-</span> fee <span class="hljs-operator">-</span> slippage <span class="hljs-operator">-</span> buffer

<span class="hljs-keyword">if</span> net_edge <span class="hljs-operator">&lt;</span><span class="hljs-operator">=</span> <span class="hljs-number">0</span>:

<span class="hljs-keyword">return</span> None # trend agrees, but no priced edge — still skip

<span class="hljs-keyword">return</span> trend_signal</code></pre><p><br>That second check matters more here than it does in the original strategy. Trend alignment tells you a direction is more likely to continue - it doesn't tell you the market is mispricing that likelihood. In a binary market, you only have an edge if the price you can actually execute at is cheaper than what your model thinks the true probability is. Agreement across timeframes without a priced edge is just a strong opinion, not a trade.<br><br><strong>Where this fits against a phase/price-segmented approach</strong></p><p>If you’ve built rules the way my own analysis toolkit does - separate strategies for different phase/price segments, like a late-market cheap-side mode and a mid-price oracle-following mode - trend alignment slots in as an additional filter layered on top of whichever segment-specific rule is already active, rather than replacing it. A late-phase, sub-35¢ signal that also has trend alignment behind it is a stronger version of that same setup, not a new strategy competing with it.<br><br><strong>The honest limitation</strong></p><p>Multi-timeframe trend alignment is built for markets where “trend” is a meaningful, persistent concept over hours. Five-minute BTC windows are short enough that a 1-hour trend filter may barely change over the life of several consecutive windows - meaning this signal will sometimes just quietly agree with itself across ten markets in a row, adding little new information beyond what a shorter-timeframe signal already told you. It’s most useful as a tie-breaker or confirmation layer, not as the primary source of edge. Worth testing against real data with the same phase/price segmentation discipline before trusting it in anything but paper mode.<br><br>I build and adapt trading systems like this for people trading on Polymarket - signal design, strategy discovery from wallet history, or full bot builds. Paper-trading validation before anything goes live, full source ownership, no black-box logic.<br><br><br></p>]]></content:encoded>
            <author>casatrick@newsletter.paragraph.com (Web3 Trading Systems)</author>
            <category>polymarket</category>
            <category>tradingbot</category>
            <category>signal</category>
            <category>btc</category>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/b1987783883c409458c5b398d662cec87e460a40508e1bf918c8d865e42b9de4.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Polymarket Trading Bot Strategies: Bayesian Updating for Real Edge]]></title>
            <link>https://paragraph.com/@casatrick/polymarket-trading-bot-strategies-bayesian-updating-for-real-edge</link>
            <guid>f6F1C0xUkmEl8TfMDhZ4</guid>
            <pubDate>Wed, 29 Jul 2026 06:55:19 GMT</pubDate>
            <description><![CDATA[A prediction-market price is not a price. It's a probability the crowd agreed on a moment ago. The second real news arrives, that number is wrong - not forever, just for the few minutes it takes everyone else to finish the same math a Polymarket trading bot can run in milliseconds. When a market says an outcome trades at 38 cents, it's telling you the crowd's probability for that outcome is about 38%. On Polymarket, the price and the probability are the same object. Every price on the order b...]]></description>
            <content:encoded><![CDATA[<p>A prediction-market price is not a price. It's a probability the crowd agreed on a moment ago. The second real news arrives, that number is wrong - not forever, just for the few minutes it takes everyone else to finish the same math a Polymarket trading bot can run in milliseconds.</p><p>When a market says an outcome trades at 38 cents, it's telling you the crowd's probability for that outcome is about 38%. On Polymarket, the price and the probability are the same object. Every price on the order book is a snapshot of a belief - and unlike a stock chart, the correct way to update that belief when new information arrives isn't a matter of opinion. It's a matter of math.</p><p>That math is Bayes' theorem, written down in 1763:</p><p><strong>P(H|E) = P(E|H) × P(H) / P(E)</strong></p><p>Your prior P(H) is the current market price. The likelihood P(E|H) is how likely the news would be if the outcome were actually going to happen. P(E) is how likely the news was in general. The posterior P(H|E) is the updated probability - the number your bot is trying to find.</p><p>In practice, quant desks skip the clumsy denominator and work in odds instead:</p><p><strong>posterior odds = prior odds × likelihood ratio</strong></p><p>A market at 30¢ with prior odds ≈ 0.43 and a likelihood ratio of 3 (news three times more consistent with the outcome happening than not) updates to posterior odds of 1.29 - roughly 56% probability. That's a 26-point gap between market price and fair value, appearing the instant the news lands. A bot doesn't need the price to prove it right; it only needs to be positioned before the crowd finishes the same calculation.</p><p><strong>Turning this into a bot, in four steps:</strong></p><ol><li><p>Let the market price be your prior - never substitute a gut feeling for the crowd's number</p></li><li><p>Price the evidence, not the emotion - assign an honest likelihood ratio to each piece of news</p></li><li><p>Update, compare, and only trade a real gap - most news isn't worth trading after fees</p></li><li><p>Respect that the edge decays as the crowd catches up - the entire opportunity lives in the window between news landing and the crowd repricing</p></li></ol><p><strong>Where this breaks:</strong> double-counting evidence already priced in, treating five outlets reporting the same leak as five separate confirmations instead of one, and feeding the formula miscalibrated likelihoods that produce confidently wrong posteriors.</p><p>Full open-source implementation (five parallel strategies, risk controls, signal ranking): <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out underline underline underline-offset-2 decoration-1 decoration-current/40 hover:decoration-current focus:decoration-current" href="https://github.com/casatrick/polymarket-arbitrage-bot-python">github.com/casatrick/polymarket-arbitrage-bot-python</a></p>]]></content:encoded>
            <author>casatrick@newsletter.paragraph.com (Web3 Trading Systems)</author>
            <category>polymarket</category>
            <category>tradingbots</category>
            <category>predictionmarkets</category>
            <category>web3dev</category>
            <category>defi</category>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/76bdde95d71a9373ea1d8a578ab4eb834883e2e714b831584195a1327401d804.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Reverse-Engineering a Polymarket Trader's Strategy From Public Fills]]></title>
            <link>https://paragraph.com/@casatrick/reverse-engineering-a-polymarket-traders-strategy-from-public-fills</link>
            <guid>zXktltRfezIuvx66A9Xn</guid>
            <pubDate>Mon, 27 Jul 2026 07:47:49 GMT</pubDate>
            <description><![CDATA[Every trade on Polymarket is public. Wallet address, market, side, price, size, timestamp - all sitting in an API response, for any wallet you want to look at. So I built a toolkit that takes any Polymarket wallet address and answers four questions: what did they trade, when and under what conditions, how much per trade, and - the hard one - UP or DOWN, and why. Then it turns those answers into a config-driven bot that replays the discovered rules. Not a copy-trading bot. It doesn't mirror th...]]></description>
            <content:encoded><![CDATA[<p>All of this comes from data anyone can pull - Polymarket doesn't gate trade history behind an API key. This is what's sitting in the open for any wallet you point it at.<br><br>Every trade on Polymarket is public. Wallet address, market, side, price, size, timestamp - all sitting in an API response, for any wallet you want to look at.</p><p>So I built a toolkit that takes any Polymarket wallet address and answers four questions: what did they trade, when and under what conditions, how much per trade, and - the hard one - UP or DOWN, and why. Then it turns those answers into a config-driven bot that replays the discovered rules. Not a copy-trading bot. It doesn't mirror the wallet in real time - it extracts the strategy and runs it independently, in paper mode by default.</p><p>Here's how it works, and the one finding that made this actually interesting instead of just a data-collection exercise.</p><p>The pipeline</p><p><code>collect → enrich → signals → analyse → report</code></p><p>Collect pulls full trade history for a wallet from Polymarket's Data API (handles 100k+ fills via cursor pagination), plus market metadata for everything they traded.</p><p>Enrich joins external context onto every single trade at the moment it happened: Binance and Coinbase OHLCV, the Chainlink ETH/USD oracle price on Polygon, order book spread and imbalance from the Polymarket CLOB, and how close the trade was to market close (I bucket this into <code>early</code>, <code>mid</code>, <code>late</code>, <code>urgent</code> phases).</p><p>Signals computes candidate features on every row - momentum z-scores, oracle-vs-price agreement, spread percentage, timing phase.</p><p>Analyse runs statistical analysers across all of it - win rate, Sharpe, Brier score, sizing patterns, and the core piece: strategy discovery.</p><p>The interesting part: one rule doesn't work</p><p>My first assumption was that a trader has a strategy - pick a direction rule, measure how well it holds. That assumption was wrong, and testing it wrong is what made the real pattern visible.</p><p>Running this on a real wallet (~65k trades in ETH 5-minute Up/Down markets), a single global rule like "always follow the Chainlink oracle" doesn't hold. But segmenting by phase and price bucket reveals two genuinely different behaviors:</p><p>Mode 1 - cheap lottery. In the late/urgent phase, when a token is priced 0–35¢, the trader buys the cheaper side. Win rate is only ~20% - but the payoff structure makes it positive EV. This mode barely correlates with the Chainlink oracle at all (~19% agreement).</p><p>Mode 2 - oracle follow. At any phase, once a token is priced 50¢+, the trader follows Chainlink's price vs. the window-open price. Win rate here is ~78%, with a smaller payoff per win.</p><p>Two completely different behaviors, cleanly separated by price and timing, both consistently profitable in their own regime - but only visible once you stop assuming one global rule and start segmenting. There's a gap between 35-50¢ in mid-phase where no rule reaches significance, and the bot is built to skip that gap rather than force a signal that isn't there.</p><p>That's the actual deliverable: a <code>strategy_config.json</code> with a <code>direction.strategies[]</code> array, each entry a phase/price-scoped rule with its own logic, no hardcoded strategy in the bot itself. Re-run the analysis, restart the bot, get new behavior - nothing to redeploy.</p><p>The bot side</p><p>Phase 2 loads that config and runs a ~5-second scan loop: find active markets, match phase+price to a strategy mode, pull the mode-specific signal (oracle diff or cheap-side book price), run an EV/sizing check, execute paper or live. Daily loss limits and max-position caps sit underneath all of it, independent of which strategy mode is active.</p><p>What this isn't</p><p>Worth being upfront about: this isn't a guaranteed-profit system, it's not real-time copy trading (it extracts rules, it doesn't mirror the wallet), and it's not a general ML platform - it's segmented statistical rule discovery. Fill history also isn't full intent - you see what someone traded, not what they considered and skipped. Historical validity isn't future validity either; paper trading before live is the whole point of the default config.</p><p>I build tooling like this for clients working on Polymarket - custom strategy extraction, market-making bots, or ongoing maintenance on an existing system. Full source, no black-box logic, paper-trading validation before anything goes live.</p>]]></content:encoded>
            <author>casatrick@newsletter.paragraph.com (Web3 Trading Systems)</author>
            <category>trading</category>
            <category>data</category>
            <category>polymarket</category>
        </item>
        <item>
            <title><![CDATA[The Real Bottleneck in Polymarket Arbitrage Isn't Finding the Edge - It's Keeping It]]></title>
            <link>https://paragraph.com/@casatrick/the-real-bottleneck-in-polymarket-arbitrage-isnt-finding-the-edge-its-keeping-it</link>
            <guid>CygfySUWEAkbgwOAcTWF</guid>
            <pubDate>Thu, 23 Jul 2026 14:16:30 GMT</pubDate>
            <description><![CDATA[Ask someone to explain a Polymarket arbitrage bot and they'll describe the detection logic: YES and NO prices should sum to $1.00, when they don't, buy both, redeem the gap. That explanation is correct and also, on its own, almost useless, because detecting the mispricing was never the hard problem. Every arbitrage bot running against Polymarket's public order books can see the same gap at roughly the same moment. The problem worth solving is what happens in the three or four seconds after th...]]></description>
            <content:encoded><![CDATA[<p>Ask someone to explain a Polymarket arbitrage bot and they'll describe the detection logic: YES and NO prices should sum to $1.00, when they don't, buy both, redeem the gap. That explanation is correct and also, on its own, almost useless, because detecting the mispricing was never the hard problem. Every arbitrage bot running against Polymarket's public order books can see the same gap at roughly the same moment. The problem worth solving is what happens in the three or four seconds after that.<br>pricing inefficiency on Polymarket doesn't sit still waiting to be captured. The moment it appears, it's visible to every bot polling that market, and the first execution to hit the order book starts consuming the very liquidity the gap depended on. A fifteen cent gap on five thousand dollars of depth might only support twelve hundred dollars of size before the remaining liquidity re-prices back toward one dollar. Miss that window and you're not capturing arbitrage anymore, you're providing exit liquidity for whoever got there first.</p><p>This reframes what actually matters in a well-built system. Detection is table stakes. Execution latency, order sizing against live depth, and how fast the bot can act on a signal it just generated are where real edge lives.</p><p>Most naive implementations separate detection and execution into sequential steps: poll the book, compute the gap, decide to trade, submit the order. Each step adds latency, and on a fast-closing arbitrage window, that sequential structure is the actual bottleneck, not the math. A more resilient structure treats depth-checking as inseparable from the trade decision itself, rather than a downstream validation step.</p><p>This matters more as more sophisticated capital enters prediction markets. Arbitrage opportunities aren't a fixed resource, they're a byproduct of market inefficiency, and more capital chasing the same gaps compresses both the size and duration of each window. Execution speed increasingly matters more than strategy novelty, which is a different competitive dynamic than most writeups about Polymarket arbitrage account for.</p><p>If you're building or evaluating a Polymarket arbitrage bot, the right question isn't whether it detects YES and NO mispricing. Every implementation does that. The right questions are how fast it goes from seeing the gap to submitting the order, how it sizes against real-time depth rather than a stale snapshot, and what it does when a partial fill leaves one leg exposed.</p><p>Full implementation, including the signal-scoring and execution logic across all five arbitrage and momentum strategies: github.com/casatrick/polymarket-arbitrage-bot-python</p>]]></content:encoded>
            <author>casatrick@newsletter.paragraph.com (Web3 Trading Systems)</author>
            <category>polymarket</category>
            <category>tradingbots</category>
            <category>arbitrage</category>
            <category>predictionmarkets</category>
        </item>
        <item>
            <title><![CDATA[How a Polymarket Arbitrage Bot Actually Works: 5 Strategies Explained]]></title>
            <link>https://paragraph.com/@casatrick/how-a-polymarket-arbitrage-bot-actually-works-5-strategies-explained</link>
            <guid>JL7fkpGo0SdrkzUbkhtN</guid>
            <pubDate>Wed, 22 Jul 2026 06:59:52 GMT</pubDate>
            <description><![CDATA[A Polymarket arbitrage bot scans prediction markets for pricing inefficiencies and executes trades to capture the resulting spread. That's the concept in one sentence, but arbitrage on Polymarket isn't one strategy, it's several distinct mechanisms, each exploiting a different kind of mispricing. Here's a breakdown of how each one works, based on an open-source implementation. Intra-market arbitrage is the core mechanic. In a binary Polymarket market, YES and NO token prices should always sum...]]></description>
            <content:encoded><![CDATA[<br><hr><br><p>A Polymarket arbitrage bot scans prediction markets for pricing inefficiencies and executes trades to capture the resulting spread. That's the concept in one sentence, but arbitrage on Polymarket isn't one strategy, it's several distinct mechanisms, each exploiting a different kind of mispricing. Here's a breakdown of how each one works, based on an open-source implementation.</p><p>Intra-market arbitrage is the core mechanic. In a binary Polymarket market, YES and NO token prices should always sum to $1.00. When combined pricing falls below that after fees, buying both outcomes locks in a profit that doesn't depend on which outcome actually happens. Buy YES and NO, merge the tokens into a complete set, redeem for $1.00 per share. This is the closest thing to genuinely risk-free arbitrage available in prediction markets.</p><p>Combinatorial arbitrage extends the same logic to multi-outcome markets, like price-range or bracket-style markets with three or more possible outcomes. If all outcome prices sum to less than $1.00, buying every outcome and redeeming the complete set captures the deviation as guaranteed profit.</p><p>Cross-platform arbitrage is different. It compares Polymarket's implied probability against real-time spot prices from exchanges like Binance, and trades on the assumption that Polymarket's pricing will converge toward fair value. This is a directional, convergence bet rather than a locked-in profit, which makes it a fundamentally different risk category from the first two strategies.</p><p>Endgame arbitrage targets markets approaching resolution, where one outcome sometimes trades above 93% probability. Buying that outcome captures a small but near-certain return in a short, predictable window, capital-efficient specifically because time-to-resolution is short and the range of outcomes is narrow.</p><p>Momentum and mean-reversion is the one strategy here that isn't arbitrage in the strict sense. It applies standard technical indicators, Z-score, RSI, rate of change, VWAP divergence, to Polymarket's YES/NO price series across 5-minute, 15-minute, and 1-hour timeframes, the same toolkit used in equities and crypto momentum trading, adapted to prediction market price action.</p><p>Running five strategies in parallel means a single market can generate multiple competing signals simultaneously. A well-built bot scores every signal on a weighted composite, expected profit, confidence, strategy-type priority, urgency, and risk and reward ratio, then executes only the highest-ranked signals per cycle, weighting risk-free strategies like intra-market and combinatorial highest, and directional strategies like cross-platform and momentum lower by design.</p><p>Worth being precise on risk here. Not everything called Polymarket arbitrage carries the same risk profile. Intra-market and combinatorial arbitrage are structurally close to risk-free if executed correctly, since both outcomes are purchased for guaranteed redemption. Cross-platform and momentum strategies are directional bets that can lose money if the anticipated convergence or reversion doesn't happen. Treating all five as equally safe because they're grouped under one bot erases the actual distinction that makes the first two valuable in the first place.</p><p>Full strategy code and configuration reference: github.com/casatrick/polymarket-arbitrage-bot-python</p>]]></content:encoded>
            <author>casatrick@newsletter.paragraph.com (Web3 Trading Systems)</author>
            <category>polymarket</category>
            <category>arbitrage</category>
            <category>tradingbot</category>
            <category>copytrading</category>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/0fc88280753248ea78850916b85610adb5cbd5637ac29779b18d95d39562b33f.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Position Sizing for Polymarket Bots: Kelly vs. Fixed Fractional]]></title>
            <link>https://paragraph.com/@casatrick/position-sizing-for-polymarket-bots-kelly-vs-fixed-fractional</link>
            <guid>bpYs283FOkaNOPMJproG</guid>
            <pubDate>Mon, 20 Jul 2026 11:02:33 GMT</pubDate>
            <description><![CDATA[I build execution and risk infrastructure for prediction market bots and provably fair systems for casino platforms -this is a pattern that’s cost real money on both sides of that work. Most writeups on trading bots-including my own last piece -focus on getting the edge calculation right and executing before the price moves. Almost none of them cover what happens after: how much to actually bet once you’ve decided a trade is worth taking. Get this step wrong and a correctly identified edge ca...]]></description>
            <content:encoded><![CDATA[<p>I build execution and risk infrastructure for prediction market bots and provably fair systems for casino platforms -this is a pattern that’s cost real money on both sides of that work.<br>Most writeups on trading bots-including my own last piece -focus on getting the edge calculation right and executing before the price moves. Almost none of them cover what happens after: how much to actually bet once you’ve decided a trade is worth taking. Get this step wrong and a correctly identified edge can still lose you money over time.</p><p><strong>The naive approach: fixed sizing</strong></p><p>The simplest method is to size every position the same-a fixed dollar amount or a fixed percentage of your bankroll, regardless of how large the edge is. It’s easy to implement and easy to reason about. It’s also leaving money on the table on your best opportunities and overexposing you on your weakest ones, since a 2% edge and a 15% edge get treated identically.</p><p><strong>Kelly Criterion: sizing by edge and odds</strong></p><p>The Kelly Criterion sizes each bet as a function of your edge and the odds being offered, rather than treating every trade the same. The formula, adapted for a binary prediction market:<br><br>def kelly_fraction(my_prob, market_price):<br>    """<br>    my_prob: your estimated probability of YES<br>    market_price: current market price (implied probability)<br>    Returns the fraction of bankroll to allocate<br>    """<br>    b = (1 - market_price) / market_price  # odds received<br>    q = 1 - my_prob<br>    f = my_prob - (q / b)<br>    return max(f, 0)  # never bet negative<br><br>In theory, full Kelly maximizes long-term bankroll growth. In practice, on prediction markets specifically, full Kelly is dangerous for a reason that doesn’t show up in the textbook version of the formula: your probability estimate has its own error bars, and Kelly sizing amplifies whatever confidence you feed it. If your model is even slightly overconfident, full Kelly will oversize positions and the variance will hurt more than the formula suggests.<br><br><strong>What I actually run: fractional Kelly</strong></p><p>In production, I size at roughly 25-50% of full Kelly, not full Kelly. This trades some theoretical growth rate for meaningfully lower variance<br>which matters more in practice than the math suggests, because your edge estimate is a model output, not a certainty. A half-Kelly position sized against a slightly wrong probability estimate is recoverable. A full-Kelly position sized against the same error can wipe out a disproportionate chunk of your bankroll on a single bad estimate.<br><br>def sized_position(my_prob, market_price, bankroll, kelly_multiplier=0.4):<br>    full_kelly = kelly_fraction(my_prob, market_price)<br>    fraction = full_kelly <em> kelly_multiplier<br>    return bankroll </em> fraction<br><br><br><strong>Where this connects to execution</strong></p><p>This ties directly into the execution validation from my last post: your sizing calculation happens at decision time, using the book state at that moment. If the book drifts before your order lands, the sizing you calculated may no longer match the liquidity actually available at that price level. Worth checking that your position size doesn’t exceed what’s actually resting at your target price after your drift-tolerance check passes -otherwise you’re sized correctly for a book that no longer exists, which is the same underlying problem as the execution timing issue, just showing up in the sizing layer instead.</p><p><strong>The practical takeaway</strong></p><p>If you’re running a bot with a working edge calculation and proper execution validation but still seeing inconsistent results, sizing is the next place to look. Fixed sizing wastes your best opportunities. Full Kelly overexposes you to model error. Fractional Kelly, tuned conservatively, tends to be the more durable choice once you’re running real capital instead of backtests.</p><p>I build execution and risk infrastructure for prediction market bots and provably fair systems for casino platforms. If you’re working through sizing or risk logic on something similar, feel free to reach out.</p>]]></content:encoded>
            <author>casatrick@newsletter.paragraph.com (Web3 Trading Systems)</author>
            <category>defi</category>
            <category>tradingbots</category>
            <category>predicitonmarkets</category>
            <category>riskmangement</category>
            <category>polymarket</category>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/38f51b9c0bd96f552c138cdff2e1dac51ab51f83de129a68c43193d0a5b51e75.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[The Execution Layer Most Trading Bot Tutorials Skip]]></title>
            <link>https://paragraph.com/@casatrick/the-execution-layer-most-trading-bot-tutorials-skip</link>
            <guid>sbM0pbKIz1YibxEhbMy2</guid>
            <pubDate>Fri, 17 Jul 2026 08:11:25 GMT</pubDate>
            <description><![CDATA[I've spent the last several months building execution infrastructure for prediction market bots mostly on Polymarket alongside RNG and fairness systems for casino-style games. Two very different domains, but they share a failure mode most devs don't think about until it costs them money: the gap between deciding to trade and actually executing. Most tutorials on trading bots stop at the pricing model. Poll the orderbook, calculate implied probability, compare against your own model, fire an o...]]></description>
            <content:encoded><![CDATA[<p>I've spent the last several months building execution infrastructure for prediction market bots mostly on Polymarket  alongside RNG and fairness systems for casino-style games. Two very different domains, but they share a failure mode most devs don't think about until it costs them money: the gap between deciding to trade and actually executing.</p><p>Most tutorials on trading bots stop at the pricing model. Poll the orderbook, calculate implied probability, compare against your own model, fire an order when edge clears some threshold. That's the part everyone writes about. It's also the part that matters least once you're running on thin-liquidity markets.</p><p><strong>Where the standard approach breaks</strong></p><p>Here's the loop almost every intro-level bot uses: fetch the orderbook, calculate implied probability from it, compare that against your model's own probability estimate, and if the edge clears a threshold, place an order sized to that edge. This works fine on markets with real depth. It quietly fails on markets with shallow top-of-book liquidity - which describes a large chunk of Polymarket listings outside the flagship markets.</p><p>The problem isn't the math. It's timing. Between the moment you fetch the book and the moment your order actually reaches the exchange, the book can change. On a thin market, a single order of moderate size can consume most of the visible liquidity in that window. Your calculated edge was measured against a book state that may no longer exist by the time your order lands. You end up filling at a price your model never actually evaluated. The math was right. The timing wasn't.</p><p><strong>The fix: validate right before you commit</strong></p><p>The solution isn't a better model. It's an execution guard - a cheap re-check immediately before order submission. Right before placing the order, re-fetch the live orderbook, diff it against the snapshot you priced your edge against, and if the drift exceeds a set tolerance, skip the trade instead of executing blind. One extra API call per decision. That's the entire cost. In exchange, you stop executing against stale prices, which in my experience matters more on illiquid markets than any amount of additional model refinement.</p><p><strong>A rule of thumb that's held up in practice</strong></p><p>If top-of-book depth is under roughly 3x your intended position size, treat staleness as your primary risk; not model accuracy. Below that ratio, the market can move meaningfully in the time it takes your order to travel, regardless of how good your pricing signal is. This isn't unique to prediction markets, either. The same principle shows up in RNG-based casino games when you're validating outcomes server-side - the state you generate a result against needs to match the state you commit it against, or you open the door to timing-based exploits. Different domain, same root problem: don't trust a snapshot you took before the world had a chance to change.</p><p><strong>Where this actually matters</strong></p><p>If you're building automated execution on prediction markets, or on any exchange with thin order books, I'd put the execution validation layer ahead of further model tuning on your priority list. A highly accurate model with no staleness protection will still bleed edge on illiquid fills. A modest model with tight execution controls tends to outperform it in the markets that matter. I build this kind of infrastructure - trading bot execution logic, market-making systems, and provably fair RNG architecture for casino platforms - for a living, and if you're working on something similar and want a second opinion on your architecture, feel free to reach out.</p>]]></content:encoded>
            <author>casatrick@newsletter.paragraph.com (Web3 Trading Systems)</author>
            <category>polymarket</category>
            <category>predictionmarket</category>
            <category>web3dev</category>
            <category>defi</category>
            <category>tradingbots</category>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/3868fa06dfc75d39cae0d1427c687b3bbb2fd2e41bfdb3abf30933dfa1b4f2e8.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[How I Get Organic Traffic Building a Polymarket Trading Bot in Public]]></title>
            <link>https://paragraph.com/@casatrick/how-i-get-organic-traffic-building-a-polymarket-trading-bot-in-public</link>
            <guid>HpkavMwZHCOKkJSPkdVW</guid>
            <pubDate>Wed, 15 Jul 2026 06:08:43 GMT</pubDate>
            <description><![CDATA[I didn't plan a traffic strategy. I posted because I was stuck building a bot that kept losing money to slippage on thin markets, and wanted to think out loud about it. The mistakes got more engagement than the wins. A post about my bot getting picked off on a low-liquidity market did better than any "here's my clean setup" post. Rewriting the same core piece per platform, instead of copy-pasting it everywhere, made a real difference - even though it took more time than I wanted it to. The ca...]]></description>
            <content:encoded><![CDATA[<p>I didn't plan a traffic strategy. I posted because I was stuck building a bot that kept losing money to slippage on thin markets, and wanted to think out loud about it.</p><p>The mistakes got more engagement than the wins. A post about my bot getting picked off on a low-liquidity market did better than any "here's my clean setup" post.</p><p>Rewriting the same core piece per platform, instead of copy-pasting it everywhere, made a real difference - even though it took more time than I wanted it to.</p><p>The casino-odds-vs-Polymarket-odds comparison worked well as a hook the first time I used it. I'm deliberately not reusing it as the default hook for every post, because it stops feeling like an insight and starts feeling like a formula.</p><p>Still don't fully know how much of this is genuine interest versus just posting consistently enough to get noticed. Not pretending to have a clean answer.</p>]]></content:encoded>
            <author>casatrick@newsletter.paragraph.com (Web3 Trading Systems)</author>
        </item>
        <item>
            <title><![CDATA[Building a Polymarket Trading Bot: Order Book Monitoring, Slippage Handling, and Position Sizing]]></title>
            <link>https://paragraph.com/@casatrick/building-a-polymarket-trading-bot-order-book-monitoring-slippage-handling-and-position-sizing</link>
            <guid>7SjWrYzPycqt7UTaTvTQ</guid>
            <pubDate>Mon, 13 Jul 2026 09:23:17 GMT</pubDate>
            <description><![CDATA[Most first-attempt Polymarket bots place a market order and call it done. That works fine on liquid, high-volume markets, but Polymarket has thousands of long-tail markets with thin order books and wide bid-ask spreads. On those, a naive market order can fill at a price 5 to 10 cents away from the quote you saw a second earlier - a massive effective cost on a binary contract priced in cents. Polymarket splits its API into two services: the Gamma API for public, read-only market discovery, and...]]></description>
            <content:encoded><![CDATA[<p>Most first-attempt Polymarket bots place a market order and call it done. That works fine on liquid, high-volume markets, but Polymarket has thousands of long-tail markets with thin order books and wide bid-ask spreads. On those, a naive market order can fill at a price 5 to 10 cents away from the quote you saw a second earlier - a massive effective cost on a binary contract priced in cents.</p><p>Polymarket splits its API into two services: the Gamma API for public, read-only market discovery, and the CLOB API for order books, prices, and trading. Reading market data requires no authentication; placing orders does.</p><p>The core workflow: discover a market and pull its order book, calculate your edge by comparing your model's probability against the market's implied probability, size the position using a fractional-Kelly approach capped by a hard maximum exposure per market, and check remaining order book depth before filling rather than chasing the price with a market order.</p><p>A few lessons that only became clear running this against real markets: poll less and cache more, since hammering the API on a flat interval wastes rate-limit budget you need when a market is actually moving. Log every trade your bot decided not to make, since that data set is what tells you whether your edge threshold is calibrated correctly. Treat correlated markets as a single combined position rather than independent bets. And treat any order book snapshot as already stale - a WebSocket feed beats polling for anything beyond casual use.<br>Full breakdown with working code: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/casatrick/polymarket-arbitrage-bot-python">Github</a></p>]]></content:encoded>
            <author>casatrick@newsletter.paragraph.com (Web3 Trading Systems)</author>
        </item>
        <item>
            <title><![CDATA[Why Polymarket Bots Need Different Risk Logic Than Casino RNG Games]]></title>
            <link>https://paragraph.com/@casatrick/why-polymarket-bots-need-different-risk-logic-than-casino-rng-games</link>
            <guid>oL76vlC8OzjUdl8QujQg</guid>
            <pubDate>Fri, 10 Jul 2026 07:46:49 GMT</pubDate>
            <description><![CDATA[If you're building a Polymarket trading bot, don't copy the risk logic from a casino or RNG betting bot. It's a category error that will bite you the first time a market gets volatile. Casino odds are exogenous and fixed. Polymarket odds are endogenous and reflexive. your own order can move the price you're trying to predict. That changes what risk even means. Casino RNG games have a known, provable probability distribution. Risk management there is mostly bankroll sizing and variance control...]]></description>
            <content:encoded><![CDATA[<p>If you're building a Polymarket trading bot, don't copy the risk logic from a casino or RNG betting bot. It's a category error that will bite you the first time a market gets volatile.</p><p>Casino odds are exogenous and fixed. Polymarket odds are endogenous and reflexive. your own order can move the price you're trying to predict. That changes what risk even means.</p><p>Casino RNG games have a known, provable probability distribution. Risk management there is mostly bankroll sizing and variance control: Kelly criterion, stop-losses, volatility smoothing.</p><p>Polymarket doesn't work that way. Prices move the instant new information lands, because they represent live, collective beliefs, not a fixed distribution.</p><p>Four risks casino-style bots never model: no stable probability distribution, adverse selection from better-informed counterparties, market impact and slippage on thin order books, and correlated exposure across related real-world events.</p><p>What a Polymarket bot's risk logic actually needs: dynamic re-pricing triggers on new information, position sizing based on order book depth rather than flat bankroll percentage, adverse-selection detection through order flow monitoring, correlation-aware limits across linked markets, and asymmetric tail-risk weighting since payouts are binary.</p><p>A casino bot manages variance against a known distribution. A Polymarket bot manages exposure in a live, reflexive, information-driven market. Start your risk logic from market microstructure and information asymmetry, not from bankroll math borrowed from games of pure chance.</p>]]></content:encoded>
            <author>casatrick@newsletter.paragraph.com (Web3 Trading Systems)</author>
        </item>
        <item>
            <title><![CDATA[What the Order Book Taught Me That Price Charts Never Could]]></title>
            <link>https://paragraph.com/@casatrick/what-the-order-book-taught-me-that-price-charts-never-could</link>
            <guid>29OVxvx1zuOCcW0YkZXD</guid>
            <pubDate>Tue, 07 Jul 2026 06:41:37 GMT</pubDate>
            <description><![CDATA[What the Order Book Taught Me That Price Charts Never Could I spent a long time looking at price charts. Candlesticks, moving averages, support and resistance levels. The whole toolkit. It felt productive. It looked like analysis. It was mostly noise. When I started building a market maker bot on Polymarket I had to stop looking at charts entirely. The bot does not care about price history. It cares about what is happening in the order book right now. That shift in focus changed how I think a...]]></description>
            <content:encoded><![CDATA[<p>What the Order Book Taught Me That Price Charts Never Could</p><p>I spent a long time looking at price charts. Candlesticks, moving averages, support and resistance levels. The whole toolkit. It felt productive. It looked like analysis. It was mostly noise.</p><p>When I started building a market maker bot on Polymarket I had to stop looking at charts entirely. The bot does not care about price history. It cares about what is happening in the order book right now. That shift in focus changed how I think about markets completely.</p><p>A price chart tells you what already happened. The order book tells you what people are willing to do next. Those are completely different things. One is a record. The other is intent.</p><p>On Polymarket the order book is sparse compared to a crypto exchange. There are not thousands of market participants constantly posting and cancelling. There are a few. Sometimes very few. Which means when someone posts a large order on one side it is visible and it means something. You are not reading noise. You are reading a decision someone made with real money behind it.</p><p>The first thing I learned from watching the book closely is that spread tells you more than price. A wide spread means nobody is confident. A tight spread means someone knows something or is willing to take risk that others are not. On BTC 5 minute markets the spread at minute one versus minute four is completely different. Same market. Same underlying asset. Completely different book.</p><p>The second thing is that depth is a signal. When buy side depth builds up faster than sell side something is happening. The bot picks this up before any price movement is visible on a chart. By the time the chart shows a move the order book already showed the setup.</p><p>The third thing is that cancellations matter as much as orders. Someone posting and immediately pulling a large order is information. It means they changed their mind or they were testing liquidity. A book that keeps losing depth without fills is telling you something about where confidence is sitting.</p><p>None of this is visible on a price chart. All of it is visible in the order book if you are watching the right things.</p><p>I am not a quant. I did not come from finance. I came from software and casino game development. But building a bot that lives inside the order book forced me to understand markets at a level that years of chart watching never did.</p><p>If you are building anything on prediction markets start with the order book. Not the price. The book is where the actual information lives.<br><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/casatrick/polymarket-arbitrage-bot">github.com/casatrick</a> for the full explanation.</p>]]></content:encoded>
            <author>casatrick@newsletter.paragraph.com (Web3 Trading Systems)</author>
            <category>polymarket</category>
            <category>trading</category>
            <category>bot</category>
            <category>strategy</category>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/d11f44fd77ed49d7a1dec090eefa89defe72dd3f59983112b5771f5cad757d13.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[My new Polymarket Trading Strategy]]></title>
            <link>https://paragraph.com/@casatrick/my-new-polymarket-trading-strategy</link>
            <guid>uaoSVf4j2jTsTOegrMCx</guid>
            <pubDate>Fri, 03 Jul 2026 10:52:48 GMT</pubDate>
            <description><![CDATA[So far I just am poking around btc 5m, 15m markets so completed my own strategy for btc market. I noticed that there's a trader on Polymarket quietly printing money on ETH 5-minute candles. Not through prediction. Not through directional edge. Through arbitrage - buying both sides of the same binary market and locking in a spread before resolution.I spent three weeks studying their trade history. There was something that hits my thinking. The Idea Binary prediction markets have a property mos...]]></description>
            <content:encoded><![CDATA[<p>So far I just am poking around btc 5m, 15m markets so completed my own strategy for btc market. I noticed that there's a trader on Polymarket quietly printing money on ETH 5-minute candles. Not through prediction. Not through directional edge. Through arbitrage - buying both sides of the same binary market and locking in a spread before resolution.I spent three weeks studying their trade history. There was something that hits my thinking.<br><br>The Idea</p><p>Binary prediction markets have a property most people ignore: YES + NO must equal $1.00 at settlement. One side pays $1.00 per share. The other pays $0.00. Doesn't matter which direction price goes.</p><p>So if you buy YES at 60¢ and NO at 32¢, combined cost is 92¢. At settlement you collect $1.00 on whichever side wins. You made 8¢ on a guaranteed basis. No directional bet.</p><p>That's the whole strategy. Buy both sides. Keep combined cost below $1.00. Hold to settlement.</p><p>The hard part isn't the concept. It's execution.<br><br>What their Trade Showed</p><p>After analyzing roughly 3,200 trades across 244 candles:</p><ul><li><p>Both sides bought on 94% of candles</p></li><li><p>Median combined VWAP: $0.74</p></li><li><p>Combined cost below $1.00 on 91% of candles</p></li><li><p>Median clip size: ~15 shares</p></li><li><p>~68% of fills in the final 60 seconds</p></li><li><p>Clip gap: ~3 seconds between trades</p></li><li><p>Return on turnover: ~30.6%</p></li></ul><p>The 3-second gap stood out. This isn't someone hammering the book. It's methodical accumulation - letting the market come to you, adding to whichever side gets cheaper, building toward a hedged position across the full candle.<br><br>How the Bot Works</p><p>Scans the CLOB every some miliseconds. When a signal fires, it clips. Fixed priority - first matching condition per tick wins.</p><p>Four clip types:</p><p>dip - first entry or cheap add when already hedged. Fires when cheaper side is at or below 55¢.</p><p>stack - adds to held leg while still one-sided. Same 55¢ cap.</p><p>late-tail - final 60 seconds, cheapest side at 32¢ or below. Convex upside if the underdog wins.</p><p>no-signal - nothing to do this tick.</p><p>Core discipline: once both legs exist, the combined VWAP guard is active. Bot won't add to either side if it pushes combined above $1.00. That guard is what keeps the locked spread positive.<br><br>The Fee Math Nobody Talks About</p><p>Polymarket crypto fee: Θ × shares × price × (1 - price), Θ = 0.07.</p><p>Fees are highest around 50¢. Lowest near 0¢ or 100¢.</p><p>Non-obvious implication: your cheapest clips near 30-35¢ also carry lower fees. Late-tail clips at 32¢ aren't just lottery tickets - they're the cleanest clips in fee terms. When they win, return is solid.</p><p>On top of that: redemption gas on Polygon. Small positions get disproportionately eaten. Anything below $8.00 effective position gets ugly after gas. Minimum position size is not optional.<br><br>What the Dashboard Shows</p><p>ARB combined - the number to watch. Below 1.00 means locked spread. Above 1.00 means you need price to move your way to recover.</p><p>Locked profit - matched pairs × (1 - combined). Guaranteed P&amp;L assuming you hold to settlement. Goes up as you add hedged clips at good prices.</p><p>Arb-blocked clips - signals rejected by the combined-VWAP guard. High count means the market isn't giving you cheap prices on both sides. Good signal to skip the candle.</p><p>Candle win rate - % of candles with net positive P&amp;L across all legs. More useful than clip win rate. A candle can have losing clips offset by a winning hedge.<br><br>What I'd Build independently</p><p>Settlement wait is the biggest friction. Gamma oracle takes at least 60 seconds after candle close. Capital locked during that window - not lost, but unavailable. In a high-frequency session this compounds fast.</p><p>Better approach: track oracle confirmation times historically, predict settlement duration per candle type, allocate capital accordingly instead of treating all settlements as identical wait times.</p><p>Maker/taker split also needs more work. Maker fills at bid+1¢ carry ~10% of taker fee. In a strategy where fee drag matters this much, posting more as maker and accepting slower fills could move the needle. Current version is mostly taker because the window is short. Worth testing properly.<br><br>Where This Fits</p><p>This isn't a direction bet. Not momentum, not mean reversion, not late-entry probability capture. Pure spread arbitrage on binary settlement mechanics.</p><p>The edge exists because 5-minute ETH candle order books aren't perfectly efficient. Prices drift. One side gets cheap while the other stays elevated. The bot exploits that drift across hundreds of candles.</p><p>Whether it stays exploitable depends on how many people run the same thing. For now, the math works.</p><p>My Another Strategies References: github.com/casatrick/polymarket-arbitrag-bot</p>]]></content:encoded>
            <author>casatrick@newsletter.paragraph.com (Web3 Trading Systems)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f29680f70fef1c213a1d2aa711b28023862bdb65a181c05e294c6d89e9594e43.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Still here, still building.]]></title>
            <link>https://paragraph.com/@casatrick/still-here-still-building</link>
            <guid>z5JBNLFAtdmBnFHUDLia</guid>
            <pubDate>Wed, 01 Jul 2026 14:00:04 GMT</pubDate>
            <description><![CDATA[I have been building a market maker bot on Polymarket for the past few weeks and honestly it has been one of the most interesting developer projects I have worked on. Most people think trading bots are complicated but the core logic is simple. You place a buy order and a sell order at the same time and you collect the difference when both fill. The hard part is everything else. Managing inventory when only one side fills. Cancelling orders fast enough when the market moves. Choosing the right...]]></description>
            <content:encoded><![CDATA[<p>I have been building a market maker bot on Polymarket for the past few weeks and honestly it has been one of the most interesting developer projects I have worked on. Most people think trading bots are complicated but the core logic is simple. You place a buy order and a sell order at the same time and you collect the difference when both fill. The hard part is everything else. Managing inventory when only one side fills. Cancelling orders fast enough when the market moves. Choosing the right markets with enough volume to actually get fills.</p><p>The Polymarket CLOB API is surprisingly good for developers. It is well documented, free to use, and supports real limit orders on a proper order book. I built everything in Node.js, store all my trade data in MongoDB, and run the bot on a VPS with PM2 keeping it alive 24/7. Nothing fancy but it works.</p><p>What I learned most is that market making is not about predicting outcomes. You are not betting on YES or NO. You are just providing liquidity and getting paid the spread for doing it. On high volume markets during big events like elections or major news, the spreads widen and the opportunity gets better. On slow quiet markets, your orders just sit there and nothing happens.</p><p>I am still improving the bot every week. Better spread logic, smarter market selection, tighter risk controls. All my code is open source and available on my GitHub at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/casatrick/polymarket-arbitrage-bot">github.com/casatrick</a> if you want to follow along or build something yourself.</p><hr><p>Ready for the third post anytime!</p>]]></content:encoded>
            <author>casatrick@newsletter.paragraph.com (Web3 Trading Systems)</author>
        </item>
        <item>
            <title><![CDATA[Building in Public: A Trading Bot for Polymarket]]></title>
            <link>https://paragraph.com/@casatrick/building-in-public-a-trading-bot-for-polymarket</link>
            <guid>T9lpC90ngUfCad5iadWI</guid>
            <pubDate>Tue, 30 Jun 2026 17:47:59 GMT</pubDate>
            <description><![CDATA[starting a thing here. mostly because I have a backlog of notes about building a trading bot that don't really fit anywhere else I post. quick background since this is a first post: I'm a backend/systems engineer, been doing trading-adjacent and on-chain stuff for a while. shipped a prediction market protocol with pyth oracles a while back, built some on-chain agents with LLM intent parsing, worked on a low-latency trading terminal. this is the next thing in that line - a bot that trades poly...]]></description>
            <content:encoded><![CDATA[<p>starting a thing here. mostly because I have a backlog of notes about building a trading bot that don't really fit anywhere else I post.</p><p>quick background since this is a first post: I'm a backend/systems engineer, been doing trading-adjacent and on-chain stuff for a while. shipped a prediction market protocol with pyth oracles a while back, built some on-chain agents with LLM intent parsing, worked on a low-latency trading terminal. this is the next thing in that line - a bot that trades polymarket, written in rust, that's been running for a few months now.</p><p>what it does, short version: connects to polymarket's websocket, keeps an order book in memory per market, runs a strategy against it, fires orders through their CLOB api. nothing fancy architecture-wise. channel-based, no shared state between tasks, feed task owns the websocket and does nothing else, strategy never touches the network directly. decision loop's around 800µs now. first version was python, 48ms. that gap is basically the whole reason this exists in rust.</p><p>why post this here specifically - prediction markets are weird right now. not quite defi, not quite tradfi, and most of what's out there is either toy examples or production stuff nobody talks about. figured I'd just be one of the people writing the real version in public instead of complaining there isn't more of it.</p><p>what I'll probably write about here:</p><p>the actual engineering stuff - order book, websocket reconnects, the time something broke and what I learned fixing it. I write some of this on substack and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://dev.to">dev.to</a> too but here I want to go deeper on the on-chain/oracle adjacent stuff specifically since that feels more relevant to whoever's reading this.</p><p>strategy comparisons, honestly written. been comparing momentum approaches, arb between polymarket and kalshi, convergence trades near resolution. most stuff treats these as the same thing. they're not, not even close, and it matters once you're dealing with real fills instead of a spreadsheet.</p><p>the unglamorous parts. capital sitting locked up, fees actually eating the edge, what happens when a resolution gets disputed, how much time this actually takes alongside a day job. the stuff that decides whether an edge is real or just looks real on paper.</p><p>not going to pretend this prints money because it doesn't, not really. modestly profitable after costs is the honest claim and that's a pretty different thing from what most trading bot content implies.</p><p>code's open if you want to look: github.com/casatrick/polymarket-trading-bot</p><p>more soon. if you're building anything near this - prediction markets, oracle stuff, on-chain agents - would genuinely like to hear about it.</p>]]></content:encoded>
            <author>casatrick@newsletter.paragraph.com (Web3 Trading Systems)</author>
            <category>polymarket-trading-bot</category>
            <category>strategy</category>
            <category>trading</category>
            <category>rust</category>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f504bb155b5904a95e65498924ef55ebe09da38dd421930fc9ba89a0e546421f.jpg" length="0" type="image/jpg"/>
        </item>
    </channel>
</rss>