Skip to content

Instantly share code, notes, and snippets.

@inlinechan
Last active November 29, 2018 08:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save inlinechan/dc834be0712e2a135a8dfe66002bbf66 to your computer and use it in GitHub Desktop.
Save inlinechan/dc834be0712e2a135a8dfe66002bbf66 to your computer and use it in GitHub Desktop.
get data from upbit API
package main
// Get ticker from upbit and collect high volume and acc price
import (
"encoding/json"
"fmt"
"net/http"
"sort"
"strings"
"time"
)
var myClient = &http.Client{Timeout: 10 * time.Second}
func getJson(url string, target interface{}) error {
r, err := myClient.Get(url)
if err != nil {
return err
}
defer r.Body.Close()
return json.NewDecoder(r.Body).Decode(target)
}
// [
// {
// "market": "KRW-BTC",
// "trade_date": "20181128",
// "trade_time": "130847",
// "trade_date_kst": "20181128",
// "trade_time_kst": "220847",
// "trade_timestamp": 1543410527000,
// "opening_price": 4380000,
// "high_price": 4737000,
// "low_price": 4369000,
// "trade_price": 4687000,
// "prev_closing_price": 4380000,
// "change": "RISE",
// "change_price": 307000,
// "change_rate": 0.0700913242,
// "signed_change_price": 307000,
// "signed_change_rate": 0.0700913242,
// "trade_volume": 0.012,
// "acc_trade_price": 37502863947.65828,
// "acc_trade_price_24h": 51397027822.16276,
// "acc_trade_volume": 8252.30567633,
// "acc_trade_volume_24h": 11462.58357142,
// "highest_52_week_price": 28885000,
// "highest_52_week_date": "2018-01-06",
// "lowest_52_week_price": 4126000,
// "lowest_52_week_date": "2018-11-25",
// "timestamp": 1543410527202
// }
// ]
type Ticker struct {
Market string
TradeDate string `json:"trade_date"`
TradeTime string `json:"trade_time"`
TradeDateKst string `json:"trade_date_kst"`
TradeTimeKst string `json:"trade_time_kst"`
TradeTimestamp int `json:"trade_timestamp"`
AccTradePrice float64 `json:"acc_trade_price"`
Timestamp int
}
type ByAccTradePrice []Ticker
func (a ByAccTradePrice) Len() int { return len(a) }
func (a ByAccTradePrice) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ByAccTradePrice) Less(i, j int) bool { return a[i].AccTradePrice > a[j].AccTradePrice }
type Market struct {
Market string
KoreanName string `json:"korean_name"`
EnglishName string `json:"english_name"`
}
func getMarkets(filter string) ([]Market, error) {
var markets []Market
allMarkets := new([]Market)
if err := getJson("https://api.upbit.com/v1/market/all", &allMarkets); err != nil {
return markets, err
}
for _, market := range *allMarkets {
if strings.Contains(market.Market, filter) {
// fmt.Printf("%v\n", market)
markets = append(markets, market)
}
}
return markets, nil
}
func main() {
markets, err := getMarkets("KRW-")
if err != nil {
panic(err)
}
tickers := []Ticker{}
for _, market := range markets {
marketTickers := new([]Ticker)
url := fmt.Sprintf("https://api.upbit.com/v1/ticker?markets=%s", market.Market)
if err := getJson(url, &marketTickers); err != nil {
panic(err)
}
for _, ticker := range *marketTickers {
tickers = append(tickers, ticker)
}
}
sort.Sort(ByAccTradePrice(tickers))
for _, t := range tickers {
fmt.Printf("%10s %20.1f\n", t.Market, t.AccTradePrice)
}
// KRW-BTC 19156752022.8
// KRW-ZIL 12328403294.3
// KRW-XRP 11542303393.6
// KRW-MTL 7224497961.3
// KRW-DMT 7024616676.6
// KRW-BSV 6849673936.7
// KRW-ETH 6045176120.8
// KRW-TRX 5536343683.4
// KRW-UPP 5503409086.5
// KRW-BCH 5311589778.1
// KRW-RFR 4999329607.4
// KRW-EOS 4476176705.7
// KRW-SRN 4398866287.2
// KRW-ADA 2478425292.0
// KRW-XLM 2350724271.0
// KRW-BAT 1725194899.0
// KRW-QTUM 1673531428.1
// KRW-ADT 1495507591.4
// KRW-PIVX 1195197939.6
// KRW-STORM 892033089.3
}
package main
// Get OHLC from upbit and calculate mean and std deviation
import (
"encoding/json"
"fmt"
"gonum.org/v1/gonum/stat"
"net/http"
"time"
)
var myClient = &http.Client{Timeout: 10 * time.Second}
func getJson(url string, target interface{}) error {
r, err := myClient.Get(url)
if err != nil {
return err
}
defer r.Body.Close()
return json.NewDecoder(r.Body).Decode(target)
}
// [
// {
// "market": "KRW-BTC",
// "candle_date_time_utc": "2018-11-26T22:00:00",
// "candle_date_time_kst": "2018-11-27T07:00:00",
// "opening_price": 4293000,
// "high_price": 4369000,
// "low_price": 4245000,
// "trade_price": 4316000,
// "timestamp": 1543271395981,
// "candle_acc_trade_price": 789362607.77855,
// "candle_acc_trade_volume": 183.4625497,
// "unit": 30
// }
// ]
type OHLC struct {
Market string
CandleDateTimeUtc string `json:"candle_date_time_utc"`
CandleDateTimeKst string `json:"candle_date_time_kst"`
OpeningPrice float64 `json:"opening_price"`
HighPrice float64 `json:"high_price"`
LowPrice float64 `json:"low_price"`
TradePrice float64 `json:"trade_price"`
Timestamp int64
CandleAccTradePrice float64 `json:"candle_acc_trade_price"`
CandleAccTradeVolume float64 `json:"candle_acc_trade_volume"`
Unit int
}
func main() {
ohlcs := new([]OHLC)
if err := getJson("https://api.upbit.com/v1/candles/minutes/5?market=KRW-BTC&count=200", &ohlcs); err != nil {
panic(err)
}
// for _, o := range *ohlcs {
// fmt.Printf("%v\n", o)
// }
xs := []float64{}
for _, o := range *ohlcs {
xs = append(xs, o.CandleAccTradeVolume)
}
mean, stddev := stat.MeanStdDev(xs, nil)
fmt.Printf("mean: %v, std-dev: %v\n", mean, stddev)
for i, o := range *ohlcs {
if o.CandleAccTradeVolume > mean+stddev*3 {
fmt.Printf("High volume: %d %v\n", i, o)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment