Been scalping London for about a decade. Still do the same boring pre-open routine — not because it's glamorous, but because skipping it costs me more than a fat spread ever did.
Clock: I want this done by **07:58 UK**, so when liquidity wakes up I'm not still alt-tabbing into economic calendars.
**1. Calendar (60 seconds)**
Anything red/orange in the next 3 hours for USD/EUR/GBP? If yes, I note the exact print time and whether I trade *into* it or flat 5 minutes before. Half the "I got spiked" stories are just people who glanced at the calendar at 09:00.
**2. Overnight range + Asia high/low**
I mark Asia session H/L on M5. Not as holy grail — just so I know where the first liquidity grab usually sniffs. If London opens *inside* a tight Asia box, I expect either a fake break then reverse, or a delayed break after 08:15.
**3. Spread sanity check**
EURUSD / GBPUSD / XAUUSD raw spreads on my VPS feed. If EURUSD is already 0.4+ before open, something's off (broker, holiday, or my VPS routing). I don't "push through it."
**4. VPS + platform**
Ping to broker, MT5 reconnect if needed, one market-order test on micro size if I switched servers overnight. Latency spike after a Windows update has bitten me more than once. Dry humor: Windows Update at 07:40 is a personality test.
**5. Levels that matter today**
Prior day high/low, round numbers that actually printed volume yesterday, and one HTF level (H1/H4). Max 4 lines. If my chart looks like a subway map, I've already lost.
**6. Bias note (one sentence)**
Written in the journal *before* the first click. Example: "Fade first London spike on EURUSD unless NYSE futures are ripping same direction." If I can't write one sentence, I don't trade the open.
Takes ~12 minutes when I'm disciplined. Takes 40 when I "just check Twitter first."
What does your pre-London checklist look like in practice — timed steps or gut feel?
Anyone else refuse to trade the open if spreads are already elevated?
Do you flat all positions into major UK prints, or scale risk down instead?
London open: the 12-minute checklist I actually run (not the Instagram one)
Forum rules
Administrators, Registered users a Guests.
Administrators, Registered users a Guests.
-
LondonScalper
- Posts: 27
- Joined: Sat Sep 05, 2026 7:54 am
Re: London open: the 12-minute checklist I actually run (not the Instagram one)
I like checklists that are short enough to run under adrenaline. Twelve minutes before London is about right — long enough to be honest, short enough that you cannot turn it into a research rabbit hole.
Here is the version I actually run (timer on phone, not vibes):
Minutes 0–3 — Risk rails
Daily stop (R or %), soft tilt stop, news blackout windows, max trades. If any of these are blank, platform stays closed.
Minutes 3–6 — HTF permission
H1 bias in one line. M15 key levels that would invalidate a scalp idea. If H1 and M15 conflict hard, default is no new risk until one side resolves — not “I’ll figure it out on M1.”
Minutes 6–9 — Liquidity map
Overnight high/low, prior day high/low, any obvious equal highs/lows. I mark where stops likely sit. I do not need twenty lines.
Minutes 9–12 — Session shortlist
One primary pair, one alternate, both with a written A+ description. Everything else is watch-only. Hotkeys checked; phone notifications off if that is part of my tilt profile.
What I strip out of Instagram checklists: indicator rainbows, five “confluence” oscillators, and motivational quotes. Those burn the twelve minutes and still leave risk undefined.
After the open, the checklist’s job is done. I do not re-run a full prep mid-session to justify a B setup. If conditions change (news surprise, open-range chaos), I use a pre-written downgrade rule: half size or flat — not a brand-new narrative.
If your London mornings feel frantic, shrink the checklist until it fits a real timer. A completed boring list beats an incomplete clever one. Process scores in the journal should include “prep completed Y/N.” That single field has saved me more money than any new entry pattern. Run it the same way on quiet days so it stays automatic when volatility arrives.
Print or pin the four blocks beside the monitor for a week until muscle memory owns them. After that, the timer alone is enough.
Here is the version I actually run (timer on phone, not vibes):
Minutes 0–3 — Risk rails
Daily stop (R or %), soft tilt stop, news blackout windows, max trades. If any of these are blank, platform stays closed.
Minutes 3–6 — HTF permission
H1 bias in one line. M15 key levels that would invalidate a scalp idea. If H1 and M15 conflict hard, default is no new risk until one side resolves — not “I’ll figure it out on M1.”
Minutes 6–9 — Liquidity map
Overnight high/low, prior day high/low, any obvious equal highs/lows. I mark where stops likely sit. I do not need twenty lines.
Minutes 9–12 — Session shortlist
One primary pair, one alternate, both with a written A+ description. Everything else is watch-only. Hotkeys checked; phone notifications off if that is part of my tilt profile.
What I strip out of Instagram checklists: indicator rainbows, five “confluence” oscillators, and motivational quotes. Those burn the twelve minutes and still leave risk undefined.
After the open, the checklist’s job is done. I do not re-run a full prep mid-session to justify a B setup. If conditions change (news surprise, open-range chaos), I use a pre-written downgrade rule: half size or flat — not a brand-new narrative.
If your London mornings feel frantic, shrink the checklist until it fits a real timer. A completed boring list beats an incomplete clever one. Process scores in the journal should include “prep completed Y/N.” That single field has saved me more money than any new entry pattern. Run it the same way on quiet days so it stays automatic when volatility arrives.
Print or pin the four blocks beside the monitor for a week until muscle memory owns them. After that, the timer alone is enough.
- Attachments
-
- 39-london-12min-sketch.png (103.32 KiB) Viewed 6 times
It’s Fairman 
Re: London open: the 12-minute checklist I actually run (not the Instagram one)
Hi Fairman,Fairman wrote: Sat Sep 05, 2026 5:51 pm I like checklists that are short enough to run under adrenaline. Twelve minutes before London is about right — long enough to be honest, short enough that you cannot turn it into a research rabbit hole.
Here is the version I actually run (timer on phone, not vibes):
Minutes 0–3 — Risk rails
Daily stop (R or %), soft tilt stop, news blackout windows, max trades. If any of these are blank, platform stays closed.
Minutes 3–6 — HTF permission
H1 bias in one line. M15 key levels that would invalidate a scalp idea. If H1 and M15 conflict hard, default is no new risk until one side resolves — not “I’ll figure it out on M1.”
Minutes 6–9 — Liquidity map
Overnight high/low, prior day high/low, any obvious equal highs/lows. I mark where stops likely sit. I do not need twenty lines.
Minutes 9–12 — Session shortlist
One primary pair, one alternate, both with a written A+ description. Everything else is watch-only. Hotkeys checked; phone notifications off if that is part of my tilt profile.
What I strip out of Instagram checklists: indicator rainbows, five “confluence” oscillators, and motivational quotes. Those burn the twelve minutes and still leave risk undefined.
After the open, the checklist’s job is done. I do not re-run a full prep mid-session to justify a B setup. If conditions change (news surprise, open-range chaos), I use a pre-written downgrade rule: half size or flat — not a brand-new narrative.
If your London mornings feel frantic, shrink the checklist until it fits a real timer. A completed boring list beats an incomplete clever one. Process scores in the journal should include “prep completed Y/N.” That single field has saved me more money than any new entry pattern. Run it the same way on quiet days so it stays automatic when volatility arrives.
Print or pin the four blocks beside the monitor for a week until muscle memory owns them. After that, the timer alone is enough.
sounds good.
Your checklist works because it treats trading like aviation: you do not wait until the engine fails to decide how to land. You strip away the noise—the Instagram aesthetics, the lagging indicators—and focus purely on risk constraints, structural permissions, and liquidity. It is binary, actionable, and respects the reality of market open volatility.
Here is a breakdown of why this structure is bulletproof:
Anti-Tilt Architecture: By defining "Risk rails" in the first three minutes, you remove emotional negotiation. If the blanks aren't filled, the platform stays closed.
Time-Boxed Efficiency: A 12-minute countdown prevents paralysis by analysis. It stops the transition from executing a plan into falling down a "research rabbit hole."
Downgrade Rules: Pre-writing your reaction to open-range chaos (half size or flat) saves you from fabricating a low-probability narrative on the fly.
To complement this, I have written a TradingView Pine Script (v5) designed entirely around your philosophy.
The 12-Minute London Prep Script
This script strictly avoids indicator rainbows. It does two things:
Automates the Liquidity Map (Minutes 6–9): It quietly plots Prior Day High/Low (PDH/PDL) and the Overnight (Asian) High/Low.
Puts the Checklist on the Glass: It pins your 4-step checklist to the chart so your muscle memory can build without looking away from price action.
Code: Select all
//@version=5
indicator("12-Min London Prep Checklist", overlay=true)
// --- Inputs ---
grp1 = "Visuals"
showTable = input.bool(true, "Show Checklist Dashboard", group=grp1)
tablePos = input.string("Top Right", "Dashboard Position", options=["Top Right", "Top Left", "Bottom Right", "Bottom Left"], group=grp1)
grp2 = "Liquidity Map (Minutes 6-9)"
showLiq = input.bool(true, "Show PDH/PDL & Overnight H/L", group=grp2)
asianTime = input.session("1800-0200", "Overnight Session (Exchange Time)", group=grp2)
// --- Logic: Prior Day High & Low ---
[pdh, pdl] = request.security(syminfo.tickerid, "D", [high[1], low[1]], lookahead=barmerge.lookahead_on)
// --- Logic: Overnight (Asian) High & Low ---
inSession = time(timeframe.period, asianTime)
var float overnightHigh = na
var float overnightLow = na
if inSession and not inSession[1]
overnightHigh := high
overnightLow := low
else if inSession
overnightHigh := math.max(overnightHigh, high)
overnightLow := math.min(overnightLow, low)
// --- Plotting Liquidity Map ---
// Muted, non-intrusive colors to avoid "indicator rainbows"
plot(showLiq ? pdh : na, color=color.new(color.gray, 40), style=plot.style_cross, title="Prior Day High")
plot(showLiq ? pdl : na, color=color.new(color.gray, 40), style=plot.style_cross, title="Prior Day Low")
plot(showLiq ? overnightHigh : na, color=color.new(color.blue, 60), style=plot.style_circles, title="Overnight High")
plot(showLiq ? overnightLow : na, color=color.new(color.blue, 60), style=plot.style_circles, title="Overnight Low")
// --- Logic: Checklist Dashboard ---
var pos = tablePos == "Top Right" ? position.top_right :
tablePos == "Top Left" ? position.top_left :
tablePos == "Bottom Right" ? position.bottom_right : position.bottom_left
if showTable and barstate.islast
var tbl = table.new(pos, 2, 5, bgcolor=color.new(color.black, 75), border_width=1, border_color=color.new(color.gray, 80))
// Header
table.cell(tbl, 0, 0, "12-MIN PREP", text_color=color.white, text_halign=text.align_center, text_size=size.small, bgcolor=color.new(color.blue, 70), colspan=2)
// Min 0-3
table.cell(tbl, 0, 1, "0-3m: Risk Rails", text_color=color.white, text_halign=text.align_left, text_size=size.small)
table.cell(tbl, 1, 1, "Stops, News, Max Trades", text_color=color.silver, text_halign=text.align_left, text_size=size.small)
// Min 3-6
table.cell(tbl, 0, 2, "3-6m: HTF Perms", text_color=color.white, text_halign=text.align_left, text_size=size.small)
table.cell(tbl, 1, 2, "H1 Bias & M15 Key Levels", text_color=color.silver, text_halign=text.align_left, text_size=size.small)
// Min 6-9
table.cell(tbl, 0, 3, "6-9m: Liquidity", text_color=color.white, text_halign=text.align_left, text_size=size.small)
table.cell(tbl, 1, 3, "PDH/PDL & O/N High/Lows", text_color=color.silver, text_halign=text.align_left, text_size=size.small)
// Min 9-12
table.cell(tbl, 0, 4, "9-12m: Shortlist", text_color=color.white, text_halign=text.align_left, text_size=size.small)
table.cell(tbl, 1, 4, "A+ Pair, Alt Pair, Hotkeys", text_color=color.silver, text_halign=text.align_left, text_size=size.small)Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
Re: London open: the 12-minute checklist I actually run (not the Instagram one)
How to use it
Open TradingView, go to the Pine Editor tab at the bottom.
Paste the code, hit Save, and select Add to Chart.
In the indicator settings, you can adjust the "Overnight Session" timeframe to perfectly match how your specific exchange time aligns with the Asian session.
When hunting for your liquidity sweep entries during the London open, what specific time zone or hours do you currently anchor your "overnight" session to?
Open TradingView, go to the Pine Editor tab at the bottom.
Paste the code, hit Save, and select Add to Chart.
In the indicator settings, you can adjust the "Overnight Session" timeframe to perfectly match how your specific exchange time aligns with the Asian session.
When hunting for your liquidity sweep entries during the London open, what specific time zone or hours do you currently anchor your "overnight" session to?
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
Re: London open: the 12-minute checklist I actually run (not the Instagram one)
I have rebuilt the script with three major professional upgrades:
Dynamic Projection Lines: Instead of infinite horizontal plots, the script now draws clean, labeled lines (PDH, PDL, Asian High, Asian Low) that project forward only for the current day and update dynamically.
Explicit Timezone Handling: Relying on exchange time can cause bugs if you trade different pairs (e.g., Forex vs. Crypto vs. Indices). The script now allows you to force a specific timezone (default: UTC-4 / New York) so your Asian session mapping is always mathematically perfect, regardless of the broker.
Minimalist HUD (Heads Up Display): The checklist is upgraded to a modern, semi-transparent HUD with better typography, avoiding blocking your candlesticks.
Here is the upgraded v5 script:
Dynamic Projection Lines: Instead of infinite horizontal plots, the script now draws clean, labeled lines (PDH, PDL, Asian High, Asian Low) that project forward only for the current day and update dynamically.
Explicit Timezone Handling: Relying on exchange time can cause bugs if you trade different pairs (e.g., Forex vs. Crypto vs. Indices). The script now allows you to force a specific timezone (default: UTC-4 / New York) so your Asian session mapping is always mathematically perfect, regardless of the broker.
Minimalist HUD (Heads Up Display): The checklist is upgraded to a modern, semi-transparent HUD with better typography, avoiding blocking your candlesticks.
Here is the upgraded v5 script:
Code: Select all
//@version=5
indicator("Pro London 12-Min Prep", overlay=true, max_lines_count=50, max_labels_count=50)
// =========================================================================
// INPUTS
// =========================================================================
grp_hud = "Checklist HUD"
showHud = input.bool(true, "Show Checklist HUD", group=grp_hud)
hudPos = input.string("Top Right", "HUD Position", options=["Top Right", "Top Left", "Bottom Right", "Bottom Left"], group=grp_hud)
hudSize = input.string("Small", "Text Size", options=["Tiny", "Small", "Normal"], group=grp_hud)
grp_liq = "Liquidity Map (Dynamic Lines)"
showPD = input.bool(true, "Show Prior Day High/Low", group=grp_liq)
showAsian = input.bool(true, "Show Asian Session High/Low", group=grp_liq)
asianSess = input.session("1800-0200", "Asian Session Hours", group=grp_liq)
tz = input.string("America/New_York", "Timezone Override", tooltip="Standardizes session times regardless of broker", group=grp_liq)
colorPD = input.color(color.new(color.gray, 50), "PDH/PDL Color", group=grp_liq)
colorAsia = input.color(color.new(#2962ff, 40), "Asian H/L Color", group=grp_liq)
// =========================================================================
// LOGIC: PRIOR DAY HIGH/LOW (PDH / PDL)
// =========================================================================
var line pdhLine = na
var line pdlLine = na
var label pdhLbl = na
var label pdlLbl = na
[dHigh, dLow] = request.security(syminfo.tickerid, "D", [high[1], low[1]], lookahead=barmerge.lookahead_on)
if showPD and barstate.islast
// Only draw/update lines on the last bar to keep historical chart perfectly clean
line.delete(pdhLine)
line.delete(pdlLine)
label.delete(pdhLbl)
label.delete(pdlLbl)
// Start lines 20 bars back for visual context, project forward
int startBar = bar_index - 20
pdhLine := line.new(startBar, dHigh, bar_index + 10, dHigh, color=colorPD, style=line.style_dashed)
pdlLine := line.new(startBar, dLow, bar_index + 10, dLow, color=colorPD, style=line.style_dashed)
pdhLbl := label.new(bar_index + 10, dHigh, "PDH", color=color.new(color.white, 100), textcolor=colorPD, style=label.style_label_left, size=size.small)
pdlLbl := label.new(bar_index + 10, dLow, "PDL", color=color.new(color.white, 100), textcolor=colorPD, style=label.style_label_left, size=size.small)
// =========================================================================
// LOGIC: OVERNIGHT / ASIAN SESSION HIGH/LOW
// =========================================================================
var float asiaHigh = na
var float asiaLow = na
var int asiaStart = na
inSession = time(timeframe.period, asianSess, tz)
// Detect session changes
if inSession and not inSession[1]
asiaHigh := high
asiaLow := low
asiaStart := bar_index
else if inSession
asiaHigh := math.max(asiaHigh, high)
asiaLow := math.min(asiaLow, low)
var line aHLine = na
var line aLLine = na
var label aHLbl = na
var label aLLbl = na
if showAsian and not na(asiaHigh) and barstate.islast
line.delete(aHLine)
line.delete(aLLine)
label.delete(aHLbl)
label.delete(aLLbl)
aHLine := line.new(asiaStart, asiaHigh, bar_index + 10, asiaHigh, color=colorAsia, style=line.style_dotted)
aLLine := line.new(asiaStart, asiaLow, bar_index + 10, asiaLow, color=colorAsia, style=line.style_dotted)
aHLbl := label.new(bar_index + 10, asiaHigh, "Asia H", color=color.new(color.white, 100), textcolor=colorAsia, style=label.style_label_left, size=size.small)
aLLbl := label.new(bar_index + 10, asiaLow, "Asia L", color=color.new(color.white, 100), textcolor=colorAsia, style=label.style_label_left, size=size.small)
// =========================================================================
// LOGIC: CHECKLIST HUD
// =========================================================================
var string p = hudPos == "Top Right" ? position.top_right :
hudPos == "Top Left" ? position.top_left :
hudPos == "Bottom Right" ? position.bottom_right : position.bottom_left
var string s = hudSize == "Tiny" ? size.tiny : hudSize == "Normal" ? size.normal : size.small
if showHud and barstate.islast
// Ultra-clean transparent background (85% transparent black)
var tbl = table.new(p, 2, 6, bgcolor=color.new(color.black, 85), border_width=1, border_color=color.new(color.gray, 90))
// Header
table.cell(tbl, 0, 0, "LONDON PREP (12M)", text_color=color.white, text_halign=text.align_center, text_size=s, bgcolor=color.new(#2962ff, 50), colspan=2)
// Row 1
table.cell(tbl, 0, 1, "0-3m: Risk", text_color=color.white, text_halign=text.align_left, text_size=s)
table.cell(tbl, 1, 1, "Stops, News, Max Trades", text_color=color.silver, text_halign=text.align_left, text_size=s)
// Row 2
table.cell(tbl, 0, 2, "3-6m: HTF", text_color=color.white, text_halign=text.align_left, text_size=s)
table.cell(tbl, 1, 2, "H1 Bias, M15 Levels", text_color=color.silver, text_halign=text.align_left, text_size=s)
// Row 3
table.cell(tbl, 0, 3, "6-9m: Liq", text_color=color.white, text_halign=text.align_left, text_size=s)
table.cell(tbl, 1, 3, "PDH/PDL, Asian H/L", text_color=color.silver, text_halign=text.align_left, text_size=s)
// Row 4
table.cell(tbl, 0, 4, "9-12m: Exec", text_color=color.white, text_halign=text.align_left, text_size=s)
table.cell(tbl, 1, 4, "A+ Pair, Alt, Hotkeys", text_color=color.silver, text_halign=text.align_left, text_size=s)
// Footer / Rule
table.cell(tbl, 0, 5, "IF CHAOS →", text_color=color.new(color.red, 30), text_halign=text.align_left, text_size=s)
table.cell(tbl, 1, 5, "Half Size or Flat", text_color=color.new(color.red, 30), text_halign=text.align_left, text_size=s)Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
Re: London open: the 12-minute checklist I actually run (not the Instagram one)
What makes this version superior:
Zero Historical Clutter: The barstate.islast execution block ensures the lines and labels are only drawn on the current price action. When you scroll back through the chart, you won't have random lines ruining your view.
Timezone Enforcement: By passing tz="America/New_York" into the session logic, your Asian session (18:00 - 02:00) is always precisely calculated against EST/EDT. This prevents your liquidity boxes from shifting if you change brokers or asset classes.
Right-Aligned Floating Labels: Price levels now feature small, clean text labels ("PDH", "Asia L") sitting dynamically at the exact end of the line on the right side of the chart, merging seamlessly with your current price axis.
The "Chaos" Rule: Added your exact downgrade rule ("If Chaos → Half Size or Flat") to the bottom of the HUD as a final visual anchor before the bell rings.
Zero Historical Clutter: The barstate.islast execution block ensures the lines and labels are only drawn on the current price action. When you scroll back through the chart, you won't have random lines ruining your view.
Timezone Enforcement: By passing tz="America/New_York" into the session logic, your Asian session (18:00 - 02:00) is always precisely calculated against EST/EDT. This prevents your liquidity boxes from shifting if you change brokers or asset classes.
Right-Aligned Floating Labels: Price levels now feature small, clean text labels ("PDH", "Asia L") sitting dynamically at the exact end of the line on the right side of the chart, merging seamlessly with your current price axis.
The "Chaos" Rule: Added your exact downgrade rule ("If Chaos → Half Size or Flat") to the bottom of the HUD as a final visual anchor before the bell rings.
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
Re: London open: the 12-minute checklist I actually run (not the Instagram one)
Unlike TradingView, MetaTrader does not rely on a centralized timezone (like UTC-4). It relies strictly on your Broker's Server Time (usually GMT+2 or GMT+3). Because of this, the Asian Session inputs in the scripts below use Broker Hours rather than exchange time.
MetaTrader 4 (MQL4) Version
Instructions: Open MT4, press F4 to open MetaEditor. Click New -> Custom Indicator, name it "LondonPrep", and paste this code over everything. Click Compile.
MetaTrader 4 (MQL4) Version
Instructions: Open MT4, press F4 to open MetaEditor. Click New -> Custom Indicator, name it "LondonPrep", and paste this code over everything. Click Compile.
Code: Select all
//+------------------------------------------------------------------+
//| LondonPrep_12Min.mq4|
//+------------------------------------------------------------------+
#property copyright "Pro Trading Checklist"
#property link ""
#property version "1.00"
#property strict
#property indicator_chart_window
//--- Inputs
input string Grp1 = "--- Checklist HUD ---";
input bool ShowHUD = true;
input color ColorHeader = clrDodgerBlue;
input color ColorText = clrSilver;
input color ColorWarning = clrRed;
input string Grp2 = "--- Liquidity Map ---";
input bool ShowLines = true;
input int AsianStartHour = 0; // Broker time (e.g., 0 = Midnight)
input int AsianEndHour = 8; // Broker time (e.g., 8 = 8 AM)
input color ColorPDH = clrGray;
input color ColorAsia = clrRoyalBlue;
//--- Global Variables
string hudLines[6] = {
"LONDON PREP (12M)",
"0-3m: Risk | Stops, News, Max",
"3-6m: HTF | H1 Bias, M15 Lvl",
"6-9m: Liq | PDH/PDL, Asian H/L",
"9-12m: Exec | A+ Pair, Alt, Hotkeys",
"IF CHAOS -> Half Size or Flat"
};
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit() {
if(ShowHUD) {
for(int i = 0; i < 6; i++) {
string name = "Prep_HUD_" + IntegerToString(i);
ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_RIGHT_UPPER);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, 20);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, 20 + (i * 18));
ObjectSetString(0, name, OBJPROP_TEXT, hudLines[i]);
ObjectSetString(0, name, OBJPROP_FONT, "Arial");
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 9);
if(i == 0) ObjectSetInteger(0, name, OBJPROP_COLOR, ColorHeader);
else if(i == 5) ObjectSetInteger(0, name, OBJPROP_COLOR, ColorWarning);
else ObjectSetInteger(0, name, OBJPROP_COLOR, ColorText);
ObjectSetInteger(0, name, OBJPROP_BACK, false);
}
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
ObjectsDeleteAll(0, "Prep_"); // Clean up all objects on removal
}
//+------------------------------------------------------------------+
//| 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[]) {
if(!ShowLines) return(rates_total);
// 1. Calculate Prior Day High/Low
double pdh = iHigh(Symbol(), PERIOD_D1, 1);
double pdl = iLow(Symbol(), PERIOD_D1, 1);
datetime startOfDay = iTime(Symbol(), PERIOD_D1, 0);
DrawLevel("Prep_PDH", "PDH", pdh, startOfDay, ColorPDH, STYLE_DASH);
DrawLevel("Prep_PDL", "PDL", pdl, startOfDay, ColorPDH, STYLE_DASH);
// 2. Calculate Asian Session High/Low
double asiaH = 0.0;
double asiaL = 999999.0;
datetime asiaStart = 0;
for(int i = 0; i < rates_total; i++) {
if(Time[i] < startOfDay) break; // Only look at today's bars
int hr = TimeHour(Time[i]);
bool inSession = false;
if(AsianStartHour < AsianEndHour) {
if(hr >= AsianStartHour && hr < AsianEndHour) inSession = true;
} else { // Crosses midnight
if(hr >= AsianStartHour || hr < AsianEndHour) inSession = true;
}
if(inSession) {
if(High[i] > asiaH) asiaH = High[i];
if(Low[i] < asiaL) asiaL = Low[i];
if(asiaStart == 0) asiaStart = Time[i];
}
}
if(asiaH > 0 && asiaL < 999999.0 && asiaStart > 0) {
DrawLevel("Prep_AsiaH", "Asia H", asiaH, asiaStart, ColorAsia, STYLE_DOT);
DrawLevel("Prep_AsiaL", "Asia L", asiaL, asiaStart, ColorAsia, STYLE_DOT);
}
return(rates_total);
}
//+------------------------------------------------------------------+
//| Helper Function: Draw Dynamic Level |
//+------------------------------------------------------------------+
void DrawLevel(string name, string label, double price, datetime timeStart, color clr, int style) {
// Draw Line
if(ObjectFind(0, name) < 0) {
ObjectCreate(0, name, OBJ_TREND, 0, timeStart, price, timeStart + 3600, price);
ObjectSetInteger(0, name, OBJPROP_RAY_RIGHT, true); // Projects forward infinitely
ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
ObjectSetInteger(0, name, OBJPROP_STYLE, style);
ObjectSetInteger(0, name, OBJPROP_BACK, true);
} else {
ObjectSetDouble(0, name, OBJPROP_PRICE1, price);
ObjectSetDouble(0, name, OBJPROP_PRICE2, price);
ObjectSetInteger(0, name, OBJPROP_TIME1, timeStart);
}
// Draw Text Label
string lblName = name + "_lbl";
if(ObjectFind(0, lblName) < 0) {
ObjectCreate(0, lblName, OBJ_TEXT, 0, timeStart, price);
ObjectSetString(0, lblName, OBJPROP_TEXT, " " + label);
ObjectSetInteger(0, lblName, OBJPROP_COLOR, clr);
ObjectSetInteger(0, lblName, OBJPROP_FONTSIZE, 8);
} else {
ObjectSetDouble(0, lblName, OBJPROP_PRICE1, price);
ObjectSetInteger(0, lblName, OBJPROP_TIME1, timeStart);
}
}Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
Re: London open: the 12-minute checklist I actually run (not the Instagram one)
MetaTrader 5 (MQL5) Version
Instructions: Open MT5, press F4 to open MetaEditor. Click New -> Custom Indicator, name it "LondonPrep", and paste this code over everything. Click Compile.
Instructions: Open MT5, press F4 to open MetaEditor. Click New -> Custom Indicator, name it "LondonPrep", and paste this code over everything. Click Compile.
Code: Select all
//+------------------------------------------------------------------+
//| LondonPrep_12Min.mq5|
//+------------------------------------------------------------------+
#property copyright "Pro Trading Checklist"
#property link ""
#property version "1.00"
#property indicator_chart_window
#property indicator_plots 0
//--- Inputs
input string Grp1 = "--- Checklist HUD ---";
input bool ShowHUD = true;
input color ColorHeader = clrDodgerBlue;
input color ColorText = clrSilver;
input color ColorWarning = clrRed;
input string Grp2 = "--- Liquidity Map ---";
input bool ShowLines = true;
input int AsianStartHour = 0; // Broker time
input int AsianEndHour = 8; // Broker time
input color ColorPDH = clrGray;
input color ColorAsia = clrRoyalBlue;
//--- Global Variables
string hudLines[6] = {
"LONDON PREP (12M)",
"0-3m: Risk | Stops, News, Max",
"3-6m: HTF | H1 Bias, M15 Lvl",
"6-9m: Liq | PDH/PDL, Asian H/L",
"9-12m: Exec | A+ Pair, Alt, Hotkeys",
"IF CHAOS -> Half Size or Flat"
};
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit() {
if(ShowHUD) {
for(int i = 0; i < 6; i++) {
string name = "Prep_HUD_" + IntegerToString(i);
ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_RIGHT_UPPER);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, 20);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, 20 + (i * 18));
ObjectSetString(0, name, OBJPROP_TEXT, hudLines[i]);
ObjectSetString(0, name, OBJPROP_FONT, "Arial");
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 9);
if(i == 0) ObjectSetInteger(0, name, OBJPROP_COLOR, ColorHeader);
else if(i == 5) ObjectSetInteger(0, name, OBJPROP_COLOR, ColorWarning);
else ObjectSetInteger(0, name, OBJPROP_COLOR, ColorText);
}
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
ObjectsDeleteAll(0, "Prep_");
}
//+------------------------------------------------------------------+
//| 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[]) {
if(!ShowLines || rates_total < 100) return(rates_total);
// 1. Calculate Prior Day High/Low
double pHigh[], pLow[];
datetime pTime[];
ArraySetAsSeries(pHigh, true); ArraySetAsSeries(pLow, true); ArraySetAsSeries(pTime, true);
if(CopyHigh(Symbol(), PERIOD_D1, 1, 1, pHigh) <= 0) return 0;
if(CopyLow(Symbol(), PERIOD_D1, 1, 1, pLow) <= 0) return 0;
if(CopyTime(Symbol(), PERIOD_D1, 0, 1, pTime) <= 0) return 0;
DrawLevel("Prep_PDH", "PDH", pHigh[0], pTime[0], ColorPDH, STYLE_DASH);
DrawLevel("Prep_PDL", "PDL", pLow[0], pTime[0], ColorPDH, STYLE_DASH);
// 2. Calculate Asian Session High/Low
double asiaH = 0.0;
double asiaL = 999999.0;
datetime asiaStart = 0;
MqlDateTime dt;
for(int i = rates_total - 1; i >= 0; i--) {
if(time[i] < pTime[0]) break; // Stop at start of today
TimeToStruct(time[i], dt);
bool inSession = false;
if(AsianStartHour < AsianEndHour) {
if(dt.hour >= AsianStartHour && dt.hour < AsianEndHour) inSession = true;
} else { // Crosses midnight
if(dt.hour >= AsianStartHour || dt.hour < AsianEndHour) inSession = true;
}
if(inSession) {
if(high[i] > asiaH) asiaH = high[i];
if(low[i] < asiaL) asiaL = low[i];
asiaStart = pTime[0]; // Anchor text to start of day to keep chart clean
}
}
if(asiaH > 0 && asiaL < 999999.0 && asiaStart > 0) {
DrawLevel("Prep_AsiaH", "Asia H", asiaH, asiaStart, ColorAsia, STYLE_DOT);
DrawLevel("Prep_AsiaL", "Asia L", asiaL, asiaStart, ColorAsia, STYLE_DOT);
}
return(rates_total);
}
//+------------------------------------------------------------------+
//| Helper Function: Draw Dynamic Level |
//+------------------------------------------------------------------+
void DrawLevel(string name, string label, double price, datetime timeStart, color clr, int style) {
if(ObjectFind(0, name) < 0) {
ObjectCreate(0, name, OBJ_TREND, 0, timeStart, price, timeStart + 3600, price);
ObjectSetInteger(0, name, OBJPROP_RAY_RIGHT, true);
ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
ObjectSetInteger(0, name, OBJPROP_STYLE, style);
ObjectSetInteger(0, name, OBJPROP_BACK, true);
} else {
ObjectSetDouble(0, name, OBJPROP_PRICE, 0, price);
ObjectSetDouble(0, name, OBJPROP_PRICE, 1, price);
ObjectSetInteger(0, name, OBJPROP_TIME, 0, timeStart);
}
string lblName = name + "_lbl";
if(ObjectFind(0, lblName) < 0) {
ObjectCreate(0, lblName, OBJ_TEXT, 0, timeStart, price);
ObjectSetString(0, lblName, OBJPROP_TEXT, " " + label);
ObjectSetInteger(0, lblName, OBJPROP_COLOR, clr);
ObjectSetInteger(0, lblName, OBJPROP_FONTSIZE, 8);
} else {
ObjectSetDouble(0, lblName, OBJPROP_PRICE, 0, price);
ObjectSetInteger(0, lblName, OBJPROP_TIME, 0, timeStart);
}
}Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.