import pandas as pd

# 定義函式來生成多商品的交易訊號
def generate_multi_symbol_signals(symbols):
    # 儲存所有商品的訊號資料
    all_signals = []

    # 遍歷每個商品
    for symbol in symbols:
        # 读取 CSV 文件
        df = pd.read_csv(f'C:/xampp/htdocs/fuckftx/kline/kline_okx_1d2025/{symbol}USDT-1d.csv', 
                         names=['timestamp', 'open', 'high', 'low', 'close', 'volume'])

        # 確保時間列是 datetime 格式
        df['timestamp'] = pd.to_datetime(df['timestamp'])

        # 設定時間為索引
        df.set_index('timestamp', inplace=True)

        # 過濾資料，只保留 2024/01/01 以後
        df = df[df.index >= '2024-01-01']

        # 參數
        aaa = 31  # 31 天
        per = 2   # 2%的突破線

        # 計算上下突破線
        upper = df['close'].shift(aaa) * (1 + 0.01 * per)
        lower = df['close'].shift(aaa) * (1 - 0.01 * per)

        # 初始倉位
        pos = 0
        signals = []

        # 判斷訊號：穿越進場條件
        for i in range(1, len(df)):
            date = df.index[i]
            prev_date = df.index[i - 1]

            close = df['close'].iloc[i]
            prev_close = df['close'].iloc[i - 1]

            up = upper.iloc[i]
            prev_up = upper.iloc[i - 1]

            low = lower.iloc[i]
            prev_low = lower.iloc[i - 1]

            # 計算進場日（訊號日 + 1）
            if i + 1 < len(df):
                entry_date = df.index[i + 1]
                entry_open = df['open'].iloc[i + 1]
            else:
                continue  # 沒有隔天資料就跳過

            # 多單進場訊號（收盤突破上軌）
            if pos != 1 and (close > up) and (prev_close <= prev_up):
                signals.append({
                    'symbol': symbol,
                    'entry_date': entry_date.strftime('%Y-%m-%d'),
                    'signal': 'long',
                    'entry_price': entry_open
                })
                pos = 1

            # 空單進場訊號（收盤跌破下軌）
            elif pos != -1 and (close < low) and (prev_close >= prev_low):
                signals.append({
                    'symbol': symbol,
                    'entry_date': entry_date.strftime('%Y-%m-%d'),
                    'signal': 'short',
                    'entry_price': entry_open
                })
                pos = -1

        # 把該商品的訊號加入總訊號列表
        all_signals.extend(signals)

    # 轉成 DataFrame
    signals_df = pd.DataFrame(all_signals)
    
    return signals_df




# 定義商品列表
# symbols = ['1INCHUSDT', 'BTCUSDT', 'ETHUSDT']  # 可以擴展到更多商品
symbols = [
    'FIL','BTC','ETH','XRP','ATOM','BCH','BSV','EOS','ETC','LTC','TRX','ADA','KNC','LINK','NEO','DOGE','ALGO','COMP','IOST','IOTA','ONT','QTUM','THETA','XLM','XTZ','MKR','SNX','ZRX','DOT','BAT','SUSHI','YFI','CRV','UMA','BAND','JST','KSM','TRB','BAL','LRC','RSR','STORJ','ZIL','UNI','AVAX','FLM','AAVE','CVC','GRT','NEAR','BNT','EGLD','1INCH','SOL','BADGER','MASK','CFX','CHZ','MANA','ALPHA','PERP','SAND','CRO','LPT','RVN','XCH','SHIB','CSPR','ICP','MINA','AXS','YGG','SLP','AGLD','DYDX','CELO','GALA','GODS','ENS','IMX','PEOPLE','NFT','BICO','LOOKS','API3','APE','GMT','LUNA','OP','LUNC','SWEAT','ETHW','APT','USTC','BNB','TON','LDO','GMX','MAGIC','CORE','AR','WOO','BLUR','FLOKI','STX','ARB','RDNT','PEPE','AIDOGE','SUI','CETUS','ORDI','WLD','HBAR','VRA','BIGTIME','ORBS','WAXP','GAS','TIA','MEME','FLOW','PYTH','SSV','INJ','AUCTION','ID','RON','CTC','TURBO','ACE','SATS','METIS','BONK','JTO','MOVR','NMR','JOE','FXS','LQTY','LSK','JUP','ZETA','OM','ONE','STRK','ACH','T','ICX','DGB','ENJ','VELO','RAY','AEVO','ETHFI','W','TNSR','FOXY','MEW','WIF','PRCL','MERL','ZENT','GLM','NOT','ULTI','ATH','ZK','ZRO','CVX','UXLINK',
    'ONDO','RENDER','BOME','DOGS','POPCAT','NEIROETH','BRETT','CAT','TAO','CATI','POL','HMSTR','EIGEN','MOODENG','NEIRO','PUFFER','SCR','GOAT','X','GRASS','PNUT','ACT','DOG','DEGEN','SLERF','ARKM','OL','MEMEFI','SWELL','MORPHO','MAJOR','ZKJ','MOVE','ME','VIRTUAL','SUNDOG','VANA','PENGU','FARTCOIN','AI16Z','GRIFFAIN','ZEREBRO','AIXBT','ALCH','BIO','SONIC','DUCK','SOLV','NC','TRUMP','S','J','ANIME','ARC','SWARMS','COOKIE','VINE','AVAAI','BUZZ','PIPPIN','BERA','LAYER','IP','PI','KAITO','HYPE','SHELL','GPS','BR','PARTI','JELLYJELLY'


]
# 生成所有商品的交易訊號
signals_df = generate_multi_symbol_signals(symbols)


# 確保 'entry_date' 是 datetime 格式
signals_df['entry_date'] = pd.to_datetime(signals_df['entry_date'])

# 根據 'entry_date' 排序
signals_df = signals_df.sort_values(by='entry_date').reset_index(drop=True)

# 顯示結果
print(signals_df)
# # 如果資料很大，可以選擇只顯示一部分或匯出
# # 顯示前 20 行
# print(signals_df.head(20))

# # 匯出至 CSV
signals_df.to_csv('signals_output.csv', index=False)


# # 如果需要顯示資料的概覽（例如資料的列數和欄位數等）
# print(f"資料的列數和欄位數：{signals_df.shape}")

# # 如果想要檢查特定列或訊號類型的分佈
# print(signals_df['signal'].value_counts())

# # 如果需要匯出到 CSV
# # signals_df.to_csv('signals.csv', index=False)
