Ejemplo n.º 1
0
 /**
  * Импортирует курсы сразу для всех индексов
  */
 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('Нечего импортировать');
         }
     }
 }
Ejemplo n.º 2
0
 /**
  * Импортирует данные с 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();
         }
     }
 }