X0diagram1





//+------------------------------------------------------------------+
//|                                                    X0diagram.mq4 |
//|                                             Copyright © 2005, 4e |
//|                                                                  |
//+------------------------------------------------------------------+

///////////////////////////////////////////////////////////////////////
//                            Äèàãðàììà Õ0
// Ðèñóåò äèàãðàììû Õ0 ïî öåíàì çàêðûòèÿ
// Âõîäíûå ïàðàìåòðû: BoxSize - ðàçìåð áîêñà â ïóíêòàõ
//                    ReversalBox - êîë-âî áîêñîâ äëÿ ðàçâîðîòà
//                    Candles = êîë-âî ñâå÷åé äëÿ ïîäñ÷åòà  
//                    
//  Èçìåíèòå ïàðàìåòð indicator_color3 öâåòîì âàøåé öâåòîâîé ñõåìû 
///////////////////////////////////////////////////////////////////////





#property copyright "Copyright © 2005, 4e"
#property link      "4ebur@mail.ru"

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 White



extern double BoxSize = 100;
extern int ReversalBox = 3;
extern int Candles = 3000;



double PointArray[];
double FigureArray[];
double ZeroArray[];



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
SetIndexBuffer(0,PointArray);
SetIndexBuffer(1,FigureArray);
SetIndexBuffer(2,ZeroArray);


SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexStyle(1,DRAW_HISTOGRAM);
SetIndexStyle(2,DRAW_HISTOGRAM);

SetIndexEmptyValue(0,0);
SetIndexEmptyValue(1,0);
SetIndexEmptyValue(2,0);

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
     int    limit;
   int    counted_bars=IndicatorCounted();
 
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   
//----

double BoxPointSize = BoxSize * Point; //Ðàçìåð áîêñà â ïóíòàõ
double ReversalSize = BoxPointSize * ReversalBox; // Ðàçìåð ðàçâîðîòà â ïóíêòàõ
  
  
  
  
  
  // Èíèöèàëèçàöèÿ ìàññèâîâ
  for(int i=limit;i>0;i--)
    {
      PointArray[i] = 0;
      FigureArray[i] = 0;
      ZeroArray[i] = 0;
    
    
    }
    
    
  int  beginPoint; // Òî÷êà îòñ÷åòà
  int  CurPoint; //Òåêóùàÿ òî÷êà
  bool Direction; // 1  - ââåðõ, òèïà Õ, 0-âíèç, òèïà 0
  int LocalÌin; // Ëîêàëüíûé ìèíèìóì
  int LocalMax; // Ëîêàëüíûé ìàêñèìóì
  double beginIndex; // èíäåõ íà÷àëà îòñ÷åòà
  
  // Àëãîðèòì ðàñ÷åòà òàêîâ: Êàê òîëüêî ïðîèçîøåë ðàçâîðîò, ðèñóåì ïðîøëóþ äèàãðàììó, è æäåì ñëåäóþùåãî ðàçâîðîòà
  // Íà÷àëüíîå íàïðàâëåíèå èäåíòèôèöèðóåòñÿ ïî ïåðâîé ñâå÷å(áåëàÿ - çíà÷èð ââåðõ, ÷åðíàÿ - âíèç)

  
  Direction = (Close[Candles]-Open[Candles]) > 0;// Çàäàåì íà÷àëüíîå íàïðàâëåíèå
  beginPoint = Candles; // Íà÷àëüíàÿ òî÷êà îòñ÷åòà
  CurPoint = Candles;   // Íà÷àëüíàÿ òåêóùàÿ òî÷êà
  LocalMax = Candles; // Íà÷àëüíûé ìàêñèìóì
  LocalÌin = Candles; // Íà÷àëüíûé ìèíèìóì
  beginIndex = Close[beginPoint]; // Íà÷àëüíûé èíäåêñ
   
   
   
   for( i=Candles-1;i>0;i--)
    {
      CurPoint = i; // Ñäâèã òåêóùåé òî÷êè
      LocalMax = Highest(NULL,0,MODE_CLOSE,beginPoint-CurPoint,CurPoint);
      LocalÌin = Lowest(NULL,0,MODE_CLOSE,beginPoint-CurPoint,CurPoint);
      
         if(Direction) // Ââåðõ
            {
               if(Close[LocalMax]-Close[CurPoint] >= ReversalSize) // Ðàçâîðîò âíèç
               {
                    int boxes  = MathFloor(((Close[LocalMax]-Close[beginPoint])/(BoxSize*Point))); // âû÷èñëÿåì êîë-âî áîêñîâ
                     
                     for(int j=beginPoint;j>LocalMax-1;j--)
                     {
                        PointArray[j] = beginIndex + BoxSize*boxes*Point; //Ðèñóåì èêñû
                        ZeroArray[j] = beginIndex;  // Ïðîáåëû
                     
                     }
                     
                   beginPoint = LocalMax-1; // Ñäâèãàåì íà÷àëüíóþ òî÷êó íà áûâøèé ìàêñèìóì
                   beginIndex = beginIndex + BoxSize*(boxes-1)*Point; // Ñäâèãàåì èíäåêñ íà îäèí áîêñ âíèç
                   LocalÌin = CurPoint;
                   Direction = 0; // Óêàçûâàåì ÷òî íà÷àëîñü äâèæåíèå âíèç  
               }
            }
            
         
          else  // Âíèç
            {
               if(Close[CurPoint]-Close[LocalÌin] >=ReversalSize) // Ðàçâîðîò ââåðõ
               {
                     
                      boxes  = MathFloor(((Close[beginPoint]-Close[LocalÌin])/(BoxSize*Point)));// âû÷èñëÿåì êîë-âî áîêñîâ
                     
                     for( j=beginPoint;j>LocalÌin-1;j--)
                     {
                        FigureArray[j] = beginIndex; //Ðèñóåì íóëè
                        ZeroArray[j] = beginIndex-BoxSize*boxes*Point;   // Ïðîáåëû
                     
                     }
                     
                   beginPoint = LocalÌin-1; // Ñäâèãàåì íà÷àëüíóþ òî÷êó íà áûâøèé ìàêñèìóì
                   Direction = 1; // Óêàçûâàåì ÷òî íà÷àëîñü äâèæåíèå âíèç  
                   LocalMax = CurPoint; 
                   beginIndex = beginIndex - BoxSize*(boxes-1)*Point; // Ñäâèãàåì èíäåêñ íà îäèí áîêñ ââåðõ
                     
                     
               }
            }
    }
   
   
   
   
   // Ðèñóåì òåêóùèé ðàçâîðîò
  
  
   
   
   if(Direction)
   {
         LocalMax = Highest(NULL,0,MODE_CLOSE,beginPoint-CurPoint,CurPoint);
         boxes  = MathFloor(((Close[LocalMax]-Close[beginPoint])/(BoxSize*Point))); // âû÷èñëÿåì êîë-âî áîêñîâ
         
         for(j=beginPoint;j>0;j--)
                     {
                        PointArray[j] = beginIndex + BoxSize*boxes*Point; //Ðèñóåì èêñû
                        ZeroArray[j] = beginIndex;  // Ïðîáåëû
                     
                     }
      
   
   }
   
   else
   {
       LocalÌin = Lowest(NULL,0,MODE_CLOSE,beginPoint-CurPoint,CurPoint);
      boxes  = MathFloor(((Close[beginPoint]-Close[LocalÌin])/(BoxSize*Point)));// âû÷èñëÿåì êîë-âî áîêñîâ
   
      for(j=beginPoint;j>0;j--)
                     {
                        FigureArray[j] =  beginIndex;//Ðèñóåì íóëè
                        ZeroArray[j] = beginIndex - BoxSize*boxes*Point;  // Ïðîáåëû
                     
                     }
   
   
   }
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:

Series array that contains close prices for each bar
Series array that contains open prices of each bar


Indicator Curves created:


Implements a curve of type DRAW_HISTOGRAM

Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features: