Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions polygon/rest/models/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,15 @@ class Market(Enum):
CRYPTO = "crypto"
FX = "fx"
OTC = "otc"
INDICES = "indices"


class AssetClass(Enum):
STOCKS = "stocks"
OPTIONS = "options"
CRYPTO = "crypto"
FX = "fx"
INDICES = "indices"


class DividendType(Enum):
Expand Down Expand Up @@ -72,6 +74,7 @@ class SnapshotMarketType(Enum):
STOCKS = "stocks"
FOREX = "forex"
CRYPTO = "crypto"
INDICES = "indices"


class Timeframe(Enum):
Expand Down
19 changes: 19 additions & 0 deletions polygon/rest/models/markets.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,24 @@ def from_dict(d):
return MarketExchanges(**d)


@modelclass
class MarketIndices:
"Contains indices market status data."
s_and_p: Optional[str] = None
societe_generale: Optional[str] = None
msci: Optional[str] = None
ftse_russell: Optional[str] = None
mstar: Optional[str] = None
mstarc: Optional[str] = None
cccy: Optional[str] = None
nasdaq: Optional[str] = None
dow_jones: Optional[str] = None

@staticmethod
def from_dict(d):
return MarketIndices(**d)


@modelclass
class MarketHoliday:
"MarketHoliday contains data for upcoming market holidays and their open/close times."
Expand All @@ -47,6 +65,7 @@ class MarketStatus:
currencies: Optional[MarketCurrencies] = None
early_hours: Optional[bool] = None
exchanges: Optional[MarketExchanges] = None
indicesGroups: Optional[MarketIndices] = None
market: Optional[str] = None
server_time: Optional[str] = None

Expand Down
44 changes: 44 additions & 0 deletions polygon/rest/models/snapshot.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,49 @@ def from_dict(d):
)


@modelclass
class IndicesSession:
"Contains data for the most recent daily bar in an options contract."
change: Optional[float] = None
change_percent: Optional[float] = None
close: Optional[float] = None
high: Optional[float] = None
low: Optional[float] = None
open: Optional[float] = None
previous_close: Optional[float] = None

@staticmethod
def from_dict(d):
return IndicesSession(**d)


@modelclass
class IndicesSnapshot:
value: Optional[float] = None
name: Optional[str] = None
type: Optional[str] = None
ticker: Optional[str] = None
market_status: Optional[str] = None
session: Optional[IndicesSession] = None
error: Optional[str] = None
message: Optional[str] = None

@staticmethod
def from_dict(d):
return IndicesSnapshot(
value=d.get("value", None),
name=d.get("name", None),
type=d.get("type", None),
ticker=d.get("ticker", None),
market_status=d.get("market_status", None),
session=None
if "session" not in d
else IndicesSession.from_dict(d["session"]),
error=d.get("error", None),
message=d.get("message", None),
)


@modelclass
class TickerSnapshot:
"Contains the most up-to-date market data for all traded ticker symbols."
Expand Down Expand Up @@ -132,6 +175,7 @@ class UnderlyingAsset:
change_to_break_even: Optional[float] = None
last_updated: Optional[int] = None
price: Optional[float] = None
value: Optional[float] = None
ticker: Optional[str] = None
timeframe: Optional[str] = None

Expand Down
1 change: 1 addition & 0 deletions polygon/rest/models/tickers.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ class Ticker:
share_class_figi: Optional[str] = None
ticker: Optional[str] = None
type: Optional[str] = None
source_feed: Optional[str] = None

@staticmethod
def from_dict(d):
Expand Down
19 changes: 19 additions & 0 deletions polygon/rest/snapshot.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
OptionContractSnapshot,
SnapshotMarketType,
SnapshotTickerFullBook,
IndicesSnapshot,
)
from urllib3 import HTTPResponse

Expand Down Expand Up @@ -184,3 +185,21 @@ def get_snapshot_crypto_book(
raw=raw,
options=options,
)

def get_snapshot_indices(
self,
ticker_any_of: Optional[Union[str, List[str]]] = None,
params: Optional[Dict[str, Any]] = None,
raw: bool = False,
options: Optional[RequestOptionBuilder] = None,
) -> Union[List[IndicesSnapshot], HTTPResponse]:
url = f"/v3/snapshot/indices"

return self._get(
path=url,
params=self._get_params(self.get_snapshot_indices, locals()),
deserializer=IndicesSnapshot.from_dict,
raw=raw,
result_key="results",
options=options,
)
2 changes: 2 additions & 0 deletions polygon/websocket/models/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ class Market(Enum):
Options = "options"
Forex = "forex"
Crypto = "crypto"
Indices = "indices"


class EventType(Enum):
Expand All @@ -30,3 +31,4 @@ class EventType(Enum):
Imbalances = "NOI"
LimitUpLimitDown = "LULD"
CryptoL2 = "XL2"
Value = "V"
19 changes: 18 additions & 1 deletion polygon/websocket/models/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@

@modelclass
class EquityAgg:
"EquityAgg contains aggregate data for either stock tickers or option contracts."
"""EquityAgg contains aggregate data for either stock tickers, option contracts or index tickers."""

event_type: Optional[Union[str, EventType]] = None
symbol: Optional[str] = None
volume: Optional[float] = None
Expand Down Expand Up @@ -307,6 +308,21 @@ def from_dict(d):
)


@modelclass
class IndexValue:
event_type: Optional[Union[str, EventType]] = None
value: Optional[float] = None
ticker: Optional[str] = None
timestamp: Optional[str] = None

@staticmethod
def from_dict(d):
d.get("ev", None),
d.get("val", None),
d.get("T", None),
d.get("t", None)


WebSocketMessage = NewType(
"WebSocketMessage",
List[
Expand All @@ -321,6 +337,7 @@ def from_dict(d):
Imbalance,
LimitUpLimitDown,
Level2Book,
IndexValue,
]
],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"results": [
{
"value": 3822.39,
"name": "S&P 500",
"ticker": "SPX",
"type": "indices",
"market_status": "closed",
"session": {
"change": -50.01,
"change_percent": -1.45,
"close": 3822.39,
"high": 3834.41,
"low": 38217.11,
"open": 3827.38,
"previous_close": 3812.19
}
},
{
"ticker": "APx",
"error": "NOT_FOUND",
"message": "Ticker not found."
},
{
"ticker": "APy",
"error": "NOT_ENTITLED",
"message": "Not entitled to this ticker."
}
]
}
35 changes: 35 additions & 0 deletions test_rest/test_snapshots.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
Greeks,
OptionDetails,
DayOptionContractSnapshot,
IndicesSnapshot,
IndicesSession,
)
from base import BaseTest

Expand Down Expand Up @@ -283,3 +285,36 @@ def test_get_snapshot_crypto_book(self):
updated=1605295074162,
)
self.assertEqual(snapshots, expected)

def test_get_snapshot_indices(self):
ticker_any_of = ["SPX", "APx", "APy"]
summary_results = self.c.get_snapshot_indices(ticker_any_of)
expected = [
IndicesSnapshot(
value=3822.39,
name="S&P 500",
type="indices",
ticker="SPX",
market_status="closed",
session=IndicesSession(
change=-50.01,
change_percent=-1.45,
close=3822.39,
high=3834.41,
low=38217.11,
open=3827.38,
previous_close=3812.19,
),
),
IndicesSnapshot(
ticker="APx",
message="Ticker not found.",
error="NOT_FOUND",
),
IndicesSnapshot(
ticker="APy",
error="NOT_ENTITLED",
message="Not entitled to this ticker.",
),
]
self.assertEqual(summary_results, expected)