Advertisement
Guest User

Kalle Hallden Trading bot

a guest
May 18th, 2021
805
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.97 KB | None | 0 0
  1.  
  2. # !!!
  3. # This code was written by Kalle Hallden, see https://youtu.be/bARCE45FM4s?t=364
  4. # As mentioned in the comments;
  5. # "The code shown for that split second doesn’t have the purchase call implemented. So that someone who isn’t super code savvy won’t copy the code and accidentally start trading" - Kalle
  6.  
  7. import krakenex
  8. from pykrakenapi import KrakenAPI
  9. import time
  10. import decimal
  11. import json
  12.  
  13. # k = KrakenAPI(kraken_api)
  14. # df, last = k.get_ohlc_data("BCHUSD", ascending=True)
  15. def now():
  16.     return decimal.Decimal(time.time())
  17.  
  18. def get_balance():
  19.     with open('balance.json', 'r') as f:
  20.         try:
  21.             return json.load(f)
  22.         except:
  23.             # change this for the actual query to the database once the script is working
  24.             return {'ZUSD' : '1000.0', 'EUR.HOLD' : '0.0000'}
  25.          # print(k.query_private('Balance')['result'])
  26.         # return k.query_private('Balance')['result']
  27.  
  28.  
  29. def update_balance(amount, name, price, sold):
  30.     balance = get_balance()
  31.     if sold:
  32.         balance.pop(name[:-4], None)
  33.         balance['ZUSD'] = str(float(balance['ZUSD']) + amount*price)
  34.     else:
  35.         balance['ZUSD'] = str(float(balance['ZUSD'] - (amount*price)))
  36.         balance[name[:-4]] = str(amount)
  37.     save_balance(balance)
  38.     return balance
  39.  
  40. def save_balance(data):
  41.     with open('balance.json', 'w') as f:
  42.         json.dump(data, f, indent=4)
  43.  
  44. # get the price data for the crypto
  45. def get_crypto_data(pair, since):
  46.     ret = k.query_public('OHLC', data = {'pair': pair, 'since': since})
  47.     return ret['result'][pair]
  48.  
  49. def get_purchasing_price(name):
  50.     trades = load_trades()
  51.     return trades[name][-1]['price_usd']
  52.  
  53. def load_trades():
  54.     trades = {}
  55.     with open('trades.json', 'r') as f:
  56.         try:
  57.             trades = json.load(f)
  58.         except:
  59.             for crypto in pairs:
  60.                 trades[crypto] = []
  61.     return trades
  62.  
  63. def save_crypto_data(data):
  64.     with open('data.json', 'w') as f:
  65.         json.dump(data, f, indent=4)
  66.  
  67. def load_crypto_data_from_file():
  68.     data = {}
  69.     with open('data.json', 'w') as f:
  70.         try:
  71.             data = json.load(f)
  72.         except:
  73.             data = make_crypto_data(data)
  74.             save_crypto_data(data)
  75.     return data
  76.  
  77. def make_crypto_data(data):
  78.     for name in get_pairs():
  79.         data[name] = {
  80.             'high': [],
  81.             'low' : [],
  82.             'close' : [],
  83.             'prices' : []
  84.         }
  85.     return data
  86.  
  87. def save_trade(close, name, bought, sold, amount):
  88.     # saves trades to json file
  89.     trade = {
  90.         'time-stamp' : str(int(time.time())),
  91.         'price_usd' : close,
  92.         'bought' : bought,
  93.         'sold' : sold,
  94.         'amount' : amount
  95.     }
  96.     print('TRADE:')
  97.     print(json.dumps(trade, indent=4))
  98.     trades = load_trades()
  99.     trades[name].append(trade)
  100.     with open('trades.json', 'w') as f:
  101.         json.dump(trades, f, indent=4)
  102.  
  103. def buy_crypto(crypto_data, name):
  104. # executes trade
  105.     analysis_data = clear_crypto_data(name)
  106.     # make sure to make the trade before the next line of code
  107.     # find what we can buy for
  108.     price = float(crypto_data[-1][4])
  109.     funds = get_available_funds()
  110.     amount = funds * (1 / price)
  111.     balance = update_balance(amount, name, price, False)
  112.     # amount = get_balance()[name[:-4]]
  113.     save_trade(price, name, True, False, amount)
  114.     print('buy')
  115.  
  116. def sell_crypto(crypto_data, name):
  117.     balance = get_balance()
  118.     analysis_data = clear_crypto_data(name)
  119.     price = float(crypto_data[-1][4])
  120.     amount = float(balance[name[:-4]])
  121.     balance = update_balance(amount, name, price, True)
  122.     save_trade(price, name, False, True, amount)
  123.     print('sell')
  124.  
  125. def clear_crypto_data(name):
  126.     data = load_crypto_data_from_file()
  127.     for key in data[name]:
  128.         data[name][key] = delete_entries(data[name], key)
  129.     save_crypto_data(data)
  130.     return data
  131.  
  132. def delete_entries(data, key):
  133.     clean_array = []
  134.     for entry in data[key][-10:]:
  135.         clean_array.append(entry)
  136.     return clean_array
  137.  
  138. def get_available_funds():
  139.     balance = get_balance()
  140.     money = float(balance['ZUSD'])
  141.     cryptos_not_owned = 6 - (len(balance)-2)
  142.     funds = money / cryptos_not_owned
  143.     return funds
  144.  
  145. def bot(since, k, pairs):
  146.     while True:
  147.         # comment out to track the same "since"
  148.         # since = ret['result']['last']
  149.         for pair in pairs:
  150.             trades = load_trades()
  151.  
  152.             if len(trades[pair]) > 0:
  153.                 crypto_data = get_crypto_data(pair, since)
  154.                 if trades[pair][-1]['sold'] or trades[pair][-1] == None:
  155.                     # check if we should buy
  156.                     check_data(pair, crypto_data, True)
  157.                 if trades[pair][-1]['bought']:
  158.                     # check if we should sell
  159.                     check_data(pair, crypto_data, False)
  160.             else:
  161.                 crypto_data = get_crypto_data(pair, since)
  162.                 check_data(pair, crypto_data, True)
  163.         time.sleep(20)
  164.  
  165. def check_data(name, crypto_data, should_buy):
  166. # TODO: don't repeat-print if list too short
  167.     high = 0
  168.     low = 0
  169.     close = 0
  170.     for b in crypto_data[-100:]:
  171.         if b not in mva[name]['prices']:
  172.             mva[name]['prices'].append(b)
  173.  
  174.         high += float(b[2])
  175.         low += float(b[3])
  176.         close += float(b[4])
  177.     # OBS!!! FIX THIS
  178.     # adds every moving average into the same array
  179.     mva[name]['high'].append(high / 100)
  180.     mva[name]['high'].append(low / 100)
  181.     mva[name]['high'].append(close / 100)
  182.     # print(name)
  183.     save_crypto_data(mva)
  184.     print(json.dumps(mva, indent=4))
  185.     if should_buy:
  186.         try_buy(mva[name], name, crypto_data)
  187.     else:
  188.         try_sell(mva[name], name, crypto_data)
  189.  
  190. def try_buy(data, name, crypto_data):
  191.     # analyse the data to see if it a good opportunity to buy
  192.     make_trade = check_opportunity(data, name, False, True)
  193.     if make_trade:
  194.         buy_crypto(crypto_data, name)
  195.  
  196. def check_opportunity(data, name, sell, buy):
  197.     # calculate percentage increase of each point
  198.     count = 0
  199.     previous_value = 0
  200.     trends = []
  201.     for mva in data['close'][-10:]:
  202.         if previous_value == 0:
  203.             previous_value = mva
  204.         else:
  205.             if mva.previous_data > 1:
  206.                 # uptrend
  207.                 if count < 1:
  208.                     count = 1
  209.                 else:
  210.                     count += 1
  211.                 trends.append('UPTREND')
  212.             elif mva.previous_data < 1:
  213.                 trends.append('DOWNTREND')
  214.                 if count > 0:
  215.                     count = -1
  216.                 else:
  217.                     count -= 1
  218.             else:
  219.                 trends.append('NOTREND')
  220.             previous_value = mva
  221.     # print(trends)
  222.     areas = []
  223.     for mva in reversed(data['close'][-5:]):
  224.         area = 0
  225.         price = float(data['prices'][-1][3])
  226.         if sell:
  227.             purchase_price = float(get_purchasing_price(name))
  228.             if price >= (purchase_price * 1.02):
  229.                 print('Should sell with 10% profit')
  230.                 return True
  231.             if price < purchase_price:
  232.                 print('Selling at a loss')
  233.                 return True
  234.         areas.append(mva / price)
  235.     if buy:
  236.         counter = 0
  237.         if count >= 5:
  238.             for area in areas:
  239.                 counter += area
  240.             if count / 3 >= 1.05:
  241.                 return True
  242.     return False
  243.  
  244. def try_sell(data, name, crypto_data):
  245.     # analyse the data to see if it is a good opportunity to sell
  246.     make_trade = check_opportunity(data, name, True, False)
  247.     if make_trade:
  248.         sell_crypto(crypto_data, name)
  249.  
  250. def get_pairs():
  251.     return ['XETHZUSD', 'XXBTUSD', 'MANAUSD', 'GRTUSD', 'LSKUSD', 'SCUSD']
  252. if __name__ == '__main__':
  253.     k = krakenex.API()
  254.     k.load_key('kraken.key')
  255.     pairs = get_pairs()
  256.     since = str(int(time.time() - 43200))
  257.     mva = load_crypto_data_from_file()
  258.  
  259.     bot(since, k, pairs)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement