SuperMultiChart

Author: Denis Orlov
11 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