MultySymbolsChart





//+------------------------------------------------------------------+
//|                                            MultySymbolsChart.mq4 |
//|                                                                * |
//|                                                                * |
//+------------------------------------------------------------------+
#property copyright "Integer"
#property link      "for-good-letters@yandex.ru"

#property indicator_separate_window
#property indicator_buffers 7
#property indicator_color1 Black
#property indicator_color2 Pink
#property indicator_color3 DodgerBlue
#property indicator_color4 Black
#property indicator_color5 Pink
#property indicator_color6 DodgerBlue
#property indicator_color7 Black


#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2

//---- input parameters
extern string Symbols="AUDUSD,EURUSD,GBPUSD,USDCAD,USDCHF,USDJPY";
extern int TimeFrame=0;
extern int BarsOfSymbol=21;
extern int SpaceBars=5;
extern color LblColor=Yellow; 
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double ExtMapBuffer5[];
double ExtMapBuffer6[];
double ExtMapBuffer7[];
double ExtMapBuffer8[];
string sa[];
bool du[];
int Size;
string sn="MSC";
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

void fArrayInvert_string(string & aArray[]){
   int tSize=ArraySize(aArray)-1;
      for(int ti=0;ti<ArraySize(aArray)/2;ti++){
         string tTmp=aArray[ti];
         aArray[ti]=aArray[tSize-ti];
         aArray[tSize-ti]=tTmp;
      }
}

int init(){

   fStrSplit(Symbols,sa,",");
   fArrStrTrimLR(sa);
   Size=ArraySize(sa);
   ArrayResize(du,Size);
   
   fArrayInvert_string(sa);
      
      
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,ExtMapBuffer7);
         
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,ExtMapBuffer1);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   SetIndexBuffer(2,ExtMapBuffer2);
   SetIndexStyle(3,DRAW_HISTOGRAM);
   SetIndexBuffer(3,ExtMapBuffer3);
   SetIndexStyle(4,DRAW_HISTOGRAM);
   SetIndexBuffer(4,ExtMapBuffer4);
   SetIndexStyle(5,DRAW_HISTOGRAM);
   SetIndexBuffer(5,ExtMapBuffer5);
   SetIndexStyle(6,DRAW_HISTOGRAM);
   SetIndexBuffer(6,ExtMapBuffer6);
   
   SetIndexLabel(0,"");
   SetIndexLabel(1,"");
   SetIndexLabel(2,"");
   SetIndexLabel(3,"");
   SetIndexLabel(4,"");
   SetIndexLabel(5,"");
   SetIndexLabel(6,"");
   
   sn=sn+" "+fTimeFrameName(TimeFrame);
   
   IndicatorShortName(sn);
   
   IndicatorDigits(0);
   
   
   
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   if(UninitializeReason()!=REASON_CHARTCHANGE){   
      fObjDeleteByPrefix("MSC_"+TimeFrame);
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start(){


                           for(int i=0;i<Size*(BarsOfSymbol+SpaceBars)+10;i++){
                              ExtMapBuffer1[i]=0;
                              ExtMapBuffer2[i]=0;                              
                              ExtMapBuffer3[i]=0;
                              ExtMapBuffer4[i]=0;           
                              ExtMapBuffer5[i]=0;
                              ExtMapBuffer6[i]=0;   
                              ExtMapBuffer7[i]=0;                                                         
                           }
                     
                        double MaxRange=0;
                           for(i=0;i<Size;i++){
                              du[i]=fCheckDataUpdate(sa[i],TimeFrame);
                                 if(du[i]){
                                    int hb=iHighest(sa[i],TimeFrame,MODE_HIGH,BarsOfSymbol,0);
                                    int lb=iLowest(sa[i],TimeFrame,MODE_LOW,BarsOfSymbol,0);
                                    double Max=iHigh(sa[i],TimeFrame,hb);
                                    double Min=iLow(sa[i],TimeFrame,lb);
                                    double Range=MathRound((Max-Min)/MarketInfo(sa[i],MODE_POINT));
                                    MaxRange=MathMax(MaxRange,Range);
                                 }
                           }
                        double DrawMedian=MathCeil(MaxRange/2);
                           for(i=0;i<Size;i++){
                                 if(du[i]){
                                    hb=iHighest(sa[i],TimeFrame,MODE_HIGH,BarsOfSymbol,0);
                                    lb=iLowest(sa[i],TimeFrame,MODE_LOW,BarsOfSymbol,0);
                                    Max=iHigh(sa[i],TimeFrame,hb);
                                    Min=iLow(sa[i],TimeFrame,lb);
                                    double Mediana=NormalizeDouble((Max+Min)/2,MarketInfo(sa[i],MODE_DIGITS));
                                       for(int j=0;j<BarsOfSymbol;j++){
                                          double o=DrawMedian+(iOpen(sa[i],TimeFrame,j)-Mediana)/MarketInfo(sa[i],MODE_POINT);
                                          double h=DrawMedian+(iHigh(sa[i],TimeFrame,j)-Mediana)/MarketInfo(sa[i],MODE_POINT);
                                          double l=DrawMedian+(iLow(sa[i],TimeFrame,j)-Mediana)/MarketInfo(sa[i],MODE_POINT);
                                          double c=DrawMedian+(iClose(sa[i],TimeFrame,j)-Mediana)/MarketInfo(sa[i],MODE_POINT);
                                         
                                          if(c==o){
                                             for(int k=j+1;k<iBars(sa[i],TimeFrame);k++){
                                                double o2=DrawMedian+(iOpen(sa[i],TimeFrame,k)-Mediana)/MarketInfo(sa[i],MODE_POINT);
                                                double h2=DrawMedian+(iHigh(sa[i],TimeFrame,k)-Mediana)/MarketInfo(sa[i],MODE_POINT);
                                                double l2=DrawMedian+(iLow(sa[i],TimeFrame,k)-Mediana)/MarketInfo(sa[i],MODE_POINT);
                                                double c2=DrawMedian+(iClose(sa[i],TimeFrame,k)-Mediana)/MarketInfo(sa[i],MODE_POINT);
                                                   if(c2>o2){
                                                      c=o+0.333;
                                                      h=MathMax(h,c);
                                                      break;
                                                   }
                                                   if(c2<o2){
                                                      c=o-0.333;  
                                                      l=MathMin(l,c);
                                                      break;
                                                   }                                                   
                                             }
                                          }
                                         
                                             if(c>o){
                                                ExtMapBuffer2[j+i*(BarsOfSymbol+SpaceBars)]=c;
                                                ExtMapBuffer3[j+i*(BarsOfSymbol+SpaceBars)]=o;  
                                                ExtMapBuffer5[j+i*(BarsOfSymbol+SpaceBars)]=h;
                                                ExtMapBuffer6[j+i*(BarsOfSymbol+SpaceBars)]=l;                                                  
                                                                                             
                                             }
                                             if(c<o){
                                                ExtMapBuffer1[j+i*(BarsOfSymbol+SpaceBars)]=o;
                                                ExtMapBuffer3[j+i*(BarsOfSymbol+SpaceBars)]=c;   
                                                ExtMapBuffer4[j+i*(BarsOfSymbol+SpaceBars)]=h;
                                                ExtMapBuffer6[j+i*(BarsOfSymbol+SpaceBars)]=l;                                                                                               
                                             }
                                         
                                        
                                       }
                                    fObjText("MSC_"+TimeFrame+"_"+sa[i],Time[i*(BarsOfSymbol+SpaceBars)+BarsOfSymbol/2],MaxRange*1.2,sa[i],LblColor,6,WindowFind(sn),"Arial",false);
                                 }
                                 else{
                                    ObjectDelete("MSC_"+TimeFrame+"_"+sa[i]);
                                 }
                               fObjVLine("MSC_"+TimeFrame+"_h_"+sa[i],Time[(i+1)*(BarsOfSymbol+SpaceBars)-SpaceBars/2-1],Gray,1,WindowFind(sn),0,false);   
                           }  
                           for(i=0;i<Size*(BarsOfSymbol+SpaceBars)+10;i++){ 
                              ExtMapBuffer7[i]=MaxRange*1.2;
                           }
                     SetLevelValue(0,0);
                     SetLevelValue(1,MaxRange);
   return(0);
  }
//+------------------------------------------------------------------+

void fObjDeleteByPrefix(string aPrefix){
   for(int i=ObjectsTotal()-1;i>=0;i--){
      if(StringFind(ObjectName(i),aPrefix,0)==0){
         ObjectDelete(ObjectName(i));
      }
   }
}

void fObjVLine(
   string aObjectName,  // 1 èìÿ
   datetime aTime_1,    // 2 âðåìÿ
   color aColor=Red,    // 3 öâåò
   int aWidth=1,        // 4 òîëùèíà
   int aWindowNumber=0, // 5 îêíî
   int aStyle=0,        // 6 0-STYLE_SOLID, 1-STYLE_DASH, 2-STYLE_DOT, 3-STYLE_DASHDOT, 4-STYLE_DASHDOTDOT
   bool aBack=false     // 7 ôîí
   ){
      if(ObjectFind(aObjectName)!=aWindowNumber){
         ObjectCreate(aObjectName,OBJ_VLINE,aWindowNumber,aTime_1,0);
      }      
   ObjectSet(aObjectName,OBJPROP_TIME1,aTime_1);   
   ObjectSet(aObjectName,OBJPROP_COLOR,aColor);
   ObjectSet(aObjectName,OBJPROP_WIDTH,aWidth);
   ObjectSet(aObjectName,OBJPROP_BACK,aBack);     
   ObjectSet(aObjectName,OBJPROP_STYLE,aStyle);       
}


string fTimeFrameName(int arg){

   // fTimeFrameName();

   int v;
      if(arg==0){
         v=Period();
      }
      else{
         v=arg;
      }
      switch(v){
         case 0:
            return("0");
         case 1:
            return("M1");
         case 5:
            return("M5");                  
         case 15:
            return("M15");
         case 30:
            return("M30");             
         case 60:
            return("H1");
         case 240:
            return("H4");                  
         case 1440:
            return("D1");
         case 10080:
            return("W1");          
         case 43200:
            return("MN1");
         default:
            return("M"+arg);          
      }
}

void fObjText(
   string aObjectName,     // 1 èìÿ
   datetime aTime_1,       // 2 âðåìÿ
   double aPrice_1,        // 3 öåíà
   string aText,           // 4 òåêñò
   color aColor=Red,       // 5 öâåò
   int aFontSize=8,        // 6 ðàçìåð øðèôòà
   int aWindowNumber=0,    // 7 îêíî
   string aFont="Arial",   // 8 øðèôò
   bool aBack=false        // 9 ôîí
   
   ){
   
   // fText("",Time[1],Close[1],"",Red,8);
   // fText("",Time[1],Close[1],"",Red,8,0,"Arial",false);
   
      if(ObjectFind(aObjectName)!=aWindowNumber){
         ObjectCreate(aObjectName,OBJ_TEXT,aWindowNumber,aTime_1,aPrice_1);
      }      
   ObjectSet(aObjectName,OBJPROP_TIME1,aTime_1);
   ObjectSet(aObjectName,OBJPROP_PRICE1,aPrice_1);   
   ObjectSetText(aObjectName,aText,aFontSize,aFont,aColor);
   ObjectSet(aObjectName,OBJPROP_BACK,aBack);
}


void fStrSplit(string aString,string & aArray[],string aDelimiter){
   int tCounter=0;
   int tDelimiterLength=StringLen(aDelimiter);
   ArrayResize(aArray,tCounter);
   int tPos1=0;
   int tPos2=StringFind(aString,aDelimiter,0);
      while(tPos2!=-1){
            if(tPos2>tPos1){
               tCounter++;
               ArrayResize(aArray,tCounter);
               aArray[tCounter-1]=StringSubstr(aString,tPos1,tPos2-tPos1);
            }
         tPos1=tPos2+tDelimiterLength;
         tPos2=StringFind(aString,aDelimiter,tPos1);
      }
   tPos2=StringLen(aString);      
      if(tPos2>tPos1){
         tCounter++;   
         ArrayResize(aArray,tCounter);
         aArray[tCounter-1]=StringSubstr(aString,tPos1,tPos2-tPos1);      
      }
}
void fArrStrTrimLR(string & aArray[]){
   for(int ti=0;ti<ArraySize(aArray);ti++){
      aArray[ti]=StringTrimLeft(StringTrimRight(aArray[ti]));
   }
}

bool fCheckDataUpdate(string aSymbol,int aTimeFrame){
   datetime daytimes[];
      if(iClose(aSymbol,aTimeFrame,0)==0){
         return(false);
      }
   ArrayCopySeries(daytimes,MODE_TIME,aSymbol,aTimeFrame);
      if(GetLastError()==4066){
         return(false);
      }
   return(true);      
}








Sample





Analysis



Market Information Used:

Series array that contains the highest prices of each bar
Series array that contains the lowest 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 open time of each bar


Indicator Curves created:

Implements a curve of type DRAW_HISTOGRAM


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features: