diff --git a/README.md b/README.md index 5014c2f..acc8b03 100644 --- a/README.md +++ b/README.md @@ -196,6 +196,25 @@ bars would remove it entirely. `/ES` resolves to the active contract (`/ESU26` today) on Schwab's side, so contract rolls need no handling. +### Rate limits + +The developer portal shows **Order Limit: 120**, which caps orders per minute — +this app places none. Schwab separately rate-limits REST calls, commonly cited at +120 per minute. + +Neither constrains us, because **streaming is not REST**. The WebSocket is a +single connection and bars arrive by push, so steady-state Schwab REST usage is +essentially zero. This is a concrete advantage of the stream over the polling +fallback: polling `get_quotes()` once a second would have sat at roughly half the +limit permanently, forever. + +The exception is reconnects. Each one calls `get_user_preferences()` to fetch the +socket URL, and `StreamService` retries every five seconds, so a sustained outage +generates about twelve REST calls a minute. Comfortably under, but not nothing — +worth remembering before shortening that backoff. + +Yahoo is a different service and none of these limits apply to it. + ### Authenticating ```bash