Untitled
unknown
plain_text
a year ago
6.9 kB
7
Indexable
import ccxt import pandas as pd import talib as ta import numpy as np import plotly.graph_objects as go # Binance API bilgilerini girin api_key = "" secret = "" market = "spot" symbol = 'RSR/USDT' timeframe = '1h' pivot_length = 21 datalength = 1000 # Binance bağlantısını oluşturun binance = ccxt.binance({ "apiKey": api_key, "secret": secret, 'options': { 'defaultType': market, 'defaultMarginMode': 'isolated' }, 'enableRateLimit': False }) # OHLCV verilerini alın ve DataFrame'e dönüştürün ohlcvs = binance.fetch_ohlcv(symbol, timeframe=timeframe, limit=datalength) df = pd.DataFrame(ohlcvs, columns=['date', 'open', 'high', 'low', 'close', 'volume']) df['date'] = pd.to_datetime(df['date'], unit='ms') # Pivot noktalarını bulmak için bir fonksiyon oluşturun def is_pivot(candles, window): low_values = df.iloc[candles - window:candles + window + 1]['low'].values high_values = df.iloc[candles - window:candles + window + 1]['high'].values pivot_low = np.all(df.iloc[candles]['low'] <= low_values) pivot_high = np.all(df.iloc[candles]['high'] >= high_values) if pivot_high and pivot_low: return 3 elif pivot_high: return 1 elif pivot_low: return 2 else: return 0 # Pivot noktalarını hesaplayın df['isPivot'] = np.vectorize(is_pivot)(df.index, pivot_length) # 'pointpos' sütununu oluşturun df['pointpos'] = np.where(df['isPivot'] == 2, df['low'], np.where(df['isPivot'] == 1, df['high'], np.nan)) # Pivot high ve low değerlerini alın pivot_highs = df[df['isPivot'] == 1]['high'] pivot_lows = df[df['isPivot'] == 2]['low'] # Eğimi hesaplayan fonksiyon def calculate_slope(x1, y1, x2, y2): return (y2 - y1) / (x2 - x1) # ATR hesaplayın df['atr'] = ta.ATR(df['high'], df['low'], df['close'], timeperiod=50) df['atr'].bfill(inplace=True) # Trend çizgilerini oluşturun def create_trend_lines(pivot_points, direction='high'): lines = [] for i in range(1, len(pivot_points)): if (direction == 'high' and pivot_points.iloc[i] < pivot_points.iloc[i-1]) or \ (direction == 'low' and pivot_points.iloc[i] > pivot_points.iloc[i-1]): start_index = pivot_points.index[i-1] finish_index = pivot_points.index[i] slope = calculate_slope(start_index, pivot_points.iloc[i-1], finish_index, pivot_points.iloc[i]) lines.append({ 'first_index': start_index, 'second_index': finish_index, 'slope': slope, 'continue_drawing': True, 'finish_index': None, 'line': None }) return lines highlines = create_trend_lines(pivot_highs, 'high') lowlines = create_trend_lines(pivot_lows, 'low') # Trend çizgileri için yeni sütunlar oluştur high_trend_columns = [f'high_trend_{i+1}' for i in range(len(highlines))] low_trend_columns = [f'low_trend_{i+1}' for i in range(len(lowlines))] for col in high_trend_columns + low_trend_columns: df[col] = np.nan def draw_trend_lines(df, lines, pivot_points, trend_columns): last_index = df.index[-1] for idx, line in enumerate(lines): start_index = line['first_index'] finish_index = line['second_index'] slope = line['slope'] x_values = [start_index, finish_index] y_values = [pivot_points.loc[start_index], pivot_points.loc[finish_index]] continue_drawing = True while finish_index < last_index and continue_drawing: if 'high' in trend_columns[idx]: condition = (df['close'].loc[finish_index-1] < y_values[-2] + df['atr'][finish_index-1]) and (df['close'].loc[finish_index] < y_values[-1] + df['atr'][finish_index]) else: condition = (df['close'].loc[finish_index-1] > y_values[-2] - df['atr'][finish_index-1]) and (df['close'].loc[finish_index] > y_values[-1] - df['atr'][finish_index]) if condition: finish_index += 1 x_values.append(finish_index) y_values.append(y_values[-1] + slope) else: continue_drawing = False line['continue_drawing'] = False line['finish_index'] = finish_index line['line'] = {'x': x_values, 'y': y_values} for i, x in enumerate(x_values): if x < len(df): df.at[x, trend_columns[idx]] = y_values[i] # Son 5 mumdan önce biten trend çizgilerini kaldır cutoff_index = last_index - 5 for col in trend_columns: last_trend_index = df[col].last_valid_index() if last_trend_index is not None and last_trend_index < cutoff_index: df.drop(columns=[col], inplace=True) draw_trend_lines(df, highlines, pivot_highs, high_trend_columns) draw_trend_lines(df, lowlines, pivot_lows, low_trend_columns) # Kapanış fiyatını ve hacmi grafiğe ekleyin fig = go.Figure(data=[go.Candlestick(x=np.array(df['date']), open=df['open'], high=df['high'], low=df['low'], close=df['close'])]) fig.add_scatter(x=np.array(df['date']), y=df['pointpos'], mode="markers", marker=dict(size=5, color="MediumPurple"), name="Pivot") fig.add_trace(go.Bar(x=np.array(df['date']), y=df['volume'], yaxis='y2', name='Volume')) # High trend çizgilerini ekle for line in highlines: if line['finish_index'] >= df.index[-1] - 5: fig.add_trace(go.Scatter(x=np.array(df['date'].iloc[line['line']['x']]), y=line['line']['y'], mode='lines', line=dict(color='green', width=2), name='High Trend')) # Low trend çizgilerini ekle for line in lowlines: if line['finish_index'] >= df.index[-1] - 5: fig.add_trace(go.Scatter(x=np.array(df['date'].iloc[line['line']['x']]), y=line['line']['y'], mode='lines', line=dict(color='red', width=2), name='Low Trend')) # Grafiği güncelle ve göster fig.update_layout(xaxis_rangeslider_visible=False, title=f'{symbol} Price with Trend Lines Based on Pivot Points ({pivot_length}) in {timeframe}', xaxis_title='Date', yaxis_title='Price', yaxis2=dict(title='Volume', overlaying='y', side='right')) fig.show() print(df) bit = pd.Timestamp.utcnow() print(f"{bit} bitti..")
Editor is loading...
Leave a Comment