Candle_MA





//+-----------------------------------------------------------------------------+
//|                                                               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 7
#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

//---- 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;

//----

   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=(-1)*K*(Open[Index]-Low[Index]);
                       else Tmp=(-1)*K*(Close[Index]-Low[Index]);
                     }break; 
            case 10: {//Îòíîøåíèå âñåé äëèíû ñâå÷è ê å¸ òåëó            
                      Tmp1=MathAbs(Open[Index]-Close[Index]); 
                      if(Tmp1!=0)
                        Tmp=(High[Index]-Low[Index])/Tmp1;
                        else Tmp=0; 
                     }break; 
            case 11: {//|Top Shade+Bottom Shade| - Îáùàÿ äëèíà òåíåé áåç ó÷¸òà çíàêà
                      if(Open[Index]>Close[Index])
                       Tmp=K*(High[Index]-Open[Index]);
                       else Tmp=K*(High[Index]-Close[Index]);
                     
                     if(Open[Index]<Close[Index])
                       Tmp1=K*(Open[Index]-Low[Index]);
                       else Tmp1=K*(Close[Index]-Low[Index]);

                      Tmp=Tmp+Tmp1;
                     }break;                      
            case 12: {//Top Shade-Bottom Shade - Îáùàÿ äëèíà òåíåé ñ ó÷¸òîì çíàêà
                      if(Open[Index]>Close[Index])
                       Tmp=K*(High[Index]-Open[Index]);
                       else Tmp=K*(High[Index]-Close[Index]);
                     
                     if(Open[Index]<Close[Index])
                       Tmp1=(-1)*K*(Open[Index]-Low[Index]);
                       else Tmp1=(-1)*K*(Close[Index]-Low[Index]);

                      Tmp=Tmp+Tmp1;
                     }break;                      
            case 13: {//100*(High-Open)/(High-Low)
                     Tmp1=High[Index]-Low[Index];
                     if(Tmp1==0) 
                      Tmp=100;
                      else Tmp=100*(High[Index]-Open[Index])/Tmp1;                     
                     }break;                      
            case 14: {//100*(High-Close)/(High-Low)
                     Tmp1=High[Index]-Low[Index];
                     if(Tmp1==0) 
                      Tmp=100;
                      else Tmp=100*(High[Index]-Close[Index])/Tmp1;                     
                     }break; 
            case 15: {//100*(Open-Low)/(High-Low)
                     Tmp1=High[Index]-Low[Index];
                     if(Tmp1==0) 
                      Tmp=100;
                      else Tmp=100*(Open[Index]-Low[Index])/Tmp1;                     
                     }break; 
            case 16: {//100*(Close-Low)/(High-Low)
                     Tmp1=High[Index]-Low[Index];
                     if(Tmp1==0) 
                      Tmp=100;
                      else Tmp=100*(Close[Index]-Low[Index])/Tmp1;                     
                     }break; 
            case 17: {//100*(Open-Close)/(High-Low)
                     Tmp1=High[Index]-Low[Index];
                     if(Tmp1==0) 
                      Tmp=100;
                      else {                                                 
                            Tmp=100*MathAbs(Open[Index]-Close[Index])/Tmp1;
                            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=(-1)*100*(Open[Index]-Low[Index]);
                       else Tmp=(-1)*100*(Close[Index]-Low[Index]);
                     
                     if(Tmp1==0) 
                      Tmp=100;
                      else Tmp=Tmp/Tmp1;                     
                     }break; 
           case 21: {//100*(Top Shade+Bottom Shade)/(High-Low)
                     Tmp2=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])
                       Tmp1=100*(Open[Index]-Low[Index]);
                       else Tmp1=100*(Close[Index]-Low[Index]);

                      Tmp=Tmp+Tmp1;
                      if(Tmp2==0) 
                      Tmp=100;
                      else Tmp=Tmp/Tmp2;     
                     }break; 
           case 22: {//100*(Top Shade-Bottom Shade)/(High-Low)
                     Tmp2=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])
                       Tmp1=100*(Open[Index]-Low[Index]);
                       else Tmp1=100*(Close[Index]-Low[Index]);

                      Tmp=Tmp-Tmp1;
                      if(Tmp2==0) 
                      Tmp=100;
                      else Tmp=Tmp/Tmp2;     
                     }break;   
           case 23: {//Close - Öåíà çàêðûòèÿ
                     Tmp=K*(Close[Index]);
                    }break;   
           case 24: {//Öåíà îòêðûòèÿ
                     Tmp=K*(Open[Index]);
                    }break;     
           case 25: {//Ìàêñèìàëüíàÿ öåíà
                     Tmp=K*(High[Index]);
                    }break;                                        
           case 26: {//Ìèíèìàëüíàÿ öåíà
                     Tmp=K*(Low[Index]);
                    }break;                                  
           case 27: {//Ñðåäíÿÿ öåíà
                     Tmp=K*(High[Index]+Low[Index])/2;
                    }break;              
           case 28: {//Òèïè÷íàÿ öåíà
                     Tmp=K*(High[Index]+Low[Index]+Close[Index])/3;
                    }break;              
           case 29: {//Âçâåøåííàÿ öåíà çàêðûòèÿ
                     Tmp=K*(High[Index]+Low[Index]+Close[Index]+Close[Index])/4;
                    }break;              

           
            }
 return(Tmp);           
}



Sample





Analysis



Market Information Used:

Series array that contains tick volumes of each bar
Series array that contains the highest prices of each bar
Series array that contains open prices of each bar
Series array that contains close prices for each bar
Series array that contains the lowest prices of each bar


Indicator Curves created:

Implements a curve of type DRAW_HISTOGRAM

Implements a curve of type DRAW_LINE

Indicators Used:

Moving average indicator


Custom Indicators Used:

Order Management characteristics:

Other Features: