کد پایتون دارم میتونی اون رو تکمیل کنیimport requests
import pandas as pd
import plotly.graph_objects as go
import dash
from dash import dcc, html
import dash_bootstrap_components as dbc
from dash.dependencies import Input, Output
import numpy as np
from datetime import datetime
import random  # برای تولید سیگنال‌های تصادفی با احتمال 80%

def get_market_data(symbol, vs_currency, days, interval='hourly'):
    """ دریافت داده‌های بازار از API CoinGecko (تایم فریم ساعتی) """
    url = f"https://api.coingecko.com/api/v3/coins/{symbol}/market_chart"
    params = {'vs_currency': vs_currency, 'days': days, 'interval': interval}
    try:
        response = requests.get(url, params=params)
        response.raise_for_status()  # اگر خطای HTTP داشته باشیم
        data = response.json()
        if 'prices' in data:
            return pd.DataFrame(data['prices'], columns=['timestamp', 'price'])
        else:
            raise ValueError(f"خطا: {data.get('error', 'داده‌ای دریافت نشد')}")
    except requests.exceptions.RequestException as e:
        print(f"خطای شبکه: {e}")
    except Exception as e:
        print(f"خطا در دریافت داده‌ها: {e}")
    return None

def create_chart(data, symbol, vs_currency, trend_lines):
    """ ایجاد نمودار با داده‌های دریافت شده """
    if data is not None:
        data['timestamp'] = pd.to_datetime(data['timestamp'], unit='ms')
        fig = go.Figure(data=[go.Candlestick(x=data['timestamp'],
                                             open=data['price'],
                                             high=data['price'],
                                             low=data['price'],
                                             close=data['price'])])

        # اضافه کردن خطوط روند
        if trend_lines:
            for line in trend_lines:
                fig.add_trace(go.Scatter(x=line['x'], y=line['y'], mode='lines', name='Trend Line'))

        fig.update_layout(
            title=f'{symbol.upper()} Price Chart ({vs_currency.upper()})',
            yaxis_title=f'Price ({vs_currency.upper()})',
            xaxis_rangeslider_visible=False,
            template='plotly_dark'  # بهبود ظاهر
        )

        return fig
    else:
        return {}

def calculate_trend_lines(data):
    """ محاسبه خطوط روند """
    trend_lines = []
    if len(data) > 1:
        trend_lines.append({'x': [data['timestamp'].iloc[0], data['timestamp'].iloc[-1]],
                            'y': [data['price'].iloc[0], data['price'].iloc[-1]]})
    return trend_lines

def calculate_signal_strength(data, indicator_value, last_price):
    """ محاسبه درصد قدرت سیگنال """
    return round((last_price - indicator_value) / indicator_value * 100, 2)

def analyze_market(data, indicator, profit_percentage=1.5, loss_percentage=1):
    """ تحلیل بازار با استفاده از اندیکاتورها """
    if data is not None:
        if indicator == "SMA":
            data['Indicator'] = data['price'].rolling(window=20).mean()
        elif indicator == "EMA":
            data['Indicator'] = data['price'].ewm(span=20, adjust=False).mean()
        elif indicator == "RSI":
            delta = data['price'].diff()
            gain = (delta.where(delta > 0, 0)).rolling(window=14).mean()
            loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean()
            rs = gain / loss
            data['Indicator'] = 100 - (100 / (1 + rs))
        elif indicator == "MACD":
            data['EMA12'] = data['price'].ewm(span=12, adjust=False).mean()
            data['EMA26'] = data['price'].ewm(span=26, adjust=False).mean()
            data['MACD'] = data['EMA12'] - data['EMA26']
            data['Signal_Line'] = data['MACD'].ewm(span=9, adjust=False).mean()
            data['Indicator'] = data['MACD']
        elif indicator == "Bollinger":
            data['SMA20'] = data['price'].rolling(window=20).mean()
            data['STD20'] = data['price'].rolling(window=20).std()
            data['Upper_Band'] = data['SMA20'] + (data['STD20'] * 2)
            data['Lower_Band'] = data['SMA20'] - (data['STD20'] * 2)
            data['Indicator'] = data['SMA20']
        else:
            return "اندیکاتور نامعتبر است. لطفاً SMA, EMA, RSI, MACD یا Bollinger را وارد کنید.", []

        last_price = data['price'].iloc[-1]
        indicator_value = data['Indicator'].iloc[-1]
        trend_lines = calculate_trend_lines(data)

        # تولید سیگنال خرید و فروش
        if last_price > indicator_value:
            signal = 'خرید'
        else:
            signal = 'فروش'

        # قیمت‌های ورود و خروج و حد ضرر
        stop_loss = last_price * (1 - loss_percentage / 100)
        take_profit = last_price * (1 + profit_percentage / 100)
        price_change_percentage = (last_price - indicator_value) / indicator_value * 100
        signal_strength = calculate_signal_strength(data, indicator_value, last_price)

        # تولید سیگنال موقت با احتمال 80%
        if random.random() > 0.2:
            temporary_signal = f"سیگنال موقت: {signal} (80% احتمال صحت)"
        else:
            temporary_signal = f"سیگنال موقت: سیگنال غیرقابل اطمینان"

        analysis = (f"نقطه ورود: {last_price}\n"
                    f"سیگنال: {signal}\n"
                    f"حد ضرر: {stop_loss}\n"
                    f"حد سود: {take_profit}\n"
                    f"قدرت سیگنال: {signal_strength}%\n"
                    f"درصد تغییر قیمت نسبت به اندیکاتور: {round(price_change_percentage, 2)}%\n"
                    f"{temporary_signal}")
        return analysis, trend_lines
    else:
        return "داده‌ای برای تحلیل موجود نیست.", []

# لیست ارزها با 100 ارز
symbols = ['bitcoin', 'ethereum', 'litecoin', 'tether', 'ripple', 'bitcoin-cash', 'binancecoin', 'eos', 'stellar',
           'ethereum-classic', 'tron', 'dogecoin', 'uniswap', 'dai', 'chainlink', 'polkadot', 'aave', 'cardano',
           'shiba-inu', 'fantom', 'polygon', 'axie-infinity', 'decentraland', 'the-sandbox', 'avalanche', 'maker', 
           'usd-coin', 'solana', 'cardano', 'chainlink', 'vechain', 'neo', 'dash', 'monero', 'tezos', 'waves', 'zcash', 
           'cosmos', 'binancecoin', 'blockstack', 'sushi', 'yearn-finance', 'helios', 'compound', 'makerdao', 'alchemix', 
           'fantom', 'ava-labs', 'terraswap', 'serum', 'solana', 'polygon', 'filecoin', 'dydx', '1inch', 'mkr', 'cmc', 
           'aave', 'chainlink', 'mkr', 'tokenomy', 'uniswap', 'optimism', 'republic-protocol', 'tether', '