<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[ElitePropX]]></title><description><![CDATA[ElitePropX]]></description><link>https://elitepropx.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Wed, 04 Nov 2026 18:20:54 GMT</lastBuildDate><atom:link href="https://elitepropx.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Nine prop firm rulebooks, one schema: the fields that actually decide the outcome]]></title><description><![CDATA[The three fields that decide whether the same trades pass or fail a prop firm challenge: drawdown mode, floor basis and reset timezone.]]></description><link>https://elitepropx.hashnode.dev/nine-prop-firm-rulebooks-one-schema-the-fields-that-actually-decide-the-outcome</link><guid isPermaLink="true">https://elitepropx.hashnode.dev/nine-prop-firm-rulebooks-one-schema-the-fields-that-actually-decide-the-outcome</guid><category><![CDATA[trading, ]]></category><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[ElitePropX]]></dc:creator><pubDate>Thu, 29 Oct 2026 15:06:53 GMT</pubDate><content:encoded><![CDATA[<p>Every prop firm publishes its rules as prose, and every comparison site reproduces that prose. Comparing nine firms then means holding nine documents in your head at once, which is where most "this firm is easier" claims come from — not from a calculation, from a memory of a paragraph.</p>
<p>The alternative is to encode the rules as data. Not because a schema is more truthful, but because it forces you to name the fields, and three of those fields do most of the work.</p>
<h2>The schema</h2>
<pre><code class="language-plaintext">{
  "firm": "example",
  "account": {
    "size": 100000,
    "profit_target_pct": 8,
    "max_daily_loss_pct": 5,
    "max_total_loss_pct": 10,
    "drawdown_mode": "trailing_intraday" | "trailing_eod" | "static",
    "floor_basis": "balance" | "equity",
    "floor_locks_at_starting_balance": true,
    "reset_timezone": "America/New_York",
    "min_trading_days": 5,
    "consistency_cap_pct": null,
    "news_restriction": "none" | "window" | "banned",
    "weekend_holding": true,
    "payout_split_pct": 90
  }
}
</code></pre>
<p>Nine firms, one array. A comparison becomes a filter rather than an essay, and "which is easier" becomes a question about a specific field instead of a general impression.</p>
<h2>The three fields that change the arithmetic</h2>
<h3>1. drawdown_mode</h3>
<p>Static means the floor never moves. Trailing intraday means it follows the high-water mark inside the session. Trailing end-of-day means it only moves at the close.</p>
<p>Same trades, different outcome: a position that runs to plus two R and closes at plus half an R raises an intraday floor and leaves an end-of-day floor untouched. If your edge is a wide target with a small give-back, the mode decides whether you are trading a recovering account or a shrinking one.</p>
<h3>2. floor_basis</h3>
<p>Balance or equity. On a balance basis, an open loss does not move your floor. On an equity basis it does, which means the room available to a position that is already open is smaller than the room you measured before you entered it. This is the field that separates "my stop is 1%" from "my stop is 1% and it is 40% of what is left".</p>
<h3>3. reset_timezone</h3>
<p>The daily loss resets at a wall clock in a stated timezone. Two sessions of yours can sit inside one of theirs, and a firm that resets at 5pm New York is not giving a trader in Johannesburg a calendar day. The same rule, read twice by two people, produces two different daily budgets — which is precisely what prose does and a field does not.</p>
<h2>What encoding buys you</h2>
<pre><code class="language-plaintext">function roomLeft(a, equity, highWater) {
  const base = a.floor_basis === 'equity' ? equity : highWater;
  const floor = a.drawdown_mode === 'static'
    ? a.size * (1 - a.max_total_loss_pct / 100)
    : base * (1 - a.max_total_loss_pct / 100);
  return equity - floor;
}
</code></pre>
<p>Once the rules are fields, three things get cheap. Sizing from the remaining room instead of from account size. Checking whether a strategy is viable on a firm at all, before paying a fee. And noticing when a term changes, because a change is a diff rather than a re-read.</p>
<p>The caveat is the point of the exercise: this encodes what a firm publishes today, and a term written differently is a different rule. Keep the fields separate from the marketing and you can re-encode without re-learning.</p>
<p>I keep the encoded comparison at <a href="https://elitepropx.com/prop-firm-rules-matrix.html">the prop firm rules matrix</a>, and the method for checking each firm against its own terms at <a href="https://elitepropx.com/methodology.html">methodology</a>.</p>
]]></content:encoded></item></channel></rss>