Получить цены на акции от Yahoo с Elisp? - PullRequest
7 голосов
/ 09 января 2010

Я бы хотел использовать Yahoo для получения цен на акции из программы Emacs Lisp. У меня два вопроса.

  1. Как мне сделать http GET?
  2. Что лучше всего хранить в Elisp, чтобы я мог сравнивать данные? Другими словами, должен ли я использовать одну хеш-таблицу, несколько хеш-таблиц или списки для представления этих данных, возвращаемых из Yahoo?

Вот основная схема того, что я хотел бы сделать.

;; Call Yahoo to get equity prices
;;
;; Yahoo Input: 
;;   http://download.finance.yahoo.com/d/quotes.csv?s=AAPL+GOOG&f=sb2b3jkm6
;; Yahoo Output:
;;  "AAPL",211.98,211.82,78.20,215.59,+17.90%
;;  "GOOG",602.94,601.69,282.75,629.51,+18.27%
;;
;; Symbol, ask, bid, 52 week low, 52 week high, % change from 200 day mavg
;;
;; Yahoo format described here: http://www.gummy-stuff.org/Yahoo-data.htm

(defun get-price-url (tickers)
"
s = symbol
b2 = ask real-time
b3 = bid real-time
j = 52 week low
k = 52 week high
"

  (concat "http://download.finance.yahoo.com/d/quotes.csv?s="
      (mapconcat 'identity tickers "+") "&f=sb2b3jk"))


(setq lst '("AAPL" "GOOG" "MSFT" "ORCL"))
(setq url (get-price-url lst))

;; Call Yahoo with Url, process results and place in a data structure
;; 

;; Return results sorted by largest change in 200 day mavg, in descending order
;;

Ответы [ 2 ]

6 голосов
/ 10 января 2010

Вот код, с которого можно начать; Я покажу, как получить URL-адрес в буфер, проанализировать каждую строку, а затем отобразить тикер и цену каждого элемента. Вы можете изменить его оттуда, чтобы сделать то, что вам нужно.

При этом каждая строка данных о запасах анализируется в списке, и сразу же получить значения можно с помощью первой, второй, третьей функций или с помощью nth. Вы можете написать функции для захвата каждого элемента, который вы хотите, например, get-ticker (цитата), который просто возвращает (первый тикер)

Я бы не стал думать, какую структуру данных использовать; все, что проще, значит хорошо. Если вам нужна высокая производительность, вам все равно не следует использовать emacs lisp.

(defun test()
  (interactive)
  (let ((quotes (get-quotes '("AAPL" "GOOG" "MSFT" "ORCL" "ERTS" "THQI") "sb")))
    (show-quotes quotes)))

(defun show-quotes(quotes)
  (dolist (quote quotes)
    (message (format "%s $%.2f" (first quote) (string-to-number (second quote))))))

(defun get-quotes(tickers field-string)
  "Given a list of ticker names and a string of fields to return as above, this grabs them
from Yahoo, and parses them"
  (let ((results-buffer (get-yahoo-quotes-to-buffer (get-price-url tickers field-string))))
    (switch-to-buffer results-buffer)
    (parse-quote-buffer results-buffer)))

(defun get-price-url (tickers field-string)
  "Set up the get url"
  (concat "http://download.finance.yahoo.com/d/quotes.csv?s=" 
      (mapconcat 'identity tickers "+") 
      "&f=" field-string))

(defun get-yahoo-quotes-to-buffer(url)
  "Retrieve the quotes to a buffer and return it"
  (url-retrieve-synchronously url))

(defun parse-quote-buffer(b)
  "Parse the buffer for quotes"
  (goto-line 1)
  (re-search-forward "^\n")
  (beginning-of-line)
  (let ((res nil))
    (while (> (point-max) (point))
      (setf res (cons  (split-string (thing-at-point 'line) ",") res))
      (forward-line 1))
    (reverse res)))
2 голосов
/ 09 января 2010

Извлечение http://edward.oconnor.cx/elisp/. У Эдварда есть несколько примеров взаимодействия с различными службами с использованием HTTP, и если вы не можете найти клиентскую библиотеку Yahoo, вы можете написать одну из них с помощью этих методов.

...