Mouteki-Demark_trend_new_v1
Download scriptThis script is an advanced technical analysis tool designed to identify market trends, price breakouts, and potential profit targets based on DeMark Theory. It acts as a visual guide for traders by automatically drawing geometric lines and levels on a price chart to highlight where the market might change direction or reach a goal.
Core Logic and Functionality
1. DeMark Theory Identification The foundation of this script is the "DeMark" method, which identifies significant price points (Highs and Lows) based on specific surrounding price action. Rather than just looking at any peak, it recursively searches for price bars that are higher or lower than those on their left and right sides. This helps filter out minor price fluctuations to find the "true" structural pivots of the market.
2. Trendline Construction Depending on your settings, the script identifies either UpTrendLines or DownTrendLines:
- UpTrendlines: Connects consecutive significant lows to show the rising support floor of a market.
- DownTrendlines: Connects consecutive significant highs to show the falling resistance ceiling of a market.
3. Breakout Analysis (The "Hitch" Logic) One of the script's most sophisticated features is its ability to detect when price actually breaks through these trendlines. It doesn't just mark a line; it looks back at historical price action to see if a previous bar closed above or below the expected trend level.
- Breakout Qualifiers: When a breakout is detected, the script provides specific "qualifiers" (labeled as 1, 2, and 3). These are mathematical checks to confirm the strength of the break based on opening prices, closing prices, and price ranges, helping traders distinguish between a genuine trend shift and a temporary spike.
4. Dynamic Visual Elements The script automatically draws several types of visual aids directly on your chart:
- Trendlines: Solid lines showing the primary direction of the market.
- Horizontal Levels: Specific price points where a breakout has occurred or is expected to occur.
- Channels: Parallel lines that show the "corridor" in which price is moving, helping to visualize volatility and range.
- Take Profit (Target) Lines: Based on the breakout point and mathematical projections (including Fibonacci-style ratios like 1.618), the script calculates four different potential target zones where a move might exhaust itself.
5. User Information Display In addition to drawing lines, the script provides a real-time text commentary on the chart. This summary tells you exactly what the script is currently "thinking"—listing the current trend lines it has identified, confirming if a breakout has been detected, and listing the calculated target prices for the current move.
Summary of Operations
In simple terms, the script scans the history of your chart to find major structural points. It then connects these points to draw the current "path" of the market. It constantly watches the current price; if the price breaks that path, the script alerts you with a visual arrow and a specific set of target prices to help you decide where to take profit or enter a trade.
//------------------------------------------------------------------/
// Indicator-advisor based on Demark threory with additions
// Some part of the code was taken from Ind-TD-DeMark-3-1.mq4 [Kara ©]
//------------------------------------------------------------------/
#property copyright "GreenDog"
#property link "krot@inbox.ru" // v2.3
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
extern int showBars=200; // if showBars= 0 so the indicator will be shown for all the chart
extern int LevDP=2; // Demar Pint Levels; 2 = central bar will be higher (lower) then 2 bars on the left side and 2 bars on the right one.
extern int qSteps=1; // number of steps/ no more than 3
extern int BackStep=0; // number of staps back
extern int startBar=0; // ifstartBar=0 so we have recommendation for the current bar, if 1 - for possible next bar
extern bool TrendLine=true; // false = no trend lines
extern bool HorizontLine=true; // true = break levels
extern bool ChannelLine=false; // true = channels which is parallel with trend lines
extern bool TakeLines=true; // true = take profit lines
extern bool Comments=true; // true = comments
extern int Trend=0; // 1 = for UpTrendLines only, -1 = for DownTrendLines only, 0 = for all TrendLines
double Buf1[];
double Buf2[];
string Col[]={"Red","DarkBlue","Coral","DodgerBlue","SaddleBrown","MediumSeaGreen"};
int ColNum[]={Red,DeepSkyBlue,Coral,Aqua,SaddleBrown,MediumSeaGreen};
int qPoint=0; // ïåðåìåííàÿ äëÿ íîðìàëèçàöèè öåíû
int qBars; double qTime=0; // ïåðåìåííûå äëÿ ëèêâèäàöèè ãëþêîâ ïðè çàãðóçêå
int init()
{
qBars=Bars;
qSteps=MathMin(3,qSteps);
while (NormalizeDouble(Point,qPoint)==0)qPoint++;
int code=161; string Rem="DLines © GameOver";
IndicatorShortName(Rem);
SetIndexStyle(0,DRAW_ARROW);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(0,code);
SetIndexArrow(1,code);
SetIndexBuffer(0,Buf1);
SetIndexBuffer(1,Buf2);
SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.0);
SetIndexLabel(0,Rem);
SetIndexLabel(1,Rem);
return(0);
}
int deinit() {
Comment("");
ArrayInitialize(Buf1,0.0);
ArrayInitialize(Buf2,0.0);
for(int i=1;i<=LevDP;i++){
ObjectDelete("HA_"+i);ObjectDelete("LA_"+i);
ObjectDelete("HL_"+i);ObjectDelete("LL_"+i);
ObjectDelete("HHL_"+i);ObjectDelete("HLL_"+i);
ObjectDelete("HCL_"+i);ObjectDelete("LCL_"+i);
for(int j=0;j<4;j++) {ObjectDelete("HTL_"+i+j);ObjectDelete("LTL_"+i+j);}
}
}
int start(){
if (qBars!=Bars){ deinit(); Sleep(1000); qBars=Bars; qTime=0; return(0);}
if (qTime==Time[0]) return(0); qTime=Time[0]; // çàïóñêàåöà òîêà íà 1ì òèêå
// çàïîëíèëè è îòîáðàçèëè òî÷êè äåìàðêà
if (showBars==0) showBars=Bars-LevDP;
for (int cnt=showBars;cnt>LevDP;cnt--) {
Buf1[cnt]=DemHigh(cnt,LevDP);
Buf2[cnt]=DemLow(cnt,LevDP);
}
string Comm;
Comm="Trend Line["+On(TrendLine)+"]; Channel ["+On(ChannelLine)+
"]; Breakout level ["+On(HorizontLine)+"]; Targets ["+On(TakeLines)+"]\n";
for(cnt=1;cnt<=qSteps;cnt++) Comm=Comm+(TDMain(cnt));
Comm=Comm+" © GameOver ";
if (Comments==true) Comment(Comm);
return(0);
}
string TDMain(int Step){
int H1,H2,L1,L2,qExt,i,col;
double tmp,qTL,qLevel,HT[4],LT[4];
bool isHitch;
string Comm="»»» Step "+Step+" of "+qSteps+" (BackStep "+BackStep+")\n",Text,Rem,qp;
// äëÿ DownTrendLines
if (Trend<=0){
Comm=Comm+"» "+Col[Step*2-2]+" DownTrendLine ";
col=ColNum[Step*2-2];
H1=GetTD(Step+BackStep,Buf1);
H2=GetNextHighTD(H1);
qTL=(High[H2]-High[H1])/(H2-H1);
qExt=Lowest(NULL,0,MODE_LOW,H2-H1-1,H1+1); // ëîêàëüíûé ìèíèìóì ìåæäó òî÷êàìè
qLevel=High[H2]-qTL*(H2); if (Step+BackStep==1) qLevel=qLevel-qTL*startBar;
if (H1<0 || H2<0) Comm=Comm+"not enough points on the chart for construction\n";
else {
Comm=Comm+"["+DoubleToStr(High[H2],qPoint)+"»"+DoubleToStr(High[H1],qPoint)+"]";
Comm=Comm+"; Level "+DoubleToStr(qLevel,qPoint);
if (Step+BackStep==1) {
if (startBar>0) Comm=Comm+"; Future Bar "+UpHitch(-1,qLevel);
else Comm=Comm+"; Last Bar "+UpHitch(startBar,qLevel);
}
Comm=Comm+"\n";
// Àíàëèç - áûë ëè ïðîáîé òðåíäîâîé ëèíèè
i=H1;isHitch=false;Text="";
while(i>0 && isHitch==false){
tmp=High[H2]-qTL*(H2-i);
Rem="HA_"+Step;
if (High[i]>tmp){
qp=UpHitch(i,tmp);
if (qp!=""){
isHitch=true;
Text=Text+"Source "+DoubleToStr(tmp,qPoint)+" "+qp;
ObjectCreate(Rem,OBJ_ARROW,0,0,0,0,0);
ObjectSet(Rem,OBJPROP_COLOR,col);
ObjectSet(Rem,OBJPROP_PRICE1,Low[i]-Point);
ObjectSet(Rem,OBJPROP_TIME1,Time[i]);
ObjectSet(Rem,OBJPROP_ARROWCODE,241);
while(i>0){ // ïðîáîé îòìåíåí, åñëè ïîñëå ïðîáîÿ áûë íîâûé ëîó èëè çàêðûòèå íèæå
i--;
if (Low[i]<Low[qExt] || Close[i]<(Low[qExt]+(High[H1]-Low[qExt])*0.236)){
Text=Text+" (cancel)";
ObjectSet(Rem,OBJPROP_PRICE1,Low[i]-Point);
ObjectSet(Rem,OBJPROP_TIME1,Time[i]);
ObjectSet(Rem,OBJPROP_ARROWCODE,251);
break;
}
}
}
else { Text=Text+"False "+DoubleToStr(tmp,qPoint)+"; "; ObjectDelete(Rem);}
}
i--;
}
if (Text=="") Text="No breakout";
Comm=Comm+Text+"\n";
// end analysis
Rem="HL_"+Step; // ñîáñíî ëèíèÿ òðåíäà
if (TrendLine){
ObjectCreate(Rem,OBJ_TREND,0,0,0,0,0);
ObjectSet(Rem,OBJPROP_TIME1,Time[H2]);ObjectSet(Rem,OBJPROP_TIME2,Time[H1]);
ObjectSet(Rem,OBJPROP_PRICE1,High[H2]);ObjectSet(Rem,OBJPROP_PRICE2,High[H1]);
ObjectSet(Rem,OBJPROP_COLOR,col);
ObjectSet(Rem,OBJPROP_WIDTH,3-MathMin(2,Step));
}
else ObjectDelete(Rem);
Rem="HHL_"+Step; // óðîâåíü ïðîáîÿ ëèíèè òðåíäà
if (HorizontLine && (Step+BackStep)==1){
ObjectCreate(Rem,OBJ_HLINE,0,0,0,0,0);
ObjectSet(Rem,OBJPROP_PRICE1,qLevel);
ObjectSet(Rem,OBJPROP_COLOR,col);
}
else ObjectDelete(Rem);
Rem="HCL_"+Step; // ëèíèÿ êàíàëà
if (ChannelLine){
ObjectCreate(Rem,OBJ_TREND,0,0,0,0,0);
ObjectSet(Rem,OBJPROP_TIME1,Time[qExt]);ObjectSet(Rem,OBJPROP_TIME2,Time[0]);
ObjectSet(Rem,OBJPROP_PRICE1,Low[qExt]);ObjectSet(Rem,OBJPROP_PRICE2,Low[qExt]-qTL*qExt);
ObjectSet(Rem,OBJPROP_COLOR,col);
}
else ObjectDelete(Rem);
Rem="HTL_"+Step; // ëèíèè öåëåé
if (TakeLines){
HT[3]=Low[qExt]+(High[H1]-Low[qExt])*1.618-qLevel; // äîï óðîâåíü
HT[0]=High[H2]-qTL*(H2-qExt)-Low[qExt];
HT[1]=High[H2]-qTL*(H2-qExt)-Close[qExt];
qExt=Lowest(NULL,0,MODE_CLOSE,H2-H1,H1);
HT[2]=High[H2]-qTL*(H2-qExt)-Close[qExt];
Comm=Comm+"Targets: ";
for(i=0;i<4;i++){
qTL=NormalizeDouble(qLevel+HT[i],qPoint);
ObjectCreate(Rem+i,OBJ_HLINE,0,0,0,0,0);
ObjectSet(Rem+i,OBJPROP_PRICE1,qTL);
ObjectSet(Rem+i,OBJPROP_STYLE,STYLE_DOT);
ObjectSet(Rem+i,OBJPROP_COLOR,col);
Comm=Comm+DoubleToStr(qTL,qPoint)+" ("+DoubleToStr(HT[i]/Point,0)+"p.) ";
}
Comm=Comm+"\n";
}
else {
for(i=0;i<4;i++) ObjectDelete(Rem+i);
}
}
}
// äëÿ UpTrendLines
if (Trend>=0){
Comm=Comm+"» "+Col[Step*2-1]+" UpTrendLine ";
col=ColNum[Step*2-1];
L1=GetTD(Step+BackStep,Buf2);
L2=GetNextLowTD(L1);
qTL=(Low[L1]-Low[L2])/(L2-L1);
qExt=Highest(NULL,0,MODE_HIGH,L2-L1-1,L1+1); // ëîêàëüíûé ìèíèìóì ìåæäó òî÷êàìè
qLevel=Low[L2]+qTL*L2; if (Step+BackStep==1) qLevel=qLevel+qTL*startBar;
if (L1<0 || L2<0) Comm=Comm+"not enough points on the chart for construction\n";
else {
Comm=Comm+"["+DoubleToStr(Low[L2],qPoint)+"»"+DoubleToStr(Low[L1],qPoint)+"]";
Comm=Comm+"; Level "+DoubleToStr(qLevel,qPoint);
if (Step+BackStep==1) {
if (startBar>0) Comm=Comm+"; Future Bar "+DownHitch(-1,qLevel);
else Comm=Comm+"; Last Bar "+DownHitch(startBar,qLevel);
}
Comm=Comm+"\n";
// Àíàëèç - áûë ëè ïðîáîé òðåíäîâîé ëèíèè
i=L1;isHitch=false;Text="";
while(i>0 && isHitch==false){
tmp=Low[L2]+qTL*(L2-i);
Rem="LA_"+Step;
if (Low[i]<tmp){
qp=DownHitch(i,tmp);
if (qp!=""){
isHitch=true;
Text=Text+"Source "+DoubleToStr(tmp,qPoint)+" "+qp;
ObjectCreate(Rem,OBJ_ARROW,0,0,0,0,0);
ObjectSet(Rem,OBJPROP_COLOR,col);
ObjectSet(Rem,OBJPROP_PRICE1,Low[i]-Point);
ObjectSet(Rem,OBJPROP_TIME1,Time[i]);
ObjectSet(Rem,OBJPROP_ARROWCODE,242);
while(i>0){ // ïðîáîé îòìåíåí, åñëè ïîñëå ïðîáîÿ áûë íîâûé õàé èëè çàêðûòèå âûøå
i--;
if (High[i]>High[qExt] || Close[i]>High[qExt]-(High[qExt]-Low[L1])*0.236){
Text=Text+" (cancel)";
ObjectSet(Rem,OBJPROP_PRICE1,Low[i]-Point);
ObjectSet(Rem,OBJPROP_TIME1,Time[i]);
ObjectSet(Rem,OBJPROP_ARROWCODE,251);
break;
}
}
}
else { Text=Text+"False "+DoubleToStr(tmp,qPoint)+"; "; ObjectDelete(Rem);}
}
i--;
}
if (Text=="") Text="No breakout";
Comm=Comm+Text+"\n";
// end analysis
Rem="LL_"+Step; // ñîáñíî ëèíèÿ òðåíäà
if (TrendLine==1) {
ObjectCreate(Rem,OBJ_TREND,0,0,0,0,0);
ObjectSet(Rem,OBJPROP_TIME1,Time[L2]);ObjectSet(Rem,OBJPROP_TIME2,Time[L1]);
ObjectSet(Rem,OBJPROP_PRICE1,Low[L2]);ObjectSet(Rem,OBJPROP_PRICE2,Low[L1]);
ObjectSet(Rem,OBJPROP_COLOR,col);
ObjectSet(Rem,OBJPROP_WIDTH,3-MathMin(2,Step));
}
else ObjectDelete(Rem);
Rem="HLL_"+Step; // óðîâåíü ïðîáîÿ ëèíèè òðåíäà
if (HorizontLine && (Step+BackStep)==1){
ObjectCreate(Rem,OBJ_HLINE,0,0,0,0,0);
ObjectSet(Rem,OBJPROP_PRICE1,qLevel);
ObjectSet(Rem,OBJPROP_COLOR,col);
}
else ObjectDelete(Rem);
Rem="LCL_"+Step; // ëèíèÿ êàíàëà
if (ChannelLine){
ObjectCreate(Rem,OBJ_TREND,0,0,0,0,0);
ObjectSet(Rem,OBJPROP_TIME1,Time[qExt]);ObjectSet(Rem,OBJPROP_TIME2,Time[0]);
ObjectSet(Rem,OBJPROP_PRICE1,High[qExt]);ObjectSet(Rem,OBJPROP_PRICE2,High[qExt]+qTL*qExt);
ObjectSet(Rem,OBJPROP_COLOR,col);
}
else ObjectDelete(Rem);
Rem="LTL_"+Step;
if (TakeLines){ // ëèíèè öåëåé
LT[3]=qLevel-High[qExt]+(High[qExt]-Low[L1])*1.618; // äîï óðîâåíü
LT[0]=High[qExt]-qTL*(L2-qExt)-Low[L2];
LT[1]=Close[qExt]-qTL*(L2-qExt)-Low[L2];
qExt=Highest(NULL,0,MODE_CLOSE,L2-L1,L1);
LT[2]=Close[qExt]-qTL*(L2-qExt)-Low[L2];
Comm=Comm+"Targets: ";
for(i=0;i<4;i++){
qTL=NormalizeDouble(qLevel-LT[i],qPoint);
ObjectCreate(Rem+i,OBJ_HLINE,0,0,0,0,0);
ObjectSet(Rem+i,OBJPROP_PRICE1,qTL);
ObjectSet(Rem+i,OBJPROP_STYLE,STYLE_DOT);
ObjectSet(Rem+i,OBJPROP_COLOR,col);
Comm=Comm+DoubleToStr(qTL,qPoint)+" ("+DoubleToStr(LT[i]/Point,0)+"p.) ";
}
Comm=Comm+"\n";
}
else {
for(i=0;i<4;i++) ObjectDelete(Rem+i);
}
}
}
return(Comm);
}
int GetTD(int P, double Arr[]){
int i=0,j=0;
while(j<P){ i++; while(Arr[i]==0){i++;if(i>showBars-2)return(-1);} j++;}
return (i);
}
int GetNextHighTD(int P){
int i=P+1;
while(Buf1[i]<=High[P]){i++;if(i>showBars-2)return(-1);}
return (i);
}
int GetNextLowTD(int P){
int i=P+1;
while(Buf2[i]>=Low[P] || Buf2[i]==0){i++;if(i>showBars-2)return(-1);}
return (i);
}
// ðåêóðñèâíàÿ ïðîâåðêà íà óñëîâèÿ Äåìàðêà (õàé), âîçâðàùàåò çíà÷åíèå èëè 0
double DemHigh(int cnt, int sh){
if (High[cnt]>=High[cnt+sh] && High[cnt]>High[cnt-sh]) {
if (sh>1) return(DemHigh(cnt,sh-1));
else return(High[cnt]);
}
else return(0);
}
// ðåêóðñèâíàÿ ïðîâåðêà íà óñëîâèÿ Äåìàðêà (ëîó), âîçâðàùàåò çíà÷åíèå èëè 0
double DemLow(int cnt, int sh){
if (Low[cnt]<=Low[cnt+sh] && Low[cnt]<Low[cnt-sh]) {
if (sh>1) return(DemLow(cnt,sh-1));
else return(Low[cnt]);
}
else return(0);
}
string On(bool On){
if (On) return("on"); else return("off");
}
string UpHitch(int P, double qLevel){ // îïðåäåëåíèå êâàëèôèêàòîðîâ ïðîðûâà ââåðõ
string Comm="";
if (Close[P+1]<Close[P+2]) Comm=Comm+" 1";
if (P>=0 && Open[P]>qLevel) Comm=Comm+" 2";
if (2*Close[P+1]-Low[P+1]<qLevel) Comm=Comm+" 3";
if (Comm!="") Comm="[ Break Qualificator:"+Comm+" ]";
return(Comm);
}
string DownHitch(int P, double qLevel){ // îïðåäåëåíèå êâàëèôèêàòîðîâ ïðîðûâà âíèç
string Comm="";
if (Close[P+1]>Close[P+2]) Comm=Comm+" 1";
if (P>=0 && Open[P]<qLevel) Comm=Comm+" 2";
if (2*Close[P+1]-High[P+1]>qLevel) Comm=Comm+" 3";
if (Comm!="") Comm="[ Break Qualificator:"+Comm+" ]";
return(Comm);
}
Comments