This script is designed to automatically identify and project trend lines on a trading chart based on historical price action. It simplifies the process of finding significant support and resistance levels by calculating the "mathematical path" of the market over a specific period.
Core Logic Overview
1. Data Analysis Period The script looks back at a set number of hours (defined by the user) to analyze the market's movement. It calculates a linear trend line based on the closing prices within this timeframe. This serves as the baseline for determining how the "average" price has been moving.
2. Deviation Analysis Instead of just looking at averages, the script measures how far the actual highs and lows of the market deviate from that calculated trend line. It splits the look-back period into two halves to compare movements in different sections of the chart.
3. Identification of Key Points The logic determines which type of trend line is most significant by comparing the behavior of the price:
- It looks for the "extreme" points where the price was furthest from the average trend.
- It evaluates whether it is more important to track the highest peaks (resistance) or the lowest valleys (support) based on which one showed the most significant deviation during the analyzed period.
4. Trend Line Selection The script then chooses between two primary modes of calculation:
- Resistance-Based: If the highest peaks are more prominent, it focuses on those points to project a potential downward trend or ceiling.
- Support-Based: If the lowest valleys are more prominent, it focuses on those points to project an upward trend or floor.
5. Dynamic Projection Once the most significant points are identified, the script performs a final refinement to ensure the line accurately captures the price action. It then draws three distinct lines on your chart:
- Primary Trend Line: The main line connecting the most significant historical point to the current price.
- Secondary Reference Lines: Two additional lines (drawn as dotted lines) that represent the "buffer" zones above and below the primary trend. These help traders visualize the "channel" or the area where the price is most likely to fluctuate.
Summary for the User
Essentially, this tool automates the "manual" work of a trader. Instead of you trying to guess where to draw a trend line, the script mathematically identifies the most significant high or low points from the past few hours and projects them forward as a visual guide, providing you with a clear picture of current support and resistance levels.
//+------------------------------------------------------------------+
//| ang_AutoCh_HL-v1.mq4 |
//| umbenannt in Autotrendlinien.mq4 |
//| Copyright © 2006, ANG3110@latchess.com |
//+------------------------------------------------------------------+
#property copyright "ANG3110@latchess.com"
//----------------------------------
#property indicator_chart_window
//----------------------------------
extern int Hours = 10;
extern color col = Blue;
//------------------
double lr, lr0, lrp;
double sx, sy, sxy, sx2, aa, bb;
int p, sName, fs;
int f, f0, f1;
double dh, dl, dh_1, dl_1, dh_2, dl_2;
int ai_1, ai_2, bi_1, bi_2;
double hai, lai, dhi, dli, dhm, dlm, ha0, hap, la0, lap;
double price_p1, price_p0, price_p2, price_01, price_00, price_02;
int p1, p0, p2, fp;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
p = Hours*60 / Period();
if(fs == 0)
{
sName = CurTime();
fs = 1;
}
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
ObjectDelete("1" + sName);
ObjectDelete("0" + sName);
ObjectDelete("2" + sName);
}
//+------------------------------------------------------------------+
//| Custom indicator start function |
//+------------------------------------------------------------------+
int start()
{
int i, n;
//----
if(f == 1)
{
p1 = iBarShift(Symbol(), Period(), ObjectGet("1" + sName, OBJPROP_TIME1));
p0 = iBarShift(Symbol(), Period(), ObjectGet("0" + sName, OBJPROP_TIME1));
p2 = iBarShift(Symbol(), Period(), ObjectGet("2" + sName, OBJPROP_TIME1));
if(fp == 0 && p != p1)
{
p = p1;
fp = 1;
}
if(fp == 0 && p != p0)
{
p = p0;
fp = 1;
}
if(fp == 0 && p != p2)
{
p = p2;
fp = 1;
}
}
sx = 0; sy = 0; sxy = 0; sx2 = 0;
//----
for(n = 0; n <= p; n++)
{
sx += n;
sy += Close[n];
sxy += n*Close[n];
sx2 += MathPow(n, 2);
}
aa = (sx*sy - (p + 1)*sxy) / (MathPow(sx, 2) - (p + 1)*sx2);
bb = (sy - aa*sx) / (p + 1);
//----
for(i = 0; i <= p; i++)
{
lr = bb + aa*i;
dh = High[i] - lr;
dl = Low[i] - lr;
//----
if(i < p / 2)
{
if(i == 0)
{
dh_1 = 0.0;
dl_1 = 0.0;
ai_1 = i;
bi_1 = i;
}
//----
if(dh >= dh_1)
{
dh_1 = dh;
ai_1 = i;
}
//----
if(dl <= dl_1)
{
dl_1 = dl;
bi_1 = i;
}
}
//----
if(i >= p / 2)
{
if(i == p / 2)
{
dh_2 = 0.0;
dl_2 = 0.0;
ai_2 = i;
bi_2 = i;
}
if(dh >= dh_2)
{
dh_2 = dh;
ai_2 = i;
}
if(dl <= dl_2)
{
dl_2 = dl;
bi_2 = i;
}
}
}
lr0 = bb;
lrp = bb + aa*(i + p);
//----
if(MathAbs(ai_1 - ai_2) > MathAbs(bi_1 - bi_2))
f=1;
//----
if(MathAbs(ai_1 - ai_2) < MathAbs(bi_1 - bi_2))
f=2;
//----
if(MathAbs(ai_1 - ai_2) == MathAbs(bi_1 - bi_2))
{
if(MathAbs(dh_1 - dh_2) < MathAbs(dl_1 - dl_2))
f=1;
//----
if(MathAbs(dh_1 - dh_2) >= MathAbs(dl_1 - dl_2))
f=2;
}
//----
if(f == 1)
{
for(n = 0; n <= 20; n++)
{
f1 = 0;
//----
for(i = 0; i <= p; i++)
{
hai = High[ai_1]*(i - ai_2) / (ai_1 - ai_2) + High[ai_2]*(i - ai_1) /
(ai_2 - ai_1);
//----
if(i == 0 || i == p / 2)
dhm = 0.0;
//----
if(High[i] - hai > dhm && i < p / 2)
{
ai_1 = i;
f1 = 1;
}
//----
if(High[i] - hai > dhm && i >= p / 2)
{
ai_2 = i;
f1 = 1;
}
}
//----
if(f == 0)
break;
}
//----
for(i = 0; i <= p; i++)
{
hai = High[ai_1]*(i - ai_2) / (ai_1 - ai_2) + High[ai_2]*(i - ai_1) /
(ai_2 - ai_1);
dli = Low[i] - hai;
if(i == 0)
dlm=0.0;
if(dli < dlm)
dlm = dli;
}
ha0 = High[ai_1]*(0 - ai_2) / (ai_1 - ai_2) + High[ai_2]*(0 - ai_1) / (ai_2 - ai_1);
hap = High[ai_1]*(p - ai_2) / (ai_1 - ai_2) + High[ai_2]*(p - ai_1) / (ai_2 - ai_1);
price_p1 = hap;
price_p0 = hap + dlm / 2;
price_p2 = hap + dlm;
price_01 = ha0;
price_00 = ha0 + dlm / 2;
price_02 = ha0 + dlm;
}
if(f == 2)
{
for(n = 0; n <= 20; n++)
{
f1 = 0;
for(i = 0; i <= p; i++)
{
lai = Low[bi_1]*(i - bi_2) / (bi_1 - bi_2) + Low[bi_2]*(i - bi_1) /
(bi_2 - bi_1);
if(i == 0 || i == p / 2)
dlm = 0.0;
if(Low[i] - lai < dlm && i < p / 2)
{
bi_1 = i;
f1 = 1;
}
if(Low[i] - lai < dlm && i >= p / 2)
{
bi_2 = i;
f1 = 1;
}
}
if(f == 0)
break;
}
//----
for(i = 0; i <= p; i++)
{
lai = Low[bi_1]*(i - bi_2) / (bi_1 - bi_2) + Low[bi_2]*(i - bi_1) / (bi_2 - bi_1);
dhi = High[i] - lai;
if(i == 0)
dhm = 0.0;
if(dhi > dhm)
dhm = dhi;
}
la0 = Low[bi_1]*(0 - bi_2) / (bi_1 - bi_2) + Low[bi_2]*(0 - bi_1) / (bi_2 - bi_1);
lap = Low[bi_1]*(p - bi_2) / (bi_1 - bi_2) + Low[bi_2]*(p - bi_1) / (bi_2 - bi_1);
price_p1 = lap;
price_p0 = lap + dhm / 2;
price_p2 = lap + dhm;
price_01 = la0;
price_00 = la0 + dhm / 2;
price_02 = la0 + dhm;
}
ObjectCreate("1" + sName, 2, 0, Time[p], price_p1, Time[0], price_01);
ObjectCreate("0" + sName, 2, 0, Time[p], price_p0, Time[0], price_00);
ObjectCreate("2" + sName, 2, 0, Time[p], price_p2, Time[0], price_02);
ObjectSet("1" + sName, OBJPROP_COLOR, col);
ObjectSet("0" + sName, OBJPROP_COLOR, col);
ObjectSet("0" + sName, OBJPROP_STYLE, STYLE_DOT);
ObjectSet("2" + sName, OBJPROP_COLOR, col);
ObjectSet("1" + sName, OBJPROP_TIME1, Time[p]);
ObjectSet("1" + sName, OBJPROP_PRICE1, price_p1);
ObjectSet("1" + sName, OBJPROP_TIME2, Time[0]);
ObjectSet("1" + sName, OBJPROP_PRICE2, price_01);
ObjectSet("0" + sName, OBJPROP_TIME1, Time[p]);
ObjectSet("0" + sName, OBJPROP_PRICE1, price_p0);
ObjectSet("0" + sName, OBJPROP_TIME2, Time[0]);
ObjectSet("0" + sName, OBJPROP_PRICE2, price_00);
ObjectSet("2" + sName, OBJPROP_TIME1, Time[p]);
ObjectSet("2" + sName, OBJPROP_PRICE1, price_p2);
ObjectSet("2" + sName, OBJPROP_TIME2, Time[0]);
ObjectSet("2" + sName, OBJPROP_PRICE2, price_02);
f = 1; p1 = p; p0 = p; p2 = p; fp = 0;
return(0);
}
//+------------------------------------------------------------------+
Comments