NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Trading Analytics for Laravel

Vytváranie obchodov

Trade opisuje jednu pozíciu: jej pár (základnú a kótovanú menu), smer, vstupnú a výstupnú cenu, veľkosť, čas otvorenia a zatvorenia a voliteľný poplatok. Najrýchlejšie ho vytvoríte cez Trade::make(), ktoré prijme obyčajné skaláry a číselné polia za vás obalí:

use Illuminate\Support\Carbon;
use RoundlyConsulting\TradingAnalytics\DataTransferObjects\Trade;
use RoundlyConsulting\TradingAnalytics\Enums\Direction;

$trade = Trade::make(
    baseCurrency: 'BTC',
    quoteCurrency: 'USD',
    openPrice: '45000.00',
    closePrice: '45500.00',
    size: '0.1',
    direction: Direction::BUY,                      // or the string 'buy' / 'sell'
    openTime: Carbon::create(2024, 1, 15, 12, 30),  // or a parseable date string
    commission: '15.00',                            // optional
    closeTime: Carbon::create(2024, 1, 15, 14, 30), // omit for an open position
);

Z poľa

Vytvorenie z poľa, napríklad z dát z API:

$trade = Trade::fromArray([
    'base_currency' => 'BTC',
    'quote_currency' => 'USD',
    'open_price' => '45000.00',
    'close_price' => '45500.00',
    'size' => '0.1',
    'direction' => 'buy',
    'open_time' => '2024-01-15 12:30:00',
    'commission' => '15.00',               // optional
    'close_time' => '2024-01-15 14:30:00', // optional
]);

Z ľubovoľného riadku

Trade::fromRow() prečíta riadok v akomkoľvek tvare, ktorý vaša aplikácia vytvorí — pole, riadok stdClass z query buildera, model Eloquent, ľubovoľný Arrayable alebo verejné vlastnosti obyčajného objektu — a Trade vráti tak, ako je. Trade::collect() lenivo premapuje celý iterovateľný zdroj takýchto riadkov; modely, casty a dopyty rozoberá sekcia Načítanie histórie obchodov:

use Illuminate\Support\Facades\DB;
use RoundlyConsulting\TradingAnalytics\DataTransferObjects\Trade;

$trade = Trade::fromRow(DB::table('trades')->find($id));   // stdClass row
$trade = Trade::fromRow(TradeRecord::findOrFail($id));      // your Eloquent model

// Any iterable of rows (or Trades, or a mix), mapped lazily
$trades = Trade::collect(DB::table('trades')->orderBy('close_time')->orderBy('id')->lazy());

Polia

Kľúč poľaPomenovaný argumentTypPovinnéPoznámka
base_currencybaseCurrencystring✓Neprázdna, napr. BTC.
quote_currencyquoteCurrencystring✓Neprázdna, napr. USD.
open_priceopenPricestring|int|float|NumericValueAsString✓Vstupná cena.
close_priceclosePricestring|int|float|NumericValueAsString✓Výstupná cena; pri otvorenej pozícii cena, ktorou sa oceňuje.
sizesizestring|int|float|NumericValueAsString✓Obchodované množstvo; hodnota = size × vstupná cena.
directiondirectionDirection|BackedEnum|string✓buy alebo sell — prípadne ľubovoľný enum s týmito reťazcovými hodnotami, napr. vlastný cast modelu.
open_timeopenTimeDateTimeInterface|string✓Ľubovoľný DateTimeInterface (Carbon, cast datetime) alebo reťazec dátumu, ktorý sa dá parsovať.
commissioncommissionstring|int|float|NumericValueAsString|null—Poplatky; čisté hodnoty ich odpočítajú. Obchod bez poplatku sa počíta ako 0.
close_timecloseTimeDateTimeInterface|string|null—Vynechajte (null) pri otvorenej pozícii; nesmie byť pred časom otvorenia.

Otvorené pozície

Pri pozícii, ktorá je stále otvorená, čas zatvorenia vynechajte. Jej closePrice je cena, ktorou sa pozícia oceňuje: otvorené obchody vstupujú do nerealizovaného P&L, kým série, expectancy, pomer rizika a výnosu, miera výhier po obdobiach, drawdown a Sharpeho a Sortinov pomer počítajú len uzavreté obchody.

// No close time: the position is still open.
// closePrice is the price the position is valued at (unrealized P&L).
$open = Trade::make(
    baseCurrency: 'ETH',
    quoteCurrency: 'USD',
    openPrice: '3000',
    closePrice: '3120',
    size: '2',
    direction: 'buy',
    openTime: '2024-03-04 08:00',
);

$open->isOpen();                  // true
$open->isRealized();              // false
(string) $open->profitAndLoss();  // '240.0000000000'

Validácia

Pri vytváraní sa vyhodí InvalidTradeException, ak je mena prázdna, čas zatvorenia predchádza času otvorenia, povinné pole chýba alebo je null, pole má nesprávny typ alebo smer nie je buy ani sell:

use RoundlyConsulting\TradingAnalytics\Exceptions\InvalidTradeException;

try {
    Trade::fromArray(['base_currency' => 'BTC', 'quote_currency' => 'USD']);
} catch (InvalidTradeException $e) {
    $e->getMessage(); // "A trade is missing the required 'open_price' field."
}

Trade::make('BTC', 'USD', '1', '1', '1', 'hold', '2024-01-01');
// InvalidTradeException: 'hold' is not a valid trade direction; expected one of: buy, sell.

Trade::fromArray([...$row, 'open_time' => 1709283600]);
// InvalidTradeException: A trade's 'open_time' field must be a date string or DateTimeInterface; got int.

Plná kontrola

Ak potrebujete plnú kontrolu, vytvorte Trade priamo s poliami NumericValueAsString:

use RoundlyConsulting\TradingAnalytics\DataTransferObjects\NumericValueAsString;

$trade = new Trade(
    baseCurrency: 'BTC',
    quoteCurrency: 'USD',
    openPrice: new NumericValueAsString('45000.00'),
    closePrice: new NumericValueAsString('45500.00'),
    size: new NumericValueAsString('0.1'),
    direction: Direction::BUY,
    openTime: Carbon::create(2024, 1, 15, 12, 30),
);

Čísla samotného obchodu si zachovajú škálu, s ktorou vznikli — cez Trade::make(), fromArray() a fromRow() je to 10 desatinných miest; aj odovzdaný NumericValueAsString sa na túto škálu znovu obalí. Ak súčin ceny a veľkosti potrebuje viac, vytvorte Trade priamo s NumericValueAsString::of($value, scale: 18) a zodpovedajúco zvýšte škálu behu:

use RoundlyConsulting\TradingAnalytics\Facades\TradingAnalytics;

$trade = new Trade(
    baseCurrency: 'TKN',
    quoteCurrency: 'USD',
    openPrice: NumericValueAsString::of('0.000000000001234', scale: 18),
    closePrice: NumericValueAsString::of('0.000000000002000', scale: 18),
    size: NumericValueAsString::of('1000000', scale: 18),
    direction: Direction::BUY,
    openTime: Carbon::parse('2024-01-01 00:00'),
);

$trade->profitAndLoss()->toRawString(); // '0.000000766000000000'

// Raise the run's scale to match: aggregates use the run's scale (default 10)
TradingAnalytics::for([$trade])->scale(18)->calculate();

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

Odoslaní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.