reddish111

wexBot

Nov 3rd, 2017
2,281
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # -*- coding: utf-8 -*-
  2. #запрашивает баланс пользователя
  3. #проходит tkPar читает настройки, с биржи цену, ставти если нужно ордера
  4. #ордера не снимает и не учитывает, на ошибки забивает, за спредом не следит!!!
  5. import ssl
  6. import json
  7. import time
  8. import hmac
  9. import hashlib
  10. import urllib
  11. import urllib2
  12. from decimal import *
  13. #create by reddish111  ETH-0x394b570584F2D37D441E669e74563CD164142930 BTC-12r2MkL2BLtYasUGxysngEz1uJTpvB1vQE like cupone
  14. # Replace these with your own API key data
  15. wexAKey = 'your-api-key-here'
  16. wexASec = 'your-api-secret-here'
  17.  
  18. #кофициент и вычеты балансов 'min_amount',cof=b2/b1,min_b1,min_b2
  19. tkPar={'usdet_usd':['0.1','1','0','0'],'ruret_rur':['1','1.8','0','3000']}
  20.  
  21. __nonce=0
  22. def nonce(mul=1):
  23.     global __nonce
  24.     nonce=int(time.time()*mul)
  25.     if nonce<=__nonce:
  26.         nonce=__nonce+1
  27.     __nonce=nonce
  28.     return nonce
  29.  
  30. def rqurl(url,key='',secret='',param=''):   #(Low Level API call)
  31.     ps={}
  32.     hd={'User-Agent':'bot','Content-type':'application/x-www-form-urlencoded'}
  33.     if param!='':
  34.         param['nonce']=nonce()
  35.         ps=urllib.urlencode(param)
  36.         sig = hmac.new(secret,ps, digestmod=hashlib.sha512).hexdigest()
  37.         hd.update({'Key': key,'Sign': sig,})    #'nonce':nonce()
  38.         url='https://wex.nz/tapi/'
  39.     else:
  40.         url='https://wex.nz/api/3/'+url
  41.     rop = urllib2.urlopen(urllib2.Request(url, ps,hd),context=ssl._create_unverified_context())
  42.     data = json.loads(rop.read())
  43.     rop.close()
  44.     return data
  45.  
  46. def rqurl2(met,par={}):     #(trade api)
  47.     par['method']=met
  48.     res=rqurl('',wexAKey,wexASec,par)
  49.     return res
  50.  
  51. def dds(par):   #конверт в dec через str
  52.     ret=Decimal(str(par))
  53.     return ret
  54.  
  55. def runBot():
  56.     fpr=''  #полный список пар для запроса
  57.     for pr in tkPar:
  58.         fpr=pr if fpr=='' else fpr+'-'+pr
  59.     dep=rqurl('depth/'+fpr) #информацию о активных ордерах пары
  60.     bal=rqurl2('getInfo')
  61.     for pr in tkPar:    #проверить балансировку и если надо сделать ордер
  62.         c1,c2=pr.split('_') #названия валют пары
  63.         bf=bal['return']['funds']
  64.         tp=tkPar[pr]
  65.         b1=dds(bf[c1])-dds(tp[2])
  66.         b2=dds(bf[c2])-dds(tp[3])
  67.         prs=dep[pr]['asks'][0]
  68.         prb=dep[pr]['bids'][0]
  69.         pp=dds(tp[1])
  70.        
  71.         dprs=dds(prs[0])
  72.         dprb=dds(prb[0])
  73.         bm=b1*pp*dprs
  74.         bl=b1*pp*dprb
  75.         dtp=dds(tp[0])
  76.         print pr
  77. #       print(b1,b2,bm,bl,dtp)      #тут ещё условия для оптимизации
  78.         if b2<bm:               #продажа или покупка что то 1!!!
  79.             am=((bm-b2)/(dprs*2)).quantize(dtp)
  80.             if am<dtp:  #меньше min не ставить
  81.                 continue
  82.             res=rqurl2('Trade',{'pair':pr,'type':'sell','rate':str(dprs),'amount':str(am)})
  83.             print 'sell',am #,res
  84.         else:
  85.             if b2>bl:
  86.                 am=((b2-bl)/(2*dprb)).quantize(dtp)
  87.                 if am<dtp:  #меньше min не ставить
  88.                     continue
  89.                 res=rqurl2('Trade',{'pair':pr,'type':'buy','rate':str(dprb),'amount':str(am)})
  90.                 print 'buy',am  #,res
  91.  
  92. #если не учитывать открытые ордера то если баланс=0 с 1 стороны выставит весь баланс 2ой в ордера!!!
  93. #args=sys.argv  #короче для старта должно быть примерно cof=b2/b1
  94. if __name__ == '__main__':
  95.     for i in range(100000):
  96.         print i
  97.         try:
  98.             runBot()
  99.         except:
  100.             print 'pass some erorr'
  101.         time.sleep(5)   #спать 10сек
RAW Paste Data