lastmanstandingindicatorv11

Download script
Author: Copyright 2016, Jay Davis
lastmanstandingindicatorv11

This indicator is designed to help traders visualize key structural points in the market by identifying significant price "swings" and overarching trends. Instead of cluttering the chart with every minor price movement, it filters the data to highlight major turning points and provides a baseline for overall momentum.

Core Functionality

The script identifies four distinct types of price peaks (Highs) and valleys (Lows), categorized into two levels of significance:

  • Major Swings: These represent larger, more significant structural shifts in the market. They are identified by looking at a wider window of historical data to find prominent highs and lows that define the primary "skeleton" of the price action.
  • Minor Swings: These represent smaller, shorter-term fluctuations. By analyzing a narrower timeframe of data, the script picks out immediate local peaks and valleys, providing a clearer picture of short-term price movement between the major structural points.

Visual Identification

The tool displays these key points on your chart using specific markers:

  • Major Highs & Lows: These are highlighted with larger symbols to signal significant areas of interest or potential reversal zones.
  • Minor Highs & Lows: These appear as smaller markers, helping you track the immediate "breathing" of the market.

Trend Analysis

In addition to identifying these swing points, the script calculates and displays a Moving Average. This serves as a smoothed representation of price over a set period, allowing you to see the general direction of the market (bullish or bearish) at a glance.

By combining these elements, the tool allows a user to see both the "big picture" (the major swings and the moving average) and the "micro details" (the minor swings) simultaneously, making it easier to recognize how price is flowing relative to historical highs and lows.

Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
3 Views
0 Downloads
0 Favorites
lastmanstandingindicatorv11
//+------------------------------------------------------------------+
//|                                     LastManStandingIndicator.mq4 |
//|                                        Copyright 2016, Jay Davis |
//|                                         https://www.tidyneat.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Jay Davis"
#property link      "https://www.tidyneat.com"
#property version   "1.1"
#property strict
#property indicator_chart_window
#property indicator_buffers 5


extern color MajorSwingColor=clrPurple;
extern int MajorSwingSize=3;
extern int PeriodsInMajorSwing=13;

extern color MinorSwingColor=clrCornflowerBlue;
extern int MinorSwingSize=1;
extern int PeriodsInMinorSwing=5;

extern ENUM_MA_METHOD MovingAveragMethod=MODE_EMA;
extern int MovingAveragePeriods= 55;
extern color MovingAvergeColor = clrDarkGoldenrod;

extern color fiftyPercentLineColor=clrAliceBlue;

int lookBack=PeriodsInMajorSwing*2;

double majorSwingHigh[];
double minorSwingHigh[];
double majorSwingLow[];
double minorSwingLow[];
double EMA[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,majorSwingHigh);  //associates array with buffer
   SetIndexStyle(0,DRAW_ARROW,EMPTY,MajorSwingSize,MajorSwingColor);
   SetIndexArrow(0,108); // drawing wingding 108
   SetIndexLabel(0,"Major Swing High");

   SetIndexBuffer(1,minorSwingHigh);  //associates array with buffer
   SetIndexStyle(1,DRAW_ARROW,EMPTY,MinorSwingSize,MinorSwingColor);
   SetIndexArrow(1,108); // drawing wingding 108
   SetIndexLabel(1,"Minor Swing High");

   SetIndexBuffer(2,majorSwingLow);  //associates array with buffer
   SetIndexStyle(2,DRAW_ARROW,EMPTY,MajorSwingSize,MajorSwingColor);
   SetIndexArrow(2,108); // drawing wingding 108
   SetIndexLabel(2,"Major Swing Low");

   SetIndexBuffer(3,minorSwingLow);  //associates array with buffer
   SetIndexStyle(3,DRAW_ARROW,EMPTY,MinorSwingSize,MinorSwingColor);
   SetIndexArrow(3,108); // drawing wingding 108
   SetIndexLabel(3,"Minor Swing Low");

   SetIndexBuffer(4,EMA);  //associates array with buffer
   SetIndexStyle(4,DRAW_LINE,STYLE_SOLID,EMPTY,MovingAvergeColor);
   SetIndexLabel(4,"Moving Average");


//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {

   int limit;
   int counted_bars=IndicatorCounted();
//---- check for possible errors 
   if(counted_bars<0) return(-1);
//---- the last counted bar will be recounted 
//if(counted_bars>0) counted_bars--; 
   limit=Bars-counted_bars;
//---- main loop 
// First Run Through Rule
   if(counted_bars==0)
     {
      if(lookBack>=MovingAveragePeriods)
        {
         limit-=lookBack;
        }
      else
        {
         limit-=MovingAveragePeriods;
        }
     }


//---
   for(int i=1; i<limit; i++)
     {
      // Draw Moving Average
      EMA[i]=iMA(NULL,0,MovingAveragePeriods,0,MovingAveragMethod,PRICE_CLOSE,i);

      // Minor Swing High Logic
      if(iHighest(NULL,0,MODE_HIGH,PeriodsInMinorSwing*2,i)==i+PeriodsInMinorSwing)
        {
         minorSwingHigh[i+PeriodsInMinorSwing]=High[i+PeriodsInMinorSwing];
        }

      // Major Swing High Logic
      if(iHighest(NULL,0,MODE_HIGH,PeriodsInMajorSwing*2,i)==i+PeriodsInMajorSwing)
        {
         majorSwingHigh[i+PeriodsInMajorSwing]=High[i+PeriodsInMajorSwing];
        }

      // Minor Swing Low Logic
      if(iLowest(NULL,0,MODE_LOW,PeriodsInMinorSwing*2,i)==i+PeriodsInMinorSwing)
        {
         minorSwingLow[i+PeriodsInMinorSwing]=Low[i+PeriodsInMinorSwing];
        }

      // Major Swing Low Logic
      if(iLowest(NULL,0,MODE_LOW,PeriodsInMajorSwing*2,i)==i+PeriodsInMajorSwing)
        {
         majorSwingLow[i+PeriodsInMajorSwing]=Low[i+PeriodsInMajorSwing];
        }

     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Comments