1
0

finance.lisp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. (in-package #:chatikbot)
  2. (defparameter +yahoo-url+ "https://query.yahooapis.com/v1/public/yql" "Yahoo Finance API endpoint")
  3. (defparameter +yahoo-query+ "select Name,Rate from yahoo.finance.xchange where pair in (~{\"~A\"~^,~})")
  4. (defvar *rate-pairs* '("USDRUB" "EURRUB" "GBPRUB"))
  5. (defun get-rates (&optional (pairs *rate-pairs*))
  6. (let ((response (yason:parse
  7. (flexi-streams:octets-to-string
  8. (drakma:http-request +yahoo-url+
  9. :parameters (append '(("format" . "json")
  10. ("env" . "store://datatables.org/alltableswithkeys"))
  11. (list (cons "q" (format nil +yahoo-query+ pairs)))))
  12. :external-format :utf-8)
  13. :object-as :alist)))
  14. (when (aget "error" response)
  15. (error "Error in rates request"))
  16. (loop for rate in (aget "rate" (aget "results" (aget "query" response)))
  17. collect (cons (aget "Name" rate)
  18. (read-from-string (aget "Rate" rate))))))
  19. (defun make-chart (series &key (usd t) (eur t) (gbp t))
  20. (let ((flat (remove-if #'null (if (alexandria:circular-list-p series)
  21. (flat-circular series)
  22. series))))
  23. (adw-charting:with-line-chart (1200 900)
  24. (when usd
  25. (adw-charting:add-series "USD/RUB" (loop for p in flat collect (list (car p) (cdadr p)))))
  26. (when eur
  27. (adw-charting:add-series "EUR/RUB" (loop for p in flat collect (list (car p) (cdaddr p)))))
  28. (when gbp
  29. (adw-charting:add-series "GBP/RUB" (loop for p in flat collect (list (car p) (cdr (cadddr p))))))
  30. (adw-charting:set-axis
  31. :x "Time" :draw-gridlines-p t
  32. :label-formatter #'(lambda (v) (local-time:format-timestring nil (local-time:unix-to-timestamp v)
  33. :format '((:hour 2) ":" (:min 2)))))
  34. (adw-charting:set-axis :y "RUB" :draw-gridlines-p t :label-formatter "~,2F")
  35. (adw-charting:save-file "chart.png"))))