//+-----------------------------------------------------------------------------+ //| Candle_MA.mq4 | //| Gregory A. Kakhiani | //| gkakhiani@gmail.com | //+-----------------------------------------------------------------------------+ //Candle Moving Average | //Простой индикатор для анализа средних значений различных параметров свечей. | //+-----------------------------------------------------------------------------+ // ----= Описание параметров =----- | // | //CandleType - Тип отображаемых данных | //---------------+--------------------------------------------------------------+ // Код | Определение | //---------------+--------------------------------------------------------------+ // Абсолютные данные //---------------+--------------------------------------------------------------+ // 1 | High-Open | // 2 | High-Close | // 3 | Open-Low | // 4 | Close-Low | // 5 | |Open-Close| | // 6 | High-Low | // 7 | Top Shade - Верхняя тень с учётом цвета свечи | // 8 | Open-Close - с учётом цвета свечи | // 9 | Bottom Shade - Нижняя тень с учётом цвета свечи | // 10 | Отношение всей длины свечи к её телу | // 11 | Top Shade+Bottom Shade - Общая длина теней без учёта знака | // 12 | Top Shade-Bottom Shade - Общая длина теней с учётом знака | //---------------+--------------------------------------------------------------+ // Относительные данные | //---------------+--------------------------------------------------------------+ // 13 | 100*(High-Open)/(High-Low) | // 14 | 100*(High-Close)/(High-Low) | // 15 | 100*(Open-Low)/(High-Low) | // 16 | 100*(Close-Low)/(High-Low) | // 17 | 100*(Open-Close)/(High-Low) | // 18 | 100*(|Open-Close|)/(High-Low) | // 19 | 100*(Top Shade)/(High-Low) | // 20 | 100*(Bottom Shade)/(High-Low) | // 21 | 100*(Top Shade+Bottom Shade)/(High-Low) | // 22 | 100*(Top Shade-Bottom Shade)/(High-Low) | //---------------+--------------------------------------------------------------+ // | //MaPeriod - Период сглаживания | // | // MaType - Метод сглаживания - Используются стандартные константы | // | // VolMult - Определяет масштабирование по объемам | // 0 - игнорировать объемы | // 1 - умножить на объем | // | // scale - Множитель для масштабирования по вертикали для баров | //avgscale - Множитель для масштабирования по вертикали для средней | // | // k1...k6 - Коэффициенты для расчёта уровней средней величины | //+-----------------------------------------------------------------------------+ #property copyright "Gregory A. Kakhiani" #property link "gkakhiani@gmail.com" #property indicator_separate_window #property indicator_buffers 8 #property indicator_color1 Blue #property indicator_color2 Red #property indicator_color3 Silver #property indicator_color4 Silver #property indicator_color5 Silver #property indicator_color6 Silver #property indicator_color7 Silver #property indicator_color8 Silver //---- input parameters extern int CandleType=6; extern int MaPeriod=360; extern int MaType=0; extern int VolMult=0; extern double scale=1.0; extern double avgscale=1.0; //Коеффициенты для расчёта уровней скользящей средней extern double k1=0.3333333333; extern double k2=0.6666666666; extern double k3=1.3333333333; extern double k4=1.6666666666; extern double k5=2.0000000000; extern double k6=2.3333333333; //---- buffers double CandleBuffer[]; double MABuffer[]; // double MABuffer1[]; double MABuffer2[]; double MABuffer3[]; double MABuffer4[]; double MABuffer5[]; double MABuffer6[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators IndicatorDigits(0); //Округляем //Устанавливаем стили отображения SetIndexStyle(0,DRAW_HISTOGRAM,0,7); SetIndexBuffer(0,CandleBuffer); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(1,MABuffer); SetIndexStyle(2,DRAW_LINE,STYLE_DASHDOTDOT); SetIndexBuffer(2,MABuffer1); SetIndexStyle(3,DRAW_LINE,STYLE_DASHDOTDOT); SetIndexBuffer(3,MABuffer2); SetIndexStyle(4,DRAW_LINE,STYLE_DASHDOTDOT); SetIndexBuffer(4,MABuffer3); SetIndexStyle(5,DRAW_LINE,STYLE_DASHDOTDOT); SetIndexBuffer(5,MABuffer4); SetIndexStyle(6,DRAW_LINE,STYLE_DASHDOTDOT); SetIndexBuffer(6,MABuffer5); SetIndexStyle(7,DRAW_LINE,STYLE_DASHDOTDOT); SetIndexBuffer(7,MABuffer6); //Названия графиков SetIndexLabel(0,"Candle:") ; SetIndexLabel(1,"Candle Average:") ; SetIndexLabel(2,"Level K1:") ; SetIndexLabel(3,"Level K2:") ; SetIndexLabel(4,"Level K3:") ; SetIndexLabel(5,"Level K4:") ; SetIndexLabel(6,"Level K5:") ; SetIndexLabel(7,"Level K6:") ; // if (CandleType>29) CandleType=1; //оформляем индикатор string Candletext=""; switch(CandleType) { case 1: {//High-Open Candletext="High-Open"; }break; case 2: {//High-Close Candletext="High-Close"; }break; case 3: {//Open-Low Candletext="Open-Low"; }break; case 4: {//Close-Low Candletext="Close-Low"; }break; case 5: {// |Open-Close| Candletext="|Open-Close|"; }break; case 6: {//High-Low Candletext="High-Low"; }break; case 7: {//Верхная тень с учётом цвета свечи Candletext="Top Shade"; }break; case 8: {//Open-Close - с учётом цвета свечи Candletext="Open-Close"; }break; case 9: {//Нижная тень с учётом цвета свечи Candletext="Bottom Shade"; }break; case 10: {//Отношение всей длины свечи к её телу Candletext="Candle/Candle Body"; }break; case 11: {//Top Shade+Bottom Shade - Общая длина теней без учёта знака Candletext="Top Shade+Bottom Shade"; }break; case 12: {//Top Shade-Bottom Shade - Общая длина теней с учётом знака Candletext="Top Shade-Bottom Shade"; }break; case 13: {//100*(High-Open)/(High-Low) Candletext="%(High-Open)"; }break; case 14: {//100*(High-Close)/(High-Low) Candletext="%(High-Close)"; }break; case 15: {//100*(Open-Low)/(High-Low) Candletext="%(Open-Low)"; }break; case 16: {//100*(Close-Low)/(High-Low) Candletext="%(Close-Low)"; }break; case 17: {//100*(Open-Close)/(High-Low) Candletext="%(Open-Close)"; }break; case 18: {//100*(|Open-Close|)/(High-Low) Candletext="%(|Open-Close|)"; }break; case 19: {//100*(Top Shade)/(High-Low) Candletext="%(Top Shade)"; }break; case 20: {//100*(Bottom Shade)/(High-Low) Candletext="%(Bottom Shade)"; }break; case 21: {//100*(Top Shade+Bottom Shade)/(High-Low) Candletext="%(Top Shade+Bottom Shade)"; }break; case 22: {//100*(Top Shade-Bottom Shade) Candletext="%(Top Shade-Bottom Shade)"; }break; case 23: {//Close - Цена закрытия Candletext="Close"; }break; case 24: {//Цена открытия Candletext="Open"; }break; case 25: {//Максимальная цена Candletext="High"; }break; case 26: {//Минимальная цена Candletext="Low"; }break; case 27: {//Средняя цена Candletext="Median"; }break; case 28: {//Типичная цена Candletext="Typical"; }break; case 29: {//Взвешенная цена закрытия Candletext="Weighted"; }break; } string MaTypeText=""; switch(MaType) { case 0:{ MaTypeText="MODE_SMA"; }break; case 1:{ MaTypeText="MODE_EMA"; }break; case 2:{ MaTypeText="MODE_SMMA"; }break; case 3:{ MaTypeText="MODE_LWMA"; }break; } string VolMultText=""; if(VolMult!=0) VolMultText="*Value"; else VolMultText="NONE"; IndicatorShortName("Candle MA("+Candletext+","+MaPeriod+","+MaTypeText+","+VolMultText+")"); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { //int counted_bars=IndicatorCounted(); int i; int j; //int MaxBars=100000; double K=scale/Point; int counted_bars = IndicatorCounted(); if(counted_bars < 0) return(-1); if(counted_bars > 0) counted_bars--; int MaxBars = Bars - counted_bars; if(counted_bars==0) MaxBars-=1; //---- for(i=0;i<=MaxBars;i++) { if(VolMult!=0) CandleBuffer[i]=GetPrice(K, CandleType, i)*Volume[i]; else CandleBuffer[i]=GetPrice(K, CandleType, i); } for(i=0;i<=MaxBars;i++) { //Усреднение и сглаживание MABuffer[i]=iMAOnArray(CandleBuffer,0,MaPeriod,0,MaType,i)*avgscale; //Заполнение вспомогательных буферов MABuffer1[i]=k1*MABuffer[i]; MABuffer2[i]=k2*MABuffer[i]; MABuffer3[i]=k3*MABuffer[i]; MABuffer4[i]=k4*MABuffer[i]; MABuffer5[i]=k5*MABuffer[i]; MABuffer6[i]=k6*MABuffer[i]; } //---- return(0); } //+----------------------------------------------------------------------+ //|Функция в зависимости от PriceType-возвращает либо параметры свечи //| PriceType 1 - 22 //|либо одну из величин из списка ценовых констант //| PriceType 23 - 29 //+----------------------------------------------------------------------+ //|K - множитель //|PriceType - параметр определяющий способ расчёта возвращаемой величины //|Index - индекс текущего бара //+----------------------------------------------------------------------+ double GetPrice(double K, int PriceType, int Index) { double Tmp=0.0; double Tmp1=0.0; double Tmp2=0.0; switch(PriceType) { case 1: {//High-Open Tmp=K*(High[Index]-Open[Index]); }break; case 2: {//High-Close Tmp=K*(High[Index]-Close[Index]); }break; case 3: {//Open-Low Tmp=K*(Open[Index]-Low[Index]); }break; case 4: {//Close-Low Tmp=K*(Close[Index]-Low[Index]); }break; case 5: {// |Open-Close| Tmp=K*MathAbs(Open[Index]-Close[Index]); }break; case 6: {//High-Low Tmp=K*(High[Index]-Low[Index]); }break; case 7: {//Верхная тень с учётом цвета свечи if(Open[Index]>Close[Index]) Tmp=K*(High[Index]-Open[Index]); else Tmp=K*(High[Index]-Close[Index]); }break; case 8: {//Open-Close - с учётом цвета свечи Tmp=K*MathAbs(Open[Index]-Close[Index]); if((Open[Index]>Close[Index])) Tmp=(-1)*Tmp; }break; case 9: {//Нижная тень с учётом цвета свечи if(Open[Index]Close[Index]) Tmp=K*(High[Index]-Open[Index]); else Tmp=K*(High[Index]-Close[Index]); if(Open[Index]Close[Index]) Tmp=K*(High[Index]-Open[Index]); else Tmp=K*(High[Index]-Close[Index]); if(Open[Index]Close[Index])) Tmp=(-1)*Tmp; } }break; case 18: {//100*(|Open-Close|)/(High-Low) Tmp1=High[Index]-Low[Index]; if(Tmp1==0) Tmp=100; else Tmp=100*MathAbs(Open[Index]-Close[Index])/Tmp1; }break; case 19: {//100*(Top Shade)/(High-Low) Tmp1=High[Index]-Low[Index]; if(Open[Index]>Close[Index]) Tmp=100*(High[Index]-Open[Index]); else Tmp=100*(High[Index]-Close[Index]); if(Tmp1==0) Tmp=100; else Tmp=Tmp/Tmp1; }break; case 20: {//100*(Bottom Shade)/(High-Low) Tmp1=High[Index]-Low[Index]; if(Open[Index]Close[Index]) Tmp=100*(High[Index]-Open[Index]); else Tmp=100*(High[Index]-Close[Index]); if(Open[Index]Close[Index]) Tmp=100*(High[Index]-Open[Index]); else Tmp=100*(High[Index]-Close[Index]); if(Open[Index]