Author: ������� �.�.
Price Data Components
Series array that contains close prices for each bar
0 Views
0 Downloads
0 Favorites
MI_Spread
//+------------------------------------------------------------------+
//|                                                    MI_Spread.mq4 |
//|                                                     Îðåøêèí À.Â. |
//|                                        http://www.vk.com/mtforex |
//+------------------------------------------------------------------+
#property copyright "Îðåøêèí À.Â."
#property link      "http://www.vk.com/mtforex"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
#property indicator_style1 0
#property indicator_width1 1

extern   string   Pairs1=     "GBPUSD";
extern   string   Pairs2=     "EURUSD";
extern   bool     Invert1=    false;//Èíâåðòèðîâàíèå ïàðû
extern   bool     Invert2=    false;//Èíâåðòèðîâàíèå ïàðû
extern   double   Power1=     1; //âîçâåäåíèå â ñòåïåíü
extern   double   Power2=     1; //âîçâåäåíèå â ñòåïåíü
extern   double   Multi1=     1; //ìíîæèòåëü
extern   double   Multi2=     1; //ìíîæèòåëü
extern   double   Plus1=      0; //ýòî ÷èñëî äîáàâëÿåòñÿ ê öåíå
extern   double   Plus2=      0; //ýòî ÷èñëî äîáàâëÿåòñÿ ê öåíå
extern   int      MA=         0;//Ñãëàæèâàòü èëè íåò äàííûå. 0-íåò, íå 0 - ïåðèîä ñãëàæèâàíèÿ ïî ÌÀ simple
extern   bool     Ln=         true;//ïðèìåíÿòü ëîãàðèôìèðîâàíèå öåíû èëè íåò
extern   string   Action=     "-";

//Àíàëîãè÷íûå äåéñòâèÿ íàä ðåçóëüòàòîì
extern   bool     R_Invert=   false;
extern   double   R_Power=    1; //âîçâåäåíèå â ñòåïåíü
extern   double   R_Multi=    1; //ìíîæèòåëü
extern   double   R_Plus=     0; //ýòî ÷èñëî äîáàâëÿåòñÿ ê öåíå

//Îáùèå íàñòðîéêè

extern   double   MaxLagPercent=3;//Åñëè èçìåíåíèå ìåæäó êëîóçàìè áîëåå óêàçàííîãî % òî ýòî øïèëüêà
                                  //è îíà óäàëÿåòñÿ - áåð¸òüñÿ ñðåäíåå ìåæäó ñîñåäíèìè. 0 - íå èñïîëüçóåòñÿ
extern   int      Only_bars=  14400; //Ñêîëüêî áàðîâ ñ÷èòàòü. 0-áåç îãðàíè÷åíèé.
extern   int      Print_text= 0; //Âûâîä óêàçàííîãî êîëè÷åñòâà ñòðîê íà ýêðàí. Âûâîäèòüñÿ çíà÷åíèÿ èòîãîâîãî ìàññèâà.
                                 //Íóæíî òîëüêî äëÿ ïðîâåðêè ïðàâèëüíîñòè ðàáîòû

int      LastTime=0;//âðåìÿ ñàìîãî ñòàðîãî áàðà íà òåêóùåì ãðàôèêå
         
double   PC[],//ìàññèâ ñïðåäà
         RSm[][4];//0-âðåìÿ,1-öåíà1, 2-öåíà2, 3 (ïîêà íå èñïîëüçóåòñÿ)
         
int init()
  {
   SetIndexBuffer(0,PC);
   string name;
   if (Invert1) name="Inv("+Pairs1+")";else name=Pairs1;   
   if (Multi2!=0)
      {
      name=name+Action;
      if (Invert2) name=name+"Inv("+Pairs2+")";else name=name+Pairs2;   
      }
   if (MA>1) name=name+" MA("+MA+")";
   if (Ln) name=name+" Ln ON";
   if (R_Invert) name=name+" Result Invert";   
   IndicatorShortName(name);
   IndicatorDigits(7);
   //ñèíõðîíèçàöèÿ èñòîðèè
   CALCULATE();
   MINUS_SHPILKI();
   CHANGE_NULL();
   return(0);
  }

int deinit()
  {
   return(0);
  }

int start()
  {
   //ñèíõðîíèçàöèÿ òåêóùèõ êîòèðîâîê
   int LastTime;//Ñàìîå íîâîå âðåìÿ êîòîðîå åñòü â ñèíõðîíèçèðîâàííîì ìàññèâå
   LastTime=RSm[0,0];
   double pr1=0,pr2=0;
   
   while (LastTime<=MathMax(iTime(Pairs1,Period(),0),iTime(Pairs2,Period(),0)))
      {//true;      
      pr1=iClose(Pairs1,Period(),iBarShift(Pairs1,Period(),LastTime,false));
      pr2=iClose(Pairs2,Period(),iBarShift(Pairs2,Period(),LastTime,false));
      
      if (RSm[0,0]!=LastTime)
         {
         ArraySetAsSeries(RSm,true);
         ArrayResize(RSm,ArrayRange(RSm,0)+1);
         ArraySetAsSeries(RSm,false);
         }
         
      RSm[0,0]= LastTime;  
      RSm[0,1]= pr1;
      RSm[0,2]= pr2;
      
      LastTime+=Period()*60;
      }//true;   

      //Âûâîä ðåçóëüòàòîâ
      LastTime=IndicatorCounted();
      if(LastTime>0) LastTime--;
      LastTime=Bars-LastTime;
      for(int i=0; i<LastTime; i++)
         {
         pr1=MODIFY(RSm[i,1],i,1);
         pr2=MODIFY(RSm[i,2],i,2);
         PC[i]=MODIFY(RESULT(pr1,pr2),0,3);
         }  
              
   if (Print_text>0)
      {
      string txt="";
      for (i=0;i<Print_text;i++)
      txt=txt+"\n"+Pairs1+"["+i+",1]= "+DoubleToStr(RSm[i,1],5)+"  "+Pairs2+"["+i+",2]= "+DoubleToStr(RSm[i,2],5)+" Âðåìÿ= "+TimeToStr(RSm[i,0]);
      Comment(txt);   
      }        
   return(0);
  }  

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Ðàñ÷¸ò êîíå÷íîãî ðåçóëüòàòà
double RESULT(double p1, double p2)
   {
   if (Action=="-") return(p1-p2);
   if (Action=="+") return(p1+p2);
   if (Action=="*") return(p1*p2);
   if (p2!=0) if (Action=="/") return(p1/p2);
   if (p2==0) if (Action=="/") return(p1);
   Print(Pairs1,Action,Pairs2,": Ââåäåíî íåïðàâèëüíîå äåéñòâèå. Èñïîëüçîâàíà ðàçíîñòü");
   return(p1-p2);
   }

//íåîáõîäèìûå äåéñòâèÿ íàä öåíîé
double MODIFY(double temp,int count, int N)//N-íîìåð ïàðû
   {
   int i=0; double maprice=0;
   switch (N)
      {
      case 1:
         if (Invert1) temp=1/temp;
         temp=MathPow(temp,Power1)*Multi1+Plus1;
         if (temp!=0)
            {//temp!=0
            if (MA>1)
               {
               maprice=0;
               for (i=0;i<MA;i++) maprice+=RSm[i+count,N];
               temp=maprice/MA;
               }         
            if (Ln) temp=MathLog(temp);
            }//temp!=0
      break;
      case 2:
         if (Invert2) temp=1/temp;
         temp=MathPow(temp,Power2)*Multi2+Plus2;      
         if (temp!=0)
            {//temp!=0         
            if (MA>1)
               {
               maprice=0;
               for (i=0;i<MA;i++) maprice+=RSm[i+count,N];
               temp=maprice/MA;
               }        
            if (temp!=0) if (Ln) temp=MathLog(temp);
            }//temp!=0  
      break; 
      case 3:
         if (R_Invert) temp=1/temp;
         temp=MathPow(temp,R_Power)*R_Multi+R_Plus;     
      break;           
      }
   return(temp);
   }
   
//Ïðîñìàòðèâàåì êîíå÷íûé ìàññèâ è çàìåíÿåì íóëè íà àêòóàëüíûå äàííûå.
void CHANGE_NULL()
   {
   int all=ArrayRange(RSm,0);
   int count;
   for (int i=1;i<=2;i++)//ïåðåáîð îáîèõ öåíîâûõ ðÿäîâ
      {//for i
      count=0;
      for (int j=0;j<all;j++)
         {//for j
         if (RSm[j,i]!=0 && count==0) continue;
         if (RSm[j,i]==0) {count++;continue;}
         if (RSm[j,i]!=0 && count!=0)
            {//if
            for (int k=1;k<=count;k++)
               {//for k
               RSm[j-k,i]=RSm[j,i]-(RSm[j,i]-RSm[j-count-1,i])/(count+1)*k;
               }//for k
            count=0;   
            }//if 
         }//for j
      }//for i
   }

//Óäàëÿåì øïèëüêè èç êîòèðîâîê
//Ñ÷èòàåòñÿ îòíîøåíèå òåêóùåé öåíû çàêðûòèÿ ê ïðåäûäóùåé. Åñëè â % ðàçíèöà áîëåå MaxLagPercent òî âìåñòî òåêóùåãî êëîóçà
//ñòàâèòñÿ ïðåäûäóùèé
void MINUS_SHPILKI()
   {
   if (MaxLagPercent==0) return;
   string para="";
   for (int j=1;j<=2;j++)
      {//for j
      if (j==1) para=Pairs1;else para=Pairs2;
      
      for (int i=ArrayRange(RSm,0)-1;i>0;i--)
      if (RSm[i,j]!=0 && RSm[i-1,j]!=0)
      if (MathAbs((RSm[i-1,j]/RSm[i,j]-1)*100)>=MaxLagPercent)
         {//for i
         Print("Óáðàíà øïèëüêà íà ïàðå ",para,". Âðåìÿ: ",TimeToStr(RSm[i-1,0]));
         RSm[i-1,j]=RSm[i,j];
         }//for i      
      }//for j
   }

//Ïîëó÷åíèå èñõîäíûõ äàííûõ è çàïîëíåíèå êîíå÷íîãî ìàññèâà. Âìåñòî ïðîïóñêà âñòàâÿòüñÿ 0. Âñå äàííûå ñèíõðîíèçèðîâàííû ïî âðåìåíè
void CALCULATE()
   {
   //Ìàññèâû èñõîäíûõ äàííûõ ïî îáîèì âûáðàííûì ïàðàì
   double   Sm1Rates[][6],Sm2Rates[][6];   
   int      Sm1All=ArrayCopyRates(Sm1Rates,Pairs1,Period());
   int      Sm2All=ArrayCopyRates(Sm2Rates,Pairs2,Period());

   //èíäåêñû ìàñèâîâ. Äëÿ êàæäîãî ñâîè. Èçíà÷àëüíî äàííûå áåðóòüñÿ íà÷èíàÿ ñ ýëåìåíòà 1, òàê êàê òåêóùèé
   //âñ¸ ðàâíî áóäåò ïåðåñ÷èòàí è åñëè ïîêà èä¸ò ïîäñ÷¸ò ïîÿâèòüñÿ íîâàÿ ñâå÷êà ÷òîáû îíà áûëà êîððåêòíî ïîçæå îáùèòàíà
   int      ism1=1,ism2=1,irsm=0;
   
   //Îáíóëÿåì íà âñÿêèé ïîæàðíûé èòîãîâûé ìàññèâ
   ArrayResize(RSm,0);
   
   while(true)
      {//for
      if (Only_bars==0)
         {
         if (ism1>=Sm1All) break;
         if (ism2>=Sm2All) break;         
         }
      else if (MathMin(ism1,ism2)>=MathMin(MathMin(Sm1All,Sm2All),Only_bars)) break;

      ArrayResize(RSm,irsm+1);   
      if (Sm1Rates[ism1,0]==Sm2Rates[ism2,0])
         {//if ==
         RSm[irsm,0]=Sm1Rates[ism1,0];
         RSm[irsm,1]=Sm1Rates[ism1,4];
         RSm[irsm,2]=Sm2Rates[ism2,4];
         ism1++;ism2++;irsm++;
         continue;
         }//if ==
      if (Sm1Rates[ism1,0]>Sm2Rates[ism2,0])
         {//>
         RSm[irsm,0]=Sm1Rates[ism1,0];
         RSm[irsm,1]=Sm1Rates[ism1,4];
         RSm[irsm,2]=0;
         ism1++;irsm++;
         continue;         
         }//>
      if (Sm1Rates[ism1,0]<Sm2Rates[ism2,0])
         {//<         
         RSm[irsm,0]=Sm2Rates[ism2,0];
         RSm[irsm,1]=0;
         RSm[irsm,2]=Sm2Rates[ism2,4];
         ism2++;irsm++;
         }//<
      }//for
   }

Comments