Changes to forexfolio.scroll.pub

ffff:103.107.76.82
ffff:103.107.76.82
22 days ago
updated style.css
style.css
Changed around line 2
- -primary-color: #2c3e50;
- -secondary-color: #3498db;
- -accent-color: #e74c3c;
- --background-color: #ecf0f1;
+ --background-color: #000000;
- -text-color: #2c3e50;
- -card-bg: #fff;
- -shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
Changed around line 15
- font-family: 'Segoe UI', sans-serif;
+ font-family: "Segoe UI", sans-serif;
Changed around line 59: label {
- input, textarea, select {
+ input,
+ textarea,
+ select {
Changed around line 128: footer {
-
+
- }
+ }
root
root
22 days ago
Initial commit
body.html
Changed around line 1
+
+

Forex Trading Journal

+

Track, Analyze, and Improve Your Trading Performance

+
+
+
+
+

New Trade

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

Trade History

+
+
+
+
+
+
+
+
+
+
+

Performance Analytics

+
+
+

Total Trades

+

0

+
+
+

Win Rate

+

0%

+
+
+

Average Profit

+

0

+
+
+

Total P&L

+

0

+
+
+
+
+
+
+
+
+
+

Forex Trading Journal - Your Path to Better Trading Decisions

+
index.scroll
Changed around line 1
+ buildHtml
+ baseUrl https://forexfolio.scroll.pub
+ metaTags
+ editButton /edit.html
+ title Forex Trading Journal - Track & Analyze Your Trades
+ style.css
+ body.html
+ script.js
prompt.json
Changed around line 1
+ {
+ "id": "acfb7c49-cc93-45fd-be58-281358d8bc0b",
+ "object": "chat.completion",
+ "created": 1735599215,
+ "model": "deepseek-chat",
+ "choices": [
+ {
+ "index": 0,
+ "message": {
+ "role": "assistant",
+ "content": "---domain---\nforexfolio.scroll.pub\n---index.scroll---\nbuildHtml\nbaseUrl https://forexfolio.scroll.pub\nmetaTags\neditButton /edit.html\ntitle Forex Trading Journal - Track & Analyze Your Trades\nstyle.css\nbody.html\nscript.js\n---body.html---\n
\n

Forex Trading Journal

\n

Track, Analyze, and Improve Your Trading Performance

\n
\n\n
\n
\n

New Trade

\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n \n
\n
\n\n
\n

Trade History

\n
\n \n \n
\n
\n \n
\n
\n\n
\n

Performance Analytics

\n
\n
\n

Total Trades

\n

0

\n
\n
\n

Win Rate

\n

0%

\n
\n
\n

Average Profit

\n

0

\n
\n
\n

Total P&L

\n

0

\n
\n
\n
\n \n
\n
\n
\n\n
\n

Forex Trading Journal - Your Path to Better Trading Decisions

\n
\n---style.css---\n:root {\n --primary-color: #2c3e50;\n --secondary-color: #3498db;\n --accent-color: #e74c3c;\n --background-color: #ecf0f1;\n --text-color: #2c3e50;\n --card-bg: #fff;\n --shadow: 0 2px 10px rgba(0, 0, 0, 0.1);\n}\n\n* {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n\nbody {\n font-family: 'Segoe UI', sans-serif;\n line-height: 1.6;\n color: var(--text-color);\n background-color: var(--background-color);\n padding: 20px;\n}\n\nheader {\n text-align: center;\n margin-bottom: 40px;\n padding: 40px 0;\n background: var(--primary-color);\n color: white;\n border-radius: 10px;\n}\n\nh1 {\n font-size: 2.5rem;\n margin-bottom: 10px;\n}\n\nh2 {\n color: var(--primary-color);\n margin-bottom: 20px;\n}\n\nsection {\n background: var(--card-bg);\n padding: 20px;\n border-radius: 10px;\n box-shadow: var(--shadow);\n margin-bottom: 30px;\n}\n\n.form-group {\n margin-bottom: 15px;\n}\n\nlabel {\n display: block;\n margin-bottom: 5px;\n font-weight: 600;\n}\n\ninput, textarea, select {\n width: 100%;\n padding: 10px;\n border: 1px solid #ddd;\n border-radius: 5px;\n font-size: 1rem;\n}\n\nbutton {\n background: var(--secondary-color);\n color: white;\n border: none;\n padding: 10px 20px;\n border-radius: 5px;\n cursor: pointer;\n transition: background 0.3s ease;\n}\n\nbutton:hover {\n background: #2980b9;\n}\n\n.trade-list {\n display: grid;\n gap: 15px;\n}\n\n.trade-entry {\n background: var(--card-bg);\n padding: 15px;\n border-radius: 5px;\n box-shadow: var(--shadow);\n}\n\n.stats-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n}\n\n.stat-card {\n text-align: center;\n padding: 20px;\n background: var(--card-bg);\n border-radius: 10px;\n box-shadow: var(--shadow);\n}\n\n.chart-container {\n max-width: 800px;\n margin: 0 auto;\n}\n\nfooter {\n text-align: center;\n margin-top: 40px;\n padding: 20px;\n background: var(--primary-color);\n color: white;\n border-radius: 10px;\n}\n\n@media (max-width: 768px) {\n h1 {\n font-size: 2rem;\n }\n \n .stats-grid {\n grid-template-columns: 1fr;\n }\n}\n---script.js---\n// Initialize trade data\nlet trades = [];\nlet currencyPairs = new Set();\n\n// DOM Elements\nconst tradeForm = document.getElementById('tradeForm');\nconst tradeList = document.querySelector('.trade-list');\nconst filterCurrency = document.getElementById('filterCurrency');\nconst totalTrades = document.getElementById('totalTrades');\nconst winRate = document.getElementById('winRate');\nconst avgProfit = document.getElementById('avgProfit');\nconst totalPL = document.getElementById('totalPL');\nconst performanceChart = document.getElementById('performanceChart');\n\n// Chart initialization\nconst ctx = performanceChart.getContext('2d');\nconst chart = new Chart(ctx, {\n type: 'line',\n data: {\n labels: [],\n datasets: [{\n label: 'Cumulative P&L',\n data: [],\n borderColor: '#3498db',\n fill: false\n }]\n },\n options: {\n responsive: true,\n maintainAspectRatio: false,\n scales: {\n y: {\n beginAtZero: true\n }\n }\n }\n});\n\n// Add trade event\ntradeForm.addEventListener('submit', function(e) {\n e.preventDefault();\n \n const trade = {\n currencyPair: document.getElementById('currencyPair').value,\n entryPrice: parseFloat(document.getElementById('entryPrice').value),\n exitPrice: parseFloat(document.getElementById('exitPrice').value),\n positionSize: parseFloat(document.getElementById('positionSize').value),\n notes: document.getElementById('notes').value,\n date: new Date().toLocaleString()\n };\n \n trades.push(trade);\n currencyPairs.add(trade.currencyPair);\n updateCurrencyFilter();\n renderTrades();\n updateAnalytics();\n tradeForm.reset();\n});\n\n// Render trades\nfunction renderTrades(filter = '') {\n tradeList.innerHTML = '';\n const filteredTrades = filter ? trades.filter(t => t.currencyPair === filter) : trades;\n \n filteredTrades.forEach(trade => {\n const tradeDiv = document.createElement('div');\n tradeDiv.className = 'trade-entry';\n const pnl = (trade.exitPrice - trade.entryPrice) * trade.positionSize;\n \n tradeDiv.innerHTML = `\n

${trade.currencyPair}

\n

Entry: ${trade.entryPrice} | Exit: ${trade.exitPrice}

\n

Position Size: ${trade.positionSize}

\n

P&L: = 0 ? 'positive' : 'negative'}\">${pnl.toFixed(2)}

\n

${trade.notes}

\n ${trade.date}\n `;\n \n tradeList.appendChild(tradeDiv);\n });\n}\n\n// Update currency filter options\nfunction updateCurrencyFilter() {\n filterCurrency.innerHTML = '';\n currencyPairs.forEach(pair => {\n const option = document.createElement('option');\n option.value = pair;\n option.textContent = pair;\n filterCurrency.appendChild(option);\n });\n}\n\n// Update analytics\nfunction updateAnalytics() {\n totalTrades.textContent = trades.length;\n \n const winningTrades = trades.filter(t => (t.exitPrice - t.entryPrice) * t.positionSize > 0).length;\n winRate.textContent = trades.length ? `${((winningTrades / trades.length) * 100).toFixed(1)}%` : '0%';\n \n const totalProfit = trades.reduce((sum, t) => sum + (t.exitPrice - t.entryPrice) * t.positionSize, 0);\n totalPL.textContent = totalProfit.toFixed(2);\n avgProfit.textContent = trades.length ? (totalProfit / trades.length).toFixed(2) : '0';\n \n // Update chart\n const cumulativePL = [];\n let runningTotal = 0;\n trades.forEach(t => {\n runningTotal += (t.exitPrice - t.entryPrice) * t.positionSize;\n cumulativePL.push(runningTotal);\n });\n \n chart.data.labels = trades.map((_, i) => `Trade ${i + 1}`);\n chart.data.datasets[0].data = cumulativePL;\n chart.update();\n}\n\n// Filter trades by currency\nfilterCurrency.addEventListener('change', function() {\n renderTrades(this.value);\n});\n\n// Initial setup\nupdateCurrencyFilter();\nrenderTrades();\n---end---"
+ },
+ "logprobs": null,
+ "finish_reason": "stop"
+ }
+ ],
+ "usage": {
+ "prompt_tokens": 243,
+ "completion_tokens": 2322,
+ "total_tokens": 2565,
+ "prompt_cache_hit_tokens": 0,
+ "prompt_cache_miss_tokens": 243
+ },
+ "system_fingerprint": "fp_f1afce2943"
+ }
readme.scroll
Changed around line 1
+ # forexfolio.scroll.pub
+ Website generated by DeepSeek from prompt: build a nice forex trading journal with nice visuals
script.js
Changed around line 1
+ // Initialize trade data
+ let trades = [];
+ let currencyPairs = new Set();
+
+ // DOM Elements
+ const tradeForm = document.getElementById('tradeForm');
+ const tradeList = document.querySelector('.trade-list');
+ const filterCurrency = document.getElementById('filterCurrency');
+ const totalTrades = document.getElementById('totalTrades');
+ const winRate = document.getElementById('winRate');
+ const avgProfit = document.getElementById('avgProfit');
+ const totalPL = document.getElementById('totalPL');
+ const performanceChart = document.getElementById('performanceChart');
+
+ // Chart initialization
+ const ctx = performanceChart.getContext('2d');
+ const chart = new Chart(ctx, {
+ type: 'line',
+ data: {
+ labels: [],
+ datasets: [{
+ label: 'Cumulative P&L',
+ data: [],
+ borderColor: '#3498db',
+ fill: false
+ }]
+ },
+ options: {
+ responsive: true,
+ maintainAspectRatio: false,
+ scales: {
+ y: {
+ beginAtZero: true
+ }
+ }
+ }
+ });
+
+ // Add trade event
+ tradeForm.addEventListener('submit', function(e) {
+ e.preventDefault();
+
+ const trade = {
+ currencyPair: document.getElementById('currencyPair').value,
+ entryPrice: parseFloat(document.getElementById('entryPrice').value),
+ exitPrice: parseFloat(document.getElementById('exitPrice').value),
+ positionSize: parseFloat(document.getElementById('positionSize').value),
+ notes: document.getElementById('notes').value,
+ date: new Date().toLocaleString()
+ };
+
+ trades.push(trade);
+ currencyPairs.add(trade.currencyPair);
+ updateCurrencyFilter();
+ renderTrades();
+ updateAnalytics();
+ tradeForm.reset();
+ });
+
+ // Render trades
+ function renderTrades(filter = '') {
+ tradeList.innerHTML = '';
+ const filteredTrades = filter ? trades.filter(t => t.currencyPair === filter) : trades;
+
+ filteredTrades.forEach(trade => {
+ const tradeDiv = document.createElement('div');
+ tradeDiv.className = 'trade-entry';
+ const pnl = (trade.exitPrice - trade.entryPrice) * trade.positionSize;
+
+ tradeDiv.innerHTML = `
+

${trade.currencyPair}

+

Entry: ${trade.entryPrice} | Exit: ${trade.exitPrice}

+

Position Size: ${trade.positionSize}

+

P&L: ${pnl.toFixed(2)}

+

${trade.notes}

+ ${trade.date}
+ `;
+
+ tradeList.appendChild(tradeDiv);
+ });
+ }
+
+ // Update currency filter options
+ function updateCurrencyFilter() {
+ filterCurrency.innerHTML = '';
+ currencyPairs.forEach(pair => {
+ const option = document.createElement('option');
+ option.value = pair;
+ option.textContent = pair;
+ filterCurrency.appendChild(option);
+ });
+ }
+
+ // Update analytics
+ function updateAnalytics() {
+ totalTrades.textContent = trades.length;
+
+ const winningTrades = trades.filter(t => (t.exitPrice - t.entryPrice) * t.positionSize > 0).length;
+ winRate.textContent = trades.length ? `${((winningTrades / trades.length) * 100).toFixed(1)}%` : '0%';
+
+ const totalProfit = trades.reduce((sum, t) => sum + (t.exitPrice - t.entryPrice) * t.positionSize, 0);
+ totalPL.textContent = totalProfit.toFixed(2);
+ avgProfit.textContent = trades.length ? (totalProfit / trades.length).toFixed(2) : '0';
+
+ // Update chart
+ const cumulativePL = [];
+ let runningTotal = 0;
+ trades.forEach(t => {
+ runningTotal += (t.exitPrice - t.entryPrice) * t.positionSize;
+ cumulativePL.push(runningTotal);
+ });
+
+ chart.data.labels = trades.map((_, i) => `Trade ${i + 1}`);
+ chart.data.datasets[0].data = cumulativePL;
+ chart.update();
+ }
+
+ // Filter trades by currency
+ filterCurrency.addEventListener('change', function() {
+ renderTrades(this.value);
+ });
+
+ // Initial setup
+ updateCurrencyFilter();
+ renderTrades();
style.css
Changed around line 1
+ :root {
+ --primary-color: #2c3e50;
+ --secondary-color: #3498db;
+ --accent-color: #e74c3c;
+ --background-color: #ecf0f1;
+ --text-color: #2c3e50;
+ --card-bg: #fff;
+ --shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
+ }
+
+ * {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+ }
+
+ body {
+ font-family: 'Segoe UI', sans-serif;
+ line-height: 1.6;
+ color: var(--text-color);
+ background-color: var(--background-color);
+ padding: 20px;
+ }
+
+ header {
+ text-align: center;
+ margin-bottom: 40px;
+ padding: 40px 0;
+ background: var(--primary-color);
+ color: white;
+ border-radius: 10px;
+ }
+
+ h1 {
+ font-size: 2.5rem;
+ margin-bottom: 10px;
+ }
+
+ h2 {
+ color: var(--primary-color);
+ margin-bottom: 20px;
+ }
+
+ section {
+ background: var(--card-bg);
+ padding: 20px;
+ border-radius: 10px;
+ box-shadow: var(--shadow);
+ margin-bottom: 30px;
+ }
+
+ .form-group {
+ margin-bottom: 15px;
+ }
+
+ label {
+ display: block;
+ margin-bottom: 5px;
+ font-weight: 600;
+ }
+
+ input, textarea, select {
+ width: 100%;
+ padding: 10px;
+ border: 1px solid #ddd;
+ border-radius: 5px;
+ font-size: 1rem;
+ }
+
+ button {
+ background: var(--secondary-color);
+ color: white;
+ border: none;
+ padding: 10px 20px;
+ border-radius: 5px;
+ cursor: pointer;
+ transition: background 0.3s ease;
+ }
+
+ button:hover {
+ background: #2980b9;
+ }
+
+ .trade-list {
+ display: grid;
+ gap: 15px;
+ }
+
+ .trade-entry {
+ background: var(--card-bg);
+ padding: 15px;
+ border-radius: 5px;
+ box-shadow: var(--shadow);
+ }
+
+ .stats-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: 20px;
+ margin-bottom: 30px;
+ }
+
+ .stat-card {
+ text-align: center;
+ padding: 20px;
+ background: var(--card-bg);
+ border-radius: 10px;
+ box-shadow: var(--shadow);
+ }
+
+ .chart-container {
+ max-width: 800px;
+ margin: 0 auto;
+ }
+
+ footer {
+ text-align: center;
+ margin-top: 40px;
+ padding: 20px;
+ background: var(--primary-color);
+ color: white;
+ border-radius: 10px;
+ }
+
+ @media (max-width: 768px) {
+ h1 {
+ font-size: 2rem;
+ }
+
+ .stats-grid {
+ grid-template-columns: 1fr;
+ }
+ }