· 4 years ago · Feb 27, 2021, 09:00 PM
1import time
2from binance.client import Client
3from statistics import mean
4
5# ПЕРЕМЕННЫЕ ИСПОЛЬЗУЕМЫЕ В АЛГОРИТМЕ
6
7URL_BINANCE_MARKET = "https://www.binance.com/ru/markets"
8BINANCE_COM = True # Булева переменная, используется как флаг для внешнего цикла while, принимает 2 значения True либо False.
9KEYS = {'APIKey':'WFQb8n8CQLx0rTuJK9QZ4ZXEFtRPrrpO09buRI5rOf0pqayRFWm0jFvbZILpTQ9L',
10 'SecretKey':'g8q4xftQ6UYtwIo3oXTQKvQqadkYwpBOZujZV6aRUDR1uNsV09txE3VGg7MXTKsN'} # Словарь KEYS с 2 параметрами APIKey и
11# SecretKey. По ключу можно обращаться к каждому key по отдельности.
12
13BOT = Binance(API_KEY=KEYS['APIKey'],
14 API_SECRET=KEYS['SecretKey'])# Активация класса Binance_api, благодаря которому, можно стягивать данные о
15# котировках криптовалют с сайта Binance в реальном времени.
16
17CLIENT = Client(KEYS['APIKey'], KEYS['SecretKey']) # Активация метода Client класса Binance, благодаря которому можно формировать
18# ордера на покупку и продажу лотов нужной нам криптовалюты на сайте брокера Binance.
19
20while BINANCE_COM == True: # Внешний цикл While используется для обновления переменных после сделки, а также выбора
21# криптовалюты на рынке https://www.binance.com/ru/markets, которые соответствуют нужным нам условиям.(Наибольшеая просадка
22# за последние 24 часа и объём более 100 миллионов)
23 LIST_PRICE_BY = [] # # Переменная типа список, в который будем складывать все цены инструмента, в момент покупки лота,
24# делается это для дальнейшег усреднения цены.
25 SUM_LOT = 0 # Переменная для хранения общей суммы лотов.
26
27 driver.get(URL_BINANCE_MARKET) # Переходим на сайт "https://www.binance.com/ru/markets"
28
29 Markets = driver.find_elements_by_class_name('css-9d80hs') #Получаем список всех рынков
30
31 for market in Markets: # Итерируемся по этим рынкам
32 if market.text == 'Фьючерсные рынки': # Если на текущей итерации попадается нужный нам рынок нажимаем на него.
33 market.click()
34
35 options = driver.find_elements_by_class_name('css-lkqrqt') # Получаем список опций
36
37 for pair in options: # Итерируясь по опциям выбираем Изм за 24ч и нажимаем на неё, тем самым сортируем криптопары по
38# возрастанию изменения цены за последние 24 часа.
39 if pair.text == 'Изм за 24ч':
40 pair.click()
41
42 symbol = None # Переменная Simbol, в ней будет храниться выбранная криптопара. Изначально задаём ей значение Null, так как
43# может быть такое, что из всего списка все криптопары могут быть объёмом менее 100М.
44
45 for symbol_data in (driver.find_elements_by_class_name('css-1uly3p5')):# Итерируемся по отсортированному списку криптопар
46 old_str = symbol_data.text # Обработка строки
47 new_str = old_str.replace("\n/", "/") # Обработка строки
48 new_str = new_str.split('\n') # Обработка строки
49
50 volume = new_str[5].replace(",", "") # Обработка строки
51 volume = float(volume[0: volume.find('M')]) # Обработка строки, достаём значение объёма криптопары
52
53 if volume > 100: # Если это значение более 100 миллионов фиксируем криптовалюту(записываем значение по ней и прерываем цикл)
54 symbol = new_str[0][0:new_str[0].find(' ')] # Фиксируем криптопару в переменную symbol
55
56 price_pair = new_str[1].replace(",", "")
57 price_pair = float(price_pair[0:price_pair.find('/')]) # фиксируем цену криптопары в переменную price_pair
58 break
59 if symbol == None: # Условный оператор, если symbol так и осталась равна значению Null повторно обращаемся к сайту Binance
60 continue
61
62
63
64 print('Buyyy')
65 price_buy = float(bot.tickerPrice(symbol=pair)['price']) # Фиксируем переменную price_buy (цена по которой будет осуществляться
66# покупка лота)
67 LIST_PRICE_BY.append(price_buy) #Добавляем сразу первую цену в список цен сделки по текущей криптопаре.
68 LOT = 25/price_buy # Рассчитываем значение лота
69 print("lot for deal", LOT)
70 SUM_LOT+=LOT # Сразу фиксируем суммарное значение лотов, на этой итерации оно будет равно лоту, по которому только входим
71# в сделку
72 CLIENT.order_market_buy(symbol=symbol, quantity=LOT) # формируем ордер на покупку криптопары symbol с лотом = LOT
73
74 TAKE_POROFIT = price_buy * 1.01 # Сразу считаем TAKE POROFIT цену покупки умножаем на 1.01
75 print("INPUT_TAKE_POROFIT", TAKE_POROFIT) # Выводим на экран полученные значения
76 print('PRICE BUY =', price_buy) # Выводим на экран полученные значения
77
78
79 cycle = True # Булева переменная, используется как флаг для внешнего внутреннего цикла while, принимает 2 значения True
80# либо False.
81
82 while cycle == True: # Внутренний While цикл, на каждой итерации оценивается текущая ситуации, для принятия решения по сделке
83 ###############STRATEGY###############
84 price_now = float(bot.tickerPrice(symbol=pair)['price']) # Считываем текущую цену криптовалюты
85
86 if price_now >= TAKE_POROFIT: # Если Текущая цена больше или равна TAKE_POROFIT
87 CLIENT.order_market_sell(symbol=symbol, quantity=SUM_LOT) # Завершаем сделку по сумме лотов (на 1 итерации сумма
88 #лотов равна значению Лота)
89 cycle = False # Флаг cycle - меняем на значение False, чтобы не заходить во внутренний цикл, а сразу перейти
90 # на сайт binance для определения новой криптопары(для новой сделки)
91 print("End deal") # Вывод принта на экран о конце сделки.
92 elif (price_now < TAKE_POROFIT) and (price_now > price_by * 0.982): # Если текущая цена менее TAKE_POROFIT
93 # и более чем -2% от цены последней сделки.
94 print("Wait") # Ждём
95 continue # Переходим на следующую итерацию цикла
96 elif price_now <= price_by * 0.98: # Если же цена менее -2 % от цены последней сделки, то:
97 CLIENT.order_market_buy(symbol=symbol, quantity=LOT) # Покупаем криптопару в том же размере лота = LOT
98 SUM_LOT+=LOT # Делаем перерасчёт суммы лотов, теперь она увеличивается на значение = LOT
99 price_buy = float(bot.tickerPrice(symbol=pair)['price']) # Обновляем значение цены покупки price_buy
100
101 LIST_PRICE_BY.append(price_buy) # Добавляем новую цену в список цен в момент сделки(для усреднения)
102 AVERAGING = mean(LIST_PRICE_BY) # Считаем среднее значение по ценам входа, для подсчёта нового TAKE_POROFIT
103 TAKE_POROFIT = AVERAGING * 1.01 # Обновляем TAKE_POROFIT на основании усреднения.
104 print("ADD BY FOR AVERAGE")