Saturday, July 18, 2026

Trading เค•े เคฒिเคฏे เค—ूเค—เคฒ เค•ोเคฒाเคฌ เคชเคฐ เคธ्เคŸॉเค• เคธ्เค•्เคฐीเคจเคฐ เค•ैเคธे เคฌเคจाเคं ? (Free Google Colab Scanner Code)

 เคจเคฎเคธ्เคคे เคฆोเคธ्เคคों! เคฎेเคฐे เคฏूเคŸ्เคฏूเคฌ เคšैเคจเคฒ เคชเคฐ เค†เคชเค•ा เคช्เคฏाเคฐ เคฆेเคจे เค•े เคฒिเค เคฌเคนुเคค-เคฌเคนुเคค เคงเคจ्เคฏเคตाเคฆ। เคตीเคกिเคฏो เคฎें เค•िเค เค—เค เคตाเคฆे เค•े เค…เคจुเคธाเคฐ, เคฏเคนाँ เคตเคน 'เคธुเคชเคฐ เคธ्เค•ैเคจเคฐ เค•ोเคก' เคนै เคœो เค†เคชเค•े เคฒिเค 210 เคถेเคฏเคฐों เค•े เคเคคिเคนाเคธिเค• เคกेเคŸा เค•ो เคชเคฒเค• เคเคชเค•เคคे เคนी เคธ्เค•ैเคจ เค•เคฐ เคฆेเค—ा เค”เคฐ เค•ेเคตเคฒ เค‰เคจ เคถेเคฏเคฐों เค•ी เคฒिเคธ्เคŸ เคฆेเค—ा เคœिเคจเคฎें CAR (Cumulative Average) เคชॉเคœिเคŸिเคต เคนै เค”เคฐ เคœो เค…เคชเคจे 30, 50 เคต 200 DMA เคธे เคŠเคชเคฐ เคŸ्เคฐेเคก เค•เคฐ เคฐเคนे เคนैं।

เคธเคฌเคธे เค…เคš्เค›ी เคฌाเคค เคฏเคน เคนै เค•ि เค‡เคธे เคšเคฒाเคจे เค•े เคฒिเค เค†เคชเค•ो เค•िเคธी เคธॉเคซ्เคŸเคตेเคฏเคฐ เค•ो เคกाเค‰เคจเคฒोเคก เค•เคฐเคจे เคฏा เค•ोเคกिंเค— เคธीเค–เคจे เค•ी เค•ोเคˆ เคœ़เคฐूเคฐเคค เคจเคนीं เคนै। เคฌเคธ เคจीเคšे เคฆिเค เค—เค 4 เค†เคธाเคจ เคธ्เคŸेเคช्เคธ เค•ो เคซॉเคฒो เค•เคฐें:

๐Ÿš€ Google Colab เคฎें เค•ोเคก เค•ैเคธे เคšเคฒाเคं? (4 เค†เคธाเคจ เคธ्เคŸेเคช्เคธ)

เคธ्เคŸेเคช 1: Google Colab เค–ोเคฒें เค…เคฌ เค…เคชเคจे เคฌ्เคฐाเค‰เคœ़เคฐ (Chrome, Safari เค†เคฆि) เคฎें เคจเคฏा เคŸैเคฌ เค–ोเคฒें เค”เคฐ Google Colab เคชเคฐ เคœाเคँ।

  • เค…เค—เคฐ เค†เคช เคชเคนเคฒी เคฌाเคฐ เค† เคฐเคนे เคนैं, เคคो เคฏเคน เค†เคชเคธे เค†เคชเค•ी Gmail ID เคธे เคฒॉเค—िเคจ เค•เคฐเคจे เค•ो เค•เคนेเค—ा, เคฒॉเค—िเคจ เค•เคฐ เคฒें।

  • เคธ्เค•्เคฐीเคจ เคชเคฐ เค†เคชเค•ो เคจीเคฒे เคฐंเค— เค•ा 'New Notebook' (เคจเคˆ เคจोเคŸเคฌुเค•) เคฌเคŸเคจ เคฆिเค–ाเคˆ เคฆेเค—ा, เค‰เคธ เคชเคฐ เค•्เคฒिเค• เค•เคฐें।

เคธ्เคŸेเคช 2: เคจीเคšे เคฆिเค เค—เค เค•ोเคก เค•ो เค•ॉเคชी เค•เคฐें เคฎैंเคจे เคชूเคฐा เคชाเคฏเคฅเคจ เค•ोเคก (Python Code) เคฆिเคฏा เคนुเค† เคนै। เค‰เคธ เคชूเคฐे เค•ोเคก เค•ो เคเค• เคธाเคฅ เคธेเคฒेเค•्เคŸ เค•เคฐें เค”เคฐ Copy เค•เคฐ เคฒें।

๐Ÿ‘‡ เคฏเคนाँ เคธे เค•ोเคก เค•ॉเคชी เค•เคฐें: ๐Ÿ‘‡

Python Code


# -------------------------------------------------------------------------
# CAR (Cumulative Average) + 30, 50, 200 DMA เคธुเคชเคฐ เคฌ्เคฐेเค•เค†เค‰เคŸ เคธ्เค•ैเคจเคฐ
# -------------------------------------------------------------------------

# เคฏเคนाँ เคนเคฎ เค•ुเค› เคœ़เคฐूเคฐी เคฒाเค‡เคฌ्เคฐेเคฐी (เคŸूเคฒเค•िเคŸ) เคฎंเค—ा เคฐเคนे เคนैं:
import yfinance as yf    # เคฏเคน เคฒाเค‡เคฌ्เคฐेเคฐी เคฏाเคนू เคซाเค‡เคจेंเคธ เคธे เคถेเคฏเคฐों เค•ा เคเคคिเคนाเคธिเค• (Historical) เคกेเคŸा เคซ्เคฐी เคฎें เคกाเค‰เคจเคฒोเคก เค•เคฐเคคी เคนै।
import pandas as pd      # เคฏเคน เคกेเคŸा เค•ो เคเค• เคเค•्เคธेเคฒ เคœैเคธी เคŸेเคฌเคฒ (Rows เค”เคฐ Columns) เคฎें เค…เคš्เค›े เคธे เคธเคœाเคจे เค•े เค•ाเคฎ เค†เคคी เคนै।
import warnings          # เคซाเคฒเคคू เค•ी เคšेเคคाเคตเคจिเคฏों เค•ो เค›ुเคชाเคจे เค•े เคฒिเค।
import logging           # เคฏเคน เคชीเค›े เคšเคฒ เคฐเคนे เคช्เคฐोเคธेเคธ เค•े เคฎैเคธेเคœ เค•ो เค•ंเคŸ्เคฐोเคฒ เค•เคฐเคคा เคนै।
from datetime import datetime  # เคฏเคน เค†เคœ เค•ी เคคाเคœ़ा เคคाเคฐीเค– เคจिเค•ाเคฒเคจे เค•े เคฒिเค เคนै।

# เคฏเคน เคฒाเค‡เคจ เคฏाเคนू เคซाเค‡เคจेंเคธ เค•ी เคซाเคฒเคคू เคฒाเคฒ เคฐंเค— เค•ी เคเคฐเคฐ (เคœैเคธे เค…เค—เคฐ เค•ोเคˆ เคถेเคฏเคฐ เคจ เคฎिเคฒे) เค•ो เคธ्เค•्เคฐीเคจ เคชเคฐ เค†เคจे เคธे เคฐोเค•เคคी เคนै, เคคाเค•ि เคนเคฎाเคฐी เคธ्เค•्เคฐीเคจ เคธाเคซ เคฐเคนे।
logging.getLogger('yfinance').setLevel(logging.CRITICAL)
warnings.filterwarnings('ignore')

# -------------------------------------------------------------------------
# เคฎुเค–्เคฏ เคซंเค•्เคถเคจ เคฌเคจाเคจा (Main Scanner Logic)
# -------------------------------------------------------------------------

# 'advanced_stock_scanner' เคจाเคฎ เค•ा เคเค• เคซंเค•्เคถเคจ เคฌเคจा เคฐเคนे เคนैं, เคœिเคธे เคนเคฎ เค…เคชเคจी เคถेเคฏเคฐों เค•ी เคฒिเคธ्เคŸ เคฆेंเค—े।
def advanced_stock_scanner(ticker_list):
    results = [] # เค–ाเคฒी เคฒिเคธ्เคŸ เคฌเคจा เคฐเคนे เคนैं, เคœिเคธเคฎें เคนเคฎ เคชाเคธ เคนुเค (Breakout) เคถेเคฏเคฐों เค•ा เคกेเคŸा เคœเคฎा เค•เคฐेंเค—े।
    
    # เค†เคœ เค•ी เคคाเคฐीเค– เค•ो (DD-MM-YYYY) เค•े เคซॉเคฐ्เคฎेเคŸ เคฎें เคจिเค•ाเคฒ เคฐเคนे เคนैं, เคคाเค•ि เค‡เคธे เคนเคฎाเคฐी เคเค•्เคธेเคฒ เคฐिเคชोเคฐ्เคŸ เคฎें เคœोเคก़ เคธเค•ें।
    today_date = datetime.now().strftime("%d-%m-%Y")
    
    print(f"เค•ुเคฒ {len(ticker_list)} เคถेเคฏเคฐों เค•ी เคธ्เค•ैเคจिंเค— เคถुเคฐू เคนो เคฐเคนी เคนै... เค•ृเคชเคฏा เคช्เคฐเคคीเค•्เคทा เค•เคฐें।\n")
    
    # FOR เคฒूเคช (Loop): เคฏเคน เคฒूเคช เคนเคฎाเคฐी เคฒिเคธ्เคŸ เค•े เคนเคฐ เคเค• เคถेเคฏเคฐ (ticker) เค•ो เคเค•-เคเค• เค•เคฐเค•े เคšेเค• เค•เคฐेเค—ा।
    for ticker in ticker_list:
        try:
            # 1. เคกेเคŸा เคกाเค‰เคจเคฒोเคก เค•เคฐเคจा (Data Fetching)
            # เคฏเคนाँ เคนเคฎ เคชिเค›เคฒे 2 เคธाเคฒ (period="2y") เค•ा เคฐोเคœ़ाเคจा (interval="1d") เคกेเคŸा เคกाเค‰เคจเคฒोเคก เค•เคฐ เคฐเคนे เคนैं। 
            # 200 DMA เคจिเค•ाเคฒเคจे เค•े เคฒिเค เคนเคฎें เค•เคฎ เคธे เค•เคฎ 200 เคฆिเคจ เค•ा เคกेเคŸा เคšाเคนिเค เคนी เคนोเคคा เคนै।
            data = yf.download(ticker, period="2y", interval="1d", progress=False)
            
            # เค…เค—เคฐ เค•ोเคˆ เคถेเคฏเคฐ เคฌाเคœ़ाเคฐ เคฎें เคจเคฏा เค†เคฏा เคนै เค”เคฐ เค‰เคธเค•ा 200 เคฆिเคจ เค•ा เคกेเคŸा เคนी เคจเคนीं เคนै, เคคो เค‰เคธे เค›ोเคก़ เค•เคฐ เค…เค—เคฒे เคถेเคฏเคฐ เคชเคฐ เคœाเค“।
            if data.empty or len(data) < 200: 
                continue
                
            # เค•्เคฒोเคœ़िंเค— เคช्เคฐाเค‡เคธ (เคฌंเคฆ เคญाเคต) เค•ो เคเค• เคฒिเคธ्เคŸ เคฎें เคจिเค•ाเคฒ เคฐเคนे เคนैं।
            close_prices = data['Close'].squeeze()
            
            # 2. เคฎूเคตिंเค— เคเคตเคฐेเคœ (DMAs) เค•ी เค—เคฃเคจा
            # .rolling(window=30).mean() เคชिเค›เคฒे 30 เคฆिเคจों เค•ा เคธाเคงाเคฐเคฃ เค”เคธเคค เคจिเค•ाเคฒเคคा เคนै।
            # .iloc[-1] เค•ा เคฎเคคเคฒเคฌ เคนै เค•ि เคนเคฎें เคชूเคฐी เคฒिเคธ्เคŸ เคจเคนीं เคšाเคนिเค, เคธिเคฐ्เคซ เค†เคœ เค•ी เคธเคฌเคธे เคคाเคœ़ा (เค†เค–़िเคฐी) เคเคตเคฐेเคœ เคšाเคนिเค।
            dma_30 = close_prices.rolling(window=30).mean().iloc[-1]
            dma_50 = close_prices.rolling(window=50).mean().iloc[-1]
            dma_200 = close_prices.rolling(window=200).mean().iloc[-1]
            
            # CMP (Current Market Price) เคฏाเคจी เคถेเคฏเคฐ เค•ा เค†เคœ เค•ा เคคाเคœ़ा เคญाเคต।
            cmp = close_prices.iloc[-1]
            
            # 3. เคฆूเคฐी เค•ी เค—เคฃเคจा (Distance from 200 DMA)
            # เคถेเคฏเคฐ เค†เคœ เค…เคชเคจे 200 เคฆिเคจों เค•ी เค”เคธเคค เคธे เค•िเคคเคจे เคช्เคฐเคคिเคถเคค (%) เคŠเคชเคฐ เคฏा เคจीเคšे เคนै, เคฏเคน เค‰เคธเค•ा เคซॉเคฐ्เคฎूเคฒा เคนै।
            dist_200_dma = ((cmp - dma_200) / dma_200) * 100

            # 4. เคธाเคฒाเคจा เคนाเคˆ (52-Week High) เค–ोเคœเคจा
            # .tail(252) เค•ा เคฎเคคเคฒเคฌ เคนै เค•ि เคนเคฎ เคชिเค›เคฒे 1 เคธाเคฒ (1 เคธाเคฒ เคฎें เคฒเค—เคญเค— 252 เคŸ्เคฐेเคกिंเค— เคฆिเคจ เคนोเคคे เคนैं) เค•ा เคกेเคŸा เคฒे เคฐเคนे เคนैं।
            last_1y_data = data.tail(252)
            
            # เค‰เคธ 1 เคธाเคฒ เค•े เคกेเคŸा เคฎें เคถेเคฏเคฐ เคจे เคธเคฌเคธे เคœ्เคฏाเคฆा เคนाเคˆ (High) เค•िเคธ เคคाเคฐीเค– เค•ो เคฌเคจाเคฏा เคฅा, เคตเคน เคคाเคฐीเค– (idxmax) เคจिเค•ाเคฒ เคฐเคนे เคนैं।
            high_date = last_1y_data['High'].squeeze().idxmax()
            
            # 5. CAR (Cumulative Average) เค•ी เค—เคฃเคจा
            # เคนाเคˆ เคตाเคฒी เคคाเคฐीเค– เคธे เคฒेเค•เคฐ เค†เคœ เคคเค• เค•ा เคธाเคฐा เค•्เคฒोเคœ़िंเค— เคกेเคŸा เคจिเค•ाเคฒ เคฐเคนे เคนैं।
            car_data = close_prices.loc[high_date:]
            
            # เค…เค—เคฐ เคจเคฏा เคนाเคˆ เคฌเคจे เคนुเค เค…เคญी 10 เคฆिเคจ เคญी เคจเคนीं เคนुเค เคนैं, เคคो เคนเคฎाเคฐी CAR เค•ी เค—เคฃเคจा เคจเคนीं เคนो เคธเค•เคคी, เค‡เคธเคฒिเค เค…เค—เคฒे เคถेเคฏเคฐ เคชเคฐ เคœाเค“।
            if len(car_data) < 10: 
                continue
                
            # expanding().mean() เคนเคฎाเคฐी เค…เคธเคฒी CAR เคจिเค•ाเคฒเคคा เคนै, เคฏाเคจी เคชเคนเคฒे เคฆिเคจ เคธे เคฒेเค•เคฐ เค†เคœ เคคเค• เค•ा เคฒเค—ाเคคाเคฐ เคฌเคข़เคคा เคนुเค† เค”เคธเคค।
            car_values = car_data.expanding().mean()
            
            # เคนเคฎें เค•ेเคตเคฒ เคชिเค›เคฒे 10 เคฆिเคจों เค•ी CAR เคšेเค• เค•เคฐเคจी เคนै, เค‡เคธเคฒिเค .tail(10) เค•ा เค‰เคชเคฏोเค— เค•िเคฏा।
            last_10_car = car_values.tail(10)

            # 6. เคŸ्เคฐेंเคก เคšेเค• เค•เคฐเคจा (Trend Verification)
            # is_monotonic_increasing เคฏเคน เคšेเค• เค•เคฐเคคा เคนै เค•ि เค•्เคฏा เคชिเค›เคฒे 10 เคฆिเคจों เคธे CAR เคฒเค—ाเคคाเคฐ เคฌเคข़ เคฐเคนी เคนै (เคฌिเคจा เคเค• เคญी เคฆिเคจ เค—िเคฐे)।
            if last_10_car.is_monotonic_increasing:
                car_status = 'Positive' # เคฒเค—ाเคคाเคฐ เคฌเคข़ी เคคो เคชॉเคœिเคŸिเคต
            else:
                car_status = 'Negative' # เคเค• เคฆिเคจ เคญी เค—िเคฐी เคคो เคจेเค—ेเคŸिเคต

            # 7. เคซाเค‡เคจเคฒ เคธुเคชเคฐ-เคŸ्เคฐेเคกिंเค— เคธ्เคŸ्เคฐेเคŸेเคœी เค•ी เคถเคฐ्เคค (The Magic Rule)
            # เคถเคฐ्เคค 1: เค†เคœ เค•ा เคญाเคต 30 DMA เคธे เคŠเคชเคฐ เคนो
            # เคถเคฐ्เคค 2: เค†เคœ เค•ा เคญाเคต 50 DMA เคธे เคŠเคชเคฐ เคนो
            # เคถเคฐ्เคค 3: เค†เคœ เค•ा เคญाเคต 200 DMA เคธे เคŠเคชเคฐ เคนो
            # เคถเคฐ्เคค 4: CAR เคชिเค›เคฒे 10 เคฆिเคจों เคธे เคฒเค—ाเคคाเคฐ เคชॉเคœिเคŸिเคต (เคฌเคข़เคคी เคนुเคˆ) เคนो
            if (cmp > dma_30) and (cmp > dma_50) and (cmp > dma_200) and (car_status == 'Positive'):
                action = '๐ŸŸข Positive Breakout' # เคธเคฌ เคชाเคธ เคนुเค† เคคो เคนเคฐा เคธिเค—्เคจเคฒ
            else:
                action = '๐Ÿ”ด Avoid/Hold' # เคเค• เคญी เคถเคฐ्เคค เคซेเคฒ เคนुเคˆ เคคो เคฒाเคฒ เคธिเค—्เคจเคฒ

            # 8. เคกेเคŸा เคœเคฎा เค•เคฐเคจा
            # เค…เคฌ เคœो เคญी เคกेเคŸा เคนเคฎเคจे เคŠเคชเคฐ เค•ैเคฒเค•ुเคฒेเคŸ เค•िเคฏा เคนै, เค‰เคธे เค…เคชเคจी เคเค•्เคธेเคฒ เคŸेเคฌเคฒ เคฎें เคกाเคฒเคจे เค•े เคฒिเค เค‡เค•เคŸ्เค ा เค•เคฐ เคฐเคนे เคนैं।
            if action == '๐ŸŸข Positive Breakout':
                results.append({
                    'Date': today_date,
                    'Stock': ticker.replace('.NS', ''), # .NS เคนเคŸा เคฐเคนे เคนैं เคคाเค•ि เคถेเคฏเคฐ เค•ा เคจाเคฎ เคธाเคซ เคฆिเค–े।
                    'CMP': round(cmp, 2), # เคญाเคต เค•ो เคฆเคถเคฎเคฒเคต เค•े 2 เค…ंเค•ों เคคเค• เคฐाเค‰ंเคก เค‘เคซ (Round off) เค•เคฐ เคฐเคนे เคนैं।
                    '30 DMA': round(dma_30, 2),
                    '50 DMA': round(dma_50, 2),
                    '200 DMA': round(dma_200, 2),
                    '200 DMA Dist %': round(dist_200_dma, 2),
                    'CAR Status': car_status,
                    'Action': action
                })
            
        except Exception as e:
            # เค…เค—เคฐ เค•िเคธी เคถेเคฏเคฐ เค•ा เคกेเคŸा เคกाเค‰เคจเคฒोเคก เคนोเคจे เคฎें เค•ोเคˆ เคฆिเค•्เค•เคค เค†เค, เคคो เค•ोเคก เค•ो เคฐुเค•เคจे เคฎเคค เคฆो, เคชाเคธ (pass) เค•เคฐเค•े เค…เค—เคฒे เคถेเคฏเคฐ เคชเคฐ เคšเคฒे เคœाเค“।
            pass
            
    # 9. เคซाเค‡เคจเคฒ เคฐिเคœเคฒ्เคŸ เค•ी เคธเคซाเคˆ (Filtering)
    # เค‡เค•เคŸ्เค े เค•िเค เค—เค เคธाเคฐे เคกेเคŸा เค•ो pandas เค•ी DataFrame (เคเค•्เคธेเคฒ เคถीเคŸ) เคฎें เคฌเคฆเคฒ เคฐเคนे เคนैं।
    df_positive = pd.DataFrame(results)
    
    # เค…ंเคค เคฎें, เคšुเคจी เค—เคˆ เคฒिเคธ्เคŸ เค•ो 200 DMA เค•ी เคฆूเคฐी (% Distance) เค•े เค†เคงाเคฐ เคชเคฐ เค›ोเคŸे เคธे เคฌเคก़े เค•्เคฐเคฎ เคฎें (Ascending order) เคธेเคŸ เค•เคฐ เคฐเคนे เคนैं।
    if not df_positive.empty:
        df_positive = df_positive.sort_values(by='200 DMA Dist %', ascending=True)
        
    return df_positive

# -------------------------------------------------------------------------
# เค•ोเคก เค•ो เคฐเคจ เค•เคฐเคจा (Execution Part)
# -------------------------------------------------------------------------

# เคฏเคน เคนเคฎाเคฐे 210 เคถेเคฏเคฐों เค•ी เคชूเคฐी เคฒिเคธ्เคŸ เคนै, เคœिเคธे เคนเคฎाเคฐा เคธ्เค•ैเคจเคฐ เคšेเค• เค•เคฐेเค—ा।
my_stocks = [
    '360ONE.NS', 'ABB.NS', 'APLAPOLLO.NS', 'AUBANK.NS', 'ADANIENSOL.NS',
    'ADANIENT.NS', 'ADANIGREEN.NS', 'ADANIPORTS.NS', 'ADANIPOWER.NS', 'ABCAPITAL.NS',
    'ALKEM.NS', 'AMBER.NS', 'AMBUJACEM.NS', 'ANGELONE.NS', 'APOLLOHOSP.NS',
    'ASHOKLEY.NS', 'ASIANPAINT.NS', 'ASTRAL.NS', 'AUROPHARMA.NS', 'DMART.NS',
    'AXISBANK.NS', 'BSE.NS', 'BAJAJ-AUTO.NS', 'BAJFINANCE.NS', 'BAJAJFINSV.NS',
    'BAJAJHLDNG.NS', 'BANDHANBNK.NS', 'BANKBARODA.NS', 'BANKINDIA.NS', 'BDL.NS',
    'BEL.NS', 'BHARATFORG.NS', 'BHEL.NS', 'BPCL.NS', 'BHARTIARTL.NS',
    'BIOCON.NS', 'BLUESTARCO.NS', 'BOSCHLTD.NS', 'BRITANNIA.NS', 'CGPOWER.NS',
    'CANBK.NS', 'CDSL.NS', 'CHOLAFIN.NS', 'CIPLA.NS', 'COALINDIA.NS',
    'COCHINSHIP.NS', 'COFORGE.NS', 'COLPAL.NS', 'CAMS.NS', 'CONCOR.NS',
    'CROMPTON.NS', 'CUMMINSIND.NS', 'DLF.NS', 'DABUR.NS', 'DALBHARAT.NS',
    'DELHIVERY.NS', 'DIVISLAB.NS', 'DIXON.NS', 'DRREDDY.NS', 'ETERNAL.NS',
    'EICHERMOT.NS', 'EXIDEIND.NS', 'FORCEMOT.NS', 'NYKAA.NS', 'FORTIS.NS',
    'GAIL.NS', 'GVT&D.NS', 'GMRAIRPORT.NS', 'GLENMARK.NS', 'GODFRYPHLP.NS',
    'GODREJCP.NS', 'GODREJPROP.NS', 'GRASIM.NS', 'HCLTECH.NS', 'HDFCAMC.NS',
    'HDFCBANK.NS', 'HDFCLIFE.NS', 'HAVELLS.NS', 'HEROMOTOCO.NS', 'HINDALCO.NS',
    'HAL.NS', 'HINDPETRO.NS', 'HINDUNILVR.NS', 'HINDZINC.NS', 'POWERINDIA.NS',
    'HYUNDAI.NS', 'ICICIBANK.NS', 'ICICIGI.NS', 'ICICIPRULI.NS', 'IDFCFIRSTB.NS',
    'ITC.NS', 'INDIANB.NS', 'IEX.NS', 'IOC.NS', 'IRFC.NS', 'IREDA.NS',
    'INDUSTOWER.NS', 'INDUSINDBK.NS', 'NAUKRI.NS', 'INFY.NS', 'INOXWIND.NS',
    'INDIGO.NS', 'JINDALSTEL.NS', 'JSWENERGY.NS', 'JSWSTEEL.NS', 'JIOFIN.NS',
    'JUBLFOOD.NS', 'KEI.NS', 'KPITTECH.NS', 'KALYANKJIL.NS', 'KAYNES.NS',
    'KFINTECH.NS', 'KOTAKBANK.NS', 'LTF.NS', 'LICHSGFIN.NS', 'LTM.NS',
    'LT.NS', 'LAURUSLABS.NS', 'LICI.NS', 'LODHA.NS', 'LUPIN.NS',
    'M&M.NS', 'MANAPPURAM.NS', 'MANKIND.NS', 'MARICO.NS', 'MARUTI.NS',
    'MFSL.NS', 'MAXHEALTH.NS', 'MAZDOCK.NS', 'MOTILALOFS.NS', 'MPHASIS.NS',
    'MCX.NS', 'MUTHOOTFIN.NS', 'NBCC.NS', 'NHPC.NS', 'NMDC.NS',
    'NTPC.NS', 'NATIONALUM.NS', 'NESTLEIND.NS', 'NAM-INDIA.NS', 'NUVAMA.NS',
    'OBEROIRLTY.NS', 'ONGC.NS', 'OIL.NS', 'PAYTM.NS', 'OFSS.NS',
    'POLICYBZR.NS', 'PGEL.NS', 'PIIND.NS', 'PNBHOUSING.NS', 'PAGEIND.NS',
    'PATANJALI.NS', 'PERSISTENT.NS', 'PETRONET.NS', 'PIDILITIND.NS', 'POLYCAB.NS',
    'PFC.NS', 'POWERGRID.NS', 'PREMIERENE.NS', 'PRESTIGE.NS', 'PNB.NS',
    'RBLBANK.NS', 'RECLTD.NS', 'RADICO.NS', 'RVNL.NS', 'RELIANCE.NS',
    'SBICARD.NS', 'SBILIFE.NS', 'SHREECEM.NS', 'SRF.NS', 'MOTHERSON.NS',
    'SHRIRAMFIN.NS', 'SIEMENS.NS', 'SOLARINDS.NS', 'SONACOMS.NS', 'SBIN.NS',
    'SAIL.NS', 'SUNPHARMA.NS', 'SUPREMEIND.NS', 'SUZLON.NS', 'SWIGGY.NS',
    'TATACONSUM.NS', 'TVSMOTOR.NS', 'TCS.NS', 'TATAELXSI.NS', 'TMPV.NS',
    'TATAPOWER.NS', 'TATASTEEL.NS', 'TECHM.NS', 'FEDERALBNK.NS', 'INDHOTEL.NS',
    'PHOENIXLTD.NS', 'TITAN.NS', 'TORNTPHARM.NS', 'TRENT.NS', 'TIINDIA.NS',
    'UNOMINDA.NS', 'UPL.NS', 'ULTRACEMCO.NS', 'UNIONBANK.NS', 'UNITDSPR.NS',
    'VBL.NS', 'VEDL.NS', 'VMM.NS', 'IDEA.NS', 'VOLTAS.NS',
    'WAAREEENER.NS', 'WIPRO.NS', 'YESBANK.NS', 'ZYDUSLIFE.NS'
]

# เคŠเคชเคฐ เคฌเคจाเค เค—เค เคซंเค•्เคถเคจ เค•ो เค…เคชเคจी เคถेเคฏเคฐों เค•ी เคฒिเคธ्เคŸ เคฆेเค•เคฐ เคšเคฒा เคฐเคนे เคนैं।
positive_breakout_data = advanced_stock_scanner(my_stocks)

# เคœो เคญी เคฐिเคœเคฒ्เคŸ เค†เคฏा, เค‰เคธे เคธ्เค•्เคฐीเคจ เคชเคฐ เค…เคš्เค›े เคธे เคช्เคฐिंเคŸ เค•เคฐ เคฐเคนे เคนैं।
print("\n--- ๐ŸŸข เคซाเคˆเคจเคฒ เคฒिเคธ्เคŸ: เค•ेเคตเคฒ POSITIVE BREAKOUT เคธ्เคŸॉเค•्เคธ ---")
if positive_breakout_data.empty:
    print("เค†เคœ เค•िเคธी เคญी เคถेเคฏเคฐ เคจे เค†เคชเค•ी เคธเคญी เค•เคก़ी เคถเคฐ्เคคों เค•ो เคชाเคฐ เคจเคนीं เค•िเคฏा เคนै। (เค•ोเคˆ เคจเคฏा เคฌ्เคฐेเค•เค†เค‰เคŸ เคจเคนीं)")
else:
    print(positive_breakout_data.to_string(index=False))
    
    # เค…ंเคค เคฎें: เค‡เคธ เค›ंเคŸเคจी เค•ी เคนुเคˆ เคฒिเคธ्เคŸ เค•ो 'Final_Breakout_List.xlsx' เคจाเคฎ เคธे เคธेเคต เค•เคฐ เคฐเคนे เคนैं।
    positive_breakout_data.to_excel("Final_Breakout_List.xlsx", index=False)
    print("\nเคซ़िเคฒ्เคŸเคฐ เค•ी เค—เคˆ เคซाเคˆเคจเคฒ เคฒिเคธ्เคŸ 'Final_Breakout_List.xlsx' เคธेเคต เคนो เค—เคˆ เคนै!")
    
    # เคฏเคน เค•เคฎांเคก เค—ूเค—เคฒ เค•ोเคฒाเคฌ (Colab) เค•ो เคฌोเคฒเคคी เคนै เค•ि เคเค•्เคธेเคฒ เคซाเค‡เคฒ เคฌเคจเคจे เค•े เคฌाเคฆ เค‰เคธे เคธीเคงा เคนเคฎाเคฐे เค•ंเคช्เคฏूเคŸเคฐ เคฎें เคกाเค‰เคจเคฒोเคก เค•เคฐ เคฆे।
    from google.colab import files
    files.download("Final_Breakout_List.xlsx")

เคธ्เคŸेเคช 3: เค•ोเคก เค•ो เคชेเคธ्เคŸ เค•เคฐें เค†เคชเค•े เคธाเคฎเคจे เคเค• เค•ोเคฐी เคธ्เค•्เคฐीเคจ เค–ुเคฒेเค—ी เคœिเคธเคฎें เคฌीเคš เคฎें เคเค• เค†เคฏเคคाเค•ाเคฐ เคฌॉเค•्เคธ (Cell) เคนोเค—ा। เค‰เคธ เคฌॉเค•्เคธ เค•े เค…ंเคฆเคฐ เค•्เคฒिเค• เค•เคฐें เค”เคฐ เค…เคชเคจा เค•ॉเคชी เค•िเคฏा เคนुเค† เค•ोเคก เคตเคนाँ Paste (Ctrl+V) เค•เคฐ เคฆें।

เคธ्เคŸेเคช 4: เคฎैเคœिเค• เคฆेเค–ें (Run the Code) เค•ोเคก เคชेเคธ्เคŸ เค•เคฐเคจे เค•े เคฌाเคฆ, เค‰เคธ เคฌॉเค•्เคธ เค•े เคฌिเคฒ्เค•ुเคฒ เคฌाเคฏीं (Left) เคคเคฐเคซ เคเค• เค—ोเคฒ 'Play' (▶️) เค•ा เคฌเคŸเคจ เคนोเค—ा। เคฌเคธ เค‰เคธ เคชเคฐ เค•्เคฒिเค• เค•เคฐ เคฆें!


  • เคชเคฐिเคฃाเคฎ: เค•ुเค› เคนी เคธेเค•ंเคก्เคธ เคฎें เคฏเคน เค•ोเคก เคฌैเค•เค—्เคฐाเค‰ंเคก เคฎें 210 เคถेเคฏเคฐों เค•ा เคกेเคŸा เค–ंเค—ाเคฒेเค—ा। เคธ्เค•्เคฐीเคจ เคชเคฐ เค†เคชเค•ो เคธिเคฐ्เคซ เคชाเคธ เคนुเค เคถेเคฏเคฐों เค•ी เคซाเค‡เคจเคฒ เคฒिเคธ्เคŸ เคฆिเค–ेเค—ी।

  • เค‘เคŸो-เคกाเค‰เคจเคฒोเคก: เค‡เคคเคจा เคนी เคจเคนीं, เคฏเคน เค†เคชเค•े เค•ंเคช्เคฏूเคŸเคฐ เคฏा เคฎोเคฌाเค‡เคฒ เคฎें 'Final_Breakout_List.xlsx' เคจाเคฎ เค•ी เคเค• เคเค•्เคธेเคฒ เคซाเค‡เคฒ เคญी เค…เคชเคจे เค†เคช เคกाเค‰เคจเคฒोเคก เค•เคฐ เคฆेเค—ा เคœिเคธเคฎें เค†เคชเค•े เค†เคœ เค•े เคŸ्เคฐेเคกिंเค— เคธिเค—्เคจเคฒ्เคธ เคนोंเค—े!

Related Video:-



Friday, May 8, 2026

เคชाเคฏเคฅเคจ เค•ोเคก เคธे เคตोเคฒ्เคฏूเคฎ เค•े เคธाเคฅ เคฌ्เคฐेเค•เค†เค‰เคŸ เคตाเคฒे เคธ्เคŸॉเค• เค•ैเคธे เคชเคนเคšाเคจें ? เคซ्เคฐी เค•ोเคฐ्เคธ เค•ा เคธ्เคŸเคกी เคฎेเคŸेเคฐिเคฏเคฒ

 เคธाเคฅिเคฏो เคจเคฎเคธ्เค•ाเคฐเค†เคœ เคฎें เค†เคชเค•ो เคเค• เคเคธी เคœाเคฆुเคˆ เค—ूเค—เคฒ เคถीเคŸ เคชाเคฏเคฅเคจ เค•ोเคก, เค—ूเค—เคฒ เค•्เคฒाเค‰เคก เคเคชीเค†เคˆ เคต เค—िเคŸเคนเคฌ เค•ी เคธเคนाเคฏเคคा เคธे เคคैเคฏाเคฐ เค•เคฐเคจा เคธीเค–ाเคจे เคตाเคฒा เคนूं เคœो เค†เคชเค•ो เคตोเคฒ्เคฏूเคฎ เค•े เคธाเคฅ เคฌ्เคฐेเค•เค†เค‰เคŸ เคตाเคฒे เคธ्เคŸॉเค•्เคธ เค…เคชเคจे เค†เคช เคธेเคฒेเค•्เคŸ เค•เคฐเค•े เคฆेเค—ी।เคฏเคน เคชूเคฐा เค•ोเคฐ्เคธ เคนै เคœो เคเค•เคฆเคฎ เคซ्เคฐी เคนै। เค‡เคธ เค•ोเคฐ्เคธ เค•े เคตीเคกिเคฏोเคœ เค•ी เคช्เคฒेเคฒिเคธ्เคŸ เค†เคชเค•ो เคฎेเคฐे เคฏूเคŸเคฏूเคฌ เคšैเคจเคฒ เคฎเคนेเคถ เคšเคจ्เคฆ्เคฐ เค•ौเคถिเค• เคชเคฐ เคฎिเคฒ เคœाเคฏेเค—ी। เค‡เคธ เคช्เคฒेเคฒिเคธ्เคŸ เค•ा เคฒिंเค• เคจिเคฎ्เคจ เคนैः- https://www.youtube.com/playlist?list=PL-X8WTMcEbY-UTbq_OiXsFoiLZbEzxE4Y

เค†เคœ เคฎैं เค†เคชเค•ो เคเค• เคเคธा เคคเคฐीเค•ा เคฌเคคाเคจे เคœा เคฐเคนा เคนूँ เคœिเคธเคธे เค†เคช เค–ुเคฆ เค•ी เคเค• เคเคธी 'เคธ्เคฎाเคฐ्เคŸ เค—ूเค—เคฒ เคถीเคŸ' เคฌเคจा เคธเค•เคคे เคนैं, เคœो เคนเคฐ เคถाเคฎ เคฌाเคœ़ाเคฐ เคฌंเคฆ เคนोเคจे เค•े เคฌाเคฆ เค–ुเคฆ-เคฌ-เค–ुเคฆ NSE เคธे เคจเคฏा เคกेเคŸा เคฒाเคเค—ी, เค‰เคธเคฎें เคธे เคธเคฌเคธे เคœ़्เคฏाเคฆा เคตॉเคฒ्เคฏूเคฎ เคตाเคฒे เคŸॉเคช 250 เค…เคธเคฒी เคถेเคฏเคฐ เค›ांเคŸेเค—ी, เค”เคฐ เค†เคชเค•े เคซॉเคฐ्เคฎूเคฒे เค•े เคนिเคธाเคฌ เคธे เค†เคชเค•ो เคฌेเคนเคคเคฐीเคจ เคธ्เคŸॉเค•्เคธ เค•ी เคฒिเคธ्เคŸ เคจिเค•ाเคฒ เค•เคฐ เคฆे เคฆेเค—ी।

เคšाเคนे เค†เคชเค•ो เค•ोเคกिंเค— เค•ा 'C' เคญी เคจ เค†เคคा เคนो, เค‡เคธ เค—ाเค‡เคก เค•ो เคธ्เคŸेเคช-เคฌाเคฏ-เคธ्เคŸेเคช เคซॉเคฒो เค•เคฐें เค”เคฐ เค†เคชเค•ा เค…เคชเคจा เคฐोเคฌोเคŸ เคคैเคฏाเคฐ เคนो เคœाเคเค—ा!


เคธ्เคŸेเคช 1: เค…เคชเคจी เค—ूเค—เคฒ เคถीเคŸ เคคैเคฏाเคฐ เค•เคฐเคจा

เคธเคฌเคธे เคชเคนเคฒे เคนเคฎें เคเค• เค–ाเคฒी เค—ूเค—เคฒ เคถीเคŸ เคšाเคนिเค เคœเคนाँ เคธाเคฐा เคกेเคŸा เค†เคเค—ा।

  1. Google Sheets เค–ोเคฒें เค”เคฐ เคเค• เคจเคˆ เคถीเคŸ เคฌเคจाเคँ।

  2. เค‡เคธเคฎें เคจीเคšे '+' เคชเคฐ เค•्เคฒिเค• เค•เคฐเค•े เคฆो เคŸैเคฌ (Sheet) เคฌเคจाเคँ।

  3. เคชเคนเคฒे เคŸैเคฌ เค•ा เคจाเคฎ เคฐเค–ें: Top 250 Stocks

  4. เคฆूเคธเคฐे เคŸैเคฌ เค•ा เคจाเคฎ เคฐเค–ें: Final List

  5. Top 250 Stocks เคถीเคŸ เคฎें เคชเคนเคฒी เคฒाเค‡เคจ (Row 1) เคฎें เคฏे เคนेเคกिंเค—्เคธ เคกाเคฒ เคฆें:

    • A1: NSE Code

    • B1: Volume

    • C1: Close Price (เค•ॉเคฒเคฎ D เคธे เค†เค—े เคนเคฎ 50 เคกीเคเคฎเค 100 เคกीเคเคฎเค 200 เคกीเคเคฎเค เคธीเคเค†เคฐ เค†เคฆि เค•ुเค› เคซाเคฐ्เคฎूเคฒे เคฒเค—ाเคฏेเค—ें เคœो เค‡เคธ เคชोเคธ्เคŸ เคฎें เค†เค—े เคธीเค–ाเคฏे เคœाเคฏेเค—ें เค…เคญी เค†เคชเค•ो เค…เคชเคจा เคชूเคฐा เคซोเค•เคธ เคเคจเคเคธเคˆ เคธे เคธเคฌเคธे เคœ्เคฏाเคฆा เคตोเคฒ्เคฏूเคฎ เคตाเคฒे เคŸॉเคช 250 เคธ्เคŸॉเค•्เคธ เค•ी เคฒिเคธ्เคŸ เคฐोเคœ เค‘เคŸोเคฎेเคŸिเค• เคจिเค•ाเคฒเคจे เค•เคฐเคจे เคชเคฐ เคฐเค–เคจा เคนै।!)


เคธ्เคŸेเคช 2: เค—ूเค—เคฒ เค•्เคฒाเค‰เคก (Google Cloud) เคธे API 'เคšाเคฌी' เคฒेเคจा

เคนเคฎाเคฐी เคชाเคฏเคฅเคจ เคธ्เค•्เคฐिเคช्เคŸ เค•ो เค†เคชเค•ी เคถीเคŸ เคฎें เคกेเคŸा เคฒिเค–เคจे เค•े เคฒिเค เคเค• เคธुเคฐเค•्เคทिเคค เคฐाเคธ्เคคे เค•ी เฅ›เคฐूเคฐเคค เคนै। เค‡เคธเค•े เคฒिเค เคนเคฎ เคเค• 'Service Account' (เคฐोเคฌोเคŸ) เคฌเคจाเคंเค—े।

  1. Google Cloud Console API Library เคชเคฐ เคœाเคँ।

  2. เคธเคฐ्เคš เคฌॉเค•्เคธ เคฎें "Google Sheets API" เคขूँเคขें เค”เคฐ เค‰เคธे Enable เค•เคฐ เคฆें।

  3. เคซिเคฐ เคธे เคธเคฐ्เคš เค•เคฐें "Google Drive API" เค”เคฐ เค‰เคธे เคญी Enable เค•เคฐ เคฆें।

  4. เค…เคฌ เคฌाเคँ เคฎेเคจू เคฎें "Credentials" เคชเคฐ เค•्เคฒिเค• เค•เคฐें। เคŠเคชเคฐ "+ Create Credentials" เคชเคฐ เคœाเคँ เค”เคฐ "Service Account" เคšुเคจें।

  5. เค‡เคธे เคจाเคฎ เคฆें (เคœैเคธे: stock-updater-bot) เค”เคฐ Create เค•เคฐ เคฆें।

  6. เค…เคฌ เคธเคฐ्เคตिเคธ เค…เค•ाเค‰ंเคŸ เค•ी เคฒिเคธ्เคŸ เคฎें เค‰เคธ เคจเค เค…เค•ाเค‰ंเคŸ เค•े Email ID (เคœो ...iam.gserviceaccount.com เคœैเคธा เคนोเค—ा) เค•ो เค•ॉเคชी เค•เคฐ เคฒें।

  7. เค‰เคธी เคˆเคฎेเคฒ เคชเคฐ เค•्เคฒिเค• เค•เคฐें, Keys เคŸैเคฌ เคฎें เคœाเคँ -> Add Key -> Create new key เคชเคฐ เค•्เคฒिเค• เค•เคฐें। JSON เคšुเคจें เค”เคฐ เคกाเค‰เคจเคฒोเคก เค•เคฐ เคฒें। เคฏเคน เค†เคชเค•ी เคคिเคœोเคฐी เค•ी เคšाเคฌी เคนै!

เฅ›เคฐूเคฐी เค•ाเคฎ: เค…เคฌ เค…เคชเคจी เค—ूเค—เคฒ เคถीเคŸ เคชเคฐ เคตाเคชเคธ เค†เคँ। เคŠเคชเคฐ เคฆाเคˆं เค“เคฐ Share เคฌเคŸเคจ เคฆเคฌाเคं เค”เคฐ เค‰เคธ เค•ॉเคชी เค•ी เคนुเคˆ Service Account Email ID เค•ो 'Editor' เค•ा เคเค•्เคธेเคธ เคฆेเค•เคฐ เคธेเคต เค•เคฐ เคฆें।


เคธ्เคŸेเคช 3: GitHub เคชเคฐ เค…เคชเคจा เค‘เคŸोเคฎेเคถเคจ เคธेเคŸ เค…เคช เค•เคฐเคจा

เค…เคฌ เคนเคฎ เค…เคชเคจे เค•ोเคก เค•ो เคเค• เคเคธे เคธเคฐ्เคตเคฐ เคชเคฐ เคฐเค–ेंเค—े เคœो เคฐोเคœ़ เคถाเคฎ เค•ो เค…เคชเคจे เค†เคช เคšเคฒेเค—ा। เค‡เคธเค•े เคฒिเค GitHub (เคœो เคฌिเคฒ्เค•ुเคฒ เคซ्เคฐी เคนै) เค•ा เค‡เคธ्เคคेเคฎाเคฒ เค•เคฐेंเค—े।

  1. GitHub.com เคชเคฐ เคœाเค•เคฐ เค…เคชเคจा เค…เค•ाเค‰ंเคŸ เคฌเคจाเคँ เคฏा เคฒॉเค—िเคจ เค•เคฐें।

  2. เคฆाเคँ เค•ोเคจे เคฎें '+' เคฆเคฌाเคं เค”เคฐ New repository เคšुเคจें। เคจाเคฎ เคฆें (เคœैเคธे: NSE-Auto-Sheet) เค”เคฐ เค‡เคธे Private เคฐเค–ें।

  3. เค…เคฌ เค…เคชเคจी เคฐिเคชॉเคœिเคŸเคฐी เค•ी Settings เคฎें เคœाเคँ। เคฌाเคँ เคฎेเคจू เคฎें เคจीเคšे Secrets and variables > Actions เคชเคฐ เค•्เคฒिเค• เค•เคฐें।

  4. New repository secret เคฌเคŸเคจ เคฆเคฌाเคं। Name เคฎें เคฒिเค–ें: GCP_CREDENTIALS

  5. เคœो JSON เคซाเค‡เคฒ เค†เคชเคจे เคกाเค‰เคจเคฒोเคก เค•ी เคฅी, เค‰เคธे เคจोเคŸเคชैเคก (Notepad) เคฎें เค–ोเคฒें, เค‰เคธเค•ा เคธाเคฐा เคŸेเค•्เคธ्เคŸ เค•ॉเคชी เค•เคฐें เค”เคฐ เคฏเคนाँ Secret เคฌॉเค•्เคธ เคฎें เคชेเคธ्เคŸ เค•เคฐเค•े เคธेเคต เค•เคฐ เคฆें।


เคธ्เคŸेเคช 4: เคชाเคฏเคฅเคจ เคธ्เค•्เคฐिเคช्เคŸ (Python Script) เคกाเคฒเคจा

เค…เคฌ เคนเคฎ เคตเคน เคœाเคฆुเคˆ เค•ोเคก เคกाเคฒेंเค—े เคœो NSE เค•े เคจเค เคธिเคธ्เคŸเคฎ เคธे เคกेเคŸा เคฒाเคเค—ा।

  1. เคฐिเคชॉเคœिเคŸเคฐी เค•े เคฎुเค–्เคฏ เคชेเคœ (Code เคŸैเคฌ) เคชเคฐ Add file > Create new file เคชเคฐ เค•्เคฒिเค• เค•เคฐें।

  2. เคซाเค‡เคฒ เค•ा เคจाเคฎ เคฆें: update_sheet.py

  3. เคจीเคšे เคฆिเคฏा เค—เคฏा เคชूเคฐा เค•ोเคก เค•ॉเคชी เค•เคฐเค•े เค‰เคธ เคฌॉเค•्เคธ เคฎें เคชेเคธ्เคŸ เค•เคฐ เคฆें:

Python
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import pandas as pd
import requests
import zipfile
import io
from datetime import datetime, timedelta
import os
import json

# 1. Credentials Setup
creds_json = os.environ.get('GCP_CREDENTIALS')
creds_dict = json.loads(creds_json)
scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"]
creds = ServiceAccountCredentials.from_json_keyfile_dict(creds_dict, scope)
client = gspread.authorize(creds)

# เค…เคชเคจी เค—ूเค—เคฒ เคถीเคŸ เค•ी ID เคฏเคนाँ เคกाเคฒें (URL เค•े เคฌीเคš เค•ा เคนिเคธ्เคธा)
spreadsheet_id = "เคฏเคนाँ_เค…เคชเคจी_เคถीเคŸ_เค•ी_ID_เคกाเคฒें" 
worksheet = client.open_by_key(spreadsheet_id).worksheet("Top 250 Stocks")

# 2. NSE UDiFF Data Fetcher
def fetch_bhavcopy_for_date(date_obj):
    date_str = date_obj.strftime("%Y%m%d")
    url = f"https://nsearchives.nseindia.com/content/cm/BhavCopy_NSE_CM_0_0_0_{date_str}_F_0000.csv.zip"
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
    }
    
    try:
        response = requests.get(url, headers=headers, timeout=15)
        if response.status_code == 200:
            with zipfile.ZipFile(io.BytesIO(response.content)) as z:
                csv_filename = z.namelist()[0]
                with z.open(csv_filename) as f:
                    df = pd.read_csv(f)
                    
                    sym_col = 'TckrSymb' if 'TckrSymb' in df.columns else 'SYMBOL'
                    close_col = 'ClsPric' if 'ClsPric' in df.columns else 'CLOSE'
                    series_col = 'SctySrs' if 'SctySrs' in df.columns else 'SERIES'
                    
                    vol_col = 'TtlTradgVol'
                    for c in ['TtlTradgVol', 'TtlTrdQty', 'TotTrdQty', 'TOTTRDQTY']:
                        if c in df.columns:
                            vol_col = c
                            break
                    
                    # เคธिเคฐ्เคซ EQ เคธीเคฐीเคœ เค”เคฐ ETFs (LIQUID/BEES) เค•ो เคฌाเคนเคฐ เค•เคฐเคจा
                    if series_col in df.columns:
                        df = df[df[series_col].astype(str).str.strip() == 'EQ']
                    filter_keywords = 'BEES|ETF|GOLD|LIQUID|CASE|SILVER|LIQ'
                    df = df[~df[sym_col].astype(str).str.contains(filter_keywords, case=False, na=False)]
                    
                    df_top = df.sort_values(by=vol_col, ascending=False).head(250)
                    return df_top[[sym_col, vol_col, close_col]].values.tolist()
        return None
    except:
        return None

# 3. Execution Logic
date = datetime.now()
data_to_insert = None
fetched_date_str = ""

for i in range(5): 
    test_date = date - timedelta(days=i)
    if test_date.weekday() >= 5: continue
        
    data_to_insert = fetch_bhavcopy_for_date(test_date)
    if data_to_insert:
        fetched_date_str = test_date.strftime('%d-%b-%Y')
        break

# 4. Update Sheet
if data_to_insert:
    worksheet.batch_clear(['A2:C251'])
    worksheet.update('A2', data_to_insert)
    ist_now = (datetime.utcnow() + timedelta(hours=5, minutes=30)).strftime('%d-%b %H:%M')
    status_msg = f"Data Date: {fetched_date_str} | Last Update: {ist_now} (IST)"
    worksheet.update('K2', [[status_msg]])
    print("SUCCESS: Sheet Updated!")

เคง्เคฏाเคจ เคฆें: เค•ोเคก เคฎें spreadsheet_id เค•ी เคœเค—เคน เค…เคชเคจी เคถीเคŸ เค•े URL เคธे ID เคจिเค•ाเคฒ เค•เคฐ เฅ›เคฐूเคฐ เคกाเคฒें। เคซिเคฐ Commit changes เคชเคฐ เค•्เคฒिเค• เค•เคฐें।


เคธ्เคŸेเคช 5: เคŸाเค‡เคฎเคฐ (Cron) เคธेเคŸ เค•เคฐเคจा

เคนเคฎ เค‡เคธ เค•ोเคก เค•ो เคฐोเคœ़ เคฐाเคค 8:15 เคฌเคœे เคšเคฒाเคंเค—े เคคाเค•ि GitHub เค•े เคธเคฐ्เคตเคฐ เคชเคฐ เคŸ्เคฐैเคซिเค• เคจ เคฎिเคฒे।

  1. เค…เคชเคจे GitHub เคฎें Actions เคŸैเคฌ เคชเคฐ เค•्เคฒिเค• เค•เคฐें।

  2. "set up a workflow yourself" เคชเคฐ เค•्เคฒिเค• เค•เคฐें।

  3. เคจीเคšे เคฆिเคฏा เค—เคฏा เค•ोเคก เคชेเคธ्เคŸ เค•เคฐें:

YAML
name: Update NSE Stocks to Google Sheet

on:
  schedule:
    # เคฏเคน เคธเคฎเคฏ 14:45 UTC เคนै, เคœिเคธเค•ा เคฎเคคเคฒเคฌ เคญाเคฐเคค เคฎें เคฐाเคค 8:15 PM เคนै
    - cron: '45 14 * * 1-5'
  workflow_dispatch:

jobs:
  update-sheet:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repo
        uses: actions/checkout@v4

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.10'

      - name: Install Libraries
        run: pip install gspread oauth2client pandas requests

      - name: Run Python Script
        env:
          GCP_CREDENTIALS: ${{ secrets.GCP_CREDENTIALS }}
        run: python update_sheet.py

เค‡เคธे เคญी Commit changes เค•เคฐ เคฆें। เคฌเคธ, เค†เคชเค•ा เค‘เคŸोเคฎेเคถเคจ เคคैเคฏाเคฐ เคนै!

เคฏเคนां เคคเค• เค‡เคธ เค•ोเคฐ्เคธ เค•ी เค•เค•्เคทा 1 เคฅी เค‡เคธเคธे เค†เค—े เค…เค—เคฒी เค•เค•्เคทा เคฎें เคธीเค–ाเคฏा เคœाเคฏेเค—ा เค‡เคธ เค•เค•्เคทा เค•ा เคซ्เคฐी เคตीเคกिเคฏो เคฏूเคŸเคฏूเคฌ เคชเคฐ เคจिเคฎ्เคจ เคฒिंเค• เคชเคฐ เคฆेเค– เคธเค•เคคे เคนैं:- https://youtu.be/MnIJ6kx6ww4



๐Ÿš€ เค‘เคŸोเคฎैเคŸिเค• เคธ्เคŸॉเค• เคธ्เค•ैเคจเคฐ เค•ैเคธे เคฌเคจाเคं - เค•เค•्เคทा 2 (Moving Averages & Advanced CAR Formula)

เคจเคฎเคธ्เค•ाเคฐ เคฆोเคธ्เคคों! 'เค‘เคŸोเคฎैเคŸिเค• เคธ्เคŸॉเค• เคเคจाเคฒाเค‡เคœ़เคฐ เคถीเคŸ' เคฌเคจाเคจे เค•ी เค‡เคธ เคฎाเคธ्เคŸเคฐเค•्เคฒाเคธ (เค•เค•्เคทा 2) เคฎें เค†เคชเค•ा เคธ्เคตाเค—เคค เคนै।

เค•เค•्เคทा 1 เค•े เคตीเคกिเคฏो เค”เคฐ เคฌ्เคฒॉเค— เคชोเคธ्เคŸ เคฎें เคนเคฎเคจे เคธीเค–ा เคฅा เค•ि เค•ैเคธे เค—िเคŸเคนเคฌ (GitHub) เค•ी เคฎเคฆเคฆ เคธे เคฐोเคœ़ाเคจा เคถाเคฎ เค•ो NSE เคธे เคŸॉเคช 250 เคถेเคฏเคฐों เค•ा เคฐॉ เคกेเคŸा (Raw Data) เค…เคชเคจी เค—ूเค—เคฒ เคถीเคŸ เคฎें เค…เคชเคจे เค†เคช เค•ैเคธे เคฒाเคฏा เคœाเค।

เค†เคœ เค•ी เค‡เคธ เค•เค•्เคทा 2 เคฎें เคนเคฎ เค‰เคธ เคฐॉ เคกेเคŸा เคฎें เคฎेเคฐे (เคฎเคนेเคถ เค•ौเคถिเค•) เค•ुเค› เคเคกเคตांเคธ เคซॉเคฐ्เคฎूเคฒे เคฒเค—ाเคंเค—े เค”เคฐ เค‡เคธे เคเค• 'เคธ्เคฎाเคฐ्เคŸ เคธ्เค•ैเคจเคฐ' เคฎें เคฌเคฆเคฒेंเค—े। เคนเคฎ เค…เคชเคจी 'Top 250 Stocks' เคถीเคŸ เคฎें 50, 100 เค”เคฐ 200 เคฆिเคจ เค•ा เคฎूเคตिंเค— เคเคตเคฐेเคœ เคจिเค•ाเคฒेंเค—े, เค”เคฐ เคธเคฌเคธे เค–ाเคธ—เคฎेเคฐा เคฌเคจाเคฏा เคนुเค† เคเคกเคตांเคธ CAR (Cumulative Average Rule) เคฐेเคŸिंเค— เคซॉเคฐ्เคฎूเคฒा เคฒเค—ाเคंเค—े เคœो เค†เคชเค•ो เคฌเคคाเคเค—ा เค•ि เคธ्เคŸॉเค• เค–เคฐीเคฆเคจे เคฒाเคฏเค• เคนै เคฏा เคจเคนीं।

เคคो เคšเคฒिเค, เค…เคชเคจी เค—ूเค—เคฒ เคถीเคŸ เค–ोเคฒिเค เค”เคฐ เคฎेเคฐे เคธाเคฅ เคฏे 5 เค†เคธाเคจ เคธ्เคŸेเคช्เคธ เคซॉเคฒो เค•ीเคœिเค:


เคธ्เคŸेเคช 1: เคฒाเค‡เคต เคช्เคฐाเค‡เคธ (CMP) เคฒाเคจा

เคนเคฎाเคฐी เคถीเคŸ เค•े เค•ॉเคฒเคฎ A, B เค”เคฐ C เคฎें เคชाเคฏเคฅเคจ เคจे เคกेเคŸा เคกाเคฒ เคฆिเคฏा เคนै। เค…เคฌ เคนเคฎ เคธेเคฒ D2 (CMP) เคฎें เค—ूเค—เคฒ เคซाเค‡เคจेंเคธ เค•ा เคซॉเคฐ्เคฎूเคฒा เคฒเค—ाเคंเค—े เคคाเค•ि เคฆिเคจ เคฎें เคนเคฎें เคฒाเค‡เคต เคญाเคต เคฆिเค–े।

เคธेเคฒ D2 เคฎें เคฏเคน เคซॉเคฐ्เคฎूเคฒा เคชेเคธ्เคŸ เค•เคฐें:

=GOOGLEFINANCE("NSE:"&A2,"price")

เคธ्เคŸेเคช 2: เคฎूเคตिंเค— เคเคตเคฐेเคœ (50, 100 เค”เคฐ 200 DMA)

เค…เคฌ เคนเคฎ เคตो เค‡ंเคกिเค•ेเคŸเคฐ्เคธ เคฒเค—ाเคंเค—े เคœो เคธ्เคŸॉเค• เค•ा เคŸ्เคฐेंเคก (Trend) เคฌเคคाเคคे เคนैं।

เคธेเคฒ E2 (50 DMA) เคฎें เคชेเคธ्เคŸ เค•เคฐें:

=IFERROR(AVERAGE(QUERY(SORT(GOOGLEFINANCE("NSE:"&A2,"price",TODAY()-75,TODAY()),1,0),"select Col2 limit 50")), "")

เคธेเคฒ F2 (100 DMA) เคฎें เคชेเคธ्เคŸ เค•เคฐें:

=IFERROR(AVERAGE(QUERY(SORT(GOOGLEFINANCE("NSE:"&A2,"price",TODAY()-150,TODAY()),1,0),"select Col2 limit 100")), "")

เคธेเคฒ G2 (200 DMA) เคฎें เคชेเคธ्เคŸ เค•เคฐें:

=IFERROR(AVERAGE(QUERY(SORT(GOOGLEFINANCE("NSE:"&A2,"price",TODAY()-300,TODAY()),1,0),"select Col2 limit 200")), "")

เคธ्เคŸेเคช 3: เคฌुเคฒ เคฐเคจ (Bull Run) เค”เคฐ 200 DMA เคธे เคฆूเคฐी

เคธेเคฒ H2 (Output) เคฎें เคนเคฎ เคเค• เคถเคฐ्เคค เคฒเค—ाเคंเค—े เคœो เคฌเคคाเคเค—ी เค•ि เคธ्เคŸॉเค• เคฌुเคฒ เคฐเคจ เคฎें เคนै เคฏा เคจเคนीं। เคธेเคฒ H2 เคฎें เคชेเคธ्เคŸ เค•เคฐें:

=IF(AND(D2>E2, D2>F2, D2>G2, I2>=0.01, I2<=10), "In Bull Run",
IF(AND(D2<E2, D2<F2, D2<G2, I2>=-10, I2<=-0.01), "In Bear Run", "Unconfirmed"))

เคธेเคฒ I2 (Difference from 200 DMA) เคฎें เคนเคฎ 200 DMA เคธे เคช्เคฐเคคिเคถเคค เคฆूเคฐी เคจिเค•ाเคฒेंเค—े। เคธेเคฒ I2 เคฎें เคชेเคธ्เคŸ เค•เคฐें:

=((D2-G2)*100)/G2


เคธ्เคŸेเคช 4: เคฎेเคฐा เคเคกเคตांเคธ CAR (Cumulative Average Rule) เคซॉเคฐ्เคฎूเคฒा

เคฏเคน เค‡เคธ เคถीเคŸ เค•ा เคธเคฌเคธे เคคाเค•เคคเคตเคฐ เคนिเคธ्เคธा เคนै। เคฏเคน เคซॉเคฐ्เคฎूเคฒा เคชिเค›เคฒे 52 เคนเคซ्เคคों เค•े เคนाเคˆ (High) เค•ा เคชเคคा เคฒเค—ाเคคा เคนै, เคตเคนाँ เคธे เค…เคฌ เคคเค• เค•ा เคกेเคŸा เคจिเค•ाเคฒเค•เคฐ เค‰เคธเค•ा เค”เคธเคค เคจिเค•ाเคฒเคคा เคนै, เค”เคฐ เคฏเคน เคšेเค• เค•เคฐเคคा เคนै เค•ि เค•्เคฏा เคฏเคน เคธ्เคŸॉเค• เคฒเค—ाเคคाเคฐ เคŠเคชเคฐ เค•ी เค“เคฐ เคœा เคฐเคนा เคนै।

(เคจोเคŸ: เคฏเคน เคซॉเคฐ्เคฎूเคฒा เคฒंเคฌा เคนै, เค†เคช เค‡เคธ เคชूเคฐे เคฌॉเค•्เคธ เค•ो เคเค• เคธाเคฅ เค•ॉเคชी เค•เคฐเค•े เคธेเคฒ J2 เคฎें เคชेเคธ्เคŸ เค•เคฐ เคธเค•เคคे เคนैं, เค—ूเค—เคฒ เคถीเคŸ เค‡เคธे เค†เคธाเคจी เคธे เคธเคฎเค เคฒेเค—ा)

เคธेเคฒ J2 (CAR Rating) เคฎें เคฏเคน เคชूเคฐा เคซॉเคฐ्เคฎूเคฒा เค•ॉเคชी เค•เคฐเค•े เคชेเคธ्เคŸ เค•เคฐें:

=IFERROR(IF(A2="","ENTER STOCK",

  LET(

    raw_high, GOOGLEFINANCE("NSE:" & A2, "high", TODAY()-365, TODAY()),

    high_date, IFERROR(TO_DATE(QUERY(raw_high, "SELECT Col1 WHERE Col2 IS NOT NULL ORDER BY Col2 DESC LIMIT 1 LABEL Col1 ''", 1)), TODAY()-30),

    raw_data, IFERROR(GOOGLEFINANCE("NSE:" & A2, "close", high_date, TODAY()), GOOGLEFINANCE("NSE:" & A2, "close", TODAY()-10, TODAY())),

    prices, IFERROR(CHOOSEROWS(INDEX(raw_data, 0, 2), SEQUENCE(ROWS(raw_data)-1, 1, 2, 1)), {0}),

    count_rows, ROWS(prices),

    cum_avg, SCAN(0, SEQUENCE(count_rows), LAMBDA(a,n, AVERAGE(CHOOSEROWS(prices, SEQUENCE(n))))),

    last_10, IF(count_rows < 10, {0;0;0;0;0;0;0;0;0;0}, CHOOSEROWS(cum_avg, SEQUENCE(10, 1, count_rows - 9, 1))),

    check, SUMPRODUCT(--(CHOOSEROWS(last_10, SEQUENCE(9, 1, 2, 1)) > CHOOSEROWS(last_10, SEQUENCE(9, 1, 1, 1)))),

    IF(count_rows < 10, "Short History", IF(check = 9, "Buy/Average Out", "Avoid/Hold"))

  )

), "TICKER NOT FOUND")


๐Ÿ‘‰ เฅ›เคฐूเคฐी เค•ाเคฎ: เค…เคฌ เคธेเคฒ D2 เคธे เคฒेเค•เคฐ J2 เคคเค• เค•े เคธเคญी เคซॉเคฐ्เคฎूเคฒों เค•ो เคเค• เคธाเคฅ เคธेเคฒेเค•्เคŸ เค•เคฐें เค”เคฐ เคจीเคšे Row 250 เคคเค• เคก्เคฐैเค— (Drag) เค•เคฐ เคฆें (เคฏा เคกเคฌเคฒ-เค•्เคฒिเค• เค•เคฐ เคฆें)। เค†เคชเค•ा เคธाเคฐा เคกेเคŸा เค•ैเคฒเค•ुเคฒेเคŸ เคนो เคœाเคเค—ा!


เคธ्เคŸेเคช 5: เคฎाเคธ्เคŸเคฐ เคซॉเคฐ्เคฎूเคฒा (Final List เคคैเคฏाเคฐ เค•เคฐเคจा)

เคจिเคถ्เคšिเคค เคฐूเคช เคธे, เคฏเคนाँ เค†เคชเค•े 'เคซाเคˆเคจเคฒ เคฒिเคธ्เคŸ' (Final List) เคตाเคฒे เคธ्เคŸेเคช เค•ा เคชूเคฐा เคตिเคตเคฐเคฃ เคนै, เคœिเคธเคฎें เคฎाเคธ्เคŸเคฐ เคซॉเคฐ्เคฎूเคฒा เค•ो เคฆो เคฒाเค‡เคจों เคฎें เค‡เคธ เคคเคฐเคน เคต्เคฏเคตเคธ्เคฅिเคค เค•िเคฏा เค—เคฏा เคนै เค•ि เคฏเคน เคฌ्เคฒॉเค— เคชเคฐ เค†เคธाเคจी เคธे เคซिเคŸ เคนो เคœाเค เค”เคฐ เค†เคชเค•े เคซॉเคฒोเคตเคฐ्เคธ เค‡เคธे เคธीเคงे เค•ॉเคชी-เคชेเคธ्เคŸ เค•เคฐ เคธเค•ें:


เคธ्เคŸेเคช 5: เคซाเคˆเคจเคฒ เคฒिเคธ्เคŸ (Final List) เคคैเคฏाเคฐ เค•เคฐเคจा

เคฏเคน เค‡เคธ เคชूเคฐी เคช्เคฐोเคธेเคธ เค•ा เคธเคฌเคธे เคฎเคนเคค्เคตเคชूเคฐ्เคฃ เคนिเคธ्เคธा เคนै। เคฏเคนाँ เคนเคฎ เคเค• เคฎाเคธ्เคŸเคฐ เคซॉเคฐ्เคฎूเคฒे เค•ी เคฎเคฆเคฆ เคธे เค…เคชเคจी เคชเคธंเคฆ เค•े เคฌेเคนเคคเคฐीเคจ เคธ्เคŸॉเค•्เคธ เค•ो เค…เคฒเค— เค•เคฐेंเค—े।

เคถीเคŸ เค•ा เคธेเคŸเค…เคช:

  1. เค…เคชเคจी 'Final List' เคตाเคฒी เคถीเคŸ เค–ोเคฒें।

  2. เคชเคนเคฒी เคฐो (Row 1) เคฎें เคธेเคฒ A1 เคธे F1 เคคเค• เค•ो เคธेเคฒेเค•्เคŸ เค•เคฐें เค”เคฐ เคนेเคกिंเค— เคฆें: Stocks In Bull Run

  3. เคฆूเคธเคฐी เคฐो (Row 2) เคฎें เค•ॉเคฒเคฎ เค•े เคจाเคฎ เค‡เคธ เคช्เคฐเค•ाเคฐ เคฒिเค–ें:

    • A2: NSE Code

    • B2: Volume

    • C2: Previous Close

    • D2: CMP

    • E2: Difference from 200 DMA

    • F2: CAR

เคฎाเคธ्เคŸเคฐ เคซॉเคฐ्เคฎूเคฒा เคชेเคธ्เคŸ เค•เคฐเคจा: เค…เคฌ เคนเคฎें เคธिเคฐ्เคซ เคเค• เคซॉเคฐ्เคฎूเคฒा เคธेเคฒ A3 เคฎें เคกाเคฒเคจा เคนै। เคฏเคน เคซॉเคฐ्เคฎूเคฒा 'Top 250 Stocks' เคตाเคฒी เคถीเคŸ เคธे เคกेเคŸा เค‰เค ाเคเค—ा, เค‰เคธे เคซिเคฒ्เคŸเคฐ เค•เคฐेเค—ा เค”เคฐ เคตॉเคฒ्เคฏूเคฎ เค•े เคนिเคธाเคฌ เคธे เคธเคนी เค•्เคฐเคฎ เคฎें เคฒเค—ा เคฆेเค—ा।

(เคจोเคŸ: เค‡เคธ เคซॉเคฐ्เคฎूเคฒे เค•ो เคฆो เคฒाเค‡เคจों เคฎें เคฒिเค–ा เค—เคฏा เคนै เคคाเค•ि เคฌ्เคฒॉเค— เคชเคฐ เคฏเคน เคฌाเคนเคฐ เคจ เคจिเค•เคฒे। เค†เคช เค‡เคธ เคชूเคฐे เคฌॉเค•्เคธ เค•ो เคเค• เคธाเคฅ เค•ॉเคชी เค•เคฐเค•े เคธेเคฒ A3 เคฎें เคชेเคธ्เคŸ เค•เคฐ เคฆें, เค—ूเค—เคฒ เคถीเคŸ เค‡เคธे เคฌिเคฒ्เค•ुเคฒ เคธเคนी เคคเคฐเคน เคธे เคธ्เคตीเค•ाเคฐ เค•เคฐ เคฒेเค—ा)

เคธेเคฒ A3 เคฎें เคฏเคน เคซॉเคฐ्เคฎूเคฒा เคชेเคธ्เคŸ เค•เคฐें:

Excel
=IFERROR(SORT(FILTER({'Top 250 Stocks'!A:D, 'Top 250 Stocks'!I:J}, 'Top 250 Stocks'!H:H="In Bull Run", 
'Top 250 Stocks'!J:J="Buy/Average Out"), 2, FALSE), "เค•ोเคˆ เคธ्เคŸॉเค• เคจเคนीं เคฎिเคฒा")

เคฏเคน เคซॉเคฐ्เคฎूเคฒा เค…เคชเคจे เค†เคช เค‰เคจ เคธเคญी เคธ्เคŸॉเค•्เคธ เค•ी เคฒिเคธ्เคŸ เคคैเคฏाเคฐ เค•เคฐ เคฆेเค—ा เคœो เคฌुเคฒ เคฐเคจ เคฎें เคนैं เค”เคฐ เคœिเคจเค•ी CAR เคฐेเคŸिंเค— "Buy/Average Out" เคนै। เค†เคชเค•ो เคฌाเคฐ-เคฌाเคฐ เค•ुเค› เคญी เค•เคฐเคจे เค•ी เฅ›เคฐूเคฐเคค เคจเคนीं เคนै, เคœैเคธे เคนी เคฎुเค–्เคฏ เคถीเคŸ เค…เคชเคกेเคŸ เคนोเค—ी, เคฏเคน เคฒिเคธ्เคŸ เคญी เค…เคชเคจे เค†เคช เค…เคชเคกेเคŸ เคนो เคœाเคเค—ी।

๐ŸŒŸ เคฌोเคจเคธ เค…เคชเคกेเคŸ: เคตॉเคฒ्เคฏूเคฎ (Volume) เค•ी เคœเค—เคน เคŸเคฐ्เคจเค“เคตเคฐ (Turnover) เคธे เคŸॉเคช 250 เคถेเคฏเคฐ เค•ैเคธे เคšुเคจें?

เคฎेเคฐे เค•ुเค› เคซॉเคฒोเคตเคฐ्เคธ เคจे เคฎांเค— เค•ी เคนै เค•ि เคตे 'เคŸोเคŸเคฒ เคตॉเคฒ्เคฏूเคฎ' เค•ी เคœเค—เคน 'เคŸोเคŸเคฒ เคŸเคฐ्เคจเค“เคตเคฐ' (เค•ुเคฒ เคŸ्เคฐेเคกेเคก เคตैเคฒ्เคฏू) เค•े เค†เคงाเคฐ เคชเคฐ เคŸॉเคช 250 เคธ्เคŸॉเค•्เคธ เคธेเคฒेเค•्เคŸ เค•เคฐเคจा เคšाเคนเคคे เคนैं। เคฏเคน เคเค• เคฌเคนुเคค เคนी เคถाเคจเคฆाเคฐ เค”เคฐ เคช्เคฐोเคซेเคถเคจเคฒ เคธोเคš เคนै!

เคตॉเคฒ्เคฏूเคฎ เค•े เคฌเคœाเคฏ เคŸเคฐ्เคจเค“เคตเคฐ เคธे เคถेเคฏเคฐ เคšुเคจเคจे เค•े เคซाเคฏเคฆे: เค…เค•्เคธเคฐ 1-2 เคฐुเคชเคฏे เคตाเคฒे เคชेเคจी เคธ्เคŸॉเค•्เคธ (Penny Stocks) เค•ा เคตॉเคฒ्เคฏूเคฎ (เค•्เคตांเคŸिเคŸी) เคฌเคนुเคค เคœ्เคฏाเคฆा เคนोเคคा เคนै, เคœिเคธเคธे เคตे เคซाเคฒเคคू เคฎें เคนเคฎाเคฐी เคฒिเคธ्เคŸ เคฎें เคŠเคชเคฐ เค† เคœाเคคे เคนैं। เคฒेเค•िเคจ 'เคŸเคฐ्เคจเค“เคตเคฐ' เคนเคฎें เคฏเคน เคฌเคคाเคคा เคนै เค•ि เค†เคœ เค•िเคธ เคถेเคฏเคฐ เคฎें เคธเคฌเคธे เคœ़्เคฏाเคฆा เคฐुเคชเคฏा (เคชैเคธा) เคฒเค—ा เคนै। เคŸเคฐ्เคจเค“เคตเคฐ เค•े เค†เคงाเคฐ เคชเคฐ เคซिเคฒ्เคŸเคฐ เค•เคฐเคจे เคธे เค•เคšเคฐा เคถेเคฏเคฐ เค…เคชเคจे เค†เคช เคฌाเคนเคฐ เคนो เคœाเคंเค—े เค”เคฐ เค†เคชเค•ो เคธिเคฐ्เคซ เคนाเคˆ-เค•्เคตाเคฒिเคŸी เค”เคฐ เคฎเคœเคฌूเคค เคธ्เคŸॉเค•्เคธ เค•ी เคฒिเคธ्เคŸ เคฎिเคฒेเค—ी, เคœเคนाँ เคฌเคก़े เคจिเคตेเคถเค• (Smart Money) เคชैเคธा เคฒเค—ा เคฐเคนे เคนैं।

เคฏเคฆि เค†เคช เคญी เค…เคชเคจी เคถीเคŸ เค•ो เค‡เคธ เคจเค เค”เคฐ เคœ़्เคฏाเคฆा เคธเคŸीเค• เคคเคฐीเค•े เคธे เค…เคชเค—्เคฐेเคก เค•เคฐเคจा เคšाเคนเคคे เคนैं, เคคो เค•ोเคกिंเค— เคฎें เค‰เคฒเคเคจे เค•ी เคฌिเคฒ्เค•ुเคฒ เฅ›เคฐूเคฐเคค เคจเคนीं เคนै। เคฌเคธ เค‡เคจ เค†เคธाเคจ เคธ्เคŸेเคช्เคธ เค•ो เคซॉเคฒो เค•เคฐें:

เคธ्เคŸेเคช 1: เค…เคชเคจे GitHub เค…เค•ाเค‰ंเคŸ เคฎें เคœाเคँ เค”เคฐ เค…เคชเคจी update_sheet.py เคซाเค‡เคฒ เค–ोเคฒें। เคธ्เคŸेเคช 2: เคฆाเคˆं เค“เคฐ เคŠเคชเคฐ เคชेंเคธिเคฒ (✏️ Edit) เค•े เคฌเคŸเคจ เคชเคฐ เค•्เคฒिเค• เค•เคฐें। เคธ्เคŸेเคช 3: เคตเคนां เคชเคนเคฒे เคธे เคฒिเค–े เคนुเค เคชूเคฐे เค•ोเคก เค•ो เคธेเคฒेเค•्เคŸ เค•เคฐเค•े เคกिเคฒीเคŸ (Delete) เค•เคฐ เคฆें (เคชेเคœ เค•ो เคฌिเคฒ्เค•ुเคฒ เค–ाเคฒी เค•เคฐ เคฆें)। เคธ्เคŸेเคช 4: เค…เคฌ เคจीเคšे เคฆिเค เค—เค เค‡เคธ เคจเค เค•ोเคก เค•ो เค•ॉเคชी เค•เคฐें เค”เคฐ เคตเคนां เคชेเคธ्เคŸ เค•เคฐ เคฆें:

import gspread

from oauth2client.service_account import ServiceAccountCredentials

import pandas as pd

import requests

import zipfile

import io

from datetime import datetime, timedelta

import os

import json


# 1. Credentials Setup

creds_json = os.environ.get('GCP_CREDENTIALS')

if not creds_json:

    print("CRITICAL: GCP_CREDENTIALS secret missing!")

    exit(1)


creds_dict = json.loads(creds_json)

scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"]

creds = ServiceAccountCredentials.from_json_keyfile_dict(creds_dict, scope)

client = gspread.authorize(creds)


# ⚠️ เค…เคชเคจी เค—ूเค—เคฒ เคถीเคŸ เค•ी ID เคฏเคนाँ เคกाเคฒें

spreadsheet_id = "เคฏเคนाँ_เค…เคชเคจी_เคถीเคŸ_เค•ी_ID_เคกाเคฒें" 

worksheet = client.open_by_key(spreadsheet_id).worksheet("Top 250 Stocks")


# 2. NSE Data Fetcher (TURNOVER LOGIC)

def fetch_bhavcopy_for_date(date_obj):

    date_str = date_obj.strftime("%Y%m%d")

    url = f"https://nsearchives.nseindia.com/content/cm/BhavCopy_NSE_CM_0_0_0_{date_str}_F_0000.csv.zip"

    

    headers = {

        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',

        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'

    }

    

    try:

        response = requests.get(url, headers=headers, timeout=20)

        

        if response.status_code == 200:

            with zipfile.ZipFile(io.BytesIO(response.content)) as z:

                csv_filename = z.namelist()[0]

                with z.open(csv_filename) as f:

                    df = pd.read_csv(f)

                    

                    df.columns = [c.strip() for c in df.columns]

                    

                    sym_col = next((c for c in ['TckrSymb', 'SYMBOL'] if c in df.columns), None)

                    close_col = next((c for c in ['ClsPric', 'CLOSE'] if c in df.columns), None)

                    series_col = next((c for c in ['SctySrs', 'SERIES'] if c in df.columns), None)

                    

                    # เคŸเคฐ्เคจเค“เคตเคฐ เค•े เคฒिเค เค•ॉเคฒเคฎ (TtlTrfVal)

                    turnover_col = next((c for c in ['TtlTrfVal', 'TtlTrdVal', 'TURNOVER_LACS', 'TURNOVER'] if c in df.columns), None)

                    

                    if not all([sym_col, close_col, turnover_col]):

                        return None

                    

                    if series_col:

                        df = df[df[series_col].astype(str).str.strip() == 'EQ']

                    

                    filter_keywords = 'BEES|ETF|GOLD|LIQUID'

                    df = df[~df[sym_col].astype(str).str.contains(filter_keywords, case=False, na=False)]

                    

                    df[turnover_col] = pd.to_numeric(df[turnover_col], errors='coerce')

                    df = df.dropna(subset=[turnover_col])

                    

                    # เคŸเคฐ्เคจเค“เคตเคฐ เค•े เค†เคงाเคฐ เคชเคฐ เคŸॉเคช 250

                    df_top = df.sort_values(by=turnover_col, ascending=False).head(250)

                    return df_top[[sym_col, turnover_col, close_col]].values.tolist()

        return None

    except Exception as e:

        return None


# 3. Execution Logic (7-Day Lookback)

date = datetime.now()

data_to_insert = None

fetched_date_str = ""


for i in range(7): 

    test_date = date - timedelta(days=i)

    if test_date.weekday() >= 5: continue

        

    data_to_insert = fetch_bhavcopy_for_date(test_date)

    

    if data_to_insert:

        fetched_date_str = test_date.strftime('%d-%b-%Y')

        break


# 4. Update Sheet

if data_to_insert:

    try:

        worksheet.batch_clear(['A2:C251'])

        worksheet.update('A2', data_to_insert)

        ist_now = (datetime.utcnow() + timedelta(hours=5, minutes=30)).strftime('%d-%b %H:%M')

        status_msg = f"Data Date: {fetched_date_str} | Last Update: {ist_now} (IST)"

        worksheet.update('K2', [[status_msg]])

        print(f"SUCCESS: Turnover Sheet Updated successfully for {fetched_date_str}!")

    except Exception as e:

        print(f"Google Sheet Error: {str(e)}")

else:

    print("FAILED: เคชिเค›เคฒे 7 เคฆिเคจों เคฎें เคธे เค•िเคธी เคญी เคฆिเคจ เค•ी เคซाเค‡เคฒ เคจเคนीं เคฎिเคฒी।")


เคธ्เคŸेเคช 5: เค•ोเคก เคชेเคธ्เคŸ เค•เคฐเคจे เค•े เคฌाเคฆ spreadsheet_id = "เคฏเคนाँ_เค…เคชเคจी_เคถीเคŸ_เค•ी_ID_เคกाเคฒें" เคตाเคฒी เคฒाเค‡เคจ เคฎें เค…เคชเคจी เค—ूเค—เคฒ เคถीเคŸ เค•ी ID เคตाเคชเคธ เคกाเคฒ เคฒें เค”เคฐ เคŠเคชเคฐ เคธे Commit changes เค•เคฐ เคฆें। เคธ्เคŸेเคช 6 (เค…ंเคคिเคฎ เค•ाเคฎ): เค…เคชเคจी เค—ूเค—เคฒ เคถीเคŸ เค–ोเคฒें เค”เคฐ เคฆोเคจों เคถीเคŸ्เคธ (Top 250 Stocks เค”เคฐ Final List) เคฎें เค•ॉเคฒเคฎ B เค•ी เคนेเคกिंเค— เค•ो "Volume" เคธे เคฌเคฆเคฒเค•เคฐ "Turnover" เค•เคฐ เคฆें, เคคाเค•ि เค†เค—े เค•ोเคˆ เค•ंเคซ्เคฏूเคœเคจ เคจ เคฐเคนे!

เคฌเคธ เคนो เค—เคฏा! เค…เคฌ เค†เคชเค•ा เคธ्เค•ैเคจเคฐ เค”เคฐ เคญी เคœ़्เคฏाเคฆा เคชाเคตเคฐเคซुเคฒ เค”เคฐ เคธเคŸीเค• เคฌเคจ เคšुเค•ा เคนै।

เคœिเคจ เคฒोเค—ों เค•े เค•ोเคˆ เคญी เคธเคฎเคธ्เคฏा เค† เคฐเคนी เคนै เคตे เค—ूเค—เคฒ เคœेเคฎिเคจी เค–ोเคฒें। เค‰เคธเคฎे เคฏเคน เค•เคฎांเคก เคฒिเค–ें

เคนैเคฒो, เคฎैं เคฎเคนेเคถ เค•ौเคถिเค• เคธเคฐ เค•े เคจिเคฎ्เคจ เคฌ्เคฒॉเค— เคชोเคธ्เคŸ เค•ो เคชเฅเค•เคฐ เค‰เคธเคธे เคธीเค–เค•เคฐ เคชाเคฏเคฅเคจ เค•ोเคก เคธे เค‘เคŸोเคฎेเคŸेเคก เคธ्เคŸोเค•्เคธ เคธेเคฒेเค•्เคถ เคถीเคŸ เคฌเคจा เคฐเคนा เคนूंः- https://www.maheshkaushik.com/2026/05/blog-post.html

เคชเคฐเคจ्เคคु เค‡เคธ เคถीเคŸ เคฎें เคฎेเคฐे เค•ुเค› เคเคฐเคฐ เค† เคฐเคนी เคนै เค•्เคฏा เค†เคช เค‡เคธ เคฌ्เคฒॉเค— เคชोเคธ्เคŸ เค•े เค…เคจुเคธाเคฐ เคถीเคŸ เคฌเคจाเคจें เคฎे เคฎेเคฐी เคฎเคฆเคฆ เค•เคฐ เคธเค•เคคे เคนैं।

เค‰เคธเค•े เคฌाเคฆ เคœेเคฎिเคจी เค•ो เค…เคชเคจे เคเคฐเคฐ เค•ोเคก เค…เคชเคจी เคธเคฎเคธ्เคฏा เค•ा เคธ्เค•्เคฐीเคจเคถॉเคŸ เค†เคฆि เคฆेเคคे เคœाเคฏें เคต เคœेเคฎिเคจी เค•े เคฌเคคाเคฏे เค…เคจुเคธाเคฐ เคธเคนी เค•เคฐเคคे เคœाเคฏें। เค†เคชเค•ी เคช्เคฐोเคฌ्เคฒเคฎ เคธॉเคฒ्เคต เคนो เคœाเคฏेเค—ी।

เค‡เคธे เคธเคฎเคเคจे เค•े เคฒिเคฏे เค•เค•्เคทा 2 เค•ा เคตीเคกिเคฏो เค‡เคธ เคฒिเค•ं เคธे เคฆेเค–ेंः-

https://youtu.be/tyeG16q9214?si=cGkG-QJjooFLcsdu



เคœिเคจ เคญी เคซॉเคฒोเคตเคฐ्เคธ เค•े เคธเคฎเคธ्เคฏाเคं เค† เคฐเคนी เคฅी เคต เคœो เคถीเคŸ เคจเคนीं เคฌเคจा เคชा เคฐเคนे เคฅे เค‰เคจเค•ा เคธเคฐ्เคตे เคเค• เค—ूเค—เคฒ เคซाเคฐ्เคฎ เคฎें เค•เคฐเคตाเคฏा เค—เคฏा เคคเคฅा เค—ूเค—เคฒ เคซाเคฐ्เคฎ เคฎें เคช्เคฐाเคช्เคค เคธเคฐ्เคตे เค•े เค…เคจुเคธाเคฐ เคซॉเคฒोเคตเคฐ्เคธ เค•ी เคธเคฎเคธ्เคฏा เค•ो เค•ैเคŸेเค—เคฐाเคˆเคœ เค•เคฐเค•े เคธเคฌเค•ा เคธเคฎाเคงाเคจ เค‡เคธ เค—ूเค—เคฒ เคกॉเค•्เคฏूเคฎेंเคŸ เคฎें เคฆे เคฆिเคฏा เค—เคฏा เคนै เคฏเคฆि เค†เคชเค•े เคญी เค•ोเคˆ เคธเคฎเคธ्เคฏा เค† เคฐเคนी เคนै เคคो เค‡เคธ เค—ूเค—เคฒ เคกाเค•्เคฏूเคฎेंเคŸ เค•ो เคชเคขเค•เคฐ เค‰เคธเค•ा เคธเคฎाเคงाเคจ เคคเคฒाเคถ เค•เคฐ เคธเค•เคคे เคนैंः-

https://docs.google.com/document/d/1qr9nZUbBiU4yYVkSy6cck_D4Guk0wjf94PJL72m6QIc/edit?usp=drive_link

เคœो เคซॉเคฒोเคตเคฐ เคเค• เคนी เคถीเคŸ เคฎें เคฆो เค…เคฒเค— เค…เคฒเค— เคŸैเคฌ เคฌเคจाเค•เคฐ เคเค• เคฎें เคตोเคฒ्เคฏूเคฎ เค•े เค†เคงाเคฐ เคชเคฐ เคŸॉเคช 250 เคธ्เคŸॉเค•्เคธ เคกाเค‰เคจเคฒोเคก เค•เคฐเคจा เคšाเคนเคคे เคนैं เคต เคฆूเคธเคฐी เคŸैเคฌ เคฎें เคŸเคฐ्เคจเค“เคตเคฐ เค•े เค†เคงाเคฐ เคชเคฐ เคŸॉเคช 250 เคธ्เคŸॉเค•्เคธ เคกाเค‰เคจเคฒोเคก เค•เคฐเคจा เคšाเคนเคคे เคนैं เค‰เคจเค•े เคฒिเคฏे เคฎैंเคจे เค†เคชเค•े เคฒिเค เคเค• "เคŸू-เค‡เคจ-เคตเคจ เคฎाเคธ्เคŸเคฐ เค•ोเคก" (2-in-1 Master Code) เคฒिเค–ा เคนै। เคฏเคน เคฆो เค…เคฒเค—-เค…เคฒเค— เคฐोเคฌोเคŸ เคจเคนीं เคนैं, เคฌเคฒ्เค•ि เคเค• เคนी เคฌेเคนเคฆ เคเคกเคตांเคธ เคธ्เค•्เคฐिเคช्เคŸ เคนै।

เคฏเคน เคจเคฏा เค•ोเคก เค•्เคฏा เค•เคฐเคคा เคนै? เคฏเคน NSE เค•े เคธเคฐ्เคตเคฐ เคชเคฐ เคœाเค•เคฐ เคญाเคตเค•ॉเคชी (Bhavcopy) เค•ी เคซाเค‡เคฒ เคธिเคฐ्เคซ 1 เคนी เคฌाเคฐ เคกाเค‰เคจเคฒोเคก เค•เคฐเคคा เคนै। เคซिเคฐ เคฏเคน เค…เคชเคจे เคฆिเคฎाเค— (Memory) เคฎें เค‰เคธी 1 เคซाเค‡เคฒ เคธे 'เคตॉเคฒ्เคฏूเคฎ' เคตाเคฒे เคŸॉเคช 250 เคถेเคฏเคฐ เคจिเค•ाเคฒเคคा เคนै เค”เคฐ เคชเคนเคฒी เคถीเคŸ เคฎें เคกाเคฒ เคฆेเคคा เคนै। เคซिเคฐ เคธेเค•ंเคก เคญเคฐ เค•े เค…ंเคฆเคฐ, เค‰เคธी เคซाเค‡เคฒ เคธे 'เคŸเคฐ्เคจเค“เคตเคฐ' เคตाเคฒे เคŸॉเคช 250 เคถेเคฏเคฐ เคจिเค•ाเคฒเคคा เคนै เค”เคฐ เคฆूเคธเคฐी เคถीเคŸ เคฎें เคกाเคฒ เคฆेเคคा เคนै।

เคธ्เคŸेเคช 1: เค†เคชเค•ी เค—ूเค—เคฒ เคถीเคŸ เคฎें เคเค• เคจเคฏा เคŸैเคฌ (Tab) เคฌเคจाเคจा

เคšूँเค•ि เค†เคช ,เคเค• เคนी เคถीเคŸ เค•ा เค‡เคธ्เคคेเคฎाเคฒ เค•เคฐ เคฐเคนे เคนैं। , เคคो เคธเคฌเคธे เคชเคนเคฒे เค†เคชเค•ो เค‡เคธเคฎें เคŸเคฐ्เคจเค“เคตเคฐ เค•ा เคกेเคŸा เคฎंเค—ाเคจे เค•े เคฒिเค เคเค• เค–ाเคฒी เคœเค—เคน เคฌเคจाเคจी เคนोเค—ी:

  1. เค…เคชเคจी เค‰เคธी เค—ूเค—เคฒ เคถीเคŸ เค•ो เค–ोเคฒें। เคœो เคฌเคจाเคฏी เคนुเคฏी เคนै। เคฏเคฆि เคŸเคฐ्เคจเค“เคตเคฐ เคตाเคฒी เคฌเคจाเคฏी เคนुเคฏी เคนै เคคो เค‰เคธी เค•ो เค–ोเคฒें।

  2. เคจीเคšे '+' เคฌเคŸเคจ เคฆเคฌाเค•เคฐ เคเค• เคจเคฏा เคŸैเคฌ (Sheet) เคฌเคจाเคँ เค”เคฐ เค‰เคธเค•ा เคจाเคฎ เคฌिเคฒ्เค•ुเคฒ เคฏเคน เคฐเค–ें: Top 250 Turnover (เคธ्เคชेเคฒिंเค— เค”เคฐ เคธ्เคชेเคธ เคฌिเคฒ्เค•ुเคฒ เคฏเคนी เคฐเค–ें เค•्เคฏोंเค•ि เค•ोเคก เค‡เคธी เคจाเคฎ เค•ो เคขूँเคขेเค—ा)

  3. เค…เคฌ เค…เคชเคจी เคชुเคฐाเคจी เคถीเคŸ Top 250 Stocks เค•ी เคชเคนเคฒी เคฒाเค‡เคจ (Row 1 เค•ी เคนेเคกिंเค—्เคธ A1 เคธे เคฒेเค•เคฐ K1 เคคเค•) เค•ॉเคชी เค•เคฐें เค”เคฐ เค‡เคธ เคจเคˆ Top 250 Turnover เคถीเคŸ เค•ी Row 1 เคฎें เคชेเคธ्เคŸ เค•เคฐ เคฆें।

  4. (เคตैเค•เคฒ्เคชिเค•) เค‡เคธ เคจเคˆ เคถीเคŸ เค•े B1 เคฎें 'Volume' เค•ी เคœเค—เคน 'Turnover (Lacs)' เคฒिเค– เคฒें เคคाเค•ि เค•ंเคซ्เคฏूเคœเคจ เคจ เคฐเคนे।

เคธ्เคŸेเคช 2: เค†เคชเค•ा เคจเคฏा 'เคŸू-เค‡เคจ-เคตเคจ' (2-in-1) เคชाเคฏเคฅเคจ เค•ोเคก

เค…เคฌ เค†เคชเค•ो GitHub เคชเคฐ เค…เคชเคจी update_sheet.py เคซ़ाเค‡เคฒ เค•ो เค–ोเคฒเค•เคฐ เค‰เคธเคฎें เคชเคนเคฒे เคธे เคฎौเคœूเคฆ เคชूเคฐे เค•ोเคก เค•ो เคกिเคฒीเคŸ (Delete) เค•เคฐเคจा เคนै เค”เคฐ เคฏเคน เคจเคฏा เคฎाเคธ्เคŸเคฐ เค•ोเคก เคชेเคธ्เคŸ เค•เคฐเคจा เคนै। เค‡เคธเคฎें เคœเคนां เคฒिเค–ा เคนै เคฏเคนां เคชเคฐ เค…เคชเคจी เคถीเคŸ เค•ी เค†เคˆเคกी เคกाเคฒे เคตเคนां เค†เคชเค•ी เคถीเคŸ เค•ी เค†เคˆเคกी เคกाเคฒเคจा เคฎเคค เคญुเคฒें เค†เคˆเคกी เค•ैเคธे เคจिเค•ाเคฒเคคे เคนैं เคฏเคน เคตीเคกिเคฏो เคฎें เคฌเคคाเคฏा เคนै เคจीเคšे เคตीเคกिเคฏो เค•ा เคฒिंเค• เคญी เค† เคœाเคฏेเค—ा। 50 เคช्เคฐเคคिเคถเคค เคซॉเคฒोเคตเคฐ เคœिเคจเค•े เคเคฐเคฐ เค†เคคी เคนै เคตो เคฏा เคคो เคถीเคŸ เค•ी เค†เคˆเคกी เคกाเคฒเคจा เคนी เคญूเคฒ เคœाเคคे เคนै เคฏा เค†เคˆเคกी เคกाเคฒเคจे เคฎें เค•ोเคˆ เค—เคฒเคคी เค•เคฐเคคे เคนैं เคฏा เค†เค‡เคกी เค•े เคชाเคธ เคœो เค‡เคจ्เคตเคฐ्เคŸेเคก เค•ोเคฎा เคนै เค‰เคจเค•ो เคกीเคฒीเคŸ เค•เคฐ เคฆेเคคे เคนैं। เค‡เคธเคฒिเคฏे เค†เคˆเคกी เคตाเคฒी เค—เคฒเคคी เค•ा เคง्เคฏाเคจ เค•เคฐ เคฒेเคจा।

import gspread
from oauth2client.service_account import ServiceAccountCredentials
import pandas as pd
import requests
import zipfile
import io
from datetime import datetime, timedelta
import os
import json

# 1. Credentials Setup
creds_json = os.environ.get('GCP_CREDENTIALS')
if not creds_json:
    print("ERROR: GCP_CREDENTIALS secret missing!")
    exit(1)

creds_dict = json.loads(creds_json)
scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"]
creds = ServiceAccountCredentials.from_json_keyfile_dict(creds_dict, scope)
client = gspread.authorize(creds)

# เค†เคชเค•ी เคถीเคŸ เค•ी ID 
spreadsheet_id = "เคฏเคนां เคชเคฐ เค…เคชเคจी เคถीเคŸ เค•ी เค†เคˆเคกी เคกाเคฒे "

# เคฆोเคจों เคถीเคŸ्เคธ เค•ो เค•เคจेเค•्เคŸ เค•เคฐเคจा
try:
    ws_volume = client.open_by_key(spreadsheet_id).worksheet("Top 250 Stocks")
    ws_turnover = client.open_by_key(spreadsheet_id).worksheet("Top 250 Turnover")
except Exception as e:
    print(f"Sheet Connection Error: {e}")
    exit(1)

# 2. New NSE UDiFF Data Fetcher
def fetch_bhavcopy_for_date(date_obj):
    date_str = date_obj.strftime("%Y%m%d")
    url = f"https://nsearchives.nseindia.com/content/cm/BhavCopy_NSE_CM_0_0_0_{date_str}_F_0000.csv.zip"
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
    }
    print(f"--- เคคाเคฐीเค– {date_obj.strftime('%d-%m-%Y')} เคšेเค• เค•เคฐ เคฐเคนे เคนैं ---")
    
    try:
        response = requests.get(url, headers=headers, timeout=15)
        if response.status_code == 200:
            print("เคซाเค‡เคฒ เคฎिเคฒ เค—เคˆ! เค…เคฌ เค‡เคธे เค–ोเคฒ เคฐเคนे เคนैं...")
            with zipfile.ZipFile(io.BytesIO(response.content)) as z:
                csv_filename = z.namelist()[0]
                with z.open(csv_filename) as f:
                    df = pd.read_csv(f)
                    
                    # เคจเค เค•ॉเคฒเคฎ เค•े เคจाเคฎ เค–ोเคœเคจा
                    sym_col = 'TckrSymb' if 'TckrSymb' in df.columns else 'SYMBOL'
                    close_col = 'ClsPric' if 'ClsPric' in df.columns else 'CLOSE'
                    series_col = 'SctySrs' if 'SctySrs' in df.columns else 'SERIES'
                    
                    # 1. เคตॉเคฒ्เคฏूเคฎ เค•ॉเคฒเคฎ เคขूँเคขเคจा
                    vol_col = 'TtlTradgVol'
                    for c in ['TtlTradgVol', 'TOTTRDQTY', 'TtlTrdQty', 'TotTrdQty']:
                        if c in df.columns:
                            vol_col = c
                            break
                            
                    # 2. เคŸเคฐ्เคจเค“เคตเคฐ เค•ॉเคฒเคฎ เคขूँเคขเคจा (TtlTrfVal)
                    turnover_col = 'TtlTrfVal'
                    for c in ['TtlTrfVal', 'TOTTRDVAL', 'TtlTrdVal', 'TotTrdVal']:
                        if c in df.columns:
                            turnover_col = c
                            break
                    
                    # เคธिเคฐ्เคซ EQ เคธीเคฐीเคœ เค›ांเคŸเคจा
                    if series_col in df.columns:
                        df = df[df[series_col].astype(str).str.strip() == 'EQ']
                    
                    # ETF, GOLD, LIQUID เคนเคŸाเคจा
                    filter_keywords = 'BEES|ETF|GOLD|LIQUID|CASE|SILVER|LIQ'
                    df = df[~df[sym_col].astype(str).str.contains(filter_keywords, case=False, na=False)]
                    
                    # --- เคกेเคŸा เค•ो เคฆो เคญाเค—ों เคฎें เคฌाँเคŸเคจा ---
                    
                    # เคฒिเคธ्เคŸ A: เคตॉเคฒ्เคฏूเคฎ เค•े เค†เคงाเคฐ เคชเคฐ เคŸॉเคช 250
                    df_vol = df.sort_values(by=vol_col, ascending=False).head(250)
                    data_vol = df_vol[[sym_col, vol_col, close_col]].values.tolist()
                    
                    # เคฒिเคธ्เคŸ B: เคŸเคฐ्เคจเค“เคตเคฐ เค•े เค†เคงाเคฐ เคชเคฐ เคŸॉเคช 250
                    df_turnover = df.sort_values(by=turnover_col, ascending=False).head(250)
                    data_turnover = df_turnover[[sym_col, turnover_col, close_col]].values.tolist()
                    
                    return data_vol, data_turnover
        else:
            print(f"NSE เคธเคฐ्เคตเคฐ เคจे {response.status_code} เคฐिเคธ्เคชॉเคจ्เคธ เคฆिเคฏा।")
            return None, None
    except Exception as e:
        print(f"Error: {e}")
        return None, None

# 3. Execution Logic (7 เคฆिเคจ เคชीเค›े เคคเค• เคšेเค• เค•เคฐเคจा)
date = datetime.now()
data_vol_to_insert = None
data_turnover_to_insert = None
fetched_date_str = ""

for i in range(7):
    test_date = date - timedelta(days=i)
    if test_date.weekday() >= 5: # Skip Sat/Sun
        continue
        
    data_vol, data_turnover = fetch_bhavcopy_for_date(test_date)
    if data_vol and data_turnover:
        data_vol_to_insert = data_vol
        data_turnover_to_insert = data_turnover
        fetched_date_str = test_date.strftime('%d-%b-%Y')
        break

# 4. Update Both Sheets
if data_vol_to_insert and data_turnover_to_insert:
    try:
        # A. เคตॉเคฒ्เคฏूเคฎ เคตाเคฒी เคชुเคฐाเคจी เคถीเคŸ เค…เคชเคกेเคŸ เค•เคฐें
        ws_volume.batch_clear(['A2:C251'])
        ws_volume.update('A2', data_vol_to_insert)
        
        # B. เคŸเคฐ्เคจเค“เคตเคฐ เคตाเคฒी เคจเคˆ เคถीเคŸ เค…เคชเคกेเคŸ เค•เคฐें
        ws_turnover.batch_clear(['A2:C251'])
        ws_turnover.update('A2', data_turnover_to_insert)
        
        # เคŸाเค‡เคฎเคธ्เคŸैเคฎ्เคช เค…เคชเคกेเคŸ เค•เคฐें
        ist_now = (datetime.utcnow() + timedelta(hours=5, minutes=30)).strftime('%d-%b %H:%M')
        status_msg = f"Data Date: {fetched_date_str} | Last Update: {ist_now} (IST)"
        
        ws_volume.update('K2', [[status_msg]])
        ws_turnover.update('K2', [[status_msg]])
        
        print(f"SUCCESS: เคฆोเคจों เคถीเคŸ्เคธ (Volume เค”เคฐ Turnover) {fetched_date_str} เค•े เคกेเคŸा เคธे เค…เคชเคกेเคŸ เคนो เค—เคˆ เคนैं!")
    except Exception as e:
        print(f"Google Sheet เค…เคชเคกेเคŸ เค•เคฐเคจे เคฎें เคเคฐเคฐ: {e}")
        exit(1)
else:
    print("FAILED: เคชिเค›เคฒे 7 เคฆिเคจों เคฎें เคธे เค•िเคธी เคญी เคฆिเคจ เค•ी เคซाเค‡เคฒ เคจเคนीं เคฎिเคฒी।")
    exit(1)

เค…เคฌ เค†เคชเค•ो เค•्เคฏा เค•เคฐเคจा เคนै?

  1. เค‡เคธ เค•ोเคก เค•ो GitHub เคฎें เคชेเคธ्เคŸ เค•เคฐเค•े Commit changes เค•เคฐ เคฆें।

  2. Actions เคŸैเคฌ เคฎें เคœाเค•เคฐ เคเค• เคฌाเคฐ 'Run Workflow' เคชเคฐ เค•्เคฒिเค• เค•เคฐ เคฆें।

เค†เคช เคฆेเค–ेंเค—े เค•ि เค†เคชเค•ी เคฆोเคจों เคถीเคŸ्เคธ เคเค• เคธाเคฅ เคธुเคชเคฐเคซाเคธ्เคŸ เคธ्เคชीเคก เคธे เคญเคฐ เค—เคˆ เคนैं। Top 250 Stocks เคฎें เคชเคนเคฒे เค•ी เคคเคฐเคน เคตॉเคฒ्เคฏूเคฎ เคตाเคฒे เคถेเคฏเคฐ เค†เคंเค—े เค”เคฐ เคจเคˆ Top 250 Turnover เคถीเคŸ เคฎें เคชैเคธे (Value) เคตाเคฒे เคฌेเคนเคคเคฐीเคจ เคถेเคฏเคฐ เค† เคœाเคंเค—े।

เคฏเคฆि เค•िเคธी เค•े เค•ोเคˆ เคเคฐเคฐ เค†เคคी เคนै เคคो เคชूเคฐे เค•ोเคฐ्เคธ เคฎें เคซॉเคฒोเคตเคฐ्เคธ เคฆ्เคตाเคฐा เคฌเคคाเคฏी เค—เคฏी เค•ॉเคฎเคจ เคเคฐเคฐ เค•ा เคธเคฎाเคงाเคจ เค‡เคธ เค—ूเค—เคฒ เคกाเค•्เคฏूเคฎेंเคŸ เคฎें เคฆे เคฆिเคฏा เคนै เค‡เคธे เคชเฅเค•เคฐ เคธเคฎाเคงाเคจ เค•เคฐ เคฒेเคตें।

https://docs.google.com/document/d/1qr9nZUbBiU4yYVkSy6cck_D4Guk0wjf94PJL72m6QIc/edit?usp=sharing

เค†เค—े เค†เคชเค•ो เค•्เคฏा เค•เคฐเคจा เคนै? (เคธिเคฐ्เคซ 2 เคฎिเคจเคŸ เค•ा เค•ाเคฎ)

เคธ्เคŸेเคช 1: เค…เคชเคจी เคถीเคŸ เคฎें เคจीเคšे '+' เคฆเคฌाเค•เคฐ เคเค• เคจเคฏा เคŸैเคฌ เคฌเคจाเคँ เค”เคฐ เค‰เคธเค•ा เคจाเคฎ Final List Turnover เคฐเค– เคฆें। Final List เคตाเคฒी เคถीเคŸ เค•ा เคจाเคฎ เคฌเคฆเคฒเค•เคฐ Final List Volume เค•เคฐ เคฆेเคตें। 

เคธ्เคŸेเคช 2: เค…เคชเคจी เคชुเคฐाเคจी 'Final List Volume' เค•ी เคŠเคชเคฐ เคตाเคฒी เคนेเคกिंเค—्เคธ (Row 1 เค•े A1 เคธे F1 เคคเค•) เค•ो เค•ॉเคชी เค•เคฐें เค”เคฐ เค‡เคธ เคจเคˆ เคถीเคŸ เค•ी เคชเคนเคฒी เคฒाเค‡เคจ เคฎें เคชेเคธ्เคŸ เค•เคฐ เคฆें। เคต  เค‰เคชเคฐ เค•े เคนेเคกिंเค— เคฎें เคตोเคฒ्เคฏूเคฎ เค•े เคธ्เคฅाเคจ เคชเคฐ เคŸเคฐ्เคจเค“เคตเคฐ เค•เคฐ เคฆेเคตें।

เคธ्เคŸेเคช 3: เค…เคฌ เค‡เคธ เคจเคˆ เคถीเคŸ เค•े เคธेเคฒ A2 เคฎें เคฏเคน เคจเคฏा เคซॉเคฐ्เคฎूเคฒा เคชेเคธ्เคŸ เค•เคฐ เคฆें:

=IFERROR(SORT(FILTER({'Top 250 Turnover'!A:D, 'Top 250 Turnover'!I:J}, 'Top 250 Turnover'!H:H="In Bull Run", 
'Top 250 Turnover'!J:J="Buy/Average Out"), 2, FALSE), "เค•ोเคˆ เคธ्เคŸॉเค• เคจเคนीं เคฎिเคฒा")

เค…เคฌ เคœो เคฎेเคฐे เคช्เคฏाเคฐे เคซोเคฒोเคตเคฐ्เคธ เคเคธे เคนैं เคœो เคฏा เคคो เคธเคฎ्เคฎाเคจीเคฏ เคธीเคจीเคฏเคฐ เคธीเคŸीเคœเคจ เคนैं เคฏा เคœ्เคฏाเคฆा เคŸेเค•्เคจोเคฒाเคœी เคซ्เคฐैंเคกเคฒी เคจเคนीं เคนै เคฏा เคเคธे เคนैं เคœो เคธเคฌ เค•ुเค› เคœाเคจเคคे เคนुเคฏे เคญी เค‡เคคเคจी เคฎेเคนเคจเคค เคถीเคŸ เคฌเคจाเคจें เค•ी เคจเคนीं เค•เคฐเคจा เคšाเคนเคคे เคœिเคจเค•ो เคฎैं เคช्เคฏाเคฐ เคธे เคฎเคนाเค†เคฒเคธी เคต เคฎเคนाเคจाเคฒाเคฏเค• เคซोเคฒोเคตเคฐ्เคธ เคญी เค•เคนเคคा เคนूं। 
เค‰เคจเค•े เคฐेเคซเคฐेंเคธ เค•े เคฒिเคฏे เคตोเคฒ्เคฏूเคฎ เคต เคŸเคฐ्เคจเค“เคตเคฐ เคตाเคฒी เคถीเคŸों เคฎें เคœो เคซाเคˆเคจเคฒ เคธ्เคŸॉเค• เคฐोเคœ เคธ्เค•ैเคจ เคนोเค•เคฐ เค†เคคे เคนैं เค‰เคจเค•ो เคตो เค‡เคจ เคฌเคŸเคจों เค•ो เคฆเคฌाเค•เคฐ เคฆेเค– เคธเค•เคคे เคนैं। 
เคœเคฌ เคญी เคถीเคŸ เค‘เคŸो เค…เคชเคกेเคŸ เคนोเค—ी เคฌเคŸเคจों เค•े เคจीเคšे เค•े เคธ्เคŸॉเค• เคญी เค…เคชเคกेเคŸ เคนो เคœाเคฏेเค—ें เคฏे เคฌเคŸเคจ เคฎेเคฐी เคถीเคŸ เคธे เคœुเฅœे เคนुเคฏे เคนैं। เคชเคฐเคจ्เคคु เคฏाเคฆ เคฐเค–ें เคฏเคน เคฎेเคฐी เคธ्เคŸॉเค• เคฐेเค•เคฎाเคกेंเคถเคจ เคจเคนीं เคนै เคฏเคน เคธिเคฐ्เคซ เคฐेเคซเคฐेंเคธ เคต เคเคœुเค•ेเคถเคจเคฒ เคชเคชเคฐ्เคœ เค•े เคฒिเคฏे เคนैं เค‡เคธเค•े เค†เคงाเคฐ เคชเคฐ เค•ोเคˆ เคธ्เคŸॉเค• เคจा เค–เคฐीเคฆें เคชเคนเคฒे เค‡เคจเค•े เคŸेเค•्เคจीเค•เคฒ เคต เคซंเคกाเคฎेंเคŸเคฒ เคœांเคšे เคซिเคฐ เค…เคชเคจे เคตिเคตेเค• เค•ो เคฒเค—ाเค เคซिเคฐ เค…เคชเคจे เคชंเคœीเค•ृเคค เคจिเคตेเคถ เคธเคฒाเคนเค•ाเคฐ เค•ो เคชुเค›े เคซिเคฐ เคนी เค•ोเคˆ เค•ाเคฎ เค•เคฐें เค‡เคจ เคธเคฌ เคถेเคฏเคฐों เคฎें เคฎेเคฐा เคต เคฎेเคฐे เคฐिเคถ्เคคेเคฆाเคฐों เค•ा เคจिเคตेเคถ เคนो เคธเค•เคคा เคนै। เค‡เคธเคฒिเคฏे เคธाเคตเคงाเคจ เคฐเคนें เคธเคคเคฐ्เค• เคฐเคนे।


๐Ÿ•’ เค…เคชเคกेเคŸ เค•ा เคธเคฎเคฏ เคšेเค• เค•िเคฏा เคœा เคฐเคนा เคนै...
๐Ÿš€ เคกेเคŸा เคฒोเคก เคนो เคฐเคนा เคนै, เค•ृเคชเคฏा เคช्เคฐเคคीเค•्เคทा เค•เคฐें...
เค•्เคฐเคฎเคถः.....
.......เคœाเคฐी เคนै เค•ोเคฐ्เคธ เค•ी เค•เค•्เคทा 4 เคฎें เค‡เคธ เคฒिเคธ्เคŸ เคธे เค†เคฏे เคธ्เคŸॉเค•्เคธ เค•ी เคŸ्เคฐेเคกिंเค— เคฏเคฆि เคชंเคœीเค•ृเคค เคจिเคตेเคถ เคธเคฒाเคนเค•ाเคฐ เค•ी เคธเคฒाเคน เคธे เค•เคฐเคคे เคนैं เคคो เค•ैเคชिเคŸเคฒ เคฎैเคจेเคœเคฎेंเคŸ เคต เค•เคฎ्เคชाเค‰ंเคกिंเค— เค•ैเคธे เค•เคฐเคคे เคนैं เคตो เคธीเค–ाเคฏा เคœाเคจा เค…เคญी เคฌाเค•ी เคนै।

เคฎเคนเคค्เคตเคชूเคฐ्เคฃ เคช्เคฐเค•เคŸीเค•เคฐเคฃ (Disclosure): เคฎैं เคเค• SEBI เคชंเคœीเค•ृเคค เคฐिเคธเคฐ्เคš เคเคจाเคฒिเคธ्เคŸ (SEBI Registered Research Analyst) เคนूँ। เคŠเคชเคฐ เคฆी เค—เคˆ เคœाเคจเค•ाเคฐी, เคคเค•เคจीเค•ी เคธेเคŸเค…เคช, เคซॉเคฐ्เคฎूเคฒे เค”เคฐ เคธ्เคŸॉเค•्เคธ เค•ी เคธूเคšी เค•ेเคตเคฒ เคถैเค•्เคทिเค• เค”เคฐ เค…เคง्เคฏเคฏเคจ เค‰เคฆ्เคฆेเคถ्เคฏों (Educational Purposes) เค•े เคฒिเค เคธाเคा เค•ी เค—เคˆ เคนै। เค•ृเคชเคฏा เค•ोเคˆ เคญी เคจिเคตेเคถ เคจिเคฐ्เคฃเคฏ เคฒेเคจे เคธे เคชเคนเคฒे เค…เคชเคจे เคตिเคค्เคคीเคฏ เคธเคฒाเคนเค•ाเคฐ เคธे เคชเคฐाเคฎเคฐ्เคถ เค…เคตเคถ्เคฏ เคฒें।


Blog Archive

disclaimer:-Trading in stock market is very risky. This website is not perfect. This is not an advisory service to buy or sell. The contents of “maheshkaushik.com” are only for educational purposes. No liability is accepted for any content in “www.maheshkaushik.com”. Subject to pindwara(india) jurisdiction only. The author is neither a registered stockbroker nor a registered advisor and does not give investment advice.. While he believes his statements to be true, they always depend on the reliability of his own credible sources. The author recommends that you consult with a qualified investment advisor, one licensed by appropriate regulatory agencies in your legal jurisdiction, author of this website is not a trend technical analyst.