|
|
@ -4,7 +4,11 @@ |
|
|
|
|
|
|
|
|
|
|
|
package mop |
|
|
|
package mop |
|
|
|
|
|
|
|
|
|
|
|
import "strings" |
|
|
|
import ( |
|
|
|
|
|
|
|
"strings" |
|
|
|
|
|
|
|
"log" |
|
|
|
|
|
|
|
"strconv" |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
// Filter gets called to sort stock quotes by one of the columns. The
|
|
|
|
// Filter gets called to sort stock quotes by one of the columns. The
|
|
|
|
// setup is rather lengthy; there should probably be more concise way
|
|
|
|
// setup is rather lengthy; there should probably be more concise way
|
|
|
@ -26,30 +30,60 @@ func (filter *Filter) Apply(stocks []Stock) []Stock { |
|
|
|
var filteredStocks []Stock |
|
|
|
var filteredStocks []Stock |
|
|
|
|
|
|
|
|
|
|
|
for _, stock := range stocks { |
|
|
|
for _, stock := range stocks { |
|
|
|
var values = map[string]interface{}{ |
|
|
|
//var values = map[string]interface{}{
|
|
|
|
"ticker": strings.TrimSpace(stock.Ticker), |
|
|
|
// "ticker": strings.TrimSpace(stock.Ticker),
|
|
|
|
"last": m(stock.LastTrade), |
|
|
|
// "last": m(stock.LastTrade),
|
|
|
|
"change": c(stock.Change), |
|
|
|
// "change": c(stock.Change),
|
|
|
|
"changePercent": c(stock.ChangePct), |
|
|
|
// "changePercent": c(stock.ChangePct),
|
|
|
|
"open": m(stock.Open), |
|
|
|
// "open": m(stock.Open),
|
|
|
|
"low": m(stock.Low), |
|
|
|
// "low": m(stock.Low),
|
|
|
|
"high": m(stock.High), |
|
|
|
// "high": m(stock.High),
|
|
|
|
"low52": m(stock.Low52), |
|
|
|
// "low52": m(stock.Low52),
|
|
|
|
"high52": m(stock.High52), |
|
|
|
// "high52": m(stock.High52),
|
|
|
|
"volume": m(stock.Volume), |
|
|
|
// "volume": m(stock.Volume),
|
|
|
|
"avgVolume": m(stock.AvgVolume), |
|
|
|
// "avgVolume": m(stock.AvgVolume),
|
|
|
|
"pe": m(stock.PeRatio), |
|
|
|
// "pe": m(stock.PeRatio),
|
|
|
|
"peX": m(stock.PeRatioX), |
|
|
|
// "peX": m(stock.PeRatioX),
|
|
|
|
"dividend": m(stock.Dividend), |
|
|
|
// "dividend": m(stock.Dividend),
|
|
|
|
"yield": m(stock.Yield), |
|
|
|
// "yield": m(stock.Yield),
|
|
|
|
"mktCap": m(stock.MarketCap), |
|
|
|
// "mktCap": m(stock.MarketCap),
|
|
|
|
"mktCapX": m(stock.MarketCapX), |
|
|
|
// "mktCapX": m(stock.MarketCapX),
|
|
|
|
"advancing": stock.Advancing, |
|
|
|
// "advancing": stock.Advancing,
|
|
|
|
} |
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var values = make(map[string]interface{}) |
|
|
|
|
|
|
|
//values["pe"] = 8;
|
|
|
|
|
|
|
|
var err error |
|
|
|
|
|
|
|
values["ticker"] = strings.TrimSpace(stock.Ticker) |
|
|
|
|
|
|
|
values["last"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.LastTrade),"$",""),64) |
|
|
|
|
|
|
|
values["change"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.Change),"$",""),64) |
|
|
|
|
|
|
|
values["changePercent"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.ChangePct),"$",""),64) |
|
|
|
|
|
|
|
values["open"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.Open),"$",""),64) |
|
|
|
|
|
|
|
values["low"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.Low),"$",""),64) |
|
|
|
|
|
|
|
values["high"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.High),"$",""),64) |
|
|
|
|
|
|
|
values["low52"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.Low52),"$",""),64) |
|
|
|
|
|
|
|
values["high52"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.High52),"$",""),64) |
|
|
|
|
|
|
|
values["volume"],err = strconv.ParseFloat(stock.Volume,64) |
|
|
|
|
|
|
|
values["avgVolume"],err = strconv.ParseFloat(stock.AvgVolume,64) |
|
|
|
|
|
|
|
values["pe"],err = strconv.ParseFloat(stock.PeRatio,64) |
|
|
|
|
|
|
|
values["peX"],err = strconv.ParseFloat(stock.PeRatioX,64) |
|
|
|
|
|
|
|
values["dividend"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.Dividend),"$",""),64) |
|
|
|
|
|
|
|
values["yield"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.Yield),"$",""),64) |
|
|
|
|
|
|
|
values["mktCap"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.MarketCap),"$",""),64) |
|
|
|
|
|
|
|
values["mktCapX"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.MarketCapX),"$",""),64) |
|
|
|
|
|
|
|
values["advancing"] = stock.Advancing |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
log.Println(stock.Dividend) |
|
|
|
|
|
|
|
log.Println("m9: ",m("$9")) |
|
|
|
|
|
|
|
log.Printf("type m($9) is %T\n",m("$9")) |
|
|
|
|
|
|
|
log.Println("dividend:",stock.Dividend,m(stock.Dividend)) |
|
|
|
|
|
|
|
log.Printf("dividend is %T\n",stock.Dividend) |
|
|
|
|
|
|
|
log.Printf("m(dividend) is %T\n",m(stock.Dividend)) |
|
|
|
|
|
|
|
log.Printf("values[pe] is type %T\n",values["pe"]) |
|
|
|
result, err := filter.profile.filterExpression.Evaluate(values) |
|
|
|
result, err := filter.profile.filterExpression.Evaluate(values) |
|
|
|
|
|
|
|
|
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
|
|
|
|
log.Println("In filter.go, err:",err) |
|
|
|
// The filter isn't working, so reset to no filter.
|
|
|
|
// The filter isn't working, so reset to no filter.
|
|
|
|
filter.profile.Filter = "" |
|
|
|
filter.profile.Filter = "" |
|
|
|
// Return an empty list. The next main loop cycle will
|
|
|
|
// Return an empty list. The next main loop cycle will
|
|
|
|