Add 30 day percent change column

pull/94/head
Miguel Mota 3 years ago
parent d8cbc89e5c
commit 7fa0af0fa3

@ -27,6 +27,7 @@ func ActionsMap() map[string]bool {
"sort_column_24h_change": true,
"sort_column_24h_volume": true,
"sort_column_7d_change": true,
"sort_column_30d_change": true,
"sort_column_asc": true,
"sort_column_available_supply": true,
"sort_column_desc": true,

@ -15,6 +15,7 @@ type Coin struct {
PercentChange1H float64
PercentChange24H float64
PercentChange7D float64
PercentChange30D float64
LastUpdated string
// for favorites
Favorite bool

@ -9,6 +9,23 @@ import (
"github.com/miguelmota/cointop/pkg/table"
)
// SupportedCoinTableHeaders are all the supported coin table header columns
var SupportedCoinTableHeaders = []string{
"rank",
"name",
"symbol",
"price",
"1h_change",
"24h_change",
"7d_change",
"30d_change",
"24h_volume",
"market_cap",
"total_supply",
"available_supply",
"last_updated",
}
// DefaultCoinTableHeaders are the default coin table header columns
var DefaultCoinTableHeaders = []string{
"rank",
@ -27,7 +44,7 @@ var DefaultCoinTableHeaders = []string{
// ValidCoinsTableHeader returns true if it's a valid table header name
func (ct *Cointop) ValidCoinsTableHeader(name string) bool {
for _, v := range DefaultCoinTableHeaders {
for _, v := range SupportedCoinTableHeaders {
if v == name {
return true
}
@ -183,6 +200,25 @@ func (ct *Cointop) GetCoinsTable() *table.Table {
Color: color7d,
Text: text,
})
case "30d_change":
color30d := ct.colorscheme.TableColumnChange
if coin.PercentChange30D > 0 {
color30d = ct.colorscheme.TableColumnChangeUp
}
if coin.PercentChange30D < 0 {
color30d = ct.colorscheme.TableColumnChangeDown
}
text := fmt.Sprintf("%.2f%%", coin.PercentChange30D)
ct.SetTableColumnWidthFromString(header, text)
ct.SetTableColumnAlignLeft(header, false)
rowCells = append(rowCells,
&table.RowCell{
LeftMargin: leftMargin,
RightMargin: rightMargin,
LeftAlign: false,
Color: color30d,
Text: text,
})
case "market_cap":
text := humanize.Commaf(coin.MarketCap)
ct.SetTableColumnWidthFromString(header, text)

@ -319,7 +319,7 @@ func (ct *Cointop) loadTableColumnsFromConfig() error {
for _, ifc := range ifcs {
if v, ok := ifc.(string); ok {
if !ct.ValidCoinsTableHeader(v) {
return fmt.Errorf("invalid table header name %q. Valid names are: %s", v, strings.Join(DefaultCoinTableHeaders, ","))
return fmt.Errorf("invalid table header name %q. Valid names are: %s", v, strings.Join(SupportedCoinTableHeaders, ","))
}
columns = append(columns, v)
}
@ -500,7 +500,7 @@ func (ct *Cointop) loadFavoritesFromConfig() error {
continue
}
if !ct.ValidCoinsTableHeader(col) {
return fmt.Errorf("invalid table header name %q. Valid names are: %s", col, strings.Join(DefaultCoinTableHeaders, ","))
return fmt.Errorf("invalid table header name %q. Valid names are: %s", col, strings.Join(SupportedCoinTableHeaders, ","))
}
columns = append(columns, col)
}
@ -524,7 +524,7 @@ func (ct *Cointop) loadPortfolioFromConfig() error {
for _, ifc := range ifcs {
if v, ok := ifc.(string); ok {
if !ct.ValidPortfolioTableHeader(v) {
return fmt.Errorf("invalid table header name %q. Valid names are: %s", v, strings.Join(DefaultPortfolioTableHeaders, ","))
return fmt.Errorf("invalid table header name %q. Valid names are: %s", v, strings.Join(SupportedPortfolioTableHeaders, ","))
}
columns = append(columns, v)
}

@ -37,6 +37,7 @@ func DefaultShortcuts() map[string]string {
"0": "first_page",
"1": "sort_column_1h_change",
"2": "sort_column_24h_change",
"3": "sort_column_30d_change",
"7": "sort_column_7d_change",
"a": "sort_column_available_supply",
"b": "sort_column_balance",

@ -225,6 +225,8 @@ func (ct *Cointop) Keybindings(g *gocui.Gui) error {
fn = ct.Sortfn("24h_change", true)
case "sort_column_7d_change":
fn = ct.Sortfn("7d_change", true)
case "sort_column_30d_change":
fn = ct.Sortfn("30d_change", true)
case "sort_column_available_supply":
fn = ct.Sortfn("available_supply", true)
case "toggle_row_chart":

@ -90,6 +90,7 @@ func (ct *Cointop) processCoins(coins []types.Coin) {
PercentChange1H: v.PercentChange1H,
PercentChange24H: v.PercentChange24H,
PercentChange7D: v.PercentChange7D,
PercentChange30D: v.PercentChange30D,
LastUpdated: v.LastUpdated,
})
if ilast != nil {
@ -139,6 +140,7 @@ func (ct *Cointop) processCoins(coins []types.Coin) {
c.PercentChange1H = cm.PercentChange1H
c.PercentChange24H = cm.PercentChange24H
c.PercentChange7D = cm.PercentChange7D
c.PercentChange30D = cm.PercentChange30D
c.LastUpdated = cm.LastUpdated
c.Favorite = cm.Favorite
}

@ -17,6 +17,22 @@ import (
"github.com/miguelmota/cointop/pkg/table"
)
// SupportedPortfolioTableHeaders are all the supported portfolio table header columns
var SupportedPortfolioTableHeaders = []string{
"rank",
"name",
"symbol",
"price",
"holdings",
"balance",
"1h_change",
"24h_change",
"7d_change",
"30d_change",
"percent_holdings",
"last_updated",
}
// DefaultPortfolioTableHeaders are the default portfolio table header columns
var DefaultPortfolioTableHeaders = []string{
"rank",
@ -34,7 +50,7 @@ var DefaultPortfolioTableHeaders = []string{
// ValidPortfolioTableHeader returns the portfolio table headers
func (ct *Cointop) ValidPortfolioTableHeader(name string) bool {
for _, v := range DefaultPortfolioTableHeaders {
for _, v := range SupportedPortfolioTableHeaders {
if v == name {
return true
}
@ -202,6 +218,25 @@ func (ct *Cointop) GetPortfolioTable() *table.Table {
Color: color7d,
Text: text,
})
case "30d_change":
color30d := ct.colorscheme.TableColumnChange
if coin.PercentChange30D > 0 {
color30d = ct.colorscheme.TableColumnChangeUp
}
if coin.PercentChange30D < 0 {
color30d = ct.colorscheme.TableColumnChangeDown
}
text := fmt.Sprintf("%.2f%%", coin.PercentChange30D)
ct.SetTableColumnWidthFromString(header, text)
ct.SetTableColumnAlignLeft(header, false)
rowCells = append(rowCells,
&table.RowCell{
LeftMargin: leftMargin,
RightMargin: rightMargin,
LeftAlign: false,
Color: color30d,
Text: text,
})
case "percent_holdings":
percentHoldings := (coin.Balance / total) * 1e2
if math.IsNaN(percentHoldings) {

@ -57,6 +57,8 @@ func (ct *Cointop) Sort(sortBy string, desc bool, list []*Coin, renderHeaders bo
return a.PercentChange24H < b.PercentChange24H
case "7d_change":
return a.PercentChange7D < b.PercentChange7D
case "30d_change":
return a.PercentChange30D < b.PercentChange30D
case "total_supply":
return a.TotalSupply < b.TotalSupply
case "available_supply":

@ -90,6 +90,11 @@ var HeaderColumns = map[string]*HeaderColumn{
Label: "[7]D%",
PlainLabel: "7D%",
},
"30d_change": &HeaderColumn{
Slug: "30d_change",
Label: "[3]0D%",
PlainLabel: "30D%",
},
"total_supply": &HeaderColumn{
Slug: "total_supply",
Label: "[t]otal supply",

@ -50,7 +50,12 @@ func (s *Service) getPaginatedCoinData(convert string, offset int, names []strin
page := offset + 1 // page starts at 1
sparkline := false
pcp := geckoTypes.PriceChangePercentageObject
priceChangePercentage := []string{pcp.PCP1h, pcp.PCP24h, pcp.PCP7d}
priceChangePercentage := []string{
pcp.PCP1h,
pcp.PCP24h,
pcp.PCP7d,
pcp.PCP30d,
}
order := geckoTypes.OrderTypeObject.MarketCapDesc
convertTo := strings.ToLower(convert)
if convertTo == "" {
@ -79,18 +84,20 @@ func (s *Service) getPaginatedCoinData(convert string, offset int, names []strin
var percentChange1H float64
var percentChange24H float64
var percentChange7D float64
var percentChange30D float64
if item.PriceChangePercentage1hInCurrency != nil {
percentChange1H = *item.PriceChangePercentage1hInCurrency
}
if item.PriceChangePercentage24hInCurrency != nil {
percentChange24H = *item.PriceChangePercentage24hInCurrency
}
if item.PriceChangePercentage7dInCurrency != nil {
percentChange7D = *item.PriceChangePercentage7dInCurrency
}
if item.PriceChangePercentage30dInCurrency != nil {
percentChange30D = *item.PriceChangePercentage30dInCurrency
}
availableSupply := item.CirculatingSupply
totalSupply := item.TotalSupply
@ -110,6 +117,7 @@ func (s *Service) getPaginatedCoinData(convert string, offset int, names []strin
PercentChange1H: util.FormatPercentChange(percentChange1H),
PercentChange24H: util.FormatPercentChange(percentChange24H),
PercentChange7D: util.FormatPercentChange(percentChange7D),
PercentChange30D: util.FormatPercentChange(percentChange30D),
Volume24H: util.FormatVolume(item.TotalVolume),
LastUpdated: util.FormatLastUpdated(item.LastUpdated),
})

@ -14,6 +14,7 @@ type Coin struct {
PercentChange1H float64 `json:"percentChange1H"`
PercentChange24H float64 `json:"percentChange24H"`
PercentChange7D float64 `json:"percentChange7D"`
PercentChange30D float64 `json:"percentChange30D"`
LastUpdated string `json:"lastUpdated"`
}

Loading…
Cancel
Save