Power Multiplier Levels (PML) Indicator for MT5 – Complete Guide and Explanation
Friday, August 14, 2026In this article I will explain the functionality and working logic of my custom MetaTrader 5 indicator called Power Multiplier Levels (PML). This indicator is designed to generate multiple horizontal price levels from a selected H1 candle using a mathematical multiplier. The generated levels can be used as potential support, resistance, expansion, target, and reaction zones.
Unlike traditional indicators such as Moving Averages, RSI, or MACD, this indicator does not calculate momentum or trend strength. Instead, it projects future price levels from a specific candle using predefined multiplication formulas for each trading instrument.
What Is the Purpose of This Indicator?
The main objective of the PML indicator is to help traders identify structured price levels above and below a selected reference candle. The indicator automatically draws a series of horizontal lines based on a mathematical multiplier that is specific to the chosen symbol.
The indicator can be used for:
- Intraday trading
- Swing trading
- Gold trading (XAUUSD)
- Target projection
- Support and resistance mapping
- Reaction zone analysis
How the Indicator Works
The indicator starts by finding a specific H1 candle using the date and time inputs:
TargetYear TargetMonth TargetDay TargetHour TargetMinute
Once the candle is found, the indicator extracts two base prices:
- firstHigh – the base for downward projections
- firstLow – the base for upward projections
These values can be taken from:
- The candle High/Low
- The candle Open/Close range
Buy, Sell, or Both Modes
The indicator provides three operating modes:
BUYSELL BUY SELL
BUYSELL
Draws both upward and downward levels.
BUY
Draws only the downward projection levels from the selected high.
SELL
Draws only the upward projection levels from the selected low.
Symbol-Specific Multipliers
One of the unique features of this indicator is that each instrument has its own predefined multiplier.
EURUSD = 1.00512148471 GBPUSD = 1.00701748471 USDJPY = 100.701748471 XAUUSD = 1.0084149257
For upward projections:
price = price * Multiplier
For downward projections:
price = price / Multiplier
This creates a geometric expansion and contraction of price levels rather than a fixed pip distance.
Example on XAUUSD
Suppose the selected candle has:
High = 3400.00 Low = 3380.00 Multiplier = 1.0084149257
Upward Levels
Level 1 = 3380 × 1.0084149257 = 3408.44 Level 2 = 3408.44 × 1.0084149257 = 3437.12 Level 3 = 3437.12 × 1.0084149257 = 3466.03
Downward Levels
Level 1 = 3400 ÷ 1.0084149257 = 3371.63 Level 2 = 3371.63 ÷ 1.0084149257 = 3343.49 Level 3 = 3343.49 ÷ 1.0084149257 = 3315.59
These levels are automatically drawn on the chart.
Choosing the Base Candle
The indicator searches all H1 candles and compares their date and time with the target inputs.
if (t.year == TargetYear &&
t.mon == TargetMonth &&
t.day == TargetDay &&
t.hour == TargetHour &&
t.min == TargetMinute)
When the candle is found, the base prices are stored and used for all calculations.
Base High and Base Low Options
Highest / Lowest
Uses the actual candle high and low.
firstHigh = iHigh(...) firstLow = iLow(...)
HighOpenClose / LowOpenClose
Uses the candle body instead of the wick.
For bullish candles:
firstHigh = Close firstLow = Open
For bearish candles:
firstHigh = Open firstLow = Close
This is useful for traders who want levels based on the candle body rather than extreme spikes.
Deviation Feature
The indicator includes an optional deviation calculation.
input double Deviation = 0.0;
When the value is not zero, additional gray lines are drawn.
For upward levels:
dev = price * Deviation;
For downward levels:
dev = price / Deviation;
These can be used as secondary target zones or reaction buffers.
Visual Appearance
The indicator draws:
- Maroon lines for upward levels
- Green lines for downward levels
- Gray lines for deviation levels
Every line also receives a text label showing the exact price.
DoubleToString(price, _Digits)
Why Horizontal Lines?
Horizontal levels are easy to read and remain fixed while new candles form. This makes them very practical for:
- Take profit placement
- Stop loss planning
- Breakout confirmation
- Reversal observation
Practical Trading Workflow
For SELL Setup
- Choose the important H1 candle.
- Set mode to SELL.
- Use the upward maroon levels as resistance zones.
- Look for bearish confirmation near the levels.
For BUY Setup
- Set mode to BUY.
- Use the downward green levels as support zones.
- Wait for bullish confirmation before entering.
Suggested Settings for Gold (XAUUSD)
ChooseBuySell = BUYSELL ChooseRumus = XAUUSD ChooseBaseHigh = Highest ChooseBaseLow = Lowest Deviation = 0.0
Select the first H1 candle of the trading session that you want to analyze.
Advantages of the Indicator
- Very lightweight
- No repainting
- Works on any MT5 chart
- Clear visual levels
- Customizable colors
- Body-based or wick-based calculation
- Suitable for manual trading and algorithmic analysis
Limitations
This indicator is not a complete trading system. It does not provide:
- Buy/sell signals
- Trend detection
- Risk management
- Automatic trade execution
The levels should be combined with price action, market structure, volume, or other confirmation tools.
Who Should Use This Indicator?
This indicator is especially useful for:
- Gold traders
- Forex intraday traders
- Support/resistance traders
- Session breakout traders
- Traders who prefer objective price levels
Conclusion
The Power Multiplier Levels (PML) MT5 Indicator is a unique price-projection tool that generates structured horizontal levels from a selected H1 candle using instrument-specific mathematical multipliers.
Instead of relying on lagging indicators, this approach focuses on predefined price geometry. The indicator can help traders map potential support and resistance zones, project targets, and organize market structure in a clean and objective way.
For best results, combine the PML levels with:
- Market structure
- Break of structure (BOS)
- Liquidity zones
- Candlestick confirmation
- Session analysis
I personally use this indicator as a framework for identifying high-probability reaction areas on XAUUSD and major forex pairs. Because the calculations are deterministic and non-repainting, the levels remain stable and easy to evaluate during live trading.
If you want to improve the indicator further, you can add alerts, automatic session detection, multi-timeframe support, or dynamic level extensions.
Full Source Code
#property indicator_chart_window
#property indicator_plots 0
#property strict
enum TheBuySell {
BUYSELL,
BUY,
SELL,
};
input TheBuySell ChooseBuySell = BUYSELL;
enum TheRumus {
AUDUSD, // 1.00612148471 AUDUSD
EURGBP, // 1.0034149257 EURGBP
EURJPY, // 100.612148471 EURJPY
EURUSD, // 1.00512148471 EURUSD
GBPAUD, // 1.0084149257 GBPAUD
GBPJPY, // 100.84149257 GBPJPY
GBPUSD, // 1.00701748471 GBPUSD
NZDUSD, // 1.0068149257 NZDUSD
USDJPY, // 100.701748471 USDJPY
XAUUSD, // 1.0084149257 XAUUSD
};
input TheRumus ChooseRumus = XAUUSD;
input int TargetYear = 2026;
input int TargetMonth = 8;
input int TargetDay = 10;
input int TargetHour = 1;
input int TargetMinute = 0;
input double Deviation = 0.0;
input color UpperColor = clrMaroon;
input color LowerColor = clrGreen;
input color DeviationColor = clrGray;
enum TheBaseHigh {
Highest,
HighOpenClose,
};
input TheBaseHigh ChooseBaseHigh = Highest;
enum TheBaseLow {
Lowest,
LowOpenClose,
};
input TheBaseLow ChooseBaseLow = Lowest;
int NumLines = 9;
// Adjust according to broker server time
//input int ServerToJakartaOffsetHours = 0;
double firstHigh, firstLow, Multiplier;
int OnInit() {
DrawLevels();
return (INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
ObjectsDeleteAll(0, "PML_");
}
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[]) {
return (rates_total);
}
void DrawLevels() {
ObjectsDeleteAll(0, "PML_");
if (!GetTargetCandle()) {
Print("Target candle not found.");
return;
}
if(ChooseBuySell == BUYSELL || ChooseBuySell == SELL) {
DrawLine("PML_BASE_UP", firstLow, UpperColor);
DrawText("PML_TEXT_BASE_UP", firstLow, UpperColor);
}
if(ChooseBuySell == BUYSELL || ChooseBuySell == BUY) {
DrawLine("PML_BASE_DOWN", firstHigh, LowerColor);
DrawText("PML_TEXT_BASE_DOWN", firstHigh, LowerColor);
}
double price;
double dev;
switch(ChooseRumus) {
case AUDUSD: Multiplier = 1.00612148471; break;
case EURGBP: Multiplier = 1.0034149257; break;
case EURJPY: Multiplier = 100.612148471; break;
case EURUSD: Multiplier = 1.00512148471; break;
case GBPAUD: Multiplier = 1.0084149257; break;
case GBPJPY: Multiplier = 100.84149257; break;
case GBPUSD: Multiplier = 1.00701748471; break;
case NZDUSD: Multiplier = 1.0068149257; break;
case USDJPY: Multiplier = 100.701748471; break;
case XAUUSD: Multiplier = 1.0084149257; break;
}
if(ChooseBuySell == BUYSELL || ChooseBuySell == SELL) {
// UP
price = firstLow;
for (int i = 1; i <= NumLines; i++) {
price *= Multiplier;
DrawLine("PML_UP_" + IntegerToString(i), price, UpperColor);
DrawText("PML_UP_TXT_" + IntegerToString(i), price, UpperColor);
if (Deviation != 0) {
dev = price * Deviation;
DrawLine("PML_DEV_UP_" + IntegerToString(i), dev, DeviationColor);
DrawText("PML_DEV_UP_TXT_" + IntegerToString(i), dev, DeviationColor);
}
}
}
if(ChooseBuySell == BUYSELL || ChooseBuySell == BUY) {
// DOWN
price = firstHigh;
for (int i = 1; i <= NumLines; i++) {
price /= Multiplier;
DrawLine("PML_DOWN_" + IntegerToString(i), price, LowerColor);
DrawText("PML_DOWN_TXT_" + IntegerToString(i), price, LowerColor);
if (Deviation != 0) {
dev = price / Deviation;
DrawLine("PML_DEV_DOWN_" + IntegerToString(i), dev, DeviationColor);
DrawText("PML_DEV_DOWN_TXT_" + IntegerToString(i), dev, DeviationColor);
}
}
}
}
bool GetTargetCandle() {
int bars = iBars(_Symbol, PERIOD_H1);
for (int i = 0; i < bars; i++) {
datetime serverTime = iTime(_Symbol, PERIOD_H1, i);
MqlDateTime t;
TimeToStruct(serverTime, t);
if (t.year == TargetYear &&
t.mon == TargetMonth &&
t.day == TargetDay &&
t.hour == TargetHour &&
t.min == TargetMinute) {
if(ChooseBaseHigh == Highest) {
firstHigh = iHigh(_Symbol, PERIOD_H1, i);
} else {
if(iClose(_Symbol, PERIOD_H1, i) > iOpen(_Symbol, PERIOD_H1, i)) {
firstHigh = iClose(_Symbol, PERIOD_H1, i);
} else {
firstHigh = iOpen(_Symbol, PERIOD_H1, i);
}
}
if(ChooseBaseLow == Lowest) {
firstLow = iLow(_Symbol, PERIOD_H1, i);
} else {
if(iClose(_Symbol, PERIOD_H1, i) > iOpen(_Symbol, PERIOD_H1, i)) {
firstLow = iOpen(_Symbol, PERIOD_H1, i);
} else {
firstLow = iClose(_Symbol, PERIOD_H1, i);
}
}
return (true);
}
}
return (false);
}
void DrawLine(string name, double price, color clr) {
ObjectCreate(0, name, OBJ_HLINE, 0, 0, price);
ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
ObjectSetInteger(0, name, OBJPROP_WIDTH, 1);
ObjectSetInteger(0, name, OBJPROP_BACK, true);
ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_SOLID);
}
void DrawText(string name, double price, color clr) {
datetime t = iTime(_Symbol, _Period, 0);
ObjectCreate(0, name, OBJ_TEXT, 0, t, price);
ObjectSetString(0, name, OBJPROP_TEXT, DoubleToString(price, _Digits));
ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
}
Thank you for reading this article. Feel free to test the indicator on a demo account first and adapt the settings to your broker and trading session.
