Candle_MA_v1

Author: Gregory A. Kakhiani
Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
Candle_MA_v1
//+-----------------------------------------------------------------------------+
//|                                                               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=(-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);           
}

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---