> ## 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.

# Заявки

> Размещение, приведение к целевому значению и отмена заявок через context

Заявки размещаются асинхронными вызовами методов `context`. Вызывайте их в `handle_data` или в запланированных функциях обратного вызова. Не размещайте заявки в `initialize` и `before_trading_start`.

```python theme={null}
from ziplime.finance.execution import MarketOrder

await context.order_target_percent(
    asset=context.asset,
    target=0.5,
    style=MarketOrder(),
)
```

## Стили исполнения

Импортируйте стили исполнения из `ziplime.finance.execution`.

```python theme={null}
from ziplime.finance.execution import (
    MarketOrder,
    LimitOrder,
    StopOrder,
    StopLimitOrder,
)
```

| Стиль                                     | Пример                         | Значение                                                                     |
| ----------------------------------------- | ------------------------------ | ---------------------------------------------------------------------------- |
| `MarketOrder()`                           | `MarketOrder()`                | Исполнить по цене, заданной настройками симуляции и моделью проскальзывания. |
| `LimitOrder(limit_price)`                 | `LimitOrder(300.0)`            | Купить не выше лимитной цены или продать не ниже неё.                        |
| `StopOrder(stop_price)`                   | `StopOrder(290.0)`             | Активировать рыночную заявку после достижения стоп-цены.                     |
| `StopLimitOrder(limit_price, stop_price)` | `StopLimitOrder(302.0, 295.0)` | Активировать лимитную заявку после достижения стоп-цены.                     |

Для рублёвых инструментов MOEX цены в этих примерах выражены в рублях; в общем случае используется валюта котировки инструмента.

## Фиксированное количество

### `await context.order(asset, amount, style, exchange_name=None)`

Положительное значение `amount` открывает или увеличивает длинную позицию либо закрывает короткую. Отрицательное значение продаёт инструмент или открывает короткую позицию.

```python theme={null}
await context.order(context.asset, 100, style=MarketOrder())
await context.order(context.asset, -50, style=MarketOrder())
```

Лимитная заявка:

```python theme={null}
await context.order(
    context.asset,
    100,
    style=LimitOrder(limit_price=300.0),
)
```

## Целевое количество

### `await context.order_target(asset, target, style, exchange_name=None)`

Изменяет позицию до целевого количества акций или контрактов.

```python theme={null}
await context.order_target(context.asset, 200, style=MarketOrder())
await context.order_target(context.asset, 0, style=MarketOrder())
```

## Доля портфеля

### `await context.order_target_percent(asset, target, style, exchange_name=None, reserved_percentage_for_fees=0.05)`

Изменяет позицию до целевого веса в портфеле. Значение `target` должно находиться в диапазоне от `-1` до `1`.

```python theme={null}
# Выделить 25% портфеля на SBER.
await context.order_target_percent(context.sber, 0.25, style=MarketOrder())

# Закрыть позицию.
await context.order_target_percent(context.sber, 0.0, style=MarketOrder())
```

Это основной вспомогательный метод для стратегий с ребалансировкой.

### `await context.order_percent(asset, percent, style, exchange_name=None)`

Изменяет позицию на долю текущей стоимости портфеля. Это не целевое значение: метод добавляет или сокращает экспозицию относительно текущей позиции.

```python theme={null}
# Купить примерно на 10% текущей стоимости портфеля.
await context.order_percent(context.asset, 0.10, style=MarketOrder())
```

## Денежная стоимость

### `await context.order_target_value(asset, target, style, exchange_name=None)`

Изменяет позицию до целевой номинальной стоимости в валюте портфеля.

```python theme={null}
# Для портфеля в RUB целевая стоимость позиции составляет 1 000 000 рублей.
await context.order_target_value(context.asset, 1_000_000, style=MarketOrder())
await context.order_target_value(context.asset, 0, style=MarketOrder())
```

### `context.order_value(...)`

`order_value` присутствует как совместимый с Zipline метод для заявок на приращение денежной стоимости. В текущем коде стратегий Ziplime предпочтительнее использовать `order_target_value`, `order_percent` или `order`, если вы отдельно не проверили, что ваш путь исполнения поддерживает нужное поведение `order_value`.

## Открытые заявки

### `context.get_open_orders(asset=None)`

Возвращает открытые на текущий момент заявки. Передайте инструмент, чтобы отфильтровать результат.

```python theme={null}
open_orders = context.get_open_orders(context.asset)
if open_orders:
    return
```

### `context.get_order(order_id, exchange_name)`

Возвращает заявку по идентификатору.

```python theme={null}
order = context.get_order(order_id, exchange_name="MOEX")
if order is not None:
    print(order.status, order.filled, order.amount)
```

Имя `"MOEX"` должно совпадать со значением `exchange_name` в конфигурации запуска.

### `await context.cancel_order(order_id, exchange_name, relay_status=True)`

Отменяет открытую заявку.

```python theme={null}
for order in context.get_open_orders(context.asset):
    await context.cancel_order(order.id, exchange_name=order.exchange_name)
```

## Возвращаемый объект заявки

Методы работы с заявками возвращают объект `Order` или `None`, если заявка не была размещена.

Полезные поля:

| Поле            | Значение                                  |
| --------------- | ----------------------------------------- |
| `id`            | Идентификатор заявки в Ziplime            |
| `asset`         | Инструмент заявки                         |
| `amount`        | Запрошенное количество                    |
| `filled`        | Исполненное количество                    |
| `open_amount`   | Оставшееся количество                     |
| `status`        | Текущий статус заявки                     |
| `commission`    | Накопленная комиссия                      |
| `dt`            | Дата и время последнего обновления заявки |
| `exchange_name` | Биржа, которой принадлежит заявка         |

## Момент исполнения

При `run_simulation(..., same_bar_execution=True)` заявки, отправленные в `handle_data`, могут исполниться на том же баре. При `same_bar_execution=False` они исполняются на одном из следующих баров.

Цена исполнения определяется параметром `price_used_in_order_execution` со значением `"open"`, `"close"`, `"low"` или `"high"`, а также настроенной моделью проскальзывания.

## Предупреждение о целевых заявках

Целевые методы не учитывают автоматически открытые заявки, которые ещё не исполнились. Следующий код может создать избыточный объём заявок:

```python theme={null}
await context.order_target_percent(asset, 0.5, style=MarketOrder())
await context.order_target_percent(asset, 0.5, style=MarketOrder())
```

Более безопасный вариант:

```python theme={null}
if not context.get_open_orders(asset):
    await context.order_target_percent(asset, 0.5, style=MarketOrder())
```

## Ребалансировка с равными весами

```python theme={null}
from ziplime.finance.execution import MarketOrder


async def rebalance(context, data):
    weight = 1.0 / len(context.assets)
    for asset in context.assets:
        if not context.get_open_orders(asset):
            await context.order_target_percent(asset, weight, style=MarketOrder())
```
