import pandas as pd import numpy as np import matplotlib.pyplot as plt import ta
def load_data(): data = pd.read_csv('historical_data.csv') data['Date'] = pd.to_datetime(data['Date']) data.set_index('Date', inplace=True) return data
def calculate_rsi(data, period=14): data['RSI'] = ta.momentum.RSIIndicator(data['Close'], window=period).rsi() return data
def detect_positive_divergence(data): detected_patterns = [] for i in range(1, len(data) - 1): if (data['Close'] < data['Close'][i-1] and data['RSI'] > data['RSI'][i-1]): detected_patterns.append((data.index, 'Positive Divergence')) return detected_patterns
def detect_harmonic_patterns(data): detected_patterns = [] fib_ratios = { 'Gartley': [0.618, 0.786], 'Bat': [0.5, 0.886], 'Butterfly': [0.786, 1.27], 'Crab': [0.382, 1.618] } for i in range(2, len(data) - 2): for pattern, ratios in fib_ratios.items(): high1 = data['High'][i-2] high2 = data['High'] low1 = data['Low'][i-2] low2 = data['Low'] if high1 < high2 and low1 < low2: retracement = (high2 - low1) / (high1 - low1) if ratios[0] <= retracement <= ratios[1]: detected_patterns.append((data.index, f'Bullish {pattern}')) elif high1 > high2 and low1 > low2: retracement = (low2 - high1) / (low1 - high1) if ratios[0] <= retracement <= ratios[1]: detected_patterns.append((data.index, f'Bearish {pattern}')) return detected_patterns
def plot_patterns(data, patterns): plt.figure(figsize=(14, 7)) plt.plot(data['Close'], label='Price') plt.plot(data['RSI'], label='RSI') for pattern in patterns: if pattern[1] == 'Positive Divergence': plt.scatter(pattern[0], data['Close'][pattern[0]], color='orange', label='Positive Divergence') elif 'Bullish' in pattern[1]: plt.scatter(pattern[0], data['Close'][pattern[0]], color='green', label=pattern[1]) elif 'Bearish' in pattern[1]: plt.scatter(pattern[0], data['Close'][pattern[0]], color='red', label=pattern[1]) plt.legend() plt.show()
data = load_data() data = calculate_rsi(data) patterns = detect_positive_divergence(data) + detect_harmonic_patterns(data) plot_patterns(data, patterns)
The information and publications are not meant to be, and do not constitute, financial, investment, trading, or other types of advice or recommendations supplied or endorsed by TradingView. Read more in the Terms of Use.
The information and publications are not meant to be, and do not constitute, financial, investment, trading, or other types of advice or recommendations supplied or endorsed by TradingView. Read more in the Terms of Use.