Jun-16-2023, 11:42 PM
I made a basic buy bot for a crypto exchange. It searches a database and loops like I want it to, however when there is a trade that is triggered, the loop seems to break. I would like it to loop again even if there is an order made. Here is the code:
import sqlite3
import datetime
import sys
import platform
import time
import base64
import hashlib
import hmac
import urllib.request as urllib2
import dontshare_config
import requests
def calculate_average_score():
# Establish a connection to the database
conn = sqlite3.connect('C:/Users/Chris/Python/Python Projects/mock_database/crypto_data.db')
# Create a cursor
cursor = conn.cursor()
# Calculate the datetime 5 minutes ago from the current time
current_time = datetime.datetime.now()
time_5_minutes_ago = current_time - datetime.timedelta(minutes=5)
# Format the datetime objects to match the database format
current_time_str = current_time.strftime("%Y-%m-%d %H:%M:%S")
time_5_minutes_ago_str = time_5_minutes_ago.strftime("%Y-%m-%d %H:%M:%S")
# Example: Calculate average score within the last 5 minutes
cursor.execute("SELECT AVG(score) FROM crypto_data WHERE time BETWEEN ? AND ?",
(time_5_minutes_ago_str, current_time_str))
average_score = cursor.fetchone()[0]
# Close the connection
conn.close()
if average_score is not None:
return average_score
else:
return 0 # Or any default value you want to use when average_score is None
def get_price(pair):
url = f"https://api.kraken.com/0/public/Depth?pair={pair}"
try:
response = requests.get(url)
response.raise_for_status()
data = response.json()
if 'result' in data:
pair_data = data['result'][pair]
bids = pair_data['bids']
asks = pair_data['asks']
highest_bid = float(bids[0][0])
lowest_ask = float(asks[0][0])
return highest_bid, lowest_ask
else:
return None
except requests.exceptions.RequestException as e:
print(f"Error: {e}")
return None
def make_buy_order_on_kraken(price):
# TODO: Update with your buy order code from Kraken
# Placeholder: Replace with code to execute buy order on Kraken
# Example code:
api_key = dontshare_config.api_key
api_secret = base64.b64decode(dontshare_config.api_secret)
api_domain = "https://api.kraken.com"
api_path = "/0/private/"
# PlaceOrder parameters
api_endpoint = "AddOrder"
api_parameters = f"pair=XXBTZUSD&type=buy&ordertype=limit&volume=0.0002&price={price}"
api_nonce = str(int(time.time() * 1000))
api_postdata = api_parameters + "&nonce=" + api_nonce
api_postdata = api_postdata.encode('utf-8')
api_sha256Data = api_nonce.encode('utf-8') + api_postdata
api_sha256 = hashlib.sha256(api_sha256Data).digest()
api_hmacSha512Data = api_path.encode('utf-8') + api_endpoint.encode('utf-8') + api_sha256
api_hmacsha512 = hmac.new(api_secret, api_hmacSha512Data, hashlib.sha512)
api_sig = base64.b64encode(api_hmacsha512.digest())
api_url = api_domain + api_path + api_endpoint
api_request = urllib2.Request(api_url, api_postdata)
api_request.add_header("API-Key", api_key)
api_request.add_header("API-Sign", api_sig)
api_request.add_header("User-Agent", "Kraken REST API")
print("DEBUG DATA : ")
print("api_url : " + api_url)
print("api_endpoint : " + api_endpoint)
print("api_parameters : " + api_parameters)
print("")
api_reply = urllib2.urlopen(api_request).read()
api_reply = api_reply.decode()
print("API JSON DATA:")
print(api_reply)
sys.exit(0)
def make_sell_order_on_kraken(price):
# TODO: Update with your sell order code from Kraken
# Placeholder: Replace with code to execute sell order on Kraken
# Example code:
api_key = dontshare_config.api_key
api_secret = base64.b64decode(dontshare_config.api_secret)
api_domain = "https://api.kraken.com"
api_path = "/0/private/"
# PlaceOrder parameters
api_endpoint = "AddOrder"
api_parameters = f"pair=XXBTZUSD&type=sell&ordertype=limit&volume=0.0002&price={price}"
api_nonce = str(int(time.time() * 1000))
api_postdata = api_parameters + "&nonce=" + api_nonce
api_postdata = api_postdata.encode('utf-8')
api_sha256Data = api_nonce.encode('utf-8') + api_postdata
api_sha256 = hashlib.sha256(api_sha256Data).digest()
api_hmacSha512Data = api_path.encode('utf-8') + api_endpoint.encode('utf-8') + api_sha256
api_hmacsha512 = hmac.new(api_secret, api_hmacSha512Data, hashlib.sha512)
api_sig = base64.b64encode(api_hmacsha512.digest())
api_url = api_domain + api_path + api_endpoint
api_request = urllib2.Request(api_url, api_postdata)
api_request.add_header("API-Key", api_key)
api_request.add_header("API-Sign", api_sig)
api_request.add_header("User-Agent", "Kraken REST API")
print("DEBUG DATA : ")
print("api_url : " + api_url)
print("api_endpoint : " + api_endpoint)
print("api_parameters : " + api_parameters)
print("")
api_reply = urllib2.urlopen(api_request).read()
api_reply = api_reply.decode()
print("API JSON DATA:")
print(api_reply)
sys.exit(0)
def execute_trading_logic():
average_score = calculate_average_score()
pair = "XXBTZUSD"
if average_score >= 30:
print("Average score is 30 or above. Making buy order on Kraken...")
highest_bid, _ = get_price(pair)
price = round(highest_bid + 0.01, 1) # Round the price to 1 decimal place
make_buy_order_on_kraken(price)
elif average_score <= -30:
print("Average score is -30 or below. Making sell order on Kraken...")
_, lowest_ask = get_price(pair)
price = round(lowest_ask - 0.01, 1) # Round the price to 1 decimal place
make_sell_order_on_kraken(price)
else:
print("No action required.")
while True:
execute_trading_logic()
time.sleep(300) # Sleep for 5 minutes
