diff --git a/cmd/mop/main.go b/cmd/mop/main.go index d7724a1..69a2ce9 100644 --- a/cmd/mop/main.go +++ b/cmd/mop/main.go @@ -148,6 +148,24 @@ func getuserinput(preset *Preset, sc mop.Stock) string{ return message } +func getwatchlist() mop.Watchlist{ + var watchlist mop.Watchlist + + response, err := http.Get("http://119.29.166.226/q/dayjson/ml.json")//("http://119.29.166.226/q/dayjson/ml.json") + if err != nil { + // Handle error + fmt.Println(err) + } + defer response.Body.Close() + + err = json.NewDecoder(response.Body).Decode(&watchlist) + if err != nil { + fmt.Println(err) + } + + return watchlist +} + //----------------------------------------------------------------------------- func mainLoop(screen *mop.Screen, profile *mop.Profile, mode string) { var lineEditor *mop.LineEditor @@ -207,8 +225,10 @@ func mainLoop(screen *mop.Screen, profile *mop.Profile, mode string) { messages := make(chan mqtt.Message) // subscribe to the MQTT topic of interest - //topic := "stock/response" topic := "stock/response/#" + if mode == "standby" { + topic = "stock/standby/#" + } if token := client.Subscribe(topic, 0, func(client mqtt.Client, message mqtt.Message) { //fmt.Printf("Received message: %s from topic: %s\n", message.Payload(), message.Topic()) // send the message to the messages channel @@ -216,7 +236,7 @@ func mainLoop(screen *mop.Screen, profile *mop.Profile, mode string) { }); token.Wait() && token.Error() != nil { panic(token.Error()) } - + /* response, err := http.Get("http://119.29.166.226/q/dayjson/ml.json")//("http://119.29.166.226/q/dayjson/ml.json") if err != nil { // Handle error @@ -227,7 +247,8 @@ func mainLoop(screen *mop.Screen, profile *mop.Profile, mode string) { err = json.NewDecoder(response.Body).Decode(&watchlist) if err != nil { fmt.Println(err) - } + }*/ + watchlist := getwatchlist() market := mop.NewMarket(stock.G_STOCK_MANAGER.StockList, &watchlist) quotes := mop.NewQuotes(market, profile, stock.G_STOCK_MANAGER.StockList, &watchlist, client) @@ -275,11 +296,28 @@ loop: event.Ch == 'J' { screen.IncreaseOffset(upDownJump) redrawQuotesFlag = true - } else if event.Key == termbox.KeyPgup || - event.Ch == 'K' { + } else if event.Key == termbox.KeyPgup { screen.DecreaseOffset(upDownJump) redrawQuotesFlag = true - } else if event.Key == termbox.KeyArrowUp || event.Ch == 'k' { + }else if event.Ch == 'K' || event.Ch == 'k' { + quotes.Allflag = !quotes.Allflag + }else if event.Ch == 'A' || event.Ch == 'a' { + if mode == "standby" { + //quotes.Reload() + quotes.Reload() + }else{ + data := map[string]string{ + "cmd": "getlist", + } + jsonData, err := json.Marshal(data) + if err != nil { + fmt.Println(err) + } + message := string(jsonData) + token := client.Publish("stock/standby", 0, false, message) + token.Wait() + } + }else if event.Key == termbox.KeyArrowUp { screen.DecreaseOffset(1) screen.Selectmoveup(quotes) selstock := quotes.Getselectedinfo(screen.Selectindex()) @@ -406,7 +444,18 @@ loop: //fmt.Println("It's 1 minute and 0 seconds past the hour") quotes.SaveStocks() } - } + } else if hour == 9 && minute == 1 && second == 0 { + paused = false + } else if hour == 16 && minute == 1 && second == 0{ + paused = true + } + + if hour == 9 && minute == 11 && second == 0 && mode == "standby" { + //log.Println("It's a test") + watchlist := getwatchlist() + quotes.ResetforNewday(&watchlist) + paused = false + } if !showingHelp && !paused { screen.Draw(now) @@ -449,6 +498,10 @@ loop: token.Wait() } } + }else if strings.HasPrefix(msg.Topic(), "stock/response/standby"){ + //here we get the response json of totalstocks + //quotes.Sendtotalstocks() + quotes.Reloadbyjson(msg.Payload()) }else if strings.HasPrefix(msg.Topic(), "stock/response"){ fmt.Print("\033[2J") showposition(string(msg.Payload()) ,si) @@ -459,6 +512,9 @@ loop: token := client.Publish("stock/request/"+account, 0, false, jsonstr) token.Wait() } + }else if strings.HasPrefix(msg.Topic(), "stock/standby"){ + //here we reponse with json of totalstocks + quotes.Sendtotalstocks() } //time.Sleep(1 * time.Second) @@ -657,6 +713,8 @@ func main() { profile.AddDate(d.Format("2006-01-02")) } //fmt.Println("Dates:", profile.date_json) + }else if mode == "standby"{ + } screen := mop.NewScreen(profile) diff --git a/yahoo_market.go b/yahoo_market.go index 58c0697..4617422 100644 --- a/yahoo_market.go +++ b/yahoo_market.go @@ -10,6 +10,7 @@ import ( "io/ioutil" "net/http" "net/url" + "log" "easyquotation/stock" ) @@ -199,9 +200,14 @@ func (market *Market) extract(body []byte) *Market { market.Frankfurt[`latest`] = float2Str(q.LastPrice) market.Frankfurt[`percent`] = float2Str(thechangepercent) - market.Yield[`name`] = `Date` - market.Yield[`change`] = market.watchlist.Baseon + market.Yield[`name`] = `Time` + if q.Time == "" { + market.Yield[`change`] = "00:00:00" + }else{ + market.Yield[`change`] = q.Time//market.watchlist.Baseon + } market.Yield[`latest`] = "" + log.Println("here we update the market ,time is", q.Time) market.Oil = assign(results, 8, true) market.Yen = assign(results, 9, true) diff --git a/yahoo_quotes.go b/yahoo_quotes.go index 6f8fb8b..bc596bc 100644 --- a/yahoo_quotes.go +++ b/yahoo_quotes.go @@ -57,8 +57,14 @@ type stockinfo struct { Scode string Sname string Ft string + Upt string } +type recordinfo struct { + Date string + Time string + Totalstocks string +} // Quotes stores relevant pointers as well as the array of stock quotes for // the tickers we are tracking. type Quotes struct { @@ -74,6 +80,7 @@ type Quotes struct { totalstocks []stockinfo needrefresh bool addedstocks []string + Allflag bool } // Sets the initial values and returns new Quotes struct. @@ -94,6 +101,7 @@ func NewQuotes(market *Market, profile *Profile, res map[string]*stock.Stock, wa totalstocks: []stockinfo{}, upstocks: map[string]string{}, needrefresh: true, + Allflag: false, } } @@ -389,6 +397,31 @@ func padString(str string, length int) string { return str } +func (quotes *Quotes) Sendtotalstocks() { + stockdata, err := json.Marshal(quotes.totalstocks)//json.MarshalIndent(quotes.totalstocks, "", " ") + if err != nil { + fmt.Println(err) + return + } + + topic := "stock/response/standby" + + dataresp := map[string]interface{}{ + "totalstocks": string(stockdata), + "date": quotes.watchlist.Baseon, + "time": time.Now().Format("15:04:05"), + } + + jsonData, err := json.MarshalIndent(dataresp, "", " ") + if err != nil { + fmt.Println(err) + return + } + message := string(jsonData) + token := quotes.client.Publish(topic, 0, false, message) + token.Wait() +} + func (quotes *Quotes) Sendstockgraphreq(index interface{}, istime bool) { var selcode string if intvalue, ok := index.(int); ok { @@ -469,7 +502,7 @@ func (quotes *Quotes) parsereview(res map[string]*stock.Stock) (*Quotes, error) q := res[scode].Market b := res[scode].Base - quotes.totalstocks = append(quotes.totalstocks, stockinfo{scode, b.Name, q.Time}) + quotes.totalstocks = append(quotes.totalstocks, stockinfo{scode, b.Name, q.Time, q.Time}) quotes.upstocks[scode] = q.Time open, close, high, low, ndays := getnextdaysHL(scode, wamap[scode].AnalyseFrom) @@ -521,107 +554,74 @@ func (quotes *Quotes) parsereview(res map[string]*stock.Stock) (*Quotes, error) return quotes, nil } -// this will parse the json objects -func (quotes *Quotes) parse2(body []byte, res map[string]*stock.Stock) (*Quotes, error) { - // response -> quoteResponse -> result|error (array) -> map[string]interface{} - - - // Stocks has non-int things - // d := map[string]map[string][]Stock{} - // some of these are numbers vs strings - // d := map[string]map[string][]map[string]string{} - //d := map[string]map[string][]map[string]interface{}{} - //err := json.Unmarshal(body, &d) - //if err != nil { - // return nil, err - //} - //results := d["quoteResponse"]["result"] - /* - quotes.stocks = make([]Stock, len(results)) - for i, raw := range results { - result := map[string]string{} - for k, v := range raw { - switch v.(type) { - case string: - result[k] = v.(string) - case float64: - result[k] = float2Str(v.(float64)) - default: - result[k] = fmt.Sprintf("%v", v) - } - - } - quotes.stocks[i].Ticker = result["symbol"] - quotes.stocks[i].LastTrade = result["regularMarketPrice"] - quotes.stocks[i].Change = result["regularMarketChange"] - quotes.stocks[i].ChangePct = result["regularMarketChangePercent"] - quotes.stocks[i].Open = result["regularMarketOpen"] - quotes.stocks[i].Low = result["regularMarketDayLow"] - quotes.stocks[i].High = result["regularMarketDayHigh"] - quotes.stocks[i].Low52 = result["fiftyTwoWeekLow"] - quotes.stocks[i].High52 = result["fiftyTwoWeekHigh"] - quotes.stocks[i].Volume = result["regularMarketVolume"] - quotes.stocks[i].AvgVolume = result["averageDailyVolume10Day"] - quotes.stocks[i].PeRatio = result["trailingPE"] - // TODO calculate rt - quotes.stocks[i].PeRatioX = result["trailingPE"] - quotes.stocks[i].Dividend = result["trailingAnnualDividendRate"] - quotes.stocks[i].Yield = result["trailingAnnualDividendYield"] - quotes.stocks[i].MarketCap = result["marketCap"] - // TODO calculate rt? - quotes.stocks[i].MarketCapX = result["marketCap"] - quotes.stocks[i].Currency = result["currency"] - quotes.stocks[i].PreOpen = result["preMarketChangePercent"] - quotes.stocks[i].AfterHours = result["postMarketChangePercent"] - - fmt.Println(i) - fmt.Println("-------------------") - for k, v := range result { - fmt.Println(k, v) - } - fmt.Println("-------------------") - - adv, err := strconv.ParseFloat(quotes.stocks[i].Change, 64) - quotes.stocks[i].Direction = 0 - if err == nil { - if adv < 0.0 { - quotes.stocks[i].Direction = -1 - } else if adv > 0.0 { - quotes.stocks[i].Direction = 1 - } - } +func (quotes *Quotes) Reload(){ + filedata, err := ioutil.ReadFile("stocklist.json") + if err != nil { + fmt.Println(err) + return } - // Use the "http.Get" function to fetch the URL and get the response - response, err := http.Get("http://119.29.166.226/q/dayjson/2023-04-20ml.json")//("http://119.29.166.226/q/dayjson/ml.json") + var stocks []stockinfo + err = json.Unmarshal(filedata, &stocks) if err != nil { - // Handle error fmt.Println(err) + return } - defer response.Body.Close() - - //respbody, err := ioutil.ReadAll(response.Body) - //if err != nil { - // handle error - //} + quotes.totalstocks = quotes.totalstocks[:0] + for _, item := range quotes.profile.Tickers {//profile stock to trace + if _, ok := quotes.res[item]; ok { + quotes.totalstocks = append(quotes.totalstocks, stockinfo{item, quotes.res[item].Base.Name, "09:00:00", "09:00:00"}) + quotes.upstocks["sh600000"] = "09:00:00" + } + } + quotes.totalstocks = append(quotes.totalstocks, stocks...) + for _, item := range stocks { + quotes.upstocks[item.Scode] = item.Upt + } + quotes.stocks = nil +} - // Use the "json" package to decode the response body into a JSON object +func (quotes *Quotes) Reloadbyjson(payload []byte){ + /*filedata, err := ioutil.ReadFile("stocklist0616.json") + if err != nil { + fmt.Println(err) + return + }*/ - var watchlist Watchlist - var scodes []string - err = json.NewDecoder(response.Body).Decode(&watchlist) + var records recordinfo + err := json.Unmarshal(payload, &records) if err != nil { - // Handle error fmt.Println(err) + return } - - //var data Data - //err = json.Unmarshal(respbody, &data) + var stocks []stockinfo + err = json.Unmarshal([]byte(records.Totalstocks), &stocks) if err != nil { - // Handle error fmt.Println(err) + return } - */ + quotes.totalstocks = quotes.totalstocks[:0] + for _, item := range quotes.profile.Tickers {//profile stock to trace + if _, ok := quotes.res[item]; ok { + quotes.totalstocks = append(quotes.totalstocks, stockinfo{item, quotes.res[item].Base.Name, "09:00:00", "09:00:00"}) + quotes.upstocks["sh600000"] = "09:00:00" + } + } + quotes.totalstocks = append(quotes.totalstocks, stocks...) + for _, item := range stocks { + quotes.upstocks[item.Scode] = item.Upt + } + quotes.stocks = nil +} + +func (quotes* Quotes) ResetforNewday(watchlist *Watchlist) { + quotes.totalstocks = quotes.totalstocks[:0] + quotes.watchlist = watchlist + quotes.upstocks = map[string]string{} +} + +// this will parse the json objects +func (quotes *Quotes) parse2(body []byte, res map[string]*stock.Stock) (*Quotes, error) { var scodes []string wamap := make(map[string]WatchlistItem, len(quotes.watchlist.Watchlist)) for _, item := range quotes.watchlist.Watchlist { @@ -633,8 +633,10 @@ func (quotes *Quotes) parse2(body []byte, res map[string]*stock.Stock) (*Quotes, if _, ok := res[item.Scode]; ok { //fmt.Println(item.Scode) q := res[item.Scode].Market + isin, _ := contains(quotes.totalstocks, item.Scode) //fmt.Println(q.Name, q.PreClose , q.LastPrice ,q.LastPrice , enterPrice) - if q.PreClose < q.LastPrice && q.LastPrice >= enterPrice && q.PreClose < enterPrice{ + if ((q.PreClose < q.LastPrice && q.LastPrice >= enterPrice && q.PreClose < enterPrice )|| + isin == true && quotes.Allflag == true){ //fmt.Println(enterPrice) scodes = append(scodes, item.Scode) //fmt.Println(scodes) @@ -671,7 +673,7 @@ func (quotes *Quotes) parse2(body []byte, res map[string]*stock.Stock) (*Quotes, isin, index := contains(quotes.totalstocks, scode) if isin == false { - quotes.totalstocks = append(quotes.totalstocks, stockinfo{scode, q.Name, q.Time}) + quotes.totalstocks = append(quotes.totalstocks, stockinfo{scode, q.Name, q.Time, q.Time}) quotes.upstocks[scode] = q.Time }else { @@ -680,6 +682,7 @@ func (quotes *Quotes) parse2(body []byte, res map[string]*stock.Stock) (*Quotes, diff := gettimediff(quotes.totalstocks[index].Ft, q.Time) if diff > time.Hour { quotes.upstocks[scode] = q.Time + quotes.totalstocks[index].Upt = q.Time } quotes.totalstocks[index].Ft = q.Time } @@ -728,6 +731,7 @@ func (quotes *Quotes) parse2(body []byte, res map[string]*stock.Stock) (*Quotes, quotes.stocks[i].AvgVolume = quotes.upstocks[scode] quotes.stocks[i].Dividend = b.Symbol + quotes.stocks[i].PeRatio = quotes.watchlist.Baseon[5:] if _, ok := wamap[scode]; ok { strprice, _ := strconv.ParseFloat(wamap[scode].Enterprice, 64) stdchange := q.LastPrice - strprice