> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ziplime.ru/llms.txt
> Use this file to discover all available pages before exploring further.

# Рыночные данные

> Получение текущих значений и исторических окон через объект data

`data` — объект `BarData`, который передаётся в `handle_data`, запланированные функции обратного вызова и `before_trading_start`. Через него доступны текущие значения и исторические окна из источника рыночных данных, а также из необязательных пользовательских источников.

Доступ к данным в Ziplime асинхронный; методы возвращают DataFrame библиотеки Polars.

```python theme={null}
current = await data.current(assets=[asset], fields=["close"])
history = await data.history(assets=[asset], fields=["close"], bar_count=20)
```

## Текущие значения

### `await data.current(assets, fields, data_source=None)`

Возвращает последние доступные значения на текущий момент симуляции.

```python theme={null}
df = await data.current(
    assets=[context.asset],
    fields=["open", "high", "low", "close", "volume"],
)

close = df["close"][0]
volume = df["volume"][0]
```

Для нескольких инструментов:

```python theme={null}
df = await data.current(
    assets=context.assets,
    fields=["close", "volume"],
)

for row in df.iter_rows(named=True):
    print(row.get("symbol"), row["close"], row["volume"])
```

Точный состав столбцов-идентификаторов зависит от загруженного источника данных, но поля OHLCV запрашиваются по имени.

## Исторические окна

### `await data.history(assets, bar_count, frequency=timedelta(days=1), fields=None, data_source=None)`

Возвращает историческое окно, которое заканчивается перед текущим баром.

```python theme={null}
import datetime

hist = await data.history(
    assets=[context.asset],
    fields=["close"],
    bar_count=50,
    frequency=datetime.timedelta(days=1),
)

closes = hist["close"].to_numpy()
sma_50 = closes.mean()
```

Текущая реализация вызывает источник данных с `include_end_date=False`, поэтому `history` лучше использовать для уже завершённых предыдущих баров. Если для сигнала нужен и текущий бар, запросите его отдельно через `data.current(...)`.

```python theme={null}
hist = await data.history(
    assets=[context.asset],
    fields=["close"],
    bar_count=19,
)
current = await data.current(
    assets=[context.asset],
    fields=["close"],
)

window = list(hist["close"]) + [current["close"][0]]
```

## Поля

Часто используемые поля рыночных данных:

| Поле            | Значение                                                             |
| --------------- | -------------------------------------------------------------------- |
| `"open"`        | Цена открытия бара                                                   |
| `"high"`        | Максимальная цена бара                                               |
| `"low"`         | Минимальная цена бара                                                |
| `"close"`       | Цена закрытия бара                                                   |
| `"volume"`      | Объём бара                                                           |
| `"price"`       | Последняя известная цена, если поддерживается источником данных      |
| `"last_traded"` | Дата и время последней сделки, если поддерживается источником данных |

Пользовательские пакеты данных могут предоставлять дополнительные поля. Чтобы обратиться не к источнику по умолчанию, передайте имя пакета в `data_source`:

```python theme={null}
fundamentals = await data.current(
    assets=[context.asset],
    fields=["market_cap", "pe_ratio"],
    data_source="finam_ru_fundamental_data",
)
```

Значение `data_source` должно совпадать с именем источника, настроенного в вашем российском контуре.

## Работа с Polars

Ziplime возвращает `polars.DataFrame`, поэтому доступны обычные операции Polars.

```python theme={null}
import polars as pl

hist = await data.history(
    assets=context.assets,
    fields=["close", "volume"],
    bar_count=20,
)

summary = hist.group_by("symbol").agg(
    pl.col("close").mean().alias("mean_close"),
    pl.col("volume").sum().alias("total_volume"),
)
```

Для одного инструмента и одного поля чаще всего используют такой вариант:

```python theme={null}
df = await data.current(assets=[asset], fields=["close"])
close = df["close"][0]
```

## Время в data

`data.current_dt` возвращает текущие дату и время симуляции.

```python theme={null}
dt = data.current_dt
```

`data.current_session` возвращает метку текущей торговой сессии.

```python theme={null}
session = data.current_session
```

## Проверка доступности торговли

Метод `data.can_trade(assets)` сохранён для совместимости с Zipline и предназначен для проверки активности инструмента, торговых часов биржи, ограничений и наличия ценовых данных.

Чтобы код стратегии был переносимым в текущей среде Ziplime, перед отправкой заявки лучше проверить именно те данные, которые ему нужны:

```python theme={null}
current = await data.current(assets=[asset], fields=["close", "volume"])

if current.height == 0:
    return

close = current["close"][0]
volume = current["volume"][0]

if close is None or volume <= 0:
    return
```
