PHP code example of tigusigalpa / bcs-trade-php

1. Go to this page and download the library: Download tigusigalpa/bcs-trade-php library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

tigusigalpa / bcs-trade-php example snippets


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();

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   // Месяц

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']);

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

$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;
});

$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;
});

$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);
}

$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} руб.";

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";

// Запускаем WebSocket для отслеживания изменений портфеля
$client->websocket()->portfolio(function ($data) {
    $totalValue = 0;
    
    foreach ($data['positions'] ?? [] as $position) {
        $totalValue += $position['marketValue'] ?? 0;
    }
    
    echo date('H:i:s') . " - Общая стоимость портфеля: {$totalValue} руб.\n";
});

// Автоматическая пагинация для больших периодов
$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";
bash
composer 
bash
php artisan vendor:publish --tag=bcs-trade-config