Spaces:
Sleeping
Sleeping
File size: 7,618 Bytes
e97cf97 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 |
import pandas as pd
import numpy as np
import ccxt
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import time
import json
from datetime import datetime
import pytz
# Prompt for the symbol
symbols = input('Please input Symbol: ')
timeframe = input("please input time frame: ")
# Initialize Binance Futures API
binance = ccxt.binance({
'options': {'defaultType': 'future'}, # Specify futures
})
def fetch_and_calculate_zscore(symbol, timeframe=timeframe, limit=200, rolling_window=30):
# Fetch OHLCV data
data = binance.fetch_ohlcv(symbol, timeframe=timeframe, limit=limit)
df = pd.DataFrame(data, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
# Convert timestamp to UTC datetime format
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms', utc=True)
# Calculate rolling mean, std, and Z-Score
df['mean'] = df['close'].rolling(window=rolling_window).mean()
df['std'] = df['close'].rolling(window=rolling_window).std()
df['z_score'] = (df['close'] - df['mean']) / df['std']
# Initialize signal columns
df['buy_signal'] = 0
df['sell_signal'] = 0
# Variables to track thresholds
in_sell_signal = False
in_buy_signal = False
signal_triggered = False # Track if any signal was triggered
# Iterate through the dataframe to track signals
for i in range(1, len(df)):
current_z = df.loc[i, 'z_score']
previous_z = df.loc[i - 1, 'z_score']
# Handle Z-score crossing extreme thresholds for sell signal
if not in_sell_signal:
# Z-score crosses above 1.85 (potential sell signal)
if current_z > 1.85 and previous_z <= 1.85:
#print(f"Sell signal candidate at index {i}, Z-score = {current_z}")
in_sell_signal = True
# Handle Z-score crossing extreme thresholds for buy signal
if not in_buy_signal:
# Z-score crosses below -1.85 (potential buy signal)
if current_z < -1.85 and previous_z >= -1.85:
#print(f"Buy signal candidate at index {i}, Z-score = {current_z}")
in_buy_signal = True
# Keep the signal active if the Z-score remains within the range
if in_sell_signal:
# Sell signal is triggered between 1.85 and 1
if 1 <= current_z <= 1.85:
df.loc[i, 'sell_signal'] = 1 # Sell signal active
#print(f"Sell signal active at index {i}, Z-score = {current_z}")
signal_triggered = True
# Exit sell signal if Z-score falls below 1
elif current_z < 1:
in_sell_signal = False
#print(f"Sell signal exited at index {i}, Z-score = {current_z}")
if in_buy_signal:
# Buy signal is triggered between -1.85 and -1
if -1.85 <= current_z <= -1:
df.loc[i, 'buy_signal'] = 1 # Buy signal active
#print(f"Buy signal active at index {i}, Z-score = {current_z}")
signal_triggered = True
# Exit buy signal if Z-score rises above -1
elif current_z > -1:
in_buy_signal = False
#print(f"Buy signal exited at index {i}, Z-score = {current_z}")
return df
utc_time = datetime.utcnow()
philippine_tz = pytz.timezone('Asia/Manila')
philippine_time = pytz.utc.localize(utc_time).astimezone(philippine_tz)
# Format the time in your preferred format
formatted_ph_time = philippine_time.strftime("%Y-%m-%d %H:%M:%S")
# Function to update signals in JSON
# Function to update signals in JSON with real-time Z-Score
def update_signal_json(symbol, df, json_data):
# Extract latest data point
latest_data = df.iloc[-1]
# Prepare new entry with real-time Z-Score
signal_entry = {
"symbol": symbol,
"time_frame": timeframe,
"date_and_time": latest_data['timestamp'].strftime("%Y-%m-%d %H:%M:%S"),
"realtime_ph_time": formatted_ph_time, # Add the local Philippine time (UTC+8)
"current_price": latest_data['close'],
"zscore": latest_data['z_score']
}
# Remove previous entries for this symbol
json_data = [entry for entry in json_data if entry['symbol'] != symbol]
# Add the latest entry
json_data.append(signal_entry)
return json_data
# Function to plot data
def plot_data(btcdom_df, pair_df, btc_df, ax):
ax.clear() # Clear previous plotspython /home/gjin/Documents/zscore/main_with_plot.py
# Plot Z-Scores for all pairs
ax.plot(btcdom_df['timestamp'], btcdom_df['z_score'], label="BTCDOM/USDT Z-Score", color='blue', linestyle='-')
ax.plot(pair_df['timestamp'], pair_df['z_score'], label=f"{symbols}/USDT Z-Score", color='orange', linestyle='-')
ax.plot(btc_df['timestamp'], btc_df['z_score'], label="BTC/USDT Z-Score", color='gray', linestyle='-')
# Add thresholds
ax.axhline(y=2, color='red', linestyle='--', label='Overbought Threshold')
ax.axhline(y=-2, color='green', linestyle='--', label='Oversold Threshold')
# Plot Buy and Sell signals for BTCDOM/USDT
ax.scatter(btcdom_df[btcdom_df['buy_signal'] == 1]['timestamp'], btcdom_df[btcdom_df['buy_signal'] == 1]['z_score'],
marker='^', color='green', label='BTCDOM Buy Signal')
ax.scatter(btcdom_df[btcdom_df['sell_signal'] == 1]['timestamp'], btcdom_df[btcdom_df['sell_signal'] == 1]['z_score'],
marker='v', color='red', label='BTCDOM Sell Signal')
# Plot signals for the other pair
ax.scatter(pair_df[pair_df['buy_signal'] == 1]['timestamp'], pair_df[pair_df['buy_signal'] == 1]['z_score'],
marker='^', color='green', alpha=0.5, label=f"{symbols} Buy Signal")
ax.scatter(pair_df[pair_df['sell_signal'] == 1]['timestamp'], pair_df[pair_df['sell_signal'] == 1]['z_score'],
marker='v', color='red', alpha=0.5, label=f"{symbols} Sell Signal")
# Format plot
ax.set_title(f"Z-Scores Signals {timeframe} for {symbols}/USDT Futures", fontsize=16)
ax.set_xlabel("Time (UTC)", fontsize=12)
ax.set_ylabel("Z-Score", fontsize=12)
ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m-%d %H:%M"))
ax.legend(loc="upper left")
ax.grid(True)
plt.xticks(rotation=45)
# Real-time monitoring
# Real-time monitoring
def run_real_time():
json_data = []
try:
with open('signals.json', 'r') as file:
json_data = json.load(file)
except FileNotFoundError:
pass
fig, ax = plt.subplots(figsize=(14, 7))
plt.ion() # Interactive plotting
while True:
btcdom_symbol = 'BTCDOM/USDT'
pair_symbol = f'{symbols}/USDT'
btc_symbol = 'BTC/USDT'
btcdom_df = fetch_and_calculate_zscore(btcdom_symbol)
pair_df = fetch_and_calculate_zscore(pair_symbol)
btc_df = fetch_and_calculate_zscore(btc_symbol)
# Update JSON for BTCDOM
json_data = update_signal_json(btcdom_symbol, btcdom_df, json_data)
# Update JSON for selected pair
json_data = update_signal_json(pair_symbol, pair_df, json_data)
# Update JSON for BTC/USDT
json_data = update_signal_json(btc_symbol, btc_df, json_data)
# Save updated JSON
with open('signals.json', 'w') as file:
json.dump(json_data, file, indent=4)
# Update plot
plot_data(btcdom_df, pair_df, btc_df, ax)
plt.draw()
plt.pause(60) # Update every 60 seconds
time.sleep(60)
# Run the real-time system
run_real_time()
|