Levels_A_Vlad_3

Download script
Author: Andrei Andreev
Levels_A_Vlad_3

This script is designed to automatically identify and display key price levels on a trading chart, helping traders visualize potential areas of support and resistance. It calculates these levels based on historical price action and projects them forward as horizontal lines with corresponding labels.

Core Functionality

1. Dynamic Timeframe Detection The script intelligently identifies which timeframe you are currently viewing. To ensure the data is relevant, it scales its analysis automatically:

  • If you are looking at short-term charts (under 30 minutes), it uses 1-hour data.
  • For 4-hour charts, it shifts to weekly data.
  • For weekly charts and above, it utilizes monthly data.

2. Support and Resistance Calculation The primary purpose of the script is to generate ten distinct price levels: five "Resistance" (R) lines and five "Support" (S) lines, along with a central "Pivot" (P) point. These are calculated using three specific types of modes that you can toggle:

  • Mode 1: Provides "Narrow" ranges for tighter price action.
  • Mode 2: Provides "Normal" ranges (the default standard).
  • Mode 3: Provides "Wide" ranges for markets with high volatility.

3. Visual Mapping Once the script calculates these mathematical points, it performs several visual actions on your chart:

  • Line Projection: It draws dashed lines for Support and Resistance levels and a solid line for the Pivot point. These lines extend from a past data point into the future.
  • Dynamic Labeling: It places text labels directly on the right side of the chart, showing the exact price for each level (R1 through R5 and S1 through S5).
  • Automatic Formatting: The script detects the specific pricing format of your currency pair (e.g., 2 decimal places for many pairs or 4 decimal places for others) and adjusts the labels accordingly to ensure they are easy to read.

User Experience

When active, the script simplifies the technical task of plotting "Pivot Points." Instead of manually identifying where price might stall or reverse, the script does the math in the background based on the high, low, and closing prices of previous periods. This provides a consistent visual map of the market's structure, allowing for quicker decision-making regarding where to enter or exit trades.

Price Data Components
Series array that contains close prices for each bar
12 Views
0 Downloads
0 Favorites
Levels_A_Vlad_3
//+------------------------------------------------------------------+
//|                                                Levels_A_Vlad.mq4 |
//|                                                   Andrei Andreev |
//|                                             http://www.andand.ru |
//+------------------------------------------------------------------+

// BASED ON:
//+------------------------------------------------------------------+
//|                                                   ^X_Sensors.mq4 |
//|                                                    Version 2.0.1 |
//|------------------------------------------------------------------|
//|                     Copyright © 2007, Mr.WT, Senior Linux Hacker |
//|                                     http://w-tiger.narod.ru/wk2/ |
//+------------------------------------------------------------------+
#property copyright "Andrei Andreev"
#property link      "http://www.andand.ru"

#property indicator_chart_window
extern int _Mode=2;
extern int _Shift = 1;
extern color _R_Color = Blue;
extern color _S_Color = Red;
extern color _P_Color = Black;
extern bool Pivot = false;

int _N_Time,  _My_Period,  ObjectId;
string OBJECT_PREFIX = "LEVELS";
string Font="Fixedsys";

double P, Pt, R1, R2, R3, R4, R5, S1, S2, S3, S4,S5;
//-------------------------------------------------------------------------------------------
int init() {

_My_Period=PERIOD_D1;
if (Period()<PERIOD_M30) _My_Period=PERIOD_H1;
if (Period()>=PERIOD_H4) _My_Period=PERIOD_W1;
if (Period()>=PERIOD_W1) _My_Period=PERIOD_MN1;


_N_Time = 0;

ObjectCreate("S1 line", OBJ_TREND, 0, Time[_Shift], 0, Time[0], 0);
ObjectCreate("S2 line", OBJ_TREND, 0, Time[_Shift], 0, Time[0], 0);
ObjectCreate("S3 line", OBJ_TREND, 0, Time[_Shift], 0, Time[0], 0);
ObjectCreate("S4 line", OBJ_TREND, 0, Time[_Shift], 0, Time[0], 0);
ObjectCreate("S5 line", OBJ_TREND, 0, Time[_Shift], 0, Time[0], 0);
ObjectCreate("R1 line", OBJ_TREND, 0, Time[_Shift], 0, Time[0], 0);
ObjectCreate("R2 line", OBJ_TREND, 0, Time[_Shift], 0, Time[0], 0);
ObjectCreate("R3 line", OBJ_TREND, 0, Time[_Shift], 0, Time[0], 0);
ObjectCreate("R4 line", OBJ_TREND, 0, Time[_Shift], 0, Time[0], 0);
ObjectCreate("R5 line", OBJ_TREND, 0, Time[_Shift], 0, Time[0], 0);
ObjectCreate( "P line", OBJ_TREND, 0, Time[_Shift], 0, Time[0], 0);

ObjectSet("S1 line", OBJPROP_RAY, 1);
ObjectSet("S1 line", OBJPROP_STYLE, STYLE_DASH);
ObjectSet("S1 line", OBJPROP_COLOR, _S_Color);

ObjectSet("S2 line", OBJPROP_RAY, 1);
ObjectSet("S2 line", OBJPROP_STYLE, STYLE_DASH);
ObjectSet("S2 line", OBJPROP_COLOR, _S_Color);

ObjectSet("S3 line", OBJPROP_RAY, 1);
ObjectSet("S3 line", OBJPROP_STYLE, STYLE_DASH);
ObjectSet("S3 line", OBJPROP_COLOR, _S_Color);

ObjectSet("S4 line", OBJPROP_RAY, 1);
ObjectSet("S4 line", OBJPROP_STYLE, STYLE_DASH);
ObjectSet("S4 line", OBJPROP_COLOR, _S_Color);

ObjectSet("S5 line", OBJPROP_RAY, 1);
ObjectSet("S5 line", OBJPROP_STYLE, STYLE_DASH);
ObjectSet("S5 line", OBJPROP_COLOR, _S_Color);

ObjectSet("R1 line", OBJPROP_RAY, 1);
ObjectSet("R1 line", OBJPROP_STYLE, STYLE_DASH);
ObjectSet("R1 line", OBJPROP_COLOR, _R_Color);

ObjectSet("R2 line", OBJPROP_RAY, 1);
ObjectSet("R2 line", OBJPROP_STYLE, STYLE_DASH);
ObjectSet("R2 line", OBJPROP_COLOR, _R_Color);

ObjectSet("R3 line", OBJPROP_RAY, 1);
ObjectSet("R3 line", OBJPROP_STYLE, STYLE_DASH);
ObjectSet("R3 line", OBJPROP_COLOR, _R_Color);

ObjectSet("R4 line", OBJPROP_RAY, 1);
ObjectSet("R4 line", OBJPROP_STYLE, STYLE_DASH);
ObjectSet("R4 line", OBJPROP_COLOR, _R_Color);

ObjectSet("R5 line", OBJPROP_RAY, 1);
ObjectSet("R5 line", OBJPROP_STYLE, STYLE_DASH);
ObjectSet("R5 line", OBJPROP_COLOR, _R_Color);

ObjectSet("P line", OBJPROP_RAY, 1);
ObjectSet("P line", OBJPROP_STYLE, STYLE_SOLID);
ObjectSet("P line", OBJPROP_COLOR, _P_Color);


ObjectCreate("R1 label", OBJ_TEXT, 0, Time[0], 0);
ObjectCreate("R2 label", OBJ_TEXT, 0, Time[0], 0);
ObjectCreate("R3 label", OBJ_TEXT, 0, Time[0], 0);
ObjectCreate("R4 label", OBJ_TEXT, 0, Time[0], 0);
ObjectCreate("R5 label", OBJ_TEXT, 0, Time[0], 0);
ObjectCreate("S1 label", OBJ_TEXT, 0, Time[0], 0);
ObjectCreate("S2 label", OBJ_TEXT, 0, Time[0], 0);
ObjectCreate("S3 label", OBJ_TEXT, 0, Time[0], 0);
ObjectCreate("S4 label", OBJ_TEXT, 0, Time[0], 0);
ObjectCreate("S5 label", OBJ_TEXT, 0, Time[0], 0);
ObjectCreate( "P label", OBJ_TEXT, 0, Time[0], 0);

ObjectId = 0;
return(0);
}
//-------------------------------------------------------------------------------------------
int deinit() {

Comment("");
ObjectDelete("R1 label");
ObjectDelete("R1 line");
ObjectDelete("R2 label");
ObjectDelete("R2 line");
ObjectDelete("R3 label");
ObjectDelete("R3 line");
ObjectDelete("R4 label");
ObjectDelete("R4 line");
ObjectDelete("R5 label");
ObjectDelete("R5 line");
ObjectDelete("S1 label");
ObjectDelete("S1 line");
ObjectDelete("S2 label");
ObjectDelete("S2 line");
ObjectDelete("S3 label");
ObjectDelete("S3 line");
ObjectDelete("S4 label");
ObjectDelete("S4 line");
ObjectDelete("S5 label");
ObjectDelete("S5 line");
ObjectDelete("P label");
ObjectDelete("P line");
ObDeleteObjectsByPrefix(OBJECT_PREFIX);
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start() {

if ( _N_Time == Time[0] ) return(0);

double close, high, low,  koeff1, koeff2;
double _rates[][6];

ArrayCopyRates(_rates, NULL, _My_Period);
int err = GetLastError();
if(err == 4066) {
  Sleep(1000);
  if(iClose(NULL, _My_Period, 0) != Close[0]) {
    Sleep(1000);
    return(0);
  }
}
close = _rates[1][4];
high = _rates[1][3];
low = _rates[1][2];

Pt=NormalizeDouble((high+low+close)/3,Digits);

if (_Mode==1)
    {
    koeff1=0.146;
    koeff2=0.236;
    Comment ("\nÓìåíüøåííûé öåíîâîé äèàïàçîí\n pivot=",Pt);
    }
if (_Mode==2)
    {
    koeff1=0.236;
    koeff2=0.382;
    Comment ("\nÍîðìàëüíûé öåíîâîé äèàïàçîí\n pivot=",Pt);
    }
if (_Mode==3)
    {
    koeff1=0.382;
    koeff2=0.618;
    Comment ("\nÐàñøèðåííûé öåíîâîé äèàïàçîí\n pivot=",Pt); 
    }       
if (Pivot)P=NormalizeDouble((high+low+close)/3,Digits); else P=0; 

S1 =NormalizeDouble(close-((high-low)*koeff1)/2,Digits);
R1 =NormalizeDouble(((high-low)*koeff1)/2+close ,Digits);

S2 =NormalizeDouble(S1-((high-low)*koeff2),Digits);
S3 =NormalizeDouble(S1-((high-low)*koeff2)*2,Digits);
S4 =NormalizeDouble(S3-(R1-S1),Digits);
S5 =NormalizeDouble(S4-((high-low)*koeff2),Digits);

R2 =NormalizeDouble(((high-low)*koeff2)+R1,Digits);
R3 = NormalizeDouble(R1+2*((high-low)*koeff2),Digits);
R4 = NormalizeDouble(R3 + (R1 - S1),Digits); 
R5 = NormalizeDouble(R4 + ((high-low)*koeff2),Digits);
 


string p,s1,s2,s3,s4,s5,r1,r2,r3,r4,r5;
if(Point == 0.01) {
  s1 = DoubleToStr(S1, 2);
  s2 = DoubleToStr(S2, 2);
  s3 = DoubleToStr(S3, 2);
  s4 = DoubleToStr(S4, 2);
  s5 = DoubleToStr(S5, 2);
  r1 = DoubleToStr(R1, 2);
  r2 = DoubleToStr(R2, 2);
  r3 = DoubleToStr(R3, 2);
  r4 = DoubleToStr(R4, 2);
  r5 = DoubleToStr(R5, 2);
  p = DoubleToStr(P, 2);
 
} else {
  s1 = DoubleToStr(S1, 4);
  s2 = DoubleToStr(S2, 4);
  s3 = DoubleToStr(S3, 4);
  s4 = DoubleToStr(S4, 4);
  s5 = DoubleToStr(S5, 4);
  r1 = DoubleToStr(R1, 4);
  r2 = DoubleToStr(R2, 4);
  r3 = DoubleToStr(R3, 4);
  r4 = DoubleToStr(R4, 4);
  r5 = DoubleToStr(R5, 4);
  p = DoubleToStr(P, 4);
  
}
//---- Pivot Lines
ObjectSetText("R1 label", "                         R1 "+r1+"", 8, Font, _R_Color);
ObjectSetText("R2 label", "                         R2 "+r2+"", 8, Font, _R_Color);
ObjectSetText("R3 label", "                         R3 "+r3+"", 8, Font, _R_Color);
ObjectSetText("R4 label", "                         R4 "+r4+"", 8, Font, _R_Color);
ObjectSetText("R5 label", "                         R5 "+r5+"", 8, Font, _R_Color);
ObjectSetText("S1 label", "                         S1 "+s1+"", 8, Font, _S_Color);
ObjectSetText("S2 label", "                         S2 "+s2+"", 8, Font, _S_Color);
ObjectSetText("S3 label", "                         S3 "+s3+"", 8, Font, _S_Color);
ObjectSetText("S4 label", "                         S4 "+s4+"", 8, Font, _S_Color);
ObjectSetText("S5 label", "                         S5 "+s5+"", 8, Font, _S_Color);
ObjectSetText( "P label", "                            ", 8, Font, _P_Color);

ObjectMove("R1 label", 0, Time[0], R1);
ObjectMove("R2 label", 0, Time[0], R2);
ObjectMove("R3 label", 0, Time[0], R3);
ObjectMove("R4 label", 0, Time[0], R4);
ObjectMove("R5 label", 0, Time[0], R5);
ObjectMove("P label", 0, Time[0], P);
ObjectMove("S1 label", 0, Time[0], S1);
ObjectMove("S2 label", 0, Time[0], S2);
ObjectMove("S3 label", 0, Time[0], S3);
ObjectMove("S4 label", 0, Time[0], S4);
ObjectMove("S5 label", 0, Time[0], S5);

ObjectMove("S1 line", 0, Time[_Shift], S1);
ObjectMove("S1 line", 1, Time[0], S1);

ObjectMove("S2 line", 0, Time[_Shift], S2);
ObjectMove("S2 line", 1, Time[0], S2);

ObjectMove("S3 line", 0, Time[_Shift], S3);
ObjectMove("S3 line", 1, Time[0], S3);

ObjectMove("S4 line", 0, Time[_Shift], S4);
ObjectMove("S4 line", 1, Time[0], S4);

ObjectMove("S5 line", 0, Time[_Shift], S5);
ObjectMove("S5 line", 1, Time[0], S5);

ObjectMove("P line", 0, Time[_Shift], P);
ObjectMove("P line", 1, Time[0], P);


ObjectMove("R1 line", 0, Time[_Shift], R1);
ObjectMove("R1 line", 1, Time[0], R1);

ObjectMove("R2 line", 0, Time[_Shift], R2);
ObjectMove("R2 line", 1, Time[0], R2);

ObjectMove("R3 line", 0, Time[_Shift], R3);
ObjectMove("R3 line", 1, Time[0], R3);

ObjectMove("R4 line", 0, Time[_Shift], R4);
ObjectMove("R4 line", 1, Time[0], R4);

ObjectMove("R5 line", 0, Time[_Shift], R5);
ObjectMove("R5 line", 1, Time[0], R5);
//====
   
_N_Time = Time[0];
//---- End Of Program


return(0);
}
//+------------------------------------------------------------------+



void ObDeleteObjectsByPrefix(string Prefix)
  {
   int L = StringLen(Prefix);
   int i = 0; 
   while(i < ObjectsTotal())
     {
       string ObjName = ObjectName(i);
       if(StringSubstr(ObjName, 0, L) != Prefix) 
         { 
           i++; 
           continue;
         }
       ObjectDelete(ObjName);
     }
  }

//-------------------------------------------------------------------------------------------

Comments