This script is a sophisticated technical analysis tool designed for the MetaTrader platform. It enhances the standard ZigZag indicator by adding advanced geometric logic, automated price retracement calculations, and dynamic visual filtering.
Instead of simply showing every price swing, this tool identifies significant structural points (fractals) and calculates the mathematical relationship between them to help traders identify specific harmonic patterns and trend reversals.
Core Functionality
1. Intelligent Fractal Identification The script identifies "peaks" and "troughs" in price action using a depth and backstep system. Unlike a standard ZigZag, it cleans up the data by ensuring that only the most significant local highs and lows are connected, filtering out market "noise."
2. Automated Retracement Analysis (Pesavento & Gartley) The logic automatically calculates the percentage of recovery between consecutive price points. It cross-references these percentages against specific mathematical constants:
- Pesavento Numbers: The script identifies standard Fibonacci-related retracements.
- Gartley Patterns: It specifically highlights the 0.886 level, which is a key requirement for identifying Gartley harmonic patterns.
3. Dynamic Visual Filtering The tool offers several modes to control how much information is displayed on your chart:
- Hidden Mode: You can choose to hide all lines, show only those within a specific percentage range (e.g., 0.21% to 5%), or only show the lines that perfectly match specific mathematical constants.
- Precision Adjustments: Users can define a "Delta" (tolerance). If a price retracement is very close to a target number (within your specified margin), the script will automatically label it as that specific number.
4. Automated Labeling and Drawing The script manages the chart objects automatically:
- It draws dotted trend lines connecting significant highs and lows.
- It places text labels on the chart to show the exact retracement value.
- It dynamically updates or deletes these objects in real-time as new price data arrives, ensuring that "old" or corrected peaks do not clutter the workspace.
5. Fibonacci Integration The script includes an optional feature to automatically draw a Fibonacci tool relative to the most recent ZigZag legs, providing an immediate visual reference for potential support and resistance levels.
Summary for the User
This is not just a trend-following tool; it is a pattern recognition engine. By automating the math behind harmonic trading (like Gartley patterns), it allows you to see significant structural retracements instantly without having to manually calculate percentages or place multiple Fibonacci tools on every move of the market.
//+----------------------------------------------------------------------+
//|ZigZag ñ ÷èëàìè Ïåñàâåíòî |
//|----------------------------------------------------------------------+ |
//|ExtHidden - 0 - âñå ëèíèè ñêðûòû. Îáû÷íûé ZigZag. |
//| 1 - ïîêàçûâàåò âñå ëèíèè ìåæäó ôðàêòàëàìè, ó êîòîðûõ |
//| ïðîöåíò âîññòàíîâëåíèÿ >0.21 è <5. |
//| 2 - ïîêàçûâàåò òîëüêî òå ëèíèè, ãäå ïðîöåíò âîññòàíî- |
//| âëåíèÿ ðàâåí ÷èñëàì Ïåñàâåíòî (è 0.866 äëÿ ïîñòðî- |
//| åíèÿ ïàòòåðíîâ Gartley) |
//| 3 - ïîêàçûâàåò ÷èñëà, ïåðå÷èñëåííûå â ïóíêòå 2 |
//| è ñîîòâåòñòâóþùèå ëèíèè |
//| 4 - ïîêàçûâàåò ÷èñëà íå Ïåñàâåíòî è ñîîòâåòñòâóþùèå ëèíèè |
//| |
//| |
//|ExtFractal - êîëè÷åñòâî ôðàêòàëîâ (ìàêñèìóìîâ, ìèíèìóìîâ), |
//| îò êîòîðûõ èäóò ëèíèè ê äðóãèì ôðàêòàëàì |
//| |
//|ExtFractalEnd - êîëè÷åñòâî ôðàêòàëîâ, ê êîòîðûì èäóò ëèíèè |
//| äàëüøå ýòîãî ôðàêòàëà ñîåäèíÿþùèõ ëèíèé íå áóäåò |
//| Åñëè ExtFractalEnd=0 òî ïîñëåäíèé ôðàêòàë ðàâåí |
//| ìàêñèìàëüíîìó ÷èñëó ôðàêòàëîâ. |
//| Ìèíèìàëüíîå çíà÷åíèå ExtFractalEnd=5 |
//| |
//|ExtDeltaType - 0 - âûâîäÿòñÿ ïðîöåíòû âîññòàíîâëåíèÿ "êàê åñòü" |
//| 1 - ðàñ÷åò äîïóñêà (%-÷èñëî Ïåñàâåíòî)<ExtDelta |
//| 2 - ((%-÷èñëî Ïåñàâåíòî)/÷èñëî Ïåñàâåíòî)<ExtDelta |
//| |
//| |
//|ExtDelta - (äîïóñê) îòêëîíåíèå â ðàñ÷åòå. Çàäàåò âåëè÷èíó |
//| ïîòåíöèàëüíîé ðàçâîðîòíîé çîíû. |
//| äîëæíî áûòü 0<ExtDelta<1 |
//| |
//|ExtFibo - true - âûâîäÿòñÿ óðîâíè Ôèáîíà÷÷è |
//| false - íå âûâîäÿòñÿ óðîâíè Ôèáîíà÷÷è (îòíîñèòåëüíî |
//| ïðåäïîñëåäíåãî êîëåíà ZigZag-a) |
//| |
//+----------------------------------------------------------------------+
#property copyright "nen@.....ru"
#property link "http://onix-trade.net/forum/index.php?act=post&do=reply_post&f=9&t=118"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- indicator parameters
extern int ExtDepth=12;
extern int ExtHidden=1;
extern int ExtFractal=10;
extern int ExtFractalEnd=10;
extern double ExtDelta=0.04;
extern int ExtDeltaType=1;
extern bool ExtFibo=false;
extern color ExtLine=DarkBlue;
extern color ExtPesavento=Yellow;
extern color ExtGartley866=GreenYellow;
extern color ExtNotFibo=SlateGray;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
//---- indicator buffers
// Ìàññèâ äëÿ îòðèñîâêè ZigZag
double zz[];
// Ìàññèâ ìèíèìóìîâ ÷åðíîâîé
double ExtMapBuffer[];
// Ìàññèâ ìàêñèìóìîâ ÷åðíîâîé
double ExtMapBuffer2[];
// Ìàññèâ ÷èñåë Ïåñàâåíòî (Ôèáû è ìîäèôèöèðîâàííûå Ôèáû)
double fi[]={0.382, 0.5, 0.618, 0.707, 0.786, 0.841, 0.886, 1.0, 1.128, 1.272, 1.414, 1.5, 1.618, 2.0, 2.414, 2.618, 4.0};
string fitxt[]={ ".382", "0.5", ".618", ".707", ".786", ".841", ".886", "1.0", "1.128", "1.272", "1.414", "1.5", "1.618", "2.0", "2.414", "2.618", "4.0" };
// Ìàòðèöà äëÿ ïîèñêà èñ÷åçíóâøèõ áàðîâ afr - ìàññèâ çíà÷åíèé âðåìåíè ïÿòè ïîñëåäíèõ ôðàêòàëîâ + îäíà ÿ÷åéêà - ïðèçíàê èíèöèàëèçàöèè
// afrl - ìèíèìóìû, afrh - ìàêñèìóìû
int afr[]={0.0,0.0,0.0,0.0,0.0,0.0};
double afrl[]={0.0,0.0,0.0,0.0,0.0}, afrh[]={0.0,0.0,0.0,0.0,0.0};
double HL,HLp,kk,kj,Angle;
// LowPrim,HighPrim,LowLast,HighLast - çíà÷åíèÿ ìèíèìóìîâ è ìàêñèìóìîâ áàðîâ
double LowPrim,HighPrim,LowLast,HighLast;
// numLowPrim,numHighPrim,numLowLast,numHighLast -íîìåðà áàðîâ
int numLowPrim,numHighPrim,numLowLast,numHighLast,k,k1,k2,ki,countLow1,countHigh1,shift,shift1;
// Âðåìÿ ñâå÷è ñ ïåðâûì îò íóëåâîãî áàðà ôðàêòàëîì
int timeFr1,timeFr1new,timeFr2Low,timeFr2High;
// Êîëè÷åñòâî ëèíèé, èäóùèõ îò ïåðâîãî îò íóëåâîãî áàðà ôðàêòàëà ê ñîñåäíèì ôðàêòàëàì
int countLineFr1;
// Ñ÷åò÷èê ôðàêòàëîâ
int countFr;
// Áàð, äî êîòîðîãî íàäî ðèñîâàòü ñîåäèíèòåëüíûå ëèíèè îò íóëåâîãî áàðà
int countBarEnd=0;
// Áàð, äî êîòîðîãî íàäî ïåðåñ÷èòûâàòü îò íóëåâîãî áàðà
int numBar=0;
// Íîìåð îáúåêòà
int numOb;
//Màêñèìóì èëè ìèíèìóì áàðà ïåðâîãî ôðàêòàëà (è ïðåäûäóùåãî ôðàêòàëà)
double hFr1, lFr1, hFr2, lFr2;
// Ôëàãè
// flagFrNew=true - îáðàçîâàëñÿ íîâûé ôðàêòàë èëè ïåðâûé ôðàêòàë ñìåñòèëñÿ íà äðóãîé áàð. =false - ïî óìîë÷àíèþ.
// flagFr=true - ïîñëåäíèé ôðàêòàë ìàêñèìóì. false - ïîñëåäíèé ôðàêòàë ìèíèìóì.
bool flagLow,flagHigh,flagFr,flagFrNew=false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(5);
//---- drawing settings
SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
SetIndexBuffer(0,zz);
SetIndexBuffer(1,ExtMapBuffer);
SetIndexBuffer(2,ExtMapBuffer2);
SetIndexEmptyValue(0,0.0);
ArraySetAsSeries(zz,true);
ArraySetAsSeries(ExtMapBuffer,true);
ArraySetAsSeries(ExtMapBuffer2,true);
//---- indicator short name
IndicatorShortName("ZZ("+ExtDepth+")");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| Äåèíèöèàëèçàöèÿ. Óäàëåíèå âñåõ òðåíäîâûõ ëèíèé è òåêñòîâûõ îáúåêòîâ
//+------------------------------------------------------------------+
int deinit(){ ObjectsDeleteAll(0,2); ObjectsDeleteAll(0,21); ObjectDelete("Fibo"); return(0);}
//********************************************************
int start()
{
int counted_bars=IndicatorCounted();
if( counted_bars<0 )
{
Alert("Ñáîé ðàñ÷åòà èíäèêàòîðà");
return(-1);
}
// ZigZag èç ÌÒ. Íà÷àëî.
int shift, back,lasthighpos,lastlowpos;
double val,res;
double curlow,curhigh,lasthigh,lastlow;
for(shift=Bars-ExtDepth; shift>=0; shift--)
{
val=Low[Lowest(NULL,0,MODE_LOW,ExtDepth,shift)];
if(val==lastlow) val=0.0;
else
{
lastlow=val;
if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;
else
{
for(back=1; back<=ExtBackstep; back++)
{
res=ExtMapBuffer[shift+back];
if((res!=0)&&(res>val)) ExtMapBuffer[shift+back]=0.0;
}
}
}
ExtMapBuffer[shift]=val;
//--- high
val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)];
if(val==lasthigh) val=0.0;
else
{
lasthigh=val;
if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
else
{
for(back=1; back<=ExtBackstep; back++)
{
res=ExtMapBuffer2[shift+back];
if((res!=0)&&(res<val)) ExtMapBuffer2[shift+back]=0.0;
}
}
}
ExtMapBuffer2[shift]=val;
}
// final cutting
lasthigh=-1; lasthighpos=-1;
lastlow=-1; lastlowpos=-1;
for(shift=Bars-ExtDepth; shift>=0; shift--)
{
curlow=ExtMapBuffer[shift];
curhigh=ExtMapBuffer2[shift];
if((curlow==0)&&(curhigh==0)) continue;
//---
if(curhigh!=0)
{
if(lasthigh>0)
{
if(lasthigh<curhigh) ExtMapBuffer2[lasthighpos]=0;
else ExtMapBuffer2[shift]=0;
}
//---
if(lasthigh<curhigh || lasthigh<0)
{
lasthigh=curhigh;
lasthighpos=shift;
}
lastlow=-1;
}
//----
if(curlow!=0)
{
if(lastlow>0)
{
if(lastlow>curlow) ExtMapBuffer[lastlowpos]=0;
else ExtMapBuffer[shift]=0;
}
//---
if((curlow<lastlow)||(lastlow<0))
{
lastlow=curlow;
lastlowpos=shift;
}
lasthigh=-1;
}
}
countLow1=0;
countHigh1=0;
for(shift=Bars-1; shift>=0; shift--)
{
zz[shift]=ExtMapBuffer[shift];
if(shift>=Bars-ExtDepth) {ExtMapBuffer2[shift]=0.0;ExtMapBuffer[shift]=0.0; zz[shift]=0.0;}
else
{
res=ExtMapBuffer2[shift];
if(res!=0.0) zz[shift]=res;
}
if (ExtMapBuffer[shift]>0.0) {countLow1++;}
if (ExtMapBuffer2[shift]>0.0) {countHigh1++;}
}
// ZigZag èç ÌÒ. Êîíåö. Äîáàâëåí â ZigZag ïîäñ÷åò êîëè÷åñòâà ôðàêòàëàâ countLow1 è countHigh1.
// Äàëåå èäåò "äîîñíàñòêà" ZigZag-à.
// Ïðîâåðêà ïðàâèëüíîñòè ââåäåííûõ âíåøíèõ ïåðåìåííûõ
if (countBarEnd==0)
{
if (ExtDelta<=0) ExtDelta=0.001;
if (ExtDelta>1) ExtDelta=0.999;
if (ExtHidden<0) ExtHidden=0;
if (ExtHidden>4) ExtHidden=4;
if (ExtDeltaType<0) ExtDeltaType=0;
if (ExtDeltaType>3) ExtDeltaType=3;
if (ExtFractalEnd>0)
{
if (ExtFractalEnd<5) ExtFractalEnd=5;
if (countLow1>ExtFractalEnd) countLow1=ExtFractalEnd;
if (countHigh1>ExtFractalEnd) countHigh1=ExtFractalEnd;
}
}
if (flagFrNew)
{
countLow1=0;
countHigh1=0;
for(shift=0; shift<=numBar; shift++)
{
if (ExtMapBuffer[shift]>0.0) {countLow1++;}
if (ExtMapBuffer2[shift]>0.0) {countHigh1++;}
}
counted_bars=3;
}
if (Bars - counted_bars>2 && ExtHidden>0)
{
// Èíèöèàëèçàöèÿ ìàòðèöû
if (afr[5]<1)
{
k=0;
for (shift=0; shift<Bars && k<5; shift++)
{
if (zz[shift]>0)
{
afr[k]=Time[shift];
if (zz[shift]==ExtMapBuffer[shift]) {afrl[k]=Low[shift]; afrh[k]=0.0;}
if (zz[shift]==ExtMapBuffer2[shift]) {afrh[k]=High[shift]; afrl[k]=0.0;}
k++;
}
}
afr[k]=1;
if (ExtFibo)
{
if (afrl[1]>0) ObjectCreate("fibo",OBJ_FIBO,0,afr[2],afrh[2],afr[1],afrl[1]);
else ObjectCreate("fibo",OBJ_FIBO,0,afr[2],afrl[2],afr[1],afrh[1]);
}
}
for (shift=0; shift<Bars; shift++) // Ïîèñê âðåìåíè áàðà ïåðâîãî ôðàêòàëà, ñ÷èòàÿ îò íóëåâîãî áàðà
{
if (zz[shift]>0.0)
{
timeFr1=Time[shift];
if (ExtMapBuffer[shift]==zz[shift]) {lFr1=Low[shift]; hFr1=0.0;}
if (ExtMapBuffer2[shift]==zz[shift]) {hFr1=High[shift]; lFr1=0.0;}
break;
}
}
// Ïîèñê íîìåðà áàðà, äî êîòîðîãî áóäóò ðèñîâàòüñÿ ñîåäèíèòåëüíûå ëèíèè
if (countBarEnd==0)
{
if (ExtFractalEnd>0)
{
k=ExtFractalEnd;
for (shift=0; shift<Bars && k>0; shift++) if (zz[shift]>0 && ExtMapBuffer2[shift]>0) {countBarEnd=shift; k--;}
}
else countBarEnd=Bars-3;
}
//-----------1 Îòðèñîâêà ìàêñèìóìîâ. Íà÷àëî.
//+--------------------------------------------------------------------------+
//| Âûâîä ñîåäèíÿþùèõ ëèíèé è ÷èñåë Ïåñàâåíòî è 0.866 äëÿ ìàêñèìóìîâ ZigZag-a
//| Îòðèñîâêà èäåò îò íóëåâîãî áàðà
//+--------------------------------------------------------------------------+
numLowPrim=0; numLowLast=0;
numHighPrim=0; numHighLast=0;
LowPrim=0.0; LowLast=0.0;
HighPrim=0.0; HighLast=0.0;
flagHigh=false;
Angle=-100;
if (flagFrNew) countFr=1;
else countFr=ExtFractal;
for (k=0; (k<Bars-1 && countHigh1>0 && countFr>0); k++)
{
if (ExtMapBuffer[k]>0.0 && LowPrim==0.0 && HighPrim>0 && ExtMapBuffer[k]==zz[k]) {LowPrim=ExtMapBuffer[k]; numLowPrim=k;}
if (ExtMapBuffer[k]>0.0 && ExtMapBuffer[k]<LowPrim && HighPrim>0 && ExtMapBuffer[k]==zz[k]) {LowPrim=ExtMapBuffer[k]; numLowPrim=k;}
if (ExtMapBuffer2[k]>0.0 && ExtMapBuffer2[k]==zz[k])
{
if (HighPrim>0)
{
if (HighLast>0)
{
if (flagHigh)
{
if (ExtMapBuffer2[k]>HighLast) {HighLast=High[k]; numHighLast=k;}
}
else
{
if (ExtMapBuffer2[k]>HighPrim) flagHigh=true;
HighLast=High[k];
numHighLast=k;
}
}
else {numHighLast=k; HighLast=High[k];}
HL=High[numHighLast]-Low[numLowPrim];
kj=(HighPrim-HighLast)*10000/(numHighLast-numHighPrim);
if (HL>0 && (Angle>kj || Angle==-100)) // Ïðîâåðêà óãëà íàêëîíà ëèíèè
{
Angle=kj;
// Ñîçäàíèå ëèíèè è òåêñòîâîãî îáúåêòà
HLp=High[numHighPrim]-Low[numLowPrim];
k1=MathCeil((numHighPrim+numHighLast)/2);
kj=HLp/HL;
if (kj>0.21 && kj<=5)
{
// Ñîçäàíèå òåêñòîâîãî îáúåêòà (÷èñëà Ïåñàâåíòî). % âîññòàíîâëåíèÿ ìåæäó ìàêñèìóìàìè
kk=kj;
k2=1;
if (ExtDeltaType==2) for (ki=16;ki>=0;ki--) {if (MathAbs((fi[ki]-kj)/fi[ki])<=ExtDelta) {kk=fi[ki]; k2=-1; break;}}
if (ExtDeltaType==1) for (ki=16;ki>=0;ki--) {if (MathAbs(fi[ki]-kj)<=ExtDelta) {kk=fi[ki]; k2=-1; break;}}
if (k2<0)
// ïðîöåíò âîññòàíîâëåíèÿ ÷èñëà Ïåñàâåíòî è 0.866
{
if (ExtHidden!=4 && ExtHidden>0)
{
ObjectCreate("phtxt" + Time[numHighPrim] + "_" + Time[numHighLast],OBJ_TEXT,0,Time[k1],MathAbs((High[numHighPrim]+High[numHighLast])/2));
if (kk==0.886) // Gartley
ObjectSetText("phtxt" + Time[numHighPrim] + "_" + Time[numHighLast],fitxt[ki],7,"Arial", ExtGartley866);
else
ObjectSetText("phtxt" + Time[numHighPrim] + "_" + Time[numHighLast],fitxt[ki],7,"Arial",ExtPesavento);
}
}
else
// ïðîöåíò âîññòàíîâëåíèÿ (íå Ïåñàâåíòî è 0.866)
{
if (ExtHidden==1 || ExtHidden==4)
{
ObjectCreate("phtxt" + Time[numHighPrim] + "_" + Time[numHighLast],OBJ_TEXT,0,Time[k1],MathAbs((High[numHighPrim]+High[numHighLast])/2));
ObjectSetText("phtxt" + Time[numHighPrim] + "_" + Time[numHighLast],""+DoubleToStr(kk,2),7,"Arial",ExtNotFibo);
}
}
if ((ExtHidden==2 && k2<0) || (ExtHidden!=0 && ExtHidden!=2))
{
ObjectCreate("ph" + Time[numHighPrim] + "_" + Time[numHighLast],OBJ_TREND,0,Time[numHighPrim],High[numHighPrim],Time[numHighLast],High[numHighLast]);
ObjectSet("ph" + Time[numHighPrim] + "_" + Time[numHighLast],OBJPROP_RAY,false);
ObjectSet("ph" + Time[numHighPrim] + "_" + Time[numHighLast],OBJPROP_STYLE,STYLE_DOT);
ObjectSet("ph" + Time[numHighPrim] + "_" + Time[numHighLast],OBJPROP_COLOR,ExtLine);
}
}
}
}
else
{numHighPrim=k; HighPrim=High[k];}
}
// Ïåðåõîä íà ñëåäóþùèé ôðàêòàë
if (k>countBarEnd)
// if (k>Bars-3)
{
k=numHighPrim+1; countHigh1--; countFr--;
numLowPrim=0; numLowLast=0;
numHighPrim=0; numHighLast=0;
LowPrim=0.0; LowLast=0.0;
HighPrim=0.0; HighLast=0.0;
flagHigh=false;
Angle=-100;
}
}
//-----------1 Îòðèñîâêà ìàêñèìóìîâ. Êîíåö.
//-----------2 Îòðèñîâêà ìèíèìóìîâ. Íà÷àëî.
//+-------------------------------------------------------------------------+
//| Âûâîä ñîåäèíÿþùèõ ëèíèé è ÷èñåë Ïåñàâåíòî è 0.866 äëÿ ìèíèìóìîâ ZigZag-a
//| Îòðèñîâêà èäåò îò íóëåâîãî áàðà
//+-------------------------------------------------------------------------+
numLowPrim=0; numLowLast=0;
numHighPrim=0; numHighLast=0;
LowPrim=0.0; LowLast=0.0;
HighPrim=0.0; HighLast=0.0;
flagLow=false;
Angle=-100;
if (flagFrNew) countFr=1;
else countFr=ExtFractal;
for (k=0; (k<Bars && countLow1>0 && countFr>0); k++)
{
if (ExtMapBuffer2[k]>HighPrim && LowPrim>0) {HighPrim=High[k]; numHighPrim=k;}
if (ExtMapBuffer[k]>0.0 && ExtMapBuffer[k]==zz[k])
{
if (LowPrim>0)
{
if (LowLast>0)
{
if (flagLow)
{
if (ExtMapBuffer[k]<LowLast) {LowLast=Low[k]; numLowLast=k;}
}
else
{
if (ExtMapBuffer[k]<LowPrim) flagLow=true;
LowLast=Low[k];
numLowLast=k;
}
}
else {numLowLast=k; LowLast=Low[k];}
// âûâîä ñîåäèíÿþùèõ ëèíèé è ïðîöåíòîâ âîññòàíîâëåíèÿ(÷èñåë Ïåñàâåíòî)
HL=High[numHighPrim]-Low[numLowLast];
kj=(LowPrim-LowLast)*1000/(numLowLast-numLowPrim);
if (HL>0 && (Angle<kj || Angle==-100)) // Ïðîâåðêà óãëà íàêëîíà ëèíèè
{
Angle=kj;
HLp=High[numHighPrim]-Low[numLowPrim];
k1=MathCeil((numLowPrim+numLowLast)/2);
kj=HLp/HL;
if (kj>0.21 && kj<=5)
{
// Ñîçäàíèå òåêñòîâîãî îáúåêòà (÷èñëà Ïåñàâåíòî). % âîññòàíîâëåíèÿ ìåæäó ìèíèìóìàìè
kk=kj;
k2=1;
if (ExtDeltaType==2) for (ki=16;ki>=0;ki--) {if (MathAbs((fi[ki]-kj)/fi[ki])<=ExtDelta) {kk=fi[ki]; k2=-1; break;}}
if (ExtDeltaType==1) for (ki=16;ki>=0;ki--) {if (MathAbs(fi[ki]-kj)<=ExtDelta) {kk=fi[ki]; k2=-1; break;}}
if (k2<0)
// ïðîöåíò âîññòàíîâëåíèÿ ÷èñëà Ïåñàâåíòî è 0.866
{
if (ExtHidden!=4 && ExtHidden>0)
{
ObjectCreate("pltxt" + Time[numLowPrim] + "_" + Time[numLowLast],OBJ_TEXT,0,Time[k1],MathAbs((Low[numLowPrim]+Low[numLowLast])/2));
if (kk==0.886) // Gartley
ObjectSetText("pltxt" + Time[numLowPrim] + "_" + Time[numLowLast],fitxt[ki],7,"Arial", ExtGartley866);
else
ObjectSetText("pltxt" + Time[numLowPrim] + "_" + Time[numLowLast],fitxt[ki],7,"Arial",ExtPesavento);
}
}
else
// ïðîöåíò âîññòàíîâëåíèÿ (íå Ïåñàâåíòî è 0.866)
{
if (ExtHidden==1 || ExtHidden==4)
ObjectCreate("pltxt" + Time[numLowPrim] + "_" + Time[numLowLast],OBJ_TEXT,0,Time[k1],MathAbs((Low[numLowPrim]+Low[numLowLast])/2));
ObjectSetText("pltxt" + Time[numLowPrim] + "_" + Time[numLowLast],""+DoubleToStr(kk,2),7,"Arial",ExtNotFibo);
}
if ((ExtHidden==2 && k2<0) || (ExtHidden!=0 && ExtHidden!=2))
{
ObjectCreate("pl" + Time[numLowPrim] + "_" + Time[numLowLast],OBJ_TREND,0,Time[numLowPrim],Low[numLowPrim],Time[numLowLast],Low[numLowLast]);
ObjectSet("pl" + Time[numLowPrim] + "_" + Time[numLowLast],OBJPROP_RAY,false);
ObjectSet("pl" + Time[numLowPrim] + "_" + Time[numLowLast],OBJPROP_STYLE,STYLE_DOT);
ObjectSet("pl" + Time[numLowPrim] + "_" + Time[numLowLast],OBJPROP_COLOR,ExtLine);
}
}
}
}
else {numLowPrim=k; LowPrim=Low[k];}
}
// Ïåðåõîä íà ñëåäóþùèé ôðàêòàë
if (k>countBarEnd)
// if (k>Bars-3)
{
k=numLowPrim+1; countLow1--; countFr--;
numLowPrim=0; numLowLast=0;
numHighPrim=0; numHighLast=0;
LowPrim=0.0; LowLast=0.0;
HighPrim=0.0; HighLast=0.0;
flagLow=false;
Angle=-100;
}
}
flagFrNew=false;
numBar=0;
//-----------2 Îòðèñîâêà ìèíèìóìîâ. Êîíåö.
}
else // counted_bars<=2 Ïðîâåðêà ñìåùåíèé ôðàêòàëîâ.
// Ïðîâåðêà íà ðàçðåøåíèå âûâîäà îñíàñòêè. Íà÷àëî.
if (ExtHidden>0)
//
{
//
// Êîððåêöèÿ ñîåäèíÿþùèõ ëèíèé è ÷èñåë. Íà÷àëî.
{
// Ïîèñê âðåìåíè áàðà ïåðâîãî ôðàêòàëà, ñ÷èòàÿ îò íóëåâîãî áàðà
for (shift1=0; shift1<Bars; shift1++)
{
if (zz[shift1]>0.0)
{
timeFr1new=Time[shift1];
break;
}
}
// Ïîèñê áàðà, íà êîòîðîì áûë ïîñëåäíèé ôðàêòàë
shift=iBarShift(Symbol(),Period(),timeFr1);
// Ñðàâíåíèå òåêóùåãî çíà÷åíèÿ ôðàêòàëà ñ òåì, êîòîðûé áûë ðàíåå
// Îáðàçîâàëñÿ íîâûé ôðàêòàë
if (timeFr1new!=timeFr1)
{
flagFrNew=true;
if (shift>numBar) numBar=shift;
afr[5]=0;
}
// Ôðàêòàë íà ìàêñèìóìå ñäâèíóëñÿ íà äðóãîé áàð
if (hFr1>0 && zz[shift]==0.0)
{
flagFrNew=true;
if (shift>numBar) numBar=shift;
afr[5]=0;
}
// Ôðàêòàë íà ìèíèìóìå ñäâèíóëñÿ íà äðóãîé áàð
if (lFr1>0 && zz[shift]==0.0)
{
flagFrNew=true;
if (shift>numBar) numBar=shift;
afr[5]=0;
}
//-----------3 Ñìåñòèëñÿ ìèíèìóì èëè ìàêñèìóì, íî îñòàëñÿ íà òîì æå áàðå. Íà÷àëî.
//============= 1 ñìåñòèëñÿ ìàêñèìóì. Íà÷àëî.
if (hFr1-High[shift]!=0 && hFr1>0)
{
numLowPrim=0; numLowLast=0;
numHighPrim=shift; numHighLast=0;
LowPrim=0.0; LowLast=0.0;
HighPrim=High[shift]; HighLast=0.0;
flagHigh=false;
Angle=-100;
for (k=shift+1; k<Bars; k++)
{
if (ExtMapBuffer[k]>0.0 && LowPrim==0.0 && ExtMapBuffer[k]==zz[k]) {LowPrim=ExtMapBuffer[k]; numLowPrim=k;}
if (ExtMapBuffer[k]>0.0 && ExtMapBuffer[k]<LowPrim && ExtMapBuffer[k]==zz[k]) {LowPrim=ExtMapBuffer[k]; numLowPrim=k;}
if (ExtMapBuffer2[k]>0.0 && ExtMapBuffer2[k]==zz[k])
{
if (HighLast>0)
{
if (flagHigh)
{
if (ExtMapBuffer2[k]>HighLast) {HighLast=High[k]; numHighLast=k;}
}
else
{
if (ExtMapBuffer2[k]>HighPrim) flagHigh=true;
HighLast=High[k];
numHighLast=k;
}
}
else {numHighLast=k; HighLast=High[k];}
HL=High[numHighLast]-Low[numLowPrim];
kj=(HighPrim-HighLast)*10000/(numHighLast-numHighPrim);
if (HL>0 && (Angle>kj || Angle==-100)) // Ïðîâåðêà óãëà íàêëîíà ëèíèè
{
Angle=kj;
// Ñîçäàíèå ëèíèè
HLp=High[numHighPrim]-Low[numLowPrim];
k1=MathCeil((shift+numHighLast)/2);
kj=HLp/HL;
// Ïîèñê ñòàðîé ñîåäèíèòåëüíîé ëèíèè
numOb=ObjectFind("ph" + Time[numHighPrim] + "_" + Time[numHighLast]);
if (numOb>-1)
{
if (kj>0.21 && kj<=5)
{
// Ïåðåìåùåíèå îáúåêòîâ
ObjectMove("ph" + Time[numHighPrim] + "_" + Time[numHighLast],0,Time[numHighPrim],High[numHighPrim]);
ObjectMove("phtxt" + Time[numHighPrim] + "_" + Time[numHighLast],0,Time[k1],MathAbs((High[numHighPrim]+High[numHighLast])/2));
// Ñîçäàíèå òåêñòîâîãî îáúåêòà (÷èñëà Ïåñàâåíòî). % âîññòàíîâëåíèÿ ìåæäó ìàêñèìóìàìè
kk=kj;
k2=1;
if (ExtDeltaType==2) for (ki=16;ki>=0;ki--) {if (MathAbs((fi[ki]-kj)/fi[ki])<=ExtDelta) {kk=fi[ki]; k2=-1; break;}}
if (ExtDeltaType==1) for (ki=16;ki>=0;ki--) {if (MathAbs(fi[ki]-kj)<=ExtDelta) {kk=fi[ki]; k2=-1; break;}}
if (k2<0)
// ïðîöåíò âîññòàíîâëåíèÿ ÷èñëî Ïåñàâåíòî
if (ExtHidden!=4 && ExtHidden>0)
{
if (kk==0.886)
ObjectSetText("phtxt" + Time[numHighPrim] + "_" + Time[numHighLast],fitxt[ki],7,"Arial", ExtGartley866);
else
ObjectSetText("phtxt" + Time[numHighPrim] + "_" + Time[numHighLast],fitxt[ki],7,"Arial",ExtPesavento);
}
else
// ïðîöåíò âîññòàíîâëåíèÿ (íå Ïåñàâåíòî)
if (ExtHidden==1 || ExtHidden==4)
ObjectSetText("phtxt" + Time[numHighPrim] + "_" + Time[numHighLast],""+DoubleToStr(kk,2),7,"Arial",ExtNotFibo);
}
else
{
ObjectDelete("ph" + Time[numHighPrim] + "_" + Time[numHighLast]);
ObjectDelete("phtxt" + Time[numHighPrim] + "_" + Time[numHighLast]);
}
}
else
{
//******* Ïðîðèñîâêà íîâîé ëèíèè, åñëè îíà ïîÿâèëàñü.
if (kj>0.21 && kj<=5)
{
// Ñîçäàíèå òåêñòîâîãî îáúåêòà (÷èñëà Ïåñàâåíòî). % âîññòàíîâëåíèÿ ìåæäó ìàêñèìóìàìè
kk=kj;
k2=1;
if (ExtDeltaType==1) for (ki=16;ki>=0;ki--) {if (MathAbs(fi[ki]-kj)<=ExtDelta) {kk=fi[ki]; k2=-1; break;}}
if (ExtDeltaType==2) for (ki=16;ki>=0;ki--) {if (MathAbs((fi[ki]-kj)/fi[ki])<=ExtDelta) {kk=fi[ki]; k2=-1; break;}}
if (k2<0)
// ïðîöåíò âîññòàíîâëåíèÿ ÷èñëà Ïåñàâåíòî è 0.866
{
if (ExtHidden!=4 && ExtHidden>0)
{
ObjectCreate("phtxt" + Time[numHighPrim] + "_" + Time[numHighLast],OBJ_TEXT,0,Time[k1],MathAbs((High[numHighPrim]+High[numHighLast])/2));
if (kk==0.886) // Gartley
ObjectSetText("phtxt" + Time[numHighPrim] + "_" + Time[numHighLast],fitxt[ki],7,"Arial", ExtGartley866);
else
ObjectSetText("phtxt" + Time[numHighPrim] + "_" + Time[numHighLast],fitxt[ki],7,"Arial",ExtPesavento);
}
}
else
// ïðîöåíò âîññòàíîâëåíèÿ (íå Ïåñàâåíòî è 0.866)
{
if (ExtHidden==1 || ExtHidden==4)
{
ObjectCreate("phtxt" + Time[numHighPrim] + "_" + Time[numHighLast],OBJ_TEXT,0,Time[k1],MathAbs((High[numHighPrim]+High[numHighLast])/2));
ObjectSetText("phtxt" + Time[numHighPrim] + "_" + Time[numHighLast],""+DoubleToStr(kk,2),7,"Arial",ExtNotFibo);
}
}
if ((ExtHidden==2 && k2<0) || (ExtHidden!=0 && ExtHidden!=2))
{
ObjectCreate("ph" + Time[numHighPrim] + "_" + Time[numHighLast],OBJ_TREND,0,Time[numHighPrim],High[numHighPrim],Time[numHighLast],High[numHighLast]);
ObjectSet("ph" + Time[numHighPrim] + "_" + Time[numHighLast],OBJPROP_RAY,false);
ObjectSet("ph" + Time[numHighPrim] + "_" + Time[numHighLast],OBJPROP_STYLE,STYLE_DOT);
ObjectSet("ph" + Time[numHighPrim] + "_" + Time[numHighLast],OBJPROP_COLOR,ExtLine);
}
}
//*******
}
}
}
}
hFr1=High[shift];
timeFr1=Time[shift];
}
//============= 1 ñìåñòèëñÿ ìàêñèìóì. Êîíåö.
//
//============= 1 ñìåñòèëñÿ ìèíèìóì. Íà÷àëî.
if (lFr1-Low[shift]!=0 && lFr1>0)
{
numLowPrim=0; numLowLast=0;
numHighPrim=shift; numHighLast=0;
LowPrim=Low[shift]; LowLast=0.0;
HighPrim=0.0; HighLast=0.0;
flagLow=false;
Angle=-100;
for (k=shift+1; k<Bars; k++)
{
if (ExtMapBuffer2[k]>HighPrim) {HighPrim=High[k]; numHighPrim=k;}
if (ExtMapBuffer[k]>0.0 && ExtMapBuffer[k]==zz[k])
{
if (LowLast>0)
{
if (flagLow)
{
if (ExtMapBuffer[k]<LowLast) {LowLast=Low[k]; numLowLast=k;}
}
else
{
if (ExtMapBuffer[k]<LowPrim) flagLow=true;
LowLast=Low[k];
numLowLast=k;
}
}
else {numLowLast=k; LowLast=Low[k];}
HL=High[numHighPrim]-Low[numLowLast];
kj=(LowPrim-LowLast)*1000/(numLowLast-numLowPrim);
if (HL>0 && (Angle<kj || Angle==-100)) // Ïðîâåðêà óãëà íàêëîíà ëèíèè
{
Angle=kj;
HLp=High[numHighPrim]-Low[numLowPrim];
k1=MathCeil((numLowPrim+numLowLast)/2);
kj=HLp/HL;
// Ïîèñê ñòàðîé ñîåäèíèòåëüíîé ëèíèè
numOb=ObjectFind("pl" + Time[numLowPrim] + "_" + Time[numLowLast]);
if (numOb>-1)
{
if (kj>0.21 && kj<=5)
{
// Ïåðåìåùåíèå îáúåêòîâ
ObjectMove("pl" + Time[numLowPrim] + "_" + Time[numLowLast],0,Time[numLowPrim],Low[numLowPrim]);
ObjectMove("pltxt" + Time[numLowPrim] + "_" + Time[numLowLast],0,Time[k1],MathAbs((Low[numLowPrim]+Low[numLowLast])/2));
// Ñîçäàíèå òåêñòîâîãî îáúåêòà (÷èñëà Ïåñàâåíòî). % âîññòàíîâëåíèÿ ìåæäó ìèíèìóìàìè
kk=kj;
k2=1;
if (ExtDeltaType==2) for (ki=16;ki>=0;ki--) {if (MathAbs((fi[ki]-kj)/fi[ki])<=ExtDelta) {kk=fi[ki]; k2=-1; break;}}
if (ExtDeltaType==1) for (ki=16;ki>=0;ki--) {if (MathAbs(fi[ki]-kj)<=ExtDelta) {kk=fi[ki]; k2=-1; break;}}
if (k2<0)
// ïðîöåíò âîññòàíîâëåíèÿ ÷èñëà Ïåñàâåíòî è 0.866
{
if (ExtHidden!=4 && ExtHidden>0)
{
if (kk==0.886) // Gartley
ObjectSetText("pltxt" + Time[numLowPrim] + "_" + Time[numLowLast],fitxt[ki],7,"Arial", ExtGartley866);
else
ObjectSetText("pltxt" + Time[numLowPrim] + "_" + Time[numLowLast],fitxt[ki],7,"Arial",ExtPesavento);
}
}
else
// ïðîöåíò âîññòàíîâëåíèÿ (íå Ïåñàâåíòî è 0.866)
if (ExtHidden==1 || ExtHidden==4)
ObjectSetText("pltxt" + Time[numLowPrim] + "_" + Time[numLowLast],""+DoubleToStr(kk,2),7,"Arial",ExtNotFibo);
}
else
{
ObjectDelete("pl" + Time[numLowPrim] + "_" + Time[numLowLast]);
ObjectDelete("pltxt" + Time[numLowPrim] + "_" + Time[numLowLast]);
}
}
else
{
//******* Ïðîðèñîâêà íîâîé ëèíèè, åñëè îíà ïîÿâèëàñü.
if (kj>0.21 && kj<=5)
{
// Ñîçäàíèå òåêñòîâîãî îáúåêòà (÷èñëà Ïåñàâåíòî). % âîññòàíîâëåíèÿ ìåæäó ìèíèìóìàìè
kk=kj;
k2=1;
if (ExtDeltaType==2) for (ki=16;ki>=0;ki--) {if (MathAbs((fi[ki]-kj)/fi[ki])<=ExtDelta) {kk=fi[ki]; k2=-1; break;}}
if (ExtDeltaType==1) for (ki=16;ki>=0;ki--) {if (MathAbs(fi[ki]-kj)<=ExtDelta) {kk=fi[ki]; k2=-1; break;}}
if (k2<0)
// ïðîöåíò âîññòàíîâëåíèÿ ÷èñëà Ïåñàâåíòî è 0.866
{
if (ExtHidden!=4 && ExtHidden>0)
{
ObjectCreate("pltxt" + Time[numLowPrim] + "_" + Time[numLowLast],OBJ_TEXT,0,Time[k1],MathAbs((Low[numLowPrim]+Low[numLowLast])/2));
if (kk==0.886) // Gartley
ObjectSetText("pltxt" + Time[numLowPrim] + "_" + Time[numLowLast],fitxt[ki],7,"Arial", ExtGartley866);
else
ObjectSetText("pltxt" + Time[numLowPrim] + "_" + Time[numLowLast],fitxt[ki],7,"Arial",ExtPesavento);
}
}
else
// ïðîöåíò âîññòàíîâëåíèÿ (íå Ïåñàâåíòî è 0.866)
{
if (ExtHidden==1 || ExtHidden==4)
ObjectCreate("pltxt" + Time[numLowPrim] + "_" + Time[numLowLast],OBJ_TEXT,0,Time[k1],MathAbs((Low[numLowPrim]+Low[numLowLast])/2));
ObjectSetText("pltxt" + Time[numLowPrim] + "_" + Time[numLowLast],""+DoubleToStr(kk,2),7,"Arial",ExtNotFibo);
}
if ((ExtHidden==2 && k2<0) || (ExtHidden!=0 && ExtHidden!=2))
{
ObjectCreate("pl" + Time[numLowPrim] + "_" + Time[numLowLast],OBJ_TREND,0,Time[numLowPrim],Low[numLowPrim],Time[numLowLast],Low[numLowLast]);
ObjectSet("pl" + Time[numLowPrim] + "_" + Time[numLowLast],OBJPROP_RAY,false);
ObjectSet("pl" + Time[numLowPrim] + "_" + Time[numLowLast],OBJPROP_STYLE,STYLE_DOT);
ObjectSet("pl" + Time[numLowPrim] + "_" + Time[numLowLast],OBJPROP_COLOR,ExtLine);
}
}
//*******
}
}
}
}
lFr1=Low[shift];
timeFr1=Time[shift];
}
//============= 1 ñìåñòèëñÿ ìèíèìóì. Êîíåö.
//-----------3 Ñìåñòèëñÿ ìèíèìóì èëè ìàêñèìóì, íî îñòàëñÿ íà òîì æå áàðå. Êîíåö.
// Ïîèñê èñ÷åçíóâøèõ ôðàêòàëîâ è óäàëåíèå ëèíèé, èñõîäÿùèõ îò ýòèõ ôðàêòàëîâ. Ïåðåçàïèñü ìàòðèöû.
for (k=0; k<5; k++)
{
if (afrl[k]>0)
{
// Ïîèñê áàðà, íà êîòîðîì áûë ýòîò ôðàêòàë
shift=iBarShift(Symbol(),Period(),afr[k]);
if (zz[shift]==0)
{
if (shift>numBar) numBar=shift;
afr[5]=0;
numLowPrim=shift; numLowLast=0;LowLast=10000000;
for (k1=shift+1; k1<Bars; k1++)
{
if (ExtMapBuffer[k1]<LowLast && ExtMapBuffer[k1]>0)
{
LowLast=Low[k1]; numLowLast=k1;
numOb=ObjectFind("pl" + Time[numLowPrim] + "_" + Time[numLowLast]);
if (numOb>-1)
{
ObjectDelete("pl" + Time[numLowPrim] + "_" + Time[numLowLast]);
ObjectDelete("pltxt" + Time[numLowPrim] + "_" + Time[numLowLast]);
}
}
}
}
}
if (afrh[k]>0)
{
// Ïîèñê áàðà, íà êîòîðîì áûë ýòîò ôðàêòàë
shift=iBarShift(Symbol(),Period(),afr[k]);
if (zz[shift]==0)
{
if (shift>numBar) numBar=shift;
afr[5]=0;
numHighPrim=shift; numHighLast=0;HighLast=0.0;
for (k1=shift+1; k1<Bars; k1++)
{
if (ExtMapBuffer2[k1]>HighLast)
{
HighLast=High[k1]; numHighLast=k1;
numOb=ObjectFind("ph" + Time[numHighPrim] + "_" + Time[numHighLast]);
if (numOb>-1)
{
ObjectDelete("ph" + Time[numHighPrim] + "_" + Time[numHighLast]);
ObjectDelete("phtxt" + Time[numHighPrim] + "_" + Time[numHighLast]);
}
}
}
}
}
}
// Ïåðåçàïèñü ìàòðèöû
if (afr[5]<1)
if (ExtFibo) ObjectDelete("Fibo");
{
k=0;
for (shift=0; shift<Bars && k<5; shift++)
{
if (zz[shift]>0)
{
afr[k]=Time[shift];
if (zz[shift]==ExtMapBuffer[shift]) {afrl[k]=Low[shift]; afrh[k]=0.0;}
if (zz[shift]==ExtMapBuffer2[shift]) {afrh[k]=High[shift]; afrl[k]=0.0;}
k++;
}
}
afr[k]=1;
if (ExtFibo)
{
if (afrl[1]>0) ObjectCreate("fibo",OBJ_FIBO,0,afr[2],afrh[2],afr[1],afrl[1]);
else ObjectCreate("fibo",OBJ_FIBO,0,afr[2],afrl[2],afr[1],afrh[1]);
}
}
// Ïðîâåðêà íà ðàçðåøåíèå âûâîäà îñíàñòêè. Êîíåö.
//
}
//
// Êîððåêöèÿ. Êîíåö.
}
// end
}
Comments