---
title: "Načítanie histórie obchodov — Trading Analytics for Laravel | Roundly"
description: "Odovzdajte fasáde priamo query builder, Eloquent builder alebo reláciu — streamuje sa po stránkach podľa času zatvorenia, v pamäti je vždy jedna."
url: https://roundly-consulting.com/sk/open-source/navody/trading-analytics-for-laravel/nacitanie-obchodov
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Trading Analytics for Laravel](https://roundly-consulting.com/sk/open-source/navody/trading-analytics-for-laravel.md)

# Načítanie histórie obchodov

Odovzdajte priamo samotný dopyt — query builder, Eloquent builder alebo reláciu — a balík ho streamuje cez lazy(), pričom v pamäti drží vždy len jednu stránku riadkov:

```php
use Illuminate\Support\Facades\DB;
use RoundlyConsulting\TradingAnalytics\Facades\TradingAnalytics;

TradingAnalytics::calculate(
    DB::table('trades')->where('user_id', $user->id)->orderBy('close_time')->orderBy('id'),
);

// TradeRecord: your own Eloquent model
TradingAnalytics::for(TradeRecord::query()->where('account_id', $accountId)->oldest('close_time')->orderBy('id'));

TradingAnalytics::calculate($account->trades()->orderBy('close_time')->orderBy('id'), chunk: 500);
```

- Dopyt zoraďte podľa času zatvorenia. Maximálny drawdown, série aj priebežný kumulatívny výnos sledujú poradie, v akom sa obchody uzatvárajú (pozrite Poradie obchodov), preto balík poradie nikdy neháda: dopyt bez orderBy vyhodí UnorderedTradeSourceException ešte predtým, než sa čokoľvek spustí — aj Eloquent builder, ktorý by Laravel inak potichu zoradil podľa primárneho kľúča. Pridajte jedinečný rozhodujúci stĺpec: ->orderBy('close\_time')->orderBy('id').
- Veľkosť stránky. chunk (predvolene 1000) je počet riadkov na stránku; hodnota menšia ako 1 vyhodí InvalidChunkSizeException. Pamäť rastie s veľkosťou stránky, nikdy s veľkosťou tabuľky.
- Stránkovanie. lazy() stránkuje cez LIMIT / OFFSET, takže každá stránka znovu spustí zoradený dopyt a preskočí riadky pred ňou. Pri veľmi veľkých tabuľkách zoraďte podľa indexovaného stĺpca (napr. index na (close\_time, id)), aby každá stránka zostala lacná.
- Stránky sú samostatné čítania. Riadok vložený, zmazaný alebo preradený medzi dvoma stránkami — uzavretie otvoreného obchodu, spätne zapísané plnenie — posunie offsety, takže sa riadok môže preskočiť alebo prečítať dvakrát a nič na to neupozorní. Ak sa do tabuľky počas výpočtu zapisuje, obmedzte dopyt na riadky, ktoré sa už nemenia — napr. ->where('close\_time', '<=', $asOf), čo zároveň vynechá otvorené obchody —, alebo výpočet spustite v jednej transakcii s úrovňou REPEATABLE READ, aby každá stránka čítala ten istý snapshot: na MySQL DB::transaction(fn () => TradingAnalytics::calculate($query)) (predvolená úroveň InnoDB); na PostgreSQL (predvolene READ COMMITTED) v closure najprv spustite DB::statement('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ').
- Váš builder zostane nedotknutý: balík stránkuje jeho kópiu.

```php
use RoundlyConsulting\TradingAnalytics\Exceptions\UnorderedTradeSourceException;

TradingAnalytics::calculate(TradeRecord::query());
// UnorderedTradeSourceException — thrown before anything runs:
// the query has no ORDER BY. Order it by close time with a unique tie-breaker:

TradingAnalytics::calculate(TradeRecord::query()->orderBy('close_time')->orderBy('id'));
```

## Riadky a modely

Riadky prichádzajú ako stdClass (query builder) alebo modely (Eloquent) a číta ich Trade::fromRow(), takže stĺpce — alebo accessory modelu — musia poskytnúť polia Trade::fromArray(). Model sa číta atribút po atribúte, takže sa uplatnia jeho casty: direction castovaný na váš vlastný enum s reťazcovými hodnotami (buy / sell) aj dátumy castované na datetime či immutable\_datetime fungujú tak, ako sú. Stĺpce sa volajú inak? Pole sprístupnite cez accessor:

```php
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model;

final class TradeRecord extends Model
{
    protected function casts(): array
    {
        return [
            'direction' => Side::class,   // your own enum with the values 'buy' / 'sell'
            'open_price' => 'decimal:8',
            'close_price' => 'decimal:8',
            'size' => 'decimal:8',
            'commission' => 'decimal:8',
            'close_time' => 'datetime',
        ];
    }

    // The column is called opened_at — expose it as the open_time field
    protected function openTime(): Attribute
    {
        return Attribute::get(fn (): mixed => $this->opened_at);
    }
}
```

## Ľubovoľný iterovateľný zdroj

Bez dopytu odovzdajte fasáde akýkoľvek iterovateľný zdroj riadkov — polia, inštancie Trade alebo ich kombináciu. Trade::collect() (aj TradingAnalytics::trades()) ho premení na LazyCollection obchodov, takže sa nič nenačíta, kým engine nebeží:

```php
use RoundlyConsulting\TradingAnalytics\DataTransferObjects\Trade;

$trades = Trade::collect([
    [
        'base_currency' => 'BTC',
        'quote_currency' => 'USD',
        'open_price' => '40000',
        'close_price' => '42000',
        'size' => '0.5',
        'direction' => 'buy',
        'open_time' => '2024-03-01 09:00',
        'commission' => '10',
        'close_time' => '2024-03-01 15:00',
    ],
    $trade, // an already-built Trade passes through unchanged
]);

// LazyCollection<int, Trade>
```

- Riadky sa validujú až pri spracovaní, takže neplatný riadok vyhodí InvalidTradeException počas calculate(), nie pri volaní collect(). Nezoradený dopyt naopak vyhodí výnimku hneď, ako ho odovzdáte.
- Filtrujte priamo v dopyte (časové obdobie, jedno portfólio) a engine spustite pre každý výsek zvlášť.

## Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

[Ďalšie spôsoby podpory vrátane kryptomien](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/trading-analytics-for-laravel.md)
