1 //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+
\r
3 //| Copyright © 2006, Nikolay Kositsin |
\r
4 //| Khabarovsk, farria@mail.redcom.ru |
\r
5 //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+
\r
7 #property copyright "Nikolay Kositsin"
\r
8 #property link "farria@mail.redcom.ru"
\r
9 //---- îòðèñîâêà èíäèêàòîðà â ãëàâíîì îêíå
\r
10 #property indicator_chart_window
\r
11 //---- êîëè÷åñòâî èíäèêàòîðíûõ áóôôåðîâ
\r
12 #property indicator_buffers 6
\r
13 //---- öâåòà èíäèêàòîðà
\r
14 #property indicator_color1 Lime
\r
15 #property indicator_color2 Lime
\r
16 #property indicator_color3 Red
\r
17 #property indicator_color4 Red
\r
18 #property indicator_color5 Gray
\r
19 #property indicator_color6 Gray
\r
21 //---- ÂÕÎÄÍÛÅ ÏÀÐÀÌÅÒÐÛ ÈÍÄÈÊÀÒÎÐÀ þþþþþþþþþþþþþþþþþþþþþþþæææææææææææææ+
\r
22 extern int IndShift = 0; // cäâèã èíäèêàòîðà âäîëü îñè âðåìåíè
\r
23 extern int TrendMinimum = 0; // ìèíèìàëüíàÿ ñêîðîñòü òðåíäà â ïóíêòàõ
\r
24 //---- æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ+
\r
25 //---- èíäèêàòîðíûå áóôôåðû
\r
32 double Value_Buffer [];
\r
33 //---- ëîãè÷åñêèå ïåðåìåííûå
\r
35 //---- öåëûå ïåðåìåííûå
\r
36 int ind_N1,ind_N2,bar;
\r
37 //---- ïåðåìåííûå ñ ïëàâàþùåé òî÷êîé
\r
38 double Value1,Value0,Trend0,Trend1,Trend2,MINIMUM;
\r
39 //----+ Ââåäåíèå ôóíêöèè INDICATOR_COUNTED
\r
40 //----+ (ôàéë INDICATOR_COUNTED.mqh ñëåäóåò ïîëîæèòü â ïàïêó (äèðåêòîðèþ): MetaTrader\experts\include)
\r
41 #include <INDICATOR_COUNTED.mqh>
\r
42 //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+
\r
43 //| Three Color initialization function |
\r
44 //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+
\r
47 //---- ñòèëè èçîáðàæåíèÿ èíäèêàòîðà
\r
48 SetIndexStyle (0, DRAW_LINE);
\r
49 SetIndexStyle (1, DRAW_LINE);
\r
50 SetIndexStyle (2, DRAW_LINE);
\r
51 SetIndexStyle (3, DRAW_LINE);
\r
52 SetIndexStyle (4, DRAW_LINE);
\r
53 SetIndexStyle (5, DRAW_LINE);
\r
54 //---- 8 èíäèêàòîðíûõ áóôôåðîâ èñïîëüçîâàíû äëÿ ñ÷¸òà.
\r
55 IndicatorBuffers(7);
\r
56 SetIndexBuffer (0, Buffer1);
\r
57 SetIndexBuffer (1, Buffer2);
\r
58 SetIndexBuffer (2, Buffer3);
\r
59 SetIndexBuffer (3, Buffer4);
\r
60 SetIndexBuffer (4, Buffer5);
\r
61 SetIndexBuffer (5, Buffer6);
\r
62 SetIndexBuffer (6, Value_Buffer);
\r
63 //---- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
\r
64 SetIndexEmptyValue(0,EmptyValue);
\r
65 SetIndexEmptyValue(1,EmptyValue);
\r
66 SetIndexEmptyValue(2,EmptyValue);
\r
67 SetIndexEmptyValue(3,EmptyValue);
\r
68 SetIndexEmptyValue(4,EmptyValue);
\r
69 SetIndexEmptyValue(5,EmptyValue);
\r
71 //---- óñòàíîâêà íîìåðà áàðà, íà÷èíàÿ ñ êîòîðîãî áóäåò îòðèñîâûâàòüñÿ èíäèêàòîð
\r
72 int drow_begin=COUNT_begin()+IndShift+3;
\r
73 SetIndexDrawBegin(0,drow_begin);
\r
74 SetIndexDrawBegin(1,drow_begin);
\r
75 SetIndexDrawBegin(2,drow_begin);
\r
76 SetIndexDrawBegin(3,drow_begin);
\r
77 SetIndexDrawBegin(4,drow_begin);
\r
78 SetIndexDrawBegin(5,drow_begin);
\r
80 IndicatorDigits(MarketInfo(Symbol(),digits()));
\r
81 //---- èìåíà äëÿ îêîí äàííûõ è ëýéáû äëÿ ñóáúîêîí.
\r
82 IndicatorShortName(""+Label+"");
\r
83 SetIndexLabel(0,"Up_Trend");
\r
84 SetIndexLabel(1,"Up_Trend");
\r
85 SetIndexLabel(2,"Down_Trend");
\r
86 SetIndexLabel(3,"Down_Trend");
\r
87 SetIndexLabel(4,"Straight_Trend");
\r
88 SetIndexLabel(5,"Straight_Trend");
\r
90 MINIMUM=TrendMinimum*Point;
\r
91 //---- çàâåðøåíèå èíèöèàëèçàöèè
\r
94 //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+
\r
95 //| Three Color CODE |
\r
96 //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+
\r
99 //---- ïîëó÷åíèå óæå ïîäñ÷èòàííûõ áàðîâ
\r
100 //---- áëîêèðîâàíèå ïåðåñ÷¸òà âñåõ ïîäñ÷èòàííûõ è îòðèñîâàííûõ áàðîâ ïðè ïîäêëþ÷åíèè ê èíòåðíåòó
\r
101 int limit,MaxBar,counted_bars=INDICATOR_COUNTED(0); INDICATOR_COUNTED(1);
\r
102 //---- ïðîâåðêà íà âîçìîæíûå îøèáêè
\r
103 if (counted_bars<0){INDICATOR_COUNTED(-1);return(-1);}
\r
104 //---- ïîñëåäíèé ïîäñ÷èòàííûé áàð äîëæåí áûòü ïåðåñ÷èòàí
\r
105 if (counted_bars>0) counted_bars--;
\r
106 //---- îïðåäåëåíèå íîìåðà ñàìîãî ñòàðîãî áàðà, íà÷èíàÿ ñ êîòîðîãî áóäåò ïðîèçåä¸í ïåðåñ÷¸ò íîâûõ áàðîâ
\r
107 limit=Bars-counted_bars-1; MaxBar=Bars-1-COUNT_begin()-3;
\r
108 //---- Çàãðóçêà çíà÷åíèé èñõîäíîãî èíäèêàòîðà â áóôôåð
\r
109 for(bar=limit; bar>=0; bar--)Value_Buffer[bar]=INDICATOR(bar);
\r
110 //---- êîðåêöèÿ ìàêñèìàëüíîãî íîìåðà ñàìîãî ñòàðîãî áàðà, íà÷èíàÿ ñ êîòîðîãî áóäåò ïðîèçåä¸í ïåðåñ÷¸ò íîâûõ áàðîâ
\r
111 //---- èíèöèàëèçàöèÿ íóëÿ
\r
115 for(int ttt=Bars-1;ttt>MaxBar;ttt--)
\r
117 Buffer1[ttt]=EmptyValue; Buffer2[ttt]=EmptyValue;
\r
118 Buffer3[ttt]=EmptyValue; Buffer4[ttt]=EmptyValue;
\r
119 Buffer5[ttt]=EmptyValue; Buffer6[ttt]=EmptyValue;
\r
123 //---- ÎÑÍÎÂÍÎÉ ÖÈÊË ÐÀÑרÒÀ ÈÍÄÈÊÀÒÎÐÀ
\r
124 //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+
\r
125 //|++++++++++++++++++++++++ <<< Three Color Indicator code >>> ++++++++++++++++++++++++++++++++++++++++++++|
\r
126 //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+
\r
127 // Input indicator buffer: Value_Buffer. |
\r
128 // Output indicator buffers: Buffer1, Buffer2, Buffer1, Buffer2, Buffer1, Buffer2. | |
\r
129 //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+
\r
134 Trend2=Value_Buffer[bar+2]-Value_Buffer[bar+3];
\r
135 Trend1=Value_Buffer[bar+1]-Value_Buffer[bar+2];
\r
137 if (MathAbs(Trend2)<MINIMUM)Trend2=0;
\r
138 if (MathAbs(Trend1)<MINIMUM)Trend1=0;
\r
140 if (Trend2>0) ind_N2=1; else {if (Trend2<0) ind_N2=3; else ind_N2=5;}
\r
141 if (Trend1>0) ind_N1=1; else {if (Trend1<0) ind_N1=3; else ind_N1=5;}
\r
143 //----+---------------------------------------------------------------------------------------------------------------+
\r
144 if((ReStart)&&(bar==limit))
\r
146 Trend2=Value_Buffer[bar+2]-Value_Buffer[bar+3];
\r
147 Trend1=Value_Buffer[bar+1]-Value_Buffer[bar+2];
\r
149 if (MathAbs(Trend2)<MINIMUM)Trend2=0;
\r
150 if (MathAbs(Trend1)<MINIMUM)Trend1=0;
\r
152 for(int iii=bar;iii<=bar;iii++)
\r
154 if (Trend2> 0){if (Buffer1[iii+2]!=EmptyValue){ind_N2=1;break;} if (Buffer2[iii+2]!=EmptyValue){ind_N2=2;break;}}
\r
155 if (Trend2< 0){if (Buffer3[iii+2]!=EmptyValue){ind_N2=3;break;} if (Buffer4[iii+2]!=EmptyValue){ind_N2=4;break;}}
\r
156 if (Trend2==0){if (Buffer5[iii+2]!=EmptyValue){ind_N2=5;break;} if (Buffer6[iii+2]!=EmptyValue){ind_N2=6;break;}}
\r
158 for(int kkk=bar;kkk<=bar;kkk++)
\r
160 if (Trend1> 0){if (Buffer1[kkk+1]!=EmptyValue){ind_N1=1;break;} if (Buffer2[kkk+1]!=EmptyValue){ind_N1=2;break;}}
\r
161 if (Trend1< 0){if (Buffer3[kkk+1]!=EmptyValue){ind_N1=3;break;} if (Buffer4[kkk+1]!=EmptyValue){ind_N1=4;break;}}
\r
162 if (Trend1==0){if (Buffer5[kkk+1]!=EmptyValue){ind_N1=5;break;} if (Buffer6[kkk+1]!=EmptyValue){ind_N1=6;break;}}
\r
165 //----+---------------------------------------------------------------------------------------------------------------+
\r
166 Value0 = Value_Buffer[bar+0];
\r
167 Value1 = Value_Buffer[bar+1];
\r
168 Trend0 = Value0 - Value1;
\r
169 if (MathAbs(Trend0)<MINIMUM)Trend0=0;
\r
170 //----+======================================================================+
\r
173 //----+----------------------------------------------------------+
\r
174 case 1 :{ Buffer2[bar+1]=EmptyValue; Buffer3[bar+1]=EmptyValue;
\r
175 Buffer4[bar+1]=EmptyValue; Buffer5[bar+1]=EmptyValue;
\r
176 Buffer6[bar+1]=EmptyValue;} break;
\r
177 //----+----------------------------------------------------------+
\r
178 case 2 :{ Buffer1[bar+1]=EmptyValue; Buffer3[bar+1]=EmptyValue;
\r
179 Buffer4[bar+1]=EmptyValue; Buffer5[bar+1]=EmptyValue;
\r
180 Buffer6[bar+1]=EmptyValue;} break;
\r
181 //----+----------------------------------------------------------+
\r
182 case 3 :{ Buffer1[bar+1]=EmptyValue; Buffer2[bar+1]=EmptyValue;
\r
183 Buffer4[bar+1]=EmptyValue; Buffer5[bar+1]=EmptyValue;
\r
184 Buffer6[bar+1]=EmptyValue;} break;
\r
185 //----+----------------------------------------------------------+
\r
186 case 4 :{ Buffer1[bar+1]=EmptyValue; Buffer2[bar+1]=EmptyValue;
\r
187 Buffer3[bar+1]=EmptyValue; Buffer5[bar+1]=EmptyValue;
\r
188 Buffer6[bar+1]=EmptyValue;} break;
\r
189 //----+----------------------------------------------------------+
\r
190 case 5 :{ Buffer1[bar+1]=EmptyValue; Buffer2[bar+1]=EmptyValue;
\r
191 Buffer3[bar+1]=EmptyValue; Buffer4[bar+1]=EmptyValue;
\r
192 Buffer6[bar+1]=EmptyValue;} break;
\r
193 //----+----------------------------------------------------------+
\r
194 case 6 :{ Buffer1[bar+1]=EmptyValue; Buffer2[bar+1]=EmptyValue;
\r
195 Buffer3[bar+1]=EmptyValue; Buffer4[bar+1]=EmptyValue;
\r
196 Buffer5[bar+1]=EmptyValue;} break;
\r
197 //----+----------------------------------------------------------+
\r
199 //----+======================================================================+
\r
200 Buffer1[bar+0]=EmptyValue; Buffer2[bar+0]=EmptyValue;
\r
201 Buffer3[bar+0]=EmptyValue; Buffer4[bar+0]=EmptyValue;
\r
202 Buffer5[bar+0]=EmptyValue; Buffer6[bar+0]=EmptyValue;
\r
203 //----+=============================================================================================+
\r
206 if(Trend0 >0){Buffer1[bar]=Value0; Buffer1[bar+1]=Value1; ind_N1=1; ReStart=true;}
\r
207 if(Trend0 <0){Buffer3[bar]=Value0; Buffer3[bar+1]=Value1; ind_N1=3; ReStart=true;}
\r
208 if(Trend0==0){Buffer5[bar]=Value0; Buffer5[bar+1]=Value1; ind_N1=5; ReStart=true;}
\r
210 //----+=============================================================================================+
\r
212 if(Trend0>0)Up_Trend();else if(Trend0<0)Down_Trend();else No_trend();
\r
215 //----ÇÀÂÅÐØÅÍÈÅ ÎÑÍÎÂÍÎÃÎ ÖÈÊËÀ
\r
216 // ++++++++++++++++ <<< Three Color Indicator code done >>> +++++++++++++++++++++++++++++
\r
220 //----+ <<< Äîïîëíèòåëüíûå ôóíêöèè äëÿ èíäèêàòîðà >>> SSSSSSSSSSSSSSSSSSSSSS+
\r
221 //+================================================================================================+
\r
222 void Up_Trend(){switch(ind_N1)
\r
224 case 1 : {Buffer1[bar]=Value0; Buffer1[bar+1]=Value1; ind_N2=ind_N1; ind_N1=1;}break;
\r
225 case 2 : {Buffer2[bar]=Value0; Buffer2[bar+1]=Value1; ind_N2=ind_N1; ind_N1=2;}break;
\r
226 case 3 :{switch(ind_N2)
\r
227 {case 1 : {Buffer2[bar]=Value0; Buffer2[bar+1]=Value1; ind_N2=ind_N1; ind_N1=2;}break;
\r
228 default : {Buffer1[bar]=Value0; Buffer1[bar+1]=Value1; ind_N2=ind_N1; ind_N1=1;}}}break;
\r
229 case 4 :{switch(ind_N2)
\r
230 {case 1 : {Buffer2[bar]=Value0; Buffer2[bar+1]=Value1; ind_N2=ind_N1; ind_N1=2;}break;
\r
231 default : {Buffer1[bar]=Value0; Buffer1[bar+1]=Value1; ind_N2=ind_N1; ind_N1=1;}}}break;
\r
232 case 5 :{switch(ind_N2)
\r
233 {case 1 : {Buffer2[bar]=Value0; Buffer2[bar+1]=Value1; ind_N2=ind_N1; ind_N1=2;}break;
\r
234 default : {Buffer1[bar]=Value0; Buffer1[bar+1]=Value1; ind_N2=ind_N1; ind_N1=1;}}}break;
\r
235 case 6 :{switch(ind_N2)
\r
236 {case 1 : {Buffer2[bar]=Value0; Buffer2[bar+1]=Value1; ind_N2=ind_N1; ind_N1=2;}break;
\r
237 default : {Buffer1[bar]=Value0; Buffer1[bar+1]=Value1; ind_N2=ind_N1; ind_N1=1;}}} }
\r
239 //+================================================================================================+
\r
240 void Down_Trend(){switch(ind_N1)
\r
242 case 3 : {Buffer3[bar]=Value0; Buffer3[bar+1]=Value1; ind_N2=ind_N1; ind_N1=3;}break;
\r
243 case 4 : {Buffer4[bar]=Value0; Buffer4[bar+1]=Value1; ind_N2=ind_N1; ind_N1=4;}break;
\r
244 case 1 :{switch(ind_N2)
\r
245 {case 3 : {Buffer4[bar]=Value0; Buffer4[bar+1]=Value1; ind_N2=ind_N1; ind_N1=4;}break;
\r
246 default : {Buffer3[bar]=Value0; Buffer3[bar+1]=Value1; ind_N2=ind_N1; ind_N1=3;}}}break;
\r
247 case 2 :{switch(ind_N2)
\r
248 {case 3 : {Buffer4[bar]=Value0; Buffer4[bar+1]=Value1; ind_N2=ind_N1; ind_N1=4;}break;
\r
249 default : {Buffer3[bar]=Value0; Buffer3[bar+1]=Value1; ind_N2=ind_N1; ind_N1=3;}}}break;
\r
250 case 5 :{switch(ind_N2)
\r
251 {case 3 : {Buffer4[bar]=Value0; Buffer4[bar+1]=Value1; ind_N2=ind_N1; ind_N1=4;}break;
\r
252 default : {Buffer3[bar]=Value0; Buffer3[bar+1]=Value1; ind_N2=ind_N1; ind_N1=3;}}}break;
\r
253 case 6 :{switch(ind_N2)
\r
254 {case 3 : {Buffer4[bar]=Value0; Buffer4[bar+1]=Value1; ind_N2=ind_N1; ind_N1=4;}break;
\r
255 default : {Buffer3[bar]=Value0; Buffer3[bar+1]=Value1; ind_N2=ind_N1; ind_N1=3;}}} }
\r
257 //+================================================================================================+
\r
258 void No_trend(){switch(ind_N1)
\r
260 case 5 : {Buffer5[bar]=Value0; Buffer5[bar+1]=Value1; ind_N2=ind_N1; ind_N1=5;}break;
\r
261 case 6 : {Buffer6[bar]=Value0; Buffer6[bar+1]=Value1; ind_N2=ind_N1; ind_N1=6;}break;
\r
262 case 1 :{switch(ind_N2)
\r
263 {case 5 : {Buffer6[bar]=Value0; Buffer6[bar+1]=Value1; ind_N2=ind_N1; ind_N1=6;}break;
\r
264 default : {Buffer5[bar]=Value0; Buffer5[bar+1]=Value1; ind_N2=ind_N1; ind_N1=5;}}}break;
\r
265 case 2 :{switch(ind_N2)
\r
266 {case 5 : {Buffer6[bar]=Value0; Buffer6[bar+1]=Value1; ind_N2=ind_N1; ind_N1=6;}break;
\r
267 default : {Buffer5[bar]=Value0; Buffer5[bar+1]=Value1; ind_N2=ind_N1; ind_N1=5;}}}break;
\r
268 case 3 :{switch(ind_N2)
\r
269 {case 5 : {Buffer6[bar]=Value0; Buffer6[bar+1]=Value1; ind_N2=ind_N1; ind_N1=6;}break;
\r
270 default : {Buffer5[bar]=Value0; Buffer5[bar+1]=Value1; ind_N2=ind_N1; ind_N1=5;}}}break;
\r
271 case 4 :{switch(ind_N2)
\r
272 {case 5 : {Buffer6[bar]=Value0; Buffer6[bar+1]=Value1; ind_N2=ind_N1; ind_N1=6;}break;
\r
273 default : {Buffer5[bar]=Value0; Buffer5[bar+1]=Value1; ind_N2=ind_N1; ind_N1=5;}}} }
\r
275 //+================================================================================================+
\r