Страницы: 1 2 3 След.
RSS
Преобразование линейных данных в формат OHLC
 
Имеется динамичный поток биржевых сделок (время сделки + цена сделки), импортируемый в Excel. Требуется, выбрав временной интервал, динамично преобразовывать данные в биржевой формат OHLC (open-high-low-close), т.е. весь период времени разбивать на интервалы и в каждом  интервале находить цену первой сделки, максимальную цену, минимальную цену и цену последней сделки. Найденные данные помещать в таблицу.  
Можно ли реализовать эту задачу, желательно, не сильно нагружая процессор?    
Буду благодарен за помощь в решении проблемы.
 
Прикрепил файлик с примером. Надеюсь на помощь.
 
Прикрепил? А где он?
 
Вторая попытка. :)
 
Потрудитесь файлы такого размера архивировать перед отправкой! У многих между прочим, не безлимитка!
 
Извиняюсь, "урезал". В архиве файл ".xlsm"  
 
P.S. Если я правильно успел прочесть (слишком быстро промелькнуло), то в формате ".xlsm" файл прикрепить нельзя? У меня с первого раза не получилось. Изменил формат и файл потолстел :).
 
Гм... Эксель 2007... не перевариваю:)
 
Сделал и в ".xls" :)...
 
{quote}{login=Андрей}{date=26.09.2008 01:55}{thema=Преобразование линейных данных в формат OHLC}{post}Имеется динамичный поток биржевых сделок (время сделки + цена сделки), импортируемый в Excel. Требуется, выбрав временной интервал, динамично преобразовывать данные в биржевой формат OHLC (open-high-low-close), т.е. весь период времени разбивать на интервалы и в каждом  интервале находить цену первой сделки, максимальную цену, минимальную цену и цену последней сделки. Найденные данные помещать в таблицу.  
Можно ли реализовать эту задачу, желательно, не сильно нагружая процессор?    
Буду благодарен за помощь в решении проблемы.{/post}{/quote}  
не знаю как на счет оптимальности, но есть у меня программка делающая примерно это..  
 
только она пересчитывает один OHLC  в другой( т.е., например, минутные интервалы в пятиминутные)  
 
если ваш изначальный файл привести к виду OHLC( подставляя сумму сделки во все недостающие позиции), то оно будет работать..
 
Смотрим файлик.  
ЗЫ. Пробовал другой вариант попроще через сравнение дат, но это вызывает заметную загрузку процессора при перерасчетах, поэтому остановился на этом (немного коряво написано, но работает:)
 
Пардон, пока еще и коряво работает:) Просьба игнорировать:)
 
Попытка номер 2:)
 
2Raptor  
Спасибо за помощь. Честно говоря, я думал, что без макроса не получится.  
К сожалению, у меня не заработал ни 1, ни 2 вариант. В ячейках OHLC отображаютя нули (штрихи). В чем может быть причина? Пробовал на 2003 и 2007 Excel. Если у Вас все работает, то буду искать причину у себя.  
 
2СЛЭН  
По задумке, из тиковых данных должен получаться OHLC любого выбранного таймфрейма. Алгоритм ведь одинаковый. Хотя с удовольствием посмотрел бы на вашу программку. Может что и почерпну.
 
{quote}{login=Андрей}{date=27.09.2008 07:26}{thema=}{post}  
К сожалению, у меня не заработал ни 1, ни 2 вариант. В ячейках OHLC отображаютя нули (штрихи). В чем может быть причина?{/post}{/quote}  
Возможно, причина в распознавании форматов... Формулы написаны с учетом того, что исходный временной список - это текстовые значения, искомое время - числовые. Или вычисления отключены либо по особому выполняются... На исходных данных все вроде бы работает.
 
{quote}{login=Андрей}{date=27.09.2008 07:26}{thema=}{post}2Raptor  
Спасибо за помощь. Честно говоря, я думал, что без макроса не получится.  
К сожалению, у меня не заработал ни 1, ни 2 вариант. В ячейках OHLC отображаютя нули (штрихи). В чем может быть причина? Пробовал на 2003 и 2007 Excel. Если у Вас все работает, то буду искать причину у себя.  
 
2СЛЭН  
По задумке, из тиковых данных должен получаться OHLC любого выбранного таймфрейма. Алгоритм ведь одинаковый. Хотя с удовольствием посмотрел бы на вашу программку. Может что и почерпну.{/post}{/quote}  
 
ну да, именно так. Просто уменя в качестве источника были файлы истории, выгружаемые  Forex qouteroom  в минутных интервалах, а уж из них получались любые..  
 
вкратце алгоритм:  
существует отдельная программа генерации таблицы с интерактивно задаваемым периодом представления(timeframe).  
данные истории котировок за нужный период берутся из архива, записываются на отдельный лист книги.  
данные времени из  таблицы приводятся к виду(формату) файлов истории с минутными timeframe, копируются  на тот же лист, что и история.  
 
далее проводится сортировка по дате(и времени)  
последовательно обрабатываются данные истории, попавшие меджду данными таблицы..  
 
обратная сортировка и вуаля.. обратно в таблицу.  
 
вот текст программы:  
Sub set_intervals(ByVal minrow As Long, ByVal maxrow As Long, ByVal period As Date)  
   tabl.Columns("B:B").NumberFormat = "m/d/yyyy"  
   tabl.Columns("C:C").NumberFormat = "h:mm;@"  
   Dim tab_arr  
   Dim crows As Long  
   crows = maxrow - minrow + 1  
   tab_arr = tabl.Range(tabl.Cells(minrow - 1, 1), tabl.Cells(maxrow, 3))  
   tab_arr(1, 1) = 0  
   tab_arr(1, 3) = Format(tab_arr(2, 2) - period, "hhMM") & "00"  
   tab_arr(1, 2) = Format(tab_arr(2, 2) - period, "yyyyMMdd")  
   Dim i As Long  
   For i = 2 To maxrow - minrow + 2  
       tab_arr(i, 3) = Format(tab_arr(i, 2), "hhMM") & "00"  
       tab_arr(i, 2) = Format(tab_arr(i, 2), "yyyyMMdd")  
   Next  
   i = rlist.Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row  
   rlist.Range(rlist.Cells(i, 1), rlist.Cells(i + crows, 3)).Value = tab_arr  
   rlist.Range(rlist.Cells(1, 1), rlist.Cells.SpecialCells(xlLastCell)).Sort Key1:=Range("B1"), Order1:=xlAscending, Key2:=Range("C1") _  
       , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _  
       False, Orientation:=xlTopToBottom, DataOption1:=xlSortTextAsNumbers, _  
       DataOption2:=xlSortTextAsNumbers  
   Dim rows_arr() As Long  
   ReDim rows_arr(0)  
   If rlist.Cells(1, 1).Text = 0 Then  
       rows_arr(0) = 1  
   Else  
       rows_arr(0) = rlist.Cells(1, 1).End(xlDown).Row  
   End If  
   For i = 1 To crows  
      ReDim Preserve rows_arr(i)  
      If rlist.Cells(rows_arr(i - 1) + 1, 1).Text <> "" Then  
          rows_arr(i) = rows_arr(i - 1) + 1  
       Else  
           rows_arr(i) = rlist.Cells(rows_arr(i - 1), 1).End(xlDown).Row  
       End If  
   Next  
   Dim val_arr()  
       val_arr = rlist.Range(rlist.Cells(1, 11), rlist.Cells(crows + 1, 14)).Value  
   Dim j As Long  
   Dim hist_arr()  
   hist_arr = rlist.Range(rlist.Cells(rows_arr(0), 4), rlist.Cells(rows_arr(crows), 7)).Value  
   For i = 1 To crows  
       For j = rows_arr(i - 1) - rows_arr(0) + 2 To rows_arr(i) - rows_arr(0)  
           If val_arr(i, 1) = 0 Then  
               val_arr(i, 1) = hist_arr(j, 1)  
               val_arr(i, 3) = hist_arr(j, 3)  
           End If  
           If val_arr(i, 2) < hist_arr(j, 2) Then val_arr(i, 2) = hist_arr(j, 2)  
           If val_arr(i, 3) > hist_arr(j, 3) Then val_arr(i, 3) = hist_arr(j, 3)  
           If hist_arr(j, 4) > 0 Then val_arr(i, 4) = hist_arr(j, 4)  
      Next j  
   Next i  
   rlist.Columns("a:g").Delete  
   tabl.Range(tabl.Cells(minrow, 4), tabl.Cells(maxrow, 7)).Value = val_arr  
End Sub  
прошу прощения за отсутствие комментариев :(
 
ps sorry  
вначале я описал начальные же вариант :)  
 
в последующем он  был изменен - данные с листа переписываются в массив, обрабатываются и уже без обратной сортировки прямо из массива записываются в таблицу
 
Ну раз уже речь зашла о макросах, попробую и я чето такое сочинить, только не такое крутое - исключительно для решения исходной задачи:)
 
2Raptor  
 
ЗдОрово и элегантно! Вариант с макросом действительно работает. И работает замечательно. Спасибо!  
Не сочтите за наглость :), но для полного счастья не хватает автоматического пересчета (по мере поступления данных или раз в 1 секунду) только последнего (длящегося) временного интервала.  
 
Предыдущий вариант у меня так и не заработал. Проверял на Excel с настройками по умолчанию (после инсталяции). Возможно нужно что-то настроить - я не сообразил. Подскажите. А может это зависить от версии Excel?  
 
P.S. Спасибо (видимо СЛЭНу) за текст программы в предыдущем посте.
 
{quote}{login=Андрей}{date=30.09.2008 01:07}{thema=}{post} ...для полного счастья не хватает автоматического пересчета (по мере поступления данных или раз в 1 секунду) только последнего (длящегося) временного интервала. {/post}{/quote}  
Как поступают данные? Вы их заносите вручную или добавляете к существующим данным макросом либо другим способом?  
 
{quote}{post} Предыдущий вариант у меня так и не заработал. Проверял на Excel с настройками по умолчанию (после инсталяции). Возможно нужно что-то настроить - я не сообразил. Подскажите. А может это зависить от версии Excel?  
{/post}{/quote}  
От версии вряд ли, а вот от разночтения форматов - очень может быть...
 
{quote}{login=Андрей}{date=30.09.2008 01:07}{thema=}{post} ... но для полного счастья не хватает автоматического пересчета (по мере поступления данных или раз в 1 секунду) только последнего (длящегося) временного интервала.{/post}{/quote}  
Блин:) двухкратного цитирования не получилось:)  
Как поступают данные? Вы их заносите вручную или добавляете к существующим данным макросом либо другим способом?
 
Данные в реальном времени прямо в таблицу Excel  экспортирует информационно-торговая система QUIK ( http://www.quik.ru/client/quik/ ). После настройки адреса для экспорта (книга, лист, начальная строка и столбец) и открытия соответствующей книги, запускается экспорт и Excel пассивно получает данные. Обновление в экспортируемой таблице происходят с частотой где-то 1 раз в 0,3-0,5 сек.
 
{quote}{login=}{date=30.09.2008 04:25}{thema=}{post}Данные в реальном времени прямо в таблицу Excel  экспортирует информационно-торговая система QUIK ( http://www.quik.ru/client/quik/ ). После настройки адреса для экспорта (книга, лист, начальная строка и столбец) и открытия соответствующей книги, запускается экспорт и Excel пассивно получает данные. Обновление в экспортируемой таблице происходят с частотой где-то 1 раз в 0,3-0,5 сек.{/post}{/quote}  
 
Пост мой. Поторопился, не подписал... :)
 
Решил уточнить. При обновлении в экспортируемой таблице (и, соответственно, в Excel) существующие данные не меняются и не обновляются, только дописываются новые строки внизу.
 
Вот тут модернизировал на досуге с учетом ваших пожеланий:) Теперь ведется контроль за ключевыми параметрами OHLC (поток данных, начальное время и интервал) без участия пользователя, т.е. при их изменении производится автоматический пересчет данных. Интервалы для экспортированных данных рассчитываются и добавляются также автоматом.
 
Пардон, не задекларировал парочку переменных:)
 
Raptor, огромное спасибо!  
 
В прикрепленном файле все отлично считается. Менял временной интервал, вручную добавлял данные - все корректно пересчитывается. Но, без ложки дегтя никуда :( . Запустил экспорт данных и автоматического пересчета нет. Запустил принудительно - опять нули в ячейках OHLC. Наверно это происходит из-за того, что данные времени идут в тексте, а импортирующие ячейки в формате "время". Можно ли менять формат данных в макросе? Или проще это делать прямо в таблице? Что легче для процессора? а может проблемма еще в чем-то...
 
Да, это моя вина:) Для чистоты эксперимента проверял движение потока данных макросом через сложение константы с последним значением в потоке, ну и сделал однм махом все значения в таблице числовыми, чтоб не заморачиваться.. А вернуть к исходному варианту - как-то не подумал:)
 
Заработало! Только с перерывом на обед :) . Почемуто, с 13 до 14 никак не хочет считать. Пробовал задавать разные временные интервалы - все равно в это время перерыв. Результат в файле. Данные я порезал для уменьшения веса, на при расчетах они были, в т.ч. и с часа до двух - специально проверял.
 
Вырежьте пожалуйста в файл именно кусок, содержащий данные с 13 до 14 + 10 значений выше и ниже. Посмотрим, что там не так:) Наверняка опять проблема формата...
 
Вчерашних данных я не сохранил. Вставил данные за другой день - та же проблема. Пробовал перед вставкой форматировать все ячейки до конца листа - не помогло. Еще обратил внимание, что после "обеда" данные расчитываются неправильно. Во вложении оставил данные до 14.30 для наглядности.
Страницы: 1 2 3 След.
Читают тему
Наверх