|
|
@ -6,7 +6,6 @@ package mop |
|
|
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
import ( |
|
|
|
"strings" |
|
|
|
"strings" |
|
|
|
"log" |
|
|
|
|
|
|
|
"strconv" |
|
|
|
"strconv" |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
@ -24,66 +23,51 @@ func NewFilter(profile *Profile) *Filter { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Changes money and % notation to a plain float for math, comparisons.
|
|
|
|
|
|
|
|
func stringToNumber (numberString string) float64 { |
|
|
|
|
|
|
|
// If the string "$3.6B" is passed in, the returned float will be 3.6E+09.
|
|
|
|
|
|
|
|
// If 0.03% is passed in, the returned float will be 0.03 (NOT 0.0003!).
|
|
|
|
|
|
|
|
newString := strings.TrimSpace(numberString) // Take off whitespace.
|
|
|
|
|
|
|
|
newString = strings.Replace(newString,"$","",1) // Remove the $ symbol.
|
|
|
|
|
|
|
|
newString = strings.Replace(newString,"%","",1) // Remove the $ symbol.
|
|
|
|
|
|
|
|
newString = strings.Replace(newString,"K","E+3",1) // Thousand (kilo)
|
|
|
|
|
|
|
|
newString = strings.Replace(newString,"M","E+6",1) // Million
|
|
|
|
|
|
|
|
newString = strings.Replace(newString,"B","E+9",1) // Billion
|
|
|
|
|
|
|
|
newString = strings.Replace(newString,"T","E+12",1) // Trillion
|
|
|
|
|
|
|
|
finalValue, _ := strconv.ParseFloat(newString, 64) |
|
|
|
|
|
|
|
return finalValue |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Apply builds a list of sort interface based on current sort
|
|
|
|
// Apply builds a list of sort interface based on current sort
|
|
|
|
// order, then calls sort.Sort to do the actual job.
|
|
|
|
// order, then calls sort.Sort to do the actual job.
|
|
|
|
func (filter *Filter) Apply(stocks []Stock) []Stock { |
|
|
|
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{}{
|
|
|
|
|
|
|
|
// "ticker": strings.TrimSpace(stock.Ticker),
|
|
|
|
|
|
|
|
// "last": m(stock.LastTrade),
|
|
|
|
|
|
|
|
// "change": c(stock.Change),
|
|
|
|
|
|
|
|
// "changePercent": c(stock.ChangePct),
|
|
|
|
|
|
|
|
// "open": m(stock.Open),
|
|
|
|
|
|
|
|
// "low": m(stock.Low),
|
|
|
|
|
|
|
|
// "high": m(stock.High),
|
|
|
|
|
|
|
|
// "low52": m(stock.Low52),
|
|
|
|
|
|
|
|
// "high52": m(stock.High52),
|
|
|
|
|
|
|
|
// "volume": m(stock.Volume),
|
|
|
|
|
|
|
|
// "avgVolume": m(stock.AvgVolume),
|
|
|
|
|
|
|
|
// "pe": m(stock.PeRatio),
|
|
|
|
|
|
|
|
// "peX": m(stock.PeRatioX),
|
|
|
|
|
|
|
|
// "dividend": m(stock.Dividend),
|
|
|
|
|
|
|
|
// "yield": m(stock.Yield),
|
|
|
|
|
|
|
|
// "mktCap": m(stock.MarketCap),
|
|
|
|
|
|
|
|
// "mktCapX": m(stock.MarketCapX),
|
|
|
|
|
|
|
|
// "advancing": stock.Advancing,
|
|
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var values = make(map[string]interface{}) |
|
|
|
var values = make(map[string]interface{}) |
|
|
|
//values["pe"] = 8;
|
|
|
|
// Make conversions from the strings to floats where necessary.
|
|
|
|
var err error |
|
|
|
values["ticker"] = strings.TrimSpace(stock.Ticker) // Remains string
|
|
|
|
values["ticker"] = strings.TrimSpace(stock.Ticker) |
|
|
|
values["last"] = stringToNumber(stock.LastTrade) |
|
|
|
values["last"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.LastTrade),"$",""),64) |
|
|
|
values["change"] = stringToNumber(stock.Change) |
|
|
|
values["change"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.Change),"$",""),64) |
|
|
|
values["changePercent"] = stringToNumber(stock.ChangePct) |
|
|
|
values["changePercent"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.ChangePct),"$",""),64) |
|
|
|
values["open"] = stringToNumber(stock.Open) |
|
|
|
values["open"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.Open),"$",""),64) |
|
|
|
values["low"] = stringToNumber(stock.Low) |
|
|
|
values["low"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.Low),"$",""),64) |
|
|
|
values["high"] = stringToNumber(stock.High) |
|
|
|
values["high"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.High),"$",""),64) |
|
|
|
values["low52"] = stringToNumber(stock.Low52) |
|
|
|
values["low52"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.Low52),"$",""),64) |
|
|
|
values["high52"] = stringToNumber(stock.High52) |
|
|
|
values["high52"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.High52),"$",""),64) |
|
|
|
values["dividend"] = stringToNumber(stock.Dividend) |
|
|
|
values["volume"],err = strconv.ParseFloat(stock.Volume,64) |
|
|
|
values["yield"] = stringToNumber(stock.Yield) |
|
|
|
values["avgVolume"],err = strconv.ParseFloat(stock.AvgVolume,64) |
|
|
|
values["mktCap"] = stringToNumber(stock.MarketCap) |
|
|
|
values["pe"],err = strconv.ParseFloat(stock.PeRatio,64) |
|
|
|
values["mktCapX"] = stringToNumber(stock.MarketCapX) |
|
|
|
values["peX"],err = strconv.ParseFloat(stock.PeRatioX,64) |
|
|
|
values["volume"] = stringToNumber(stock.Volume) |
|
|
|
values["dividend"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.Dividend),"$",""),64) |
|
|
|
values["avgVolume"] = stringToNumber(stock.AvgVolume) |
|
|
|
values["yield"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.Yield),"$",""),64) |
|
|
|
values["pe"] = stringToNumber(stock.PeRatio) |
|
|
|
values["mktCap"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.MarketCap),"$",""),64) |
|
|
|
values["peX"] = stringToNumber(stock.PeRatioX) |
|
|
|
values["mktCapX"],err = strconv.ParseFloat(strings.ReplaceAll(strings.TrimSpace(stock.MarketCapX),"$",""),64) |
|
|
|
values["advancing"] = stock.Advancing // Remains bool.
|
|
|
|
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
|
|
|
|