Блог им. Albus

Парсер котировок Финама

Пост будет полезен только тем, кто кодит на Луа.
---
Написал простенькую функцию, которая работает с архивом графиков Финама. На Финаме есть история торгов за много лет. Это полезно, чтобы прогнать вашу стратегию на максимально доступных исторических данных.
Архив Финама находится здесь: https://www.finam.ru/profile/moex-akcii/sberbank/export/
---
Заходите по ссылке, видите там:
Парсер котировок Финама
Там где «Формат записи в файл» выбираете как у меня: DATE,TIME,OPEN,HIGH,LOW,CLOSE,VOL. Можно брать и другие форматы, но тогда код функции придётся переписать.
---
Выбираете вверху даты с 1 января по 31 декабря и год за годом сохраняте себе на компьютер вот так:
Парсер котировок Финама
Если лень заходить на Финам и сохранять, можете просто скачать архив.
https://yadi.sk/d/83L4VzRx3agH6Z
Распакуйте. Увидите готовые файлы по СБЕРу с 2013 по 2018 (пятиминутки) и сам парсер. Скрипт должен начать работать без каких-либо дополнительных настроек. Скрипт и файлы истории должны лежать в одной папке. 
Файл FINAM_PARSER.lua запускается здесь:
Парсер котировок Финама
Выдаст такой текст в таблице сообщения КВИКа:
Парсер котировок Финама
---
Код парсера (файл FINAM_PARSER.lua) сопровождается подробными комментариями шаг за шагом.
ticker="SBER"--тикер акции
first_year=2013--первый сохранённый год
last_year=2018--последний сохранённый год. Не должно быть пропущенных лет. 
is_run=true--техническая переменная
---
function finam_parser(paper)--функция парсера
	giga_table={}--создаём пустую таблицу
	for i=first_year,last_year,1 do--крутим цикл с первого заданного года по последнего.
		local tmp_path=getScriptPath().."\\"..paper.."_"..i..".txt"--это путь к файлу с историей. getScriptPath получает путь, где лежит скрипт. В этой же папке лежат файлы с историей. Проверка есть ли такой файл, отключена. В моём рабочем роботе это делает функция path.exists. По умолчанию у вас её нет. Надо отдельно скачивать LuaForWindows.
			for line in io.lines(tmp_path) do--читаем файл с историей. Чтение идёт свечка за свечкой (строчка за строчкой)
				if string.find(line, "20") then--нам нужны только строчки, начинающиеся с цифры 20, (2018 например)
					new_line="{"..line.."}"--считали строку, превратили её в таблицу с помощью фигурных скобок и записали в переменную new_line
					local t = loadstring("local t = "..new_line.." return t")()--считали из строки мини-таблицу (свечку).
					if t[2]>100000 and t[2]<=184000 then--исключаем цены премаркета и пост-маркета.
						table.insert(giga_table,t)--вставляем свечу в создаваемую гигантскую таблицу giga_table
					end
				end
			end	
			message(tmp_path.." полей в таблице="..#giga_table,1)--КВИК выдаст сообщение: путь к файлу и текущий размер таблицы giga_table
	end
	return giga_table--парсер возвращает удобную таблицу giga_table, с которой можно дальше работать.
end

function main()--основная функция КВИКа.
	finam_parser(ticker)--запускаем парсер с указанным тикером.
	message (ticker..": giga_table принята")
	message ("посчитаю что нибудь")
	max_range=0--задали переменную. Будем искать свечу, у которой наивысшее расстояние между high и low
	for i=1,#giga_table do
		local range=giga_table[i][4]-giga_table[i][5]
		if range>max_range then 
			max_range=range
			data=giga_table[i][1]
			vremya=giga_table[i][2]
		end
	end
	message("Самая длинная свеча High-Low="..max_range.." была "..data.." "..vremya)
	message("The End")	
end

function OnStop(s) --что делать при нажатии на кнопку "остановить"
	is_run=false--прерываем вечный цикл внутри main
	return 100--число возле return - это время в миллисекундах. Если выставить этот параметр, скрипт будет удобнее останавливаться (без подвисаний)
end



Всем удачных исследований!
  • обсудить на форуме:
  • Quik Lua
★13
5 комментариев
добавь возможность оформлять текст в виде кода!
такая функция есть
avatar
Андрей К, спасибо. Нашёл
Albus, я рад!:)))

теги блога Albus (Игорь Китаев)

....все тэги



UPDONW
Новый дизайн