/** * Execute the console command. * * @return mixed */ public function handle() { $intervals = [300, 900, 1800, 7200, 14400, 86400]; $base = Wallet::where('base', true)->get(); $all = Wallet::all(); foreach ($base as $base_wallet) { foreach ($all as $market_wallet) { if ($market_wallet->id == $base_wallet->id) { continue; } foreach ($intervals as $interval) { OrdersTransaction::selectRaw(' FLOOR(MIN(unix_timestamp(`created_at`))/' . $interval . ')*' . $interval . ' AS date, SUM(amount) AS volume, SUBSTRING_INDEX(MIN(CONCAT(unix_timestamp(`created_at`), \'_\', price)), \'_\', -1) AS `open`, MAX(price) AS high, MIN(price) AS low, SUBSTRING_INDEX(MAX(CONCAT(unix_timestamp(`created_at`), \'_\', price)), \'_\', -1) AS `close` ')->where(function (\Illuminate\Database\Eloquent\Builder $query) use($base_wallet, $market_wallet) { $query->where('wallet_id', $base_wallet->id)->where('want_wallet_id', $market_wallet->id); })->where('created_at', '>=', DB::raw('DATE_SUB(NOW(), INTERVAL 24 HOUR)'))->groupBy(DB::raw('FLOOR(unix_timestamp(`created_at`)/' . $interval . ')'))->orderBy('created_at', 'asc')->chunk(100000, function ($orders) use($base_wallet, $market_wallet, $interval) { foreach ($orders as $key => $order) { try { $cache = OrdersChart::firstOrNew(['wallet_id' => $base_wallet->id, 'want_wallet_id' => $market_wallet->id, 'date' => $order->date, 'interval' => $interval]); $cache->date = $order->date; $cache->open = $order->open; $cache->high = $order->high; $cache->low = $order->low; $cache->close = $order->close; $cache->volume = $order->volume; $cache->wallet_id = $base_wallet->id; $cache->want_wallet_id = $market_wallet->id; $cache->interval = $interval; $cache->save(); } catch (\Exception $e) { } } }); } } } }
/** * Get latest ticker data. */ public static function getTickers() { $pairs = self::generatePairs(); $tickers = []; foreach ($pairs as $name => $pair) { $base = $pair['base_id']; $market = $pair['id']; $tickers[$name] = ['high' => 0, 'low' => 0, 'avg' => 0, 'vol' => 0, 'vol_curr' => 0, 'buy' => 0, 'sell' => 0, 'updated' => time()]; $last_sell = Order::select('price')->where(function (\Illuminate\Database\Eloquent\Builder $query) use($base, $market) { $query->where('wallet_id', $base)->where('want_wallet_id', $market); })->where('type', 'sell')->orderBy('created_at', 'desc')->first(); if ($last_sell) { $tickers[$name]['sell'] = (double) $last_sell->price; } $last_buy = Order::select('price')->where(function (\Illuminate\Database\Eloquent\Builder $query) use($base, $market) { $query->where('wallet_id', $base)->where('want_wallet_id', $market); })->where('type', 'buy')->orderBy('created_at', 'desc')->first(); if ($last_buy) { $tickers[$name]['buy'] = (double) $last_buy->price; } $last_chart_prices = OrdersChart::where('wallet_id', $base)->where('want_wallet_id', $market)->where('interval', 86400)->orderBy('date', 'desc')->first(); if ($last_chart_prices) { $tickers[$name]['high'] = (double) $last_chart_prices->high; $tickers[$name]['low'] = (double) $last_chart_prices->low; } $last_chart_volume = OrdersChart::where('wallet_id', $base)->where('want_wallet_id', $market)->where('interval', 86400)->orderBy('date', 'desc')->first(); if ($last_chart_volume) { $tickers[$name]['vol_curr'] = (double) $last_chart_volume->volume; } $base_volume = OrdersTransaction::selectRaw(' SUM(amount*price) AS volume ')->where(function (\Illuminate\Database\Eloquent\Builder $query) use($base, $market) { $query->where('wallet_id', $base)->where('want_wallet_id', $market); })->where('type', 'sell')->where('created_at', '>=', DB::raw('DATE_SUB(NOW(), INTERVAL 24 HOUR)'))->first(); if ($base_volume) { $tickers[$name]['vol'] = (double) $base_volume->volume; } } return $tickers; }
public function getHistory() { $coins_list = function () { $data = ['' => 'All']; foreach (Cache::remember('coin_list', Config::get('cache.ttl'), function () { return Wallet::select('short as coin')->get(); }) as $wallet) { $data[$wallet->coin] = $wallet->coin; } return $data; }; $provider = new EloquentDataProvider(OrdersTransaction::selectRaw('0 as total, orders_transactions.fee as fee, orders_transactions.id as id, orders_transactions.order_id as order_id, orders_transactions.amount, orders_transactions.price, orders_transactions.created_at, orders_transactions.updated_at, orders_transactions.type, w1.short as coin1, w2.short as coin2')->where('user_id', Auth::user()->id)->leftJoin('wallets as w1', 'w1.id', '=', 'orders_transactions.wallet_id')->leftJoin('wallets as w2', 'w2.id', '=', 'orders_transactions.want_wallet_id')); Services::resourceManager()->ignoreCss(['bootstrap']); Services::resourceManager()->ignoreJs(['bootstrap']); $grid = new Grid($provider, [(new Column('orders_transactions.id', 'ID'))->setValueFormatter(function ($value, OrdersTransaction $row = null) { if (!empty($row->id)) { return $row->id; } else { return $value; } }), (new Column('orders_transactions.order_id', 'Order ID'))->setValueFormatter(function ($value, OrdersTransaction $row = null) { if (!empty($row->order_id)) { return $row->order_id; } else { return $value; } }), (new Column('coin1'))->setValueFormatter(function ($value, OrdersTransaction $row = null) { if (!empty($row)) { return $row->coin2 . '/' . $row->coin1; } else { return $value; } }), (new Column('type'))->setValueFormatter(function ($value, OrdersTransaction $row = null) { if (!empty($row)) { if ($value == 'buy') { return HTML::tag('span', $value, ['class' => 'label label-success']); } else { return HTML::tag('span', $value, ['class' => 'label label-danger']); } } else { return $value; } }), (new Column('amount'))->setValueFormatter(function ($value, OrdersTransaction $row = null) { if (!empty($row)) { return HTML::tag('span', sprintf('%.8f %s', $row->amount, $row->coin2)); } else { return $value; } }), (new Column('price'))->setValueFormatter(function ($value, OrdersTransaction $row = null) { if (!empty($row)) { return HTML::tag('span', sprintf('%.8f %s', $row->price, $row->coin1)); } else { return $value; } }), (new Column('fee'))->setValueFormatter(function ($value, OrdersTransaction $row = null) { if (!empty($row)) { if ($row->type == 'sell') { return HTML::tag('span', sprintf('%.8f %s (%.2f%%)', Order::calcFee($row->amount, $row->fee), $row->coin1, $row->fee)); } else { return HTML::tag('span', sprintf('%.8f %s (%.2f%%)', Order::calcFee($row->amount * $row->price, $row->fee), $row->coin2, $row->fee)); } } else { return $value; } }), (new Column('total'))->setValueFormatter(function ($value, OrdersTransaction $row = null) { if (!empty($row)) { if ($row->type == 'buy') { return HTML::tag('span', sprintf('%.8f %s', $row->amount - Order::calcFee($row->amount, $row->fee), $row->coin2)); } else { return HTML::tag('span', sprintf('%.8f %s', $row->amount * $row->price - Order::calcFee($row->amount * $row->price, $row->fee), $row->coin1)); } } else { return $value; } }), (new Column('orders_transactions.created_at', 'Created At'))->setValueFormatter(function ($value, OrdersTransaction $row = null) { if (!empty($row->created_at)) { return $row->created_at; } else { return $value; } }), new Column('updated_at'), (new FilterControl('wallets.short', FilterOperation::OPERATOR_EQ, new InputOption('coin', ['coin' => Input::get('coin')])))->setView(new TemplateView('select', ['options' => $coins_list(), 'label' => 'Coin', 'inputAttributes' => ['style' => 'width: 50px;']])), new PageSizeSelectControl(new InputOption('ps', ['ps' => Input::get('ps')], 10), [10, 50, 100, 500, 1000]), new CsvExport(new InputOption('csv', ['csv' => Input::get('csv')])), new ResetButton(), new PageTotalsRow(['amount' => PageTotalsRow::OPERATION_SUM]), new PaginationControl(new InputOption('page', ['page' => Input::get('page')], 1), 10, $provider), new ColumnSortingControl('orders_transactions.id', new InputOption('sort', ['sort' => Input::get('sort')], 'orders_transactions.id-dir-desc')), new ColumnSortingControl('amount', new InputOption('sort', ['sort' => Input::get('sort')])), new ColumnSortingControl('orders_transactions.created_at', new InputOption('sort', ['sort' => Input::get('sort')]))]); $customization = new BootstrapStyling(); $customization->apply($grid); $grid = $grid->render(); return view('user.orders.history', compact('grid')); }