20090717_SupportEX_v.3
Download scriptThis script is designed to automatically visualize key price levels from different timeframes directly on your trading chart. Instead of forcing you to manually calculate or track historical data, it identifies and draws horizontal visual markers for Daily, Weekly, and Monthly periods.
Core Functionality
The logic works by scanning historical data and identifying four specific price points for each timeframe: Open, Close, High, and Low. It then renders these as distinct horizontal lines on your chart so you can see how current price action relates to significant past milestones.
Key Features and Visual Logic
-
Multi-Timeframe Coverage:
- Daily (D): Tracks the opening and closing prices of each day, along with the high and low boundaries.
- Weekly (W): Identifies the same milestones for every week.
- Monthly (MN): Marks the significant levels for every month.
-
Visual Differentiation: To keep the chart readable, the script uses different styles for different types of data:
- Open vs. Close: The "Close" price is highlighted with a thicker line to give it more visual prominence compared to the "Open" price.
- High and Low Points: These are rendered as dotted lines rather than solid ones, allowing you to see the "range" of previous periods without cluttering the main view.
- Color Coding: The script assigns unique colors to each timeframe (e.g., Red for Monthly, Gold for Weekly, and Green for Daily) to help you distinguish between them at a glance.
-
Automatic Labeling: Each line drawn on the chart is automatically labeled with its specific price value. This eliminates the guesswork of identifying a line's exact price point, as the numbers are printed directly next to the markers.
User Experience Summary
Essentially, this tool acts as an automated "historical map." By looking at your chart, you can instantly see where yesterday's high was, where last week's price closed, or what the significant levels were for the previous month. It transforms raw historical data into a clean, organized visual layout, helping you identify potential support and resistance zones based on previous market activity.
//+------------------------------------------------------------------+
//| SupportEX.mq4 |
//| Ø.Àëåêñàíäð. |
//| shestovav@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Ø.Àëåêñàíäð.Â"
#property link "shestovav@gmail.com"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
extern int äðîáü = 5;
//---
extern bool Äåíü = true;
extern bool Íåäåëÿ = true;
extern bool Ìåñÿö = true;
//---
extern bool OC = true;
extern bool HL = true;
//---
extern color cMN = Red;
extern color cW1 = Gold;
extern color cD1 = Green;
datetime TimeBegin, TimeEnd;
int d,w,mn;
int tD=0,tW=0,tMN=0;
int D=1,W=1,MN=1;
string D0 = " DO ";
string DC = " DC ";
string DH = " DH ";
string DL = " DL ";
string W0 = " W0 ";
string WC = " WC ";
string WH = " WH ";
string WL = " WL ";
string MN0 = " MN0 ";
string MNC = " MNC ";
string MNH = " MNH ";
string MNL = " MNL ";
int deinit()
{
//----
ObjectsDeleteAll(0, OBJ_TREND);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int limit;
int counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
for(int i=limit; i>=0; i--)
{
if(Äåíü)
{
d++;
TimeBegin = iTime(NULL,PERIOD_D1,tD);
TimeEnd = (TimeBegin + 86400);
double D1_Open =iOpen(NULL,PERIOD_D1,D);
double D1_Close =iClose(NULL,PERIOD_D1,D);
double D1_High =iHigh(NULL,PERIOD_D1,D);
double D1_Low =iLow(NULL,PERIOD_D1,D);
if(OC){
ObjectCreate (D0+d,OBJ_TREND, 0, 0,0, 0,0,0,0);
ObjectSet (D0+d,OBJPROP_RAY,false);
ObjectSet (D0+d,OBJPROP_TIME1, TimeBegin);
ObjectSet (D0+d,OBJPROP_PRICE1, D1_Open);
ObjectSet (D0+d,OBJPROP_TIME2, TimeEnd);
ObjectSet (D0+d,OBJPROP_PRICE2, D1_Open);
ObjectSet (D0+d,OBJPROP_COLOR,cD1); // èçìåíÿåì öâåò ëèíèè
ObjectSet (D0+d,OBJPROP_WIDTH,1); // òåïåðü ëèíèÿ áóäåò òîëùèíîé â 3 ïèêñåëÿ
ObjectSet (D0+d,OBJPROP_STYLE,STYLE_SOLID); // òåïåðü íèæíÿÿ ëèíèÿ áóäåò ïóíêòèðíîé
ObjectSetText(D0+d,D0+DoubleToStr(D1_Open,äðîáü),10);
ObjectCreate (DC+d, OBJ_TREND, 0, 0,0, 0,0,0,0);
ObjectSet (DC+d,OBJPROP_RAY,false);
ObjectSet (DC+d, OBJPROP_TIME1,TimeBegin);
ObjectSet (DC+d, OBJPROP_PRICE1, D1_Close);
ObjectSet (DC+d, OBJPROP_TIME2, TimeEnd);
ObjectSet (DC+d, OBJPROP_PRICE2, D1_Close);
ObjectSet (DC+d,OBJPROP_COLOR,cD1); // èçìåíÿåì öâåò ëèíèè
ObjectSet (DC+d,OBJPROP_WIDTH,3); // òåïåðü ëèíèÿ áóäåò òîëùèíîé â 3 ïèêñåëÿ
ObjectSet (DC+d,OBJPROP_STYLE,STYLE_SOLID); // òåïåðü íèæíÿÿ ëèíèÿ áóäåò ïóíêòèðíîé
ObjectSetText(DC+d,DC+DoubleToStr(D1_Close,äðîáü),10);}
if(HL){
ObjectCreate (DH+d, OBJ_TREND, 0, 0,0, 0,0,0,0);
ObjectSet (DH+d,OBJPROP_RAY,false);
ObjectSet (DH+d, OBJPROP_TIME1, TimeBegin);
ObjectSet (DH+d, OBJPROP_PRICE1, D1_High);
ObjectSet (DH+d, OBJPROP_TIME2, TimeEnd);
ObjectSet (DH+d, OBJPROP_PRICE2, D1_High);
ObjectSet (DH+d,OBJPROP_COLOR,cD1); // èçìåíÿåì öâåò ëèíèè
ObjectSet (DH+d,OBJPROP_WIDTH,1); // òåïåðü ëèíèÿ áóäåò òîëùèíîé â 3 ïèêñåëÿ
ObjectSet (DH+d,OBJPROP_STYLE,STYLE_DOT); // òåïåðü íèæíÿÿ ëèíèÿ áóäåò ïóíêòèðíîé
ObjectSetText(DH+d,DH+DoubleToStr(D1_High,äðîáü),10);
ObjectCreate (DL+d, OBJ_TREND, 0, 0,0, 0,0,0,0);
ObjectSet (DL+d,OBJPROP_RAY,false);
ObjectSet (DL+d, OBJPROP_TIME1,TimeBegin);
ObjectSet (DL+d, OBJPROP_PRICE1, D1_Low);
ObjectSet (DL+d, OBJPROP_TIME2, TimeEnd);
ObjectSet (DL+d, OBJPROP_PRICE2, D1_Low);
ObjectSet (DL+d,OBJPROP_COLOR,cD1); // èçìåíÿåì öâåò ëèíèè
ObjectSet (DL+d,OBJPROP_WIDTH,1); // òåïåðü ëèíèÿ áóäåò òîëùèíîé â 3 ïèêñåëÿ
ObjectSet (DL+d,OBJPROP_STYLE,STYLE_DOT); // òåïåðü íèæíÿÿ ëèíèÿ áóäåò ïóíêòèðíîé
ObjectSetText(DL+d,DL+DoubleToStr(D1_Low,äðîáü),10);}
tD++;
D++;
}
if(Íåäåëÿ)
{
w++;
TimeBegin = iTime(NULL,PERIOD_W1,tW);
TimeEnd = (TimeBegin + 518400);
double W1_Open =iOpen(NULL,PERIOD_W1,W);
double W1_Close =iClose(NULL,PERIOD_W1,W);
double W1_High =iHigh(NULL,PERIOD_W1,W);
double W1_Low =iLow(NULL,PERIOD_W1,W);
if(OC){
ObjectCreate (W0+w, OBJ_TREND, 0, 0,0, 0,0,0,0);
ObjectSet (W0+w,OBJPROP_RAY,false);
ObjectSet (W0+w, OBJPROP_TIME1, TimeBegin);
ObjectSet (W0+w, OBJPROP_PRICE1, W1_Open);
ObjectSet (W0+w, OBJPROP_TIME2, TimeEnd);
ObjectSet (W0+w, OBJPROP_PRICE2, W1_Open);
ObjectSet (W0+w,OBJPROP_COLOR,cW1); // èçìåíÿåì öâåò ëèíèè
ObjectSet (W0+w,OBJPROP_WIDTH,1); // òåïåðü ëèíèÿ áóäåò òîëùèíîé â 3 ïèêñåëÿ
ObjectSet (W0+w,OBJPROP_STYLE,STYLE_SOLID); // òåïåðü íèæíÿÿ ëèíèÿ áóäåò ïóíêòèðíîé
ObjectSetText(W0+w," "+W0+DoubleToStr(W1_Open,äðîáü),10);
ObjectCreate (WC+w, OBJ_TREND, 0, 0,0, 0,0,0,0);
ObjectSet (WC+w,OBJPROP_RAY,false);
ObjectSet (WC+w, OBJPROP_TIME1, TimeBegin);
ObjectSet (WC+w, OBJPROP_PRICE1, W1_Close);
ObjectSet (WC+w, OBJPROP_TIME2, TimeEnd);
ObjectSet (WC+w, OBJPROP_PRICE2, W1_Close);
ObjectSet (WC+w,OBJPROP_COLOR,cW1); // èçìåíÿåì öâåò ëèíèè
ObjectSet (WC+w,OBJPROP_WIDTH,3); // òåïåðü ëèíèÿ áóäåò òîëùèíîé â 3 ïèêñåëÿ
ObjectSet (WC+w,OBJPROP_STYLE,STYLE_SOLID); // òåïåðü íèæíÿÿ ëèíèÿ áóäåò ïóíêòèðíîé
ObjectSetText(WC+w," "+WC+DoubleToStr(W1_Close,äðîáü),20);}
if(HL){
ObjectCreate (WH+w, OBJ_TREND, 0, 0,0, 0,0,0,0);
ObjectSet (WH+w,OBJPROP_RAY,false);
ObjectSet (WH+w, OBJPROP_TIME1, TimeBegin);
ObjectSet (WH+w, OBJPROP_PRICE1, W1_High);
ObjectSet (WH+w, OBJPROP_TIME2, TimeEnd);
ObjectSet (WH+w, OBJPROP_PRICE2, W1_High);
ObjectSet (WH+w,OBJPROP_COLOR,cW1); // èçìåíÿåì öâåò ëèíèè
ObjectSet (WH+w,OBJPROP_WIDTH,1); // òåïåðü ëèíèÿ áóäåò òîëùèíîé â 3 ïèêñåëÿ
ObjectSet (WH+w,OBJPROP_STYLE,STYLE_DOT); // òåïåðü íèæíÿÿ ëèíèÿ áóäåò ïóíêòèðíîé
ObjectSetText(WH+w," "+WH+DoubleToStr(W1_High,äðîáü),10);
ObjectCreate (WL+w, OBJ_TREND, 0, 0,0, 0,0,0,0);
ObjectSet (WL+w,OBJPROP_RAY,false);
ObjectSet (WL+w, OBJPROP_TIME1,TimeBegin);
ObjectSet (WL+w, OBJPROP_PRICE1, W1_Low);
ObjectSet (WL+w, OBJPROP_TIME2, TimeEnd);
ObjectSet (WL+w, OBJPROP_PRICE2, W1_Low);
ObjectSet (WL+w,OBJPROP_COLOR,cW1); // èçìåíÿåì öâåò ëèíèè
ObjectSet (WL+w,OBJPROP_WIDTH,1); // òåïåðü ëèíèÿ áóäåò òîëùèíîé â 3 ïèêñåëÿ
ObjectSet (WL+w,OBJPROP_STYLE,STYLE_DOT); // òåïåðü íèæíÿÿ ëèíèÿ áóäåò ïóíêòèðíîé
ObjectSetText(WL+w," "+WL+DoubleToStr(W1_Low,äðîáü),10);}
tW++;
W++;
}
if(Ìåñÿö)
{
mn++;
TimeBegin = iTime(NULL,PERIOD_MN1,tMN);
TimeEnd = (TimeBegin + 86400*30);
double MN_Open =iOpen(NULL,PERIOD_MN1,MN);
double MN_Close =iClose(NULL,PERIOD_MN1,MN);
double MN_High =iHigh(NULL,PERIOD_MN1,MN);
double MN_Low =iLow(NULL,PERIOD_MN1,MN);
if(OC){
ObjectCreate (MN0+mn, OBJ_TREND, 0, 0,0, 0,0,0,0);
ObjectSet (MN0+mn,OBJPROP_RAY,false);
ObjectSet (MN0+mn, OBJPROP_TIME1, TimeBegin);
ObjectSet (MN0+mn, OBJPROP_PRICE1, MN_Open);
ObjectSet (MN0+mn, OBJPROP_TIME2, TimeEnd);
ObjectSet (MN0+mn, OBJPROP_PRICE2, MN_Open);
ObjectSet (MN0+mn,OBJPROP_COLOR,cMN); // èçìåíÿåì öâåò ëèíèè
ObjectSet (MN0+mn,OBJPROP_WIDTH,1); // òåïåðü ëèíèÿ áóäåò òîëùèíîé â 3 ïèêñåëÿ
ObjectSet (MN0+mn,OBJPROP_STYLE,STYLE_SOLID); // òåïåðü íèæíÿÿ ëèíèÿ áóäåò ïóíêòèðíîé
ObjectSetText(MN0+mn," "+MN0+DoubleToStr(MN_Open,äðîáü),10);
ObjectCreate (MNC+mn, OBJ_TREND, 0, 0,0, 0,0,0,0);
ObjectSet (MNC+mn,OBJPROP_RAY,false);
ObjectSet (MNC+mn, OBJPROP_TIME1, TimeBegin);
ObjectSet (MNC+mn, OBJPROP_PRICE1, MN_Close);
ObjectSet (MNC+mn, OBJPROP_TIME2, TimeEnd);
ObjectSet (MNC+mn, OBJPROP_PRICE2, MN_Close);
ObjectSet (MNC+mn,OBJPROP_COLOR,cMN); // èçìåíÿåì öâåò ëèíèè
ObjectSet (MNC+mn,OBJPROP_WIDTH,3); // òåïåðü ëèíèÿ áóäåò òîëùèíîé â 3 ïèêñåëÿ
ObjectSet (MNC+mn,OBJPROP_STYLE,STYLE_SOLID); // òåïåðü íèæíÿÿ ëèíèÿ áóäåò ïóíêòèðíîé
ObjectSetText(MNC+mn," "+MNC+DoubleToStr(MN_Close,äðîáü),10);}
if(HL){
ObjectCreate (MNH+mn, OBJ_TREND, 0, 0,0, 0,0,0,0);
ObjectSet (MNH+mn,OBJPROP_RAY,false);
ObjectSet (MNH+mn, OBJPROP_TIME1, TimeBegin);
ObjectSet (MNH+mn, OBJPROP_PRICE1, MN_High);
ObjectSet (MNH+mn, OBJPROP_TIME2, TimeEnd);
ObjectSet (MNH+mn, OBJPROP_PRICE2, MN_High);
ObjectSet (MNH+mn,OBJPROP_COLOR,cMN); // èçìåíÿåì öâåò ëèíèè
ObjectSet (MNH+mn,OBJPROP_WIDTH,1); // òåïåðü ëèíèÿ áóäåò òîëùèíîé â 3 ïèêñåëÿ
ObjectSet (MNH+mn,OBJPROP_STYLE,STYLE_DOT); // òåïåðü íèæíÿÿ ëèíèÿ áóäåò ïóíêòèðíîé
ObjectSetText(MNH+mn," "+MNH+DoubleToStr(MN_High,äðîáü),10);
ObjectCreate (MNL+mn, OBJ_TREND, 0, 0,0, 0,0,0,0);
ObjectSet (MNL+mn,OBJPROP_RAY,false);
ObjectSet (MNL+mn, OBJPROP_TIME1, TimeBegin);
ObjectSet (MNL+mn, OBJPROP_PRICE1, MN_Low);
ObjectSet (MNL+mn, OBJPROP_TIME2, TimeEnd);
ObjectSet (MNL+mn, OBJPROP_PRICE2, MN_Low);
ObjectSet (MNL+mn,OBJPROP_COLOR,cMN); // èçìåíÿåì öâåò ëèíèè
ObjectSet (MNL+mn,OBJPROP_WIDTH,1); // òåïåðü ëèíèÿ áóäåò òîëùèíîé â 3 ïèêñåëÿ
ObjectSet (MNL+mn,OBJPROP_STYLE,STYLE_DOT); // òåïåðü íèæíÿÿ ëèíèÿ áóäåò ïóíêòèðíîé
ObjectSetText(MNL+mn," "+MNL+DoubleToStr(MN_Low,äðîáü),10);}
tMN++;
MN++;
}
}
return;
}
//+------------------------------------------------------------------+
Comments