2010-01-09 33 views
7

Tôi muốn sử dụng Yahoo để lấy giá cổ phiếu từ bên trong chương trình Emacs Lisp. Tôi có hai câu hỏi.Nhận giá cổ phiếu từ Yahoo với Elisp?

  1. Làm cách nào để làm cho http GET?
  2. Điều gì là tốt nhất để lưu trữ dữ liệu trong Elisp để tôi có thể so sánh dữ liệu? Nói cách khác, tôi có nên sử dụng một bảng băm, một số bảng băm hoặc danh sách để đại diện cho dữ liệu đó được trả lại từ Yahoo không?

Đây là phác thảo cơ bản về những gì tôi muốn làm.

 
;; 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 
;; 

+0

Cảm ơn bạn đã giới thiệu bản thân với 'mapconcat', thật tiện lợi! – justinhj

Trả lời

6

Dưới đây là một số mã để giúp bạn bắt đầu; Tôi cho thấy làm thế nào để lấy các url vào một bộ đệm, phân tích mỗi dòng và sau đó hiển thị ticker và giá cả của mỗi mục. Bạn có thể sửa đổi nó từ đó để làm những gì bạn cần.

Điều này phân tích từng dòng dữ liệu chứng khoán thành một danh sách và nó thẳng về phía trước để lấy các giá trị bằng cách sử dụng hàm thứ nhất, thứ hai, thứ ba hoặc sử dụng thứ n. Bạn có thể viết các hàm để lấy từng phần tử bạn muốn, chẳng hạn như get-ticker (quote) mà sẽ chỉ trả lại (dấu tick đầu tiên)

Tôi sẽ không nghĩ về cấu trúc dữ liệu nào sẽ sử dụng; bất cứ điều gì là dễ nhất là tốt. Nếu bạn cần hiệu suất cao thì bạn không nên sử dụng các emacs lisp cho điều này anyway.

(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

Kiểm tra http://edward.oconnor.cx/elisp/. Edward có một số ví dụ về tương tác với các dịch vụ khác nhau bằng cách sử dụng HTTP và nếu bạn không thể tìm thấy thư viện khách hàng của Yahoo, bạn có thể viết một thư viện bằng cách sử dụng các kỹ thuật này.

Các vấn đề liên quan