5 минутные бары с использованием mysql - PullRequest
1 голос
/ 04 августа 2011

Я собрал данные тиков в следующем формате

"instrument","tick_time","ask","bid","askVol","bidVol"
"EUR/USD","2011-07-24 20:00:01","1.43676","1.43666","1.13","4.13"
"EUR/USD","2011-07-24 20:00:02","1.43676","1.43666","1.13","4.5"
"EUR/USD","2011-07-24 20:00:03","1.43674","1.43664","1.13","1.65"
"EUR/USD","2011-07-24 20:00:06","1.43675","1.43665","1.13","5.4"
"EUR/USD","2011-07-24 20:00:06","1.43677","1.43668","1.13","4.28"
"EUR/USD","2011-07-24 20:00:10","1.43676","1.43666","1.13","6.15"
"EUR/USD","2011-07-24 20:00:11","1.43679","1.43669","1.13","4.13"

СЕЙЧАС я пытаюсь создать из него 5-минутные бары. я попробовал следующий sql.

select    ROUND(tick_time / (60*5)) * 60 * 5 as bar_time,
          max(bid)  as high,
          min(bid) as low
from ticks
group by bar_time

Я получаю следующие данные

"bar_time","high","low"
"20110724199900","1.43669","1.43661"
"20110724200200","1.4366","1.4358"
"20110724200500","1.43625","1.43579"
"20110724200800","1.4365","1.43608"
"20110724201100","1.43645","1.43601"
"20110724201400","1.43624","1.43573"
"20110724201700","1.43619","1.43591"
"20110724202000","1.43644","1.4359"

Как мне сделать следующее

  1. форматировать bar_time в формате datetime?
  2. агрегировать первые и последние данные в виде столбцов.

Ответы [ 3 ]

2 голосов
/ 04 августа 2011

Другое решение:

select 
    date_format( 
        date_sub(
            tick_time, 
            INTERVAL (extract(MINUTE from tick_time) % 5) MINUTE
        ), 
        "%m-%d%Y %H:%i"
    ) as  bar_time, 
    MAX(bid) AS high,
    MIN(bid) AS low
from ticks
group by bar_time
1 голос
/ 04 августа 2011
SELECT    
  STR_TO_DATE
  (
    CONCAT(
      LEFT(ROUND(tick_time / (60*5)) * 60 * 5,10)
      ,MID(ROUND(tick_time / (60*5)) * 60 * 5,10,2)/100*60
      ,RIGHT(ROUND(tick_time / (60*5)) * 60 * 5,2)/100*60
    )
    ,'%Y%m%d%H%i%s'
  ) AS bar_datetime
  , MAX(bid) AS high
  , MIN(bid) AS low
  , CONCAT(MAX(bid), ',', MIN(bid)) as max_min
FROM ticks
GROUP BY bar_datetime
1 голос
/ 04 августа 2011

1 - форматирование bar_time в формате datetime:

При условии, что ваш формат времени равен %Y%m%d%H%i%s, вы можете использовать str_to_date mysql:

select  str_to_date((ROUND(tick_time / (60*5)) * 60 * 5) , '%Y%m%d%H%i%s') as bar_time,
        max(bid)  as high,
        min(bid) as low
from ticks
group by bar_time

Вам может потребоваться преобразовать первый параметр функции (т.е. ROUND(...)) в строку. Кроме того, первая строка в вашем примере содержит время «20110724199900», вы уверены в этих 99 минутах?

2- Не понял, можете ли вы объяснить, что вы имеете в виду?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...