51 lines
1.7 KiB
Python
51 lines
1.7 KiB
Python
import numpy as np
|
|
import matplotlib.pyplot as plt
|
|
from v2realbot.controller.services import get_archived_runner_details_byID
|
|
from v2realbot.common.model import RunArchiveDetail
|
|
# Generate sample price data
|
|
timestamps = np.arange('2023-10-27', '2023-10-28', dtype='datetime64[s]')
|
|
price = 100 + np.arange(100) * 0.5
|
|
|
|
id = "e74b5d35-6552-4dfc-ba59-2eda215af292"
|
|
|
|
res, val = get_archived_runner_details_byID(id)
|
|
if res < 0:
|
|
print(res)
|
|
|
|
detail = RunArchiveDetail(**val)
|
|
# detail.indicators[0]
|
|
price = detail.bars["vwap"]
|
|
timestamps = detail.bars["time"]
|
|
|
|
# Calculate the standard deviation of price changes over a specified time interval
|
|
def calculate_volatility(price, window):
|
|
volatility = np.zeros_like(price)
|
|
for i in range(window, len(price)):
|
|
volatility[i] = np.std(price[i - window: i])
|
|
return volatility
|
|
|
|
# Set a threshold for the indicator
|
|
threshold = 0.4
|
|
|
|
# Identify breakout points based on the threshold
|
|
def identify_breakouts(volatility, threshold):
|
|
return volatility > threshold
|
|
|
|
# Plot the price data and the volatility breakout points
|
|
def plot_data(timestamps, price, breakout_points):
|
|
plt.figure(figsize=(12, 6))
|
|
plt.plot(timestamps, price, label='Price')
|
|
breakout_timestamps = timestamps[np.where(breakout_points)[0]]
|
|
breakout_prices = price[np.where(breakout_points)[0]]
|
|
plt.scatter(breakout_timestamps, breakout_prices, color='r', label='Volatility Breakout')
|
|
plt.xlabel('Time')
|
|
plt.ylabel('Price')
|
|
plt.title('Intraday Volatility Breakout Indicator')
|
|
plt.legend()
|
|
plt.show()
|
|
|
|
# Applying the functions
|
|
window = 30
|
|
volatility = calculate_volatility(price, window)
|
|
breakout_points = identify_breakouts(volatility, threshold)
|
|
plot_data(timestamps, price, breakout_points) |