Advertisement IC Markets

Weekly Journal Review: The Questions That Matter

Document your personal trading journey. Track daily equity curves, review winning and losing streaks, share trade screenshots, and get constructive feedback.
Fairman
Posts: 6757
Joined: Tue Jul 21, 2026 7:11 am
Location: Abuja

Weekly Journal Review: The Questions That Matter

Post by Fairman »

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.
It’s Fairman :geek:
Recommended broker for automated trading & scalping IC Markets
LondonScalper
Posts: 965
Joined: Sat Sep 05, 2026 7:54 am

Re: Weekly Journal Review: The Questions That Matter

Post by LondonScalper »

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?
PropScalpDesk
Posts: 521
Joined: Sat Sep 19, 2026 7:50 pm

Re: Weekly Journal Review: The Questions That Matter

Post by PropScalpDesk »

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:
  • 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?
Full-time in Frankfurt, this is scheduling, not inspiration. I put it on the calendar like an appointment with the person who pays the bills — future me. On prop weeks I add one line: any near-miss on daily loss or consistency language that I almost talked myself into ignoring.

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?
PTScalper
Site Admin
Posts: 7643
Joined: Mon Jul 20, 2026 1:28 pm

Re: Weekly Journal Review: The Questions That Matter

Post by PTScalper »

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.
Hi Fairman,

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.
PTScalper
Site Admin
Posts: 7643
Joined: Mon Jul 20, 2026 1:28 pm

Re: Weekly Journal Review: The Questions That Matter

Post by PTScalper »

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.
PTScalper
Site Admin
Posts: 7643
Joined: Mon Jul 20, 2026 1:28 pm

Re: Weekly Journal Review: The Questions That Matter

Post by PTScalper »

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.
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
PTScalper
Site Admin
Posts: 7643
Joined: Mon Jul 20, 2026 1:28 pm

Re: Weekly Journal Review: The Questions That Matter

Post by PTScalper »

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:

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.
PTScalper
Site Admin
Posts: 7643
Joined: Mon Jul 20, 2026 1:28 pm

Re: Weekly Journal Review: The Questions That Matter

Post by PTScalper »

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:

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.
PTScalper
Site Admin
Posts: 7643
Joined: Mon Jul 20, 2026 1:28 pm

Re: Weekly Journal Review: The Questions That Matter

Post by PTScalper »

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.
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
PTScalper
Site Admin
Posts: 7643
Joined: Mon Jul 20, 2026 1:28 pm

Re: Weekly Journal Review: The Questions That Matter

Post by PTScalper »

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.
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
Post Reply