bleh
[mqlkit.git] / include / 3Color.mqh
blob92d555c5da7d19c17d8c5a9bfb13eafb08227af7
1 //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+ \r
2 //|                                                       3Color.mqh | \r
3 //|                           Copyright © 2006,     Nikolay Kositsin | \r
4 //|                               Khabarovsk,  farria@mail.redcom.ru | \r
5 //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+\r
6 /*\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
20 */\r
21 //---- ÂÕÎÄÍÛÅ ÏÀÐÀÌÅÒÐÛ ÈÍÄÈÊÀÒÎÐÀ þþþþþþþþþþþþþþþþþþþþþþþæææææææææææææ+\r
22 extern int IndShift = 0;  // cäâèã èíäèêàòîðà âäîëü îñè âðåìåíè \r
23 extern int TrendMinimum = 0;  // ìèíèìàëüíàÿ ñêîðîñòü òðåíäà â ïóíêòàõ\r
24 //---- æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ+\r
25 //---- èíäèêàòîðíûå áóôôåðû\r
26 double Buffer1 [];\r
27 double Buffer2 [];\r
28 double Buffer3 [];\r
29 double Buffer4 [];\r
30 double Buffer5 []; \r
31 double Buffer6 []; \r
32 double Value_Buffer []; \r
33 //----  ëîãè÷åñêèå ïåðåìåííûå\r
34 bool   ReStart=false;\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
45 int init() \r
46   { \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
70 //----  \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
79 //----   \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
89 //----   \r
90    MINIMUM=TrendMinimum*Point;\r
91 //---- çàâåðøåíèå èíèöèàëèçàöèè\r
92 return(0); \r
93   } \r
94 //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+\r
95 //|  Three Color CODE                                                |\r
96 //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+\r
97 int start() \r
98 \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
112 if (limit>MaxBar)\r
113  {\r
114   limit=MaxBar; \r
115   for(int ttt=Bars-1;ttt>MaxBar;ttt--)\r
116    {\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
120    }\r
121  }\r
122 bar=limit;\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
130 while(bar>=0)   \r
131  {    \r
132      if (!ReStart)\r
133        { \r
134         Trend2=Value_Buffer[bar+2]-Value_Buffer[bar+3]; \r
135         Trend1=Value_Buffer[bar+1]-Value_Buffer[bar+2];\r
136           \r
137         if (MathAbs(Trend2)<MINIMUM)Trend2=0;\r
138         if (MathAbs(Trend1)<MINIMUM)Trend1=0;  \r
139              \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
142        } \r
143      //----+---------------------------------------------------------------------------------------------------------------+  \r
144      if((ReStart)&&(bar==limit))\r
145        {\r
146         Trend2=Value_Buffer[bar+2]-Value_Buffer[bar+3]; \r
147         Trend1=Value_Buffer[bar+1]-Value_Buffer[bar+2];\r
148         \r
149         if (MathAbs(Trend2)<MINIMUM)Trend2=0;\r
150         if (MathAbs(Trend1)<MINIMUM)Trend1=0;   \r
151         \r
152         for(int iii=bar;iii<=bar;iii++)\r
153          {\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
157          }\r
158         for(int kkk=bar;kkk<=bar;kkk++)\r
159          {\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
163          }\r
164         }\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
171     switch(ind_N1)\r
172             {  \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
198             } \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
204         if(!ReStart)  \r
205              {\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
209              }\r
210 //----+=============================================================================================+ \r
211         \r
212         if(Trend0>0)Up_Trend();else if(Trend0<0)Down_Trend();else No_trend(); \r
213   bar--; \r
214  }\r
215  //----ÇÀÂÅÐØÅÍÈÅ ÎÑÍÎÂÍÎÃΠÖÈÊËÀ       \r
216 // ++++++++++++++++ <<< Three Color Indicator code done >>> +++++++++++++++++++++++++++++  \r
217 return(0); \r
218 \r
220 //----+ <<< Äîïîëíèòåëüíûå ôóíêöèè äëÿ èíäèêàòîðà >>> SSSSSSSSSSSSSSSSSSSSSS+\r
221 //+================================================================================================+\r
222 void Up_Trend(){switch(ind_N1)\r
223 {   \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
241 {   \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
259 {   \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
276