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