Advertisement IC Markets

Pre-Asia session checklist: news, levels, max risk

Discuss 1-minute to 15-minute price action setups, fading intraday momentum, key support/resistance zones, and proven short-term trading methodologies.
Post Reply
LondonScalper
Posts: 770
Joined: Sat Sep 05, 2026 7:54 am

Pre-Asia session checklist: news, levels, max risk

Post by LondonScalper »

Pre-Asia checklist -- mostly so I do not invent a session I do not trade.

I am not an Asia specialist. The checklist still matters because Sunday evening / early Monday can suck me into "just marking levels" that turns into tickets.

Five minutes, same order every time
1. Calendar: any local prints that actually move my pairs, or am I looking at noise?
2. Levels from Friday: high/low and the level I care about for London -- not a dozen lines.
3. Max risk for Asia explicitly: usually zero or half-size micro only.
4. Spread sanity on anything I might touch; if the book is already silly, flat.
5. One sentence: observe only, or one planned idea. If I cannot say it, platform stays closed.

The checklist is a brake, not a hunting licence. Most Asia nights end with notes for London and no fills. That is success for my playbook.

If you do run Asia risk, what is non-negotiable on your pre-session card?
Recommended broker for automated trading & scalping IC Markets
PropScalpDesk
Posts: 364
Joined: Sat Sep 19, 2026 7:50 pm

Re: Pre-Asia session checklist: news, levels, max risk

Post by PropScalpDesk »

Pre-Asia checklist so I do not invent a session

I am not an Asia specialist. The checklist still matters because Sunday evening can turn “just marking levels” into tickets I did not plan to take. Five minutes, same order: calendar, key levels, max risk if I am even allowed to click, and a written stand-aside if the week’s real work is European.

Rule: if Asia is outside my edge, the checklist ends with platform alerts only — no discretionary entries. Marking is not trading.

That discipline protects Monday Frankfurt more than it protects Sunday pride.

If I break the Asia no-trade rule, it is logged as a process breach regardless of PnL. Winning on a banned session teaches the wrong lesson.

The checklist order never changes. Ritual reduces the chance that Sunday curiosity reshuffles priorities.

Invented Asia sessions create invented Monday holes.

What is the one Asia temptation you still fight — Sunday gap fade, or early Monday “tiny” probes before your real session?
PTScalper
Site Admin
Posts: 3349
Joined: Mon Jul 20, 2026 1:28 pm

Re: Pre-Asia session checklist: news, levels, max risk

Post by PTScalper »

LondonScalper wrote: Mon Sep 14, 2026 8:42 pm Pre-Asia checklist -- mostly so I do not invent a session I do not trade.

I am not an Asia specialist. The checklist still matters because Sunday evening / early Monday can suck me into "just marking levels" that turns into tickets.

Five minutes, same order every time
1. Calendar: any local prints that actually move my pairs, or am I looking at noise?
2. Levels from Friday: high/low and the level I care about for London -- not a dozen lines.
3. Max risk for Asia explicitly: usually zero or half-size micro only.
4. Spread sanity on anything I might touch; if the book is already silly, flat.
5. One sentence: observe only, or one planned idea. If I cannot say it, platform stays closed.

The checklist is a brake, not a hunting licence. Most Asia nights end with notes for London and no fills. That is success for my playbook.

If you do run Asia risk, what is non-negotiable on your pre-session card?
Hi Londonscalper,

If I am allocating risk during the Asian session, these three constraints are non-negotiable on the card:

Unmitigated Friday NY Liquidity: I will not trade chop. There must be an obvious, unmitigated liquidity pool (a naked high/low) left near the Friday close. If Friday ended in equilibrium, Asia will likely just build boundaries for London to sweep. I only step in if Asia has a clear magnet to sweep first.

Hard Spread Threshold: If the spread consumes more than 15-20% of the expected move to my first partial target, the setup is void. Expanding stops just to survive rollover spreads destroys the R:R math. If the order book is too thin, the platform stays closed.

Mean-Reversion Only: Asian volume rarely supports true momentum. Any risk deployed must be a fade of a minor sweep or a false breakout. Breakout and continuation plays are strictly reserved for London/NY volume.
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
PTScalper
Site Admin
Posts: 3349
Joined: Mon Jul 20, 2026 1:28 pm

Re: Pre-Asia session checklist: news, levels, max risk

Post by PTScalper »

To enforce your checklist as a visual "brake," here is a Pine Script v5 indicator. It highlights the Asian session so you know when the rules apply, automatically tracks and projects Friday's High and Low for your levels, and anchors a permanent dashboard on your chart to force you to read the five steps before touching a ticket.

Code: Select all

//@version=5
indicator("Pre-Asia Discipline Brake", overlay=true)

// --- Inputs ---
grp_session = "Session & Display"
asia_time   = input.session("1700-0300", title="Asia Session Window (NY Time)", group=grp_session)
tz          = input.string("America/New_York", title="Timezone", group=grp_session)
show_bg     = input.bool(true, title="Highlight Asia Session", group=grp_session)

grp_plan    = "Today's Checklist Variables"
risk_limit  = input.string("Zero / Micro only", title="Max Risk Limit", group=grp_plan)
daily_plan  = input.string("Observe only.", title="One Sentence Plan", group=grp_plan)

// --- 1. Session Highlight ---
in_asia = time(timeframe.period, asia_time, tz)
bgcolor(show_bg and in_asia ? color.new(color.navy, 85) : na, title="Asia Session Background")

// --- 2. Friday High / Low Tracker ---
var float fri_high = na
var float fri_low  = na

is_friday = dayofweek(time) == dayofweek.friday
new_day   = ta.change(time("D")) != 0

if is_friday
    if new_day
        fri_high := high
        fri_low  := low
    else
        fri_high := math.max(fri_high, high)
        fri_low  := math.min(fri_low, low)

// Project Friday levels during the rest of the week (Sun-Thu)
plot(not is_friday ? fri_high : na, color=color.new(color.red, 50), style=plot.style_linebr, linewidth=1, title="Friday High")
plot(not is_friday ? fri_low : na, color=color.new(color.teal, 50), style=plot.style_linebr, linewidth=1, title="Friday Low")

// --- 3. Discipline Dashboard (Table) ---
var table checklist = table.new(position.top_right, 2, 6, bgcolor=color.new(color.black, 85), border_width=1, border_color=color.new(color.gray, 70))

if barstate.islast
    // Header
    table.cell(checklist, 0, 0, "PRE-ASIA CHECKLIST", text_color=color.white, text_halign=text.align_center, text_size=size.normal, bgcolor=color.new(color.blue, 70), merge_cells=true)
    
    // Row 1
    table.cell(checklist, 0, 1, "1. Calendar", text_color=color.gray, text_halign=text.align_left, text_size=size.small)
    table.cell(checklist, 1, 1, "Local prints / Noise?", text_color=color.white, text_halign=text.align_left, text_size=size.small)
    
    // Row 2
    table.cell(checklist, 0, 2, "2. Friday Levels", text_color=color.gray, text_halign=text.align_left, text_size=size.small)
    table.cell(checklist, 1, 2, "H/L tracked on chart + 1 Key Level", text_color=color.white, text_halign=text.align_left, text_size=size.small)
    
    // Row 3
    table.cell(checklist, 0, 3, "3. Max Risk", text_color=color.gray, text_halign=text.align_left, text_size=size.small)
    table.cell(checklist, 1, 3, risk_limit, text_color=color.red, text_halign=text.align_left, text_size=size.small)
    
    // Row 4
    table.cell(checklist, 0, 4, "4. Spread", text_color=color.gray, text_halign=text.align_left, text_size=size.small)
    table.cell(checklist, 1, 4, "Sanity Check -> Flat if silly", text_color=color.white, text_halign=text.align_left, text_size=size.small)
    
    // Row 5
    table.cell(checklist, 0, 5, "5. Plan", text_color=color.gray, text_halign=text.align_left, text_size=size.small)
    table.cell(checklist, 1, 5, daily_plan, text_color=color.yellow, text_halign=text.align_left, text_size=size.small)
You can customize your "One sentence plan" in the indicator settings before the session opens. If it says "Observe only," staring at that yellow text in the top right corner makes it much harder to justify clicking a button.
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
PTScalper
Site Admin
Posts: 3349
Joined: Mon Jul 20, 2026 1:28 pm

Re: Pre-Asia session checklist: news, levels, max risk

Post by PTScalper »

Both implementations plot Friday’s High and Low across the chart, pull the live spread into check #4, and render an on-chart discipline dashboard in the top-right corner.

MetaTrader 4 (MQL4)
Save as PreAsiaDiscipline.mq4 in MQL4/Indicators/.

Code: Select all

//+------------------------------------------------------------------+
//|                                           PreAsiaDiscipline.mq4  |
//|                        Pre-Asia Discipline Brake & Friday Levels |
//+------------------------------------------------------------------+
#property copyright "Pre-Asia Discipline"
#property link      ""
#property version   "1.00"
#property strict
#property indicator_chart_window

// --- Inputs ---
input string InpRiskLimit     = "Zero / Micro only"; // 3. Max Risk Limit
input string InpDailyPlan     = "Observe only.";     // 5. One Sentence Plan
input color  InpFriHighColor  = clrRed;              // Friday High Color
input color  InpFriLowColor   = clrTeal;             // Friday Low Color
input int    InpXOffset       = 20;                  // Panel X Offset (Right)
input int    InpYOffset       = 25;                  // Panel Y Offset (Top)

#define PREFIX "PAD_"

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   ObjectsDeleteAll(0, PREFIX);
   ChartRedraw(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   // 1. Locate Friday Bar on D1
   int fri_bar = -1;
   for(int i = 0; i < 10; i++)
   {
      datetime t = iTime(NULL, PERIOD_D1, i);
      if(t == 0) continue;
      if(TimeDayOfWeek(t) == 5) // 5 = Friday
      {
         fri_bar = i;
         break;
      }
   }

   double fri_high = 0.0;
   double fri_low  = 0.0;

   if(fri_bar != -1)
   {
      fri_high = iHigh(NULL, PERIOD_D1, fri_bar);
      fri_low  = iLow(NULL, PERIOD_D1, fri_bar);
      UpdateLine(PREFIX + "FriHigh", fri_high, InpFriHighColor, "Friday High");
      UpdateLine(PREFIX + "FriLow",  fri_low,  InpFriLowColor,  "Friday Low");
   }

   // 2. Refresh Dashboard
   UpdateDashboard(fri_high, fri_low);
   ChartRedraw(0);

   return(rates_total);
}

//+------------------------------------------------------------------+
//| Horizontal Level Helper                                          |
//+------------------------------------------------------------------+
void UpdateLine(string name, double price, color clr, string tooltip)
{
   if(ObjectFind(0, name) < 0)
   {
      ObjectCreate(0, name, OBJ_HLINE, 0, 0, price);
      ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
      ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_DASH);
      ObjectSetInteger(0, name, OBJPROP_WIDTH, 1);
      ObjectSetInteger(0, name, OBJPROP_BACK, true);
      ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false);
   }
   else
   {
      ObjectSetDouble(0, name, OBJPROP_PRICE, price);
   }
   ObjectSetString(0, name, OBJPROP_TOOLTIP, tooltip + ": " + DoubleToString(price, Digits));
}

//+------------------------------------------------------------------+
//| Dashboard Drawing Function                                       |
//+------------------------------------------------------------------+
void UpdateDashboard(double fri_high, double fri_low)
{
   int x = InpXOffset + 240;
   int y = InpYOffset;

   // Background Box
   string bg_name = PREFIX + "PanelBG";
   if(ObjectFind(0, bg_name) < 0)
   {
      ObjectCreate(0, bg_name, OBJ_RECTANGLE_LABEL, 0, 0, 0);
      ObjectSetInteger(0, bg_name, OBJPROP_CORNER, CORNER_RIGHT_UPPER);
      ObjectSetInteger(0, bg_name, OBJPROP_XDISTANCE, x);
      ObjectSetInteger(0, bg_name, OBJPROP_YDISTANCE, y);
      ObjectSetInteger(0, bg_name, OBJPROP_XSIZE, 250);
      ObjectSetInteger(0, bg_name, OBJPROP_YSIZE, 145);
      ObjectSetInteger(0, bg_name, OBJPROP_BGCOLOR, C'20,24,35');
      ObjectSetInteger(0, bg_name, OBJPROP_BORDER_TYPE, BORDER_FLAT);
      ObjectSetInteger(0, bg_name, OBJPROP_COLOR, C'50,60,80');
      ObjectSetInteger(0, bg_name, OBJPROP_BACK, false);
      ObjectSetInteger(0, bg_name, OBJPROP_SELECTABLE, false);
   }

   // Title
   CreateLabel(PREFIX + "T0", "PRE-ASIA CHECKLIST", x - 10, y + 8, clrWhite, 9, true);

   // Checklist Items
   CreateLabel(PREFIX + "L1", "1. Calendar:", x - 10, y + 30, clrGray, 8, false);
   CreateLabel(PREFIX + "V1", "Local prints or noise?", x - 85, y + 30, clrWhite, 8, false);

   CreateLabel(PREFIX + "L2", "2. Friday H/L:", x - 10, y + 50, clrGray, 8, false);
   string hl_str = (fri_high > 0) ? DoubleToString(fri_high, Digits - 1) + " / " + DoubleToString(fri_low, Digits - 1) : "Finding...";
   CreateLabel(PREFIX + "V2", hl_str, x - 85, y + 50, clrAqua, 8, false);

   CreateLabel(PREFIX + "L3", "3. Max Risk:", x - 10, y + 70, clrGray, 8, false);
   CreateLabel(PREFIX + "V3", InpRiskLimit, x - 85, y + 70, clrOrangeRed, 8, true);

   CreateLabel(PREFIX + "L4", "4. Spread:", x - 10, y + 90, clrGray, 8, false);
   int current_spread = (int)MarketInfo(Symbol(), MODE_SPREAD);
   string spread_str = IntegerToString(current_spread) + " pts -> Flat if silly";
   CreateLabel(PREFIX + "V4", spread_str, x - 85, y + 90, (current_spread > 25 ? clrOrangeRed : clrLimeGreen), 8, false);

   CreateLabel(PREFIX + "L5", "5. Plan:", x - 10, y + 115, clrGray, 8, false);
   CreateLabel(PREFIX + "V5", InpDailyPlan, x - 85, y + 115, clrYellow, 8, true);
}

//+------------------------------------------------------------------+
//| Label Helper                                                     |
//+------------------------------------------------------------------+
void CreateLabel(string name, string text, int x, int y, color clr, int font_size, bool bold)
{
   if(ObjectFind(0, name) < 0)
   {
      ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
      ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_RIGHT_UPPER);
      ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false);
      ObjectSetString(0, name, OBJPROP_FONT, bold ? "Arial Bold" : "Arial");
   }
   ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
   ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
   ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
   ObjectSetInteger(0, name, OBJPROP_FONTSIZE, font_size);
   ObjectSetString(0, name, OBJPROP_TEXT, text);
}
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
PTScalper
Site Admin
Posts: 3349
Joined: Mon Jul 20, 2026 1:28 pm

Re: Pre-Asia session checklist: news, levels, max risk

Post by PTScalper »

MetaTrader 5 (MQL5)

Save as PreAsiaDiscipline.mq5 in MQL5/Indicators/.

Code: Select all

//+------------------------------------------------------------------+
//|                                           PreAsiaDiscipline.mq5  |
//|                        Pre-Asia Discipline Brake & Friday Levels |
//+------------------------------------------------------------------+
#property copyright "Pre-Asia Discipline"
#property link      ""
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0

// --- Inputs ---
input string InpRiskLimit     = "Zero / Micro only"; // 3. Max Risk Limit
input string InpDailyPlan     = "Observe only.";     // 5. One Sentence Plan
input color  InpFriHighColor  = clrRed;              // Friday High Color
input color  InpFriLowColor   = clrTeal;             // Friday Low Color
input int    InpXOffset       = 20;                  // Panel X Offset (Right)
input int    InpYOffset       = 25;                  // Panel Y Offset (Top)

#define PREFIX "PAD5_"

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   ObjectsDeleteAll(0, PREFIX);
   ChartRedraw(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   // 1. Locate Friday Bar on D1
   MqlRates d1_rates[];
   ArraySetAsSeries(d1_rates, true);
   int copied = CopyRates(_Symbol, PERIOD_D1, 0, 10, d1_rates);

   double fri_high = 0.0;
   double fri_low  = 0.0;

   if(copied > 0)
   {
      for(int i = 0; i < copied; i++)
      {
         MqlDateTime dt;
         TimeToStruct(d1_rates[i].time, dt);
         if(dt.day_of_week == 5) // 5 = Friday
         {
            fri_high = d1_rates[i].high;
            fri_low  = d1_rates[i].low;
            break;
         }
      }
   }

   if(fri_high > 0.0 && fri_low > 0.0)
   {
      UpdateLine(PREFIX + "FriHigh", fri_high, InpFriHighColor, "Friday High");
      UpdateLine(PREFIX + "FriLow",  fri_low,  InpFriLowColor,  "Friday Low");
   }

   // 2. Refresh Dashboard
   UpdateDashboard(fri_high, fri_low);
   ChartRedraw(0);

   return(rates_total);
}

//+------------------------------------------------------------------+
//| Horizontal Level Helper                                          |
//+------------------------------------------------------------------+
void UpdateLine(string name, double price, color clr, string tooltip)
{
   if(ObjectFind(0, name) < 0)
   {
      ObjectCreate(0, name, OBJ_HLINE, 0, 0, price);
      ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
      ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_DASH);
      ObjectSetInteger(0, name, OBJPROP_WIDTH, 1);
      ObjectSetInteger(0, name, OBJPROP_BACK, true);
      ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false);
   }
   else
   {
      ObjectSetDouble(0, name, OBJPROP_PRICE, price);
   }
   ObjectSetString(0, name, OBJPROP_TOOLTIP, tooltip + ": " + DoubleToString(price, _Digits));
}

//+------------------------------------------------------------------+
//| Dashboard Drawing Function                                       |
//+------------------------------------------------------------------+
void UpdateDashboard(double fri_high, double fri_low)
{
   int x = InpXOffset + 240;
   int y = InpYOffset;

   // Background Box
   string bg_name = PREFIX + "PanelBG";
   if(ObjectFind(0, bg_name) < 0)
   {
      ObjectCreate(0, bg_name, OBJ_RECTANGLE_LABEL, 0, 0, 0);
      ObjectSetInteger(0, bg_name, OBJPROP_CORNER, CORNER_RIGHT_UPPER);
      ObjectSetInteger(0, bg_name, OBJPROP_XDISTANCE, x);
      ObjectSetInteger(0, bg_name, OBJPROP_YDISTANCE, y);
      ObjectSetInteger(0, bg_name, OBJPROP_XSIZE, 250);
      ObjectSetInteger(0, bg_name, OBJPROP_YSIZE, 145);
      ObjectSetInteger(0, bg_name, OBJPROP_BGCOLOR, C'20,24,35');
      ObjectSetInteger(0, bg_name, OBJPROP_BORDER_TYPE, BORDER_FLAT);
      ObjectSetInteger(0, bg_name, OBJPROP_COLOR, C'50,60,80');
      ObjectSetInteger(0, bg_name, OBJPROP_BACK, false);
      ObjectSetInteger(0, bg_name, OBJPROP_SELECTABLE, false);
   }

   // Title
   CreateLabel(PREFIX + "T0", "PRE-ASIA CHECKLIST", x - 10, y + 8, clrWhite, 9, true);

   // Checklist Items
   CreateLabel(PREFIX + "L1", "1. Calendar:", x - 10, y + 30, clrGray, 8, false);
   CreateLabel(PREFIX + "V1", "Local prints or noise?", x - 85, y + 30, clrWhite, 8, false);

   CreateLabel(PREFIX + "L2", "2. Friday H/L:", x - 10, y + 50, clrGray, 8, false);
   string hl_str = (fri_high > 0) ? DoubleToString(fri_high, _Digits - 1) + " / " + DoubleToString(fri_low, _Digits - 1) : "Finding...";
   CreateLabel(PREFIX + "V2", hl_str, x - 85, y + 50, clrAqua, 8, false);

   CreateLabel(PREFIX + "L3", "3. Max Risk:", x - 10, y + 70, clrGray, 8, false);
   CreateLabel(PREFIX + "V3", InpRiskLimit, x - 85, y + 70, clrOrangeRed, 8, true);

   CreateLabel(PREFIX + "L4", "4. Spread:", x - 10, y + 90, clrGray, 8, false);
   long current_spread = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);
   string spread_str = IntegerToString(current_spread) + " pts -> Flat if silly";
   CreateLabel(PREFIX + "V4", spread_str, x - 85, y + 90, (current_spread > 25 ? clrOrangeRed : clrLimeGreen), 8, false);

   CreateLabel(PREFIX + "L5", "5. Plan:", x - 10, y + 115, clrGray, 8, false);
   CreateLabel(PREFIX + "V5", InpDailyPlan, x - 85, y + 115, clrYellow, 8, true);
}

//+------------------------------------------------------------------+
//| Label Helper                                                     |
//+------------------------------------------------------------------+
void CreateLabel(string name, string text, int x, int y, color clr, int font_size, bool bold)
{
   if(ObjectFind(0, name) < 0)
   {
      ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
      ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_RIGHT_UPPER);
      ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false);
      ObjectSetString(0, name, OBJPROP_FONT, bold ? "Arial Bold" : "Arial");
   }
   ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
   ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
   ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
   ObjectSetInteger(0, name, OBJPROP_FONTSIZE, font_size);
   ObjectSetString(0, name, OBJPROP_TEXT, text);
}
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
PTScalper
Site Admin
Posts: 3349
Joined: Mon Jul 20, 2026 1:28 pm

Re: Pre-Asia session checklist: news, levels, max risk

Post by PTScalper »

Notable Differences from the Pine Script Version

Live Spread Monitor: Item #4 continuously monitors real broker spread in points (MODE_SPREAD / SYMBOL_SPREAD), shifting text from lime green to orange-red if it blows past 25 points (~2.5 pips on standard 5-digit pairs).

Friday D1 Anchor: Instead of scanning back intraday bars across weekends, both indicators use native D1 price access (iTime/CopyRates) to locate the last calendar Friday bar (day_of_week == 5), keeping computation overhead negligible.

Clean Cleanup: All GUI objects use dedicated prefixes (PAD_ and PAD5_), ensuring removing the indicator leaves your chart completely clean.
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
PTScalper
Site Admin
Posts: 3349
Joined: Mon Jul 20, 2026 1:28 pm

Re: Pre-Asia session checklist: news, levels, max risk

Post by PTScalper »

Here is the C# implementation for cTrader (cAlgo).

Since you specialize in C# and .NET, you will appreciate cTrader's native UI framework, which is essentially a stripped-down version of WPF. Instead of managing pixel coordinates like in MQL, we can build the discipline dashboard using StackPanel and Border controls.

Save this in cTrader under Automate -> Indicators as PreAsiaDiscipline.

Code: Select all

using System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;

namespace cAlgo
{
    [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class PreAsiaDiscipline : Indicator
    {
        [Parameter("Max Risk Limit", DefaultValue = "Zero / Micro only", Group = "Plan")]
        public string RiskLimit { get; set; }

        [Parameter("One Sentence Plan", DefaultValue = "Observe only.", Group = "Plan")]
        public string DailyPlan { get; set; }

        [Parameter("Max Allowed Spread (Pips)", DefaultValue = 2.5, Group = "Limits")]
        public double MaxSpreadPips { get; set; }

        private TextBlock _spreadValueText;
        private double _fridayHigh = double.NaN;
        private double _fridayLow = double.NaN;

        protected override void Initialize()
        {
            CalculateFridayLevels();
            DrawLevels();
            DrawDashboard();
        }

        public override void Calculate(int index)
        {
            // Only update the spread on the most recent live tick
            if (IsLastBar)
            {
                UpdateSpread();
            }
        }

        private void CalculateFridayLevels()
        {
            // Fetch Daily bars to easily locate Friday without calculating intraday boundaries
            var dailyBars = MarketData.GetBars(TimeFrame.Daily);
            
            for (int i = dailyBars.Count - 1; i >= 0; i--)
            {
                if (dailyBars.OpenTimes[i].DayOfWeek == DayOfWeek.Friday)
                {
                    _fridayHigh = dailyBars.HighPrices[i];
                    _fridayLow = dailyBars.LowPrices[i];
                    break;
                }
            }
        }

        private void DrawLevels()
        {
            if (!double.IsNaN(_fridayHigh) && !double.IsNaN(_fridayLow))
            {
                Chart.DrawHorizontalLine("FriHigh", _fridayHigh, Color.Red, 1, LineStyle.Lines);
                Chart.DrawHorizontalLine("FriLow", _fridayLow, Color.Teal, 1, LineStyle.Lines);
            }
        }

        private void DrawDashboard()
        {
            // Container Panel (WPF-style)
            var border = new Border
            {
                VerticalAlignment = VerticalAlignment.Top,
                HorizontalAlignment = HorizontalAlignment.Right,
                Margin = new Thickness(0, 25, 20, 0),
                BackgroundColor = Color.FromArgb(220, 20, 24, 35),
                BorderColor = Color.FromArgb(255, 50, 60, 80),
                BorderThickness = new Thickness(1),
                CornerRadius = 3
            };

            var mainStack = new StackPanel 
            { 
                Orientation = Orientation.Vertical, 
                Margin = new Thickness(10) 
            };

            // Title
            mainStack.AddChild(new TextBlock 
            { 
                Text = "PRE-ASIA CHECKLIST", 
                ForegroundColor = Color.White, 
                FontWeight = FontWeight.ExtraBold, 
                HorizontalAlignment = HorizontalAlignment.Center, 
                Margin = new Thickness(0, 0, 0, 10) 
            });

            // 1. Calendar
            mainStack.AddChild(CreateRow("1. Calendar:", "Local prints or noise?", Color.White));

            // 2. Levels
            string hlText = !double.IsNaN(_fridayHigh) ? $"{Math.Round(_fridayHigh, Symbol.Digits)} / {Math.Round(_fridayLow, Symbol.Digits)}" : "Finding...";
            mainStack.AddChild(CreateRow("2. Friday H/L:", hlText, Color.Aqua));

            // 3. Risk
            mainStack.AddChild(CreateRow("3. Max Risk:", RiskLimit, Color.OrangeRed));

            // 4. Spread (Store reference to update dynamically in Calculate)
            var spreadRowPanel = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 0, 3) };
            spreadRowPanel.AddChild(new TextBlock { Text = "4. Spread:", ForegroundColor = Color.Gray, Width = 85 });
            _spreadValueText = new TextBlock { Text = "Loading...", ForegroundColor = Color.LimeGreen, FontWeight = FontWeight.Bold };
            spreadRowPanel.AddChild(_spreadValueText);
            mainStack.AddChild(spreadRowPanel);

            // 5. Plan
            mainStack.AddChild(CreateRow("5. Plan:", DailyPlan, Color.Yellow));

            border.Child = mainStack;
            Chart.AddControl(border);
        }

        private StackPanel CreateRow(string label, string value, Color valueColor)
        {
            var rowPanel = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 0, 3) };
            rowPanel.AddChild(new TextBlock { Text = label, ForegroundColor = Color.Gray, Width = 85 });
            rowPanel.AddChild(new TextBlock { Text = value, ForegroundColor = valueColor, FontWeight = FontWeight.Bold });
            return rowPanel;
        }

        private void UpdateSpread()
        {
            if (_spreadValueText == null) return;

            // Calculate spread in exact pips
            double spreadPips = Math.Round(Symbol.Spread / Symbol.PipSize, 1);
            
            _spreadValueText.Text = $"{spreadPips} pips -> Flat if silly";
            
            // Switch to red if it crosses the sanity threshold
            _spreadValueText.ForegroundColor = spreadPips > MaxSpreadPips ? Color.OrangeRed : Color.LimeGreen;
        }
    }
}
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
PTScalper
Site Admin
Posts: 3349
Joined: Mon Jul 20, 2026 1:28 pm

Re: Pre-Asia session checklist: news, levels, max risk

Post by PTScalper »

Key Differences vs MQL

WPF-Style Layouts: Instead of hardcoding X/Y pixel distances for labels, this uses a StackPanel inside a Border. It automatically reflows and sizes itself based on your text content.

Separation of Concerns: By calling MarketData.GetBars(TimeFrame.Daily), we isolate the daily timeframe query cleanly without complex date-shifting math on intraday charts.

Pip Size Normalization: cTrader natively normalizes tick values. Symbol.Spread / Symbol.PipSize gives you exact decimal pips (e.g., 1.5 pips) regardless of asset class, so I added a MaxSpreadPips parameter exposed to the UI (defaults to 2.5 pips) where the spread text turns orange-red.
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
Post Reply