Модуль quotes - задумывался мною как библиотека (или пакет), но взвесив все как следует решил что это будет программный пакет на основе модуля (или, опять же, пакета) quotes. Поэтому несколько изменим структуру продукта:
В папке quotes будет располагаться библиотека, а в корневой папке проекта будут находиться скрипты, использующие эту библиотеку. Первый функционал, который мы сделаем доступным - это возможность загружать котировки с сайта finam, распаковывать эти данные и сохранять в файл для дальнейшего использования. Функцию загрузки котировок скопипастим из предыдущей статьи, а над остальным придется потрудиться. Оформим структуру данных для работы с котировками в виде класса. Назовем его stock. Итак, исходники quotes.py с комментариями:
# -*- coding: utf-8
import string
import urllib
# загрузка котировок
def get_quotes(df, mf, yf, dt, mt, yt, simb, period):
f = urllib.urlopen('http://195.128.78.52/GAZP_080201_100208.txt?d=d&market=1&em=' +
str(simb)+'&df='+str(df)+'&mf='+str(mf)+'&yf='+str(yf)+'&dt='+str(dt)+'&mt='
+str(mt)+'&yt='+str(yt)+'&p='+str(period)
+'&f=GAZP_080201_100208&e=.txt&cn=GAZP&dtf=4&tmf=4&MSOR=0&sep=1&sep2=1&datf=5&at=1')
quot = f.read()
return string.split(quot, '\\n')[1:-1]
# класс quote - котировки
class quote(object):
# инициализация: по умолчанию грузим газпром часовик
# обозначения периодов 1 - тики, 2 - минуты, 3 - 5 минут, 7 - 1 час, 8 - день
def __init__(self, period=7, simb=16842):
# "сырые" данные которовок - массив строк
self.raw_data = []
# развернутые данные - open, high, low, close, volume
self.open, self.high, self.low, self.close, self.volume = [], [], [], [], []
# номер торгового инструмента (по финаму)
self.simb = simb
# период
self.period = period
# распаковка "сырых" данных
def decomp(self):
self.open, self.hight, self.low, self.close, self.volume = [], [], [], [], []
for line in self.raw_data:
mix = string.split(line, ',')[2:7]
self.open.append(float(mix[0]))
self.high.append(float(mix[1]))
self.low.append(float(mix[2]))
self.close.append(float(mix[3]))
self.volume.append(int(mix[4]))
# грузим котировки из инета
def load_quotes(self, df, mf, yf, dt, mt, yt):
self.raw_data = get_quotes(df, mf, yf, dt, mt, yt, self.simb, self.period)
self.decomp()
# записываем котировки в файл (сырые)
def save(self, fname):
f = open(fname, 'w')
for line in self.raw_data:
f.write(line+'\\n')
f.close()
# грузим "сырые" котировки из файла
def load(self, fname):
f = open(fname, 'r')
quot = f.read()
f.close()
self.raw_data = string.split(quot, '\\n')[:-1]
self.decomp()А вот пример использования класса quote:
# -*- coding: utf-8
# загружаем модуль quotes
import quotes.quotes as quotes
# инициализируем объект класса quotes
# 8 - период сутки, по умолчанию ГАЗПРОМ
q = quotes.quote(8)
# период: с 1.01.2010 по 30.01.2010
# (напомню, нумерация месяцев здесь начинается с 0)
q.load_quotes(1, 0, 2010, 30, 0, 2010)
# выводим "сырые" данные
print q.raw_data
# вывод объемов по дням
print q.volume
# сохраняем котировки в файл
q.save('zzz.txt')
# делаем новый объект класса quotes
q2 = quotes.quote(8)
# загружаем котировки из только что сохраненного файла
q2.load('zzz.txt')
# выводим объемы по дням - все в норме
print q.volume