Added market update goroutine

master
Michael Dvorkin 11 years ago
parent 76fef0ee0a
commit 327c3e256d
  1. 278
      dj.go
  2. 34
      lib/format.go
  3. 19
      lib/screen.go
  4. 150
      lib/yahoo_market.go
  5. 10
      lib/yahoo_quotes.go
  6. 20
      mop.go

278
dj.go

@ -0,0 +1,278 @@
// Copyright (c) 2013 by Michael Dvorkin. All Rights Reserved.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
package main
import (
"fmt"
"bytes"
"regexp"
"strings"
"text/template"
)
type Market struct {
Dow map[string]string
Nasdaq map[string]string
Sp500 map[string]string
Advances map[string]string
Declines map[string]string
Unchanged map[string]string
Highs map[string]string
Lows map[string]string
}
//-----------------------------------------------------------------------------
func main() {
html := `
...
<table id="yfimktsumm" border="0" cellspacing="0" cellpadding="0" class="rts" summary="Market Summary">
<thead>
<th class="first">Symbol</th>
<th>Last</th>
<th>Change</th>
</thead>
<tbody>
<tr class="e">
<td><a href="/q?s=%5EDJI">Dow</a></td><td class="idx">
<span id="yfs_l10_^dji">15,300.34</span></td>
<td class="cu"><span id="yfs_c10_^dji"><img width="10" height="14" style="margin-right:-2px;" border="0" src="http://l.yimg.com/os/mit/media/m/base/images/transparent-1093278.png" class="pos_arrow" alt="Up"> <b style="color:#008800;">75.65</b></span><span id="yfs_p20_^dji"><b style="color:#008800;"> (0.50%)</b></span></td>
</tr>
<tr class="">
<td><a href="/q?s=%5EIXIC">Nasdaq</a></td>
<td class="idx"><span id="yfs_l10_^ixic">3,504.26</span></td>
<td class="cu"><span id="yfs_c10_^ixic"><img width="10" height="14" style="margin-right:-2px;" border="0" src="http://l.yimg.com/os/mit/media/m/base/images/transparent-1093278.png" class="pos_arrow" alt="Up"> <b style="color:#008800;">19.43</b></span><span id="yfs_p20_^ixic"><b style="color:#008800;"> (0.56%)</b></span></td>
</tr>
<tr class="e">
<td><a href="/q?s=%5EGSPC">S&amp;P 500</a></td>
<td class="idx"><span id="yfs_l10_^gspc">1,652.32</span></td>
<td class="cu"><span id="yfs_c10_^gspc"><img width="10" height="14" style="margin-right:-2px;" border="0" src="http://l.yimg.com/os/mit/media/m/base/images/transparent-1093278.png" class="pos_arrow" alt="Up"> <b style="color:#008800;">11.86</b></span><span id="yfs_p20_^gspc"><b style="color:#008800;"> (0.72%)</b></span></td>
</tr>
<tr class="">
<td><a href="/q?s=%5ETNX">10-Yr Bond</a></td>
<td class="idx"><span id="yfs_l10_^tnx">2.63</span>%
</td>
<td class="idx"><span id="yfs_c10_^tnx"><img width="10" height="14" style="margin-right:-2px;" border="0" src="http://l.yimg.com/os/mit/media/m/base/images/transparent-1093278.png" class="neg_arrow" alt="Down"> <b style="color:#cc0000;">0.02</b></span></td>
</tr>
<tr class="e">
<td colspan="2"><a href="/q?s=%5ETV.N">NYSE Volume</a></td>
<td class="idx"><span id="yfs_lt0_^tv.n">3,490,723,250.00</span></td>
</tr>
<tr class="">
<td colspan="2"><a href="/q?s=%5ETV.O">Nasdaq Volume...</a></td>
<td class="idx"><span id="yfs_lt0_^tv.o">1,594,900,625.00</span></td>
</tr>
</tbody>
</table>
<div id="ma">
<strong>Indices:</strong> <a href="http://us.rd.yahoo.com/finance/finhome/usindices/*http://finance.yahoo.com/indices?e=dow_jones">US</a> - <a href="http://us.rd.yahoo.com/finance/finhome/worldindices/*http://finance.yahoo.com/intlindices?e=americas">World</a> | <a href="http://us.rd.yahoo.com/finance/finhome/mostactives/*http://finance.yahoo.com/actives?e=o">Most Actives</a>
</div>
</div>
</div>
<div class="tba"><h3>Advances &amp; Declines</h3></div>
<div class="ob">
<table id="yfimktsumm" border="0" cellspacing="0" cellpadding="0" class="rts">
<thead>
<th class="first">&nbsp;</th>
<th>NYSE</th>
<th>NASDAQ</th>
</thead>
<tbody>
<tr class="e">
<td class="first">Advances</td>
<td align="right">2,992
(72%)
</td>
<td align="right">1,445
(57%)
</td>
</tr>
<tr>
<td class="first">Declines</td>
<td align="right">1,040
(25%)
</td>
<td align="right">950
(38%)
</td>
</tr>
<tr class="e">
<td class="first">Unchanged</td>
<td align="right">113
(3%)
</td>
<td align="right">128
(5%)
</td>
</tr>
<tr>
<td class="first">Up Vol*</td>
<td align="right">2,582
(74%)
</td>
<td align="right">950
(60%)
</td>
</tr>
<tr class="e">
<td class="first">Down Vol*</td>
<td align="right">863
(25%)
</td>
<td align="right">625
(39%)
</td>
</tr>
<tr>
<td class="first">Unch. Vol*</td>
<td align="right">46
(1%)
</td>
<td align="right">20
(1%)
</td>
</tr>
<tr class="e">
<td class="first">New Hi's</td>
<td align="right">350</td>
<td align="right">314</td>
</tr>
<tr>
<td class="first">New Lo's</td>
<td align="right">117</td>
<td align="right">19</td>
</tr>
</tbody>
</table>
...
<table id="yfimktsumm" border="0" cellspacing="0" cellpadding="0" class="rts">
<thead>
<th class="first">NYSE</th>
<th>LAST</th>
<th>CHANGE</th>
</thead>
`
start := strings.Index(html, `<table id="yfimktsumm"`)
finish := strings.LastIndex(html, `<table id="yfimktsumm"`)
html = strings.Replace(html[start:finish], "\n", "", -1)
html = strings.Replace(html, "&amp;", "&", -1)
const any = `\s*<.+?>`
const some = `<.+?`
const space = `\s*`
const arrow = `"(Up|Down)">\s*`
const price = `([\d\.,]+)`
const percent = `\(([\d\.,%]+)\)`
regex := []string{
"(Dow)", any, price, some, arrow, any, price, some, percent, any,
"(Nasdaq)", any, price, some, arrow, any, price, some, percent, any,
"(S&P 500)", any, price, some, arrow, any, price, some, percent, any,
"(Advances)", any, price, space, percent, any, price, space, percent, any,
"(Declines)", any, price, space, percent, any, price, space, percent, any,
"(Unchanged)", any, price, space, percent, any, price, space, percent, any,
"(New Hi's)", any, price, any, price, any,
"(New Lo's)", any, price, any, price, any,
}
re := regexp.MustCompile(strings.Join(regex, ""))
matches := re.FindAllStringSubmatch(html, -1)
if len(matches) > 0 {
fmt.Printf("%d matches\n", len(matches[0]))
for i, str := range matches[0][1:] {
fmt.Printf("%d) [%s]\n", i, str)
}
} else {
println("No matches")
}
m := Market{
Dow: make(map[string]string),
Nasdaq: make(map[string]string),
Sp500: make(map[string]string),
Advances: make(map[string]string),
Declines: make(map[string]string),
Unchanged: make(map[string]string),
Highs: make(map[string]string),
Lows: make(map[string]string),
}
m.Dow[`name`] = matches[0][1]
m.Dow[`latest`] = matches[0][2]
m.Dow[`change`] = matches[0][4]
if matches[0][3] == "Up" {
m.Dow[`change`] = "+" + matches[0][4]
m.Dow[`percent`] = "+" + matches[0][5]
} else {
m.Dow[`change`] = "-" + matches[0][4]
m.Dow[`percent`] = "-" + matches[0][5]
}
m.Nasdaq[`name`] = matches[0][6]
m.Nasdaq[`latest`] = matches[0][7]
if matches[0][8] == "Up" {
m.Nasdaq[`change`] = "+" + matches[0][9]
m.Nasdaq[`percent`] = "+" + matches[0][10]
} else {
m.Nasdaq[`change`] = "-" + matches[0][9]
m.Nasdaq[`percent`] = "-" + matches[0][10]
}
m.Sp500[`name`] = matches[0][11]
m.Sp500[`latest`] = matches[0][12]
if matches[0][13] == "Up" {
m.Sp500[`change`] = "+" + matches[0][14]
m.Sp500[`percent`] = "+" + matches[0][15]
} else {
m.Sp500[`change`] = "-" + matches[0][14]
m.Sp500[`percent`] = "-" + matches[0][15]
}
m.Advances[`name`] = matches[0][16]
m.Advances[`nyse`] = matches[0][17]
m.Advances[`nysep`] = matches[0][18]
m.Advances[`nasdaq`] = matches[0][19]
m.Advances[`nasdaqp`] = matches[0][20]
m.Declines[`name`] = matches[0][21]
m.Declines[`nyse`] = matches[0][22]
m.Declines[`nysep`] = matches[0][23]
m.Declines[`nasdaq`] = matches[0][24]
m.Declines[`nasdaqp`] = matches[0][25]
m.Unchanged[`name`] = matches[0][26]
m.Unchanged[`nyse`] = matches[0][27]
m.Unchanged[`nysep`] = matches[0][28]
m.Unchanged[`nasdaq`] = matches[0][29]
m.Unchanged[`nasdaqp`] = matches[0][30]
m.Highs[`name`] = matches[0][31]
m.Highs[`nyse`] = matches[0][32]
m.Highs[`nasdaq`] = matches[0][33]
m.Lows[`name`] = matches[0][34]
m.Lows[`nyse`] = matches[0][35]
m.Lows[`nasdaq`] = matches[0][36]
fmt.Printf("%q\n", m)
println(Format(m))
}
//-----------------------------------------------------------------------------
func Format(m Market) string {
markup := `{{.Dow.name}}: {{.Dow.change}} ({{.Dow.percent}}) at {{.Dow.latest}}, `
markup += `{{.Sp500.name}}: {{.Sp500.change}} ({{.Sp500.percent}}) at {{.Sp500.latest}}, `
markup += `{{.Nasdaq.name}}: {{.Nasdaq.change}} ({{.Nasdaq.percent}}) at {{.Nasdaq.latest}}`
markup += "\n"
markup += `{{.Advances.name}}: {{.Advances.nyse}} ({{.Advances.nysep}}) on NYSE and {{.Advances.nasdaq}} ({{.Advances.nasdaqp}}) on Nasdaq. `
markup += `{{.Declines.name}}: {{.Declines.nyse}} ({{.Declines.nysep}}) on NYSE and {{.Declines.nasdaq}} ({{.Declines.nasdaqp}}) on Nasdaq`
markup += "\n"
markup += `New highs: {{.Highs.nyse}} on NYSE and {{.Highs.nasdaq}} on Nasdaq. `
markup += `New lows: {{.Lows.nyse}} on NYSE and {{.Lows.nasdaq}} on Nasdaq.`
template, err := template.New("screen").Parse(markup)
if err != nil {
panic(err)
}
buffer := new(bytes.Buffer)
err = template.Execute(buffer, m)
if err != nil {
panic(err)
}
return buffer.String()
}

@ -12,7 +12,32 @@ import (
) )
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
func Format(quotes Quotes) string { func FormatMarket(m Market) string {
markup := `{{.Dow.name}}: {{.Dow.change}} ({{.Dow.percent}}) at {{.Dow.latest}}, `
markup += `{{.Sp500.name}}: {{.Sp500.change}} ({{.Sp500.percent}}) at {{.Sp500.latest}}, `
markup += `{{.Nasdaq.name}}: {{.Nasdaq.change}} ({{.Nasdaq.percent}}) at {{.Nasdaq.latest}}`
markup += "\n"
markup += `{{.Advances.name}}: {{.Advances.nyse}} ({{.Advances.nysep}}) on NYSE and {{.Advances.nasdaq}} ({{.Advances.nasdaqp}}) on Nasdaq. `
markup += `{{.Declines.name}}: {{.Declines.nyse}} ({{.Declines.nysep}}) on NYSE and {{.Declines.nasdaq}} ({{.Declines.nasdaqp}}) on Nasdaq`
markup += "\n"
markup += `New highs: {{.Highs.nyse}} on NYSE and {{.Highs.nasdaq}} on Nasdaq. `
markup += `New lows: {{.Lows.nyse}} on NYSE and {{.Lows.nasdaq}} on Nasdaq.`
template, err := template.New("market").Parse(markup)
if err != nil {
panic(err)
}
buffer := new(bytes.Buffer)
err = template.Execute(buffer, m)
if err != nil {
panic(err)
}
return buffer.String()
}
//-----------------------------------------------------------------------------
func FormatQuotes(quotes Quotes) string {
vars := struct { vars := struct {
Now string Now string
Header string Header string
@ -23,14 +48,15 @@ func Format(quotes Quotes) string {
prettify(quotes), prettify(quotes),
} }
markup := markup := `<right><white>{{.Now}}</white></right>
`Hello<right><white>{{.Now}}</white></right>
{{.Header}} {{.Header}}
{{range .Stocks}}{{.Color}}{{.Ticker}} {{.LastTrade}} {{.Change}} {{.ChangePercent}} {{.Open}} {{.Low}} {{.High}} {{.Low52}} {{.High52}} {{.Volume}} {{.AvgVolume}} {{.PeRatio}} {{.Dividend}} {{.Yield}} {{.MarketCap}} {{range .Stocks}}{{.Color}}{{.Ticker}} {{.LastTrade}} {{.Change}} {{.ChangePercent}} {{.Open}} {{.Low}} {{.High}} {{.Low52}} {{.High52}} {{.Volume}} {{.AvgVolume}} {{.PeRatio}} {{.Dividend}} {{.Yield}} {{.MarketCap}}
{{end}}...` {{end}}...`
template, err := template.New("screen").Parse(markup) template, err := template.New("quotes").Parse(markup)
if err != nil { if err != nil {
panic(err) panic(err)
} }

@ -29,15 +29,27 @@ var tags = map[string]termbox.Attribute{
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
func Draw(stocks string) { func DrawMarket() {
quotes := Get(stocks) market := GetMarket()
// for _, m := range message { // for _, m := range message {
// fmt.Printf("%s, %s, %s\n", m.Ticker, m.LastTrade, m.Change) // fmt.Printf("%s, %s, %s\n", m.Ticker, m.LastTrade, m.Change)
// } // }
// fmt.Printf("%s\n", Format(message)) // fmt.Printf("%s\n", Format(message))
drawScreen(Format(quotes)) drawScreen(FormatMarket(market))
}
//-----------------------------------------------------------------------------
func DrawQuotes(stocks string) {
quotes := GetQuotes(stocks)
// for _, m := range message {
// fmt.Printf("%s, %s, %s\n", m.Ticker, m.LastTrade, m.Change)
// }
// fmt.Printf("%s\n", Format(message))
drawScreen(FormatQuotes(quotes))
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -120,7 +132,6 @@ func drawLine(x int, y int, str string) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
func drawScreen(str string) { func drawScreen(str string) {
termbox.Clear(termbox.ColorDefault, termbox.ColorDefault)
for row, line := range strings.Split(str, "\n") { for row, line := range strings.Split(str, "\n") {
drawLine(0, row, line) drawLine(0, row, line)
} }

@ -0,0 +1,150 @@
// Copyright (c) 2013 by Michael Dvorkin. All Rights Reserved.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
package mop
import (
//"fmt"
"bytes"
"regexp"
"strings"
"net/http"
"io/ioutil"
)
type Market struct {
Dow map[string]string
Nasdaq map[string]string
Sp500 map[string]string
Advances map[string]string
Declines map[string]string
Unchanged map[string]string
Highs map[string]string
Lows map[string]string
}
const yahoo_market_url = `http://finance.yahoo.com/marketupdate/overview`
func GetMarket() Market {
response, err := http.Get(yahoo_market_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 extract(trim(body))
}
func trim(body []byte) []byte {
start := bytes.Index(body, []byte("<table id=\"yfimktsumm\""))
finish := bytes.LastIndex(body, []byte("<table id=\"yfimktsumm\""))
snippet := bytes.Replace(body[start:finish], []byte{'\n'}, []byte{}, -1)
snippet = bytes.Replace(snippet, []byte("&amp;"), []byte{'&'}, -1)
return snippet
}
func extract(snippet []byte) Market {
const any = `\s*<.+?>`
const some = `<.+?`
const space = `\s*`
const arrow = `"(Up|Down)">\s*`
const price = `([\d\.,]+)`
const percent = `\(([\d\.,%]+)\)`
regex := []string{
"(Dow)", any, price, some, arrow, any, price, some, percent, any,
"(Nasdaq)", any, price, some, arrow, any, price, some, percent, any,
"(S&P 500)", any, price, some, arrow, any, price, some, percent, any,
"(Advances)", any, price, space, percent, any, price, space, percent, any,
"(Declines)", any, price, space, percent, any, price, space, percent, any,
"(Unchanged)", any, price, space, percent, any, price, space, percent, any,
"(New Hi's)", any, price, any, price, any,
"(New Lo's)", any, price, any, price, any,
}
re := regexp.MustCompile(strings.Join(regex, ""))
matches := re.FindAllStringSubmatch(string(snippet), -1)
// if len(matches) > 0 {
// fmt.Printf("%d matches\n", len(matches[0]))
// for i, str := range matches[0][1:] {
// fmt.Printf("%d) [%s]\n", i, str)
// }
// } else {
// println("No matches")
// }
m := Market{
Dow: make(map[string]string),
Nasdaq: make(map[string]string),
Sp500: make(map[string]string),
Advances: make(map[string]string),
Declines: make(map[string]string),
Unchanged: make(map[string]string),
Highs: make(map[string]string),
Lows: make(map[string]string),
}
m.Dow[`name`] = matches[0][1]
m.Dow[`latest`] = matches[0][2]
m.Dow[`change`] = matches[0][4]
if matches[0][3] == "Up" {
m.Dow[`change`] = "+" + matches[0][4]
m.Dow[`percent`] = "+" + matches[0][5]
} else {
m.Dow[`change`] = "-" + matches[0][4]
m.Dow[`percent`] = "-" + matches[0][5]
}
m.Nasdaq[`name`] = matches[0][6]
m.Nasdaq[`latest`] = matches[0][7]
if matches[0][8] == "Up" {
m.Nasdaq[`change`] = "+" + matches[0][9]
m.Nasdaq[`percent`] = "+" + matches[0][10]
} else {
m.Nasdaq[`change`] = "-" + matches[0][9]
m.Nasdaq[`percent`] = "-" + matches[0][10]
}
m.Sp500[`name`] = matches[0][11]
m.Sp500[`latest`] = matches[0][12]
if matches[0][13] == "Up" {
m.Sp500[`change`] = "+" + matches[0][14]
m.Sp500[`percent`] = "+" + matches[0][15]
} else {
m.Sp500[`change`] = "-" + matches[0][14]
m.Sp500[`percent`] = "-" + matches[0][15]
}
m.Advances[`name`] = matches[0][16]
m.Advances[`nyse`] = matches[0][17]
m.Advances[`nysep`] = matches[0][18]
m.Advances[`nasdaq`] = matches[0][19]
m.Advances[`nasdaqp`] = matches[0][20]
m.Declines[`name`] = matches[0][21]
m.Declines[`nyse`] = matches[0][22]
m.Declines[`nysep`] = matches[0][23]
m.Declines[`nasdaq`] = matches[0][24]
m.Declines[`nasdaqp`] = matches[0][25]
m.Unchanged[`name`] = matches[0][26]
m.Unchanged[`nyse`] = matches[0][27]
m.Unchanged[`nysep`] = matches[0][28]
m.Unchanged[`nasdaq`] = matches[0][29]
m.Unchanged[`nasdaqp`] = matches[0][30]
m.Highs[`name`] = matches[0][31]
m.Highs[`nyse`] = matches[0][32]
m.Highs[`nasdaq`] = matches[0][33]
m.Lows[`name`] = matches[0][34]
m.Lows[`nyse`] = matches[0][35]
m.Lows[`nasdaq`] = matches[0][36]
return m;
}

@ -8,7 +8,6 @@ import (
"strings" "strings"
"net/http" "net/http"
"io/ioutil" "io/ioutil"
// "strings"
) )
// See http://www.gummy-stuff.org/Yahoo-data.htm // See http://www.gummy-stuff.org/Yahoo-data.htm
@ -30,7 +29,7 @@ import (
// j3: market cap rt // j3: market cap rt
// j1: market cap // j1: market cap
const yahoo_finance_url = `http://download.finance.yahoo.com/d/quotes.csv?s=%s&f=,l1c6k2oghjkva2r2rdyj3j1` 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 // "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 // "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
@ -58,12 +57,11 @@ type Quote struct {
} }
type Quotes []Quote type Quotes []Quote
// func Get(tickers []string) Quotes { func GetQuotes(tickers string) Quotes {
func Get(tickers string) Quotes {
// Format the URL and send the request. // Format the URL and send the request.
// url := fmt.Sprintf(yahoo_finance_url, strings.Join(tickers, "+")) // url := fmt.Sprintf(yahoo_quotes_url, strings.Join(tickers, "+"))
url := fmt.Sprintf(yahoo_finance_url, tickers) url := fmt.Sprintf(yahoo_quotes_url, tickers)
response, err := http.Get(url) response, err := http.Get(url)
if err != nil { if err != nil {
panic(err) panic(err)

@ -19,8 +19,9 @@ func initTermbox() {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
func mainLoop(profile string) { func mainLoop(profile string) {
keyboard_queue := make(chan termbox.Event) keyboard_queue := make(chan termbox.Event)
quotes_queue := time.NewTicker(5 * time.Second)
timestamp_queue := time.NewTicker(1 * time.Second) timestamp_queue := time.NewTicker(1 * time.Second)
quotes_queue := time.NewTicker(5 * time.Second)
market_queue := time.NewTicker(12 * time.Second)
go func() { go func() {
for { for {
@ -28,7 +29,9 @@ func mainLoop(profile string) {
} }
}() }()
mop.Draw(profile) termbox.Clear(termbox.ColorDefault, termbox.ColorDefault)
mop.DrawMarket()
mop.DrawQuotes(profile)
loop: loop:
for { for {
select { select {
@ -39,14 +42,19 @@ loop:
break loop break loop
} }
case termbox.EventResize: case termbox.EventResize:
mop.Draw(profile) termbox.Clear(termbox.ColorDefault, termbox.ColorDefault)
mop.DrawMarket()
mop.DrawQuotes(profile)
} }
case <-quotes_queue.C:
mop.Draw(profile)
case <-timestamp_queue.C: case <-timestamp_queue.C:
mop.DrawTime() mop.DrawTime()
case <-quotes_queue.C:
mop.DrawQuotes(profile)
case <-market_queue.C:
mop.DrawMarket()
} }
} }
} }

Loading…
Cancel
Save