//+------------------------------------------------------------------+
//| SultonovPrediction.mq4 |
//| Copyright © 2011, Þñóôõîäæà Ñóëòîíîâ |
//| Realisation : Goshkov Vladyslav 2011. 4vg AT mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, Þñóôõîäæà Ñóëòîíîâ"
#property link ""
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_width1 2
#property indicator_color2 Red
#property indicator_width2 2
double UpSig[];
double DnSig[];
#include <stdlib.mqh>
#include <stderror.mqh>
extern string prf = "ivgfSP#";
extern string s003 = "Òèï öåíû äëÿ èíäèêàòîðà";
extern string s004 = "Ñîîòâåòñòâóåò ñòàíäàðòíûì îáîçíà÷åíèÿì ÌÒ";
extern string s005 = "Ïî óìîë÷àíèþ Open. ";
extern int IndPRC_TYPE = PRICE_OPEN;
#define MXSIZE_KYPC 551
#define MXSIZE_P 801
extern string s00 = "Êîëè÷åñòâî áàðîâ èñòîðèè äëÿ ïðîãíîçà";
extern string s01 = "MAX = 550";
extern int HistoryBarsCount = 30;
extern string s02 = "+----------------------------+";
extern string s03 = "Íîìåð áàðà, ïî òåêóøåé íóìåðàöèè áàðîâ,";
extern string s04 = "äëÿ êîòîðîãî äåëàåòñÿ ïðîãíîç";
extern int FROM = 0;
extern string s10 = "+============================+";
extern string s11 = "Êîëè÷åñòâî áàðîâ äëÿ ïðîãíîçà";
extern string s12 = "Ñóììà Áàðîâ èñòîðèè è ïðîãíîçèðóåìûõ áàðîâ";
extern string s13 = "Íå äîëæíà ïðåâûøàòü 800";
extern int PredictionBarsCount = 30;
extern int RetrospektivaBarsCount = 500;
int Shft = 12;
int SIZE_KYPC = 20;
int SIZE_P = 60;
#define KYPC_DIGITS 6
double KYPC[MXSIZE_KYPC];/* = {1.3635, 1.3630, 1.3625, 1.3620, 1.3615,
1.3612, 1.3610, 1.3608, 1.3606, 1.3602,
1.3603
};
*/
double P1[MXSIZE_P],P2[MXSIZE_P],P3[MXSIZE_P];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(2);
SetIndexBuffer(0,UpSig); SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,233); //SetIndexEmptyValue(0,0);
SetIndexBuffer(1,DnSig); SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,234); //SetIndexEmptyValue(1,0);
//---- indicators
SIZE_KYPC = HistoryBarsCount;
SIZE_P = SIZE_KYPC + PredictionBarsCount;
//----
return(0);
}
/// Óäàëåíèå âñåõ îáúåêòîâ ñ ïðåôèêñîì prefix
int deleteObjectsByPrefix(string prefix, bool onlyPrefix = true)
{
int obj_total = ObjectsTotal();
string name="";
int err = GetLastError();
int Delcount = 0;
int Objcount = 0;
for (int i = obj_total - 1; i >= 0; i--)
{
name = ObjectName(i);
bool condition = false;
if(onlyPrefix)
condition = (StringFind(name, prefix,0) == 0);
else
condition = (StringFind(name, prefix) != -1);
if (condition)
{
Objcount++;
if(ObjectDelete(name))Delcount++;
else
{
err = GetLastError();
Print("Error(",err,") ",ErrorDescription(err));
}
}
}
return(Delcount-Objcount);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
deleteObjectsByPrefix(prf);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
/*
double GAMMADIST(double X, double Alfa, double betta, bool IsIntegral)
{
if(betta==1)
return(StdGAMMADIST());
if(IsIntegral)
return();
}
int P1Prediction(double Prc[])
{
int rez = 0;
int PrcCnt = ArraySize(Prc);
return(rez);
}
int P2Prediction(double Prc[])
{
int rez = 0;
int PrcCnt = ArraySize(Prc);
return(rez);
}
int P3Prediction(double Prc[])
{
int rez = 0;
int PrcCnt = ArraySize(Prc);
return(rez);
}
int SultonovPrediction(double Prc[])
{
int res = P1Prediction(Prc)+P2Prediction(Prc)+P3Prediction(Prc);
if(MathAbs(res)==3)
return(res);
return(0);
}
*/
int SultonovPrediction(int NP, double &P1[], double &P2[], double &P3[], int NK, double K[])
{
int i=0;
int SzK = NK;
//ArraySize(K);
//Print("SzK = ",SzK );
double tt[];
ArrayResize(tt,NP);
double tr[];
ArrayResize(tr,NP);
for(i=0;i<NP;i++)
{
tt[i] = i;
tr[i] = i;
}
double SumK = 0.0;
for(i=0;i<SzK;i++)
{
SumK = SumK + K[i];
}
double SumJ = 0.0;
for(i=0;i<SzK;i++)
{
SumJ = SumJ + tt[i];
}
double k = -0.5+ MathSqrt(0.25+2.0*SumJ);//-0,5+(0,25+2*SUM(J$1:J$1048576))^0,5
//Print("SumJ = ",SumJ," k = ",k );
/*
for(i=0;i<SzK;i++)
{
Print("K[",i,"] = ",DoubleToStr(K[i],KYPC_DIGITS) );
}
*/
double Cy[]; // dK = K[i+1]-K[i];
ArrayResize(Cy,NP);
Cy[0] = 0.0;
for(i=1;i<SzK;i++)
{
Cy[i] = K[i]-K[i-1];
}
for(;i<NP;i++)
{
Cy[i] = 0;
}
/*
for(i=1;i<SzK;i++)
{
Print("Cy[",i,"] = ",DoubleToStr(Cy[i],KYPC_DIGITS) );
}
*/
double xy[]; //tt[i]*Cy[i]
ArrayResize(xy,SzK);
for(i=1;i<SzK;i++)
{
xy[i] = tt[i]*Cy[i];
}
/*
for(i=1;i<SzK;i++)
{
Print("xy[",i,"] = ",DoubleToStr(xy[i],KYPC_DIGITS) );
}
*/
double SumA = 0.0;
for(i=0;i<SzK;i++)
{
SumA = SumA + xy[i];
}
//Print("SumA = ",SumA );
double SumM = 0.0;
for(i=0;i<SzK;i++)
{
SumM = SumM + Cy[i];
}
//Print("SumM = ",SumM );
//(H2*SUM(A$1:A$1048576)-SUM(J$1:J$1048576)*SUM(M$1:M$1048576))/((H2*(H3*(H3+1)*(2*H3+1)/6)-SUM(J$1:J$1048576)^2))
//(H2*SUM(A$1:A$1048576)-SUM(J$1:J$1048576)*SUM(M$1:M$1048576))
//((H2*(H3*(H3+1)*(2*H3+1)/6)-SUM(J$1:J$1048576)^2))
double derr = 0.00000001;
double b1 = (k*SumA-SumJ*SumM);
double b2 = (k*(k*(k+1)*(2*k+1)/6.)-SumJ*SumJ);
if(MathAbs(b2)<=derr)
{
if(b2>=0) b2 = derr;
if(b2< 0) b2 = -derr;
}
double b = b1/b2;
//Print("b = ",DoubleToStr(b,10) );
//(SUM(M$1:M$1048576)*(H3*(H3+1)*(2*H3+1)/6)-SUM(J$1:J$1048576)*SUM(A$1:A$1048576))/(H2*(H3*(H3+1)*(2*H3+1)/6)-SUM(J$1:J$1048576)^2)+B2*I2
double k1Yr2 = (k*(k*(k+1)*(2*k+1)/6.)-SumJ*SumJ);
if(MathAbs(k1Yr2)<=derr)
{
if(k1Yr2>=0)k1Yr2 = derr;
if(k1Yr2< 0)k1Yr2 = -derr;
}
double k1Yr = (SumM*(k*(k+1)*(2*k+1)/6.)-SumJ*SumA)/k1Yr2;
//Print("k1Yr = ",DoubleToStr(k1Yr,10) );
double Yr[];
ArrayResize(Yr,NP);
for(i=0;i<NP;i++)
{
Yr[i] = k1Yr + b*tr[i];
}
/*
for(i=0;i<NP;i++)
{
Print("Yr[",i,"] = ",DoubleToStr(Yr[i],14) );
}
*/
int Trend1[], Trend2[],Trend3[];
ArrayResize(Trend1,NP);
ArrayResize(Trend2,NP);
ArrayResize(Trend3,NP);
for(i=0;i<NP;i++)
{
if(SumA>0)
Trend1[i] = 1;
else
{
if(SumA<0)
Trend1[i] = -1;
else
Trend1[i] = 0;
}
if(b>0)
Trend2[i] = 1;
else
{
if(b<0)
Trend2[i] = -1;
else
Trend2[i] = 0;
}
if(Yr[i]>0)
Trend3[i] = 1;
else
{
if(Yr[i]<0)
Trend3[i] = -1;
else
Trend3[i] = 0;
}
}
/*
for(i=0;i<NP;i++)
{
Print("TYrends[",i,"] => ", Trend1[i], " ", Trend2[i], " ", Trend3[i]);
}
*/
//IF(J3>0;IF(K3-K2<0;LN(-(K3-K2)/(J3+J2)*2);LN((K3-K2)/(J3+J2)*2))*IF(J3=0;0;1);0)
double LnC_t[];
ArrayResize(LnC_t,NP);
LnC_t[0] = 0;
for(i=1;i<SzK;i++)
{
double dtt = (tt[i]+tt[i-1]);
if(MathAbs(dtt)<derr)
{
if(dtt>=0) dtt = derr;
if(dtt< 0) dtt = -derr;
}
if(tt[i]>0)
{
if( Cy[i]<0 )
{
LnC_t[i] = MathLog(-Cy[i]/(dtt*2.));//(tt[i]+tt[i-1])*2);
}
else
{
if( Cy[i]>0 )
{
LnC_t[i] = MathLog(Cy[i]/(dtt*2.));//(tt[i]+tt[i-1])*2);
}
else
LnC_t[i] = 0;
}
}
else LnC_t[i] = 0;
}
/*
for(i=0;i<SzK;i++)
{
Print("LnC_t[",i,"] => ", LnC_t[i]);
}
*/
//IF(J3>0;(J3+J2)/2*N3;0)
double tLnC_t[];
ArrayResize(tLnC_t,SzK);
tLnC_t[0] = 0;
for(i=1;i<SzK;i++)
{
if(tt[i]>0)
{
tLnC_t[i] = (tt[i]+tt[i-1])/2.*LnC_t[i];
}
else tLnC_t[i] = 0;
}
/*
for(i=0;i<SzK;i++)
{
Print("tLnC_t[",i,"] => ", tLnC_t[i]);
}
*/
double SumN = 0.0;
for(i=0;i<SzK;i++)
{
SumN = SumN + LnC_t[i];
}
double SumO = 0.0;
for(i=0;i<SzK;i++)
{
SumO = SumO + tLnC_t[i];
}
//Print("SumN = ",SumN," SumO = ",SumO );
//(H3*(H3*(H3+1)*(2*H3+1)/6-(H3/2+0,25)*H3)-(H3*(H3+1)/2-H3/2)^2)/((H3*(H3+1)/2-H3/2)*SUM(N$1:N$1048576)-H3*SUM(O$1:O$1048576))
double T2 = ((k*(k+1)/2.-k/2.)*SumN-k*SumO);
if(MathAbs(T2)<=derr)
{
if(T2>=0) T2 = derr;
if(T2< 0) T2 = -derr;
}
double T = (k*(k*(k+1)*(2*k+1)/6.-(k/2.+0.25)*k)-(k*(k+1)/2.-k/2)*(k*(k+1)/2.-k/2))/T2;
if(MathAbs(T)<=derr)
{
if(T>=0) T = derr;
if(T< 0) T = -derr;
}
//Print("T = ",T );
//P3^2/EXP((SUM(N$1:N$1048576)*(H3*(H3+1)*(2*H3+1)/6-(H3/2+0,25)*H3)-(H3*(H3+1)/2-H3/2)*SUM(O$1:O$1048576))/(H3*(H3*(H3+1)*(2*H3+1)/6-(H3/2+0,25)*H3)-(H3*(H3+1)/2-H3/2)^2))
double D2 = (k*(k*(k+1)*(2*k+1)/6.-(k/2.+0.25)*k)-(k*(k+1)/2.-k/2)*(k*(k+1)/2.-k/2)) ;//);
if(MathAbs(D2)<=derr)
{
if(D2>=0) D2 = derr;
if(D2< 0) D2 = -derr;
}
double D = (T*T)/MathExp( (SumN*(k*(k+1)*(2*k+1)/6.-(k/2.+0.25)*k)-(k*(k+1)/2.-k/2.)*SumO)/D2 );
//Print("D = ",D );
double P0 = K[0]+0.00000001;//(K2+0,00000001)*IF(K3=0;0;1)
if( K[1]==0 ) P0=0.0;
// IF(E3>0;1;-1)*(1-(1+I3/P3)*EXP(-I3/P3))*Q3
double PrE[];
ArrayResize(PrE,SzK);
PrE[0] = 0;
for(i=1;i<SzK;i++)
{
PrE[i] = Trend1[i]*(1-(1+tr[i]/T)*MathExp(-tr[i]/T))*D;
}
/*
for(i=0;i<SzK;i++)
{
Print("PrE[",i,"] => ", PrE[i]);
}
*/
double SumT = 0.0;
for(i=0;i<SzK;i++)
{
SumT = SumT + PrE[i];
}
if(MathAbs(SumT)<=derr)
{
if(SumT>=0) SumT = derr;
if(SumT< 0) SumT = -derr;
}
//Print("SumT = ",SumT );
//ABS((SUM(K$1:K$1048576)-(H3+1)*L3)/SUM(S$1:S$1048576))*P3^2/EXP((SUM(N$1:N$1048576)*(H3*(H3+1)*(2*H3+1)/6-(H3/2+0,25)*H3)-(H3*(H3+1)/2-H3/2)*SUM(O$1:O$1048576))/(H3*(H2*(H2+1)*(2*H2+1)/6-(H2/2+0,25)*H2)-(H3*(H3+1)/2-H3/2)^2))
double DCorr = MathAbs((SumK-(k+1)*P0)/SumT)*(T*T)/MathExp((SumN*(k*(k+1)*(2*k+1)/6.-(k/2.+0.25)*k)-(k*(k+1)/2.-k/2)*SumO)/(k*(k*(k+1)*(2*k+1)/6.-(k/2.+0.25)*k)-(k*(k+1)/2.-k/2.)*(k*(k+1)/2.-k/2.)));//
//Print("DCorr = ",DCorr );
//(SUM(K$1:K$1048576)-L2-ABS((SUM(K$1:K$1048576)-(H3+1)*L3))*IF(E3<0;-1;1))/H3+(1-(1+I3/P3)*EXP(-I3/P3))*R3*IF(E3<0;-1;1)
P1[0] = K[0];
for(i=1;i<NP;i++)
{
P1[i] = (SumK-P0-MathAbs((SumK-(k+1)*P0))*Trend1[i])/k+(1-(1+tr[i]/T)*MathExp(-tr[i]/T))*DCorr*Trend1[i];
}
//(SUM(K$1:K$1048576)-L2-ABS((SUM(K$1:K$1048576)-(H3+1)*L3))*IF(F3<0;-1;1))/H3+(1-(1+I3/P3)*EXP(-I3/P3))*R3*IF(F3<0;-1;1)
P2[0] = K[0];
for(i=1;i<NP;i++)
{
P2[i] = (SumK-P0-MathAbs((SumK-(k+1)*P0))*Trend2[i])/k+(1-(1+tr[i]/T)*MathExp(-tr[i]/T))*DCorr*Trend2[i];
}
//(SUM(K$1:K$1048576)-L2-ABS((SUM(K$1:K$1048576)-(H3+1)*L3))*IF(G3<0;-1;1))/H3+(1-(1+I3/P3)*EXP(-I3/P3))*R3*IF(G3<0;-1;1)
P3[0] = K[0];
for(i=1;i<NP;i++)
{
P3[i] = (SumK-P0-MathAbs((SumK-(k+1)*P0))*Trend3[i])/k+(1-(1+tr[i]/T)*MathExp(-tr[i]/T))*DCorr*Trend3[i];
}
/*
for(i=0;i<NP;i++)
{
Print("P1[",i,"] => ", DoubleToStr(P1[i],8)," P2[",i,"] => ", DoubleToStr(P2[i],8)," P3[",i,"] => ", DoubleToStr(P3[i],8) );
}
*/
int CurBarNumber = NK-1;
int rez = Trend1[CurBarNumber]+Trend2[CurBarNumber]+Trend3[CurBarNumber];
//>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
ArrayResize(PrE ,0);
ArrayResize(tLnC_t,0);
ArrayResize(LnC_t ,0);
ArrayResize(Trend3,0);
ArrayResize(Trend2,0);
ArrayResize(Trend1,0);
ArrayResize(Yr,0);
ArrayResize(xy,0);
ArrayResize(Cy,0);
ArrayResize(tr,0);
ArrayResize(tt,0);
if(MathAbs(rez)==3)
return(rez);
return(0);
}//int SultonovPrediction(double &P1[], double &P2[], double &P3[], int N, double K[])
bool IsNewChartTFBar()
{
static int nB=-1,nT=-1,nP=-1;
if((nB==Bars)&&(nT==Time[0])&&(nP==Period())) return(false);
nB = Bars;
nT = Time[0];
nP = Period();
return(true);
}//IsNewChartTFBar()
datetime GetTimeByBarNumber(string SMBL, int periodInMin, int barNumber )
{
if (periodInMin == 0)
periodInMin = Period();
if (barNumber >= 0)
return(iTime(SMBL, periodInMin, barNumber));
else
return(iTime(SMBL, periodInMin, 0) - barNumber*periodInMin*60);
}
string GetDateByBarTime(datetime bTm)
{
return(
StringConcatenate(
"Y:",TimeYear(bTm)," M:",TimeMonth(bTm)," D:",TimeDay(bTm)," H:",TimeHour(bTm)," Min:",TimeMinute(bTm)," Sec:",TimeSeconds(bTm)
)
);
}
double mtGetPriceByType(int pType, int i=0 )
{
double prc=-1;
switch(pType)
{
case PRICE_CLOSE : prc= Close[i]; break;//0
case PRICE_OPEN : prc= Open[i]; break;//1
case PRICE_HIGH : prc= High[i]; break;//2
case PRICE_LOW : prc= Low[i]; break;//3
case PRICE_MEDIAN : prc= (High[i]+Low[i])*0.5; break;//4
case PRICE_TYPICAL : prc= (High[i]+Low[i]+Close[i])/3; break;//5
case PRICE_WEIGHTED : prc= (High[i]+Low[i]+Close[i]+Close[i])*0.25; break;//6
default : prc= Close[i]; break;//0
}
return(prc);
}//double mtGetPriceByType(int pType, int i=0 )
int CheckSltPrdSignal(int &rezTrend, int _NP, double &_P1[], double &_P2[], double &_P3[], double _K[], int PRC_TYPE=PRICE_OPEN, int BarsCnt=30, int _from=0, bool draw = true)
{
int from = _from;
if(PRC_TYPE!=PRICE_OPEN)
{
if(from<=0) from=1;
}
int j = from;
int i = 0;
int _NK = BarsCnt;
double point001 = 0.001*Point;
if(BarsCnt>=MXSIZE_KYPC) return(- 1);
if(_NP>=MXSIZE_P) return(-10);
for(i=_NK-1;i>=0;i--,j++)
{
KYPC[i] = mtGetPriceByType(PRC_TYPE,j);//Open[j];//
//Print("KYPC[",i,"] = ",KYPC[i]);
}
for(i=_NK-1;i>=0;i--)
{
for(j=i;j>=0;j--)
if(MathAbs(KYPC[i]-KYPC[j])<point001)KYPC[j]=KYPC[j]+point001;
//Print("KYPC[",i,"] = ",KYPC[i]);
}
//Print("Call SP() !");
rezTrend = SultonovPrediction(_NP, _P1, _P2, _P3, _NK, KYPC);
//Print("Call SP() Ok!");
int j0=1, j1=2;
int i0=1, i1=2;
//Print("SIZE_P = ", SIZE_P," SIZE_KYPC = ",SIZE_KYPC );
/*
for(int id=_NP-1; id>=0;id--)
{
Print("P1[",id,"] = ", P1[id]," P2[",id,"] = ", P2[id]," P3[",id,"] = ", P3[id]);
}
*/
if(!draw)
return(0);
j0 = _NK-i0;
j1 = _NK-i1;
for(;i1<_NP;i0++,i1++,j0--,j1--)
{
datetime Point1Time = GetTimeByBarNumber(Symbol(), Period(), j0+from ), Point2Time = GetTimeByBarNumber(Symbol(), Period(), j1+from );
//double Point1Price = P1[i0], Point2Price = P1[i1];
string LnNm = prf+i0;
//Print(LnNm," Point1Time = ",GetDateByBarTime(Point1Time), " Point1Price = ", Point1Price," Point2Time = ",GetDateByBarTime(Point2Time), " Point2Price = ", Point2Price );
draw_line(prf+"#1"+"#"+from+"#"+HistoryBarsCount+"#"+i0, Point1Time, P3[i0], Point2Time, P3[i1], Yellow, DRAW_LINE, 5);
draw_line(prf+"#2"+"#"+from+"#"+HistoryBarsCount+"#"+i0, Point1Time, P2[i0], Point2Time, P2[i1], Blue, DRAW_LINE, 3);
draw_line(prf+"#3"+"#"+from+"#"+HistoryBarsCount+"#"+i0, Point1Time, P1[i0], Point2Time, P1[i1], Red, STYLE_DASH, 0);
}
return(0);
}
int start()
{
if(!IsNewChartTFBar()) return(0);
//----
for(int ib=RetrospektivaBarsCount-1;ib>=FROM;ib--)
{
int trend=0;
bool DrawIndi = false;
if(ib==FROM)
DrawIndi = true;
int err = CheckSltPrdSignal(trend, SIZE_P, P1, P2, P3, KYPC, IndPRC_TYPE, SIZE_KYPC, ib, DrawIndi);
UpSig[ib] = 0;
DnSig[ib] = 0;
if(trend==3)
{
UpSig[ib] = Low[ib] - Shft*Point;
}
if(trend==-3)
{
DnSig[ib] = High[ib] + Shft*Point;
}
//Print(ib," trend = ",trend ," UpSig = ",UpSig[ib]," DnSig = ",DnSig[ib] );
}
//Print(" >>>>>>>>>>>>> Culculation Ok ! <<<<<<<<<<<<<<< ");
/*
for( ib=RetrospektivaBarsCount-1;ib>=FROM;ib--)
{
Print("UpSig[",ib,"] = ",UpSig[ib]," DnSig[",ib,"] = ",DnSig[ib] );
}
*/
// ----
return(0);
}
int draw_line(string lnName, int TimeFrom, double PriceFrom, int TimeTo, double PriceTo, color c, int type, int width)
{
int err = GetLastError();
string buff_str = lnName;
err = 0;
if(ObjectFind(buff_str)!=-1) ObjectDelete(buff_str);
if(!ObjectCreate(buff_str, OBJ_TREND, 0, TimeFrom, PriceFrom, TimeTo, PriceTo))
{
err = GetLastError();
Print("Can't create object #", buff_str, "# Error(",err,"):", ErrorDescription(err));
return(err);
}
ObjectSet(buff_str, OBJPROP_RAY , 0 );
ObjectSet(buff_str, OBJPROP_COLOR, c );
ObjectSet(buff_str, OBJPROP_WIDTH, width);
ObjectSet(buff_str, OBJPROP_STYLE, type );
//ObjectMove(buff_str,0,TimeFrom, PriceFrom);
//ObjectMove(buff_str,1,TimeTo, PriceTo);
return(0);
}//
//+------------------------------------------------------------------+
Comments