"import ccxt
import pandas as pd
import plotly.graph_objects as go

# Fetch 5-minute BTC/USDT candlestick data from Binance
exchange = ccxt.binance()
symbol = 'BTC/USDT'
timeframe = '5m'
limit = 500  # Number of candlesticks to fetch

ohlcv = exchange.fetch_ohlcv(symbol, timeframe=timeframe, limit=limit)
df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')

# Initialize variables for zigzag calculation
zigzag_points = []
last_pivot_idx = None
last_pivot_type = None  # 'top' or 'bottom'
direction = None  # 'up' or 'down'

# Variables to track the highest high and lowest low in the current swing
swing_high_idx = None
swing_low_idx = None

# Iterate over the DataFrame to identify tops and bottoms
for i in range(1, len(df)):
    current_candle = df.iloc[i]
    prev_candle = df.iloc[i - 1]

    if direction is None:
        # Determine the initial direction based on the first two candles
        if current_candle['close'] > prev_candle['close']:
            direction = 'up'
            swing_low_idx = i - 1
            swing_high_idx = i - 1  # Initialize swing high index
        else:
            direction = 'down'
            swing_high_idx = i - 1
            swing_low_idx = i - 1  # Initialize swing low index
        continue

    if direction == 'up':
        # Update swing high
        if swing_high_idx is None or df.iloc[i]['high'] > df.iloc[swing_high_idx]['high']:
            swing_high_idx = i

        # Rule 1: Mark a top when a candle has lower highs and lows
        if current_candle['high'] < prev_candle['high'] and current_candle['low'] < prev_candle['low']:
            # Mark the highest high since the last bottom
            last_pivot_idx = swing_high_idx
            last_pivot_type = 'top'
            zigzag_points.append((df.iloc[last_pivot_idx]['timestamp'], df.iloc[last_pivot_idx]['high']))
            direction = 'down'
            swing_high_idx = None  # Reset swing high index
            swing_low_idx = i  # Start tracking new swing low
        else:
            # Rule 2: Adjust bottom if a lower low occurs
            if last_pivot_type == 'bottom' and swing_low_idx is not None and current_candle['low'] < df.iloc[swing_low_idx]['low']:
                swing_low_idx = i  # Update swing low index
                # Adjust the last bottom in the zigzag_points
                if zigzag_points and zigzag_points[-1][1] != df.iloc[swing_low_idx]['low']:
                    zigzag_points[-1] = (df.iloc[swing_low_idx]['timestamp'], df.iloc[swing_low_idx]['low'])
    elif direction == 'down':
        # Update swing low
        if swing_low_idx is None or df.iloc[i]['low'] < df.iloc[swing_low_idx]['low']:
            swing_low_idx = i

        # Rule 1: Mark a bottom when a candle has higher highs and lows
        if current_candle['high'] > prev_candle['high'] and current_candle['low'] > prev_candle['low']:
            # Mark the lowest low since the last top
            last_pivot_idx = swing_low_idx
            last_pivot_type = 'bottom'
            zigzag_points.append((df.iloc[last_pivot_idx]['timestamp'], df.iloc[last_pivot_idx]['low']))
            direction = 'up'
            swing_low_idx = None  # Reset swing low index
            swing_high_idx = i  # Start tracking new swing high
        else:
            # Rule 2: Adjust top if a higher high occurs
            if last_pivot_type == 'top' and swing_high_idx is not None and current_candle['high'] > df.iloc[swing_high_idx]['high']:
                swing_high_idx = i  # Update swing high index
                # Adjust the last top in the zigzag_points
                if zigzag_points and zigzag_points[-1][1] != df.iloc[swing_high_idx]['high']:
                    zigzag_points[-1] = (df.iloc[swing_high_idx]['timestamp'], df.iloc[swing_high_idx]['high'])

# Convert zigzag points to a DataFrame
zigzag_df = pd.DataFrame(zigzag_points, columns=['timestamp', 'price'])

# Plot the candlestick chart with the zigzag line
fig = go.Figure(data=[go.Candlestick(
    x=df['timestamp'],
    open=df['open'],
    high=df['high'],
    low=df['low'],
    close=df['close'],
    name='Candlesticks'
)])

# Add the zigzag line to the chart
fig.add_trace(go.Scatter(
    x=zigzag_df['timestamp'],
    y=zigzag_df['price'],
    mode='lines+markers',
    line=dict(color='orange', width=2),
    marker=dict(color='blue', size=8),
    name='ZigZag'
))

# Update layout
fig.update_layout(
    title='BTC/USDT 5-Minute Chart with ZigZag',
    xaxis_title='Time',
    yaxis_title='Price (USDT)',
    xaxis_rangeslider_visible=False
)

# Show the chart
fig.show()" esse código apresenta um zigzag que segue determinadas condições para desenhar topos e fundos, condições de se candle faz máxima e minina mais baixa em um movimento de alta, mostra que o movimento acabou e pode-se desenhar um topo, e se candle faz minima e maxima mais alta em um movimento de baixa, mostra que o movimento acabou e pode-se desenhar um fundo, sendo que depois dele desenhar um topo e iniciar um movimento de baixa , se algum candle desse movimento (qualquer candle do movimento de baixa) fazer máxima mais alta que o topo que desenhou, o desenho e zigzag do topo vai para a máxima mais alta sempre, e depois dele desenhar um fundo e iniciar um movimento de alta , se algum candle desse movimento (qualquer candle do movimento de alta) fazer minima mais baixa que o fundo que desenhou, o desenho e zigzag do fundo vai para a minima mais baixa sempre. analise o código e veja se a condição está de acordo, pois ele precisa de algum ajuste nisso, mantenha o que estiver certo inalterado.