Why dont you start an ET journal and post your trades here. You claim to be 'unlike anyone else on this forum', but have your ever have posted your live trades on this forum? Perhaps you have had an ET journal in the past and I missed it, can you link to it? A private offsite journal can be easily edited 'after the fact' by the external site owner. Your site is styled to look like a typical vendor snake oil vendor website, not saying it is or you are selling anything, just that it looks like a typical snake oil vendor website. I also did notice that you seem to have removed the disclaimer text that was there on the website a few weeks ago.
He is posting trades here: https://www.oddball.systems/system00001.html I am not defending anything or anyone, just saying... How is this thread related to AI?
Yes and there only seems to be one trade per day, so why not post it on ET? Cant be that onerous. Why is he linking off to his own website?
Even if it is a non commercial website, in the past members who have linked to their own non commercial sites have had their posts moderated and have been told to stop doing it.
profit factor is the ultimate measurement of a trading system what i am showing is i want a base line of 1.75 as a steady threshold - this means $1.75 profit for every $1.00 lost then i display the actual profit factor of each trade also a average of my profit factors is what i actually go by to determine the health of the system you can see the system is approaching its 1.75 benchmark slightly off performance but my average the green line is good today the system had a big win so that should get me back on track where it should be. here is the chart updated with todays trade, the model is returning to the average which is really good to see. below is the multicharts power language that produces the real time trade by trade profit factor and average profit factor. Code: Inputs: ExportPath("C:\post\portdata\oddball.csv"), FirstTradePFCap(2.0), // Cap for first trade PF when no losses MinPFTarget(1.5); // Minimum profit factor target line Vars: tradePL(0), grossProfit(0), grossLoss(0), profitFactor(0), myLine(""), prevClosedEquity(0), dateStr(""), timeStr2(""), hourPart(0), minPart(0), secPart(0), yearPart(0), monthPart(0), dayPart(0), fullYear(0), tradeCount(0), rollingPF(0), sumPF(0), // Sum of all PF values tradingDays(0), lastDate(0); // Reset on first bar If CurrentBar = 1 Then Begin grossProfit = 0; grossLoss = 0; prevClosedEquity = 0; tradeCount = 0; rollingPF = 0; sumPF = 0; tradingDays = 0; lastDate = 0; // Delete old file and create new with header FileDelete(ExportPath); FileAppend(ExportPath, "Date,Time,ProfitFactor,RollingPF,TradingDays,TradeCount,MinTarget" + NewLine); FileClose(ExportPath); End; // Change in closed equity = closed trade P&L tradePL = i_ClosedEquity - prevClosedEquity; // Only act when a trade closes If tradePL <> 0 Then Begin // Update profit/loss sums If tradePL > 0 Then grossProfit = grossProfit + tradePL Else grossLoss = grossLoss + AbsValue(tradePL); // Increment trade counter tradeCount = tradeCount + 1; // Count trading days If Date <> lastDate Then Begin tradingDays = tradingDays + 1; lastDate = Date; End; // Compute current Profit Factor with proper handling If grossLoss > 0 Then profitFactor = grossProfit / grossLoss Else If grossProfit > 0 Then profitFactor = FirstTradePFCap // Use cap when no losses Else If grossProfit = 0 and grossLoss > 0 Then profitFactor = 0 // Only losses Else profitFactor = 1; // Break-even // Calculate rolling average of ALL profit factors sumPF = sumPF + profitFactor; rollingPF = sumPF / tradeCount; // Simple average of all PF values // Parse date correctly yearPart = IntPortion(Date / 10000); monthPart = IntPortion(Mod(Date, 10000) / 100); dayPart = Mod(Date, 100); // Convert PowerLanguage year to full year If yearPart >= 100 Then fullYear = 2000 + (yearPart - 100) Else If yearPart < 50 Then fullYear = 2000 + yearPart Else fullYear = 1900 + yearPart; // Format Date YYYY-MM-DD dateStr = NumToStr(fullYear, 0) + "-" + RightStr("0" + NumToStr(monthPart, 0), 2) + "-" + RightStr("0" + NumToStr(dayPart, 0), 2); // Format Time HH:MM:SS hourPart = IntPortion(Time_s / 10000); minPart = IntPortion(Mod(Time_s, 10000) / 100); secPart = Mod(Time_s, 100); timeStr2 = RightStr("0" + NumToStr(hourPart, 0), 2) + ":" + RightStr("0" + NumToStr(minPart, 0), 2) + ":" + RightStr("0" + NumToStr(secPart, 0), 2); // Build and write CSV row with MinTarget myLine = dateStr + "," + timeStr2 + "," + NumToStr(profitFactor, 2) + "," + NumToStr(rollingPF, 2) + "," + NumToStr(tradingDays, 0) + "," + NumToStr(tradeCount, 0) + "," + NumToStr(MinPFTarget, 2); FileAppend(ExportPath, myLine + NewLine); FileClose(ExportPath); // Update tracker prevClosedEquity = i_ClosedEquity; // Debug output Print("Trade ", tradeCount, " PF: ", profitFactor:0:2, " Rolling: ", rollingPF:0:2, " Days: ", tradingDays); End; below is the actual .html page that loads the file and makes the display Code: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Profit Factor Analysis Dashboard</title> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background: linear-gradient(135deg, #0f172a 0%, #1e293b 50%, #334155 100%); color: #fff; min-height: 100vh; padding: 20px; } .container { max-width: 1600px; margin: 0 auto; } .header { text-align: center; margin-bottom: 30px; padding: 30px; background: rgba(255, 255, 255, 0.1); border-radius: 20px; backdrop-filter: blur(15px); border: 1px solid rgba(255, 255, 255, 0.2); } h1 { font-size: 2.5em; margin-bottom: 10px; background: linear-gradient(135deg, #3b82f6, #8b5cf6, #10b981); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .file-upload { margin: 20px 0; text-align: center; } .file-label { display: inline-block; padding: 12px 30px; background: linear-gradient(135deg, #3b82f6, #8b5cf6); border-radius: 10px; cursor: pointer; transition: all 0.3s; font-weight: 600; font-size: 1.1em; } .file-label:hover { transform: translateY(-2px); box-shadow: 0 5px 20px rgba(59, 130, 246, 0.4); } input[type="file"] { display: none; } .stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px; margin-bottom: 30px; } .stat-card { background: rgba(255, 255, 255, 0.1); padding: 25px; border-radius: 15px; text-align: center; backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.2); transition: transform 0.3s; } .stat-card:hover { transform: translateY(-5px); } .stat-value { font-size: 2.5em; font-weight: bold; margin-bottom: 5px; } .stat-label { font-size: 0.9em; opacity: 0.8; text-transform: uppercase; letter-spacing: 1px; } .positive { color: #10b981; } .negative { color: #ef4444; } .neutral { color: #f59e0b; } .excellent { color: #00ff88; } .chart-container { background: rgba(255, 255, 255, 0.1); padding: 25px; border-radius: 20px; backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.2); margin-bottom: 30px; height: 500px; } .chart-title { text-align: center; margin-bottom: 20px; font-size: 1.5em; font-weight: bold; color: #3b82f6; } .info-text { text-align: center; color: #94a3b8; font-size: 0.9em; margin-top: 10px; } </style> </head> <body> <div class="container"> <div class="header"> <h1> Profit Factor Analysis Dashboard</h1> <p id="subtitle">Load your pf_export.csv file to analyze</p> </div> <div class="file-upload"> <label for="csvFile" class="file-label"> Load pf_export.csv </label> <input type="file" id="csvFile" accept=".csv"> </div> <div class="stats-grid"> <div class="stat-card"> <div class="stat-value neutral" id="totalTrades">--</div> <div class="stat-label">Total Trades</div> </div> <div class="stat-card"> <div class="stat-value" id="currentPF">--</div> <div class="stat-label">Current PF</div> </div> <div class="stat-card"> <div class="stat-value" id="avgPF">--</div> <div class="stat-label">Rolling Average PF</div> </div> <div class="stat-card"> <div class="stat-value" id="tradingDays">--</div> <div class="stat-label">Trading Days</div> </div> </div> <div class="chart-container"> <div class="chart-title"> Profit Factor with Rolling Average</div> <canvas id="pfChart"></canvas> <p class="info-text">Blue: Cumulative PF | Green: Rolling Average | Orange: Min Target | Red: Breakeven</p> </div> </div> <script> let pfChart = null; document.getElementById('csvFile').addEventListener('change', function(e) { const file = e.target.files[0]; if (file) { const reader = new FileReader(); reader.onload = function(e) { processCSV(e.target.result); }; reader.readAsText(file); } }); function processCSV(csvText) { const lines = csvText.trim().split('\n'); const data = []; let minTarget = 1.5; // Default value // Parse CSV - handle both old and new formats for (let i = 1; i < lines.length; i++) { const cols = lines[i].split(','); if (cols.length >= 5) { let pf = parseFloat(cols[2]); let rollingPf = parseFloat(cols[3]); let tradingDays, tradeCount; // Handle different CSV formats if (cols.length === 7) { // New format with MinTarget tradingDays = parseInt(cols[4]) || 0; tradeCount = parseInt(cols[5]) || 0; minTarget = parseFloat(cols[6]) || 1.5; } else if (cols.length === 6) { // Old format without MinTarget tradingDays = parseInt(cols[4]) || 0; tradeCount = parseInt(cols[5]) || 0; } else { // Format without TradingDays tradingDays = 0; tradeCount = parseInt(cols[4]) || 0; } // Cap first trade PF if it's unreasonably high if (tradeCount === 1 && pf > 100) { pf = 2.0; rollingPf = 2.0; } // Only add valid data if (!isNaN(pf) && !isNaN(rollingPf)) { data.push({ date: cols[0].trim(), time: cols[1].trim(), profitFactor: pf, rollingPF: rollingPf, tradingDays: tradingDays, tradeCount: tradeCount, minTarget: minTarget }); } } } if (data.length === 0) return; // Update stats const lastData = data[data.length - 1]; const tradingDays = lastData.tradingDays || new Set(data.map(d => d.date)).size; document.getElementById('totalTrades').textContent = lastData.tradeCount; document.getElementById('currentPF').textContent = lastData.profitFactor.toFixed(2); document.getElementById('currentPF').className = 'stat-value ' + getPFClass(lastData.profitFactor); document.getElementById('avgPF').textContent = lastData.rollingPF.toFixed(2); document.getElementById('avgPF').className = 'stat-value ' + getPFClass(lastData.rollingPF); document.getElementById('tradingDays').textContent = tradingDays; document.getElementById('subtitle').textContent = `${data.length} trades loaded | ${tradingDays} trading days | Min Target: ${minTarget.toFixed(2)}`; // Update chart updateChart(data, minTarget); } function getPFClass(value) { if (value >= 2.0) return 'excellent'; if (value >= 1.5) return 'positive'; if (value >= 1.0) return 'neutral'; return 'negative'; } function updateChart(data, minTarget) { const ctx = document.getElementById('pfChart').getContext('2d'); if (pfChart) pfChart.destroy(); // Create labels - show every Nth label based on data size const labelInterval = Math.max(1, Math.floor(data.length / 20)); const labels = data.map((d, i) => { if (i % labelInterval === 0 || i === data.length - 1) { return `T${i + 1}`; } return ''; }); // Extract data arrays const pfValues = data.map(d => d.profitFactor); const rollingValues = data.map(d => d.rollingPF); const minTargetLine = new Array(data.length).fill(minTarget); pfChart = new Chart(ctx, { type: 'line', data: { labels: labels, datasets: [ { label: 'Cumulative Profit Factor', data: pfValues, borderColor: '#3b82f6', backgroundColor: 'rgba(59, 130, 246, 0.1)', borderWidth: 2, fill: false, tension: 0.1, pointRadius: data.length > 100 ? 0 : 2, pointHoverRadius: 4 }, { label: 'Rolling Average PF', data: rollingValues, borderColor: '#10b981', backgroundColor: 'rgba(16, 185, 129, 0.1)', borderWidth: 3, fill: false, tension: 0.4, pointRadius: 0, pointHoverRadius: 4 }, { label: 'Min Target (' + minTarget.toFixed(2) + ')', data: minTargetLine, borderColor: '#f59e0b', borderWidth: 2, borderDash: [10, 5], fill: false, pointRadius: 0, pointHoverRadius: 0 }, { label: 'Breakeven Line', data: new Array(data.length).fill(1.0), borderColor: '#ef4444', borderWidth: 1, borderDash: [5, 5], fill: false, pointRadius: 0, pointHoverRadius: 0 } ] }, options: { responsive: true, maintainAspectRatio: false, interaction: { mode: 'index', intersect: false }, plugins: { legend: { labels: { color: '#fff' } }, tooltip: { callbacks: { title: function(context) { const idx = context[0].dataIndex; return `Trade ${idx + 1}`; }, afterLabel: function(context) { if (context.datasetIndex === 0) { const trade = data[context.dataIndex]; return [ `Date: ${trade.date}`, `Time: ${trade.time}` ]; } return []; } } } }, scales: { x: { ticks: { color: '#94a3b8', autoSkip: true, maxTicksLimit: 20 }, grid: { color: 'rgba(255, 255, 255, 0.05)' } }, y: { ticks: { color: '#94a3b8', callback: function(value) { return value.toFixed(2); } }, grid: { color: 'rgba(255, 255, 255, 0.05)' }, min: 0 } } } }); } </script> </body> </html> @Businessman just shut the fuck up - you may learn something
show evidence that backs up what you stated - no one has given more freely fantastic trading information than i have on this forum. ask yourself loser what have you ever contributed? nada