2010-01-09 13 views
7

Me gustaría utilizar Yahoo para obtener precios de acciones dentro de un programa Emacs Lisp. Tengo dos preguntas.Obteniendo precios de acciones de Yahoo con Elisp?

  1. ¿Cómo puedo hacer el http GET?
  2. ¿Cuál es la mejor manera de almacenar los datos en Elisp para que pueda hacer comparaciones de los datos? En otras palabras, ¿debería usar una tabla hash, varias tablas hash o listas para representar los datos devueltos por Yahoo?

Aquí está el esquema básico de lo que me gustaría hacer.

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

Gracias por presentarme al 'mapconcat ', ¡eso es útil! – justinhj

Respuesta

6

Aquí hay un código para comenzar; Muestro cómo agarrar la url a un buffer, analizar cada línea y luego mostrar el ticker y el precio de cada artículo. Puede modificarlo desde allí para hacer lo que necesita.

Esto analiza cada línea de datos de stock en una lista, y es sencillo tomar los valores usando la primera, segunda, tercera función o usando nth. Puede escribir funciones para tomar cada elemento que desee, como get-ticker (quote) que simplemente devolvería (primer ticker)

No pensaría demasiado sobre qué tipo de estructura de datos usar; lo que sea más fácil está bien. Si necesita un alto rendimiento, no debe usar emacs lisp para esto de todos modos.

(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

Echa un vistazo http://edward.oconnor.cx/elisp/. Edward tiene algunos ejemplos de interactuar con varios servicios usando HTTP, y si no puede encontrar una biblioteca de cliente de Yahoo, puede escribir una usando estas técnicas.

Cuestiones relacionadas