File size: 3,854 Bytes
d53dc44
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
from fpdf import FPDF

class PDF(FPDF):
    def header(self):
        self.set_font("helvetica", "B", 15)
        self.cell(0, 10, "Dynamic Momentum & Machine Learning Bot", border=False, align="C")
        self.ln(20)

    def footer(self):
        self.set_y(-15)
        self.set_font("helvetica", "I", 8)
        self.cell(0, 10, f"Page {self.page_no()}", align="C")

pdf = PDF()
pdf.add_page()
pdf.set_font("helvetica", size=12)

content = """
Your Core Strategy (The Rules)
Your bot is a Dynamic Momentum & Machine Learning Swing/Day Trader. Its strict rules are:

1. The Universe: S&P 500 stocks + Highly Liquid ETFs.
2. Liquidity Rule: Only trade assets with > 2,000,000 Average Daily Volume (ADV).
3. Trend Rule: Only buy assets that have a positive 1-week momentum.
4. Price Filter & Preference: Hard cap at $200 per share. Absolute first preference is given to stocks under $100 (Tier 1). Stocks between $100-$200 (Tier 2) are only chosen if there aren't enough Tier 1 stocks.
5. Risk Management: Machine Learning (Kelly Criterion) dictates position size, and Dynamic Volatility Trailing Stops protect profits.

--------------------------------------------------

Step-by-Step Daily Execution Flow

Step 1: Startup & Market Assessment (Pre 10:30 AM ET)
When you turn the bot on, it connects to Alpaca and assesses your portfolio. It looks at the broader market (SPY) using a Regime Filter. If the overall market is crashing, the bot automatically reduces its maximum risk exposure. It waits patiently until 10:30 AM to let the morning volatility settle.

Step 2: Universe Generation (10:30 AM ET)
At exactly 10:30 AM, the bot initiates your custom dynamic scan:
- It scans all S&P 500 stocks and ETFs.
- It strips out illiquid stocks (< 2M ADV), expensive stocks (> $200), and negative trending stocks.
- It sorts the surviving list, putting all sub-$100 stocks at the very top.
- It locks in the Top 40 momentum candidates for the day.
- It mass-downloads the historical candlestick data for these 40 specific symbols.

Step 3: Technical, Sentiment, and ML Scoring
For each of the 40 candidates, the bot digs deep:
- Technicals: Calculates MACD, RSI, and Volume breakouts. 
- Sentiment: Scans the web for recent news headlines and assigns a sentiment score.
- Machine Learning Prediction: The ML model evaluates the setup and assigns a strict "Win Probability" (e.g., 65% chance of success).
- Final Ranking: The bot sorts the final buy list, mathematically guaranteeing that the highly-rated, sub-$100 stocks are placed at the very front of the line.

Step 4: Position Sizing (Kelly Criterion)
Before buying, the bot determines exactly how many shares to purchase. Instead of risking a flat 1% on every trade, it uses the Kelly Criterion. If the Machine Learning model detects an "A+" setup, it sizes the position larger. If it's a standard setup, it buys a smaller fraction.

Step 5: Execution & Dynamic Trailing Stops
The bot routes the order to Alpaca. The moment the order fills, the bot calculates the stock's real-time volatility (ATR) and attaches a Volatility Trailing Stop. If the stock shoots up 3%, your stop-loss moves up automatically behind it. If the stock suddenly reverses, you get stopped out in profit.

Step 6: End of Day Sweep & Data Wipe (4:00 PM ET)
When the market closes:
- Sweep: The bot sells off any short-term positions to lock in profits, avoiding overnight gap-down risks.
- The Wipe: The system runs `daily_wipe.py`. It completely deletes the day's database, the market data, the ML models, and the ML trade history. 
- Sleep: The bot goes to sleep entirely stateless, ready to wake up the next morning and view the market with a completely fresh, unbiased lens.
"""

# Output multi-cell text
pdf.multi_cell(0, 7, content)

pdf.output("Bot_Strategy_and_Execution_Flow.pdf")
print("PDF created successfully!")