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()