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:
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á.
- Váš builder zostane nedotknutý: balík stránkuje jeho kópiu.
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:
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ží:
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 kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
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.