Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: cp1251 -*-
- __author__ = 'rezoh'
- import tradeAPI
- import v3API
- import time
- import json
- import sys
- from os import path
- from datetime import datetime
- from math import floor
- debugMode = True
- #keys
- btc_usd = 'btc_usd'
- btc_rur = 'btc_rur'
- usd_rur = 'usd_rur'
- price = 0
- amount = 1
- def getStartPath():
- spath = ''
- if len(path.dirname(sys.argv[0])) != 0:
- spath += path.dirname(sys.argv[0]) + path.sep
- return spath
- ##paths & files
- startPath = getStartPath()
- workLog = startPath + 'workLog.txt'
- controlFile = startPath + 'control.txt'
- curPurchaseFile = startPath + 'current_purchase'
- ##control
- off = False
- intr = 0.05
- ##flags
- srverror = False
- ##wallet
- btcHave = 0.0
- usdHave = 300.0
- rurHave = 0.0
- ##
- minToBuy = maxToSell = 0.0
- d = lastd = midd= D = LD = sum_d = spent = 0.0
- def main():
- global d, lastd, midd, i, j, fl, D, LD, sum_d, n_d, spent, btcHave, usdHave, rurHave, minToBuy, maxToSell, srverror
- i = j = n_d = 0
- fl = 1
- pause = False
- reportFlag = False
- dcData = {'pause': False, 'interval': 5, 'off': False, 'intr': 0.05}
- dcData = json.dumps(dcData)
- #load key, secret and nonce from config file
- if tradeAPI.readSettings() == 2:
- print "Config file not found!"
- if raw_input("Do you want create new config file? (Yes|No): ").lower() == 'yes':
- tradeAPI.BTC_api_key = raw_input("Input API key: ")
- tradeAPI.BTC_api_secret = raw_input("Input API secret: ")
- tradeAPI.writeSettings()
- #get personal info
- try:
- #btcHave, usdHave, rurHave = tradeAPI.getInfo()
- 1
- except BaseException as ex:
- log(workLog, 'Error = {0}'.format(ex.message))
- srverror = True
- print 'Got error.'
- print "I have:\n\tBTC=%.5f\n\tUSD=%.5f\n\tRUR=%0.5f" % (btcHave, usdHave, rurHave)
- print '*' * 20 + '\n'
- while True:
- if not srverror:
- try:
- 1
- except BaseException as ex:
- log(workLog, 'Error = {0}'.format(ex.message))
- srverror = True
- continue
- else:
- f = open('log.txt', 'a')
- f.write('[{0}]: d={1}; mtb={2}; mts={3}\n'.format(
- datetime.now(), d,
- v3API.getMtb(v3API.getV3API(btc_usd, v3API.depth, 1), btc_usd)[0],
- v3API.getMts(v3API.getV3API(btc_usd, v3API.depth, 1), btc_usd)[0]))
- f.close()
- pause, off, intr = readControlFile(dcData)
- if off:
- print "I'm switching off. Writing down the latest data...",
- result = writeLastData()
- if result:
- print 'OK'
- else:
- print 'Error'
- cData = {'pause': False, 'interval': interval, 'off': False}
- cData = json.dumps(cData)
- c = open(controlFile, 'w')
- c.write(cData)
- c.close()
- exit()
- load_last_data()
- if not pause:
- try:
- allOrders = v3API.getV3API(v3API.btc_usd)
- except BaseException as ex:
- log(workLog, 'Error = {0}'.format(ex.message))
- srverror = True
- continue
- else:
- ordersToBuy = v3API.fillOrdersToBuy(allOrders, v3API.btc_usd)
- ordersToSell = v3API.fillOrdersToSell(allOrders, v3API.btc_usd)
- minToBuy = v3API.getMinToBuy(allOrders, v3API.btc_usd)
- maxToSell = v3API.getMaxToSell(allOrders, v3API.btc_usd)
- prop = v3API.getTrademass(ordersToSell) #predl
- dmnd = v3API.getTrademass(ordersToBuy) #spros
- d = prop - dmnd
- #log(workLog, 'd={0}; mtb={1}; mts={2}'.format(d, minToBuy, maxToSell))
- tendAnalyse(ordersToBuy, ordersToSell)
- else:
- try:
- #btcHave, usdHave, rurHave = tradeAPI.getInfo() #sym without it
- 1
- except BaseException:
- print 'Error'
- else:
- srverror = False
- log(workLog, 'Errors not found. I will continue to work.')
- #symlog(ds, '{0}'.format(datetime.now()))
- #symlog(prices, '{0}'.format(datetime.now()))
- def tendAnalyse(ordersToBuy, ordersToSell):
- global d, lastd, D, LD, fl, i, j, sum_d, n_d, midd
- sum_d += d
- n_d += 1
- midd = sum_d/n_d
- if fl == 1:
- lastd = d
- fl = 2
- elif fl == 2:
- D = lastd - d
- fl = 3
- elif fl == 3:
- if abs(d) > 1.2*abs(midd):
- d = 1.2*midd
- elif abs(d) < 0.8*abs(midd):
- d = 0.8*midd
- D = lastd - d
- #print "# sum = %.3f, n = %.3f, midd = %.3f" % (sum_d, n_d, midd)
- print "d = %.3f; lastd = %.3f (midd = %.3f); D = %.3f; LD = %.3f" % (d, lastd, midd, D, LD)
- if D < LD: # <0 == price up
- i += 1
- if j > 1:
- j = 0
- if LD < 0:
- print str(datetime.now()) + ' try to sell: mtb = ' + str(minToBuy) + '; mts = ' + str(maxToSell)
- log(workLog, 'try to sell: d={0}; mtb={1}; mts={2}'.format(d, minToBuy, maxToSell))
- doSell()
- elif D > LD: # >0 == price down
- j += 1
- if i > 1:
- i = 0
- if LD > 0:
- print str(datetime.now()) + ' try to buy: mtb = ' + str(minToBuy) + '; mts = ' + str(maxToSell)
- log(workLog, 'try to buy: d={0}; mtb={1}; mts={2}'.format(d, minToBuy, maxToSell))
- doBuy()
- if lastd != d:
- lastd = d
- if LD != D:
- LD = D
- print ' '
- def doBuy():
- global usdHave, btcHave, rurHave
- #btcHave, usdHave, rurHave = tradeAPI.getInfo()
- mtb = mts = {}
- try:
- mtb[btc_usd] = v3API.getMtb(v3API.getV3API(btc_usd, v3API.depth, 1), btc_usd)
- #mtb[btc_rur] = v3API.getMtb(v3API.getV3API(btc_rur, v3API.depth, 1), btc_rur)
- #mtb[usd_rur] = v3API.getMtb(v3API.getV3API(usd_rur, v3API.depth, 1), usd_rur)
- mts[btc_usd] = v3API.getMts(v3API.getV3API(btc_usd, v3API.depth, 1), btc_usd)
- #mts[btc_rur] = v3API.getMts(v3API.getV3API(btc_rur, v3API.depth, 1), btc_rur)
- #mts[usd_rur] = v3API.getMts(v3API.getV3API(usd_rur, v3API.depth, 1), usd_rur)
- except:
- print 'Error with internet connection.'
- else:
- if usdHave / mtb[btc_usd][0] <= 0.01:
- log(workLog, 'No money to buy for {0}'.format(mtb[btc_usd][0]))
- elif usdHave / mtb[btc_usd][0] > 0.01:
- if 0.5*usdHave < mtb[btc_usd][0] * mtb[btc_usd][1]:
- buy(mtb[btc_usd][0], 0.5*usdHave / mtb[btc_usd][0], btc_usd)
- log(workLog, 'Buyed {0} BTC for {1} USD'.format(0.5*usdHave / mtb[btc_usd][0], mtb[btc_usd][0]))
- else:
- buy(mtb[btc_usd][0], mtb[btc_usd][1], btc_usd)
- log(workLog, 'Buyed {0} BTC for {1} USD'.format(mtb[btc_usd][1], mtb[btc_usd][0]))
- def doSell():
- global btcHave, usdHave, rurHave
- #btcHave, usdHave, rurHave = tradeAPI.getInfo()
- mtb = mts = {}
- try:
- mtb[btc_usd] = v3API.getMtb(v3API.getV3API(btc_usd, v3API.depth, 1), btc_usd)
- #mtb[btc_rur] = v3API.getMtb(v3API.getV3API(btc_rur, v3API.depth, 1), btc_rur)
- #mtb[usd_rur] = v3API.getMtb(v3API.getV3API(usd_rur, v3API.depth, 1), usd_rur)
- mts[btc_usd] = v3API.getMts(v3API.getV3API(btc_usd, v3API.depth, 1), btc_usd)
- #mts[btc_rur] = v3API.getMts(v3API.getV3API(btc_rur, v3API.depth, 1), btc_rur)
- #mts[usd_rur] = v3API.getMts(v3API.getV3API(usd_rur, v3API.depth, 1), usd_rur)
- except:
- print 'Error with internet connection.'
- else:
- if btcHave <= 0.01:
- log(workLog, 'No BTC to sell for {0}'.format(mts[btc_usd][0]))
- elif btcHave > 0.01 and mts[btc_usd][0] > 1.005*spent/btcHave:
- if 0.5*btcHave > mts[btc_usd][1]:
- sell(mts[btc_usd][0], mts[btc_usd][1], btc_usd)
- log(workLog, 'Selled {0} BTC for {1} USD'.format(mts[btc_usd][1], mts[btc_usd][0]))
- else:
- sell(mts[btc_usd][0], 0.5*btcHave, btc_usd)
- log(workLog, 'Selled {0} BTC for {1} USD'.format(0.5*btcHave, mts[btc_usd][0]))
- def buy(rate, amount, pair):
- global spent
- if (pair == usd_rur and amount < 0.1) or (pair == btc_rur and amount < 0.01):
- return False
- if debugMode:
- logTrade('buy', rate, mround(amount, 8), pair)
- spent += amount*rate
- print 'Buyed %0.5f BTC for %0.5f USD, spent = %0.5f' % (amount, rate, spent)
- print "I have: BTC=%.5f, USD=%.5f" % (btcHave, usdHave)
- else:
- try:
- activeOrders = tradeAPI.getLastOrders('buy', pair)
- if len(activeOrders) != 0:
- for oid in activeOrders:
- canceled = tradeAPI.cancelOrder(oid)
- if canceled:
- log(workLog, 'Order with ID {0} has been canceled.'.format(oid))
- data = tradeAPI.trade('buy', rate, mround(amount, 8), pair)
- if int(data['success']) != 1:
- log(workLog, 'Trade Error: {0}'.format(data))
- else:
- logTrade('buy', rate, mround(amount, 8), pair)
- spent += amount*rate
- print 'Buyed %0.5f BTC for %0.5f USD, spent = %0.5f' % (amount, rate, spent)
- except BaseException as es:
- log(workLog, 'Error: {0}'.format(es.message))
- def sell(rate, amount, pair):
- global spent
- if (pair == usd_rur and amount < 0.1) or (pair == btc_rur and amount < 0.01):
- return False
- if debugMode:
- logTrade('sell', rate, mround(amount, 8), pair)
- spent -= amount*rate
- print 'Selled %0.5f BTC for %0.5f USD, spent = %0.5f' % (amount, rate, spent)
- print "I have: BTC=%.5f, USD=%.5f" % (btcHave, usdHave)
- else:
- try:
- activeOrders = tradeAPI.getLastOrders('sell', pair)
- if len(activeOrders) != 0:
- for oid in activeOrders:
- canceled = tradeAPI.cancelOrder(oid)
- if canceled:
- log(workLog, 'Order with ID {0} has been canceled.'.format(oid))
- data = tradeAPI.trade('sell', rate, mround(amount, 8), pair)
- if int(data['success']) != 1:
- log(workLog, 'Trade Error: {0}'.format(data))
- else:
- logTrade('sell', rate, mround(amount, 8), pair)
- spent -= amount*rate
- print 'Selled %0.5f BTC for %0.5f USD, spent = %0.5f' % (amount, rate, spent)
- except BaseException as es:
- log(workLog, 'Error: {0}'.format(es.message))
- #logging
- def logTrade(mtype, rate, amount, pair):
- global btcHave, usdHave, rurHave
- if debugMode:
- if pair == btc_usd:
- if mtype == 'sell':
- btcHave -= amount
- usdHave += rate * amount * 0.998
- elif mtype == 'buy':
- btcHave += amount * 0.998
- usdHave -= rate * amount
- elif pair == usd_rur:
- if mtype == 'sell':
- usdHave -= amount
- rurHave += rate * amount * 0.998
- elif mtype == 'buy':
- usdHave += amount * 0.998
- rurHave -= rate * amount
- elif pair == btc_rur:
- if mtype == 'sell':
- btcHave -= amount
- rurHave += rate * amount * 0.998
- elif mtype == 'buy':
- btcHave += amount * 0.998
- rurHave -= rate * amount
- else:
- btcHave, usdHave, rurHave = tradeAPI.getInfo()
- f = open('tradeLog.txt', 'a')
- f.write('[' + str(datetime.now()) + ']: act=' + mtype + '; pair=' + pair + '; price=' + str(round(rate, 4)) +
- '; amount=' + str(round(amount, 5)) +'; btcHave=' + str(btcHave) + '; usdHave=' + str(usdHave) +
- '; rurHave=' + str(rurHave) + '\n')
- f.close()
- return 1
- def readControlFile(dcData):
- pause = off = False
- intr = 0.0
- c = file
- try:
- c = open(controlFile, 'r')
- except IOError:
- #print "Control file not found!"
- c = open(controlFile, 'w')
- c.write(dcData)
- else:
- cData = c.read().lower()
- if cData != '':
- try:
- cData = json.loads(cData)
- pause = bool(cData['pause'])
- off = bool(cData['off'])
- intr = float('intr')
- except:
- #print "Control file error. Resetting control file."
- c.close()
- c = open(controlFile, 'w')
- c.write(dcData)
- else:
- c = open(controlFile, 'w')
- c.write(dcData)
- finally:
- c.close()
- return pause, off, intr
- def writeLastData():
- lData = {'midd': midd, 'spent': spent}
- lData = json.dumps(lData)
- write_ini_file("lastData", lData)
- def load_last_data():
- global midd, spent
- data = read_ini_file("lastData", "{}")
- midd = data['midd']
- spent = data['spent']
- def read_ini_file(filepath, def_data):
- out = {}
- c = object
- try:
- c = open(filepath, 'r')
- except IOError:
- #print "Control file not found!"
- c = open(filepath, 'w')
- c.write(def_data)
- else:
- cdata = c.read().lower()
- if cdata != '':
- try:
- out = cdata
- except:
- #print "Control file error. Resetting control file."
- c.close()
- c = open(filepath, 'w')
- c.write(def_data)
- else:
- c = open(filepath, 'w')
- c.write(def_data)
- out = def_data
- finally:
- c.close()
- return json.loads(out)
- def write_ini_file(filepath, data):
- try:
- with open(filepath, 'w') as f:
- f.write(data)
- except:
- return False
- return True
- def writeReport():
- global btcHave, usdHave, rurHave
- f = file
- mtb = {btc_usd: v3API.getMtb(v3API.getV3API(btc_usd, v3API.depth, 1), btc_usd),
- btc_rur: v3API.getMtb(v3API.getV3API(btc_rur, v3API.depth, 1), btc_rur),
- usd_rur: v3API.getMtb(v3API.getV3API(usd_rur, v3API.depth, 1), usd_rur)}
- btcHave, usdHave, rurHave = tradeAPI.getInfo()
- usd = usdHave + btcHave * mtb[btc_usd][0] + rurHave / mtb[usd_rur][0]
- try:
- f = open('report.txt', 'r')
- except IOError:
- f = open('report.txt', 'w')
- f.write('Date\tYesterday\tNow\tProfit(%)\n')
- f.close()
- else:
- lines = f.readlines()
- f.close()
- line = lines[len(lines) - 1]
- if line != 'Date\tYesterday\tNow\tProfit(%)\n':
- arr = line.rstrip('\r\n').split('\t')
- f = open('report.txt', 'a')
- yusd = float(arr[2])
- f.write(str(datetime.now().date()) + '\t' + str(yusd) + '\t' + str(usd) + '\t' +
- str(round((1 - yusd / usd) * 100, 3)) + '\t\n')
- finally:
- f.close()
- def mround(n, x):
- dec = 10**x
- return floor(n * dec) / dec
- def log(logType, string):
- f = open(logType, 'a')
- f.write('[' + str(datetime.now()) + ']: ' + string + '\n')
- f.close()
- #copy of log, but work is to arrays
- def symlog(logType, string):
- f = open(logType, 'a')
- f.write(string + ',\n')
- f.close()
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement