├── Credentials.py ├── Data.py ├── DataSet.py ├── MtGox.py ├── README └── main.py /Credentials.py: -------------------------------------------------------------------------------- 1 | class Credentials: 2 | def __init__(self, user, password): 3 | self.setUser(user) 4 | self.setPass(password) 5 | 6 | def setUser(self, user): 7 | self.user = user 8 | 9 | def setPass(self, password): 10 | self.password = password 11 | 12 | def getUser(self): 13 | return self.user 14 | 15 | def getPass(self): 16 | return self.password 17 | 18 | -------------------------------------------------------------------------------- /Data.py: -------------------------------------------------------------------------------- 1 | class Data: 2 | def __init__(self, usd, btc, high, low, last, vol, buy, sell, totalAskPrice, totalAskVolume, avgAskPrice, totalBidPrice, totalBidVolume, avgBidPrice): 3 | self.setUSD(usd) 4 | self.setBTC(btc) 5 | self.setHigh(high) 6 | self.setLow(low) 7 | self.setLast(last) 8 | self.setVol(vol) 9 | self.setBuy(buy) 10 | self.setSell(sell) 11 | self.setTotalAskPrice(totalAskPrice) 12 | self.setTotalAskVolume(totalAskVolume) 13 | self.setAvgAskPrice(avgAskPrice) 14 | self.setTotalBidPrice(totalBidPrice) 15 | self.setTotalBidVolume(totalBidVolume) 16 | self.setAvgBidPrice(avgBidPrice) 17 | 18 | def setBTC(self, btc): 19 | self.btc = btc 20 | 21 | def getBTC(self): 22 | return self.btc 23 | 24 | def setUSD(self, usd): 25 | self.usd = usd 26 | 27 | def getUSD(self): 28 | return self.usd 29 | 30 | def setHigh(self, high): 31 | self.high = high 32 | 33 | def getHigh(self): 34 | return self.high 35 | 36 | def setLow(self, low): 37 | self.low = low 38 | 39 | def getLow(self): 40 | return self.low 41 | 42 | def setLast(self, last): 43 | self.last = last 44 | 45 | def getVol(self): 46 | return self.vol 47 | 48 | def setVol(self, vol): 49 | self.vol = vol 50 | 51 | def getLast(self): 52 | return self.last 53 | 54 | def setBuy(self, buy): 55 | self.buy = buy 56 | 57 | def getBuy(self): 58 | return self.buy 59 | 60 | def setSell(self, sell): 61 | self.sell = sell 62 | 63 | def getSell(self): 64 | return self.sell 65 | 66 | def setTotalAskPrice(self, totalAskPrice): 67 | self.totalAskPrice = totalAskPrice 68 | 69 | def setTotalAskVolume(self, totalAskVolume): 70 | self.totalAskVolume = totalAskVolume 71 | 72 | def setAvgAskPrice(self, avgAskPrice): 73 | self.avgAskPrice = avgAskPrice 74 | 75 | def getTotalAskPrice(self): 76 | return self.totalAskPrice 77 | 78 | def getTotalAskVolume(self): 79 | return self.totalAskVolume 80 | 81 | def getAvgAskPrice(self): 82 | return self.avgAskPrice 83 | 84 | def setTotalBidPrice(self, totalBidPrice): 85 | self.totalBidPrice = totalBidPrice 86 | 87 | def setTotalBidVolume(self, totalBidVolume): 88 | self.totalBidVolume = totalBidVolume 89 | 90 | def setAvgBidPrice(self, avgBidPrice): 91 | self.avgBidPrice = avgBidPrice 92 | 93 | def getTotalBidPrice(self): 94 | return self.totalBidPrice 95 | 96 | def getTotalBidVolume(self): 97 | return self.totalBidVolume 98 | 99 | def getAvgBidPrice(self): 100 | return self.avgBidPrice 101 | 102 | -------------------------------------------------------------------------------- /DataSet.py: -------------------------------------------------------------------------------- 1 | import math 2 | from Data import Data 3 | 4 | DEFAULT_MEAN = -1 5 | DEFAULT_STDDEV = -1 6 | DEFAULT_SLOPE = 0 7 | DEFAULT_MAX_DATA = 5 8 | DEFAULT_DECIMAL_PLACES = 4 9 | 10 | UNDEFINED_SLOPE = 0 11 | 12 | class DataSet: 13 | def __init__(self): 14 | self.resetData() 15 | self.setMeans(DEFAULT_MEAN) 16 | self.setStdDevs(DEFAULT_STDDEV) 17 | self.setSlopes(DEFAULT_SLOPE) 18 | self.setMaxData(DEFAULT_MAX_DATA) 19 | 20 | def setMeans(self, mean): 21 | self.setHighMean(mean) 22 | self.setLowMean(mean) 23 | self.setBuyMean(mean) 24 | self.setSellMean(mean) 25 | self.setVolMean(mean) 26 | self.setLastMean(mean) 27 | self.setTotalAskPriceMean(mean) 28 | self.setTotalAskVolumeMean(mean) 29 | self.setAvgAskPriceMean(mean) 30 | 31 | def setMaxData(self, maxData): 32 | self.maxData = maxData 33 | 34 | def getMaxData(self): 35 | return self.maxData 36 | 37 | def setHighMean(self, highMean): 38 | self.highMean = highMean 39 | 40 | def setLowMean(self, lowMean): 41 | self.lowMean = lowMean 42 | 43 | def setBuyMean(self, buyMean): 44 | self.buyMean = buyMean 45 | 46 | def setSellMean(self, sellMean): 47 | self.sellMean = sellMean 48 | 49 | def setVolMean(self, volMean): 50 | self.volMean = volMean 51 | 52 | def setLastMean(self, lastMean): 53 | self.lastMean = lastMean 54 | 55 | def getHighMean(self): 56 | return self.highMean 57 | 58 | def getLowMean(self): 59 | return self.lowMean 60 | 61 | def getBuyMean(self): 62 | return self.buyMean 63 | 64 | def getSellMean(self): 65 | return self.sellMean 66 | 67 | def getVolMean(self): 68 | return self.volMean 69 | 70 | def getLastMean(self): 71 | return self.lastMean 72 | 73 | def getTotalAskPriceMean(self): 74 | return self.totalAskPriceMean 75 | 76 | def getTotalAskVolumeMean(self): 77 | return self.totalAskVolumeMean 78 | 79 | def getAvgAskPriceMean(self): 80 | return self.avgAskPriceMean 81 | 82 | def getTotalBidPriceMean(self): 83 | return self.totalBidPriceMean 84 | 85 | def getTotalBidVolumeMean(self): 86 | return self.totalBidVolumeMean 87 | 88 | def getAvgBidPriceMean(self): 89 | return self.avgBidPriceMean 90 | 91 | def setTotalAskPriceMean(self, totalAskPriceMean): 92 | self.totalAskPriceMean = totalAskPriceMean 93 | 94 | def setTotalAskVolumeMean(self, totalAskVolumeMean): 95 | self.totalAskVolumeMean = totalAskVolumeMean 96 | 97 | def setAvgAskPriceMean(self, avgAskPriceMean): 98 | self.avgAskPriceMean = avgAskPriceMean 99 | 100 | def setTotalBidPriceMean(self, totalBidPriceMean): 101 | self.totalBidPriceMean = totalBidPriceMean 102 | 103 | def setTotalBidVolumeMean(self, totalBidVolumeMean): 104 | self.totalBidVolumeMean = totalBidVolumeMean 105 | 106 | def setAvgBidPriceMean(self, avgBidPriceMean): 107 | self.avgBidPriceMean = avgBidPriceMean 108 | 109 | 110 | def setStdDevs(self, stdDev): 111 | self.setHighStdDev(stdDev) 112 | self.setLowStdDev(stdDev) 113 | self.setBuyStdDev(stdDev) 114 | self.setSellStdDev(stdDev) 115 | self.setVolStdDev(stdDev) 116 | self.setLastStdDev(stdDev) 117 | self.setTotalAskPriceStdDev(stdDev) 118 | self.setTotalAskVolumeStdDev(stdDev) 119 | self.setAvgAskPriceStdDev(stdDev) 120 | 121 | def getTotalAskPriceStdDev(self): 122 | return self.totalAskPriceStdDev 123 | 124 | def getTotalAskVolumeStdDev(self): 125 | return self.totalAskVolumeStdDev 126 | 127 | def getAvgAskPriceStdDev(self): 128 | return self.avgAskPriceStdDev 129 | 130 | def setTotalAskPriceStdDev(self, totalAskPriceStdDev): 131 | self.totalAskPriceStdDev = totalAskPriceStdDev 132 | 133 | def setTotalAskVolumeStdDev(self, totalAskVolumeStdDev): 134 | self.totalAskVolumeStdDev = totalAskVolumeStdDev 135 | 136 | def setAvgAskPriceStdDev(self, avgAskPriceStdDev): 137 | self.avgAskPriceStdDev = avgAskPriceStdDev 138 | 139 | def getTotalBidPriceStdDev(self): 140 | return self.totalBidPriceStdDev 141 | 142 | def getTotalBidVolumeStdDev(self): 143 | return self.totalBidVolumeStdDev 144 | 145 | def getAvgBidPriceStdDev(self): 146 | return self.avgBidPriceStdDev 147 | 148 | def setTotalBidPriceStdDev(self, totalBidPriceStdDev): 149 | self.totalBidPriceStdDev = totalBidPriceStdDev 150 | 151 | def setTotalBidVolumeStdDev(self, totalBidVolumeStdDev): 152 | self.totalBidVolumeStdDev = totalBidVolumeStdDev 153 | 154 | def setAvgBidPriceStdDev(self, avgBidPriceStdDev): 155 | self.avgBidPriceStdDev = avgBidPriceStdDev 156 | 157 | def setHighStdDev(self, highStdDev): 158 | self.highStdDev = highStdDev 159 | 160 | def setLowStdDev(self, lowStdDev): 161 | self.lowStdDev = lowStdDev 162 | 163 | def setBuyStdDev(self, buyStdDev): 164 | self.buyStdDev = buyStdDev 165 | 166 | def setSellStdDev(self, sellStdDev): 167 | self.sellStdDev = sellStdDev 168 | 169 | def setVolStdDev(self, volStdDev): 170 | self.volStdDev = volStdDev 171 | 172 | def setLastStdDev(self, lastStdDev): 173 | self.lastStdDev = lastStdDev 174 | 175 | def getHighStdDev(self): 176 | return self.highStdDev 177 | 178 | def getLowStdDev(self): 179 | return self.lowStdDev 180 | 181 | def getBuyStdDev(self): 182 | return self.buyStdDev 183 | 184 | def getSellStdDev(self): 185 | return self.sellStdDev 186 | 187 | def getVolStdDev(self): 188 | return self.volStdDev 189 | 190 | def getLastStdDev(self): 191 | return self.lastStdDev 192 | 193 | def setSlopes(self, slope): 194 | self.setHighSlope(slope) 195 | self.setLowSlope(slope) 196 | self.setBuySlope(slope) 197 | self.setSellSlope(slope) 198 | self.setVolSlope(slope) 199 | self.setLastSlope(slope) 200 | self.setTotalAskPriceSlope(slope) 201 | self.setTotalAskVolumeSlope(slope) 202 | self.setAvgAskPriceSlope(slope) 203 | 204 | def getTotalAskPriceSlope(self): 205 | return self.totalAskPriceSlope 206 | 207 | def getTotalAskVolumeSlope(self): 208 | return self.totalAskVolumeSlope 209 | 210 | def getAvgAskPriceSlope(self): 211 | return self.avgAskPriceSlope 212 | 213 | def setTotalAskPriceSlope(self, totalAskPriceSlope): 214 | self.totalAskPriceSlope = totalAskPriceSlope 215 | 216 | def setTotalAskVolumeSlope(self, totalAskVolumeSlope): 217 | self.totalAskVolumeSlope = totalAskVolumeSlope 218 | 219 | def setAvgAskPriceSlope(self, avgAskPriceSlope): 220 | self.avgAskPriceSlope = avgAskPriceSlope 221 | 222 | def getTotalBidPriceSlope(self): 223 | return self.totalBidPriceSlope 224 | 225 | def getTotalBidVolumeSlope(self): 226 | return self.totalBidVolumeSlope 227 | 228 | def getAvgBidPriceSlope(self): 229 | return self.avgBidPriceSlope 230 | 231 | def setTotalBidPriceSlope(self, totalBidPriceSlope): 232 | self.totalBidPriceSlope = totalBidPriceSlope 233 | 234 | def setTotalBidVolumeSlope(self, totalBidVolumeSlope): 235 | self.totalBidVolumeSlope = totalBidVolumeSlope 236 | 237 | def setAvgBidPriceSlope(self, avgBidPriceSlope): 238 | self.avgBidPriceSlope = avgBidPriceSlope 239 | 240 | def setHighSlope(self, highSlope): 241 | self.highSlope = highSlope 242 | 243 | def setLowSlope(self, lowSlope): 244 | self.lowSlope = lowSlope 245 | 246 | def setBuySlope(self, buySlope): 247 | self.buySlope = buySlope 248 | 249 | def setSellSlope(self, sellSlope): 250 | self.sellSlope = sellSlope 251 | 252 | def setVolSlope(self, volSlope): 253 | self.volSlope = volSlope 254 | 255 | def setLastSlope(self, lastSlope): 256 | self.lastSlope = lastSlope 257 | 258 | def getHighSlope(self): 259 | return self.highSlope 260 | 261 | def getLowSlope(self): 262 | return self.lowSlope 263 | 264 | def getBuySlope(self): 265 | return self.buySlope 266 | 267 | def getSellSlope(self): 268 | return self.sellSlope 269 | 270 | def getVolSlope(self): 271 | return self.volSlope 272 | 273 | def getLastSlope(self): 274 | return self.lastSlope 275 | 276 | def empty(self): 277 | return self.dataCount == 0 278 | 279 | def getDataCount(self): 280 | return len(self.getData()) 281 | 282 | def getData(self): 283 | return self.data 284 | 285 | def resetData(self): 286 | if hasattr(self, 'data'): 287 | del self.data[:] 288 | else: 289 | self.data = [] 290 | 291 | def setData(self, data): 292 | self.data = data 293 | 294 | def addData(self, data): 295 | self.data.append(data) 296 | if self.getDataCount() > self.getMaxData(): 297 | self.truncData() 298 | self.doCalcs() 299 | 300 | def truncData(self): 301 | self.setData(self.getData()[1:]) 302 | 303 | def doCalcs(self): 304 | self.calcMeans() 305 | self.calcStdDevs() 306 | self.calcSlopes() 307 | 308 | def calcMeans(self): 309 | self.calcHighMean() 310 | self.calcLowMean() 311 | self.calcBuyMean() 312 | self.calcSellMean() 313 | self.calcVolMean() 314 | self.calcLastMean() 315 | self.calcTotalAskPriceMean() 316 | self.calcTotalAskVolumeMean() 317 | self.calcAvgAskPriceMean() 318 | self.calcTotalBidPriceMean() 319 | self.calcTotalBidVolumeMean() 320 | self.calcAvgBidPriceMean() 321 | 322 | def calcTotalAskPriceMean(self): 323 | self.setTotalAskPriceMean(self.getMean([x.getTotalAskPrice() for x in self.getData()])) 324 | 325 | def calcTotalAskVolumeMean(self): 326 | self.setTotalAskVolumeMean(self.getMean([x.getTotalAskVolume() for x in self.getData()])) 327 | 328 | def calcAvgAskPriceMean(self): 329 | self.setAvgAskPriceMean(self.getMean([x.getAvgAskPrice() for x in self.getData()])) 330 | 331 | def calcTotalBidPriceMean(self): 332 | self.setTotalBidPriceMean(self.getMean([x.getTotalBidPrice() for x in self.getData()])) 333 | 334 | def calcTotalBidVolumeMean(self): 335 | self.setTotalBidVolumeMean(self.getMean([x.getTotalBidVolume() for x in self.getData()])) 336 | 337 | def calcAvgBidPriceMean(self): 338 | self.setAvgBidPriceMean(self.getMean([x.getAvgBidPrice() for x in self.getData()])) 339 | 340 | def calcHighMean(self): 341 | self.setHighMean(self.getMean([x.getHigh() for x in self.getData()])) 342 | 343 | def calcLowMean(self): 344 | self.setLowMean(self.getMean([x.getLow() for x in self.getData()])) 345 | 346 | def calcBuyMean(self): 347 | self.setBuyMean(self.getMean([x.getBuy() for x in self.getData()])) 348 | 349 | def calcSellMean(self): 350 | self.setSellMean(self.getMean([x.getSell() for x in self.getData()])) 351 | 352 | def calcVolMean(self): 353 | self.setVolMean(self.getMean([x.getVol() for x in self.getData()])) 354 | 355 | def calcLastMean(self): 356 | self.setLastMean(self.getMean([x.getLast() for x in self.getData()])) 357 | 358 | def getMean(self, values): 359 | return float(sum(values))/len(values) 360 | 361 | def calcStdDevs(self): 362 | self.calcHighStdDev() 363 | self.calcLowStdDev() 364 | self.calcBuyStdDev() 365 | self.calcSellStdDev() 366 | self.calcVolStdDev() 367 | self.calcLastStdDev() 368 | self.calcTotalAskPriceStdDev() 369 | self.calcTotalAskVolumeStdDev() 370 | self.calcAvgAskPriceStdDev() 371 | self.calcTotalBidPriceStdDev() 372 | self.calcTotalBidVolumeStdDev() 373 | self.calcAvgBidPriceStdDev() 374 | 375 | def calcTotalAskPriceStdDev(self): 376 | self.setTotalAskPriceStdDev(self.getStdDev([x.getTotalAskPrice() for x in self.getData()])) 377 | 378 | def calcTotalAskVolumeStdDev(self): 379 | self.setTotalAskVolumeStdDev(self.getStdDev([x.getTotalAskVolume() for x in self.getData()])) 380 | 381 | def calcAvgAskPriceStdDev(self): 382 | self.setAvgAskPriceStdDev(self.getStdDev([x.getAvgAskPrice() for x in self.getData()])) 383 | 384 | def calcTotalBidPriceStdDev(self): 385 | self.setTotalBidPriceStdDev(self.getStdDev([x.getTotalBidPrice() for x in self.getData()])) 386 | 387 | def calcTotalBidVolumeStdDev(self): 388 | self.setTotalBidVolumeStdDev(self.getStdDev([x.getTotalBidVolume() for x in self.getData()])) 389 | 390 | def calcAvgBidPriceStdDev(self): 391 | self.setAvgBidPriceStdDev(self.getStdDev([x.getAvgBidPrice() for x in self.getData()])) 392 | 393 | def calcHighStdDev(self): 394 | self.setHighStdDev(self.getStdDev([x.getHigh() for x in self.getData()])) 395 | 396 | def calcLowStdDev(self): 397 | self.setLowStdDev(self.getStdDev([x.getLow() for x in self.getData()])) 398 | 399 | def calcBuyStdDev(self): 400 | self.setBuyStdDev(self.getStdDev([x.getBuy() for x in self.getData()])) 401 | 402 | def calcSellStdDev(self): 403 | self.setSellStdDev(self.getStdDev([x.getSell() for x in self.getData()])) 404 | 405 | def calcVolStdDev(self): 406 | self.setVolStdDev(self.getStdDev([x.getVol() for x in self.getData()])) 407 | 408 | def calcLastStdDev(self): 409 | self.setLastStdDev(self.getStdDev([x.getLast() for x in self.getData()])) 410 | 411 | def getStdDev(self, values): 412 | mean = self.getMean(values) 413 | return math.sqrt(sum((x-mean)**2 for x in values)/len(values)) 414 | 415 | def calcSlopes(self): 416 | self.calcHighSlope() 417 | self.calcLowSlope() 418 | self.calcBuySlope() 419 | self.calcSellSlope() 420 | self.calcVolSlope() 421 | self.calcLastSlope() 422 | self.calcTotalBidPriceSlope() 423 | self.calcTotalBidVolumeSlope() 424 | self.calcAvgBidPriceSlope() 425 | 426 | def calcTotalAskPriceSlope(self): 427 | self.setTotalAskPriceSlope(self.getSlope([x.getTotalAskPrice() for x in self.getData()])) 428 | 429 | def calcTotalAskVolumeSlope(self): 430 | self.setTotalAskVolumeSlope(self.getSlope([x.getTotalAskVolume() for x in self.getData()])) 431 | 432 | def calcAvgAskPriceSlope(self): 433 | self.setAvgAskPriceSlope(self.getSlope([x.getAvgAskPrice() for x in self.getData()])) 434 | 435 | def calcTotalBidPriceSlope(self): 436 | self.setTotalBidPriceSlope(self.getSlope([x.getTotalBidPrice() for x in self.getData()])) 437 | 438 | def calcTotalBidVolumeSlope(self): 439 | self.setTotalBidVolumeSlope(self.getSlope([x.getTotalBidVolume() for x in self.getData()])) 440 | 441 | def calcAvgBidPriceSlope(self): 442 | self.setAvgBidPriceSlope(self.getSlope([x.getAvgBidPrice() for x in self.getData()])) 443 | 444 | def calcHighSlope(self): 445 | self.setHighSlope(self.getSlope([x.getHigh() for x in self.getData()])) 446 | 447 | def calcLowSlope(self): 448 | self.setLowSlope(self.getSlope([x.getLow() for x in self.getData()])) 449 | 450 | def calcBuySlope(self): 451 | self.setBuySlope(self.getSlope([x.getBuy() for x in self.getData()])) 452 | 453 | def calcSellSlope(self): 454 | self.setSellSlope(self.getSlope([x.getSell() for x in self.getData()])) 455 | 456 | def calcVolSlope(self): 457 | self.setVolSlope(self.getSlope([x.getVol() for x in self.getData()])) 458 | 459 | def calcLastSlope(self): 460 | self.setLastSlope(self.getSlope([x.getLast() for x in self.getData()])) 461 | 462 | def getSlope(self, values): 463 | points = [] 464 | for i in range(len(values)): 465 | points.append({'x':i, 'y':values[i]}) 466 | n = len(values) 467 | sx = sum([x['x'] for x in points]) 468 | sy = sum([x['y'] for x in points]) 469 | sxy = sum([x['x']*x['y'] for x in points]) 470 | sxx = sum([x['x']*x['x'] for x in points]) 471 | delta = (n*sxx)-(sx**2) 472 | if delta == 0: 473 | return UNDEFINED_SLOPE 474 | return ((n*sxy)-(sx*sy))/delta 475 | 476 | def prnt(self, tag, v, delta): 477 | print self.addSpaces(self.addSpaces(self.addSpaces(" | %s | %.2f" % (tag, v[0]), v[0], delta) + (" %.2f" % (v[1])), v[1], delta) + (" %+.2f" % (v[2])), v[2], delta) 478 | 479 | def prntVol(self, tag, v, delta1, delta2, delta3): 480 | print self.addSpaces(self.addSpaces(self.addSpaces(" | %s | %d" % (tag, v[0]), v[0], delta1) + (" %.2f" % (v[1])), v[1], delta2) + (" %+.2f" % (v[2])), v[2], delta3) 481 | 482 | def prntDepth(self, tag, v, delta): 483 | print self.addSpaces(self.addSpaces(self.addSpaces(" | %s | %d" % (tag, v[0]), v[0], delta) + (" %d" % (v[1])), v[1], delta) + (" %+d" % (v[2])), v[2], delta) 484 | 485 | def addSpaces(self, base, value, delta): 486 | if int(value) == 0: 487 | dec = 0 488 | else: 489 | if value < 0: 490 | dec = int(math.log(int(-1*value),10)) 491 | else: 492 | dec = int(math.log(int(value),10)) 493 | for i in range(delta - dec): 494 | base += " " 495 | return base + "|" 496 | 497 | def printHigh(self): 498 | self.prnt("High ", [self.getHighMean(), self.getHighStdDev(), self.getHighSlope()], 4) 499 | 500 | def printLow(self): 501 | self.prnt("Low ", [self.getLowMean(), self.getLowStdDev(), self.getLowSlope()], 4) 502 | 503 | def printBuy(self): 504 | self.prnt("Buy ", [self.getBuyMean(), self.getBuyStdDev(), self.getBuySlope()], 4) 505 | 506 | def printSell(self): 507 | self.prnt("Sell ", [self.getSellMean(), self.getSellStdDev(), self.getSellSlope()], 4) 508 | 509 | def printVol(self): 510 | self.prntVol("Vol ", [self.getVolMean(), self.getVolStdDev(), self.getVolSlope()], 7, 4, 4) 511 | 512 | def printLast(self): 513 | self.prnt("Last ", [self.getLastMean(), self.getLastStdDev(), self.getLastSlope()], 4) 514 | 515 | def printTotalAskPrice(self): 516 | self.prntDepth("Total Ask Price ", [self.getTotalAskPriceMean(), self.getTotalAskPriceStdDev(), self.getTotalAskPriceSlope()], 7) 517 | 518 | def printTotalAskVolume(self): 519 | self.prntDepth("Total Ask Volume", [self.getTotalAskVolumeMean(), self.getTotalAskVolumeStdDev(), self.getTotalAskVolumeSlope()], 7) 520 | 521 | def printAvgAskPrice(self): 522 | self.prnt("Avg Ask Price ", [self.getAvgAskPriceMean(), self.getAvgAskPriceStdDev(), self.getAvgAskPriceSlope()], 4) 523 | 524 | def printTotalBidPrice(self): 525 | self.prntDepth("Total Bid Price ", [self.getTotalBidPriceMean(), self.getTotalBidPriceStdDev(), self.getTotalBidPriceSlope()], 7) 526 | 527 | def printTotalBidVolume(self): 528 | self.prntDepth("Total Bid Volume", [self.getTotalBidVolumeMean(), self.getTotalBidVolumeStdDev(), self.getTotalBidVolumeSlope()], 7) 529 | 530 | def printAvgBidPrice(self): 531 | self.prnt("Avg Bid Price ", [self.getAvgBidPriceMean(), self.getAvgBidPriceStdDev(), self.getAvgBidPriceSlope()], 4) 532 | 533 | def printBar(self): 534 | print " |-------------------------------------------------|" 535 | 536 | def printSeperator(self): 537 | print " |=================================================|" 538 | 539 | def printHeader(self): 540 | self.printSeperator() 541 | print " | | Avg | Stdev | Slope |" 542 | self.printBar() 543 | 544 | def printData(self): 545 | self.printHeader() 546 | self.printBuy() 547 | self.printSell() 548 | self.printLast() 549 | self.printHigh() 550 | self.printLow() 551 | self.printVol() 552 | self.printAvgAskPrice() 553 | self.printTotalAskVolume() 554 | self.printTotalAskPrice() 555 | self.printAvgBidPrice() 556 | self.printTotalBidVolume() 557 | self.printTotalBidPrice() 558 | self.printSeperator() 559 | 560 | #correlation coefficients 561 | # a = [] 562 | # for i in range(len(values)): 563 | # a.append({'x':i, 'y':values[i]}) 564 | # n = len(values) 565 | # b = sum([x['x']*x['y'] for x in a]) 566 | # c = sum([x['x'] for x in a]) 567 | # d = sum([x['y'] for x in a]) 568 | # e = sum([x['x']**2 for x in a]) 569 | # f = sum([x['y']**2 for x in a]) 570 | # g = c**2 571 | # h = d**2 572 | # return (n*b-c*d)/(math.sqrt(n*e-g)*math.sqrt(n*f-h)) 573 | 574 | -------------------------------------------------------------------------------- /MtGox.py: -------------------------------------------------------------------------------- 1 | from Credentials import Credentials 2 | import urllib2 3 | import urllib 4 | import time 5 | import contextlib 6 | import math 7 | import datetime 8 | from DataSet import DataSet 9 | from Data import Data 10 | 11 | ############################################# 12 | # Change the following variables as desired # 13 | ############################################# 14 | 15 | USERNAME = "CHANGE_ME" # Mt.Gox username 16 | PASSWORD = "CHANGE_ME" # Mt.Gox password 17 | DEFAULT_SIMULATION = True # True = simulation, False = actual trading on Mt.Gox 18 | DEFAULT_BTC = 1 # Starting out amount of BTC (simulation only) 19 | DEFAULT_USD = 50 # Starting out amount of USD (simulation only) 20 | DEFAULT_PRINT = True # True = output stuff to screen, False = don't output stuff 21 | 22 | 23 | ######################################### 24 | # Don't change the following variables! # 25 | ######################################### 26 | 27 | BASE_URL = "https://mtgox.com/code/" 28 | TICKER_URL = "data/ticker.php" 29 | MARKET_DEPTH_URL = "data/getDepth.php" 30 | BUY_BTC_URL = "buyBTC.php" 31 | SELL_BTC_URL = "sellBTC.php" 32 | CANCEL_ORDER_URL = "cancelOrder.php" 33 | GET_ORDERS_URL = "getOrders.php" 34 | GET_FUNDS_URL = "getFunds.php" 35 | 36 | # Use this class to interact with Mt.Gox API 37 | class MtGox: 38 | def __init__(self): 39 | self.credentials = Credentials(USERNAME,PASSWORD) 40 | self.setBTC(self.getDefaultBTC()) 41 | self.setUSD(self.getDefaultUSD()) 42 | self.setPrint(self.getDefaultPrint()) 43 | self.setSimulation(self.getDefaultSimulation()) 44 | self.update() 45 | 46 | 47 | def printStatus(self): 48 | if self.getSimulation(): 49 | print " Status: Simulation" 50 | else: 51 | print " Status: Live" 52 | print " Username: %s" % self.getUser() 53 | 54 | def printTitle(self): 55 | print " Mt.Gox @ %s" % datetime.datetime.now().strftime("%H:%M:%S on %m/%d/%Y") 56 | 57 | # Get default simulation value 58 | def getDefaultSimulation(self): 59 | return DEFAULT_SIMULATION 60 | 61 | # Get current simulation value 62 | def getSimulation(self): 63 | return self.simulation 64 | 65 | # Set simulation value (True = simulation, False = real deal) 66 | def setSimulation(self, simulation): 67 | self.simulation = simulation 68 | 69 | # Set the print boolean (True = output to screen, False = don't output) 70 | def setPrint(self, prnt): 71 | self.canPrint = prnt 72 | 73 | # Get default BTC amount (only relevant for simulation) 74 | def getDefaultBTC(self): 75 | return DEFAULT_BTC 76 | 77 | # Get default USD amount (only relevant for simulation) 78 | def getDefaultUSD(self): 79 | return DEFAULT_USD 80 | 81 | # Get default print boolean value 82 | def getDefaultPrint(self): 83 | return DEFAULT_PRINT 84 | 85 | # Set BTC amount (only relevant to simulation) 86 | def setBTC(self, btc): 87 | self.btc = btc 88 | 89 | # Get your BTC fund amount 90 | def getBTC(self): 91 | return self.btc 92 | 93 | # Set USD amount (only relevant to simulation) 94 | def setUSD(self, usd): 95 | self.usd = usd 96 | 97 | # Get you USD fund amount 98 | def getUSD(self): 99 | return self.usd 100 | 101 | # Set your credentials (requires a Credential class instance) 102 | def setCredentials(self, credentials): 103 | self.credentials = credentials 104 | 105 | # Get credentials (Credentials class instance) 106 | def getCredentials(self): 107 | return self.credentials 108 | 109 | # Get username 110 | def getUser(self): 111 | return self.getCredentials().getUser() 112 | 113 | # Get password 114 | def getPass(self): 115 | return self.getCredentials().getPass() 116 | 117 | # Set username 118 | def setUser(self, user): 119 | return self.getCredentials().setUser(user) 120 | 121 | # Set password 122 | def setPass(self, password): 123 | return self.getCredentials().setPass(password) 124 | 125 | # Buy "btc" many BTCs each for "price" amount 126 | def buyBTC(self, btc, price): 127 | if self.canBuy(btc, price): 128 | self.printBuyMsg(btc, price) 129 | if self.getSimulation(): 130 | self.deductUSD(price * btc) 131 | self.addBTC(btc) 132 | else: 133 | self.getURLWithParams(BUY_BTC_URL, {'amount':btc,'price':price}) 134 | else: 135 | self.prnt("Do not have enough USD to submit order for %.2f BTC @ %.2f USD a piece" % (btc, price)) 136 | 137 | # Deduct USD from funds (simulation) 138 | def deductUSD(self, usd): 139 | if self.getSimulation(): 140 | self.usd -= usd 141 | else: 142 | self.prnt("This is not a simulation. Cannot deduct USD.") 143 | 144 | # Deduct BTC from funds (simulation) 145 | def deductBTC(self, btc): 146 | if self.getSimulation(): 147 | self.btc -= btc 148 | else: 149 | self.prnt("This is not a simulation. Cannot deduct BTC.") 150 | 151 | # Add USD funds (simulation) 152 | def addUSD(self, usd): 153 | if self.getSimulation(): 154 | self.usd += usd 155 | else: 156 | self.prnt("This is not a simulation. Cannot add USD.") 157 | 158 | # Add BTC funds (simulation) 159 | def addBTC(self, btc): 160 | if self.getSimulation(): 161 | self.btc += btc 162 | else: 163 | self.prnt("This is not a simulation. Cannot add BTC.") 164 | 165 | # Check if printing is on (True = print to screen, False = don't print to screen) 166 | def printingOn(self): 167 | return self.canPrint 168 | 169 | # Prints the buying message 170 | def printBuyMsg(self, btc, price): 171 | self.prnt("Buying " + str(btc) + " BTC for " + str(price) + " USD each (Total = " + str(btc * price) + " USD)") 172 | 173 | # Checks to see if enough funds are available to proceed with the proposed purchase 174 | def canBuy(self, btc, usd): 175 | return self.getUSD() >= (btc * usd) 176 | 177 | # Sell "btc" many BTCs each for "price" amount 178 | def sellBTC(self, btc, price): 179 | if self.canSell(btc): 180 | self.printSellMsg(btc, price) 181 | if self.getSimulation(): 182 | self.deductBTC(btc) 183 | self.addUSD(btc * price) 184 | else: 185 | self.getURLWithParams(SELL_BTC_URL, {'amount':btc,'price':price}) 186 | else: 187 | self.prnt("Do not have enough BTC to submit sell order for %.2f BTC @ %.2f USD a piece" % (btc, price)) 188 | 189 | # Prints the selling message 190 | def printSellMsg(self, btc, price): 191 | self.prnt("Selling " + str(btc) + " BTC for " + str(price) + " USD each (Total = " + str(btc * price) + " USD)") 192 | 193 | # Checks to see if there are enough BTC funds to proceed with the sell 194 | def canSell(self, btc): 195 | return self.getBTC() >= btc 196 | 197 | def updateDataSet(self, d): 198 | self.update() 199 | d.addData(self.getNewData()) 200 | 201 | def getNewData(self): 202 | return Data(self.getUSD(), self.getBTC(), self.getHigh(), self.getLow(), self.getLast(), self.getVol(), self.getBuy(), self.getSell(), \ 203 | self.getTotalAskPrice(), self.getTotalAskVolume(), self.getAvgAskPrice(), \ 204 | self.getTotalBidPrice(), self.getTotalBidVolume(), self.getAvgBidPrice()) 205 | 206 | # Update data values from Mt.Gox (it's important to do this often to keep values current) 207 | def update(self): 208 | tickerData = self.getTickerData() 209 | self.setLast(tickerData['last']) 210 | self.setSell(tickerData['sell']) 211 | self.setBuy(tickerData['buy']) 212 | self.setVol(tickerData['vol']) 213 | self.setLow(tickerData['low']) 214 | self.setHigh(tickerData['high']) 215 | 216 | if self.getSimulation() == False: 217 | funds = self.getFunds() 218 | self.setBTC(funds['btcs']) 219 | self.setUSD(funds['usds']) 220 | 221 | self.setOrders(self.getOrdersData()) 222 | 223 | marketDepth = self.getMarketDepth() 224 | self.setAsks(marketDepth['asks']) 225 | self.setBids(marketDepth['bids']) 226 | 227 | 228 | def setTotalAskPrice(self, totalAskPrice): 229 | self.totalAskPrice = totalAskPrice 230 | 231 | def setTotalAskVolume(self, totalAskVolume): 232 | self.totalAskVolume = totalAskVolume 233 | 234 | def setAvgAskPrice(self, avgAskPrice): 235 | self.avgAskPrice = avgAskPrice 236 | 237 | def getTotalAskPrice(self): 238 | return self.totalAskPrice 239 | 240 | def getTotalAskVolume(self): 241 | return self.totalAskVolume 242 | 243 | def getAvgAskPrice(self): 244 | return self.avgAskPrice 245 | 246 | def setAsks(self, asks): 247 | self.setTotalAskPrice(sum([x[0]*x[1] for x in asks])) 248 | self.setTotalAskVolume(sum([x[1] for x in asks])) 249 | self.setAvgAskPrice(float(self.totalAskPrice)/float(self.totalAskVolume)) 250 | 251 | def setBids(self, bids): 252 | self.setTotalBidPrice(sum([x[0]*x[1] for x in bids])) 253 | self.setTotalBidVolume(sum([x[1] for x in bids])) 254 | self.setAvgBidPrice(float(self.totalBidPrice)/float(self.totalBidVolume)) 255 | 256 | def setTotalBidPrice(self, totalBidPrice): 257 | self.totalBidPrice = totalBidPrice 258 | 259 | def setTotalBidVolume(self, totalBidVolume): 260 | self.totalBidVolume = totalBidVolume 261 | 262 | def setAvgBidPrice(self, avgBidPrice): 263 | self.avgBidPrice = avgBidPrice 264 | 265 | def getTotalBidPrice(self): 266 | return self.totalBidPrice 267 | 268 | def getTotalBidVolume(self): 269 | return self.totalBidVolume 270 | 271 | def getAvgBidPrice(self): 272 | return self.avgBidPrice 273 | 274 | 275 | # Get funds from Mt.Gox 276 | def getFunds(self): 277 | return self.getURL(GET_FUNDS_URL) 278 | 279 | def printFunds(self): 280 | self.printBTC() 281 | self.printUSD() 282 | self.printSeperator() 283 | 284 | def addSpaces(self, base, value, delta): 285 | if int(value) == 0: 286 | dec = 0 287 | else: 288 | dec = int(math.log(int(value),10)) 289 | for i in range(20 - dec + delta): 290 | base += " " 291 | return base + "|" 292 | 293 | # Print BTC funds 294 | def printBTC(self): 295 | self.prnt(self.addSpaces(" | BTC: %.2f" % self.getBTC(), self.getBTC(), -1)) 296 | 297 | # Print USD funds 298 | def printUSD(self): 299 | self.prnt(self.addSpaces(" | USD: %.2f" % self.getUSD(), self.getUSD(), -1)) 300 | 301 | # Print high 302 | def printHigh(self): 303 | self.prnt("High: " + str(self.getHigh())) 304 | 305 | # Print low 306 | def printLow(self): 307 | self.prnt("Low: " + str(self.getLow())) 308 | 309 | # Print last 310 | def printLast(self): 311 | self.prnt("Last: " + str(self.getLast())) 312 | 313 | # Print volume 314 | def printVol(self): 315 | self.prnt("Vol: " + str(self.getVol())) 316 | 317 | # Print buy 318 | def printBuy(self): 319 | self.prnt("Buy: " + str(self.getBuy())) 320 | 321 | # Print sell 322 | def printSell(self): 323 | self.prnt("Sell: " + str(self.getSell())) 324 | 325 | # Print a message 326 | def prnt(self, string): 327 | if self.printingOn(): 328 | print string 329 | 330 | # Print Mt.Gox data 331 | def printData(self): 332 | self.printLast() 333 | self.printBuy() 334 | self.printSell() 335 | self.printHigh() 336 | self.printLow() 337 | self.printVol() 338 | 339 | # Get last 340 | def getLast(self): 341 | return self.last 342 | 343 | # Set last 344 | def setLast(self, last): 345 | self.last = last 346 | 347 | # Get sell 348 | def getSell(self): 349 | return self.sell 350 | 351 | # Set sell 352 | def setSell(self, sell): 353 | self.sell = sell 354 | 355 | # Get buy 356 | def getBuy(self): 357 | return self.buy 358 | 359 | # Set buy 360 | def setBuy(self, buy): 361 | self.buy = buy 362 | 363 | # Get volume 364 | def getVol(self): 365 | return self.vol 366 | 367 | # Set volume 368 | def setVol(self, vol): 369 | self.vol = vol 370 | 371 | # Get low 372 | def getLow(self): 373 | return self.low 374 | 375 | # Set low 376 | def setLow(self, low): 377 | self.low = low 378 | 379 | # Get high (/r/trees) 380 | def getHigh(self): 381 | return self.high 382 | 383 | # Set high 384 | def setHigh(self, high): 385 | self.high = high 386 | 387 | # Get ticker data from Mt.Gox 388 | def getTickerData(self): 389 | return self.getPlainURL(TICKER_URL)['ticker'] 390 | 391 | def getMarketDepth(self): 392 | return self.getPlainURL(MARKET_DEPTH_URL) 393 | 394 | # Get data from URL without using credentials 395 | def getPlainURL(self, url): 396 | url = BASE_URL + url 397 | f = urllib2.urlopen(url) 398 | data = eval(f.read()) 399 | contextlib.closing(f) 400 | return data 401 | 402 | # Get data from URL using credentials 403 | def getURL(self, url): 404 | url = BASE_URL + url 405 | f = urllib2.urlopen(url,self.getEncodedCreds()) 406 | data = eval(f.read()) 407 | contextlib.closing(f) 408 | return data 409 | 410 | # Get data from URL with extra parameters 411 | def getURLWithParams(self, url, dict): 412 | url = BASE_URL + url 413 | dict.update(self.getCredsDict()) 414 | f = urllib2.urlopen(url,self.getURLEncoded(dict)) 415 | data = eval(f.read()) 416 | contextlib.closing(f) 417 | return data 418 | 419 | # Get URL encoded credentials 420 | def getEncodedCreds(self): 421 | return self.getURLEncoded(self.getCredsDict()) 422 | 423 | # Get URL encoded version of parameter dictionary 424 | def getURLEncoded(self, dict): 425 | return urllib.urlencode(dict) 426 | 427 | # Get credentials dictionary 428 | def getCredsDict(self): 429 | return {'name': self.getCredentials().getUser(), 'pass': self.getCredentials().getPass()} 430 | 431 | def cancelOrder(self, oid): 432 | order = self.getOrder(oid) 433 | if order == None: 434 | return 435 | return self.getURLWithParams(CANCEL_ORDER_URL, {'oid':order['oid'],'type':order['type']}) 436 | 437 | def getOrder(self, oid): 438 | if self.getSimulation(): 439 | return None 440 | for order in self.getOrders(): 441 | if order['oid'] == oid: 442 | return order 443 | return None 444 | 445 | def getNumOrders(self): 446 | return len(self.getOrders()) 447 | 448 | def getOrders(self): 449 | return self.orders 450 | 451 | def setOrders(self, orders): 452 | self.orders = orders 453 | 454 | def getOrdersData(self): 455 | if self.getSimulation(): 456 | return [] 457 | return self.getURL(GET_ORDERS_URL)['orders'] 458 | 459 | def printBar(self): 460 | print " |-------------------------------------------------|" 461 | 462 | def printSeperator(self): 463 | print " |=================================================|" 464 | 465 | def printNoOrders(self): 466 | print " | No orders placed |" 467 | 468 | def printOrders(self): 469 | self.printOrderHeader() 470 | self.printBar() 471 | if self.getNumOrders() == 0: 472 | self.printNoOrders() 473 | else: 474 | for order in self.getOrders(): 475 | self.printOrder(order) 476 | self.printSeperator() 477 | 478 | def printOrderHeader(self): 479 | print " | OID | Type | Status |" 480 | 481 | def printOrder(self, order): 482 | oid = order['oid'] 483 | if str(order['type']) == '1': 484 | type = "sell" 485 | else: 486 | type = "buy " 487 | if order['status'] == '1': 488 | status = "active" 489 | else: 490 | status = " NSF " 491 | print self.addSpaces(" | %s" % oid, oid, -10) + " %s | %s |" % (type, status) 492 | 493 | if __name__ == '__main__': 494 | main() 495 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | ############################################ 2 | # # 3 | # Redbit Automated Bitcoin Trader (RABiT) # 4 | # --------------------------------------- # 5 | # # 6 | # v0.4 # 7 | # 06/17/2011 # 8 | # # 9 | # reddit.com/r/redbit # 10 | # Always bet on RED # 11 | # # 12 | ############################################ 13 | 14 | 1. Includes 15 | - main.py 16 | - MtGox.py 17 | - DataSet.py 18 | - Data.py 19 | - Credentials.py 20 | 21 | 2. New Features 22 | - Mean, standard deviation, and fitted slope calculations 23 | for market depth values 24 | - Cleaned up table display with (hopefully) no more shifting columns 25 | - View orders in table (just oid, type, and status) 26 | - View simulation status (either simulation or live) plus username if live 27 | - Table title with date and time 28 | 29 | 3. Setup 30 | - Edit variable values at top of main.py and MtGox.py files 31 | - Notice: Change DEFAULT_SIMULATION at your own risk! This 32 | program is still in pre-alpha state. 33 | 34 | 4. Run Command 35 | - python main.py 36 | 37 | 5. Question, Comments, Bug Fixes? 38 | - http://www.reddit.com/r/redbit 39 | 40 | 6. Updates 41 | - https://github.com/hyppo/Redbit 42 | 43 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | from MtGox import MtGox 2 | from DataSet import DataSet 3 | from Data import Data 4 | import time 5 | import os 6 | 7 | 8 | ############################################# 9 | # Change the following variables as desired # 10 | ############################################# 11 | 12 | SELL_THRESHOLD = 20.00 # Bot will sell bitcoins once the sell value goes above this 13 | BUY_THRESHOLD = 12.00 # Bot will buy bitcoins once the buy value goes below this 14 | UPDATE_TIME = 2 # How often the bot retrieves new data in seconds 15 | PERCENT_SELL = 0.5 # Percentage of BTC funds to sell when making a sell order 16 | PERCENT_BUY = 0.5 # Percentage of USD funds to buy with when making a buy order 17 | 18 | def main(): 19 | m = MtGox() 20 | d = DataSet() 21 | while True: 22 | m.updateDataSet(d) 23 | if m.getSell() > SELL_THRESHOLD: 24 | m.sellBTC(m.getBTC()*PERCENT_SELL,m.getSell()) 25 | if m.getBuy() < BUY_THRESHOLD: 26 | m.buyBTC((m.getUSD()*PERCENT_BUY)/m.getBuy(), m.getBuy()) 27 | m.updateDataSet(d) 28 | os.system("clear") 29 | m.printTitle() 30 | d.printData() 31 | m.printFunds() 32 | m.printOrders() 33 | m.printStatus() 34 | time.sleep(UPDATE_TIME) 35 | 36 | 37 | if __name__ == "__main__": 38 | main() 39 | --------------------------------------------------------------------------------