Weekly Journal Review: The Questions That Matter
Weekly Journal Review: The Questions That Matter
Journaling individual trades is only half the process. The other half — arguably the more valuable half — is sitting down on a consistent weekly basis and actually reviewing what the accumulated data is telling you.
Set aside a specific time each week, ideally when the market is closed and you're not under any active trading pressure, and work through these four core questions using your journal data:
What was my win rate this week? Calculate it precisely, not from memory or general impression.
What was my average reward-to-risk ratio across all trades? This tells you whether your actual execution matches the R:R your strategy was designed around.
Which specific setup type performed best, and which performed worst? This is where the setup-type field from your journal entries pays off directly, letting you see performance broken down by strategy rather than lumped together.
Did I follow my written plan on every single trade, or did I deviate — and if I deviated, what was the actual outcome of that specific deviation? This last question is often the most revealing, since it directly connects discipline (or lack of it) to real results, rather than treating "following the plan" as an abstract virtue disconnected from actual P&L.
These four questions, worked through consistently every single week, are what turn a trade journal from a passive diary into an active, ongoing source of genuine trading edge.
Set aside a specific time each week, ideally when the market is closed and you're not under any active trading pressure, and work through these four core questions using your journal data:
What was my win rate this week? Calculate it precisely, not from memory or general impression.
What was my average reward-to-risk ratio across all trades? This tells you whether your actual execution matches the R:R your strategy was designed around.
Which specific setup type performed best, and which performed worst? This is where the setup-type field from your journal entries pays off directly, letting you see performance broken down by strategy rather than lumped together.
Did I follow my written plan on every single trade, or did I deviate — and if I deviated, what was the actual outcome of that specific deviation? This last question is often the most revealing, since it directly connects discipline (or lack of it) to real results, rather than treating "following the plan" as an abstract virtue disconnected from actual P&L.
These four questions, worked through consistently every single week, are what turn a trade journal from a passive diary into an active, ongoing source of genuine trading edge.
It’s Fairman 
-
LondonScalper
- Posts: 965
- Joined: Sat Sep 05, 2026 7:54 am
Re: Weekly Journal Review: The Questions That Matter
Weekly review questions beat daily over-journaling.
Mine are basically: which rule broke most, which pair failed cost, which session I should have skipped, what one change I’ll test next week. Everything else is noise.
What’s the one weekly question that actually changed your behavior in the last month?
Mine are basically: which rule broke most, which pair failed cost, which session I should have skipped, what one change I’ll test next week. Everything else is noise.
What’s the one weekly question that actually changed your behavior in the last month?
-
PropScalpDesk
- Posts: 521
- Joined: Sat Sep 19, 2026 7:50 pm
Re: Weekly Journal Review: The Questions That Matter
Weekly review questions that change behaviour
Daily logs without a weekly synthesis become diaries. Once a week, market closed, I answer a short set that forces decisions rather than storytelling:
I keep the weekly answers in the same document week after week so patterns are obvious. If “costs in the first hour” appears three times, that is not a diary entry — that is a standing order to change filters.
Which weekly question actually changed your size or session last month — and did you write the change as a rule, or only remember it?
Daily logs without a weekly synthesis become diaries. Once a week, market closed, I answer a short set that forces decisions rather than storytelling:
- Which rule saved the most R this week?
- Which rule break cost the most R?
- Did costs rise in a specific hour or pair?
- What will I forbid next week in one written sentence?
I keep the weekly answers in the same document week after week so patterns are obvious. If “costs in the first hour” appears three times, that is not a diary entry — that is a standing order to change filters.
Which weekly question actually changed your size or session last month — and did you write the change as a rule, or only remember it?
Re: Weekly Journal Review: The Questions That Matter
Hi Fairman,Fairman wrote: Mon Aug 24, 2026 10:54 am Journaling individual trades is only half the process. The other half — arguably the more valuable half — is sitting down on a consistent weekly basis and actually reviewing what the accumulated data is telling you.
Set aside a specific time each week, ideally when the market is closed and you're not under any active trading pressure, and work through these four core questions using your journal data:
What was my win rate this week? Calculate it precisely, not from memory or general impression.
What was my average reward-to-risk ratio across all trades? This tells you whether your actual execution matches the R:R your strategy was designed around.
Which specific setup type performed best, and which performed worst? This is where the setup-type field from your journal entries pays off directly, letting you see performance broken down by strategy rather than lumped together.
Did I follow my written plan on every single trade, or did I deviate — and if I deviated, what was the actual outcome of that specific deviation? This last question is often the most revealing, since it directly connects discipline (or lack of it) to real results, rather than treating "following the plan" as an abstract virtue disconnected from actual P&L.
These four questions, worked through consistently every single week, are what turn a trade journal from a passive diary into an active, ongoing source of genuine trading edge.
To automate this weekly review process, you can use Pine Script to build an on-chart Weekly Review Dashboard.
While Pine Script cannot read a manual spreadsheet, it can automatically track a programmed strategy's performance, isolate the data for the current week, and answer your quantitative questions instantly. For your qualitative question regarding discipline, it serves as a persistent on-chart reminder.
Here is a Pine Script (version 5) framework that tracks two different setup types, calculates your weekly metrics, and projects them into a live dashboard table on your chart.
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
Re: Weekly Journal Review: The Questions That Matter
Pine script V1.0
Code: Select all
//@version=5
strategy("Weekly Journal Dashboard", overlay=true, calc_on_every_tick=false)
// ==========================================
// 1. DUMMY SETUP CONDITIONS (Replace with yours)
// ==========================================
fastMA = ta.sma(close, 10)
slowMA = ta.sma(close, 20)
rsi = ta.rsi(close, 14)
setupA = ta.crossover(fastMA, slowMA) // Setup A: Trend Breakout
setupB = rsi < 30 and close > open // Setup B: Oversold Reversal
// Execute trades with specific entry IDs to track setup types
if setupA
strategy.entry("Setup A", strategy.long)
strategy.exit("Exit A", "Setup A", profit=100, loss=50)
if setupB
strategy.entry("Setup B", strategy.long)
strategy.exit("Exit B", "Setup B", profit=150, loss=50)
// ==========================================
// 2. WEEKLY DASHBOARD CALCULATIONS
// ==========================================
var table reviewTable = table.new(position.bottom_right, 3, 6, bgcolor=color.new(color.black, 30), border_width=1, border_color=color.gray)
if barstate.islast
currWeek = weekofyear(time)
currYear = year(time)
// Variables for Question 1 & 2 (Overall Week)
int weekWins = 0
int weekLosses = 0
float grossWin = 0.0
float grossLoss = 0.0
// Variables for Question 3 (Setup specific)
int setupAWins = 0
int setupALosses = 0
int setupBWins = 0
int setupBLosses = 0
// Loop backward through closed trades to analyze the current week
if strategy.closedtrades > 0
for i = strategy.closedtrades - 1 to 0
exitTime = strategy.closedtrades.exit_time(i)
tradeWeek = weekofyear(exitTime)
tradeYear = year(exitTime)
// Break loop if we reach trades older than the current week
if tradeYear < currYear or (tradeYear == currYear and tradeWeek < currWeek)
break
if tradeYear == currYear and tradeWeek == currWeek
tradeProfit = strategy.closedtrades.profit(i)
tradeId = strategy.closedtrades.entry_id(i)
if tradeProfit > 0
weekWins += 1
grossWin += tradeProfit
if tradeId == "Setup A"
setupAWins += 1
else if tradeId == "Setup B"
setupBWins += 1
else if tradeProfit < 0
weekLosses += 1
grossLoss += math.abs(tradeProfit)
if tradeId == "Setup A"
setupALosses += 1
else if tradeId == "Setup B"
setupBLosses += 1
// Calculate Metrics
int totalWeekTrades = weekWins + weekLosses
float winRate = totalWeekTrades > 0 ? (weekWins / totalWeekTrades) * 100 : 0.0
float avgWin = weekWins > 0 ? grossWin / weekWins : 0.0
float avgLoss = weekLosses > 0 ? grossLoss / weekLosses : 0.0
float rrRatio = avgLoss > 0 ? (avgWin / avgLoss) : (avgWin > 0 ? 999 : 0.0)
int totalA = setupAWins + setupALosses
float winRateA = totalA > 0 ? (setupAWins / totalA) * 100 : 0.0
int totalB = setupBWins + setupBLosses
float winRateB = totalB > 0 ? (setupBWins / totalB) * 100 : 0.0
// ==========================================
// 3. RENDER THE TABLE
// ==========================================
// Header
table.cell(reviewTable, 0, 0, "WEEKLY REVIEW", text_color=color.white, bgcolor=color.blue, colspan=3)
// Q1: Win Rate
table.cell(reviewTable, 0, 1, "1. Win Rate", text_color=color.white, text_halign=text.align_left)
table.cell(reviewTable, 1, 1, str.tostring(totalWeekTrades) + " Trades", text_color=color.white)
table.cell(reviewTable, 2, 1, str.tostring(winRate, "#.##") + "%", text_color=winRate > 50 ? color.lime : color.red)
// Q2: R:R Ratio
table.cell(reviewTable, 0, 2, "2. Avg R:R", text_color=color.white, text_halign=text.align_left)
table.cell(reviewTable, 1, 2, "Realized", text_color=color.white)
table.cell(reviewTable, 2, 2, "1 : " + str.tostring(rrRatio, "#.##"), text_color=rrRatio > 1 ? color.lime : color.red)
// Q3: Setup Performance
table.cell(reviewTable, 0, 3, "3. Setup A (Trend)", text_color=color.white, text_halign=text.align_left)
table.cell(reviewTable, 1, 3, str.tostring(totalA) + " Trades", text_color=color.white)
table.cell(reviewTable, 2, 3, str.tostring(winRateA, "#.##") + "%", text_color=color.white)
table.cell(reviewTable, 0, 4, "3. Setup B (Rev)", text_color=color.white, text_halign=text.align_left)
table.cell(reviewTable, 1, 4, str.tostring(totalB) + " Trades", text_color=color.white)
table.cell(reviewTable, 2, 4, str.tostring(winRateB, "#.##") + "%", text_color=color.white)
// Q4: Discipline Check
table.cell(reviewTable, 0, 5, "4. Rule Deviations?", text_color=color.yellow, text_halign=text.align_left)
table.cell(reviewTable, 1, 5, "Manual check req.", text_color=color.yellow, colspan=2)Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
Re: Weekly Journal Review: The Questions That Matter
How this script answers your four questions:
1.) What was my win rate this week?
The script calculates the current week of the year and runs a reverse loop through all closed trades. It stops counting the moment it hits trades from a previous week. It prints your exact trade count and percentage in row 1.
2.) What was my average reward-to-risk ratio?
Instead of using theoretical targets, row 2 divides the actual grossWin of the week by the actual grossLoss of the week. This exposes whether your execution matches your intended strategy, or if you are cutting winners short/letting losers run.
3.) Which setup type performed best?
The script utilizes strategy.closedtrades.entry_id(i) to separate your trades. By naming your entries (e.g., "Setup A" and "Setup B"), the script groups the data and outputs an isolated win rate and trade count for each setup in rows 3 and 4.
4.) Did I follow my written plan?
Pine Script cannot evaluate human discipline, so row 5 functions as a static visual prompt. It sits in the bottom right corner of your chart on Friday afternoon, reminding you to manually reconcile the script's automated data with your actual real-world executions.
1.) What was my win rate this week?
The script calculates the current week of the year and runs a reverse loop through all closed trades. It stops counting the moment it hits trades from a previous week. It prints your exact trade count and percentage in row 1.
2.) What was my average reward-to-risk ratio?
Instead of using theoretical targets, row 2 divides the actual grossWin of the week by the actual grossLoss of the week. This exposes whether your execution matches your intended strategy, or if you are cutting winners short/letting losers run.
3.) Which setup type performed best?
The script utilizes strategy.closedtrades.entry_id(i) to separate your trades. By naming your entries (e.g., "Setup A" and "Setup B"), the script groups the data and outputs an isolated win rate and trade count for each setup in rows 3 and 4.
4.) Did I follow my written plan?
Pine Script cannot evaluate human discipline, so row 5 functions as a static visual prompt. It sits in the bottom right corner of your chart on Friday afternoon, reminding you to manually reconcile the script's automated data with your actual real-world executions.
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
Re: Weekly Journal Review: The Questions That Matter
Because you mentioned doing this review when the market is closed, standard indicators (which only update when a new price tick arrives) won't work well on the weekend.
To solve this, we will build these as Expert Advisors (EAs) using a Timer function. This ensures the dashboard will update and render on your chart even on a Saturday or Sunday when there are no live ticks coming in.
Instead of TradingView's entry_id, MQL uses Magic Numbers to identify different strategies. In these scripts, Setup A uses Magic Number 100, and Setup B uses 200.
Here are the versions for both platforms.
1. MT4 Version (MQL4)
Open MetaEditor in MT4, create a new Expert Advisor, name it WeeklyJournalDashboard, and paste this code:
To solve this, we will build these as Expert Advisors (EAs) using a Timer function. This ensures the dashboard will update and render on your chart even on a Saturday or Sunday when there are no live ticks coming in.
Instead of TradingView's entry_id, MQL uses Magic Numbers to identify different strategies. In these scripts, Setup A uses Magic Number 100, and Setup B uses 200.
Here are the versions for both platforms.
1. MT4 Version (MQL4)
Open MetaEditor in MT4, create a new Expert Advisor, name it WeeklyJournalDashboard, and paste this code:
Code: Select all
//+------------------------------------------------------------------+
//| WeeklyJournalDashboard.mq4 |
//+------------------------------------------------------------------+
#property strict
// Magic numbers for your setups
input int SetupAMagic = 100; // Magic Number for Setup A
input int SetupBMagic = 200; // Magic Number for Setup B
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// Use a 1-second timer so it works on weekends when markets are closed
EventSetTimer(1);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
EventKillTimer();
Comment(""); // Clear the dashboard when removed
}
//+------------------------------------------------------------------+
//| Timer function (Runs every second) |
//+------------------------------------------------------------------+
void OnTimer()
{
int weekWins = 0, weekLosses = 0;
double grossWin = 0.0, grossLoss = 0.0;
int setupAWins = 0, setupALosses = 0;
int setupBWins = 0, setupBLosses = 0;
// Get the start time of the current week directly from the server
datetime weekStart = iTime(NULL, PERIOD_W1, 0);
// Loop backward through account history
for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
// Only look at trades closed this week
if(OrderCloseTime() >= weekStart)
{
// Ensure it's a real trade (Buy or Sell), not a deposit/withdrawal
if(OrderType() <= OP_SELL)
{
double profit = OrderProfit() + OrderCommission() + OrderSwap();
int magic = OrderMagicNumber();
if(profit > 0)
{
weekWins++;
grossWin += profit;
if(magic == SetupAMagic) setupAWins++;
if(magic == SetupBMagic) setupBWins++;
}
else if(profit < 0) // Treat exactly 0 as break-even (ignored in win rate)
{
weekLosses++;
grossLoss += MathAbs(profit);
if(magic == SetupAMagic) setupALosses++;
if(magic == SetupBMagic) setupBLosses++;
}
}
}
else
{
// Since history is usually sorted, we can stop early to save memory
break;
}
}
}
// 1. Calculate Overall Win Rate
int totalTrades = weekWins + weekLosses;
double winRate = (totalTrades > 0) ? ((double)weekWins / totalTrades) * 100.0 : 0.0;
// 2. Calculate Realized R:R Ratio
double avgWin = (weekWins > 0) ? grossWin / weekWins : 0.0;
double avgLoss = (weekLosses > 0) ? grossLoss / weekLosses : 0.0;
double rrRatio = (avgLoss > 0) ? avgWin / avgLoss : 0.0;
// 3. Calculate Setup Win Rates
int totalA = setupAWins + setupALosses;
double winRateA = (totalA > 0) ? ((double)setupAWins / totalA) * 100.0 : 0.0;
int totalB = setupBWins + setupBLosses;
double winRateB = (totalB > 0) ? ((double)setupBWins / totalB) * 100.0 : 0.0;
// 4. Render the Dashboard using Chart Comment
string dashboard = "\n========== WEEKLY REVIEW ==========\n\n";
dashboard += "1. Win Rate This Week:\n";
dashboard += " " + IntegerToString(totalTrades) + " Trades | " + DoubleToString(winRate, 2) + "%\n\n";
dashboard += "2. Avg Realized R:R:\n";
dashboard += " 1 : " + DoubleToString(rrRatio, 2) + "\n\n";
dashboard += "3. Setup Performance:\n";
dashboard += " Setup A (Magic " + IntegerToString(SetupAMagic) + "): " + IntegerToString(totalA) + " Trades | " + DoubleToString(winRateA, 2) + "%\n";
dashboard += " Setup B (Magic " + IntegerToString(SetupBMagic) + "): " + IntegerToString(totalB) + " Trades | " + DoubleToString(winRateB, 2) + "%\n\n";
dashboard += "4. Rule Deviations?\n";
dashboard += " [ Check journal for manual deviations ]\n";
dashboard += "===================================";
Comment(dashboard);
}Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
Re: Weekly Journal Review: The Questions That Matter
2. MT5 Version (MQL5)
MT5 handles history differently than MT4 (it uses Deals rather than Orders). Open MetaEditor in MT5, create a new Expert Advisor, name it WeeklyJournalDashboard, and paste this code:
MT5 handles history differently than MT4 (it uses Deals rather than Orders). Open MetaEditor in MT5, create a new Expert Advisor, name it WeeklyJournalDashboard, and paste this code:
Code: Select all
//+------------------------------------------------------------------+
//| WeeklyJournalDashboard.mq5 |
//+------------------------------------------------------------------+
#property copyright "Weekly Journal"
#property version "1.00"
input long SetupAMagic = 100; // Magic Number for Setup A
input long SetupBMagic = 200; // Magic Number for Setup B
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// 1-second timer for weekend execution
EventSetTimer(1);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
EventKillTimer();
Comment("");
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
int weekWins = 0, weekLosses = 0;
double grossWin = 0.0, grossLoss = 0.0;
int setupAWins = 0, setupALosses = 0;
int setupBWins = 0, setupBLosses = 0;
// Determine the start of the week
datetime weekStart = iTime(_Symbol, PERIOD_W1, 0);
datetime now = TimeCurrent();
// In MT5, we must select the history range first
if(HistorySelect(weekStart, now))
{
int dealsTotal = HistoryDealsTotal();
for(int i = 0; i < dealsTotal; i++)
{
ulong ticket = HistoryDealGetTicket(i);
if(ticket > 0)
{
// Only look at deals that closed a position (Entry Out / InOut)
long dealEntry = HistoryDealGetInteger(ticket, DEAL_ENTRY);
if(dealEntry == DEAL_ENTRY_OUT || dealEntry == DEAL_ENTRY_INOUT)
{
// Calculate true net profit including swaps and commissions
double profit = HistoryDealGetDouble(ticket, DEAL_PROFIT) +
HistoryDealGetDouble(ticket, DEAL_SWAP) +
HistoryDealGetDouble(ticket, DEAL_COMMISSION);
long magic = HistoryDealGetInteger(ticket, DEAL_MAGIC);
if(profit > 0)
{
weekWins++;
grossWin += profit;
if(magic == SetupAMagic) setupAWins++;
if(magic == SetupBMagic) setupBWins++;
}
else if(profit < 0)
{
weekLosses++;
grossLoss += MathAbs(profit);
if(magic == SetupAMagic) setupALosses++;
if(magic == SetupBMagic) setupBLosses++;
}
}
}
}
}
// 1. Calculate Overall Win Rate
int totalTrades = weekWins + weekLosses;
double winRate = (totalTrades > 0) ? ((double)weekWins / totalTrades) * 100.0 : 0.0;
// 2. Calculate Realized R:R Ratio
double avgWin = (weekWins > 0) ? grossWin / weekWins : 0.0;
double avgLoss = (weekLosses > 0) ? grossLoss / weekLosses : 0.0;
double rrRatio = (avgLoss > 0) ? avgWin / avgLoss : 0.0;
// 3. Calculate Setup Win Rates
int totalA = setupAWins + setupALosses;
double winRateA = (totalA > 0) ? ((double)setupAWins / totalA) * 100.0 : 0.0;
int totalB = setupBWins + setupBLosses;
double winRateB = (totalB > 0) ? ((double)setupBWins / totalB) * 100.0 : 0.0;
// 4. Render the Dashboard
string dashboard = "\n========== WEEKLY REVIEW ==========\n\n";
dashboard += "1. Win Rate This Week:\n";
dashboard += " " + IntegerToString(totalTrades) + " Trades | " + DoubleToString(winRate, 2) + "%\n\n";
dashboard += "2. Avg Realized R:R:\n";
dashboard += " 1 : " + DoubleToString(rrRatio, 2) + "\n\n";
dashboard += "3. Setup Performance:\n";
dashboard += " Setup A (Magic " + IntegerToString((int)SetupAMagic) + "): " + IntegerToString(totalA) + " Trades | " + DoubleToString(winRateA, 2) + "%\n";
dashboard += " Setup B (Magic " + IntegerToString((int)SetupBMagic) + "): " + IntegerToString(totalB) + " Trades | " + DoubleToString(winRateB, 2) + "%\n\n";
dashboard += "4. Rule Deviations?\n";
dashboard += " [ Check journal for manual deviations ]\n";
dashboard += "===================================";
Comment(dashboard);
}Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
Re: Weekly Journal Review: The Questions That Matter
How to use this in MT4 / MT5:
Compilation: Paste the code into your MetaEditor and click Compile.
Setup Types: Double-check whatever tool/EA you use to place your trades. Make sure it allows you to assign a MagicNumber when you enter the market. Set your "Breakout" style trades to 100 and your "Reversal" style trades to 200 (or change the defaults in the indicator settings).
Execution: Drag this EA onto any open chart. Because it relies on the Comment() function, it will cleanly print the text block directly into the top-left corner of your chart and automatically track your live account history, resetting dynamically every Sunday night/Monday morning.
Compilation: Paste the code into your MetaEditor and click Compile.
Setup Types: Double-check whatever tool/EA you use to place your trades. Make sure it allows you to assign a MagicNumber when you enter the market. Set your "Breakout" style trades to 100 and your "Reversal" style trades to 200 (or change the defaults in the indicator settings).
Execution: Drag this EA onto any open chart. Because it relies on the Comment() function, it will cleanly print the text block directly into the top-left corner of your chart and automatically track your live account history, resetting dynamically every Sunday night/Monday morning.
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
Re: Weekly Journal Review: The Questions That Matter
To make this work in cTrader, we will build a cBot (Robot) using C#.
Just like with the MetaTrader versions, building this as a cBot rather than a standard Indicator allows us to use a Timer. This ensures the dashboard continuously runs and displays data on the weekend when the market is closed and no new price ticks are arriving.
Also, instead of using MT4/MT5's numerical "Magic Numbers," cTrader uses Labels (text strings) to identify different strategies, which is much more human-readable.
Here is the C# code for your cTrader Automate platform.
Just like with the MetaTrader versions, building this as a cBot rather than a standard Indicator allows us to use a Timer. This ensures the dashboard continuously runs and displays data on the weekend when the market is closed and no new price ticks are arriving.
Also, instead of using MT4/MT5's numerical "Magic Numbers," cTrader uses Labels (text strings) to identify different strategies, which is much more human-readable.
Here is the C# code for your cTrader Automate platform.
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.