signallength

Download script
Author: Copyright � 2009, ������� �������
signallength

This script is an automated technical analysis tool designed to identify and visualize key market structural levels—specifically Resistance and Support lines—on a trading chart. It works by identifying historical price turning points and projecting them into the current market to detect potential price interactions.

Here is a breakdown of how the logic functions:

1. Identification of Structural Points

The tool scans historical price data to find "Fractals." In technical analysis, these are local highs and lows where the price reverses direction. The script specifically looks for:

  • Upper Fractals: These serve as the basis for identifying Resistance (price ceilings).
  • Lower Fractals: These serve as the basis for identifying Support (price floors).

2. Dynamic Line Projection

Once the tool identifies these significant high and low points, it automatically draws trend lines on your chart:

  • Resistance Lines: These are drawn based on historical peaks.
  • Support Lines: These are drawn based on historical troughs.
  • Visual Formatting: The script distinguishes between these two types using different colors (defaulting to Orange for Resistance and Aqua for Support) and applies a dashed style to the base lines so they remain visible without cluttering the view.

3. Real-Time Price Monitoring & Alerts

The core intelligence of the script lies in its ability to monitor the "live" price relative to these projected lines. It performs the following actions in real-time:

  • Proximity Detection: The script constantly calculates the distance between the current market price and the nearest support or resistance lines.
  • Intersection Alerts: If the price moves within a specific, user-defined distance (the "Setup" parameter) of a line, the script recognizes this as a potential "intersection."
  • Automated Notifications: When a price approaches these levels, the script triggers an immediate visual alert on the chart in the form of an arrow and sends a pop-up notification (Alert) to the trader. This tells you exactly which type of boundary is being tested (e.g., "Intersection of Support Boundary").

4. Chart Management

To keep the workspace clean and relevant, the script includes several automated maintenance features:

  • Timeframe Awareness: It recognizes different timeframes (e.g., M15, H1, D1) and adjusts its labeling accordingly.
  • Auto-Cleanup: It is programmed to delete old lines when switching periods or under specific conditions, ensuring that your chart doesn't become crowded with outdated data.
  • Dynamic Redrawing: Every time a new structural point is found that differs from the previous one, the script deletes the old line and draws a fresh one to ensure the analysis is always based on the most recent market structure.
Indicators Used
Fractals
Miscellaneous
It issuies visual alerts to the screen
9 Views
0 Downloads
0 Favorites
signallength
//+------------------------------------------------------------------+
//|                                                 signallength.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Õëûñòîâ Âëàäèìð"
#property link      "ñmillion@narod.ru"
extern color ÖÂÅÒ_ñîïðîòèâëåíèÿ = Orange;
extern color ÖÂÅÒ_ïîääåðæêè     = Aqua;
extern int Óñòàâêà=4,
           âðåìÿ_óñòàâêè=10;
int X1u,X2u,X3u,X1d,X2d,X3d,bar_1u,bar_2u,bar_3u,bar_1d,bar_2d,bar_3d,âðåìÿ_ïåð,
    X1g,X2g,per;
double Y1vg,Y2vg,Y1ng,Y2ng,Y1u,Y2u,Y3u,Y1d,Y2d,Y3d;
double øèðèíà_êàíàëà;
extern bool óäàëÿòü_îòðåçêè = true;//óäàëÿòü_îòðåçêè_ïðè_ñìåíå_ïåðèîäà
#property indicator_chart_window
//æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ
//*////////////////////////////////////////////////////////////////*//
int init()
{
   per=Period();
   return(0);
}
//*////////////////////////////////////////////////////////////////*//
//æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ

//æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ
//*////////////////////////////////////////////////////////////////*//
int deinit()
{
   ObjectDelete("Ëèíèÿ ñîïðîòèâëåíèÿ");
   ObjectDelete("Ëèíèÿ ïîääåðæêè");
   del("Ïåðåñå÷åíèå ");
   if (óäàëÿòü_îòðåçêè==true) del("ãðàíèöà");
   return(0);
}
//*////////////////////////////////////////////////////////////////*//
//æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ

//æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ
//*////////////////////////////////////////////////////////////////*//
int start()
{
   while(true)
   {
      if (âðåìÿ_ïåð!=Time[0])
      {
         if (bar_3u != ïîèñê_ôðàêòàëà(0, 1) || (ObjectFind("Ëèíèÿ ñîïðîòèâëåíèÿ")!=0))
         {
            bar_3u = ïîèñê_ôðàêòàëà(0,     1);
            bar_2u = ïîèñê_ôðàêòàëà(bar_3u,-1);
            bar_1u = ïîèñê_ôðàêòàëà(bar_2u, 1);
            X1u=Time[bar_1u];Y1u=High[bar_1u];X2u=Time[bar_3u];Y2u=High[bar_3u];
            ObjectDelete("Ëèíèÿ ñîïðîòèâëåíèÿ");
            ObjectCreate("Ëèíèÿ ñîïðîòèâëåíèÿ", OBJ_TREND, 0,X1u,Y1u,X2u,Y2u);
            ObjectSet   ("Ëèíèÿ ñîïðîòèâëåíèÿ", OBJPROP_COLOR, ÖÂÅÒ_ñîïðîòèâëåíèÿ);
            ObjectSet   ("Ëèíèÿ ñîïðîòèâëåíèÿ", OBJPROP_STYLE, STYLE_DASH);
            ObjectSet   ("Ëèíèÿ ñîïðîòèâëåíèÿ", OBJPROP_WIDTH, 0);
            ObjectSet   ("Ëèíèÿ ñîïðîòèâëåíèÿ", OBJPROP_BACK,  true);
            ObjectSet   ("Ëèíèÿ ñîïðîòèâëåíèÿ", OBJPROP_RAY,   true);
            ðèñóåì_ãðàíèöû(ÖÂÅÒ_ñîïðîòèâëåíèÿ,X1u,Y1u,X2u,Y2u);
         }
         //-----------------------------------------------------------------------
         if (bar_3d != ïîèñê_ôðàêòàëà(0,-1) || (ObjectFind("Ëèíèÿ ïîääåðæêè")!=0))
         {
            bar_3d = ïîèñê_ôðàêòàëà(0,    -1);
            bar_2d = ïîèñê_ôðàêòàëà(bar_3d, 1);
            bar_1d = ïîèñê_ôðàêòàëà(bar_2d,-1);
            X1d=Time[bar_1d];Y1d=Low[bar_1d];X2d=Time[bar_3d];Y2d=Low[bar_3d];
            ObjectDelete("Ëèíèÿ ïîääåðæêè");
            ObjectCreate("Ëèíèÿ ïîääåðæêè", OBJ_TREND, 0,X1d,Y1d,X2d,Y2d);
            ObjectSet   ("Ëèíèÿ ïîääåðæêè", OBJPROP_COLOR, ÖÂÅÒ_ïîääåðæêè);
            ObjectSet   ("Ëèíèÿ ïîääåðæêè", OBJPROP_STYLE, STYLE_DASH);
            ObjectSet   ("Ëèíèÿ ïîääåðæêè", OBJPROP_WIDTH, 0);
            ObjectSet   ("Ëèíèÿ ïîääåðæêè", OBJPROP_BACK,  true);    
            ObjectSet   ("Ëèíèÿ ïîääåðæêè", OBJPROP_RAY,   true);
            ðèñóåì_ãðàíèöû(ÖÂÅÒ_ïîääåðæêè,X1d,Y1d,X2d,Y2d);
         }
         //-----------------------------------------------------------------------
         int d=0;
         int    X_1,X_2;
         double Y_1,Y_2;
         color ÖÂÅÒ;
         for(int n=ObjectsTotal()-1; n>=0; n--) 
         {
            string Obj_N=ObjectName(n);
            if (StringFind(Obj_N,"ãðàíèöà",0)!=-1 && ObjectType(Obj_N)==OBJ_TREND)//íàéäåí îáüåêò-òðåíä ê êîòîðîìó âû÷èñëÿåòñÿ ïðèáëèæåíèå
            {
               X_1 = ObjectGet(Obj_N, OBJPROP_TIME1); 
               X_2 = ObjectGet(Obj_N, OBJPROP_TIME2); 
               if (X_1==X_2) {ObjectDelete(Obj_N);continue;}
               Y_1 = ObjectGet(Obj_N, OBJPROP_PRICE1);
               Y_2 = ObjectGet(Obj_N, OBJPROP_PRICE2);
               ÖÂÅÒ= ObjectGet(Obj_N, OBJPROP_COLOR);
               //ðèñóåì_çîíó_êîíòðîëÿ(Obj_N,ÖÂÅÒ, X_1,Y_1,X_2,Y_2);
               if (X_1<=Time[0] && X_2>=Time[0])//ïîïàäàåò âî âðåìåííîé äèàïàçîí
               {
                  X3d=Time[0];Y3d=Y_1+(Y_2-Y_1)*(X3d-X_1)/(X_2-X_1);//óðàâíåíèå ïðÿìîé
                  //Comment((Y3d-Bid)/Point);
                  if (MathAbs(Y3d-Bid)/Point < Óñòàâêà)
                  { 
                     if (ÖÂÅÒ==ÖÂÅÒ_ñîïðîòèâëåíèÿ)//íèæíÿÿ ãðàíèöà
                           {d=-1;break;}
                     else  {d= 1;break;}
                  }
               }
            }
         }
         //-----------------------------------------------------------------------
         if (d!=0)
         {
            ObjectCreate("Ïåðåñå÷åíèå "+Obj_N+" "+Time[0], OBJ_ARROW,0,Time[0],Bid,0,0,0,0);
            ObjectSet   ("Ïåðåñå÷åíèå "+Obj_N+" "+Time[0], OBJPROP_WIDTH, 0);
            if (d==1)
            {
               ObjectSet   ("Ïåðåñå÷åíèå "+Obj_N+" "+Time[0], OBJPROP_ARROWCODE,233);
               ObjectSet   ("Ïåðåñå÷åíèå "+Obj_N+" "+Time[0], OBJPROP_COLOR, ÖÂÅÒ_ïîääåðæêè);    // Öâåò   
               Alert(Symbol()+"Ïåðåñå÷åíèå ãðàíèöû ïîääåðæêè "+Obj_N);
            }
            else
            {
               ObjectSet   ("Ïåðåñå÷åíèå "+Obj_N+" "+Time[0], OBJPROP_ARROWCODE,234);
               ObjectSet   ("Ïåðåñå÷åíèå "+Obj_N+" "+Time[0], OBJPROP_COLOR, ÖÂÅÒ_ñîïðîòèâëåíèÿ);    // Öâåò   
               Alert(Symbol()+"Ïåðåñå÷åíèå ãðàíèöû ñîïðîòèâëåíèÿ "+Obj_N);
            }
            âðåìÿ_ïåð=Time[0];
         }
      }
      if ((ObjectFind("Íèæíÿÿ ãðàíèöà "+string_ïåð(per))==0)&&(ObjectFind("Âåðõíÿÿ ãðàíèöà "+string_ïåð(per))==0)) 
         return(0);
      else 
      {
         ObjectDelete("Ëèíèÿ ñîïðîòèâëåíèÿ");
         ObjectDelete("Ëèíèÿ ïîääåðæêè");
         âðåìÿ_ïåð=Time[1];
      }
   }
}
//*////////////////////////////////////////////////////////////////*//
//æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ
//æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ
//////////////////////////////////////////////////////////////////////
int ïîèñê_ôðàêòàëà(int bar, int UP_DN)
{
   while(true)//èùåì 1 ôðàêòàë ïîñëå bar
   {
      bar++;
      if (UP_DN == 1 && iFractals(NULL, 0, MODE_UPPER, bar) != 0) return(bar);
      if (UP_DN ==-1 && iFractals(NULL, 0, MODE_LOWER, bar) != 0) return(bar);
   } 
   return(0);  
}
//*////////////////////////////////////////////////////////////////*//
//æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ
//æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ
//*////////////////////////////////////////////////////////////////*//
int del(string Ob)
{
   for(int n=ObjectsTotal()-1; n>=0; n--) 
   {
      string Obj_Name=ObjectName(n);
      if (StringFind(Obj_Name,Ob,0) != -1) ObjectDelete(Obj_Name);
   }
   return;
}
//*////////////////////////////////////////////////////////////////*//
//æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ

//æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ
//*////////////////////////////////////////////////////////////////*//
string string_ïåð(int p)
{  switch(p)
   {  case 1    : return("M_1"); break;  //1 ìèíóòà
      case 5    : return("M_5"); break;  //5 ìèíóò 
      case 15   : return("M15"); break; //15 ìèíóò
      case 30   : return("M30"); break; //30 ìèíóò
      case 60   : return("H 1"); break;  //1 ÷àñ
      case 240  : return("H_4"); break;  //4 ÷àñà
      case 1440 : return("D_1"); break;  //1 äåíü
      case 10080: return("W_1"); break;  //1 íåäåëÿ
      case 43200: return("MN1"); break; //1 ìåñÿö
   }return("îøèáêà ïåðèîäà");
}
//*////////////////////////////////////////////////////////////////*//
//æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ

//æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ
//*////////////////////////////////////////////////////////////////*//
int ðèñóåì_ãðàíèöû(color öâåò,int X1,double Y1,int X2,double Y2)
{
   string Name = "ãðàíèöà "+string_ïåð(per);
   if (öâåò==ÖÂÅÒ_ñîïðîòèâëåíèÿ) Name = "Âåðõíÿÿ "+Name;
   if (öâåò==ÖÂÅÒ_ïîääåðæêè)     Name = "Íèæíÿÿ " +Name;
   if (ObjectFind(Name)==0) return; //Åñëè îáüåêò ñóùåñòâóåò
   X1g=Time[0];X2g=Time[0]+per*60*âðåìÿ_óñòàâêè;
   if (öâåò==ÖÂÅÒ_ñîïðîòèâëåíèÿ) {Y1vg=Y1+(Y2-Y1)*(X1g-X1)/(X2-X1);Y2vg=Y1+(Y2-Y1)*(X2g-X1)/(X2-X1);
                                  ObjectCreate(Name, OBJ_TREND, 0,X1g,Y1vg,X2g,Y2vg);}
   if (öâåò==ÖÂÅÒ_ïîääåðæêè)     {Y1ng=Y1+(Y2-Y1)*(X1g-X1)/(X2-X1);Y2ng=Y1+(Y2-Y1)*(X2g-X1)/(X2-X1);
                                  ObjectCreate(Name, OBJ_TREND, 0,X1g,Y1ng,X2g,Y2ng);}
   ObjectSet   (Name, OBJPROP_COLOR, öâåò);
   ObjectSet   (Name, OBJPROP_STYLE, STYLE_SOLID);
   ObjectSet   (Name, OBJPROP_WIDTH, 4);
   ObjectSet   (Name, OBJPROP_BACK,  false);
   ObjectSet   (Name, OBJPROP_RAY,   false);
   return;
}
//*////////////////////////////////////////////////////////////////*//
//æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ


Comments