<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ais Fang</title>
    <description>The latest articles on DEV Community by Ais Fang (@polymrktexpert).</description>
    <link>https://dev.to/polymrktexpert</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4173979%2Fdcd880b0-5c10-4471-a158-3d86ecf935dc.png</url>
      <title>DEV Community: Ais Fang</title>
      <link>https://dev.to/polymrktexpert</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/polymrktexpert"/>
    <language>en</language>
    <item>
      <title>Mark Price, Index Price, and the $6.3B Day: What Polymarket Perps Traders Learned on October 29</title>
      <dc:creator>Ais Fang</dc:creator>
      <pubDate>Sun, 01 Nov 2026 18:31:38 +0000</pubDate>
      <link>https://dev.to/polymrktexpert/mark-price-index-price-and-the-63b-day-what-polymarket-perps-traders-learned-on-october-29-2hkh</link>
      <guid>https://dev.to/polymrktexpert/mark-price-index-price-and-the-63b-day-what-polymarket-perps-traders-learned-on-october-29-2hkh</guid>
      <description>&lt;p&gt;Mark Price, Index Price, and the $6.3B Day: What Polymarket Perps Traders Learned on October 29&lt;/p&gt;

&lt;p&gt;October 29, 2026 was the day two different worlds broke at once. A hijacked third-party script swept $2.73M from 737 Polymarket accounts in under an hour. The same day, Binance lost $6.3B — the largest exchange theft on record. For Perps traders, the day was a stress test of everything we thought we understood about where risk actually lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first lesson: the contracts held, the plumbing didn't
&lt;/h2&gt;

&lt;p&gt;Nothing in the Polymarket settlement or order-matching engine was exploited. The drain ran through a compromised vendor script — code that users' browsers loaded from a third party. That distinction matters for anyone trading Perps: your risk model can be perfect at the contract layer and still fail at the browser layer.&lt;/p&gt;

&lt;p&gt;If you trade with leverage, your exposure to "platform risk" is not just liquidation math. It includes every script your session loads. The &lt;a href="https://brainresearchhub.net/research/security/october-29-double-breach-polymarket-binance" rel="noopener noreferrer"&gt;October 29 double-breach analysis&lt;/a&gt; walks through the minute-by-minute of both incidents — worth reading before your next session.&lt;/p&gt;

&lt;h2&gt;
  
  
  The second lesson: mark price exists for exactly this day
&lt;/h2&gt;

&lt;p&gt;Perps traders live by mark price — the index-linked number that decides your margin, not the last panicked trade. On a day when headlines moved faster than books could reprice, the gap between mark and last trade was the widest many traders had seen.&lt;/p&gt;

&lt;p&gt;Funding, margin requirements, and liquidation thresholds all key off mark price for a reason: it resists manipulation at the moments manipulation is most profitable. If you never internalized why the &lt;a href="https://brainresearchhub.net/research/perps/mark-vs-index-price" rel="noopener noreferrer"&gt;mark price vs index price distinction&lt;/a&gt; matters, October 29 was the object lesson.&lt;/p&gt;

&lt;h2&gt;
  
  
  The third lesson: standing permissions are the real leverage
&lt;/h2&gt;

&lt;p&gt;The drainer did not break into 737 wallets by force. It reused what those wallets had already granted — approvals and delegations signed months earlier, still valid, still unlimited. Leverage works the same way: your position size is borrowed against infrastructure you don't control.&lt;/p&gt;

&lt;p&gt;The defense is the same for both. Audit what you've granted. Revoke what you don't recognize. The &lt;a href="https://brainresearchhub.net/research/security/revoke-approvals-guide" rel="noopener noreferrer"&gt;revoke guide&lt;/a&gt; takes ten minutes; the &lt;a href="https://brainresearchhub.net/research/perps/polymarket-perps-liquidation" rel="noopener noreferrer"&gt;liquidation math&lt;/a&gt; takes five. Both are cheaper than the alternative.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I changed in my own setup
&lt;/h2&gt;

&lt;p&gt;Three things, the same week: every approval on my trading wallets reviewed and trimmed to exact amounts (nothing unlimited survives anymore), a hardware-session habit — trading sessions start and end with a fresh browser profile, nothing persists, and a standing rule that deposits to any trading address go through a watched intermediary address first, one that carries no approvals at all.&lt;/p&gt;

&lt;p&gt;None of this is exotic. All of it was free. The 737 wallets on October 29 didn't lack sophistication — they lacked the ten-minute audit.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Further reading: &lt;a href="https://brainresearchhub.net/research/security/polymarket-hacks-timeline" rel="noopener noreferrer"&gt;when Polymarket was hacked — the full timeline&lt;/a&gt;, and the &lt;a href="https://brainresearchhub.net/research/perps/polymarket-perps-liquidation" rel="noopener noreferrer"&gt;Perps liquidation mechanics&lt;/a&gt; for the margin math behind mark price. Background on the Binance incident: &lt;a href="https://en.wikipedia.org/wiki/2026_Binance_hack" rel="noopener noreferrer"&gt;2026 Binance hack&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>polymarket</category>
      <category>pythonsecurity</category>
    </item>
    <item>
      <title>Monitoring Mark-Price Gap on Polymarket Perps with Python and WebSockets</title>
      <dc:creator>Ais Fang</dc:creator>
      <pubDate>Tue, 20 Oct 2026 16:06:16 +0000</pubDate>
      <link>https://dev.to/polymrktexpert/monitoring-mark-price-gap-on-polymarket-perps-with-python-and-websockets-4dbm</link>
      <guid>https://dev.to/polymrktexpert/monitoring-mark-price-gap-on-polymarket-perps-with-python-and-websockets-4dbm</guid>
      <description>&lt;p&gt;If you trade perps on Polymarket, the single most important number on your position screen is not your entry price and not the last trade. It is the mark price, because that is the number the risk engine uses when it decides how much equity your position has left.&lt;/p&gt;

&lt;p&gt;The docs spell out the formula — Equity = Collateral + unrealized PnL (at mark) − fees due − funding due — and the liquidation threshold follows from maintenance margin, which is 0.5 / MaxLeverage (2.5% on a 20x market). What the docs do not hand you is a ready-made monitor that tells you how far your position is from that line right now. This post builds one in Python.&lt;/p&gt;

&lt;p&gt;I wrote a longer breakdown of why the mark price diverges from the index on prediction-market perps over at BrainResearchHub (mark vs index price, explained with worked examples): &lt;a href="https://brainresearchhub.net/research/perps/mark-vs-index-price" rel="noopener noreferrer"&gt;https://brainresearchhub.net/research/perps/mark-vs-index-price&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the gap matters on prediction markets
&lt;/h2&gt;

&lt;p&gt;On crypto perps the index comes from centralized exchanges and the mark tracks it tightly. On prediction-market perps the underlying "index" is derived from outcome probabilities, and the order book can be thin. When a news headline hits, the book reprices in seconds while the index construction lags behind. That window is exactly where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;unrealized PnL gets marked against a price you did not expect,&lt;/li&gt;
&lt;li&gt;funding payments get computed from a premium you did not anticipate,&lt;/li&gt;
&lt;li&gt;liquidation thresholds get tested sooner than a naive "I'm 10% away from my liquidation price" mental model suggests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you only watch the last traded price, you are reading the wrong gauge. The order book mechanics behind this are covered in depth here: &lt;a href="https://brainresearchhub.net/research/perps/polymarket-clob-order-book" rel="noopener noreferrer"&gt;https://brainresearchhub.net/research/perps/polymarket-clob-order-book&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The monitor
&lt;/h2&gt;

&lt;p&gt;The script below does four things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connects to the market's public WebSocket stream for trades and book updates.&lt;/li&gt;
&lt;li&gt;Polls the REST endpoint for the current index and mark values.&lt;/li&gt;
&lt;li&gt;Computes the gap in basis points.&lt;/li&gt;
&lt;li&gt;Computes your distance to maintenance margin given your side, size, and leverage.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;aiohttp&lt;/span&gt;

&lt;span class="n"&gt;REST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://clob.polymarket.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;WS&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wss://ws-subscriptions-clob.polymarket.com/ws/market&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;TOKEN_ID&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;        &lt;span class="c1"&gt;# your market's clob token id
&lt;/span&gt;&lt;span class="n"&gt;SIDE&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BUY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;        &lt;span class="c1"&gt;# your position side
&lt;/span&gt;&lt;span class="n"&gt;SIZE&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;100.0&lt;/span&gt;        &lt;span class="c1"&gt;# position size
&lt;/span&gt;&lt;span class="n"&gt;ENTRY&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.62&lt;/span&gt;         &lt;span class="c1"&gt;# your average entry in prob units
&lt;/span&gt;&lt;span class="n"&gt;MAX_LEV&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;20.0&lt;/span&gt;

&lt;span class="n"&gt;MMR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;MAX_LEV&lt;/span&gt;       &lt;span class="c1"&gt;# maintenance margin ratio (2.5% at 20x)
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;gap_bps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
    &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mark&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10_000&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;liq_distance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Rough distance to maintenance margin, in prob units.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;SIDE&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BUY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;equity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mark&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;ENTRY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;SIZE&lt;/span&gt;          &lt;span class="c1"&gt;# per-unit mark pnl
&lt;/span&gt;        &lt;span class="n"&gt;floor&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MMR&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;mark&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;SIZE&lt;/span&gt;
        &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;equity&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;SIZE&lt;/span&gt;
    &lt;span class="n"&gt;equity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ENTRY&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;SIZE&lt;/span&gt;
    &lt;span class="n"&gt;floor&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MMR&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;mark&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;SIZE&lt;/span&gt;
    &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;equity&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;SIZE&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;poll_mark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;REST&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/prices-history&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;market&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TOKEN_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;interval&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1m&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;aiohttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ClientSession&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;poll_mark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="c1"&gt;# prices-history returns a series; last point is our proxy for mark
&lt;/span&gt;                &lt;span class="n"&gt;series&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;history&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;series&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;series&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;liq_distance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;%H&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; mark~&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                          &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;liq-distance~&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; prob-units  MMR=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;MMR&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;poll error:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A note on streams: the market WebSocket channel pushes &lt;code&gt;book&lt;/code&gt; and &lt;code&gt;price_change&lt;/code&gt; events, which is what you want for a book-weighted mark estimate rather than a last-trade proxy. Order types and time-in-force quirks that affect what your bot sees in the book are documented here: &lt;a href="https://brainresearchhub.net/research/perps/order-types-tif-explained" rel="noopener noreferrer"&gt;https://brainresearchhub.net/research/perps/order-types-tif-explained&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats I hit while building this
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Funding is charged hourly and capped, so a one-off gap spike costs less than a sustained one. The funding pipeline (premium index sampling every 5 seconds, 8-hour rate, hourly settlement) is broken down step by step here: &lt;a href="https://brainresearchhub.net/research/perps/polymarket-perps-funding-rate" rel="noopener noreferrer"&gt;https://brainresearchhub.net/research/perps/polymarket-perps-funding-rate&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Cross vs isolated margin changes what "your equity" means entirely. I keep positions isolated while testing monitors so a bug cannot cascade: &lt;a href="https://brainresearchhub.net/research/perps/cross-vs-isolated-margin" rel="noopener noreferrer"&gt;https://brainresearchhub.net/research/perps/cross-vs-isolated-margin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;For background on what perpetual futures are as an instrument, the Wikipedia entry is a decent neutral primer: &lt;a href="https://en.wikipedia.org/wiki/Perpetual_futures" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Perpetual_futures&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing here is financial advice. Collateral on Polymarket is pUSD, parameters change, and the only source of truth is the official docs. This monitor is a read-only starting point — wire it into alerts, not into an auto-trader, until you have watched it through a few news cycles.&lt;/p&gt;

</description>
      <category>python</category>
    </item>
    <item>
      <title>How Polymarket Perps Funding Rate Actually Works (With the Real Formula and Python)</title>
      <dc:creator>Ais Fang</dc:creator>
      <pubDate>Sat, 10 Oct 2026 03:02:31 +0000</pubDate>
      <link>https://dev.to/polymrktexpert/how-polymarket-perps-funding-rate-actually-works-with-the-real-formula-and-python-53ke</link>
      <guid>https://dev.to/polymrktexpert/how-polymarket-perps-funding-rate-actually-works-with-the-real-formula-and-python-53ke</guid>
      <description></description>
    </item>
  </channel>
</rss>
