SuperMultiChart

Author: Denis Orlov
Price Data Components
Series array that contains close prices for each barSeries array that contains the highest prices of each barSeries array that contains the lowest prices of each barSeries array that contains open prices of each bar
Miscellaneous
Implements a curve of type %1
2 Views
0 Downloads
0 Favorites
SuperMultiChart
//+------------------------------------------------------------------+
//|                                                                  |
//|                                                      Denis Orlov |
//|                                    http://denis-or-love.narod.ru |
/*
Óíèâåðñàëüíûé ìóëüòè-ãðàôèê âàëþò, ñ íàñòðîéêîé ñïèñêà âàëþò, 
äèàïàçîíà îòîáðàæåíèÿ, ïåðèîäà è ïîëîæåíèÿ â îêíå.
http://codebase.mql4.com/ru/6324

The universal multi-chart of the currencies, with the changed list of currencies, 
a range of display, the period and position in a window.
http://codebase.mql4.com/6325
*/

//+------------------------------------------------------------------+
#property copyright "Denis Orlov"
#property link      "http://denis-or-love.narod.ru"

#define Pref "Denis Orlov: "

#property indicator_chart_window

#property indicator_buffers 4

#property indicator_color1 DarkTurquoise
#property indicator_color2 DarkBlue
#property indicator_color3 DarkTurquoise
#property indicator_color4 DarkBlue


double LineBma[], Line1[], Line2[], Line3[], Line4[];
//#property indicator_maximum 100



string SymbolsArray[];
int Bars0[];//array of 0 bar
int BarsTx[];//array of bar for price label

                         
extern string Instruments=
"EURUSD GBPUSD AUDUSD USDCHF USDCAD USDJPY EURGBP EURCHF GBPCHF EURAUD EURJPY GBPJPY";
//"EURUSD240 EURUSD60 EURUSD30 EURUSD15 EURUSD5 EURUSD1";
//"GBPUSD EURUSD AUDUSD USDCHF USDCAD USDJPY";


//"USDJPY EURJPY GBPJPY";

extern int Bars_ =25; 
extern int ChartsGap =1;
extern bool GoldColor=False;
extern string note1="Vertical lines:";                  
extern color VertLineColor=Blue;
extern int VertLineWidth=1;
extern int VertLineStyle=2;
extern string note2="Text:"; 
extern int TextY=60;
extern int TextYStep=20;
extern int FontSize=10;
extern color TextColor=Blue;
extern color UpColor=Green;
extern color DnColor=Red;


double CountLevel;
//extern int History=0; 

/*extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=9;

#define MacdArrSize 5
double MACD[MacdArrSize];
double MACD_S[MacdArrSize];*/

int per;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----   
    FillSymbolsArray();
    if(ArraySize(SymbolsArray)<1) return;
     ArrayResize( Bars0,ArraySize(SymbolsArray));
     ArrayResize( BarsTx,ArraySize(SymbolsArray));
     
    Comment("*MultiChart* "+ArraySize(SymbolsArray)+" symbols *http://denis-or-love.narod.ru*");
    
   SetIndexStyle(0,DRAW_HISTOGRAM,0,3);
   SetIndexBuffer(0,Line1);
   
   SetIndexStyle(1,DRAW_HISTOGRAM,0,3);
   SetIndexBuffer(1,Line2);

   SetIndexStyle(2,DRAW_HISTOGRAM,0,1);
   SetIndexBuffer(2,Line3);
   
   SetIndexStyle(3,DRAW_HISTOGRAM,0,1);
   SetIndexBuffer(3,Line4);
   
      if(GoldColor)
      {
         SetIndexStyle(0,DRAW_HISTOGRAM,0,3,Yellow);
         SetIndexStyle(1,DRAW_HISTOGRAM,0,3,Orange);
         SetIndexStyle(2,DRAW_HISTOGRAM,0,1,Yellow);
         SetIndexStyle(3,DRAW_HISTOGRAM,0,1,Orange);
      }
      
  DrawLabels(Pref+"Warning!", 0, 250, 1, 
  "Remember NOT to trade here! Ïîìíèòå, ÍÅ òîðãîâàòü çäåñü!", 0, DnColor, 0,  FontSize);   
  
  CountLevel=Close[0]-10*Point;
  DrawText( Pref+"CountLevel", Time[0], CountLevel, "", 69, TextColor, FontSize,0) ;  
      
    
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   Delete_My_Obj( Pref);
   Comment("");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
   if(ArraySize(SymbolsArray)<1) return;
   
   if (per!= Time[0])  // îäèí ðàç â áàð
         {
           per = Time[0];
           MainDraw();
         }
         
    if(CountLevel!=ObjectGet(Pref+"CountLevel",OBJPROP_PRICE1)+10*Point) MainDraw();  //ïðàâèì ïîëîæåíèå   
   
   //íà êàæäîì òèêå òîëüêî íóëåâûå áàðû îáíîâëÿåì, Bars0
     for( int i=0; i<ArraySize(SymbolsArray);i++)//ïî êàæäîìó ñèìâîëó
         {
             if(StringLen(SymbolsArray[i])>6) 
         int per=StrToPeriod(StringSubstr(SymbolsArray[i],6, 0));
            else per=Period();
             
            int B=Bars0[i];
            
            string perStr=PeriodToStr(per);     // our Period, íàø òàéìôðåéì
         string Symb=StringSubstr(SymbolsArray[i],0, 6);// our symbol, íàø èíñòðóìåíò
         double po=MarketInfo(SymbolsArray[i], MODE_POINT);
         
         double razn=CountLevel-iClose(Symb,per ,Bars_-1);//ðàçíèöà öåí 
             
             double 
                  H=iHigh(Symb, per, 0),
                  L=iLow(Symb, per, 0),
                  O=iOpen(Symb, per, 0),
                  C=iClose(Symb, per, 0); 
                  
                  if(StringSubstr(Symb,3, 0)=="JPY")//àäàïòèðóåì éåíó ÏÎÄ ÃÐÀÔÈÊ
                    {
                      H=H/100; L=L/100; O=O/100; C=C/100;
                      razn=CountLevel-iClose(Symb,per ,Bars_-1)/100;
                    }
                     
                  
                 // Comment("*"+iClose(Symb, per, j)+"*");
                  
            if(C>O)
            {
               Line1[B]=C+razn; Line2[B]=O+razn;
               Line3[B]=H+razn; Line4[B]=L+razn; 
            }
            else
            if(C<O)
            {
               Line1[B]=C+razn; Line2[B]=O+razn;
               Line3[B]=L+razn; Line4[B]=H+razn; 
            }
            else
            if(C==O)
            {
               Line1[B]=O+razn; Line2[B]=C+0.01*po+razn;
               Line3[B]=L+razn; Line4[B]=H+razn; 
            }
            
         string LName=Pref+"Tx "+Symb+" "+perStr;
        double c=iClose(Symb, per, 0), o=iOpen(Symb, per, 0);
        if(c>o) color pColor=UpColor; else pColor=DnColor;//öâåò öåíîâûõ ìåòîê
           
     /// LABEL
     string Text=DoubleToStr(c, Digits);
     DrawText( LName+"_3", Time[BarsTx[i]], WindowPriceMin()+(TextY-2*TextYStep)*Point, Text, 0, pColor, FontSize,0) ; 
         }
   
   
   
}
int MainDraw()
  {
//----
    if(ArraySize(SymbolsArray)<1) return;


      int B=ArraySize(SymbolsArray)*(Bars_+1+ChartsGap)-1;
       
      CountLevel=ObjectGet(Pref+"CountLevel",OBJPROP_PRICE1)+10*Point;
      
   ArrayInitialize( Line1, EMPTY_VALUE);// ñòèðàåì ãðàôèê
   ArrayInitialize( Line2, EMPTY_VALUE);
   ArrayInitialize( Line3, EMPTY_VALUE);
   ArrayInitialize( Line4, EMPTY_VALUE);

      for( int i=0; i<ArraySize(SymbolsArray);i++)//ïî êàæäîìó ñèìâîëó
         {
         // ñïåðâà èçâëåêàåì èíñòðóìåíò è ïåðèîä èç ñòðî÷êè
         if(StringLen(SymbolsArray[i])>6) 
         int per=StrToPeriod(StringSubstr(SymbolsArray[i],6, 0));
            else per=Period(); 
            
            string perStr=PeriodToStr(per);     // our Period, íàø òàéìôðåéì
         string Symb=StringSubstr(SymbolsArray[i],0, 6);// our symbol, íàø èíñòðóìåíò
         double po=MarketInfo(SymbolsArray[i], MODE_POINT);
           
                 //if(Symb!=Symbol())
                  double razn=CountLevel-iClose(Symb,per ,Bars_-1);//ðàçíèöà öåí äëÿ âûðàâíèâàíèÿ â îêíå
                 // else razn=0;
                  
                  string LName=Pref+"VL "+Symb+" "+perStr; //ñîçäàåì ëèáî ïåðåäâèãàåì ïîëîñêè
                  if(ObjectFind(LName)<0) ObjectCreate( LName,OBJ_VLINE,0,Time[B],0);
                  ObjectSet( LName, OBJPROP_TIME1 , Time[B]);            
                  ObjectSet( LName, OBJPROP_COLOR , VertLineColor);
                  ObjectSet( LName, OBJPROP_WIDTH , VertLineWidth);
                  ObjectSet( LName, OBJPROP_BACK, True);
                  if(VertLineWidth<2)
                  ObjectSet( LName, OBJPROP_STYLE , VertLineStyle);
                 // ObjectSetText( LName, DoubleToStr(TM,0));
                 
           //ñîçäàåì, ïåðåäâèãàåì òåêñò
           LName=Pref+"Tx "+Symb+" "+perStr;
        double c=iClose(Symb, per, 0), o=iOpen(Symb, per, 0);
        if(c>o) color pColor=UpColor; else pColor=DnColor;//öâåò öåíîâûõ ìåòîê
           
     /// LABELS
     string Text=DoubleToStr(c, Digits);
     DrawText( LName+"_1", Time[B-6], WindowPriceMin()+TextY*Point, Symb, 0, TextColor, FontSize,0) ; 
     DrawText( LName+"_2", Time[B-4], WindowPriceMin()+(TextY-TextYStep)*Point, perStr, 0, TextColor, FontSize,0) ;
     DrawText( LName+"_3", Time[B-5], WindowPriceMin()+(TextY-2*TextYStep)*Point, Text, 0, pColor, FontSize,0) ; 
               BarsTx[i]=B-5;
     //DrawText( LName+"_4", Time[B-5], WindowPriceMin()+(TextY-3*TextYStep)*Point, NewText, 0, pColor, FontSize,0) ;
     //DrawText( LName+"_5", Time[B-5], WindowPriceMin()+(TextY-4*TextYStep)*Point, NewText, 0, pColor, FontSize,0) ;
                             
                             B--; // ñëåäóþùèé ïîñëå ëèíèè áàð...
         
         for(int j=Bars_-1; j>=0;j--)//ïî êàæäîìó áàðó
             {                
                  if(j==0)Bars0[i]=B;//çàïîìíèëè "íóëåâîé áàð" äëÿ ýòîãî ñèìâîëà
                  
                  double // çíà÷åíèÿ ñâå÷êè
                  H=iHigh(Symb, per, j),
                  L=iLow(Symb, per, j),
                  O=iOpen(Symb, per, j),
                  C=iClose(Symb, per, j); 
                  
                  if(StringSubstr(Symb,3, 0)=="JPY")//åñëè èåíà, àäàïòèðóåì éåíó ÏÎÄ ÃÐÀÔÈÊ
                    {
                      H=H/100; L=L/100; O=O/100; C=C/100;
                      razn=CountLevel-iClose(Symb,per ,Bars_-1)/100;
                    }
                     
                  
               /// ÀËÈËÓß!ðèñóåì ãðàôèê...
                  
            if(C>O)
            {
               Line1[B]=C+razn; Line2[B]=O+razn;
               Line3[B]=H+razn; Line4[B]=L+razn; 
            }
            else
            if(C<O)
            {
               Line1[B]=C+razn; Line2[B]=O+razn;
               Line3[B]=L+razn; Line4[B]=H+razn; 
            }
            else
            if(C==O)
            {
               Line1[B]=O+razn; Line2[B]=C+0.01*po+razn;
               Line3[B]=L+razn; Line4[B]=H+razn; 
            }
                           
                        
             B--;  ///   ñëåäóþùèé áàð...     
           }//ïî êàæäîìó áàðó
           
           B=B-ChartsGap; //îòñòóï ìåæäó ÷àðòàìè

      }//ïî êàæäîìó ñèìâîëó

//----
   return(0);
  }
//+------------------------------------------------------------------+

//çàïîëíÿåì ìàññèâ èíñòðóìåíòîâ
int FillSymbolsArray()
{
   string str=Instruments, delim=" ";
   
   str=StringTrimRight( str) ;
       str=StringTrimLeft( str) ;
       
   while( StringFind( str, "  ")>-1 && StringLen(str)>0)
        str=StringReplace(str, "  ", " ");
       while( StringFind( str, "\t")>-1 && StringLen(str)>0)
        str=StringReplace(str, "\t", " ");
       
       str=str+" ";
       ArrayResize( SymbolsArray, 0) ;
        
     while( StringLen(str)>0)
      {
         int pos=StringFind(str, delim);
         string sy=StringSubstr(str, 0, pos);
         str=StringSubstr(str, pos+1);/// îòñåêëè 
         
            if(StringSubstr(sy, 0,1)=="-") continue;
            
         int Size=ArraySize(SymbolsArray);
         ArrayResize( SymbolsArray, Size+1) ;
         SymbolsArray[Size]=sy;
      } 
      
      return(ArraySize(SymbolsArray));  
}
//-------
string StringReplace(string text, string oldstr, string newstr)
{
  int pos=StringFind(text, oldstr);
  if(pos>-1)
   { 
      string str=StringSubstr(text, 0, pos)+newstr+StringSubstr(text, pos+StringLen(oldstr));
      return(str);
   }
   return(text);
}
//----------------
int StrToPeriod(string str)
{
     if(str=="M1" || str=="1" )return(1);
     if(str=="M5" || str=="5")return(5);
     if(str=="M15" || str=="15")return(15);
     if(str=="M30" || str=="30")return(30);
     if(str=="H1" || str=="60")return(60);
     if(str=="H4" || str=="240")return(240);
     if(str=="D1" || str=="1440")return(1440);
     if(str=="W1" || str=="10080")return(10080);
     if(str=="ÌN" || str=="43200")return(43200);
     
        return(Period());
}
string PeriodToStr(int Per)
   {
      switch(Per)                 // Ðàñ÷¸ò êîýôôèöèåíòîâ äëÿ..     
      {                              // .. ðàçëè÷íûõ ÒÔ      
      case     1: return("M1");  // Òàéìôðåéì Ì1      
      case     5: return("M5");  // Òàéìôðåéì Ì5      
      case    15: return("M15");  // Òàéìôðåéì Ì15      
      case    30: return("M30");  // Òàéìôðåéì Ì30      
      case    60: return("H1");  // Òàéìôðåéì H1      
      case   240: return("H4");  // Òàéìôðåéì H4      
      case  1440: return("D1");  // Òàéìôðåéì D1      
      case 10080: return("W1");  // Òàéìôðåéì W1      
      case 43200: return("ÌN");  // Òàéìôðåéì ÌN     
      }
   }
///=======================
void Delete_My_Obj(string Prefix)
   {
   for(int k=ObjectsTotal()-1; k>=0; k--)  // Ïî êîëè÷åñòâó âñåõ îáúåêòîâ 
     {
      string Obj_Name=ObjectName(k);   // Çàïðàøèâàåì èìÿ îáúåêòà
      string Head=StringSubstr(Obj_Name,0,StringLen(Prefix));// Èçâëåêàåì ïåðâûå ñèì

      if (Head==Prefix)// Íàéäåí îáúåêò, ..
         {
         ObjectDelete(Obj_Name);
         }                
        
     }
   }
//----------------------------------
int DrawText( string name, datetime T, double P, string Text, int code=0, color Clr=Green,  int Fsize=10, int Win=0)
   { 
      if (name=="") name="Text_"+T;
      
      int Error=ObjectFind(name);// Çàïðîñ 
   if (Error!=Win)// Åñëè îáúåêòà â óê. îêíå íåò :(
    { 
      ObjectCreate(name, OBJ_TEXT, Win, T, P);
      }
      
      ObjectSet(name, OBJPROP_TIME1, T);
      ObjectSet(name, OBJPROP_PRICE1, P);
      if(code==0)
      ObjectSetText(name, Text ,Fsize,"Arial",Clr);
      else
      ObjectSetText(name, CharToStr(code), Fsize,"Wingdings",Clr);
   }
///================================
int DrawLabels(string name, int corn, int X, int Y, string Text, int code=0, color Clr=Green, int Win=0, int FSize=10)
   {
     int Error=ObjectFind(name);// Çàïðîñ 
   if (Error!=Win)// Åñëè îáúåêòà â óê. îêíå íåò :(
    {  
      ObjectCreate(name,OBJ_LABEL,Win, 0,0); // Ñîçäàíèå îáúåêòà
    }
     
     ObjectSet(name, OBJPROP_CORNER, corn);     // Ïðèâÿçêà ê óãëó   
     ObjectSet(name, OBJPROP_XDISTANCE, X);  // Êîîðäèíàòà Õ   
     ObjectSet(name,OBJPROP_YDISTANCE,Y);// Êîîðäèíàòà Y   
     ObjectSetText(name,Text,FSize,"Arial",Clr);
          if(code==0)
      ObjectSetText(name, Text ,FSize,"Arial",Clr);
      else
      ObjectSetText(name, CharToStr(code), FSize,"Wingdings",Clr);
   }
///================================

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