/** * Импортирует курсы сразу для всех индексов */ public function actionCandels() { $rows = Stock::query()->all(); foreach ($rows as $row) { $stock_id = $row['id']; $this->log('Попытка получить данные для: ' . $row['name']); $importer = ['params' => ['market' => $row['finam_market'], 'em' => $row['finam_em'], 'code' => $row['finam_code']]]; $class = new \app\service\DadaImporter\Finam($importer); $date = new \DateTime(); $date->sub(new \DateInterval('P7D')); $data = $class->importCandels($date->format('Y-m-d')); // стратегия: Если данные есть то, они не трогаются $dateArray = ArrayHelper::getColumn($data, 'date'); sort($dateArray); $rows2 = StockKurs::query(['between', 'date', $dateArray[0], $dateArray[count($dateArray) - 1]])->andWhere(['stock_id' => $stock_id])->all(); $dateArrayRows = ArrayHelper::getColumn($rows2, 'date'); $new = []; foreach ($data as $row) { if (!in_array($row['date'], $dateArrayRows)) { $new[] = [$stock_id, $row['date'], $row['open'], $row['high'], $row['low'], $row['close'], $row['volume'], $row['close']]; } } if (count($new) > 0) { \Yii::info('Импортированы данные: ' . VarDumper::dumpAsString($new), 'cap\\importer\\index'); $this->log('Импортированы данные: ' . VarDumper::dumpAsString($new)); StockKurs::batchInsert(['stock_id', 'date', 'open', 'high', 'low', 'close', 'volume', 'kurs'], $new); } else { $this->log('Нечего импортировать'); } } }
/** * Импортирует данные с Finam в таблицу курсов * * @param int $stock_id * @param string $start дата 'yyyy-mm-dd' * @param string $end дата 'yyyy-mm-dd' * @param bool $isReplaceExisting Заменять уже имеющиеся данные * true - если в таблице уже есть курс на эту дату то он будет перезатерт * false - если в таблице уже есть курс на эту дату то он сохранится * * @throws \yii\base\InvalidConfigException */ public static function importCandels($stock_id, $start, $end, $isReplaceExisting = false) { $row = Stock::find($stock_id)->getFields(); $data = ['params' => ['market' => $row['finam_market'], 'em' => $row['finam_em'], 'code' => $row['finam_code']]]; $importer = new \app\service\DadaImporter\Finam($data); $data = $importer->importCandels($start, $end); $dateArrayRows = StockKurs::query(['between', 'date', $start, $end])->select(['date'])->andWhere(['stock_id' => $stock_id])->column(); $insert = []; $update = []; foreach ($data as $row) { if (in_array($row['date'], $dateArrayRows)) { $date = $row['date']; $row['kurs'] = $row['close']; unset($row['date']); $update[$date] = $row; } else { $insert[] = [$stock_id, $row['date'], $row['open'], $row['high'], $row['low'], $row['close'], $row['volume'], $row['close']]; } } StockKurs::batchInsert(['stock_id', 'date', 'open', 'high', 'low', 'close', 'volume', 'kurs'], $insert); if ($isReplaceExisting) { foreach ($update as $date => $fields) { (new Query())->createCommand()->update(StockKurs::TABLE, $fields, ['date' => $date, 'stock_id' => $stock_id])->execute(); } } }