Advertisement IC Markets

🤫 The "Momentum Pivot": A High-Probability Secret for Scalping Success

Optimize MetaTrader 4, MetaTrader 5, cTrader, and TradingView for speed. Discuss Level II Market Depth (DOM), custom hotkeys, and volume indicators.
Post Reply
PTScalper
Site Admin
Posts: 3349
Joined: Mon Jul 20, 2026 1:28 pm

🤫 The "Momentum Pivot": A High-Probability Secret for Scalping Success

Post by PTScalper »

Are you tired of getting "chopped up" by market noise while trying to catch quick pips? Most beginner scalpers fail because they enter trades too early or rely on a single indicator. To master forex scalping, you need a multi-layered confirmation system that filters out the noise and targets high-probability moves.

Today, I’m sharing a "secret" logic used by many professional scalpers: The Dual-Filter Momentum Pivot.

The Setup
To execute this strategy effectively, set up your charts with the following parameters:

Timeframe: 1-Minute (M1) or 5-Minute (M5).
Indicators: 9 EMA (Exponential Moving Average), 21 EMA, and the RSI (Relative Strength Index) set to period 14.
The "Secret" Strategy Logic
The secret isn't just in the indicators; it’s in the confluence. You are looking for a "Momentum Pivot" where three conditions align:

The Cross: The 9 EMA must cross the 21 EMA. (This indicates a shift in short-term trend).
The Zone: Price must be pulling back toward the 21 EMA but not breaking below it (in an uptrend) or above it (in a downtrend).
The RSI Trigger: This is your filter. For a Long, wait for the RSI to dip toward 40-50 and turn upward. For a Short, wait for the RSI to rise toward 60-70 and turn downward.
Entry & Exit Rules
Entry: Enter only when the EMA cross occurs AND the RSI confirms momentum is shifting in your favor. This prevents you from "buying the top" or "selling the bottom."
Stop Loss (SL): Place your SL just above/below the recent swing high/low or the 21 EMA.
Take Profit (TP): Aim for a 1:1.5 or 1:2 Risk-to-Reward ratio. In scalping, consistency is king!
Why it works
By combining Moving Averages (trend), Price Action (pullbacks), and RSI (momentum), you eliminate "fakeouts." You aren't just gambling on a candle; you are trading a confirmed shift in market energy.

Have you tried this confluence? Drop your thoughts or screenshots of your results below! 👇

#ForexScalping #TradingStrategy #DayTrading #ForexSignals #TechnicalAnalysis #ScalpingTips
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
Recommended broker for automated trading & scalping IC Markets
PTScalper
Site Admin
Posts: 3349
Joined: Mon Jul 20, 2026 1:28 pm

Re: 🤫 The "Momentum Pivot": A High-Probability Secret for Scalping Success

Post by PTScalper »

How to use this:
1) Open your MT4 Terminal.
2) Go to File -> Open Data Folder.
3) Navigate to MQL4 -> Experts or Indicators.
4) Create a new file named MomentumPivot_Indicator.mq4 and paste the code below into the MetaEditor.
//+------------------------------------------------------------------+
//| MomentumPivot_Alert.mq4|
//| Copyright 2023, Trading Forum |
//| Custom Indicator for Scalping|
//+------------------------------------------------------------------+
#property copyright "YourForumName"
#property link "http://yourforumlink.com"
#property version "1.00"
#property strict

//--- Indicator Settings
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2

// Plot Arrows
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrLime
#property indicator_width1 2
#property indicator_label1 "Buy Signal"

#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrRed
#property indicator_width2 2
#property indicator_label2 "Sell Signal"

//--- Input Parameters
input int FastEMA_Period = 9; // Fast EMA Period (Short Term)
input int SlowEMA_Period = 21; // Slow EMA Period (Trend Filter)
input int RSI_Period = 14; // RSI Period
input int RSI_UpperLimit = 60; // Upper Threshold for Sell setup
input int RSI_LowerLimit = 40; // Lower Threshold for Buy setup
input double ProximityPips = 2.5; // How close price must be to Slow EMA (in pips)

//--- Buffers
double BuyBuffer[];
double SellBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
SetIndexBuffer(0, BuyBuffer);
SetIndexArrow(0, 233); // Arrow Up symbol

SetIndexBuffer(1, SellBuffer);
SetIndexArrow(1, 234); // Arrow Down symbol

Indicator_Name = "Momentum Pivot Tool";
return(INIT_SUCCESS);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration |
//+------------------------------------------------------------------+
int OnCalculate(const int &shifted, const int &prev_shifted, const int &prev_calculated)
{
int limit = ItemsInHistorySize;
if(prev_calculated == 0) limit = Bars - 1;

for(int i=limit; i>=0; i--)
{
// Fetch Indicator Values
double fastEMA = iMA(NULL, 0, FastEMA_Period, 0, MODE_EMA, PRICE_CLOSE, i);
double slowEMA = iMA(NULL, 0, SlowEMA_Period, 0, MODE_EMA, PRICE_CLOSE, i);
double rsiValue = iRSI(NULL, 0, RSI_Period, PRICE_CLOSE, i);
double currentPrice = Close;

// Check Proximity (Convert Pips to Points based on digits)
double pointsAdjustment = Point * 10;
if(Digits == 3 || Digits == 5) pointsAdjustment = Point * 10;
else pointsAdjustment = Point;

bool isNearEMA = MathAbs(currentPrice - slowEMA) < (ProximityPips * 10 * Point);

// Logic for Buy Signal: Fast EMA > Slow EMA + RSI below threshold + Price near SL_EMA
if(fastEMA > slowEMA && rsiValue < RSI_LowerLimit && isNearEMA)
{
BuyBuffer = Low - (10 * Point); // Place arrow slightly below low

// Alert logic (only on the latest candle)
if(i == 0 && prev_calculated != 0) TriggerAlert("Buy Signal Detected!");
}
else BuyBuffer = EMPTY_VALUE;

// Logic for Sell Signal: Fast EMA < Slow EMA + RSI above threshold + Price near SL_EMA
if(fastEMA < slowEMA && rsiValue > RSI_UpperLimit && isNearEMA)
{
SellBuffer = High + (10 * Point); // Place arrow slightly above high

// Alert logic (only on the latest candle)
if(i == 0 && prev_calculated != 0) TriggerAlert("Sell Signal Detected!");
}
else SellBuffer = EMPTY_VALUE;
}

return(rates_total);
}

void TriggerAlert(string message)
{
static datetime lastAlert = 0;
if(Time[0] != lastAlert)
{
Alert(message, " on ", Symbol());
SendNotification(message); // Sends alert to mobile phone if configured
lastAlert = Time[0];
}
}

// Helper for calculation
int ItemsInHistorySize() { return Bars; }


"Don't just trade every arrow! The best trades occur when the 'Momentum Pivot' arrow appears near a major Support or Resistance zone. Use the indicator as a filter to find high-probability entries!"

Take a care, if you will try it, let me know, how it works for you :-)
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: 🤫 The "Momentum Pivot": A High-Probability Secret for Scalping Success

Post by PTScalper »

Hi traders/scalpers,

i have made some refactoring of this code to make it even better at Pro Level.

What makes this version "Pro":

Compilation & Syntax Fixes: Fixed the incorrect OnCalculate signature, added missing array indices to the buffers and price data (e.g., BuyBuffer instead of BuyBuffer), and replaced the invalid Indicator_Name variable.

Repaint Protection (Crucial):

Added an option to trigger alerts only on closed bars (Bar 1). The original script triggered alerts on Bar 0, which means signals would flash on and off (repaint) as the live price moved, causing false alerts.

Performance Optimization:

Implemented correct rates_total - prev_calculated logic. The original script checked too much history. This version only calculates new data, dramatically reducing CPU load.

Dynamic Pip Calculation:

Evaluates _Digits correctly in OnInit() once, rather than running the math on every single tick.

Alert System Upgrade: Added discrete toggles for Popups, Push Notifications, and Emails.

The Upgraded Pro MQL4 Code

Code: Select all

//+------------------------------------------------------------------+
//|                                          MomentumPivot_Alert.mq4 |
//|                                      Upgraded to Pro Level (MT4) |
//+------------------------------------------------------------------+
#property copyright   "YourForumName"
#property link        "http://yourforumlink.com"
#property version     "2.00"
#property strict
#property description "Professional Momentum Pivot Indicator"
#property description "Includes non-repainting alerts & dynamic pip sizing."

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2

//--- Plot Settings: Buy Signal
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrLime
#property indicator_width1  2
#property indicator_label1  "Buy Signal"

//--- Plot Settings: Sell Signal
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrRed
#property indicator_width2  2
#property indicator_label2  "Sell Signal"

//--- Enums for User Interface
enum ENUM_SIGNAL_BAR {
    SIGNAL_CLOSED_BAR = 1,  // Confirmed Signal (Bar 1 - Recommended)
    SIGNAL_CURRENT_BAR = 0  // Repainting Signal (Bar 0 - Live)
};

//--- Input Parameters ---
sinput string  sec1 = "--- Indicator Settings ---";
input int      FastEMA_Period = 9;       // Fast EMA Period
input int      SlowEMA_Period = 21;      // Slow EMA Period
input int      RSI_Period     = 14;      // RSI Period
input int      RSI_UpperLimit = 60;      // RSI Upper Threshold (Sell)
input int      RSI_LowerLimit = 40;      // RSI Lower Threshold (Buy)
input double   ProximityPips  = 2.5;     // Distance to Slow EMA (in Pips)

sinput string  sec2 = "--- Alert Settings ---";
input ENUM_SIGNAL_BAR AlertBar= SIGNAL_CLOSED_BAR; // Alert Trigger Candle
input bool     EnableAlerts   = true;    // Enable Pop-up Alerts
input bool     EnablePush     = true;    // Enable Push Notifications
input bool     EnableEmail    = false;   // Enable Email Alerts

//--- Buffers
double BuyBuffer[];
double SellBuffer[];

//--- Global Variables
double pipMultiplier;
datetime lastAlertTime;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
    // Buffer Assignments
    SetIndexBuffer(0, BuyBuffer);
    SetIndexStyle(0, DRAW_ARROW);
    SetIndexArrow(0, 233); // Up Arrow
    SetIndexEmptyValue(0, EMPTY_VALUE);

    SetIndexBuffer(1, SellBuffer);
    SetIndexStyle(1, DRAW_ARROW);
    SetIndexArrow(1, 234); // Down Arrow
    SetIndexEmptyValue(1, EMPTY_VALUE);

    // Indicator Short Name
    string shortName = StringFormat("Momentum Pivot (%d/%d, RSI:%d)", FastEMA_Period, SlowEMA_Period, RSI_Period);
    IndicatorShortName(shortName);

    // Dynamic Pip Calculation (Handles 3/5 digit brokers)
    pipMultiplier = (_Digits == 3 || _Digits == 5) ? _Point * 10 : _Point;

    return(INIT_SUCCESS);
}

//+------------------------------------------------------------------+
//| 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[])
{
    // Wait until enough bars exist
    if(rates_total < SlowEMA_Period) return(0);

    // Determine how many bars to calculate (Optimization)
    int limit = rates_total - prev_calculated;
    if(limit > 1) {
        limit = rates_total - 1;
        ArrayInitialize(BuyBuffer, EMPTY_VALUE);
        ArrayInitialize(SellBuffer, EMPTY_VALUE);
    }

    // Main calculation loop
    for(int i = limit; i >= 0; i--)
    {
        // Fetch Indicator Values
        double fastEMA = iMA(Symbol(), 0, FastEMA_Period, 0, MODE_EMA, PRICE_CLOSE, i);
        double slowEMA = iMA(Symbol(), 0, SlowEMA_Period, 0, MODE_EMA, PRICE_CLOSE, i);
        double rsiValue= iRSI(Symbol(), 0, RSI_Period, PRICE_CLOSE, i);

        // Check Proximity
        double proximityDiff = MathAbs(close[i] - slowEMA);
        bool isNearEMA = proximityDiff <= (ProximityPips * pipMultiplier);

        // Reset buffers for current bar
        BuyBuffer[i]  = EMPTY_VALUE;
        SellBuffer[i] = EMPTY_VALUE;

        // Logic for Buy Signal
        if(fastEMA > slowEMA && rsiValue < RSI_LowerLimit && isNearEMA)
        {
            BuyBuffer[i] = low[i] - (10 * pipMultiplier); // Place arrow below low
        }

        // Logic for Sell Signal
        if(fastEMA < slowEMA && rsiValue > RSI_UpperLimit && isNearEMA)
        {
            SellBuffer[i] = high[i] + (10 * pipMultiplier); // Place arrow above high
        }
    }

    //--- Alert Logic ---
    if(EnableAlerts || EnablePush || EnableEmail)
    {
        int bar = (int)AlertBar; // Uses 1 (Closed) or 0 (Current)

        // Ensure we don't alert on historical load, and don't spam the same bar
        if(prev_calculated > 0 && time[bar] != lastAlertTime)
        {
            if(BuyBuffer[bar] != EMPTY_VALUE)
            {
                TriggerAlert("BUY", time[bar]);
            }
            else if(SellBuffer[bar] != EMPTY_VALUE)
            {
                TriggerAlert("SELL", time[bar]);
            }
        }
    }

    return(rates_total);
}

//+------------------------------------------------------------------+
//| Custom Alert Trigger Function                                    |
//+------------------------------------------------------------------+
void TriggerAlert(string signalType, datetime triggerTime)
{
    string message = StringFormat("Momentum Pivot [%s]: %s Signal @ %g", Symbol(), signalType, Close[0]);

    if(EnableAlerts) Alert(message);
    if(EnablePush)   SendNotification(message);
    if(EnableEmail)  SendMail("Momentum Pivot Signal", message);

    // Record the time to prevent duplicate alerts for this specific candle
    lastAlertTime = triggerTime;
}
//+------------------------------------------------------------------+
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: 🤫 The "Momentum Pivot": A High-Probability Secret for Scalping Success

Post by PTScalper »

Key Changes to Understand:

The sinput Keyword:

Notice sinput string sec1 = .... The sinput keyword creates a read-only variable in the indicator settings menu. Pro developers use these as visual headers to divide settings menus into sections.

The Alert Logic Placement:

Alerts are now placed entirely outside the for() loop. Running an alert check inside the historical loop (even conditionally) is dangerous and can cause terminal lag.

The ArrayInitialize Function:

When you first load the indicator, or if connection is lost and restored, prev_calculated goes to 0 and limit becomes large. The script will now dump all old arrows (ArrayInitialize(...)) before redrawing them perfectly.
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: 🤫 The "Momentum Pivot": A High-Probability Secret for Scalping Success

Post by PTScalper »

Plus if you want to take it further i prepared Version 3 as well.

To take this from a "Pro" level to an "Elite/Institutional" level, we need to address the most common issues algorithmic traders face: Signal Spam (multiple arrows firing in a row), Bad Context (trading against the macro trend), and Static Visuals (arrows getting buried inside large candles on higher timeframes).

Here is the "V3 Elite" version.

What makes this version "Much More Better":

Dynamic ATR Arrow Placement: Instead of fixed pips (which look huge on the 1-Minute chart and invisible on the Daily chart), this version uses the Average True Range (ATR) to calculate exactly how far above/below the candle to place the arrow. It perfectly adapts to any timeframe.

Macro Trend Filter:

I've added an optional 200 EMA Trend Filter. The indicator will block Buy signals in a macro downtrend and block Sell signals in a macro uptrend, drastically increasing your win rate.

Anti-Spam Logic:

It now requires a "fresh" signal. If the price hovers near the EMA for 5 candles, you won't get 5 arrows in a row. It only prints the first valid setup.

On-Chart HUD (Heads Up Display):


It automatically generates a sleek, non-intrusive dashboard in the corner of your chart showing the live Trend, RSI value, and Proximity status in real-time.

Code: Select all

//+------------------------------------------------------------------+
//|                                     MomentumPivot_EliteAlert.mq4 |
//|                                  Upgraded to Institutional Level |
//+------------------------------------------------------------------+
#property copyright   "YourForumName"
#property link        "http://yourforumlink.com"
#property version     "3.00"
#property strict
#property description "Elite Momentum Pivot with ATR Placement, Trend Filtering, and HUD."

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2

//--- Plot Settings: Buy Signal
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrMediumSeaGreen
#property indicator_width1  2
#property indicator_label1  "Buy Signal"

//--- Plot Settings: Sell Signal
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrCrimson
#property indicator_width2  2
#property indicator_label2  "Sell Signal"

//--- Enums for User Interface
enum ENUM_SIGNAL_BAR {
    SIGNAL_CLOSED_BAR = 1,  // Confirmed Signal (Bar 1 - Recommended)
    SIGNAL_CURRENT_BAR = 0  // Repainting Signal (Bar 0 - Live)
};

//--- Input Parameters ---
sinput string  sec1 = "--- Core Strategy Settings ---";
input int      FastEMA_Period = 9;       // Fast EMA Period
input int      SlowEMA_Period = 21;      // Slow EMA Period
input int      RSI_Period     = 14;      // RSI Period
input int      RSI_UpperLimit = 60;      // RSI Upper Threshold (Sell)
input int      RSI_LowerLimit = 40;      // RSI Lower Threshold (Buy)
input double   ProximityPips  = 2.5;     // Distance to Slow EMA (in Pips)

sinput string  sec2 = "--- Elite Filters ---";
input bool     UseTrendFilter = true;    // Use Macro Trend Filter
input int      Trend_EMA      = 200;     // Macro Trend EMA Period
input bool     PreventSpam    = true;    // Prevent consecutive identical signals

sinput string  sec3 = "--- Visuals & Dashboard ---";
input double   ATR_Multiplier = 0.5;     // Arrow distance from candle (ATR based)
input bool     ShowHUD        = true;    // Show On-Chart Dashboard

sinput string  sec4 = "--- Alert Settings ---";
input ENUM_SIGNAL_BAR AlertBar= SIGNAL_CLOSED_BAR; // Alert Trigger Candle
input bool     EnableAlerts   = true;    // Enable Pop-up Alerts
input bool     EnablePush     = true;    // Enable Push Notifications
input bool     EnableEmail    = false;   // Enable Email Alerts

//--- Buffers & Globals
double BuyBuffer[];
double SellBuffer[];
double pipMultiplier;
datetime lastAlertTime;
int lastSignalDirection = 0; // 1 for Buy, -1 for Sell

//+------------------------------------------------------------------+
//| Initialization function                                          |
//+------------------------------------------------------------------+
int OnInit()
{
    SetIndexBuffer(0, BuyBuffer);
    SetIndexStyle(0, DRAW_ARROW);
    SetIndexArrow(0, 233); // Up Arrow
    SetIndexEmptyValue(0, EMPTY_VALUE);

    SetIndexBuffer(1, SellBuffer);
    SetIndexStyle(1, DRAW_ARROW);
    SetIndexArrow(1, 234); // Down Arrow
    SetIndexEmptyValue(1, EMPTY_VALUE);

    IndicatorShortName("Elite Pivot HUD");
    pipMultiplier = (_Digits == 3 || _Digits == 5) ? _Point * 10 : _Point;

    return(INIT_SUCCESS);
}

//+------------------------------------------------------------------+
//| De-Initialization function (Clean up chart)                      |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
    ObjectsDeleteAll(0, "HUD_"); // Remove dashboard when indicator is removed
}

//+------------------------------------------------------------------+
//| 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(rates_total < Trend_EMA) return(0); // Wait for enough data

    int limit = rates_total - prev_calculated;
    if(limit > 1) {
        limit = rates_total - 1;
        ArrayInitialize(BuyBuffer, EMPTY_VALUE);
        ArrayInitialize(SellBuffer, EMPTY_VALUE);
        lastSignalDirection = 0; 
    }

    // Main historical and live loop
    for(int i = limit; i >= 0; i--)
    {
        // 1. Fetch Indicators
        double fastEMA  = iMA(Symbol(), 0, FastEMA_Period, 0, MODE_EMA, PRICE_CLOSE, i);
        double slowEMA  = iMA(Symbol(), 0, SlowEMA_Period, 0, MODE_EMA, PRICE_CLOSE, i);
        double trendEMA = iMA(Symbol(), 0, Trend_EMA, 0, MODE_EMA, PRICE_CLOSE, i);
        double rsiValue = iRSI(Symbol(), 0, RSI_Period, PRICE_CLOSE, i);
        double atrValue = iATR(Symbol(), 0, 14, i); // Used for dynamic arrow placement

        // 2. Logic & Filters
        bool isNearEMA = MathAbs(close[i] - slowEMA) <= (ProximityPips * pipMultiplier);
        
        bool trendBullish = (!UseTrendFilter || close[i] > trendEMA);
        bool trendBearish = (!UseTrendFilter || close[i] < trendEMA);

        BuyBuffer[i]  = EMPTY_VALUE;
        SellBuffer[i] = EMPTY_VALUE;

        // 3. Buy Signal Calculation
        if(fastEMA > slowEMA && rsiValue < RSI_LowerLimit && isNearEMA && trendBullish)
        {
            if(!PreventSpam || lastSignalDirection != 1) 
            {
                BuyBuffer[i] = low[i] - (atrValue * ATR_Multiplier); // Dynamic distance
                lastSignalDirection = 1;
            }
        }

        // 4. Sell Signal Calculation
        if(fastEMA < slowEMA && rsiValue > RSI_UpperLimit && isNearEMA && trendBearish)
        {
            if(!PreventSpam || lastSignalDirection != -1) 
            {
                SellBuffer[i] = high[i] + (atrValue * ATR_Multiplier); // Dynamic distance
                lastSignalDirection = -1;
            }
        }
    }

    //--- Draw HUD on live bar ---
    if(ShowHUD) UpdateHUD(close[0], iMA(Symbol(), 0, Trend_EMA, 0, MODE_EMA, PRICE_CLOSE, 0), iRSI(Symbol(), 0, RSI_Period, PRICE_CLOSE, 0));

    //--- Alert Logic ---
    if(EnableAlerts || EnablePush || EnableEmail)
    {
        int bar = (int)AlertBar; 
        if(prev_calculated > 0 && time[bar] != lastAlertTime)
        {
            if(BuyBuffer[bar] != EMPTY_VALUE) TriggerAlert("BUY", time[bar]);
            else if(SellBuffer[bar] != EMPTY_VALUE) TriggerAlert("SELL", time[bar]);
        }
    }

    return(rates_total);
}

//+------------------------------------------------------------------+
//| Helper: HUD Generation                                           |
//+------------------------------------------------------------------+
void UpdateHUD(double currentPrice, double trendEMA, double currentRSI)
{
    string trendText = (currentPrice > trendEMA) ? "BULLISH" : "BEARISH";
    color trendColor = (currentPrice > trendEMA) ? clrMediumSeaGreen : clrCrimson;
    if(!UseTrendFilter) { trendText = "DISABLED"; trendColor = clrDarkGray; }

    DrawLabel("HUD_Bg", 1, 15, "g", clrDarkSlateGray, 70, "Webdings");
    DrawLabel("HUD_Title", 1, 15, "Elite Momentum Pivot", clrWhite, 10, "Arial Bold");
    
    DrawLabel("HUD_Trend", 1, 35, "Macro Trend: " + trendText, trendColor, 9, "Arial");
    DrawLabel("HUD_RSI", 1, 50, StringFormat("Live RSI: %.1f", currentRSI), clrLightGray, 9, "Arial");
}

void DrawLabel(string name, int x, int y, string text, color clr, int size, string font)
{
    if(ObjectFind(0, name) < 0)
    {
        ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
        ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_RIGHT_UPPER); // Top Right
        ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x + 150);
        ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
    }
    ObjectSetString(0, name, OBJPROP_TEXT, text);
    ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
    ObjectSetInteger(0, name, OBJPROP_FONTSIZE, size);
    ObjectSetString(0, name, OBJPROP_FONT, font);
}

//+------------------------------------------------------------------+
//| Custom Alert Trigger Function                                    |
//+------------------------------------------------------------------+
void TriggerAlert(string signalType, datetime triggerTime)
{
    string message = StringFormat("Elite Pivot [%s - %s]: %s Signal @ %g", Symbol(), EnumToString((ENUM_TIMEFRAMES)Period()), signalType, Close[0]);

    if(EnableAlerts) Alert(message);
    if(EnablePush)   SendNotification(message);
    if(EnableEmail)  SendMail("Elite Pivot Alert", message);

    lastAlertTime = triggerTime;
}
//+------------------------------------------------------------------+
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: 🤫 The "Momentum Pivot": A High-Probability Secret for Scalping Success

Post by PTScalper »

Key Highlights of V3:

ATR_Multiplier:

By multiplying the ATR (volatility) by 0.5, the arrows will automatically float at the exact perfect distance from the candlestick tails, whether you are on the 1-Minute chart or the Weekly chart. No more arrows overlapping the price bars.

PreventSpam Logic:

It utilizes lastSignalDirection to memorize the last arrow printed. If it prints a Buy arrow, it will not print another Buy arrow until the trend shifts and a Sell setup occurs. This keeps the chart incredibly clean and prevents alert spam on your phone.

UpdateHUD():

Utilizing ObjectCreate() and the CORNER_RIGHT_UPPER constant, it draws a sleek textual interface in the top right corner of your chart showing you live metrics. It deletes itself cleanly when you remove the indicator via OnDeinit().
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
LondonScalper
Posts: 770
Joined: Sat Sep 05, 2026 7:54 am

Re: 🤫 The "Momentum Pivot": A High-Probability Secret for Scalping Success

Post by LondonScalper »

PTScalper wrote:You are looking for a "Momentum Pivot" where three conditions align: The Cross: The 9 EMA must cross the 21 EMA
Solid teaching frame — confluence beats a lonely cross. One London-desk caveat before anyone treats the three-filter stack as “secret.”

On M1 majors the 9/21 cross plus RSI confirmation still fires a lot in Asia leftover and late NY, where the move after the pivot is mostly spread and mean-reversion chop. I keep the same logic, but I gate it hard to London cash hours and I require the cross to hold for a closed candle, not a tick flirt.

Practical habit: size from structure beyond the 21, not from the RSI print. If the stop that makes the pivot “valid” eats too much of a realistic M-target after costs, I skip even when all three lights are green. The indicator can still alert; I do not have to answer.

Also worth checking fill quality on the first pullback after the cross — that is where a lot of “high-probability” tickets quietly die.

How do you handle the case when RSI is already extended at the moment of the EMA cross — still take it, or wait for a reset into the value zone?
Post Reply