Advertisement
dequone

main (gamma)

Feb 2nd, 2014
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 15.89 KB | None | 0 0
  1. # -*- coding: cp1251 -*-
  2. __author__ = 'rezoh'
  3. import tradeAPI
  4. import v3API
  5. import time
  6. import json
  7. import sys
  8. from os import path
  9. from datetime import datetime
  10. from math import floor
  11.  
  12. debugMode = True
  13. #keys
  14. btc_usd = 'btc_usd'
  15. btc_rur = 'btc_rur'
  16. usd_rur = 'usd_rur'
  17. price = 0
  18. amount = 1
  19.  
  20. def getStartPath():
  21.     spath = ''
  22.     if len(path.dirname(sys.argv[0])) != 0:
  23.         spath += path.dirname(sys.argv[0]) + path.sep
  24.     return spath
  25.  
  26. ##paths & files
  27. startPath = getStartPath()
  28. workLog = startPath + 'workLog.txt'
  29. controlFile = startPath + 'control.txt'
  30. curPurchaseFile = startPath + 'current_purchase'
  31. ##control
  32. off = False
  33. intr = 0.05
  34. ##flags
  35. srverror = False
  36. ##wallet
  37. btcHave = 0.0
  38. usdHave = 300.0
  39. rurHave = 0.0
  40. ##
  41. minToBuy = maxToSell = 0.0
  42. d = lastd = midd= D = LD = sum_d = spent = 0.0
  43.  
  44. def main():
  45.     global d, lastd, midd, i, j, fl, D, LD, sum_d, n_d, spent, btcHave, usdHave, rurHave, minToBuy, maxToSell, srverror
  46.     i = j = n_d = 0
  47.     fl = 1
  48.     pause = False
  49.     reportFlag = False
  50.     dcData = {'pause': False, 'interval': 5, 'off': False, 'intr': 0.05}
  51.     dcData = json.dumps(dcData)
  52.     #load key, secret and nonce from config file
  53.     if tradeAPI.readSettings() == 2:
  54.         print "Config file not found!"
  55.         if raw_input("Do you want create new config file? (Yes|No): ").lower() == 'yes':
  56.             tradeAPI.BTC_api_key = raw_input("Input API key: ")
  57.             tradeAPI.BTC_api_secret = raw_input("Input API secret: ")
  58.             tradeAPI.writeSettings()
  59.     #get personal info
  60.     try:
  61.         #btcHave, usdHave, rurHave = tradeAPI.getInfo()
  62.         1
  63.     except BaseException as ex:
  64.         log(workLog, 'Error = {0}'.format(ex.message))
  65.         srverror = True
  66.         print 'Got error.'
  67.        
  68.     print "I have:\n\tBTC=%.5f\n\tUSD=%.5f\n\tRUR=%0.5f" % (btcHave, usdHave, rurHave)
  69.     print '*' * 20 + '\n'
  70.  
  71.     while True:  
  72.         if not srverror:
  73.                 try:
  74.                     1
  75.                 except BaseException as ex:
  76.                     log(workLog, 'Error = {0}'.format(ex.message))
  77.                     srverror = True
  78.                     continue
  79.                 else:
  80.                     f = open('log.txt', 'a')
  81.                     f.write('[{0}]: d={1}; mtb={2}; mts={3}\n'.format(
  82.                         datetime.now(), d,
  83.                         v3API.getMtb(v3API.getV3API(btc_usd, v3API.depth, 1), btc_usd)[0],
  84.                         v3API.getMts(v3API.getV3API(btc_usd, v3API.depth, 1), btc_usd)[0]))
  85.                     f.close()
  86.                 pause, off, intr = readControlFile(dcData)
  87.                 if off:
  88.                     print "I'm switching off. Writing down the latest data...",
  89.                     result = writeLastData()
  90.                     if result:
  91.                         print 'OK'
  92.                     else:
  93.                         print 'Error'
  94.                     cData = {'pause': False, 'interval': interval, 'off': False}
  95.                     cData = json.dumps(cData)
  96.                     c = open(controlFile, 'w')
  97.                     c.write(cData)
  98.                     c.close()
  99.                     exit()
  100.                 load_last_data()
  101.                 if not pause:
  102.                     try:
  103.                         allOrders = v3API.getV3API(v3API.btc_usd)
  104.                     except BaseException as ex:
  105.                         log(workLog, 'Error = {0}'.format(ex.message))
  106.                         srverror = True
  107.                         continue
  108.                     else:
  109.                         ordersToBuy = v3API.fillOrdersToBuy(allOrders, v3API.btc_usd)
  110.                         ordersToSell = v3API.fillOrdersToSell(allOrders, v3API.btc_usd)
  111.                         minToBuy = v3API.getMinToBuy(allOrders, v3API.btc_usd)
  112.                         maxToSell = v3API.getMaxToSell(allOrders, v3API.btc_usd)
  113.                         prop = v3API.getTrademass(ordersToSell) #predl
  114.                         dmnd = v3API.getTrademass(ordersToBuy)  #spros
  115.                         d = prop - dmnd
  116.                         #log(workLog, 'd={0}; mtb={1}; mts={2}'.format(d, minToBuy, maxToSell))
  117.  
  118.                         tendAnalyse(ordersToBuy, ordersToSell)
  119.         else:
  120.             try:
  121.                 #btcHave, usdHave, rurHave = tradeAPI.getInfo() #sym without it
  122.                 1
  123.             except BaseException:
  124.                 print 'Error'
  125.             else:
  126.                 srverror = False
  127.                 log(workLog, 'Errors not found. I will continue to work.')
  128.                        
  129.     #symlog(ds, '{0}'.format(datetime.now()))
  130.     #symlog(prices, '{0}'.format(datetime.now()))
  131.  
  132.  
  133. def tendAnalyse(ordersToBuy, ordersToSell):
  134.     global d, lastd, D, LD, fl, i, j, sum_d, n_d, midd
  135.     sum_d += d
  136.     n_d += 1
  137.     midd = sum_d/n_d
  138.     if fl == 1:
  139.         lastd = d
  140.         fl = 2
  141.     elif fl == 2:
  142.         D = lastd - d
  143.         fl = 3
  144.     elif fl == 3:
  145.         if abs(d) > 1.2*abs(midd):
  146.             d = 1.2*midd
  147.         elif abs(d) < 0.8*abs(midd):
  148.             d = 0.8*midd
  149.         D = lastd - d
  150.         #print "# sum = %.3f, n = %.3f, midd = %.3f" % (sum_d, n_d, midd)
  151.         print "d = %.3f; lastd = %.3f (midd = %.3f); D = %.3f; LD = %.3f" % (d, lastd, midd, D, LD)
  152.         if D < LD: # <0 == price up
  153.             i += 1
  154.             if j > 1:
  155.                 j = 0
  156.                 if LD < 0:
  157.                     print str(datetime.now()) + ' try to sell: mtb = ' + str(minToBuy) + '; mts = ' + str(maxToSell)
  158.                     log(workLog, 'try to sell: d={0}; mtb={1}; mts={2}'.format(d, minToBuy, maxToSell))
  159.                     doSell()
  160.         elif D > LD: # >0 == price down
  161.             j += 1
  162.             if i > 1:
  163.                 i = 0
  164.                 if LD > 0:
  165.                     print str(datetime.now()) + ' try to buy: mtb = ' + str(minToBuy) + '; mts = ' + str(maxToSell)
  166.                     log(workLog, 'try to buy: d={0}; mtb={1}; mts={2}'.format(d, minToBuy, maxToSell))
  167.                     doBuy()
  168.     if lastd != d:
  169.         lastd = d
  170.         if LD != D:
  171.             LD = D
  172.     print ' '
  173.        
  174.  
  175. def doBuy():
  176.     global usdHave, btcHave, rurHave
  177.     #btcHave, usdHave, rurHave = tradeAPI.getInfo()
  178.     mtb = mts = {}
  179.     try:
  180.         mtb[btc_usd] = v3API.getMtb(v3API.getV3API(btc_usd, v3API.depth, 1), btc_usd)
  181.         #mtb[btc_rur] = v3API.getMtb(v3API.getV3API(btc_rur, v3API.depth, 1), btc_rur)
  182.         #mtb[usd_rur] = v3API.getMtb(v3API.getV3API(usd_rur, v3API.depth, 1), usd_rur)
  183.         mts[btc_usd] = v3API.getMts(v3API.getV3API(btc_usd, v3API.depth, 1), btc_usd)
  184.         #mts[btc_rur] = v3API.getMts(v3API.getV3API(btc_rur, v3API.depth, 1), btc_rur)
  185.         #mts[usd_rur] = v3API.getMts(v3API.getV3API(usd_rur, v3API.depth, 1), usd_rur)
  186.     except:
  187.         print 'Error with internet connection.'
  188.     else:
  189.         if usdHave / mtb[btc_usd][0] <= 0.01:
  190.             log(workLog, 'No money to buy for {0}'.format(mtb[btc_usd][0]))
  191.         elif usdHave / mtb[btc_usd][0] > 0.01:
  192.             if 0.5*usdHave < mtb[btc_usd][0] * mtb[btc_usd][1]:
  193.                 buy(mtb[btc_usd][0], 0.5*usdHave / mtb[btc_usd][0], btc_usd)
  194.                 log(workLog, 'Buyed {0} BTC for {1} USD'.format(0.5*usdHave / mtb[btc_usd][0], mtb[btc_usd][0]))
  195.             else:
  196.                 buy(mtb[btc_usd][0], mtb[btc_usd][1], btc_usd)
  197.                 log(workLog, 'Buyed {0} BTC for {1} USD'.format(mtb[btc_usd][1], mtb[btc_usd][0]))
  198.  
  199.  
  200. def doSell():
  201.     global btcHave, usdHave, rurHave
  202.     #btcHave, usdHave, rurHave = tradeAPI.getInfo()
  203.     mtb = mts = {}
  204.     try:
  205.         mtb[btc_usd] = v3API.getMtb(v3API.getV3API(btc_usd, v3API.depth, 1), btc_usd)
  206.         #mtb[btc_rur] = v3API.getMtb(v3API.getV3API(btc_rur, v3API.depth, 1), btc_rur)
  207.         #mtb[usd_rur] = v3API.getMtb(v3API.getV3API(usd_rur, v3API.depth, 1), usd_rur)
  208.         mts[btc_usd] = v3API.getMts(v3API.getV3API(btc_usd, v3API.depth, 1), btc_usd)
  209.         #mts[btc_rur] = v3API.getMts(v3API.getV3API(btc_rur, v3API.depth, 1), btc_rur)
  210.         #mts[usd_rur] = v3API.getMts(v3API.getV3API(usd_rur, v3API.depth, 1), usd_rur)
  211.     except:
  212.         print 'Error with internet connection.'
  213.     else:        
  214.         if btcHave <= 0.01:
  215.             log(workLog, 'No BTC to sell for {0}'.format(mts[btc_usd][0]))
  216.         elif btcHave > 0.01 and mts[btc_usd][0] > 1.005*spent/btcHave:
  217.             if 0.5*btcHave > mts[btc_usd][1]:
  218.                 sell(mts[btc_usd][0], mts[btc_usd][1], btc_usd)
  219.                 log(workLog, 'Selled {0} BTC for {1} USD'.format(mts[btc_usd][1], mts[btc_usd][0]))
  220.             else:
  221.                 sell(mts[btc_usd][0], 0.5*btcHave, btc_usd)
  222.                 log(workLog, 'Selled {0} BTC for {1} USD'.format(0.5*btcHave, mts[btc_usd][0]))
  223.  
  224.  
  225.  
  226. def buy(rate, amount, pair):
  227.     global spent
  228.     if (pair == usd_rur and amount < 0.1) or (pair == btc_rur and amount < 0.01):
  229.         return False
  230.     if debugMode:
  231.         logTrade('buy', rate, mround(amount, 8), pair)
  232.         spent += amount*rate
  233.         print 'Buyed %0.5f BTC for %0.5f USD, spent = %0.5f' % (amount, rate, spent)
  234.         print "I have: BTC=%.5f, USD=%.5f" % (btcHave, usdHave)
  235.     else:
  236.         try:
  237.             activeOrders = tradeAPI.getLastOrders('buy', pair)
  238.             if len(activeOrders) != 0:
  239.                 for oid in activeOrders:
  240.                     canceled = tradeAPI.cancelOrder(oid)
  241.                     if canceled:
  242.                         log(workLog, 'Order with ID {0} has been canceled.'.format(oid))
  243.             data = tradeAPI.trade('buy', rate, mround(amount, 8), pair)
  244.             if int(data['success']) != 1:
  245.                 log(workLog, 'Trade Error: {0}'.format(data))
  246.             else:
  247.                 logTrade('buy', rate, mround(amount, 8), pair)
  248.                 spent += amount*rate
  249.                 print 'Buyed %0.5f BTC for %0.5f USD, spent = %0.5f' % (amount, rate, spent)
  250.         except BaseException as es:
  251.             log(workLog, 'Error: {0}'.format(es.message))
  252.  
  253.  
  254. def sell(rate, amount, pair):
  255.     global spent
  256.     if (pair == usd_rur and amount < 0.1) or (pair == btc_rur and amount < 0.01):
  257.         return False
  258.     if debugMode:
  259.         logTrade('sell', rate, mround(amount, 8), pair)
  260.         spent -= amount*rate
  261.         print 'Selled %0.5f BTC for %0.5f USD, spent = %0.5f' % (amount, rate, spent)
  262.         print "I have: BTC=%.5f, USD=%.5f" % (btcHave, usdHave)
  263.     else:
  264.         try:
  265.             activeOrders = tradeAPI.getLastOrders('sell', pair)
  266.             if len(activeOrders) != 0:
  267.                 for oid in activeOrders:
  268.                     canceled = tradeAPI.cancelOrder(oid)
  269.                     if canceled:
  270.                         log(workLog, 'Order with ID {0} has been canceled.'.format(oid))
  271.             data = tradeAPI.trade('sell', rate, mround(amount, 8), pair)
  272.             if int(data['success']) != 1:
  273.                 log(workLog, 'Trade Error: {0}'.format(data))
  274.             else:
  275.                 logTrade('sell', rate, mround(amount, 8), pair)
  276.                 spent -= amount*rate
  277.                 print 'Selled %0.5f BTC for %0.5f USD, spent = %0.5f' % (amount, rate, spent)
  278.         except BaseException as es:
  279.             log(workLog, 'Error: {0}'.format(es.message))
  280.  
  281.                
  282. #logging          
  283. def logTrade(mtype, rate, amount, pair):
  284.     global btcHave, usdHave, rurHave
  285.     if debugMode:
  286.         if pair == btc_usd:
  287.             if mtype == 'sell':
  288.                 btcHave -= amount
  289.                 usdHave += rate * amount * 0.998
  290.             elif mtype == 'buy':
  291.                 btcHave += amount * 0.998
  292.                 usdHave -= rate * amount
  293.         elif pair == usd_rur:
  294.             if mtype == 'sell':
  295.                 usdHave -= amount
  296.                 rurHave += rate * amount * 0.998
  297.             elif mtype == 'buy':
  298.                 usdHave += amount * 0.998
  299.                 rurHave -= rate * amount
  300.         elif pair == btc_rur:
  301.             if mtype == 'sell':
  302.                 btcHave -= amount
  303.                 rurHave += rate * amount * 0.998
  304.             elif mtype == 'buy':
  305.                 btcHave += amount * 0.998
  306.                 rurHave -= rate * amount
  307.     else:
  308.         btcHave, usdHave, rurHave = tradeAPI.getInfo()
  309.     f = open('tradeLog.txt', 'a')
  310.     f.write('[' + str(datetime.now()) + ']: act=' + mtype + '; pair=' + pair + '; price=' + str(round(rate, 4)) +
  311.             '; amount=' + str(round(amount, 5)) +'; btcHave=' + str(btcHave) + '; usdHave=' + str(usdHave) +
  312.             '; rurHave=' + str(rurHave) + '\n')
  313.     f.close()
  314.     return 1    
  315.  
  316.  
  317. def readControlFile(dcData):
  318.     pause = off = False
  319.     intr = 0.0
  320.     c = file
  321.     try:
  322.         c = open(controlFile, 'r')
  323.     except IOError:
  324.         #print "Control file not found!"
  325.         c = open(controlFile, 'w')
  326.         c.write(dcData)
  327.     else:
  328.         cData = c.read().lower()
  329.         if cData != '':
  330.             try:
  331.                 cData = json.loads(cData)
  332.                 pause = bool(cData['pause'])
  333.                 off = bool(cData['off'])
  334.                 intr = float('intr')
  335.             except:
  336.                 #print "Control file error. Resetting control file."
  337.                 c.close()
  338.                 c = open(controlFile, 'w')
  339.                 c.write(dcData)
  340.         else:
  341.             c = open(controlFile, 'w')
  342.             c.write(dcData)
  343.     finally:
  344.         c.close()
  345.     return pause, off, intr
  346.  
  347.  
  348. def writeLastData():
  349.     lData = {'midd': midd, 'spent': spent}
  350.     lData = json.dumps(lData)
  351.     write_ini_file("lastData", lData)
  352.  
  353.  
  354. def load_last_data():
  355.     global midd, spent
  356.     data = read_ini_file("lastData", "{}")
  357.     midd = data['midd']
  358.     spent = data['spent']
  359.    
  360.  
  361. def read_ini_file(filepath, def_data):
  362.     out = {}
  363.     c = object
  364.     try:
  365.         c = open(filepath, 'r')
  366.     except IOError:
  367.         #print "Control file not found!"
  368.         c = open(filepath, 'w')
  369.         c.write(def_data)
  370.     else:
  371.         cdata = c.read().lower()
  372.         if cdata != '':
  373.             try:
  374.                 out = cdata
  375.             except:
  376.                 #print "Control file error. Resetting control file."
  377.                 c.close()
  378.                 c = open(filepath, 'w')
  379.                 c.write(def_data)
  380.         else:
  381.             c = open(filepath, 'w')
  382.             c.write(def_data)
  383.             out = def_data
  384.     finally:
  385.         c.close()
  386.     return json.loads(out)
  387.  
  388.  
  389. def write_ini_file(filepath, data):
  390.     try:
  391.         with open(filepath, 'w') as f:
  392.             f.write(data)
  393.     except:
  394.         return False
  395.     return True
  396.  
  397.  
  398. def writeReport():
  399.     global btcHave, usdHave, rurHave
  400.     f = file
  401.     mtb = {btc_usd: v3API.getMtb(v3API.getV3API(btc_usd, v3API.depth, 1), btc_usd),
  402.            btc_rur: v3API.getMtb(v3API.getV3API(btc_rur, v3API.depth, 1), btc_rur),
  403.            usd_rur: v3API.getMtb(v3API.getV3API(usd_rur, v3API.depth, 1), usd_rur)}
  404.     btcHave, usdHave, rurHave = tradeAPI.getInfo()
  405.     usd = usdHave + btcHave * mtb[btc_usd][0] + rurHave / mtb[usd_rur][0]
  406.     try:
  407.         f = open('report.txt', 'r')
  408.     except IOError:
  409.         f = open('report.txt', 'w')
  410.         f.write('Date\tYesterday\tNow\tProfit(%)\n')
  411.         f.close()
  412.     else:
  413.         lines = f.readlines()
  414.         f.close()
  415.  
  416.         line = lines[len(lines) - 1]
  417.         if line != 'Date\tYesterday\tNow\tProfit(%)\n':
  418.             arr = line.rstrip('\r\n').split('\t')
  419.             f = open('report.txt', 'a')
  420.             yusd = float(arr[2])
  421.             f.write(str(datetime.now().date()) + '\t' + str(yusd) + '\t' + str(usd) + '\t' +
  422.                     str(round((1 - yusd / usd) * 100, 3)) + '\t\n')
  423.     finally:
  424.         f.close()
  425.  
  426.  
  427. def mround(n, x):
  428.     dec = 10**x
  429.     return floor(n * dec) / dec
  430.  
  431.  
  432. def log(logType, string):
  433.     f = open(logType, 'a')
  434.     f.write('[' + str(datetime.now()) + ']: ' + string + '\n')
  435.     f.close()
  436.  
  437. #copy of log, but work is to arrays
  438. def symlog(logType, string):
  439.     f = open(logType, 'a')
  440.     f.write(string + ',\n')
  441.     f.close()
  442.  
  443. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement