// Copyright (c) 2013 by Michael Dvorkin. All Rights Reserved. //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= package mop import ( "bytes" "fmt" "io/ioutil" "net/http" "strings" ) // See http://www.gummy-stuff.org/Yahoo-data.htm // Current, Change, Open, High, Low, 52-W High, 52-W Low, Volume, AvgVolume, P/E, Yield, Market Cap. // l1: last trade // c6: change rt // k2: change % rt // o: open // g: day's low // h: day's high // j: 52w low // k: 52w high // v: volume // a2: avg volume // r2: p/e rt // r: p/e // d: dividend/share // y: wield // j3: market cap rt // j1: market cap const yahoo_quotes_url = `http://download.finance.yahoo.com/d/quotes.csv?s=%s&f=,l1c6k2oghjkva2r2rdyj3j1` // "AAPL", 417.42, "-3.38", "N/A - -0.80%", 420.33, 415.35, 423.29, 385.10, 705.07, 9788680, 15181900, N/A, 10.04, 11.00, 2.61, N/A, 391.8B // "ALU", 1.83, "+0.07", "N/A - +3.98%", 1.77, 1.75, 1.83, 0.91, 2.01, 7957103, 11640700, N/A, N/A, 0.00, N/A, N/A, 4.156B // "IBM", 194.93, "+1.68", "N/A - +0.87%", 192.83, 192.3501, 195.16, 181.85, 215.90, 2407971, 4376120, N/A, 13.33, 3.50, 1.81, N/A, 216.1B // "TSLA", 120.09, "+4.85", "N/A - +4.21%", 118.75, 115.70, 120.28, 25.52, 121.89, 6827497, 9464530, N/A, N/A, 0.00, N/A, N/A, 13.877B type Quote struct { Ticker string LastTrade string Change string ChangePercent string Open string Low string High string Low52 string High52 string Volume string AvgVolume string PeRatio string PeRatioX string Dividend string Yield string MarketCap string MarketCapX string } type Quotes []Quote func GetQuotes(tickers string) Quotes { // Format the URL and send the request. // url := fmt.Sprintf(yahoo_quotes_url, strings.Join(tickers, "+")) url := fmt.Sprintf(yahoo_quotes_url, tickers) response, err := http.Get(url) if err != nil { panic(err) } // Fetch response and get its body. defer response.Body.Close() body, err := ioutil.ReadAll(response.Body) if err != nil { panic(err) } return parse(sanitize(body)) } func (q *Quote) Color() string { if strings.Index(q.Change, "-") == -1 { return "" } else { return "" // "" } } func sanitize(body []byte) []byte { return bytes.Replace(bytes.TrimSpace(body), []byte{'"'}, []byte{}, -1) } func parse(body []byte) Quotes { lines := bytes.Split(body, []byte{'\n'}) quotes := make(Quotes, len(lines)) for i, line := range lines { // fmt.Printf("\n\n{%d} -> [%s]\n\n", i, string(line)) parse_line(line, "es[i]) } return quotes } func parse_line(line []byte, quote *Quote) { columns := bytes.Split(bytes.TrimSpace(line), []byte{','}) quote.Ticker = string(columns[0]) quote.LastTrade = string(columns[1]) quote.Change = string(columns[2]) quote.ChangePercent = string(columns[3]) quote.Open = string(columns[4]) quote.Low = string(columns[5]) quote.High = string(columns[6]) quote.Low52 = string(columns[7]) quote.High52 = string(columns[8]) quote.Volume = string(columns[9]) quote.AvgVolume = string(columns[10]) quote.PeRatio = string(columns[11]) quote.PeRatioX = string(columns[12]) quote.Dividend = string(columns[13]) quote.Yield = string(columns[14]) quote.MarketCap = string(columns[15]) quote.MarketCapX = string(columns[16]) } // func (quotes Quotes) Format() string { // str := time.Now().Format("3:04:05pm PST\n") // // for _, q := range quotes { // str += fmt.Sprintf("%s - %s - %s - %s\n", q.Ticker, q.Ask, q.Change, q.ChangePercent) // } // return str // } // // http://query.yahooapis.com/v1/public/yql // ?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in(%22ALU%22,%22AAPL%22) // &env=http%3A%2F%2Fdatatables.org%2Falltables.env // &format=json' // // ^IXIC NASDAQ composite // ^GSPC S&P 500 // // { // "query": { // "count": 2, // "created": "2013-06-28T03:28:19Z", // "lang": "en-US", // "results": { // "quote": [ // { // "AfterHoursChangeRealtime": "N/A - N/A", // "AnnualizedGain": null, // "Ask": null, // "AskRealtime": "1.91", // "AverageDailyVolume": "11692300", // "Bid": null, // "BidRealtime": "1.86", // "BookValue": "1.249", // "Change": "+0.12", // "ChangeFromFiftydayMovingAverage": "+0.1626", // "ChangeFromTwoHundreddayMovingAverage": "+0.321", // "ChangeFromYearHigh": "-0.16", // "ChangeFromYearLow": "+0.94", // "ChangePercentRealtime": "N/A - +6.94%", // "ChangeRealtime": "+0.12", // "Change_PercentChange": "+0.12 - +6.94%", // "ChangeinPercent": "+6.94%", // "Commission": null, // "DaysHigh": "1.92", // "DaysLow": "1.79", // "DaysRange": "1.79 - 1.92", // "DaysRangeRealtime": "N/A - N/A", // "DaysValueChange": "- - +6.94%", // "DaysValueChangeRealtime": "N/A - N/A", // "DividendPayDate": "29-Jun-07", // "DividendShare": "0.00", // "DividendYield": null, // "EBITDA": "802.7M", // "EPSEstimateCurrentYear": "-0.30", // "EPSEstimateNextQuarter": "-0.05", // "EPSEstimateNextYear": "-0.07", // "EarningsShare": "-1.213", // "ErrorIndicationreturnedforsymbolchangedinvalid": null, // "ExDividendDate": "31-May-07", // "FiftydayMovingAverage": "1.6874", // "HighLimit": null, // "HoldingsGain": null, // "HoldingsGainPercent": "- - -", // "HoldingsGainPercentRealtime": "N/A - N/A", // "HoldingsGainRealtime": null, // "HoldingsValue": null, // "HoldingsValueRealtime": null, // "LastTradeDate": "6/27/2013", // "LastTradePriceOnly": "1.85", // "LastTradeRealtimeWithTime": "N/A - 1.85", // "LastTradeTime": "4:00pm", // "LastTradeWithTime": "Jun 27 - 1.85", // "LowLimit": null, // "MarketCapRealtime": null, // "MarketCapitalization": "4.202B", // "MoreInfo": "cnprmIed", // "Name": "Alcatel-Lucent Co", // "Notes": null, // "OneyrTargetPrice": "2.16", // "Open": "1.81", // "OrderBookRealtime": null, // "PEGRatio": "0.22", // "PERatio": null, // "PERatioRealtime": null, // "PercebtChangeFromYearHigh": "-7.96%", // "PercentChange": "+6.94%", // "PercentChangeFromFiftydayMovingAverage": "+9.63%", // "PercentChangeFromTwoHundreddayMovingAverage": "+20.99%", // "PercentChangeFromYearLow": "+103.30%", // "PreviousClose": "1.73", // "PriceBook": "1.39", // "PriceEPSEstimateCurrentYear": null, // "PriceEPSEstimateNextYear": null, // "PricePaid": null, // "PriceSales": "0.21", // "SharesOwned": null, // "ShortRatio": "0.90", // "StockExchange": "NYSE", // "Symbol": "ALU", // "TickerTrend": " +=-=+- ", // "TradeDate": null, // "TwoHundreddayMovingAverage": "1.529", // "Volume": "34193168", // "YearHigh": "2.01", // "YearLow": "0.91", // "YearRange": "0.91 - 2.01", // "symbol": "ALU" // }, // { // "AfterHoursChangeRealtime": "N/A - N/A", // "AnnualizedGain": null, // "Ask": "393.45", // "AskRealtime": "393.45", // "AverageDailyVolume": "17939600", // "Bid": "393.32", // "BidRealtime": "393.32", // "BookValue": "144.124", // "Change": "-4.29", // "ChangeFromFiftydayMovingAverage": "-37.81", // "ChangeFromTwoHundreddayMovingAverage": "-111.877", // "ChangeFromYearHigh": "-311.29", // "ChangeFromYearLow": "+8.68", // "ChangePercentRealtime": "N/A - -1.08%", // "ChangeRealtime": "-4.29", // "Change_PercentChange": "-4.29 - -1.08%", // "ChangeinPercent": "-1.08%", // "Commission": null, // "DaysHigh": "401.39", // "DaysLow": "393.54", // "DaysRange": "393.54 - 401.39", // "DaysRangeRealtime": "N/A - N/A", // "DaysValueChange": "- - -1.08%", // "DaysValueChangeRealtime": "N/A - N/A", // "DividendPayDate": "May 16", // "DividendShare": "7.95", // "DividendYield": "2.00", // "EBITDA": "57.381B", // "EPSEstimateCurrentYear": "39.57", // "EPSEstimateNextQuarter": "8.21", // "EPSEstimateNextYear": "43.71", // "EarningsShare": "41.896", // "ErrorIndicationreturnedforsymbolchangedinvalid": null, // "ExDividendDate": "Feb 7", // "FiftydayMovingAverage": "431.59", // "HighLimit": null, // "HoldingsGain": null, // "HoldingsGainPercent": "- - -", // "HoldingsGainPercentRealtime": "N/A - N/A", // "HoldingsGainRealtime": null, // "HoldingsValue": null, // "HoldingsValueRealtime": null, // "LastTradeDate": "6/27/2013", // "LastTradePriceOnly": "393.78", // "LastTradeRealtimeWithTime": "N/A - 393.78", // "LastTradeTime": "4:00pm", // "LastTradeWithTime": "Jun 27 - 393.78", // "LowLimit": null, // "MarketCapRealtime": null, // "MarketCapitalization": "369.6B", // "MoreInfo": "cnsprmiIed", // "Name": "Apple Inc.", // "Notes": null, // "OneyrTargetPrice": "539.54", // "Open": "399.01", // "OrderBookRealtime": null, // "PEGRatio": "0.48", // "PERatio": "9.50", // "PERatioRealtime": null, // "PercebtChangeFromYearHigh": "-44.15%", // "PercentChange": "-1.08%", // "PercentChangeFromFiftydayMovingAverage": "-8.76%", // "PercentChangeFromTwoHundreddayMovingAverage": "-22.13%", // "PercentChangeFromYearLow": "+2.25%", // "PreviousClose": "398.07", // "PriceBook": "2.76", // "PriceEPSEstimateCurrentYear": "10.06", // "PriceEPSEstimateNextYear": "9.11", // "PricePaid": null, // "PriceSales": "2.21", // "SharesOwned": null, // "ShortRatio": "1.50", // "StockExchange": "NasdaqNM", // "Symbol": "AAPL", // "TickerTrend": " +--=== ", // "TradeDate": null, // "TwoHundreddayMovingAverage": "505.657", // "Volume": "12050007", // "YearHigh": "705.07", // "YearLow": "385.10", // "YearRange": "385.10 - 705.07", // "symbol": "AAPL" // } // ] // } // } // }