reddish111

wexbot01

Nov 4th, 2017
980
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. #кофициент bns и вычеты балансов 'min_amount',cof=b2/b1,bns,min_b1,min_b2
  19. tkPar={'usdet_usd':['0.2','1','0.02','0','0'],'ruret_rur':['8','2','0.01','0','1500']}
  20.  
  21. def rqurl(url,key='',secret='',param=''):   #(Low Level API call)
  22.     ps={}
  23.     hd={'User-Agent':'bot','Content-type':'application/x-www-form-urlencoded'}
  24.     if param!='':
  25.         param['nonce']=int(time.time())
  26.         ps=urllib.urlencode(param)
  27.         sig = hmac.new(secret,ps, digestmod=hashlib.sha512).hexdigest()
  28.         hd.update({'Key': key,'Sign': sig,})    #'nonce':nonce()
  29.         url='https://wex.nz/tapi/'
  30.     else:
  31.         url='https://wex.nz/api/3/'+url
  32. #   print (url, ps,hd)
  33.     rop = urllib2.urlopen(urllib2.Request(url, ps,hd),context=ssl._create_unverified_context())
  34.     data = json.loads(rop.read())
  35. #   print data
  36.     rop.close()
  37.     return data
  38.  
  39. def rqurl2(met,par={}):     #(trade api)
  40.     par['method']=met
  41.     res=rqurl('',wexAKey,wexASec,par)
  42.     return res
  43.  
  44. def dds(par):   #конверт в dec через str
  45.     ret=Decimal(str(par))
  46.     return ret
  47.  
  48. amPrBuy={}  #масив pair*цен*sumм_закупа
  49.  
  50. def amftab(pair,prl,up=False,n=None):
  51.     res=dds('0')
  52.     poped=[]
  53.     if amPrBuy.get(pair) is None:
  54.         amPrBuy[pair]={}
  55.     if up!=False:   #обновить
  56.         if n[1]>0:
  57.             if amPrBuy[pair].get(n[0]) is None:
  58.                 amPrBuy[pair][n[0]] = n[1]
  59.             else:
  60.                 amPrBuy[pair][n[0]] = amPrBuy[pair][n[0]]+n[1]
  61.         else:
  62.             amn=amPrBuy[pair].get(n[0])
  63.             if amn is None:
  64.                 amn=0
  65.             namn=amn + n[1]
  66.             if namn >0 :    #добавить | обновить
  67.                 amPrBuy[pair][n[0]]=namn
  68.             else:
  69.                 if amn!=0:
  70.                     amPrBuy[pair].pop(n[0])
  71.                 for pr in amPrBuy[pair]:
  72.                     if pr<n[0]:
  73.                         namn=amPrBuy[pair][pr]+namn
  74.                         if namn>0:
  75.                             amPrBuy[pair][pr]=namn
  76.                             break
  77.                         else:
  78.                             poped.append(pr)
  79.     else:   #выдать сумму балансов ниже цены
  80.         for pr in amPrBuy[pair]:
  81.             if pr<prl:
  82.                 res=res+amPrBuy[pair][pr]
  83.     for i in poped: #удалить всё использованное
  84.         amPrBuy[pair].pop(i)
  85.     return res
  86.  
  87.  
  88. def runBot():
  89.     fpr=''  #полный список пар для запроса
  90.     for pr in tkPar:
  91.         fpr=pr if fpr=='' else fpr+'-'+pr
  92.     dep=rqurl('depth/'+fpr) #информацию о активных ордерах пары
  93.     bal=rqurl2('getInfo')
  94.     time.sleep(1)       #чтоб nonce + было
  95.     for pr in tkPar:    #проверить балансировку и если надо сделать ордер
  96.         c1,c2=pr.split('_') #названия валют пары
  97.         bf=bal['return']['funds']
  98.         tp=tkPar[pr]
  99.         b1=dds(bf[c1])-dds(tp[3])
  100.         b2=dds(bf[c2])-dds(tp[4])
  101.         prs=dep[pr]['asks'][0]
  102.         prb=dep[pr]['bids'][0]
  103.         pp=dds(tp[1])
  104.  
  105.         dprs=dds(prs[0])
  106.         dprb=dds(prb[0])
  107.         bm=b1*pp*dprs
  108.         bl=b1*pp*dprb
  109.         dtp=dds(tp[0])
  110.         print pr,'None' if amPrBuy.get(pr) is None else amPrBuy[pr]
  111.         print(b1,b2,bm,bl,dtp)      #тут ещё условия для оптимизации
  112.         if b2<bm:               #продажа или покупка что то 1!!!
  113.             prl=dprs*(1-dds(tp[2]))
  114.             am=amftab(pr,prl).quantize(dtp) #ставить ордера если есть запас по таблице
  115.             am2=((bm-b2)/(2*dprs)).quantize(dtp)    #выбрать балансер
  116.             if am2<am:
  117.                 am=am2          #поставить меньшее             
  118.             if am<dtp:  #меньше min не ставить
  119.                 continue
  120.  
  121.             res=rqurl2('Trade',{'pair':pr,'type':'sell','rate':str(prs[0]),'amount':str(am)})
  122.             if res.get('success')==True:
  123.                 amftab(pr,prl,True,[prl,-am])   #обновить таблицу
  124.                 print 'create sell',prs[0],am   #,res
  125.         else:
  126.             if b2>bl:
  127.                 am=((b2-bl)/(2*dprb)).quantize(dtp)
  128.                 if am<dtp:  #меньше min не ставить
  129.                     continue
  130.                 res=rqurl2('Trade',{'pair':pr,'type':'buy','rate':str(prb[0]),'amount':str(am)})
  131. #               print res
  132.                 if res.get('success')==True:
  133.                     amftab(pr,dds(prb[0]),True,[dds(prb[0]),am])    #обновить таблицу
  134.                     print 'create buy',prb[0],am    #,res
  135.  
  136. #если не учитывать открытые ордера то если баланс=0 с 1 стороны выставит весь баланс 2ой в ордера!!!
  137. #args=sys.argv  #короче для старта должно быть примерно cof=b2/b1
  138. if __name__ == '__main__':
  139.     for i in range(100000):
  140.         print i
  141. #       try:
  142.         runBot()
  143. #       except:
  144. #           print 'pass some erorr'
  145.         time.sleep(10)  #спать 10сек
RAW Paste Data