1 contributor
#!/usr/bin/env python3
# pip3 install -r requirements.txt
import time
import datetime
import json
import sys
import bids
import offers
import reports
import calc
import launch
import queries
from binance.client import Client
#========== Reading CONFIG file ==========#
with open('config.json', 'r') as config_file: # Open and read the 'config.json' file
config_data = json.load(config_file)
#---------- Binance_bot data ----------#
API_KEY = config_data['Binance_bot']['api_key']
API_SECRET = config_data['Binance_bot']['api_secret']
TRADING_ASSET = config_data['Binance_bot']['asset'] # Coin to trade against of (ex. BTC)
TRADING_COIN = config_data['Binance_bot']['coin'] # Trading coin (ex. BNB)
TRADING_PAIR = str(TRADING_COIN + TRADING_ASSET) # Trading pair: BNB for BTC => BNBBTC
SPREAD = int(config_data['Binance_bot']['spread']) # Distance between: BID => OFFER in number of STEPS (see line below)
SPREAD_TO_PRINT = config_data['Binance_bot']['spread']
STEP = float(config_data['Binance_bot']['step']) # Distance between: order(of any type) => order(of any type) in asset value
STEP_TO_PRINT = config_data['Binance_bot']['step']
COINS_PER_ORDER = float(config_data['Binance_bot']['coins_per_order']) # Quantity of coins for one BID
COINS_PER_ORDER_TO_PRINT = config_data['Binance_bot']['coins_per_order']
#---------- Email_sender data ----------#
SENDER_ADDRESS = config_data['Email_sender']['sender_address']
SENDER_PASS = config_data['Email_sender']['sender_pass']
RECEIVER_ADDRESS = config_data['Email_sender']['receiver_address']
#========== Connecting to API ==========#
CLIENT = Client(API_KEY, API_SECRET) # Connecting to the Binance API
#========== Setting Up Constants ==========#
INIT_COIN_PRICE = queries.get_coin_price() # An initial coin price
NUM_DECIMAL_PLACES = calc.count_decimal_places() # Round all prices to the constant number of decimal places
PRICES_ARR = calc.generate_grid_of_prices() # An array of initial prices
#========== If ran as main ==========#
if __name__ == "__main__":
#========== Setting UP ==========#
current_day = datetime.datetime.now().strftime("%d") # Current day of month
current_week = datetime.datetime.now().strftime("%W") # Current day of the week
current_month = datetime.datetime.now().strftime("%b") # Current month
tmp_day = current_day # Temporal variable for holding current day of month
tmp_week = current_week # Temporal variable for holding current day of the week
tmp_month = current_month # Temporal variable for holding current month
asset_balance = CLIENT.get_asset_balance(asset=TRADING_ASSET) # An array of info about the original balance
asset_balance_free = float(asset_balance['free']) # Original balance of free asset
coin_balace = CLIENT.get_asset_balance(asset=TRADING_COIN) # An array of info about the original coin balance
coin_balance_free = float(coin_balace['free']) # Original balance of free coin
window_price = calc.find_current_window_price() # An empty window for BID/OFFER orders
best_offer_price = calc.find_best_offer_price(window_price) # Current best OFFER
best_bid_price = calc.find_best_bid_price(best_offer_price) # Current best BID
#========== Printing INFO ==========#
launch.start_trading_ui(asset_balance_free, coin_balance_free)
print('\n| ----------')
print(f'| Best OFFER: {best_offer_price}')
print(f'| WINDOW: {window_price}')
print(f'| Best BID: {best_bid_price}')
print('| ----------\n')
#========== Placing Initial Orders ==========#
launch.place_init_orders(best_offer_price, window_price, best_bid_price)
#========== Trading Loop ==========#
while True: # The MAIN trading loop
try:
time.sleep(3) # Each 10 seconds send requests to the market
current_day = datetime.datetime.now().strftime("%d") # Update the current day of month
current_week = datetime.datetime.now().strftime("%W") # Update the current day of the week
current_month = datetime.datetime.now().strftime("%b") # Update the current month
if (not queries.order_active(best_offer_price) and queries.get_order_status(best_offer_price) == 'FILLED'
and queries.enough_balance(asset_balance_free, coin_balance_free)): # If the current best-deal OFFER was executed and there is enough balance to continue
offers.cancel_current_best_bid(best_offer_price, best_bid_price) # Cancel current best BID
window_price = calc.up_current_window_price(window_price) # New empty window for BID/OFFER orders
best_offer_price = calc.find_best_offer_price(window_price) # New best OFFER
best_bid_price = calc.find_best_bid_price(best_offer_price) # Current best BID
offers.update_rel_to_best_offer(best_offer_price, best_bid_price)
reports.save_order("SELL", best_offer_price)
print('\n| ----------')
print(f'| Best OFFER: {best_offer_price}')
print(f'| WINDOW: {window_price}')
print(f'| Best BID: {best_bid_price}')
print('| ----------\n')
if (not queries.order_active(best_bid_price) and queries.get_order_status(best_bid_price) == 'FILLED'
and queries.enough_balance(asset_balance_free, coin_balance_free)): # If the current best-deal BID was executed and there is enough balance to continue
bids.cancel_current_best_offer(best_offer_price, best_bid_price) # Cancel current best OFFER
window_price = calc.down_current_window_price(window_price) # New empty window for BID/OFFER orders
best_offer_price = calc.find_best_offer_price(window_price) # New best OFFER
best_bid_price = calc.find_best_bid_price(best_offer_price) # Current best BID
bids.update_rel_to_best_bid(best_offer_price, best_bid_price)
reports.save_order("BUY", best_bid_price)
print('\n| ----------')
print(f'| Best OFFER: {best_offer_price}')
print(f'| WINDOW: {window_price}')
print(f'| Best BID: {best_bid_price}')
print('| ----------\n')
if current_day != tmp_day: # If day has passed
#reports.daily_report(queries.num_closed_inday_offers(), calc.calc_asset_profit(queries.num_closed_inday_offers()))
tmp_day = current_day
#print('\n| Daily Report Generated\n')
if current_week != tmp_week: # If week has passed
reports.weekly_report(queries.num_closed_inweek_offers(), calc.calc_asset_profit(queries.num_closed_inweek_offers()))
tmp_week = current_week
print('\n| Weekly Report Generated\n')
if current_month != tmp_month: # If month has passed
#reports.monthly_report(queries.num_closed_inmonth_offers(), calc.calc_asset_profit(queries.num_closed_inmonth_offers()))
tmp_month = current_month
#print('\n| Monthly Report Generated\n')
else:
continue
except KeyboardInterrupt:
sys.exit()
except Exception as e:
print(f'[!!!] [{datetime.datetime.now().strftime("%H:%M")}] {e}')
with open('errors.log', 'a') as errors_log:
errors_log.write(f'[{datetime.datetime.now().strftime("%d %b %Y; %H:%M")}] {e}\n')
continue