SHOW:
|
|
- or go back to the newest paste.
| 1 | ||
| 2 | # MtGox trades history download ---------------------------------------- | |
| 3 | ||
| 4 | #official topic of the script: https://bitcointalk.org/index.php?topic=286755 | |
| 5 | #caused by mtgox issue related to server overload | |
| 6 | #the result set will contain join dataset, bitcoincharts data has fewer attribiutes | |
| 7 | #it should handle other currencies | |
| 8 | ||
| 9 | #install.packages - RUN ONLY FIRST TIME | |
| 10 | #install.packages(c('data.table','RCurl','RJSONIO','RSQLite'))
| |
| 11 | ||
| 12 | - | #loading packagesA |
| 12 | + | #loading packages |
| 13 | require(data.table) #http://cran.r-project.org/web/packages/data.table/index.html | |
| 14 | require(RCurl) #http://cran.r-project.org/web/packages/RCurl/index.html | |
| 15 | require(RJSONIO) #http://cran.r-project.org/web/packages/RJSONIO/index.html | |
| 16 | require(RSQLite) #http://cran.r-project.org/web/packages/RSQLite/index.html | |
| 17 | ||
| 18 | #params | |
| 19 | market <- 'mtgoxUSD' | |
| 20 | output_chunks <- 1000000 | |
| 21 | - | output_format <- c('csv','db') #market is also sqlite table name
|
| 21 | + | output_format <- c('csv','db') #possible values: 'csv', 'db', c('csv','db') #market is also sqlite table name
|
| 22 | csv.sep <- ';' | |
| 23 | csv.dec <- ',' | |
| 24 | ssl.verify <- FALSE #before changing to TRUE put certificate file 'ca-bundle.crt' in the working directory, by default directory of the script: http://curl.haxx.se/docs/caextract.html | |
| 25 | ||
| 26 | cat('\n',as.character(Sys.time()),': processing started',sep='')
| |
| 27 | init_time <- proc.time()[[3]] | |
| 28 | #download full history from bitcoincharts | |
| 29 | #http://bitcoincharts.com/about/markets-api/ | |
| 30 | cat('\n',as.character(Sys.time()),': downloading trades csv from bitcoincharts',sep='')
| |
| 31 | bitcoincharts_dt <- data.table(read.csv(paste0('http://api.bitcoincharts.com/v1/csv/',market,'.csv'), header = FALSE, col.names = c('date','price','amount')))
| |
| 32 | cat('\n',as.character(Sys.time()),': bitcoincharts trades downloaded',sep='')
| |
| 33 | ||
| 34 | #download most recent trades until reached time from bitcoincharts | |
| 35 | #https://bitbucket.org/nitrous/mtgox-api/#markdown-header-moneytradesfetch | |
| 36 | cat('\n',as.character(Sys.time()),': downloading recent trades from MtGox',sep='')
| |
| 37 | since <- paste0(bitcoincharts_dt[NROW(bitcoincharts_dt),date],'000000') | |
| 38 | mtgox_dt <- data.table() | |
| 39 | repeat{
| |
| 40 | mtgox_dt.batch <- fromJSON(rawToChar(getURLContent(curl = getCurlHandle(), | |
| 41 | url = paste0('https://data.mtgox.com/api/2/BTC',substring(market,6,9),'/money/trades/fetch?since=',since),
| |
| 42 | useragent = R.version.string, | |
| 43 | cainfo = 'ca-bundle.crt', | |
| 44 | ssl.verifypeer = ssl.verify, | |
| 45 | ssl.verifyhost = ssl.verify, | |
| 46 | verbose = FALSE, | |
| 47 | binary = TRUE))) | |
| 48 | if(mtgox_dt.batch[['result']] != 'success'){
| |
| 49 | cat('\n',as.character(Sys.time()),': mtgox api returns error, retrying',sep='')
| |
| 50 | next | |
| 51 | } | |
| 52 | mtgox_dt.batch <- rbindlist(mtgox_dt.batch$data) | |
| 53 | mtgox_dt <- rbindlist(list(mtgox_dt, mtgox_dt.batch)) | |
| 54 | if(NROW(mtgox_dt.batch) < 1000) break | |
| 55 | since <- mtgox_dt.batch[NROW(mtgox_dt.batch),tid] | |
| 56 | - | cat('\n',as.character(Sys.time()),': mtgox trades downloaded',sep='')
|
| 56 | + | |
| 57 | cat('\n',as.character(Sys.time()),': MtGox recent trades downloaded',sep='')
| |
| 58 | ||
| 59 | #join datasets | |
| 60 | bitcoincharts_dt <- bitcoincharts_dt[,c('date','price','amount','price_int','amount_int','tid','price_currency','item','trade_type','primary','properties') := list(date,price,amount,as.integer(NA),as.integer(NA),as.numeric(NA),as.character(NA),as.character(NA),as.character(NA),as.character(NA),as.character(NA))]
| |
| 61 | mtgox_dt <- mtgox_dt[,c('date','price','amount','price_int','amount_int','tid','price_currency','item','trade_type','primary','properties') := list(as.integer(date),as.numeric(price),as.numeric(amount),as.integer(price_int),as.integer(amount_int),as.numeric(tid),price_currency,item,trade_type,primary,properties)]
| |
| 62 | - | cat('\n',as.character(Sys.time()),': merged ',NROW(bitcoincharts_dt),' bitcoincharts rows and ',NROW(mtgox_dt),' mtgox rows, current total is ',NROW(merged_dt),' rows',sep='')
|
| 62 | + | |
| 63 | cat('\n',as.character(Sys.time()),': merged ',NROW(bitcoincharts_dt),' bitcoincharts rows and ',NROW(mtgox_dt),' MtGox rows, current total is ',NROW(merged_dt),' rows',sep='')
| |
| 64 | ||
| 65 | #output to csv | |
| 66 | if('csv' %in% output_format){
| |
| 67 | cat('\n',as.character(Sys.time()),': exporting to csv',sep='')
| |
| 68 | - | if(i == 1) write.table(merged_dt[(1+(i-1)*output_chunks):min((i*output_chunks),NROW(merged_dt))], file = paste0('trades.',market,'.csv'), row.names = FALSE, sep = csv.sep, dec = csv.dec)
|
| 68 | + | |
| 69 | - | else if(i != chunks) write.table(merged_dt[(1+(i-1)*output_chunks):(i*output_chunks)], file = paste0('trades.',market,'.csv'), append = TRUE, row.names = FALSE, sep = csv.sep, dec = csv.dec)
|
| 69 | + | |
| 70 | - | else if(i == chunks & NROW(merged_dt) > (i*output_chunks)) write.table(merged_dt[(1+(i-1)*output_chunks):(i*output_chunks)], file = paste0('trades.',market,'.csv'), append = TRUE, row.names = FALSE, sep = csv.sep, dec = csv.dec)
|
| 70 | + | if(i == 1) write.table(merged_dt[(1+(i-1)*output_chunks):min((i*output_chunks),NROW(merged_dt))], file = paste0('trades.',market,'.csv'), row.names = FALSE, sep = csv.sep, dec = csv.dec, col.names = TRUE)
|
| 71 | else if(i != chunks) write.table(merged_dt[(1+(i-1)*output_chunks):(i*output_chunks)], file = paste0('trades.',market,'.csv'), append = TRUE, row.names = FALSE, sep = csv.sep, dec = csv.dec, col.names = FALSE)
| |
| 72 | else if(i == chunks & NROW(merged_dt) > (i*output_chunks)) write.table(merged_dt[(1+(i-1)*output_chunks):(i*output_chunks)], file = paste0('trades.',market,'.csv'), append = TRUE, row.names = FALSE, sep = csv.sep, dec = csv.dec, col.names = FALSE)
| |
| 73 | } | |
| 74 | cat('\n',as.character(Sys.time()),': exported csv: ',paste0('trades.',market,'.csv'),sep='')
| |
| 75 | } | |
| 76 | ||
| 77 | #output to sqlite db | |
| 78 | if('db' %in% output_format){
| |
| 79 | db_conn <- dbConnect(SQLite(), dbname = paste0('trades.db'))
| |
| 80 | - | if(i == 1) dbWriteTable(conn = db_conn, name = market, value = merged_dt[(1+(i-1)*output_chunks):min((i*output_chunks),NROW(merged_dt))]) |
| 80 | + | cat('\n',as.character(Sys.time()),': exporting to db',sep='')
|
| 81 | - | else if(i != chunks) dbWriteTable(conn = db_conn, name = market, value = merged_dt[(1+(i-1)*output_chunks):(i*output_chunks)], append = TRUE) |
| 81 | + | |
| 82 | - | else if(i == chunks & NROW(merged_dt) > (i*output_chunks)) dbWriteTable(conn = db_conn, name = market, value = merged_dt[(1+(i-1)*output_chunks):(i*output_chunks)], append = TRUE) |
| 82 | + | |
| 83 | if(i == 1) dbWriteTable(conn = db_conn, name = market, value = merged_dt[(1+(i-1)*output_chunks):min((i*output_chunks),NROW(merged_dt))], row.names = FALSE) | |
| 84 | else if(i != chunks) dbWriteTable(conn = db_conn, name = market, value = merged_dt[(1+(i-1)*output_chunks):(i*output_chunks)], append = TRUE, row.names = FALSE) | |
| 85 | else if(i == chunks & NROW(merged_dt) > (i*output_chunks)) dbWriteTable(conn = db_conn, name = market, value = merged_dt[(1+(i-1)*output_chunks):(i*output_chunks)], append = TRUE, row.names = FALSE) | |
| 86 | } | |
| 87 | - | cat('\n',as.character(Sys.time()),': processing finished, bitcoin donation: 1BNBQw2k8u3L9DLnfLFAeHjs5vcEbGnarT',sep='') |
| 87 | + | |
| 88 | cat('\n',as.character(Sys.time()),': exported sqlite: ',paste0('trades.db'),sep='')
| |
| 89 | } | |
| 90 | cat('\n',as.character(Sys.time()),': processing finished, total time ',proc.time()[[3]] - init_time,'s., bitcoin donation: 1BNBQw2k8u3L9DLnfLFAeHjs5vcEbGnarT',sep='') |