Power Multiplier Levels (PML) Indicator for MT5 – Complete Guide and Explanation

In 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.

Power Multiplier Levels (PML) Indicator for MT5


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.

Best use: XAUUSD (Gold), EURUSD, GBPUSD, USDJPY, and other forex pairs.

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

  1. Choose the important H1 candle.
  2. Set mode to SELL.
  3. Use the upward maroon levels as resistance zones.
  4. Look for bearish confirmation near the levels.

For BUY Setup

  1. Set mode to BUY.
  2. Use the downward green levels as support zones.
  3. 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.