FanSimple8-1bEn
Download scriptThis script is designed as a multi-timeframe analysis tool for trading platforms. Its primary purpose is to visualize the relationship between price action and various moving averages (MAs) across different timeframes simultaneously, creating a "fan" of data that helps traders understand market trends at a glance.
Core Functionality
1. Multi-Timeframe "Fan" Visualization The indicator tracks multiple timeframes at once (ranging from 1-minute charts to monthly charts). It calculates several moving averages for each of these timeframes. By plotting these together, it creates a visual "fan." This allows you to see if short-term trends are aligning with longer-term trends or if they are diverging.
2. Trend and Price Positioning Analysis The script performs real-time logic to determine two specific types of information for every timeframe included in your setup:
- Fan Status: It checks the relative order of the moving averages. If they are perfectly stacked in an upward or downward sequence, the indicator assigns a status (Up, Down, or Neutral). This helps identify "trend alignment"—where all moving averages are pointing in the same direction.
- Price Position: It compares the current market price against the set of moving averages. It determines if the price is currently above the entire fan, below it, or sandwiched within it.
3. Dynamic On-Screen Dashboard Instead of just drawing lines on the chart, the script generates a text-based dashboard (labels) on your screen. This dashboard provides a summary for each timeframe:
- Price above/below the Fan: A visual indicator showing where the price sits relative to the moving averages.
- Fan Status: A symbol (like an arrow or diamond) indicating whether the moving averages are currently trending up, down, or in a neutral/messy state.
4. Real-Time Tracking and "Sliding" Logic The script includes a specialized tracking feature:
- Tracking Line: It can draw a vertical line on the chart to mark a specific point in time that you want to monitor.
- Sliding Motion: You can enable a "sliding" mode where this tracking point moves forward automatically as new bars form. This allows you to observe how the market status changes dynamically over time without manually moving the marker.
- Audio Alerts: It supports an optional sound notification that plays whenever the tracking point shifts, providing an audio cue for real-time monitoring.
User Customization Options
The script is highly modular, allowing users to customize:
- Moving Average Parameters: Choose different periods (e.g., Fibonacci numbers like 21, 55, 89), types (Simple, Exponential, etc.), and price sources (Close, Open, High, Low).
- Visual Styling: Change colors, line widths, and symbols for the various indicators and dashboard elements to fit your personal trading aesthetic.
- Display Toggles: Individually turn on or off specific moving averages or the entire status dashboard depending on what information you need at any given moment.
//+------------------------------------------------------------------+
//| FanSimple8-1a.mq4 |
//| Copyright © 2006, MetaQuotes Software Corp. |
//|FanSimple8-1bEngl http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
#property indicator_chart_window
#property indicator_buffers 8
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/* Here we can change values, used by default /Çäåñü ìîæíî èñïðàâèòü çíà÷åíèÿ, ýòè çíà÷åíèÿ èñïîëüçóþòñÿ ïî óìîë÷àíèþ ïðè ïîäêëþ÷åíèè èíäèêàòîðà */
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/* Colors of a set of averages (MAs); (put cursor on a name of the color, press F1 to see names of other colors)Öâåòà íàáîðà ñðåäíèõ ïî óìîë÷àíèþ (âñòàâ êóðñîðîì íà èìåíè öâåòà, íàæàòü F1 è óâèäåòü èìåíà îñòàëüíûõ öâåòîâ) */
#property indicator_color1 RoyalBlue
#property indicator_color2 Green
#property indicator_color3 Chartreuse
#property indicator_color4 Yellow
#property indicator_color5 Orange
#property indicator_color6 OrangeRed
#property indicator_color7 Magenta
#property indicator_color8 Magenta
/*Styles of a set of averages (MAs); (put cursor on a name of the style, press F1 to see names of other styles)//Ñòèëü íàáîðà ñðåäíèõ ïî óìîë÷àíèþ (âñòàâ êóðñîðîì íà èìåíè ñòèëÿ, íàæàòü F1 è óâèäåòü èìåíà îñòàëüíûõ ñòèëåé) */
#property indicator_style1 DRAW_LINE
#property indicator_style2 DRAW_LINE
#property indicator_style3 DRAW_LINE
#property indicator_style4 DRAW_LINE
#property indicator_style5 DRAW_LINE
#property indicator_style6 DRAW_LINE
#property indicator_style7 DRAW_LINE
#property indicator_style8 STYLE_DOT
/*/*Width of a set of averages (MAs); (put cursor on a name of the style(width), press F1 to see other names )Òîëùèíà íàáîðà ñðåäíèõ ïî óìîë÷àíèþ (âñòàâ êóðñîðîì íà èìåíè òîëùèíû, íàæàòü F1 è óâèäåòü èìåíà îñòàëüíûõ òîëùèí) */
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2
#property indicator_width5 2
#property indicator_width6 2
#property indicator_width7 2
#property indicator_width8 1
/******************************************************************************
Indicator parameters
*/
/* indicator's prefix */
extern string Prefix = "";
/* Main switch of display of a fan direction, allows to cut off display of all periods set //Îáùèé ðóáèëüíèê îòîáðàæåíèÿ ïðàâèëüíîñòè âååðà, ïîçâîëÿåò îòðóáèòü ðàçîì îòîáðàæåíèå íàáîðà âñåõ ïåðèîäîâ */
extern bool DisplayFanStatus = true;
/* Main switch of display of averages, allows to cut off display of all set of averages //Îáùèé ðóáèëüíèê îòîáðàæåíèÿ ñðåäíèõ, ïîçâîëÿåò îòðóáèòü ðàçîì îòîáðàæåíèå íàáîðà ñðåäíèõ */
extern bool DisplayFan = true;
/*Values of the periods of set timeframes, from left to right (reacurrences are possible, "0" and wrong values will not be included in a set) Çíà÷åíèÿ ïåðèîäîâ íàáîðà timeframe'îâ â ïîðÿäêå ñëåäîâàíèÿ ñëåâà íàïðàâî (âîçìîæíû ïîâòîðåíèÿ, 0-âûå è íåïðàâèëüíûå çíà÷åíèÿ âêëþ÷åíû â íàáîð íå áóäóò) */
extern int Timeframe1 = PERIOD_M1;
extern int Timeframe2 = PERIOD_M5;
extern int Timeframe3 = PERIOD_M15;
extern int Timeframe4 = PERIOD_M30;
extern int Timeframe5 = PERIOD_H1;
extern int Timeframe6 = PERIOD_H4;
extern int Timeframe7 = PERIOD_D1;
extern int Timeframe8 = PERIOD_W1;
extern int Timeframe9 = PERIOD_MN1;
/* Date and time for which correctness of a fan displayed Äàòà è âðåìÿ, äëÿ êîòîðîãî èíäèöèðóåòñÿ ïðàâèëüíîñòü âååðà */
extern datetime TrackingTime = 0;
/* to draw (or not) a vertical line through a traced bar Ðèñîâàòü ëè âåðòèêàëüíóþ ëèíèþ ÷åðåç îòñëåæèâàåìûé áàð */
extern bool Tracking = false;
/* to shift (or not) a point of tracking with formation of a next bar Ñäâèãàåì ëè òî÷êó ñëåæåíèÿ ñ îáðàçîâíèåì ñëåäóùåãî áàðà */
extern bool Sliding = true;
/* Name of a soundfile played at shift of a tracking point //Èìÿ ôàéëà çâóêà, âîñïðîèçâîäèìîãî ïðè ñäâèãå òî÷êè ñëåæåíèÿ */
extern string SlidingSound = "";
/* Values of the periods of a set of averages combined into a fan, correctness of which is traced ("0" and wrong values will not be included in a set) Çíà÷åíèÿ ïåðèîäîâ íàáîðà ñðåäíèõ, ñîñòàâëÿþùèõ âååð, ïðàâèëüíîñòü êîòîðîãî îòñëåæèâàåòñÿ (0-âûå è íåïðàâèëüíûå çíà÷åíèÿ âêëþ÷åíû â íàáîð íå áóäóò) */
extern int MA1 = 233;
extern int MA2 = 144;
extern int MA3 = 89;
extern int MA4 = 55;
extern int MA5 = 34;
extern int MA6 = 21;
extern int MA7 = 8;
extern int MA8 = 3 ;
/* Individual display switch of each average Èíäèâèäóàëüíûé ðóáèëüíèê îòîáðàæåíèÿ íà êàæäóþ ñðåäíþþ */
extern bool DisplayMA1 = true;
extern bool DisplayMA2 = true;
extern bool DisplayMA3 = true;
extern bool DisplayMA4 = true;
extern bool DisplayMA5 = true;
extern bool DisplayMA6 = true;
extern bool DisplayMA7 = true;
extern bool DisplayMA8 = true;
/* individual set of type of each average Èíäèâèäóàëüíîå çàäàíèå òèïà êàæäîé ñðåäíåé */
extern int TypeOfMA1 = MODE_EMA;
extern int TypeOfMA2 = MODE_EMA;
extern int TypeOfMA3 = MODE_EMA;
extern int TypeOfMA4 = MODE_EMA;
extern int TypeOfMA5 = MODE_EMA;
extern int TypeOfMA6 = MODE_EMA;
extern int TypeOfMA7 = MODE_EMA;
extern int TypeOfMA8 = MODE_EMA;
/* individual set of applyed price type of each average / Èíäèâèäóàëüíîå çàäàíèå òèïà öåíû äëÿ êàæäîé ñðåäíåé */
extern int PriceOfMA1 = PRICE_CLOSE;
extern int PriceOfMA2 = PRICE_CLOSE;
extern int PriceOfMA3 = PRICE_CLOSE;
extern int PriceOfMA4 = PRICE_CLOSE;
extern int PriceOfMA5 = PRICE_CLOSE;
extern int PriceOfMA6 = PRICE_CLOSE;
extern int PriceOfMA7 = PRICE_CLOSE;
extern int PriceOfMA8 = PRICE_CLOSE;
/* Font Name /Èìÿ ôîíòà ñèìâîëîâ */
extern string FontName = "Wingdings";
/* Font Size /Ðàçìåð ñèìâîëîâ */
extern int FontSize = 12;
/* Symbols of the drawn and erased position index of the price in regard to a fan //Ñèìâîëû íàðèñîâàííîãî è ñò¸ðòîãî óêàçàòåëÿ ïîëîæåíèÿ öåíû îòíîñèòåëüíî âååðà */
extern int PriceOnSymbol = 108; // Circle
extern int PriceOffSymbol = 32; // Space
/* Colors of the drawn index of position of the price relative to a fan /Öâåòà íàðèñîâàííîãî óêàçàòåëÿ ïîëîæåíèÿ öåíû îòíîñèòåëüíî âååðà */
extern color PriceColor = LimeGreen;
/* Symbols of the index of correctness of a fan direction Ñèìâîëû óêàçàòåëÿ ïðàâèëüíîñòè âååðà */
extern int FanWrongSymbol = 117; // Diamond
extern int FanUpSymbol = 233; // Up Arrow
extern int FanDownSymbol = 234; // Down Arrow
/* Öâåòà óêàçàòåëÿ ïðàâèëüíîñòè âååðà */
extern color FanWrongColor = DarkGray;
extern color FanUpColor = DodgerBlue;
extern color FanDownColor = OrangeRed;
/* Displacement(shift) to the left (XY) from the right top corner Ñìåùåíèå âëåâî (X) è âïðàâî (Y) îò ïðàâîãî âåðõíåãî óãëà */
extern int X = 10;
extern int Y = 0;
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/******************************************************************************
Tracking vertical line label and color
*/
#define TRACKING_NAME "Bar, traced by indicator FanSimple" //"Áàð, îòñëåæèâàåìûé èíäèêàòîðîì FanSimple"
#define TRACKING_COLOR DarkGray
/*****************************************************************************
string RowName[3] = { "Öåíà âûøå âååðà",
"Ñòàòóñ âååðà",
"Öåíà íèæå âååðà" };*/
string RowName[3]={ "Price above the Fan",
"Fan Status",
"Price below the Fan" };
/******************************************************************************/
/******************************************************************************/
/******************************************************************************
/*** À âîò ñþäà ëàçèòü óæå íå ñëåäóåò **** À âîò ñþäà ëàçèòü óæå íå ñëåäóåò ***/
/*** À âîò ñþäà ëàçèòü óæå íå ñëåäóåò **** À âîò ñþäà ëàçèòü óæå íå ñëåäóåò ***/
/*** À âîò ñþäà ëàçèòü óæå íå ñëåäóåò **** À âîò ñþäà ëàçèòü óæå íå ñëåäóåò ***/
/*** not good to mess with this one **** not good to mess with this one
/******************************************************************************/
/******************************************************************************/
/******************************************************************************
Type of rendering codes
*/
#define is_down 0
#define is_none 1
#define is_up 2
/******************************************************************************/
int Timeframe[9];
string TimeframeNames[9];
int TimeframeInUse = 0;
/******************************************************************************/
int MAs[8];
int TypeOfMAs[8];
int PriceOfMAs[8];
int Xlat[8];
int MAsInUse = 0;
/******************************************************************************/
double MA1Buf[], MA2Buf[], MA3Buf[], MA4Buf[], MA5Buf[], MA6Buf[], MA7Buf[], MA8Buf[];
/******************************************************************************/
string LabelName(int i, int j) { return(Prefix + RowName[j] + "(" + (i + 1) + "): " + TimeframeNames[i]); }
/******************************************************************************/
int symcolor[3][2];
int syms[3][2];
/******************************************************************************/
void UpdateFanStatus(int i, int how)
{
string s = " ";
ObjectSetText(LabelName(i, 1), StringSetChar(s, 0, symcolor[how][0]), FontSize, FontName, symcolor[how][1]);
}
/******************************************************************************/
void UpdatePriceStatus(int i, int how)
{
string s = " ";
ObjectSetText(LabelName(i, 0), StringSetChar(s, 0, syms[how][0]), FontSize, FontName, PriceColor);
ObjectSetText(LabelName(i, 2), StringSetChar(s, 0, syms[how][1]), FontSize, FontName, PriceColor);
}
/******************************************************************************/
void InitTimeframe(int &P[], int PV)
{
if(PV != 0)
{
switch(PV)
{
case PERIOD_M1: TimeframeNames[TimeframeInUse] = "M1"; break;
case PERIOD_M5: TimeframeNames[TimeframeInUse] = "M5"; break;
case PERIOD_M15: TimeframeNames[TimeframeInUse] = "M15"; break;
case PERIOD_M30: TimeframeNames[TimeframeInUse] = "M30"; break;
case PERIOD_H1: TimeframeNames[TimeframeInUse] = "H1"; break;
case PERIOD_H4: TimeframeNames[TimeframeInUse] = "H4"; break;
case PERIOD_D1: TimeframeNames[TimeframeInUse] = "D1"; break;
case PERIOD_W1: TimeframeNames[TimeframeInUse] = "W1"; break;
case PERIOD_MN1: TimeframeNames[TimeframeInUse] = "MN1"; break;
default: return;
}
P[TimeframeInUse] = PV; TimeframeInUse++;
}
}
/******************************************************************************/
bool __CheckMA(int MA, int TypeOfMA, int PriceOfMA)
{
return(MA > 0 &&
(TypeOfMA == MODE_SMA || TypeOfMA == MODE_EMA || TypeOfMA == MODE_SMMA || TypeOfMA == MODE_LWMA) &&
(PriceOfMA == PRICE_CLOSE || PriceOfMA == PRICE_OPEN || PriceOfMA == PRICE_HIGH || PriceOfMA == PRICE_LOW || PriceOfMA == PRICE_MEDIAN || PriceOfMA == PRICE_TYPICAL || PriceOfMA == PRICE_WEIGHTED));
}
/******************************************************************************/
bool CheckMA(int MA)
{
switch(MA)
{
case 1: return(__CheckMA(MA1, TypeOfMA1, PriceOfMA1)); break;
case 2: return(__CheckMA(MA2, TypeOfMA2, PriceOfMA2)); break;
case 3: return(__CheckMA(MA3, TypeOfMA3, PriceOfMA3)); break;
case 4: return(__CheckMA(MA4, TypeOfMA4, PriceOfMA4)); break;
case 5: return(__CheckMA(MA5, TypeOfMA5, PriceOfMA5)); break;
case 6: return(__CheckMA(MA6, TypeOfMA6, PriceOfMA6)); break;
case 7: return(__CheckMA(MA7, TypeOfMA7, PriceOfMA7)); break;
case 8: return(__CheckMA(MA8, TypeOfMA8, PriceOfMA8)); break;
}
return(false);
}
/******************************************************************************/
void __InitMAs(int MA, int TypeOfMA, int PriceOfMA)
{
if(__CheckMA(MA, TypeOfMA, PriceOfMA))
{
MAs[MAsInUse] = MA;
TypeOfMAs[MAsInUse] = TypeOfMA;
PriceOfMAs[MAsInUse] = PriceOfMA;
MAsInUse++;
}
}
/******************************************************************************/
void InitMAs(int MA)
{
switch(MA)
{
case 1: __InitMAs(MA1, TypeOfMA1, PriceOfMA1); break;
case 2: __InitMAs(MA2, TypeOfMA2, PriceOfMA2); break;
case 3: __InitMAs(MA3, TypeOfMA3, PriceOfMA3); break;
case 4: __InitMAs(MA4, TypeOfMA4, PriceOfMA4); break;
case 5: __InitMAs(MA5, TypeOfMA5, PriceOfMA5); break;
case 6: __InitMAs(MA6, TypeOfMA6, PriceOfMA6); break;
case 7: __InitMAs(MA7, TypeOfMA7, PriceOfMA7); break;
case 8: __InitMAs(MA8, TypeOfMA8, PriceOfMA8); break;
}
}
/******************************************************************************/
int init()
{
int i, j;
if(DisplayFanStatus)
{
syms[0][0] = PriceOffSymbol; syms[0][1] = PriceOnSymbol;
syms[1][0] = PriceOffSymbol; syms[1][1] = PriceOffSymbol;
syms[2][0] = PriceOnSymbol; syms[2][1] = PriceOffSymbol;
symcolor[0][0] = FanDownSymbol; symcolor[0][1] = FanDownColor;
symcolor[1][0] = FanWrongSymbol; symcolor[1][1] = FanWrongColor;
symcolor[2][0] = FanUpSymbol; symcolor[2][1] = FanUpColor;
InitTimeframe(Timeframe, Timeframe1); InitTimeframe(Timeframe, Timeframe2);
InitTimeframe(Timeframe, Timeframe3); InitTimeframe(Timeframe, Timeframe4);
InitTimeframe(Timeframe, Timeframe5); InitTimeframe(Timeframe, Timeframe6);
InitTimeframe(Timeframe, Timeframe7); InitTimeframe(Timeframe, Timeframe8);
InitTimeframe(Timeframe, Timeframe9);
InitMAs(1); InitMAs(2); InitMAs(3); InitMAs(4);
InitMAs(5); InitMAs(6); InitMAs(7); InitMAs(8);
for(i = 0; i < MAsInUse; i++) Xlat[i] = i;
for(i = 0; i < MAsInUse - 1; i++)
for(j = i + 1; j < MAsInUse; j++)
if(MAs[Xlat[i]] > MAs[Xlat[j]]) { int k = Xlat[j]; Xlat[j] = Xlat[i]; Xlat[i] = k; }
for(i = 0; i < TimeframeInUse; i++)
for(j = 0; j < 3; j++)
{
string s = LabelName(i, j);
ObjectCreate(s, OBJ_LABEL, 0, 0, 0);
ObjectSet(s, OBJPROP_XDISTANCE, (TimeframeInUse - i - 1) * 13 * FontSize / 10 + 2 * FontSize / 10 + X);
ObjectSet(s, OBJPROP_YDISTANCE, j * 16 * FontSize / 10 + 3 * FontSize / 10 + Y);
ObjectSet(s, OBJPROP_BACK, true);
ObjectSet(s, OBJPROP_CORNER, 1);
ObjectSetText(s, " ", FontSize, FontName, Black);
}
if(Tracking)
{
ObjectCreate(Prefix + TRACKING_NAME, OBJ_VLINE, 0, TrackingTime, 0);
ObjectSet(Prefix + TRACKING_NAME, OBJPROP_COLOR, TRACKING_COLOR);
}
}
if(DisplayFan)
{
string IndicatorName = Prefix + "FanSimple(";
if(DisplayMA1 && CheckMA(1)) IndicatorName = IndicatorName + MA1;
if(DisplayMA2 && CheckMA(2)) IndicatorName = IndicatorName + ", " + MA2;
if(DisplayMA3 && CheckMA(3)) IndicatorName = IndicatorName + ", " + MA3;
if(DisplayMA4 && CheckMA(4)) IndicatorName = IndicatorName + ", " + MA4;
if(DisplayMA5 && CheckMA(5)) IndicatorName = IndicatorName + ", " + MA5;
if(DisplayMA6 && CheckMA(6)) IndicatorName = IndicatorName + ", " + MA6;
if(DisplayMA7 && CheckMA(7)) IndicatorName = IndicatorName + ", " + MA7;
if(DisplayMA8 && CheckMA(8)) IndicatorName = IndicatorName + ", " + MA8;
IndicatorShortName(IndicatorName + ")");
IndicatorBuffers(8);
SetIndexBuffer(0, MA1Buf); SetIndexBuffer(1, MA2Buf); SetIndexBuffer(2, MA3Buf); SetIndexBuffer(3, MA4Buf);
SetIndexBuffer(4, MA5Buf); SetIndexBuffer(5, MA6Buf); SetIndexBuffer(6, MA7Buf); SetIndexBuffer(7, MA8Buf);
SetIndexLabel(0, Prefix + "Fan, MA(" + MA1 + ")");
SetIndexLabel(1, Prefix + "Fan, MA(" + MA2 + ")");
SetIndexLabel(2, Prefix + "Fan, MA(" + MA3 + ")");
SetIndexLabel(3, Prefix + "Fan, MA(" + MA4 + ")");
SetIndexLabel(4, Prefix + "Fan, MA(" + MA5 + ")");
SetIndexLabel(5, Prefix + "Fan, MA(" + MA6 + ")");
SetIndexLabel(6, Prefix + "Fan, MA(" + MA7 + ")");
SetIndexLabel(7, Prefix + "Fan, MA(" + MA8 + ")");
// SetIndexLabel(7, Prefix + "Âååð, " + MA8 + "-ÿ ñðåäíÿÿ");
for(i = 0; i < 7; i++)
{
SetIndexStyle(i, DRAW_LINE);
SetIndexEmptyValue(i, 0);
}
ArraySetAsSeries(MA1Buf, true); ArraySetAsSeries(MA2Buf, true); ArraySetAsSeries(MA3Buf, true); ArraySetAsSeries(MA4Buf, true);
ArraySetAsSeries(MA5Buf, true); ArraySetAsSeries(MA6Buf, true); ArraySetAsSeries(MA7Buf, true); ArraySetAsSeries(MA8Buf, true);
for(i = Bars - 1; i >= 0; i--)
{
MA1Buf[i] = 0; MA2Buf[i] = 0; MA3Buf[i] = 0; MA4Buf[i] = 0; MA5Buf[i] = 0; MA6Buf[i] = 0; MA7Buf[i] = 0; MA8Buf[i] = 0;
}
}
return(0);
}
/******************************************************************************/
int deinit()
{
for(int i = 0; i < TimeframeInUse; i++)
for(int j = 0; j < 3; j++)
ObjectDelete(LabelName(i, j));
if(Tracking)
ObjectDelete(Prefix + TRACKING_NAME);
return(0);
}
/******************************************************************************/
int start()
{
int i;
datetime NewTrackingTime = TrackingTime;
static datetime time = 0;
if(time == 0)
{
if(TrackingTime == 0)
TrackingTime = Time[0];
i = ((TimeDay(TrackingTime) * 24 + TimeHour(TrackingTime)) * 60 + TimeMinute(TrackingTime)) * 60 + TimeSeconds(TrackingTime);
TrackingTime -= i;
i /= 60;
i -= i % Period();
TrackingTime += i * 60;
if(Tracking)
ObjectSet(Prefix + TRACKING_NAME, OBJPROP_TIME1, TrackingTime);
else
NewTrackingTime = TrackingTime;
}
if(Tracking)
NewTrackingTime = ObjectGet(Prefix + TRACKING_NAME, OBJPROP_TIME1);
/* User shifted the tracking point or tracking point- the last bar or a new bar appeared //Ïîëüçîâàòåëü ñäâèíóë òî÷êó ñëåæåíèÿ èëè òî÷êà ñëåæåíèÿ - ïîñëåäíèé áàð èëè ïîÿâèëñÿ íîâûé áàð */
if(NewTrackingTime != TrackingTime || (CurTime() - TrackingTime) / 60 < Period() || time != Time[0])
{
if(DisplayFanStatus)
for(i = 0; i < TimeframeInUse; i++)
{
bool Up = true, Down = true;
bool PriceUp = true, PriceDown = true;
int LocalShift = iBarShift(Symbol(), Timeframe[i], NewTrackingTime + (Period() - 1) * 60);
double PrevMA = 0;
for(int j = 0; j < MAsInUse; j++)
{
double MA = iMA(NULL, Timeframe[i], MAs[Xlat[j]], 0, TypeOfMAs[Xlat[j]], PriceOfMAs[Xlat[j]], LocalShift);
if(j > 0) { if(Up && PrevMA < MA) Up = false; if(Down && PrevMA > MA) Down = false; }
if(PriceUp && MA > iClose(Symbol(), Timeframe[i], LocalShift)) PriceUp = false;
if(PriceDown && MA < iClose(Symbol(), Timeframe[i], LocalShift)) PriceDown = false;
PrevMA = MA;
}
if(Up && !Down) UpdateFanStatus(i, is_up); else if(!Up && Down) UpdateFanStatus(i, is_down); else UpdateFanStatus(i, is_none);
if(PriceUp && !PriceDown) UpdatePriceStatus(i, is_up); else if(!PriceUp && PriceDown) UpdatePriceStatus(i, is_down); else UpdatePriceStatus(i, is_none);
}
if(DisplayFan)
for(i = Bars - IndicatorCounted() - 1; i >= 0; i--)
{
if(DisplayMA1 && CheckMA(1)) MA1Buf[i] = iMA(NULL, 0, MA1, 0, TypeOfMA1, PriceOfMA1, i);
if(DisplayMA2 && CheckMA(2)) MA2Buf[i] = iMA(NULL, 0, MA2, 0, TypeOfMA2, PriceOfMA2, i);
if(DisplayMA3 && CheckMA(3)) MA3Buf[i] = iMA(NULL, 0, MA3, 0, TypeOfMA3, PriceOfMA3, i);
if(DisplayMA4 && CheckMA(4)) MA4Buf[i] = iMA(NULL, 0, MA4, 0, TypeOfMA4, PriceOfMA4, i);
if(DisplayMA5 && CheckMA(5)) MA5Buf[i] = iMA(NULL, 0, MA5, 0, TypeOfMA5, PriceOfMA5, i);
if(DisplayMA6 && CheckMA(6)) MA6Buf[i] = iMA(NULL, 0, MA6, 0, TypeOfMA6, PriceOfMA6, i);
if(DisplayMA7 && CheckMA(7)) MA7Buf[i] = iMA(NULL, 0, MA7, 0, TypeOfMA7, PriceOfMA7, i);
if(DisplayMA8 && CheckMA(8)) MA8Buf[i] = iMA(NULL, 0, MA8, 0, TypeOfMA8, PriceOfMA8, i);
}
if(time != Time[0])
{
if(Sliding && time != 0)
NewTrackingTime += Time[0] - time;
time = Time[0];
}
if(Tracking && NewTrackingTime != TrackingTime)
ObjectSet(Prefix + TRACKING_NAME, OBJPROP_TIME1, NewTrackingTime);
if(StringLen(SlidingSound) != 0 && NewTrackingTime != TrackingTime)
PlaySound(SlidingSound);
TrackingTime = NewTrackingTime;
}
return(0);
}
Comments