Advertisement
Guest User

Untitled

a guest
Jul 21st, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.37 KB | None | 0 0
  1. import pandas as pd
  2. import ccxt
  3. import time
  4. import pprint as pp
  5. import threading
  6. from multiprocessing import Process
  7. from array import array
  8.  
  9. from datetime import datetime, timedelta
  10. #usr_time = 12  # Time for candles
  11. utc_time = str(datetime.utcnow().strftime("%y-%m-%d-%H-%M")).replace(' ', ''  )  # TODO Пофиксить!
  12. exchange = ccxt.binance()
  13.  
  14.  
  15. def get_time(hours):
  16.     utc = datetime.utcnow()
  17.     utc_past = utc - timedelta(hours=hours)
  18.     #print(f'Current utc time: {utc}\nPrev 12h: {utc_past}')
  19.     return {'Current': utc.strftime("%Y-%m-%d %H:%M:%S"), 'Past': utc_past.strftime("%Y-%m-%d %H:%M:%S")}
  20.  
  21.  
  22.  
  23. def get_ticker():
  24.     symbol = str(input('Ticker: > ').upper())
  25.     market = exchange.load_markets().keys()
  26.     while symbol not in market:
  27.         symbol = str(input(f'Can\'t find {symbol}. Try again: >').upper())
  28.     return symbol
  29.  
  30.  
  31. def collection(ticker):
  32.     usr_time = int(input('How long do you want to receive the candles. \n'))
  33.     from_timestamp = exchange.parse8601(get_time(usr_time)['Past'])
  34.     t_frame = exchange.describe()['timeframes']
  35.     period = 16
  36.     while period not in t_frame:
  37.         period = str(input('Candle timeframe: > '))
  38.     ohlcv = exchange.fetch_ohlcv(ticker, period, since=from_timestamp)
  39.     print(len(ohlcv))
  40.     return ohlcv
  41.  
  42.  
  43. def collection_auto(ticker, usr_time):
  44.     from_timestamp = exchange.parse8601(get_time(usr_time)['Past'])
  45.     period = '1m'
  46.     ohlcv = exchange.fetch_ohlcv(ticker, period, since=from_timestamp)
  47.     print(len(ohlcv))
  48.     return ohlcv
  49.  
  50.  
  51. def shaping(symbol, coll):
  52.     # Vars
  53.     part_symbol = symbol.split('/')
  54.     # Make Pandas DataFrame
  55.     df = pd.DataFrame.from_dict(coll).rename(index=int, columns={0: 'date', 1: 'open', 2: 'high', 3: 'low', 4: 'close', 5: 'vol'})
  56.     pd.set_option('display.expand_frame_repr', False)
  57.     pd.options.mode.chained_assignment = None  # Kill warning msg
  58.     df['datetime'] = pd.to_datetime(df['date'], unit='ms')
  59.     df = df.reindex_axis(['datetime', 'date', 'open', 'high', 'low', 'close', 'vol'], axis=1)
  60.     df['price_change %'] = (df['close'].pct_change()) * 100
  61.     df['vol_change %'] = (df['vol'].pct_change()) * 100
  62.     # Make color
  63.     df['color'] = ' '
  64.     df['color'][df['close'] == df['open']] = 'Dodge'
  65.     df['color'][df['close'] > df['open']] = 'Green'
  66.     df['color'][df['close'] < df['open']] = 'Red'
  67.     # Show tail
  68.     print(df.tail())
  69.     # Console output
  70.     print(
  71.       '-'*90,
  72.       '\nVolume 12H: {} {}\n'
  73.       'Mean volume 12H: {:.3f}\n'
  74.       'Highest price 12H: {:.8f}'.format(df['vol'].sum(), part_symbol[0], df['vol'].mean(), df['high'].max())
  75.     )
  76.     # Create Excel file
  77.     try:
  78.         create_writer(df, part_symbol)
  79.     except Exception as e:
  80.         print(e)
  81.     return 'Done'
  82.  
  83.  
  84. def exchange_request(symbol):
  85.     print('========proverka========')
  86.     part_symbol = symbol.split('/')
  87.     something =  binance.fetch_ticker(part_symbol)
  88.  
  89.  
  90. def create_writer(df, part_symbol):
  91.     # Create a Pandas Excel writer using XlsxWriter as the engine.
  92.     writer = pd.ExcelWriter(f'{part_symbol[0]}-{exchange.name}-{utc_time}.xlsx', engine='xlsxwriter')
  93.     workbook = writer.book
  94.     sheet_name = part_symbol[0]
  95.     df.to_excel(writer, sheet_name=sheet_name)
  96.     worksheet = writer.sheets[sheet_name]
  97.     worksheet.conditional_format('H1:H1048576',{'type': '3_color_scale'})
  98.     colorize_candle(workbook, worksheet)
  99.     writer.save()
  100.     return 'Done'
  101.  
  102.  
  103. def colorize_candle(workbook, worksheet):
  104.     # Colors
  105.     red = workbook.add_format({'bg_color': '#f97e6f'})
  106.     green = workbook.add_format({'bg_color': '#7dc67d'})
  107.     gray = workbook.add_format({'bg_color': '#D3D3D3'})
  108.     # Colorize
  109.     worksheet.conditional_format('K1:K1048576',{'type': 'text', 'criteria': 'containing', 'value':'Green' , 'format':green})
  110.     worksheet.conditional_format('K1:K1048576',{'type': 'text', 'criteria': 'containing', 'value':'Red' , 'format':red})
  111.     worksheet.conditional_format('K1:K1048576',{'type': 'text', 'criteria': 'containing', 'value':'Dodge' , 'format':gray})
  112.  
  113.  
  114. def od_1():
  115.     usr_time = 12
  116.     ticker = 'ETH/BTC'
  117.     data = collection_auto(ticker, usr_time)
  118.     shaping(ticker, data)
  119.  
  120.  
  121. def clearing(usr_input):
  122.     market = exchange.load_markets()
  123.     data = [ticker for ticker in usr_input if ticker in market]
  124.     print(data)
  125.     return(data)
  126.  
  127.  
  128. def fetch_n_tuple(exchange):
  129.     tickers = exchange.fetch_tickers()
  130.     return [(k, float(v['info']['priceChangePercent'])) for k, v in tickers.items()]
  131.  
  132.  
  133. def sorter(data, number):
  134.     from operator import itemgetter
  135.     s_data = sorted(data, key=itemgetter(1), reverse=True)
  136.     return {'Winners': s_data[:number], 'Losers': s_data[-number:]}
  137.  
  138.  
  139. # Start
  140. def main():
  141.     choice =  int(input('Выберите режим работы программы. 1 - ручной, 2 - автоматический. \n'
  142.                         'В ручном режиме все задается пользователем, в автоматическом вводится только пара.\n'
  143.                         'В автоматическом режиме тикеры всегда собираются по минуте. >\n '))
  144.     if choice == 1:
  145.         print('Выбран ручной режим.\n')
  146.         ticker = get_ticker()
  147.         data = collection(ticker)
  148.         shaping(ticker, data)
  149.     elif choise == 2:
  150.         print('Выбран автоматический режим.\n')
  151.         choice_two = int(input('1 - Собрать данные по паре за 12ч.\n'
  152.                                '2 - Собирать данные по паре каждые 12ч, пока программа не остановится.\n'
  153.                                '3 - Собрать данные за 12ч и начать выполнение 2-х одновременных задач.\n'
  154.                                '4 - Выдать 12ч срез наиболее выросших/упаввших пар.\n'
  155.                                '5 - Собрать сразу несколько пар.\n'))
  156.         usr_time = 12
  157.         if choice_two == 1:
  158.                 ticker = get_ticker()
  159.                 data = collection_auto(ticker,usr_time)
  160.                 shaping(ticker, data)
  161.         elif choice_two == 2:
  162.             otv = 1
  163.             ticker = get_ticker()
  164.             while(otv == 1):
  165.                  data = collection_auto(ticker, usr_time)
  166.                  shaping(ticker, data)
  167.                  time.sleep(5)
  168.         elif choice_two == 3:
  169.                 ticker = get_ticker()
  170.                 data = collection_auto(ticker, usr_time)
  171.                 shaping(ticker, data)
  172.                 time.sleep(5)
  173.                 p1 = Process(target = od_1())
  174.                 p1.start()
  175.                 p2 = Process(target = exchange_request(ticker))
  176.                 p2.start()
  177.         elif choice_two == 4:
  178.             data = fetch_n_tuple(exchange)  # Fetching
  179.             pp.pprint(sorter(data, 10))  # Sorting
  180.         elif choice_two == 5:
  181.             ticker = input('Введите какие пары вы хотиие собрать:\n').upper().split()
  182.             ticker = clearing(ticker)
  183.             lean_str = int(len(ticker))
  184.             for x in range(0, lean_str):
  185.                 data = collection_auto(ticker[x], usr_time)
  186.                 shaping(ticker[x], data)
  187.  
  188.  
  189. #ETH/BTC
  190. if __name__ == '__main__':
  191.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement