This script is designed to analyze price charts and identify potential turning points in the market by using fractals. Fractals are patterns that suggest where the price might reverse direction. The script also considers the volume of trading and a momentum indicator (implied by the comments referring to Money Flow Index or MFI, though it's not a standard MFI) to filter these fractals, categorizing them into different types based on these factors.
Here's a breakdown of how it works:
-
Fractal Identification: The script first identifies fractals, which are specific price patterns that could indicate a potential high or low point. It searches for both upper (potential resistance) and lower (potential support) fractals on the price chart.
-
Volume and Momentum Filtering: Once a fractal is found, the script assesses the trading volume and a momentum-like calculation (referred to as MFI in the comments, but calculated differently) associated with that fractal. It compares the current fractal's volume and "MFI" value to those of a previous fractal of the opposite type (e.g., if looking at an upper fractal, it compares to the previous lower fractal).
-
Fractal Categorization: Based on the comparison of volume and this "MFI" value, the script categorizes the identified fractal into one of four types:
- Green Fractal: This suggests a potential strong turning point, characterized by higher volume and a positive momentum indication (higher "MFI").
- Red Fractal: This implies a potential turning point with lower momentum (lower "MFI"), even with the higher volume.
- Blue Fractal: Suggests a potential false turning point, indicated by lower volume and a positive momentum indication (higher "MFI").
- Brown Fractal: This suggests a weak or fading turning point, characterized by lower volume and a negative momentum indication (lower "MFI").
-
Drawing Lines: The script also draws lines on the chart connecting potential turning points. It uses the Alligator indicator to confirm whether a fractal will be draw or not according to if it finds the upper and lower limits. The Alligator is a technical indicator that uses smoothed moving averages to identify trends.
-
Visual Representation: Finally, the script displays arrows on the chart at the fractal locations, using different colors to represent the four fractal categories, making it easy to visually identify the different types of potential turning points. It also optionally draws dashed lines from previous confirmed fractals.
In essence, this script aims to identify not just where the price might turn, but also how likely that turning point is to be significant, based on volume and momentum.
//+------------------------------------------------------------------+
//| v04 |
//| |
//| v02 |
//| Äîáàâëåí ïðîöåíò äëÿ îòñåèâàíèÿ ôðàêòàëîâ |
//| v03 |
//| Ðèñóåò ëèíèè |
//| v04 |
//| Ôèëüòð äëÿ ëèíèé ïî àëëèãàòîðó |
//+------------------------------------------------------------------+
#property copyright "olyakish"
#property link ""
//----
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Lime //Çåëåíûé ôðàêòàë
#property indicator_color2 Red // Ïðèñåäàþùèé
#property indicator_color3 SaddleBrown //Óâÿäàþùèé
#property indicator_color4 Blue // Ôàëüøèâûé
//----
extern int Pips = 15;
extern int ShiftBars = 250;
extern string rem1="Ïðîöåíò äëÿ îòñåèâàíèÿ ïî îáúåìó";
extern int Percent=110;
extern string rem2="Ðèñîâàòü ïðåäûäóùèå ëèíèè?";
extern bool UseOldLine=true;
double ExtLimeBuffer[];
double ExtRedBuffer[];
double ExtSaddleBrownBuffer[];
double ExtBlueBuffer[];
int i,j;
double a_Fractal[2]; // 0- ïîñëåäíèé 1-ïðåäûäóùèé
double a_MFI[2]; // 0- ïîñëåäíèé 1-ïðåäûäóùèé
double a_Volume[2]; // 0- ïîñëåäíèé 1-ïðåäûäóùèé
bool objects_initialized=false;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int init()
{
SetIndexShift(0,0);
SetIndexShift(1,0);
SetIndexShift(2,0);
SetIndexShift(3,0);
//----
SetIndexBuffer(0, ExtLimeBuffer);
SetIndexBuffer(1, ExtRedBuffer);
SetIndexBuffer(2, ExtSaddleBrownBuffer);
SetIndexBuffer(3, ExtBlueBuffer);
//----
SetIndexStyle(0, DRAW_ARROW );
SetIndexStyle(1, DRAW_ARROW);
SetIndexStyle(2, DRAW_ARROW);
SetIndexStyle(3, DRAW_ARROW);
SetIndexArrow(0,177);
SetIndexArrow(1,177);
SetIndexArrow(2,177);
SetIndexArrow(3,177);
///----
SetIndexLabel(0, "Çåëåíûé ôðàêòàë");
SetIndexLabel(1, "Ïðèñåäàþùèé ôðàêòàë");
SetIndexLabel(2, "Óâÿäàþùèé ôðàêòàë");
SetIndexLabel(3, "Ôàëüøèâûé ôðàêòàë");
//----
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool ObjectsInit()
{
//---- check if we have enough bars
if(ArraySize(High)<3)
{
Print("Timeseries is not ready yet - exit");
return(false);
}
//----
ObjectCreate("Up",OBJ_TREND,0,iTime(NULL, 0, 2),High[2],iTime(NULL, 0, 1),High[1],0,0);
ObjectSet("Up",OBJPROP_COLOR,Aqua);
ObjectSet("Up",OBJPROP_RAY,true);
ObjectSet("Up",OBJPROP_BACK,1);
ObjectCreate("Down",OBJ_TREND,0,iTime(NULL, 0, 2),Low[2],iTime(NULL, 0, 1),Low[1],0,0);
ObjectSet("Down",OBJPROP_COLOR,Tomato);
ObjectSet("Down",OBJPROP_RAY,true);
ObjectSet("Down",OBJPROP_BACK,1);
if (UseOldLine)
{
ObjectCreate("Up_Prev",OBJ_TREND,0,iTime(NULL, 0, 2),High[2],iTime(NULL, 0, 1),High[1],0,0);
ObjectSet("Up_Prev",OBJPROP_COLOR,Aqua);
ObjectSet("Up_Prev",OBJPROP_RAY,true);
ObjectSet("Up_Prev",OBJPROP_STYLE,STYLE_DASH);
ObjectSet("Up_Prev",OBJPROP_BACK,1);
ObjectCreate("Down_Prev",OBJ_TREND,0,iTime(NULL, 0, 2),Low[2],iTime(NULL, 0, 1),Low[1],0,0);
ObjectSet("Down_Prev",OBJPROP_COLOR,Tomato);
ObjectSet("Down_Prev",OBJPROP_RAY,true);
ObjectSet("Down_Prev",OBJPROP_STYLE,STYLE_DASH);
ObjectSet("Down_Prev",OBJPROP_BACK,1);
}
//----
return(true);
}
int deinit()
{
ObjectDelete("Up");
ObjectDelete("Down");
if (UseOldLine)
{
ObjectDelete("Up_Prev");
ObjectDelete("Down_Prev");
}
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
if(!objects_initialized)
{
objects_initialized=ObjectsInit();
}
int n=3;
while (ExtLimeBuffer[n]!=NULL || ExtRedBuffer[n]!=NULL || ExtSaddleBrownBuffer[n]!=NULL || ExtBlueBuffer[n]!=NULL)
{
if (n>ShiftBars) {n=ShiftBars;break;}
n++;
}
for(int i=n+20; i>=3; i--)
{
//-- âåðõíèå ôðàêòàëû
ArrayInitialize(a_Fractal,0);
ArrayInitialize(a_MFI,0);
ArrayInitialize(a_Volume,0);
if (iFractals(NULL,0,MODE_UPPER,i)!=0) // íà i áàðå åñòü ôðàêòàë ââåðõ
{
a_Fractal[0]=iFractals(NULL,0,MODE_UPPER,i); // öåíà íà ôðàêòàëå
a_Volume[0]=Volume[i]+Volume[i+1]+Volume[i+2]+Volume[i-1]+Volume[i-2]; // îáúåì
a_MFI[0]=(High[i]-Low[i]+High[i-1]-Low[i-1]+High[i-2]-Low[i-2]+High[i+1]-Low[i+1]+High[i+2]-Low[i+2])/a_Volume[0]; // MFI
// ïîøëè èñêàòü ôðàêòàë íà âíèç ïî èñòîðèè
j=i+1;
while (a_Fractal[1]==0 && j<Bars)
{
if (iFractals(NULL,0,MODE_UPPER,j)!=0) {break;}
if (iFractals(NULL,0,MODE_LOWER,j)!=0) //-- Íàøëè ôðàêòàë âíèç
{
a_Fractal[1]=iFractals(NULL,0,MODE_LOWER,j);
a_Volume[1]=Volume[j+2]+Volume[j+1]+Volume[j]+Volume[j-1]+Volume[j-2];
a_MFI[1]=(High[j+1]-Low[j+1]+High[j+2]-Low[j+2]+High[j]-Low[j]+High[j-1]-Low[j-1]+High[j-2]-Low[j-2])/a_Volume[1];
if (a_Volume[0]>a_Volume[1]*Percent/100 && a_MFI[0]<a_MFI[1]){ExtRedBuffer[i]=High[i]+Pips*Point;break;} // èìååì ïðèñåäàþùèé ôðàêòàë (MFI - îáúåì +)
if (a_Volume[0]>a_Volume[1]*Percent/100 && a_MFI[0]>a_MFI[1]){ExtLimeBuffer[i]=High[i]+Pips*Point;break;} // èìååì çåëåíûé ôðàêòàë (MFI + îáúåì +)
if (a_Volume[0]*Percent/100<a_Volume[1] && a_MFI[0]>a_MFI[1]){ExtBlueBuffer[i]=High[i]+Pips*Point;break;} // èìååì ôàëüøèâûé ôðàêòàë (MFI + îáúåì -)
if (a_Volume[0]*Percent/100<a_Volume[1] && a_MFI[0]<a_MFI[1]){ExtSaddleBrownBuffer[i]=High[i]+Pips*Point;break;} // èìååì óâÿäàþùèé ôðàêòàë (MFI - îáúåì -)
}
j++;
}
}
//--- íèæíèå ôðàêòàëû
ArrayInitialize(a_Fractal,0);
ArrayInitialize(a_MFI,0);
ArrayInitialize(a_Volume,0);
if (iFractals(NULL,0,MODE_LOWER,i)!=0) // íà i áàðå åñòü ôðàêòàë âíèç
{
a_Fractal[0]=iFractals(NULL,0,MODE_LOWER,i); // öåíà íà ôðàêòàëå
a_Volume[0]=Volume[i]+Volume[i+1]+Volume[i+2]+Volume[i-1]+Volume[i-2]; // îáúåì
a_MFI[0]=(High[i]-Low[i]+High[i-1]-Low[i-1]+High[i-2]-Low[i-2]+High[i+1]-Low[i+1]+High[i+2]-Low[i+2])/a_Volume[0]; // MFI
// ïîøëè èñêàòü ôðàêòàë íà ââåðõ ïî èñòîðèè
j=i+1;
while (a_Fractal[1]==0 && j<Bars)
{
if (iFractals(NULL,0,MODE_LOWER,j)!=0) {break;}
if (iFractals(NULL,0,MODE_UPPER,j)!=0) //-- Íàøëè ôðàêòàë ââåðõ
{
a_Fractal[1]=iFractals(NULL,0,MODE_UPPER,j);
a_Volume[1]=Volume[j+2]+Volume[j+1]+Volume[j]+Volume[j-1]+Volume[j-2];
a_MFI[1]=(High[j+1]-Low[j+1]+High[j+2]-Low[j+2]+High[j]-Low[j]+High[j-1]-Low[j-1]+High[j-2]-Low[j-2])/a_Volume[1];
if (a_Volume[0]>a_Volume[1]*Percent/100 && a_MFI[0]<a_MFI[1]){ExtRedBuffer[i]=Low[i]-Pips*Point;break;} // èìååì ïðèñåäàþùèé ôðàêòàë (MFI - îáúåì +)
if (a_Volume[0]>a_Volume[1]*Percent/100 && a_MFI[0]>a_MFI[1]){ExtLimeBuffer[i]=Low[i]-Pips*Point;break;} // èìååì çåëåíûé ôðàêòàë (MFI + îáúåì +)
if (a_Volume[0]*Percent/100<a_Volume[1] && a_MFI[0]>a_MFI[1]){ExtBlueBuffer[i]=Low[i]-Pips*Point;break;} // èìååì ôàëüøèâûé ôðàêòàë (MFI + îáúåì -)
if (a_Volume[0]*Percent/100<a_Volume[1] && a_MFI[0]<a_MFI[1]){ExtSaddleBrownBuffer[i]=Low[i]-Pips*Point;break;} // èìååì óâÿäàþùèé ôðàêòàë (MFI - îáúåì -)
}
j++;
}
}
}
/// îòðèñîâêà ëèíèé
double _Price[3,2];
int _Time[3,2];
ArrayInitialize(_Price,-1);
ArrayInitialize(_Time,-1);
int up=0,down=0;
for(i=3; i<=300; i++)
{
//up
double iLips=iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORLIPS, i);
double iTeeth=iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORTEETH, i);
double iJaw=iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW, i);
if (ExtRedBuffer[i]!=2147483647 && iFractals(NULL,0,MODE_UPPER,i)!=NULL && up<=2 && iFractals(NULL,0,MODE_UPPER,i)<=ExtRedBuffer[i]
&& iFractals(NULL,0,MODE_UPPER,i)>iLips && iFractals(NULL,0,MODE_UPPER,i)>iTeeth && iFractals(NULL,0,MODE_UPPER,i)>iJaw)
{
_Price[up,0]=ExtRedBuffer[i];_Time[up,0]=iTime(NULL, 0, i);up++;
}
if (ExtRedBuffer[i]!=2147483647 && iFractals(NULL,0,MODE_LOWER,i)!=0 && down<=2 && iFractals(NULL,0,MODE_LOWER,i)>=ExtRedBuffer[i]
&& iFractals(NULL,0,MODE_LOWER,i)<iLips && iFractals(NULL,0,MODE_LOWER,i)<iTeeth && iFractals(NULL,0,MODE_LOWER,i)<iJaw)
{
_Price[down,1]=ExtRedBuffer[i];_Time[down,1]=iTime(NULL, 0, i);down++;
}
}
ObjectMove("Up",1,_Time[0,0],_Price[0,0]);
ObjectMove("Up",0,_Time[1,0],_Price[1,0]);
ObjectMove("Down",1,_Time[0,1],_Price[0,1]);
ObjectMove("Down",0,_Time[1,1],_Price[1,1]);
if (UseOldLine)
{
ObjectMove("Up_Prev",1,_Time[1,0],_Price[1,0]);
ObjectMove("Up_Prev",0,_Time[2,0],_Price[2,0]);
ObjectMove("Down_Prev",1,_Time[1,1],_Price[1,1]);
ObjectMove("Down_Prev",0,_Time[2,1],_Price[2,1]);
}
return(0);
}
//+------------------------------------------------------------------+
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---