PHPackages                             tigusigalpa/bcs-trade-php - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. tigusigalpa/bcs-trade-php

ActiveLibrary[API Development](/categories/api)

tigusigalpa/bcs-trade-php
=========================

PHP/Laravel client for BCS Broker Trade API

v1.0.0(2mo ago)41MITPHPPHP ^8.1CI failing

Since Feb 27Pushed 2mo agoCompare

[ Source](https://github.com/tigusigalpa/bcs-trade-php)[ Packagist](https://packagist.org/packages/tigusigalpa/bcs-trade-php)[ RSS](/packages/tigusigalpa-bcs-trade-php/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (1)Dependencies (7)Versions (2)Used By (0)

BCS Trade PHP/Laravel Client
============================

[](#bcs-trade-phplaravel-client)

[![БКС Брокер PHP/Laravel API клиент](https://private-user-images.githubusercontent.com/2721390/555773690-00a1b45e-7870-4b47-9b76-62d313ebcc3f.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzU0NDg4OTMsIm5iZiI6MTc3NTQ0ODU5MywicGF0aCI6Ii8yNzIxMzkwLzU1NTc3MzY5MC0wMGExYjQ1ZS03ODcwLTRiNDctOWI3Ni02MmQzMTNlYmNjM2YucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDQwNiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA0MDZUMDQwOTUzWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YmNhOWU5YWI3OTE1YmVkYzRmNDU5NTU2NjU1YTJlNjgwYmRhNTUwNDk3YmE4ODhiOTIxMmZiNjEzNTgzOGVlNSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.HhGjO4FoP0mrmRMzGXNAjA8N2mf4A59uO5NX-68ClfQ)](https://private-user-images.githubusercontent.com/2721390/555773690-00a1b45e-7870-4b47-9b76-62d313ebcc3f.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzU0NDg4OTMsIm5iZiI6MTc3NTQ0ODU5MywicGF0aCI6Ii8yNzIxMzkwLzU1NTc3MzY5MC0wMGExYjQ1ZS03ODcwLTRiNDctOWI3Ni02MmQzMTNlYmNjM2YucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDQwNiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA0MDZUMDQwOTUzWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YmNhOWU5YWI3OTE1YmVkYzRmNDU5NTU2NjU1YTJlNjgwYmRhNTUwNDk3YmE4ODhiOTIxMmZiNjEzNTgzOGVlNSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.HhGjO4FoP0mrmRMzGXNAjA8N2mf4A59uO5NX-68ClfQ)

[![Latest Version](https://camo.githubusercontent.com/f230ea6830557be740d11ea2d2b6899d06d245417ae1a12fd53e18cefc3f84e5/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f74696775736967616c70612f6263732d74726164652d7068702e737667)](https://packagist.org/packages/tigusigalpa/bcs-trade-php)[![License](https://camo.githubusercontent.com/5979b203e8d2d2153c6a108106b91798e126b6def84154160fc920aa01210447/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f74696775736967616c70612f6263732d74726164652d7068702e737667)](https://packagist.org/packages/tigusigalpa/bcs-trade-php)[![PHP Version](https://camo.githubusercontent.com/27b143b87568d0ac692e2c7e2abad1f5a911bb170c90c789074cabb314afc3f4/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f74696775736967616c70612f6263732d74726164652d7068702e737667)](https://packagist.org/packages/tigusigalpa/bcs-trade-php)

PHP/Laravel клиент для [BCS Trade API](https://trade-api.bcs.ru) — торгового API брокера БКС. Работает по HTTP и WebSocket.

Возможности
-----------

[](#возможности)

- Все HTTP эндпоинты BCS Trade API
- Все WebSocket каналы (real-time данные)
- Автообновление OAuth 2.0 токенов
- Кастомные исключения для разных типов ошибок
- Повторные попытки при сетевых сбоях
- Обработка rate limiting (HTTP 429)
- Валидация запросов (лимит 1000 баров для свечей)
- Автопагинация при запросе больших объёмов исторических данных
- PHP 8.1+ (enums, readonly properties)
- Laravel 9, 10, 11, 12
- PSR-12
- Тесты на Pest

Требования
----------

[](#требования)

- PHP 8.1 или выше
- Laravel 9.x, 10.x, 11.x или 12.x
- Composer

Установка
---------

[](#установка)

Через Composer:

```
composer require tigusigalpa/bcs-trade-php
```

Публикация конфига:

```
php artisan vendor:publish --tag=bcs-trade-config
```

Конфигурация
------------

[](#конфигурация)

### Получение Refresh Token

[](#получение-refresh-token)

1. Войдите в [БКС Мир Инвестиций](https://broker.ru)
2. Перейдите в раздел API
3. Создайте новый токен и скопируйте `refresh_token`
4. Токен действителен 90 дней

### Переменные окружения

[](#переменные-окружения)

В `.env`:

```
BCS_TRADE_REFRESH_TOKEN=your_refresh_token_here
BCS_TRADE_CLIENT_ID=trade-api-read  # или trade-api-write для торговых операций
BCS_TRADE_CACHE_STORE=file
```

### Параметры конфигурации

[](#параметры-конфигурации)

`config/bcs-trade.php`:

ПараметрОписаниеПо умолчанию`refresh_token`Refresh token из БКС Мир Инвестиций-`client_id`Scope токена: `trade-api-read` или `trade-api-write``trade-api-read``cache_store`Хранилище кеша для токенов`file``cache_prefix`Префикс ключей кеша`bcs_trade_``timeout`Таймаут HTTP запросов (секунды)30`connect_timeout`Таймаут подключения (секунды)10`retry_attempts`Количество повторных попыток3`retry_delay`Задержка между попытками (мс)500Использование
-------------

[](#использование)

### Базовая инициализация

[](#базовая-инициализация)

```
use Tigusigalpa\BCSTrade\BCSTradeClient;

// Через конструктор
$client = new BCSTradeClient(config('bcs-trade'));

// Через Laravel Container
$client = app(BCSTradeClient::class);

// Через Facade
use Tigusigalpa\BCSTrade\Facades\BCSTrade;

$limits = BCSTrade::limits()->get();
```

### HTTP API

[](#http-api)

#### Аутентификация

[](#аутентификация)

```
use Tigusigalpa\BCSTrade\Http\Responses\TokenResponse;

// Получить токен вручную
$tokenResponse = $client->auth()->getToken(
    'your_refresh_token',
    'trade-api-read'
);

echo $tokenResponse->accessToken;
echo $tokenResponse->expiresIn;

// Токены управляются автоматически, ручной вызов не требуется
```

#### Лимиты портфеля

[](#лимиты-портфеля)

```
$limits = $client->limits()->get();

// Структура ответа:
// [
//     'depoLimit' => [...],
//     'futureHolding' => [...],
//     'moneyLimits' => [...],
//     'futuresLimits' => [...]
// ]
```

#### Портфель

[](#портфель)

```
$portfolio = $client->portfolio()->get();
```

#### Справочная информация

[](#справочная-информация)

```
// Расписание торгов
$schedule = $client->information()->getDailySchedule('TQBR', 'SBER');

// Инструменты по ISIN
$instruments = $client->information()->getByIsins(['RU0009029540']);

// Инструмент по тикеру
$instrument = $client->information()->getByTicker('SBER', 'TQBR');

// Инструменты по типу
$stocks = $client->information()->getByType('stock');

// Статусы торгов
$statuses = $client->information()->getTradingStatuses(
    ['SBER', 'GAZP'],
    ['TQBR', 'TQBR']
);
```

#### Рыночные данные (свечи)

[](#рыночные-данные-свечи)

```
use Tigusigalpa\BCSTrade\Enums\TimeFrame;

// Получить исторические свечи (до 1000 баров)
$candles = $client->marketData()->getCandles(
    classCode: 'TQBR',
    ticker: 'SBER',
    startDate: '2025-01-01T07:00:00Z',
    endDate: '2025-01-31T20:00:00Z',
    timeFrame: TimeFrame::D
);

// Или используйте строку
$candles = $client->marketData()->getCandles(
    'TQBR',
    'SBER',
    '2025-01-01T07:00:00Z',
    '2025-01-31T20:00:00Z',
    'H1'
);

// Автоматическая пагинация для больших диапазонов
$candles = $client->marketData()->getCandlesPaginated(
    'TQBR',
    'SBER',
    '2024-01-01T07:00:00Z',
    '2025-12-31T20:00:00Z',
    TimeFrame::D
);

// Доступные таймфреймы
TimeFrame::M1   // 1 минута
TimeFrame::M5   // 5 минут
TimeFrame::M15  // 15 минут
TimeFrame::M30  // 30 минут
TimeFrame::H1   // 1 час
TimeFrame::H4   // 4 часа
TimeFrame::D    // День
TimeFrame::W    // Неделя
TimeFrame::MN   // Месяц
```

#### Торговые операции (Orders)

[](#торговые-операции-orders)

**Важно:** Для торговых операций требуется `client_id = 'trade-api-write'`

```
use Tigusigalpa\BCSTrade\Enums\OrderSide;
use Tigusigalpa\BCSTrade\Enums\OrderType;

// Создать рыночный ордер на покупку
$order = $client->orders()->create([
    'side' => OrderSide::Buy,
    'orderType' => OrderType::Market,
    'orderQuantity' => 10,
    'ticker' => 'SBER',
    'classCode' => 'TQBR',
]);

// Создать лимитный ордер на продажу
$order = $client->orders()->create([
    'side' => OrderSide::Sell,
    'orderType' => OrderType::Limit,
    'orderQuantity' => 5,
    'ticker' => 'GAZP',
    'classCode' => 'TQBR',
    'price' => 150.50,
]);

// Создать ордер с собственным UUID
$order = $client->orders()->create([
    'clientOrderId' => 'my-unique-uuid',
    'side' => '1', // или OrderSide::Buy
    'orderType' => '2', // или OrderType::Limit
    'orderQuantity' => 10,
    'ticker' => 'SBER',
    'classCode' => 'TQBR',
    'price' => 250.00,
]);

// Получить статус ордера
$status = $client->orders()->status($clientOrderId);

// Получить все ордера
$allOrders = $client->orders()->all();

// Изменить ордер
$updated = $client->orders()->edit($clientOrderId, [
    'orderQuantity' => 15,
    'price' => 251.00,
]);

// Отменить ордер
$cancelled = $client->orders()->cancel($clientOrderId);
```

#### Сделки

[](#сделки)

```
// Получить все сделки
$deals = $client->deals()->all();
```

#### Скидки на инструменты

[](#скидки-на-инструменты)

```
// Получить скидки для всех инструментов
$discounts = $client->discounts()->get();

// Получить скидки для конкретных тикеров
$discounts = $client->discounts()->get(['SBER', 'GAZP']);
```

### WebSocket API

[](#websocket-api)

Все WebSocket каналы поддерживают автоматическое переподключение с экспоненциальной задержкой.

#### Лимиты (Real-time)

[](#лимиты-real-time)

```
$client->websocket()->limits(function ($data) {
    echo "Обновление лимитов: " . json_encode($data) . PHP_EOL;
});
```

#### Портфель (Real-time)

[](#портфель-real-time)

```
$client->websocket()->portfolio(function ($data) {
    echo "Обновление портфеля: " . json_encode($data) . PHP_EOL;
});
```

#### Маржинальные показатели

[](#маржинальные-показатели)

```
$client->websocket()->marginalIndicators(function ($data) {
    echo "Маржинальные показатели: " . json_encode($data) . PHP_EOL;
});
```

#### Последняя свеча

[](#последняя-свеча)

```
$client->websocket()->lastCandle('TQBR', 'SBER', function ($data) {
    echo "Новая свеча SBER: " . json_encode($data) . PHP_EOL;
});
```

#### Стакан котировок (Order Book)

[](#стакан-котировок-order-book)

```
$client->websocket()->orderBook('TQBR', 'SBER', function ($data) {
    echo "Обновление стакана SBER: " . json_encode($data) . PHP_EOL;
});
```

#### Котировки

[](#котировки)

```
$client->websocket()->quotes(['TQBR:SBER', 'TQBR:GAZP'], function ($data) {
    echo "Котировки: " . json_encode($data) . PHP_EOL;
});
```

#### Обезличенные сделки (All Trades)

[](#обезличенные-сделки-all-trades)

```
$client->websocket()->allTrades('TQBR', 'SBER', function ($data) {
    echo "Новая сделка SBER: " . json_encode($data) . PHP_EOL;
});
```

#### Статус исполнения ордеров

[](#статус-исполнения-ордеров)

```
$client->websocket()->orderExecutionStatus(function ($data) {
    echo "Статус ордера: " . json_encode($data) . PHP_EOL;
});
```

#### Статус транзакций

[](#статус-транзакций)

```
$client->websocket()->transactionStatus(function ($data) {
    echo "Статус транзакции: " . json_encode($data) . PHP_EOL;
});
```

### Обработка ошибок

[](#обработка-ошибок)

Для каждого типа ошибок — своё исключение:

```
use Tigusigalpa\BCSTrade\Exceptions\BCSAuthException;
use Tigusigalpa\BCSTrade\Exceptions\BCSRateLimitException;
use Tigusigalpa\BCSTrade\Exceptions\BCSForbiddenException;
use Tigusigalpa\BCSTrade\Exceptions\BCSApiException;

try {
    $limits = $client->limits()->get();
} catch (BCSAuthException $e) {
    // Ошибка аутентификации (401)
    // Возможно, истек refresh_token (90 дней)
    echo "Ошибка аутентификации: " . $e->getMessage();
} catch (BCSForbiddenException $e) {
    // Доступ запрещен (403)
    // Проверьте scope токена (trade-api-read vs trade-api-write)
    echo "Доступ запрещен: " . $e->getMessage();
} catch (BCSRateLimitException $e) {
    // Превышен лимит запросов (429)
    $retryAfter = $e->getRetryAfter(); // секунды до повторной попытки
    echo "Rate limit. Повторить через: " . $retryAfter . " сек";
} catch (BCSApiException $e) {
    // Общая ошибка API (4xx, 5xx)
    $statusCode = $e->getStatusCode();
    $responseBody = $e->getResponseBody();
    echo "API ошибка {$statusCode}: " . json_encode($responseBody);
}
```

### Примеры использования

[](#примеры-использования)

#### Пример 1: Получение текущей цены акции

[](#пример-1-получение-текущей-цены-акции)

```
$candles = $client->marketData()->getCandles(
    'TQBR',
    'SBER',
    date('Y-m-d\TH:i:s\Z', strtotime('-1 day')),
    date('Y-m-d\TH:i:s\Z'),
    TimeFrame::M5
);

$lastCandle = end($candles['bars']);
$currentPrice = $lastCandle['close'];

echo "Текущая цена SBER: {$currentPrice} руб.";
```

#### Пример 2: Создание и отслеживание ордера

[](#пример-2-создание-и-отслеживание-ордера)

```
use Ramsey\Uuid\Uuid;

$clientOrderId = Uuid::uuid4()->toString();

// Создаем лимитный ордер
$order = $client->orders()->create([
    'clientOrderId' => $clientOrderId,
    'side' => OrderSide::Buy,
    'orderType' => OrderType::Limit,
    'orderQuantity' => 10,
    'ticker' => 'SBER',
    'classCode' => 'TQBR',
    'price' => 250.00,
]);

echo "Ордер создан: {$clientOrderId}\n";

// Проверяем статус
$status = $client->orders()->status($clientOrderId);
echo "Статус: " . json_encode($status) . "\n";

// Если нужно изменить цену
$updated = $client->orders()->edit($clientOrderId, [
    'price' => 249.50,
]);

echo "Ордер обновлен\n";
```

#### Пример 3: Мониторинг портфеля в реальном времени

[](#пример-3-мониторинг-портфеля-в-реальном-времени)

```
// Запускаем WebSocket для отслеживания изменений портфеля
$client->websocket()->portfolio(function ($data) {
    $totalValue = 0;

    foreach ($data['positions'] ?? [] as $position) {
        $totalValue += $position['marketValue'] ?? 0;
    }

    echo date('H:i:s') . " - Общая стоимость портфеля: {$totalValue} руб.\n";
});
```

#### Пример 4: Получение исторических данных за год

[](#пример-4-получение-исторических-данных-за-год)

```
// Автоматическая пагинация для больших периодов
$candles = $client->marketData()->getCandlesPaginated(
    'TQBR',
    'SBER',
    '2024-01-01T07:00:00Z',
    '2024-12-31T20:00:00Z',
    TimeFrame::D
);

echo "Получено {$candles['bars']} свечей\n";

// Расчет доходности
$firstPrice = $candles['bars'][0]['open'];
$lastPrice = end($candles['bars'])['close'];
$return = (($lastPrice - $firstPrice) / $firstPrice) * 100;

echo "Доходность за год: " . number_format($return, 2) . "%\n";
```

Тестирование
------------

[](#тестирование)

Тесты написаны на [Pest](https://pestphp.com/).

```
# Установить зависимости
composer install

# Запустить тесты
./vendor/bin/pest

# Запустить тесты с покрытием
./vendor/bin/pest --coverage
```

Документация API
----------------

[](#документация-api)

Документация BCS Trade API:

### Разделы:

[](#разделы)

- [Ограничения API](https://trade-api.bcs.ru/restrictions)
- [HTTP: Авторизация](https://trade-api.bcs.ru/http/authorization)
- [HTTP: Лимиты](https://trade-api.bcs.ru/http/limits)
- [HTTP: Портфель](https://trade-api.bcs.ru/http/portfolio)
- [HTTP: Справочная информация](https://trade-api.bcs.ru/http/information/)
- [HTTP: Рыночные данные](https://trade-api.bcs.ru/http/market-data/)
- [HTTP: Торговые операции](https://trade-api.bcs.ru/http/operations/)
- [HTTP: Сделки](https://trade-api.bcs.ru/http/deals/)
- [WebSocket: Обзор](https://trade-api.bcs.ru/websocket)

Важные ограничения
------------------

[](#важные-ограничения)

1. **Refresh Token**: Действителен 90 дней. После истечения необходимо получить новый через веб-интерфейс БКС.
2. **Исторические свечи**: Максимум 1000 баров за один запрос (с 02.03.2026). Используйте `getCandlesPaginated()` для больших периодов.
3. **Rate Limiting**: API имеет ограничения на количество запросов. Обрабатывайте `BCSRateLimitException`.
4. **Торговые операции**: Требуют `client_id = 'trade-api-write'`.

Changelog
---------

[](#changelog)

См. [CHANGELOG.md](CHANGELOG.md).

Лицензия
--------

[](#лицензия)

MIT. См. [LICENSE](LICENSE).

Автор
-----

[](#автор)

**Igor Sazonov**

- Email:
- GitHub: [@tigusigalpa](https://github.com/tigusigalpa)

Поддержка
---------

[](#поддержка)

Баги и предложения — в [Issues](https://github.com/tigusigalpa/bcs-trade-php/issues), пулл-реквесты — [сюда](https://github.com/tigusigalpa/bcs-trade-php/pulls).

---

**Дисклеймер**: пакет не является официальным продуктом БКС. Используйте на свой риск.

###  Health Score

37

—

LowBetter than 83% of packages

Maintenance86

Actively maintained with recent releases

Popularity5

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity42

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

73d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/76c3a1d93c3213a8a22b4b637708d8b66a1ba3a5252624046cae7683a198b3a8?d=identicon)[tigusigalpa](/maintainers/tigusigalpa)

---

Top Contributors

[![tigusigalpa](https://avatars.githubusercontent.com/u/2721390?v=4)](https://github.com/tigusigalpa "tigusigalpa (1 commits)")

---

Tags

apibcsfinance-managementfinancial-marketslaravelphptradetradingtrading-softwarephpapilaraveltradingbrokerbcs

###  Code Quality

TestsPest

### Embed Badge

![Health badge](/badges/tigusigalpa-bcs-trade-php/health.svg)

```
[![Health](https://phpackages.com/badges/tigusigalpa-bcs-trade-php/health.svg)](https://phpackages.com/packages/tigusigalpa-bcs-trade-php)
```

###  Alternatives

[renoki-co/php-k8s

Control your Kubernetes clusters with this PHP-based Kubernetes client. It supports any form of authentication, the exec API, and it has an easy implementation for CRDs.

321669.7k2](/packages/renoki-co-php-k8s)[dariusiii/tmdb-laravel

Laravel Package for TMDB ( The Movie Database ) API. Provides easy access to the wtfzdotnet/php-tmdb-api library.

1821.1k](/packages/dariusiii-tmdb-laravel)[specialtactics/l5-api

Dependencies for the Laravel API Boilerplate package

3672.8k2](/packages/specialtactics-l5-api)[wayofdev/laravel-symfony-serializer

📦 Laravel wrapper around Symfony Serializer.

2113.6k](/packages/wayofdev-laravel-symfony-serializer)[gufy/whmcs

WHMCS API for Laravel 5

201.7k](/packages/gufy-whmcs)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
