Show description
penguin's ai infrastructure stock strategy | $100 → $1m
penguin's ai infrastructure stock strategy | $100 → $1m
🐧
ai infrastructure stock strategy
following the money: nvidia → microsoft → amd → small cap beneficiaries
day trading | supply chain plays | news catalyst momentum
⚠️ realistic day trading simulation | pattern day trader rules apply (need $25k after initial growth) |
this shows 280 trading days tracking AI infrastructure stocks that move when big tech announces earnings, partnerships, or product launches |
requires: pre-market scanning, level 2 data, news feeds, strict risk management | success rate:
penguin's ai infrastructure stock strategy | $100 → $1m
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>penguin's ai infrastructure stock strategy | $100 → $1m</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<style>
:root {
--bg: #000000;
--bg-card: #0d1117;
--bg-card-2: #161b22;
--accent: #00ff9f;
--accent-dim: rgba(0, 255, 159, 0.2);
--blue: #58a6ff;
--purple: #bc8cff;
--orange: #ff9d3d;
--text: #e6edf3;
--text-dim: #7d8590;
--green: #3fb950;
--red: #f85149;
--yellow: #d29922;
--border: #21262d;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
background: var(--bg);
color: var(--text);
font-family: 'SF Mono', 'Consolas', 'Monaco', monospace;
padding: 20px;
line-height: 1.6;
}
.container {
max-width: 1600px;
margin: 0 auto;
}
header {
background: linear-gradient(135deg, var(--bg-card) 0%, var(--bg-card-2) 100%);
border: 1px solid var(--border);
border-radius: 12px;
padding: 30px;
margin-bottom: 25px;
position: relative;
overflow: hidden;
}
header::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
background: linear-gradient(90deg, var(--accent), var(--blue), var(--purple));
}
.header-content {
position: relative;
z-index: 1;
}
.header-top {
display: flex;
align-items: center;
gap: 20px;
margin-bottom: 15px;
}
.penguin {
font-size: 56px;
filter: drop-shadow(0 0 20px rgba(0, 255, 159, 0.3));
}
h1 {
font-size: 28px;
letter-spacing: -0.5px;
color: var(--accent);
text-transform: uppercase;
}
.subtitle {
color: var(--text-dim);
font-size: 14px;
margin-top: 5px;
}
.strategy-tag {
display: inline-block;
background: var(--accent-dim);
color: var(--accent);
padding: 4px 12px;
border-radius: 4px;
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 1px;
margin-top: 10px;
}
.warning-banner {
background: rgba(255, 157, 61, 0.1);
border: 1px solid var(--orange);
border-radius: 8px;
padding: 15px;
margin-bottom: 20px;
font-size: 13px;
}
.warning-banner strong {
color: var(--orange);
}
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: 15px;
margin-bottom: 25px;
}
.stat-card {
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 8px;
padding: 18px;
transition: transform 0.2s, border-color 0.2s;
}
.stat-card:hover {
transform: translateY(-2px);
border-color: var(--accent);
}
.stat-label {
color: var(--text-dim);
font-size: 11px;
text-transform: uppercase;
letter-spacing: 1px;
margin-bottom: 8px;
}
.stat-value {
font-size: 26px;
font-weight: 700;
color: var(--text);
}
.stat-value.green { color: var(--green); }
.stat-value.red { color: var(--red); }
.stat-value.yellow { color: var(--yellow); }
.stat-value.blue { color: var(--blue); }
.grid-2 {
display: grid;
grid-template-columns: 1.2fr 1fr;
gap: 20px;
margin-bottom: 25px;
}
@media (max-width: 1100px) {
.grid-2 {
grid-template-columns: 1fr;
}
}
.card {
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 10px;
padding: 25px;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
padding-bottom: 15px;
border-bottom: 1px solid var(--border);
}
.card-title {
font-size: 16px;
text-transform: uppercase;
letter-spacing: 1.5px;
color: var(--accent);
display: flex;
align-items: center;
gap: 10px;
}
.card-subtitle {
font-size: 12px;
color: var(--text-dim);
margin-top: 5px;
}
.flow-diagram {
background: var(--bg-card-2);
border-radius: 8px;
padding: 20px;
margin-bottom: 20px;
}
.flow-level {
margin-bottom: 20px;
}
.flow-level-title {
font-size: 11px;
color: var(--text-dim);
text-transform: uppercase;
letter-spacing: 1px;
margin-bottom: 10px;
}
.flow-items {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.flow-item {
background: var(--bg-card);
border: 1px solid var(--border);
padding: 8px 14px;
border-radius: 6px;
font-size: 12px;
transition: all 0.2s;
}
.flow-item:hover {
border-color: var(--accent);
transform: scale(1.05);
}
.flow-item.tier-1 {
border-left: 3px solid var(--purple);
}
.flow-item.tier-2 {
border-left: 3px solid var(--blue);
}
.flow-item.tier-3 {
border-left: 3px solid var(--accent);
}
.api-setup {
background: rgba(88, 166, 255, 0.1);
border: 1px solid var(--blue);
border-radius: 6px;
padding: 12px;
font-size: 12px;
margin-bottom: 15px;
}
.api-setup code {
background: var(--bg-card-2);
padding: 2px 6px;
border-radius: 3px;
color: var(--accent);
}
.api-setup a {
color: var(--blue);
text-decoration: none;
}
.api-setup a:hover {
text-decoration: underline;
}
table {
width: 100%;
border-collapse: collapse;
font-size: 12px;
}
thead {
background: var(--bg-card-2);
position: sticky;
top: 0;
z-index: 10;
}
th {
padding: 12px 10px;
text-align: left;
color: var(--text-dim);
font-weight: 600;
text-transform: uppercase;
font-size: 10px;
letter-spacing: 1px;
border-bottom: 2px solid var(--border);
}
td {
padding: 10px;
border-bottom: 1px solid var(--border);
}
tbody tr:hover {
background: rgba(255, 255, 255, 0.02);
}
.stock-symbol {
font-weight: 700;
color: var(--text);
font-size: 13px;
}
.badge {
display: inline-block;
padding: 3px 8px;
border-radius: 4px;
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
}
.badge-long {
background: var(--green);
color: #000;
}
.badge-short {
background: var(--red);
color: #fff;
}
.badge-close {
background: var(--text-dim);
color: #000;
}
.badge-news {
background: var(--blue);
color: #000;
}
.green { color: var(--green); }
.red { color: var(--red); }
.yellow { color: var(--yellow); }
.blue { color: var(--blue); }
canvas {
max-height: 320px;
}
.trade-metrics {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
gap: 12px;
margin-top: 20px;
}
.metric-box {
background: var(--bg-card-2);
border: 1px solid var(--border);
border-radius: 6px;
padding: 12px;
}
.metric-box label {
display: block;
font-size: 10px;
color: var(--text-dim);
text-transform: uppercase;
letter-spacing: 0.5px;
margin-bottom: 6px;
}
.metric-box .value {
font-size: 18px;
font-weight: 700;
}
.strategy-box {
background: linear-gradient(135deg, rgba(0, 255, 159, 0.05), rgba(88, 166, 255, 0.05));
border: 1px solid var(--accent-dim);
border-radius: 8px;
padding: 20px;
margin-top: 20px;
}
.strategy-box h3 {
color: var(--accent);
font-size: 14px;
text-transform: uppercase;
letter-spacing: 1px;
margin-bottom: 15px;
}
.strategy-box ul {
list-style: none;
padding: 0;
}
.strategy-box li {
padding: 8px 0;
padding-left: 25px;
position: relative;
font-size: 13px;
color: var(--text-dim);
}
.strategy-box li::before {
content: '→';
position: absolute;
left: 0;
color: var(--accent);
font-weight: 700;
}
.phase-indicator {
display: inline-block;
background: var(--bg-card-2);
border: 1px solid var(--border);
border-left: 3px solid var(--accent);
padding: 4px 10px;
border-radius: 4px;
font-size: 11px;
font-weight: 600;
}
.loading {
text-align: center;
padding: 30px;
color: var(--text-dim);
}
.error {
background: rgba(248, 81, 73, 0.1);
border: 1px solid var(--red);
border-radius: 6px;
padding: 12px;
color: var(--red);
font-size: 12px;
}
.catalyst-tag {
display: inline-block;
background: rgba(88, 166, 255, 0.1);
border: 1px solid var(--blue);
color: var(--blue);
padding: 2px 8px;
border-radius: 3px;
font-size: 10px;
margin-right: 5px;
}
.connection-line {
display: flex;
align-items: center;
gap: 8px;
margin: 5px 0;
font-size: 12px;
color: var(--text-dim);
}
.connection-line::before {
content: '↳';
color: var(--accent);
}
.scroll-hint {
text-align: center;
color: var(--text-dim);
font-size: 11px;
padding: 10px;
border-top: 1px solid var(--border);
margin-top: 15px;
}
/* custom themed scrollbars */
::-webkit-scrollbar {
width: 12px;
height: 12px;
}
::-webkit-scrollbar-track {
background: var(--bg-card-2);
border-radius: 10px;
}
::-webkit-scrollbar-thumb {
background: linear-gradient(180deg, var(--accent), var(--blue));
border-radius: 10px;
border: 2px solid var(--bg-card-2);
}
::-webkit-scrollbar-thumb:hover {
background: linear-gradient(180deg, #00ffb3, #6eb9ff);
box-shadow: 0 0 8px rgba(0, 255, 159, 0.4);
}
::-webkit-scrollbar-corner {
background: var(--bg-card-2);
}
/* firefox scrollbar styling */
* {
scrollbar-width: thin;
scrollbar-color: var(--accent) var(--bg-card-2);
}
</style>
</head>
<body>
<div class="container">
<header>
<div class="header-content">
<div class="header-top">
<div class="penguin">🐧</div>
<div>
<h1>ai infrastructure stock strategy</h1>
<div class="subtitle">following the money: nvidia → microsoft → amd → small cap beneficiaries</div>
<div class="strategy-tag">day trading | supply chain plays | news catalyst momentum</div>
</div>
</div>
</div>
</header>
<div class="warning-banner">
<strong>⚠️ realistic day trading simulation</strong> | pattern day trader rules apply (need $25k after initial growth) |
this shows 280 trading days tracking AI infrastructure stocks that move when big tech announces earnings, partnerships, or product launches |
requires: pre-market scanning, level 2 data, news feeds, strict risk management | success rate: <1% of traders
</div>
<div class="stats-grid">
<div class="stat-card">
<div class="stat-label">starting capital</div>
<div class="stat-value">$100</div>
</div>
<div class="stat-card">
<div class="stat-label">final equity</div>
<div class="stat-value green">$1,004,582</div>
</div>
<div class="stat-card">
<div class="stat-label">trading days</div>
<div class="stat-value blue">280 days</div>
</div>
<div class="stat-card">
<div class="stat-label">total trades</div>
<div class="stat-value">387 entries</div>
</div>
<div class="stat-card">
<div class="stat-label">win rate</div>
<div class="stat-value yellow">62.3%</div>
</div>
<div class="stat-card">
<div class="stat-label">avg winner</div>
<div class="stat-value green">+4.2%</div>
</div>
<div class="stat-card">
<div class="stat-label">avg loser</div>
<div class="stat-value red">-1.8%</div>
</div>
<div class="stat-card">
<div class="stat-label">max drawdown</div>
<div class="stat-value red">-18.4%</div>
</div>
</div>
<div class="grid-2">
<div class="card">
<div class="card-header">
<div>
<div class="card-title">💰 the ai money flow ecosystem</div>
<div class="card-subtitle">how capital flows from big tech to tradeable small caps</div>
</div>
</div>
<div class="flow-diagram">
<div class="flow-level">
<div class="flow-level-title">tier 1: capital sources (the giants)</div>
<div class="flow-items">
<div class="flow-item tier-1">NVDA - gpu supply</div>
<div class="flow-item tier-1">MSFT - azure ai + openai</div>
<div class="flow-item tier-1">GOOGL - tpu + deepmind</div>
<div class="flow-item tier-1">AMD - data center chips</div>
<div class="flow-item tier-1">META - llama + infrastructure</div>
<div class="flow-item tier-1">AMZN - aws trainium</div>
</div>
</div>
<div class="flow-level">
<div class="flow-level-title">tier 2: direct beneficiaries (where we trade)</div>
<div class="flow-items">
<div class="flow-item tier-2">SMCI - ai server builder</div>
<div class="flow-item tier-2">AVGO - networking fabric</div>
<div class="flow-item tier-2">ARM - chip design ip</div>
<div class="flow-item tier-2">MRVL - data center connectivity</div>
<div class="flow-item tier-2">ALAB - pcie retimers</div>
<div class="flow-item tier-2">IONQ - quantum (msft/amzn backed)</div>
</div>
</div>
<div class="flow-level">
<div class="flow-level-title">tier 3: software/data layer (high volatility plays)</div>
<div class="flow-items">
<div class="flow-item tier-3">PLTR - government ai</div>
<div class="flow-item tier-3">SNOW - data warehouse</div>
<div class="flow-item tier-3">PATH - rpa automation</div>
<div class="flow-item tier-3">NET - edge compute</div>
<div class="flow-item tier-3">MDB - database for ai</div>
<div class="flow-item tier-3">DDOG - monitoring</div>
</div>
</div>
</div>
<div class="strategy-box">
<h3>🎯 penguin's stock day trading rules</h3>
<ul>
<li>scan pre-market for stocks with >200k volume + news catalyst</li>
<li>only trade tier 2/3 stocks when tier 1 reports earnings or makes announcements</li>
<li>entry: rsi 40-60 on 5min chart, volume spike 2x, price above vwap</li>
<li>position size: 70-90% of account on best setups (after $25k)</li>
<li>stop loss: -2% hard stop or break of vwap (whichever closer)</li>
<li>profit target: scale out 50% at +3%, 30% at +5%, trail 20% with +2% stop</li>
<li>max trades per day: 3 (avoid overtrading, pdt rule until $25k)</li>
<li>if down -5% by 11am: stop trading for the day, review what went wrong</li>
<li>best trading windows: 9:30-10:30am (open), 2:00-3:00pm (power hour setup)</li>
<li>track every trade: entry reason, exit reason, emotions, what worked</li>
</ul>
</div>
</div>
<div class="card">
<div class="card-header">
<div>
<div class="card-title">📊 live stock prices</div>
<div class="card-subtitle">alpha vantage api - real-time quotes</div>
</div>
</div>
<div class="api-setup">
<strong>🔑 api setup required:</strong> get free api key at
<a href="https://www.alphavantage.co/support/#api-key" target="_blank">alphavantage.co</a>
(5 requests/min, 100/day free tier) | paste key below to enable live data
</div>
<div style="margin-bottom: 15px;">
<input
type="text"
id="apiKeyInput"
placeholder="paste your alpha vantage api key here"
style="width: 100%; padding: 10px; background: var(--bg-card-2); border: 1px solid var(--border);
border-radius: 6px; color: var(--text); font-family: inherit; font-size: 12px;"
/>
<button
onclick="saveApiKey()"
style="margin-top: 8px; padding: 8px 16px; background: var(--accent); color: #000;
border: none; border-radius: 6px; cursor: pointer; font-weight: 600; font-size: 12px;"
>
load live prices
</button>
</div>
<div id="stockPriceContainer">
<div class="loading">enter api key to load real-time stock data</div>
</div>
</div>
</div>
<div class="card" style="margin-bottom: 25px;">
<div class="card-header">
<div>
<div class="card-title">📈 equity curve - the daily grind</div>
<div class="card-subtitle">280 trading days | multiple small wins compound faster than hunting home runs</div>
</div>
</div>
<canvas id="equityChart"></canvas>
<div class="trade-metrics">
<div class="metric-box">
<label>total wins</label>
<div class="value green">241</div>
</div>
<div class="metric-box">
<label>total losses</label>
<div class="value red">146</div>
</div>
<div class="metric-box">
<label>largest win</label>
<div class="value green">+18.7%</div>
</div>
<div class="metric-box">
<label>largest loss</label>
<div class="value red">-2.9%</div>
</div>
<div class="metric-box">
<label>profit factor</label>
<div class="value blue">2.34</div>
</div>
<div class="metric-box">
<label>sharpe ratio</label>
<div class="value blue">1.82</div>
</div>
</div>
</div>
<div class="card">
<div class="card-header">
<div>
<div class="card-title">📝 complete trade log - all 387 trades</div>
<div class="card-subtitle">day-by-day breakdown showing strategy evolution across phases</div>
</div>
</div>
<div style="overflow-x: auto; max-height: 600px; overflow-y: auto;">
<table id="tradeTable">
<thead>
<tr>
<th>day</th>
<th>phase</th>
<th>stock</th>
<th>action</th>
<th>catalyst</th>
<th>return</th>
<th>equity</th>
<th>strategy notes</th>
</tr>
</thead>
<tbody>
<tr><td colspan="8" class="loading">generating complete trade history...</td></tr>
</tbody>
</table>
</div>
<div class="scroll-hint">scroll to see all 387 trades | phases show account size evolution</div>
</div>
</div>
<script>
// alpha vantage api integration
let API_KEY = '';
function saveApiKey() {
API_KEY = document.getElementById('apiKeyInput').value.trim();
if (API_KEY) {
localStorage.setItem('alphavantage_key', API_KEY);
fetchStockPrices();
} else {
alert('please enter a valid api key');
}
}
// check for saved api key
window.addEventListener('load', () => {
const savedKey = localStorage.getItem('alphavantage_key');
if (savedKey) {
API_KEY = savedKey;
document.getElementById('apiKeyInput').value = savedKey;
fetchStockPrices();
}
});
// stocks to track
const STOCKS = [
{ symbol: 'SMCI', name: 'Super Micro Computer', tier: 2 },
{ symbol: 'AVGO', name: 'Broadcom', tier: 2 },
{ symbol: 'ARM', name: 'Arm Holdings', tier: 2 },
{ symbol: 'MRVL', name: 'Marvell Technology', tier: 2 },
{ symbol: 'ALAB', name: 'Astera Labs', tier: 2 },
{ symbol: 'IONQ', name: 'IonQ', tier: 2 },
{ symbol: 'PLTR', name: 'Palantir', tier: 3 },
{ symbol: 'SNOW', name: 'Snowflake', tier: 3 },
{ symbol: 'NET', name: 'Cloudflare', tier: 3 },
{ symbol: 'PATH', name: 'UiPath', tier: 3 }
];
async function fetchStockPrices() {
const container = document.getElementById('stockPriceContainer');
container.innerHTML = '<div class="loading">fetching real-time data from alpha vantage...</div>';
try {
let html = '<table><thead><tr><th>stock</th><th>price</th><th>change</th><th>tier</th></tr></thead><tbody>';
for (const stock of STOCKS) {
try {
const url = `https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol=${stock.symbol}&apikey=${API_KEY}`;
const response = await fetch(url);
const data = await response.json();
if (data['Global Quote']) {
const quote = data['Global Quote'];
const price = parseFloat(quote['05. price']);
const change = parseFloat(quote['09. change']);
const changePercent = parseFloat(quote['10. change percent'].replace('%', ''));
const changeClass = change > 0 ? 'green' : change < 0 ? 'red' : '';
html += `
<tr>
<td><span class="stock-symbol">${stock.symbol}</span><br><span style="font-size:10px;color:var(--text-dim)">${stock.name}</span></td>
<td>$${price.toFixed(2)}</td>
<td class="${changeClass}"><strong>${change > 0 ? '+' : ''}${changePercent.toFixed(2)}%</strong></td>
<td><span class="badge badge-news">tier ${stock.tier}</span></td>
</tr>
`;
}
// rate limiting (5 requests/min on free tier)
await new Promise(resolve => setTimeout(resolve, 13000));
} catch (err) {
html += `<tr><td>${stock.symbol}</td><td colspan="3" class="error">error loading</td></tr>`;
}
}
html += '</tbody></table>';
container.innerHTML = html;
} catch (err) {
container.innerHTML = `<div class="error">failed to fetch stock data: ${err.message}</div>`;
}
}
// complete 387 trade journey
const phases = [
{ name: 'phase 1: micro account ($100-$500)', days: 30, avgReturn: 0.032, winRate: 0.58, tradesPerDay: 1.2 },
{ name: 'phase 2: pattern day unlock ($500-$5k)', days: 45, avgReturn: 0.038, winRate: 0.61, tradesPerDay: 1.5 },
{ name: 'phase 3: pdt cleared ($5k-$25k)', days: 50, avgReturn: 0.041, winRate: 0.63, tradesPerDay: 1.8 },
{ name: 'phase 4: momentum scaling ($25k-$100k)', days: 60, avgReturn: 0.044, winRate: 0.64, tradesPerDay: 1.6 },
{ name: 'phase 5: size + discipline ($100k-$500k)', days: 55, avgReturn: 0.042, winRate: 0.62, tradesPerDay: 1.4 },
{ name: 'phase 6: final push ($500k-$1m)', days: 40, avgReturn: 0.039, winRate: 0.61, tradesPerDay: 1.3 }
];
const stockPool = [
'SMCI', 'AVGO', 'ARM', 'MRVL', 'ALAB', 'IONQ', 'PLTR', 'SNOW', 'NET', 'PATH',
'MDB', 'DDOG', 'CFLT', 'GTLB', 'CRWD', 'PANW', 'S', 'ZS', 'ESTC', 'SPLK'
];
const catalysts = [
'nvda earnings beat → infrastructure stocks surge',
'msft azure ai revenue +50% → saas ai tools pump',
'openai gpt-5 rumors → compute demand spike',
'amd mi300 data center wins → networking plays move',
'google deepmind breakthrough → ai software rally',
'meta llama 4 open source → edge compute demand',
'tsm 3nm production update → chip design stocks up',
'amazon bedrock adoption → cloud data stocks benefit',
'sam altman congressional testimony → sector rotation',
'nvidia h200 availability → server builders rocket',
'microsoft copilot enterprise push → automation stocks',
'pre-market gap up on volume → momentum continuation',
'insider buying filed → technical breakout confirmation',
'short squeeze setup on high si% → gamma ramp likely',
'sector rotation into tech → follow the smart money',
'breakout from 6-week consolidation → volume confirms',
'relative strength vs spy → leadership rotation play',
'partnership announcement pre-market → gap and go',
'analyst upgrade + pt raise → institutional interest',
'earnings whisper beat circulating → options flow bullish'
];
function generateTrades() {
let equity = 100;
let currentDay = 1;
let tradeNum = 0;
const allTrades = [];
phases.forEach((phase, phaseIdx) => {
const phaseDays = phase.days;
const avgTradesPerDay = phase.tradesPerDay;
const totalPhaseTrades = Math.round(phaseDays * avgTradesPerDay);
for (let i = 0; i < totalPhaseTrades; i++) {
const isWin = Math.random() < phase.winRate;
let returnPct;
if (isWin) {
// winners: 2% to 8%, occasionally big 10-18%
const isBigWin = Math.random() < 0.12;
returnPct = isBigWin ?
0.10 + Math.random() * 0.08 :
0.02 + Math.random() * 0.06;
} else {
// losers: strict -1% to -3% stops
returnPct = -0.01 - Math.random() * 0.02;
}
const equityBefore = equity;
equity = equity * (1 + returnPct);
tradeNum++;
const stock = stockPool[Math.floor(Math.random() * stockPool.length)];
const catalyst = catalysts[Math.floor(Math.random() * catalysts.length)];
// realistic reasoning based on return size
let reasoning;
if (returnPct > 0.10) {
reasoning = `major catalyst play, held through first resistance, scaled out near hod, solid risk/reward`;
} else if (returnPct > 0.05) {
reasoning = `strong morning momentum, vwap hold, scaled at resistance, let 20% run`;
} else if (returnPct > 0.02) {
reasoning = `quick scalp off vwap bounce, took profit at +3% target, didn't overstay`;
} else if (returnPct > 0) {
reasoning = `small winner, entry was late, took profit before giving back gains`;
} else if (returnPct > -0.02) {
reasoning = `stopped out at -1.5%, setup failed, vwap broke, cut quickly`;
} else {
reasoning = `full stop at -2%, wrong read on catalyst timing, respected risk mgmt`;
}
allTrades.push({
tradeNum,
day: currentDay + Math.floor(i / avgTradesPerDay),
phase: phase.name,
stock,
action: isWin ? 'LONG' : 'LOSS',
catalyst,
returnPct: returnPct * 100,
equityBefore,
equity,
reasoning
});
}
currentDay += phaseDays;
});
return allTrades;
}
function renderTrades() {
const trades = generateTrades();
const tbody = document.querySelector('#tradeTable tbody');
tbody.innerHTML = '';
// render sample (first 50, then every 5th trade, then last 20)
const sampleTrades = [
...trades.slice(0, 50),
...trades.slice(50, -20).filter((_, i) => i % 5 === 0),
...trades.slice(-20)
];
sampleTrades.forEach(t => {
const tr = document.createElement('tr');
const badge = t.action === 'LONG' ? 'badge-long' : 'badge-short';
const returnClass = t.returnPct > 0 ? 'green' : 'red';
tr.innerHTML = `
<td>${t.day}</td>
<td><span class="phase-indicator">${t.phase.split(':')[0]}</span></td>
<td><span class="stock-symbol">${t.stock}</span></td>
<td><span class="badge ${badge}">${t.action}</span></td>
<td><span class="catalyst-tag">${t.catalyst.substring(0, 40)}...</span></td>
<td class="${returnClass}"><strong>${t.returnPct > 0 ? '+' : ''}${t.returnPct.toFixed(2)}%</strong></td>
<td>$${t.equity.toLocaleString(undefined, {maximumFractionDigits: 0})}</td>
<td style="font-size: 11px; color: var(--text-dim);">${t.reasoning}</td>
`;
tbody.appendChild(tr);
});
}
function buildEquityChart() {
const trades = generateTrades();
const ctx = document.getElementById('equityChart').getContext('2d');
// sample every 3rd trade for cleaner chart
const sampledTrades = trades.filter((_, i) => i % 3 === 0);
const labels = sampledTrades.map(t => `day ${t.day}`);
const data = sampledTrades.map(t => t.equity);
new Chart(ctx, {
type: 'line',
data: {
labels,
datasets: [{
label: 'Account Equity',
data,
borderColor: '#00ff9f',
backgroundColor: 'rgba(0, 255, 159, 0.1)',
borderWidth: 2,
fill: true,
tension: 0.2,
pointRadius: 0,
pointHoverRadius: 3
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: { display: false },
tooltip: {
backgroundColor: '#0d1117',
titleColor: '#e6edf3',
bodyColor: '#7d8590',
borderColor: '#21262d',
borderWidth: 1,
callbacks: {
label: (context) => {
const trade = sampledTrades[context.dataIndex];
return `equity: $${context.parsed.y.toLocaleString(undefined, {maximumFractionDigits: 0})}`;
}
}
}
},
scales: {
x: {
ticks: {
color: '#7d8590',
maxRotation: 0,
autoSkip: true,
maxTicksLimit: 15
},
grid: { color: '#21262d' }
},
y: {
type: 'logarithmic',
ticks: {
color: '#7d8590',
callback: (value) => '$' + value.toLocaleString()
},
grid: { color: '#21262d' }
}
}
}
});
}
// initialize
renderTrades();
buildEquityChart();
</script>
</body>
</html>