Price Data Components
Miscellaneous
0
Views
0
Downloads
0
Favorites
IND_Recycle2
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_width1 2
#property indicator_color2 Blue
#property indicator_width2 1
#property indicator_color3 Blue
#property indicator_width3 1
#define MAX_AMOUNTSYMBOLS 15
#define MAX_POINTS 100000
extern string SymbolsStr = "EURUSD, GBPUSD, USDCHF, USDJPY, AUDUSD, USDCAD, NZDUSD, GOLD";
extern bool SymbolKoef = FALSE;
extern bool Correlation = FALSE;
extern int Depth = 288;
extern int Method = 4;
extern int Height = 300;
extern int BarStep = 36;
extern color ColorText = Gray;
extern color ColorPlusBar = Yellow;
extern color ColorMinusBar = Magenta;
extern color ColorDigits = Blue;
extern color ColorAxis = Green;
extern color ColorArrow = Blue;
extern color ColorLine = Blue;
int Iterations = 6; // for Method = 1
string UName, IndName;
int SymbolPos;
double Buffer[], Buffer2[], Buffer3[];
string Symbols[MAX_AMOUNTSYMBOLS];
double BaseMatrix[][MAX_POINTS], MOMatrix[][MAX_POINTS], Vectors[][MAX_POINTS], Divers[MAX_POINTS], Recycles[MAX_POINTS];
double CvarMatrix[][MAX_AMOUNTSYMBOLS];
double Means[], Divs[];
int Times[MAX_POINTS];
int AmountSymbols, CurrTime, MatrixRows, CurrPos;
double V[], VectorTmp[];
int AmountVariants, Variants[];
string FontName = "Arial";
string StrDelSpaces( string Str )
{
int Pos, Length;
Str = StringTrimLeft(Str);
Str = StringTrimRight(Str);
Length = StringLen(Str) - 1;
Pos = 1;
while (Pos < Length)
if (StringGetChar(Str, Pos) == ' ')
{
Str = StringSubstr(Str, 0, Pos) + StringSubstr(Str, Pos + 1, 0);
Length--;
}
else
Pos++;
return(Str);
}
int StrToStringS( string Str, string Razdelitel, string &Output[] )
{
int Pos, LengthSh;
int Count = 0;
Str = StrDelSpaces(Str);
Razdelitel = StrDelSpaces(Razdelitel);
LengthSh = StringLen(Razdelitel);
while (TRUE)
{
Pos = StringFind(Str, Razdelitel);
Output[Count] = StringSubstr(Str, 0, Pos);
Count++;
if (Pos == -1)
break;
Pos += LengthSh;
Str = StringSubstr(Str, Pos);
}
return(Count);
}
int BooleanToInteger( bool Value )
{
if (Value)
return(1);
return(0);
}
bool RealSymbol( string Symb )
{
return(MarketInfo(Symb, MODE_BID) != 0);
}
void FilterSymbols()
{
int i, j;
for (i = 0; i < AmountSymbols; i++)
if (!RealSymbol(Symbols[i]))
{
for (j = i; j < AmountSymbols - 1; j++)
Symbols[j] = Symbols[j + 1];
AmountSymbols--;
}
return;
}
void SaveConfig( string FileName )
{
string Str = Symbols[0];
int handle = FileOpen(FileName, FILE_CSV|FILE_WRITE);
for (int i = 1; i < AmountSymbols; i++)
Str = Str + ", " + Symbols[i];
FileWrite(handle, Str);
FileWrite(handle, BooleanToInteger(Correlation));
FileWrite(handle, Depth);
FileWrite(handle, Method);
FileWrite(handle, Iterations);
FileWrite(handle, Height);
FileClose(handle);
return;
}
datetime GetStartTime( int Pos )
{
datetime Tmp, StartTime;
int i, PosAddon;
PosAddon = iBarShift(Symbols[0], Period(), Time[0]);
StartTime = iTime(Symbols[0], Period(), Pos + PosAddon);
for (i = 1; i < AmountSymbols; i++)
{
PosAddon = iBarShift(Symbols[i], Period(), Time[0]);
Tmp = iTime(Symbols[i], Period(), Pos + PosAddon);
if (Tmp > StartTime)
StartTime = Tmp;
}
return(StartTime);
}
double GetPrice( string Symb, int time )
{
double Price;
Price = iClose(Symb, Period(), iBarShift(Symb, Period(), time));
return(Price);
}
int GetNextTime( int CurrTime )
{
static int Pos[MAX_AMOUNTSYMBOLS];
int i, MinTime, Tmp = -1;
for (i = 0; i < AmountSymbols; i++)
{
Pos[i] = iBarShift(Symbols[i], Period(), CurrTime) - 1;
if (Pos[i] >= 0)
Tmp = i;
}
if (Tmp < 0)
return(Time[0]);
MinTime = iTime(Symbols[Tmp], Period(), Pos[Tmp]);
i = Tmp - 1;
while (i >= 0)
{
if (Pos[i] >= 0)
{
Tmp = iTime(Symbols[i], Period(), Pos[i]);
if (Tmp < MinTime)
MinTime = Tmp;
}
i--;
}
return(MinTime);
}
void GetBaseMatrix()
{
int i, NextTime;
NextTime = GetNextTime(CurrTime);
while (NextTime < Time[0])
{
CurrTime = NextTime;
for (i = 0; i < AmountSymbols; i++)
BaseMatrix[i][MatrixRows] = 1000 * MathLog(GetPrice(Symbols[i], CurrTime));
Times[MatrixRows] = CurrTime;
MatrixRows++;
NextTime = GetNextTime(CurrTime);
}
return;
}
void GetMeans( int Pos, int Len)
{
int i, j;
double Sum;
for (i = 0; i < AmountSymbols;, i++)
{
Sum = 0;
for (j = Pos; j > Pos - Len; j--)
Sum += BaseMatrix[i][j];
Means[i] = Sum / Len;
}
return;
}
void GetMOMatrix( int Pos, int Len)
{
int i, j;
double Sum;
for (i = 0; i < AmountSymbols;, i++)
for (j = Pos; j > Pos - Len; j--)
MOMatrix[i][j] = BaseMatrix[i][j] - Means[i];
return;
}
void GetCvarMatrix( int Pos, int Len )
{
int i, j, k;
double Cvar;
GetMeans(Pos, Len);
GetMOMatrix(Pos, Len);
for (i = 0; i < AmountSymbols; i++)
{
Cvar = 0;
for (k = Pos; k > Pos - Len; k--)
Cvar += MOMatrix[i][k] * MOMatrix[i][k];
Cvar /= Len;
Divs[i] = Cvar;
CvarMatrix[i][i] = Cvar;
for (j = i + 1; j < AmountSymbols; j++)
{
Cvar = 0;
for (k = Pos; k > Pos - Len; k--)
Cvar += MOMatrix[i][k] * MOMatrix[j][k];
CvarMatrix[i][j] = Cvar / Len;
}
}
return;
}
void FileToNull( string FileName )
{
int handle = FileOpen(FileName, FILE_BIN|FILE_WRITE);
FileClose(handle);
return;
}
void SetIndName()
{
if (SymbolPos < AmountSymbols)
{
if (Correlation)
IndName = "Correlation Absolute Koef";
else
IndName = "Recycle Absolute Koef";
}
else if (Correlation)
IndName = "Correlation Koefs";
else
IndName = "Recycle Koefs";
IndicatorShortName(IndName);
return;
}
int GetSymbolPos( string Symb )
{
int Pos = 0;
while (Pos < AmountSymbols)
{
if (Symb == Symbols[Pos])
break;
Pos++;
}
return(Pos);
}
void init()
{
UName = "hwnd" + WindowHandle(Symbol(), Period());
FileToNull(UName + "i.dat");
IndicatorDigits(8);
SetIndexStyle(0, DRAW_LINE, DRAW_LINE);
SetIndexBuffer(0, Buffer);
SetIndexStyle(1, DRAW_LINE, DRAW_LINE);
SetIndexBuffer(1, Buffer2);
SetIndexStyle(2, DRAW_LINE, DRAW_LINE);
SetIndexBuffer(2, Buffer3);
AmountSymbols = StrToStringS(SymbolsStr, ",", Symbols);
FilterSymbols();
if (SymbolKoef)
SymbolPos = GetSymbolPos(Symbol());
else
SymbolPos = AmountSymbols;
SetIndName();
SaveConfig(UName + ".ini");
GlobalVariableSet(UName + "SymbolPos", SymbolPos);
GlobalVariableSet(UName + "LastTime", Time[0]);
GlobalVariableSet(UName, 0);
ArrayResize(Symbols, AmountSymbols);
ArrayResize(BaseMatrix, AmountSymbols);
ArrayResize(MOMatrix, AmountSymbols);
ArrayResize(CvarMatrix, AmountSymbols);
ArrayResize(Means, AmountSymbols);
ArrayResize(Divs, AmountSymbols);
ArrayResize(Vectors, AmountSymbols);
ArrayResize(V, AmountSymbols);
ArrayResize(VectorTmp, AmountSymbols);
if (Method == 4)
AmountVariants = GetVariants(Variants, AmountSymbols);
CurrTime = GetStartTime(Depth + 1);
MatrixRows = 0;
CurrPos = Depth - 1;
return;
}
void InvertMatrix( double& Matrix[][] )
{
static int rn[];
static double str[], strm[];
int j,k;
int jved;
double aved, Tmp;
ArrayResize(rn, AmountSymbols);
ArrayResize(str, AmountSymbols);
ArrayResize(strm, AmountSymbols);
for (j = 0; j < AmountSymbols; j++)
rn[j] = j;
for (int i = 0; i < AmountSymbols; i++)
{
aved = -1;
for (j = 0; j < AmountSymbols; j++)
if (rn[j] != -1)
{
Tmp = MathAbs(Matrix[j][j]);
if (Tmp > aved)
{
aved = Tmp;
jved = j;
}
}
rn[jved] = -1;
for (j = 0; j < jved; j++)
{
str[j] = Matrix[j][jved];
strm[j] = str[j] / aved;
}
for (j = jved + 1; j < AmountSymbols; j++)
{
str[j] = Matrix[jved][j];
strm[j] = str[j] / aved;
}
for (j = 0; j < AmountSymbols; j++)
for (k = j; k < AmountSymbols; k++)
Matrix[j][k] -= strm[j] * str[k];
for (j = 0; j < jved; j++)
Matrix[j][jved] = strm[j];
for (j = jved + 1; j < AmountSymbols; j++)
Matrix[jved][j] = strm[j];
Matrix[jved][jved] = -1 / aved;
}
return;
}
bool CheckVectorChange( double& V[], double& VChange[] )
{
int i;
bool Res;
double Sum1 = 0, Sum2 = 0;
for (i = 0; i < AmountSymbols; i++)
{
Sum1 += MathAbs(V[i] - VChange[i]);
Sum2 += MathAbs(V[i] + VChange[i]);
}
Res = (Sum1 > Sum2);
if (Res)
for (i = 0; i < AmountSymbols; i++)
VChange[i] = -VChange[i];
return(Res);
}
void GetOptimalVector1( double& Vector[], int Iterations )
{
int i, j, k;
double Tmp, Max = 0;
while (Iterations > 0)
{
for (i = 0; i < AmountSymbols; i++)
for (j = AmountSymbols - 1; j >= i; j--)
{
Tmp = 0;
k = 0;
while (k < i)
{
Tmp += CvarMatrix[k][i] * CvarMatrix[k][j];
k++;
}
while (k < j)
{
Tmp += CvarMatrix[i][k] * CvarMatrix[k][j];
k++;
}
while (k < AmountSymbols)
{
Tmp += CvarMatrix[i][k] * CvarMatrix[j][k];
k++;
}
CvarMatrix[j][i] = Tmp;
}
for (i = 0; i < AmountSymbols; i++)
for (j = i + 1; j < AmountSymbols; j++)
CvarMatrix[i][j] = CvarMatrix[j][i];
Iterations--;
}
for (i = 0; i < AmountSymbols; i++)
{
Tmp = 0;
for (j = 0; j < AmountSymbols; j++)
if (CvarMatrix[i][j] < 0)
Tmp -= CvarMatrix[i][j];
else
Tmp += CvarMatrix[i][j];
if (Tmp > Max)
{
Max = Tmp;
k = i;
}
}
ArrayCopy(VectorTmp, Vector);
for (i = 0; i < AmountSymbols; i++)
Vector[i] = CvarMatrix[k][i] / Max;
CheckVectorChange(VectorTmp, Vector);
return;
}
double GetOptimalVector2( double& Vector[] )
{
int i, j;
double Tmp, Max = 0, StDev = 0;
for (i = 0; i < AmountSymbols; i++)
{
Tmp = 0;
j = 0;
while (j < i)
{
Tmp -= CvarMatrix[j][i];
j++;
}
while (j < AmountSymbols)
{
Tmp -= CvarMatrix[i][j];
j++;
}
VectorTmp[i] = Tmp;
StDev += Tmp;
if (Tmp < 0)
Max -= Tmp;
else
Max += Tmp;
}
for (i = 0; i < AmountSymbols; i++)
VectorTmp[i] /= Max;
CheckVectorChange(Vector, VectorTmp);
ArrayCopy(Vector, VectorTmp);
StDev = MathSqrt(StDev) / Max;
return(StDev);
}
double GetOptimalVector3( double& Vector[] )
{
int i, j;
double Tmp, Max = 0, StDev;
static bool Flag[];
ArrayResize(Flag, AmountSymbols);
for (i = 0; i < AmountSymbols; i++)
{
Tmp = 0;
j = 0;
Flag[i] = FALSE;
while (j < i)
{
Tmp -= CvarMatrix[j][i];
j++;
}
while (j < AmountSymbols)
{
Tmp -= CvarMatrix[i][j];
j++;
}
VectorTmp[i] = Tmp / 2;
}
i = 0;
while (i < AmountSymbols)
if (VectorTmp[i] < 0)
{
Flag[i] = !Flag[i];
VectorTmp[i] = -VectorTmp[i];
j = 0;
while (j < i)
{
if (Flag[j] == Flag[i])
VectorTmp[j] -= CvarMatrix[j][i];
else
VectorTmp[j] += CvarMatrix[j][i];
j++;
}
while (j < AmountSymbols)
{
if (Flag[j] == Flag[i])
VectorTmp[j] -= CvarMatrix[i][j];
else
VectorTmp[j] += CvarMatrix[i][j];
j++;
}
i = 0;
}
else
i++;
for (i = 0; i < AmountSymbols; i++)
Max += VectorTmp[i];
for (i = 0; i < AmountSymbols; i++)
if (Flag[i])
VectorTmp[i] /= -Max;
else
VectorTmp[i] /= Max;
CheckVectorChange(Vector, VectorTmp);
ArrayCopy(Vector, VectorTmp);
StDev = 1 / MathSqrt(Max + Max);
return(StDev);
}
int GetVariants( int& Variants[], int Amount )
{
int i, j;
int Pos = 1, Step = 2;
int AmountVariants = MathPow(2, Amount - 1) - 1;
ArrayResize(Variants, AmountVariants + 1);
for (i = 0; i < Amount - 1; i++)
{
for (j = Pos - 1; j < AmountVariants; j += Step)
Variants[j] = i;
Pos <<= 1;
Step <<= 1;
}
Variants[AmountVariants] = Amount - 2;
return(AmountVariants + 1);
}
double GetOptimalVector4( double& Vector[] )
{
int i, j;
double Tmp, Max = 0, StDev;
bool FlagPositive;
static bool Flag[], BestFlag[];
static double BestVector[];
ArrayResize(Flag, AmountSymbols);
ArrayResize(BestFlag, AmountSymbols);
ArrayResize(BestVector, AmountSymbols);
for (i = 0; i < AmountSymbols; i++)
{
Tmp = 0;
j = 0;
Flag[i] = FALSE;
while (j < i)
{
Tmp -= CvarMatrix[j][i];
j++;
}
while (j < AmountSymbols)
{
Tmp -= CvarMatrix[i][j];
j++;
}
VectorTmp[i] = Tmp / 2;
}
for (int k = 0; k < AmountVariants; k++)
{
i = Variants[k];
FlagPositive = TRUE;
StDev = 0;
Flag[i] = !Flag[i];
VectorTmp[i] = -VectorTmp[i];
j = 0;
while (j < i)
{
if (Flag[j] == Flag[i])
VectorTmp[j] -= CvarMatrix[j][i];
else
VectorTmp[j] += CvarMatrix[j][i];
if (FlagPositive)
{
if (VectorTmp[j] >= 0)
StDev += VectorTmp[j];
else
FlagPositive = FALSE;
}
j++;
}
while (j < AmountSymbols)
{
if (Flag[j] == Flag[i])
VectorTmp[j] -= CvarMatrix[i][j];
else
VectorTmp[j] += CvarMatrix[i][j];
if (FlagPositive)
{
if (VectorTmp[j] >= 0)
StDev += VectorTmp[j];
else
FlagPositive = FALSE;
}
j++;
}
if (FlagPositive)
if (StDev > Max)
{
Max = StDev;
ArrayCopy(BestVector, VectorTmp);
ArrayCopy(BestFlag, Flag);
}
}
for (i = 0; i < AmountSymbols; i++)
if (BestFlag[i])
BestVector[i] /= -Max;
else
BestVector[i] /= Max;
CheckVectorChange(Vector, BestVector);
ArrayCopy(Vector, BestVector);
StDev = 1 / MathSqrt(Max + Max);
return(StDev);
}
double GetOptimalVector( double& Vector[], int Method, bool Correlation )
{
int i, j;
double Tmp, Tmp2, StDev;
if (Correlation)
{
for (i = 0; i < AmountSymbols; i++)
Divs[i] = MathSqrt(Divs[i]);
for (i = 0; i < AmountSymbols; i++)
{
CvarMatrix[i][i] = 1;
Tmp = Divs[i];
if (Tmp != 0)
for (j = i + 1; j < AmountSymbols; j++)
{
Tmp2 = Tmp * Divs[j]; // if Divs[] != 0, then Divs[] * Divs[] != 0, because MathSqrt.
if (Tmp2!= 0)
CvarMatrix[i][j] /= Tmp2;
else
CvarMatrix[i][j] = 0;
}
else
for (j = i + 1; j < AmountSymbols; j++)
CvarMatrix[i][j] = 0;
}
}
InvertMatrix(CvarMatrix);
switch (Method)
{
case 1:
GetOptimalVector1(Vector, Iterations);
StDev = GetDivergence(CurrPos, Depth, Vector, Correlation);
break;
case 2:
StDev = GetOptimalVector2(Vector);
break;
case 3:
StDev = GetOptimalVector3(Vector);
break;
case 4:
StDev = GetOptimalVector4(Vector);
break;
}
return(StDev);
}
double GetRecycle( int Pos, int Len, double& Vector[], bool Correlation )
{
int i;
double Recycle = 0;
if (Correlation)
{
for (i = 0; i < AmountSymbols;, i++)
if (Divs[i] != 0)
Recycle += MOMatrix[i][Pos] * Vector[i] / Divs[i]; // Divs == StdDev
}
else
for (i = 0; i < AmountSymbols;, i++)
Recycle += MOMatrix[i][Pos] * Vector[i];
return(Recycle);
}
double GetDivergence( int Pos, int Len, double& Vector[], bool Correlation )
{
int i, j;
double Sum, Div = 0;
if (Correlation)
{
ArrayCopy(VectorTmp, Vector, 0, 0, AmountSymbols);
for (i = 0; i < AmountSymbols; i++)
if (Divs[i] != 0)
VectorTmp[i] /= Divs[i]; // Divs == StdDev
for (i = Pos; i > Pos - Len; i--)
{
Sum = 0;
for (j = 0; j < AmountSymbols;, j++)
if (Divs[j] != 0)
Sum += MOMatrix[j][i] * VectorTmp[j];
Div += Sum * Sum;
}
}
else
for (i = Pos; i > Pos - Len; i--)
{
Sum = 0;
for (j = 0; j < AmountSymbols;, j++)
Sum += MOMatrix[j][i] * Vector[j];
Div += Sum * Sum;
}
Div /= Len;
return(MathSqrt(Div));
}
void deinit()
{
GlobalVariableDel(UName);
GlobalVariableDel(UName + "LastTime");
GlobalVariableDel(UName + "SymbolPos");
ObjectDelete("BeginInterval");
ObjectDelete("EndInterval");
FileToNull(UName + ".ini");
FileToNull(UName + ".dat");
FileToNull(UName + "i.dat");
return;
}
void GetSaveData( string FileNameIn, string FileNameOut )
{
int i, time, Pos, Pos2;
double Div, Recycle;
bool FlagReverse;
int handleIn = FileOpen(FileNameIn, FILE_BIN|FILE_READ);
int handleOut = FileOpen(FileNameOut, FILE_BIN|FILE_WRITE);
while (FileTell(handleIn) < FileSize(handleIn))
{
time = FileReadInteger(handleIn);
FileWriteInteger(handleOut, time);
Recycle = FileReadDouble(handleIn);
FileWriteDouble(handleOut, Recycle);
Div = FileReadDouble(handleIn);
FileWriteDouble(handleOut, Div);
FileReadArray(handleIn, V, 0, AmountSymbols);
FileWriteArray(handleOut, V, 0, AmountSymbols);
Pos = iBarShift(Symbol(), Period(), time);
Buffer[Pos] = iIF(SymbolPos < AmountSymbols, MathAbs(V[SymbolPos]), Recycle);
Buffer2[Pos] = iIF(SymbolPos < AmountSymbols, MathAbs(V[SymbolPos]), Div);
Buffer3[Pos] = iIF(SymbolPos < AmountSymbols, MathAbs(V[SymbolPos]), -Div);
}
FileClose(handleIn);
Pos = GetTimePos(time) + 1;
if (Pos < MatrixRows)
{
for (i = 0; i < AmountSymbols; i++)
VectorTmp[i] = Vectors[i][Pos];
FlagReverse = CheckVectorChange(V, VectorTmp);
}
while (Pos < MatrixRows)
{
if (FlagReverse)
{
Recycles[Pos] = -Recycles[Pos];
for (i = 0; i < AmountSymbols; i++)
Vectors[i][Pos] = -Vectors[i][Pos];
}
time = Times[Pos];
Div = Divers[Pos];
Recycle = Recycles[Pos];
Pos2 = iBarShift(Symbol(), Period(), time);
Buffer[Pos2] = iIF(SymbolPos < AmountSymbols, MathAbs(Vectors[SymbolPos][Pos]), Recycle);
Buffer2[Pos2] = iIF(SymbolPos < AmountSymbols, MathAbs(Vectors[SymbolPos][Pos]), Div);
Buffer3[Pos2] = iIF(SymbolPos < AmountSymbols, MathAbs(Vectors[SymbolPos][Pos]), -Div);
FileWriteInteger(handleOut, time);
FileWriteDouble(handleOut, Recycle);
FileWriteDouble(handleOut, Div);
for (i = 0; i < AmountSymbols; i++)
FileWriteDouble(handleOut, Vectors[i][Pos]);
if (Pos == MatrixRows -1)
for (i = 0; i < AmountSymbols; i++)
V[i] = Vectors[i][Pos];
Pos++;
}
FileClose(handleOut);
return;
}
void HideObject( string Name, bool Hide )
{
if (Hide)
ObjectSet(Name, OBJPROP_TIMEFRAMES, EMPTY);
else
ObjectSet(Name, OBJPROP_TIMEFRAMES, NULL);
return;
}
void CreateObject( string Name, string Value, int FontSize, int Xcoord, int Ycoord, int Angle, bool Hide, bool Back, int Color )
{
ObjectCreate(Name, OBJ_LABEL, WindowFind(IndName), 0, 0);
HideObject(Name, Hide);
ObjectSet(Name, OBJPROP_ANGLE, Angle);
ObjectSet(Name, OBJPROP_XDISTANCE, Xcoord);
ObjectSet(Name, OBJPROP_YDISTANCE, Ycoord);
ObjectSet(Name, OBJPROP_BACK, Back);
ObjectSetText(Name, Value, FontSize, FontName, Color);
return;
}
void CreateObjectBar( string Name, int Xcoord, int Ycoord )
{
int i, Avg = Height / 2;
string Tmp;
CreateObject(Name, Name, 10, Xcoord - 15, Ycoord + 10 + StringLen(Name) * 5, 90, FALSE, FALSE, ColorText);
CreateObject(Name + "Plus", "+0.0000", 8, Xcoord - 2, Ycoord, 90, TRUE, FALSE, ColorDigits);
CreateObject(Name + "Minus", "-0.000", 8, Xcoord + 11, Ycoord + 27, -90, TRUE, FALSE, ColorDigits);
Ycoord -= 5 + Avg;
for (i = 0; i <= Height; i++)
{
Tmp = Name + i;
if (i > Avg)
CreateObject(Tmp, "_", 12, Xcoord, Ycoord + i, 0, TRUE, TRUE, ColorMinusBar);
else if (i < Avg)
CreateObject(Tmp, "_", 12, Xcoord, Ycoord + i, 0, TRUE, TRUE, ColorPlusBar);
else
CreateObject(Tmp, "_", 12, Xcoord, Ycoord + i, 0, TRUE, TRUE, ColorAxis);
}
return;
}
void CreateVertLine( string Name, int Color )
{
ObjectCreate(Name, OBJ_VLINE, 0, 0, 0);
ObjectSet(Name, OBJPROP_BACK, TRUE);
ObjectSet(Name, OBJPROP_STYLE, STYLE_DASH);
ObjectSet(Name, OBJPROP_COLOR, ColorLine);
return;
}
void CreateBars( int Xcoord, int Ycoord, int XStep )
{
int i, Avg = Height / 2;
string Tmp = "";
string Methods[4] = {"Method = 1 (Condition: Sum(Coef^2) = 1)", "Method = 2 (Condition: Sum(Coef) = 1)",
"Method = 3 (Condition: Sum(|Coef|) = 1 (not BEST))", "Method = 4 (Condition: Sum(|Coef|) = 1)"};
ObjectCreate("Arrow", OBJ_ARROW, WindowFind(IndName), 0, 0);
ObjectSet("Arrow", OBJPROP_COLOR, ColorArrow);
CreateVertLine("BeginInterval", ColorLine);
CreateVertLine("EndInterval", ColorLine);
CreateObject("Depth", "Depth", 12, Xcoord, Ycoord - 20 - Avg, 0, FALSE, FALSE, ColorText);
CreateObject("Deviation", "Deviation", 12, Xcoord, Ycoord + 20 - Avg, 0, FALSE, FALSE, ColorText);
CreateObject("Recycle", "Recycle", 12, Xcoord, Ycoord + 40 - Avg, 0, FALSE, FALSE, ColorText);
CreateObject("Method", Methods[Method - 1], 12, Xcoord, Ycoord + 60 - Avg, 0, FALSE, FALSE, ColorText);
if (SymbolPos < AmountSymbols)
CreateObject("SymbolKoef", "SymbolKoef", 12, Xcoord, Ycoord + 80 - Avg, 0, FALSE, FALSE, ColorText);
for (i = 0; i <= (AmountSymbols - 1) * XStep / 9; i++)
Tmp = Tmp + "_";
CreateObject("Top", Tmp, 12, Xcoord, Ycoord - 5 - Avg, 0, FALSE, TRUE, ColorAxis);
CreateObject("Bottom", Tmp, 12, Xcoord, Ycoord - 5 + Avg, 0, FALSE, TRUE, ColorAxis);
for (i = 0; i < AmountSymbols; i++)
{
CreateObjectBar(Symbols[i], Xcoord, Ycoord);
Xcoord += XStep;
}
return;
}
void SetBar( string Name, double Value )
{
int i, Pos;
string Tmp;
int Avg = Height / 2;
HideObject(Name + "Plus", TRUE);
HideObject(Name + "Minus", TRUE);
if (Value >= 0)
Tmp = "Plus";
else
Tmp = "Minus";
ModifyTextObject(Name + Tmp, DoubleToStr(Value, 4));
HideObject(Name + Tmp, FALSE);
for (i = 0; i <= Height; i++)
HideObject(Name + i, TRUE);
Pos = Value * Avg;
if (Value >= 0)
for (i = Avg; i >= Avg - Pos; i--)
HideObject(Name + i, FALSE);
else
for (i = Avg; i <= Avg - Pos; i++)
HideObject(Name + i, FALSE);
return;
}
int GetTimePos( int SearchTime )
{
int LeftTime, RightTime, PosTime;
int Left, Right, Pos = 0;
Left = 0;
Right = MatrixRows - 1;
LeftTime = Times[Left];
RightTime = Times[Right];
if (SearchTime >= RightTime)
Pos = Right;
while ((LeftTime < SearchTime) && (SearchTime < RightTime))
{
Pos = (Left + Right) >> 1;
PosTime = Times[Pos];
if (Pos == Left)
break;
if (SearchTime >= PosTime)
{
Left = Pos;
LeftTime = PosTime;
}
else // if (SearchTime < PosTime)
{
Right = Pos;
RightTime = PosTime;
}
}
return(Pos);
}
void ModifyTextObject( string Name, string Text )
{
int Color = ObjectGet(Name, OBJPROP_COLOR);
int FontSize = ObjectGet(Name, OBJPROP_FONTSIZE);
ObjectSetText(Name, Text, FontSize, FontName, Color);
return;
}
void SetArrow()
{
ObjectSet("Arrow", OBJPROP_TIME1, Times[MatrixRows - 1]);
ObjectSet("Arrow", OBJPROP_PRICE1, iIF(SymbolPos < AmountSymbols, MathAbs(Vectors[SymbolPos][MatrixRows - 1]), Recycles[MatrixRows - 1]));
return;
}
void SetVertLine( string Name, int Pos)
{
ObjectSet(Name, OBJPROP_TIME1, Pos);
return;
}
void DrawVector( double& Vector[] )
{
string Tmp;
SetArrow();
SetVertLine("BeginInterval", Times[MatrixRows - Depth]);
SetVertLine("EndInterval", Times[MatrixRows - 1]);
Tmp = "Depth = " + Depth + " bars (" + TimeToStr(Times[MatrixRows - Depth]) + " - " + TimeToStr(Times[MatrixRows - 1]) + ")";
ModifyTextObject("Depth", Tmp);
Tmp = "Deviation = " + Divers[MatrixRows - 1];
ModifyTextObject("Deviation", Tmp);
Tmp = "Recycle = " + Recycles[MatrixRows - 1];
ModifyTextObject("Recycle", Tmp);
if (SymbolPos < AmountSymbols)
{
Tmp = Symbol() + " Koef = " + MathAbs(Vector[SymbolPos]);
ModifyTextObject("SymbolKoef", Tmp);
}
for (int i = 0; i < AmountSymbols; i++)
SetBar(Symbols[i], Vector[i]);
WindowRedraw();
return;
}
void SaveData( string FileName, int Pos )
{
int handle = FileOpen(FileName, FILE_BIN|FILE_READ|FILE_WRITE);
FileSeek(handle, 0, SEEK_END);
while (Pos < MatrixRows)
{
FileWriteInteger(handle, Times[Pos]);
FileWriteDouble(handle, Recycles[Pos]);
FileWriteDouble(handle, Divers[Pos]);
for (int i = 0; i < AmountSymbols; i++)
FileWriteDouble(handle, Vectors[i][Pos]);
Pos++;
}
FileClose(handle);
return;
}
double iIF( bool Cond, double Num1, double Num2 )
{
if (Cond)
return(Num1);
return(Num2);
}
void start()
{
static bool FirstRun = TRUE;
static int PrevTime = 0;
string Name = UName + "Done";
bool Var, FlagChange = FALSE;
int PrevPos, Pos;
if (FirstRun)
{
CreateBars(50, 50 + Height / 2, BarStep);
FirstRun = FALSE;
}
if (PrevTime != Time[0])
{
PrevTime = Time[0];
GlobalVariableSet(UName + "LastTime", Time[0]);
GetBaseMatrix();
PrevPos = CurrPos;
while (CurrPos < MatrixRows)
{
GetCvarMatrix(CurrPos, Depth);
Divers[CurrPos] = GetOptimalVector(V, Method, Correlation);
Recycles[CurrPos] = GetRecycle(CurrPos, Depth, V, Correlation);
Pos = iBarShift(Symbol(), Period(), Times[CurrPos]);
Buffer[Pos] = iIF(SymbolPos < AmountSymbols, MathAbs(V[SymbolPos]), Recycles[CurrPos]);
Buffer2[Pos] = iIF(SymbolPos < AmountSymbols, MathAbs(V[SymbolPos]), Divers[CurrPos]);
Buffer3[Pos] = iIF(SymbolPos < AmountSymbols, MathAbs(V[SymbolPos]), -Divers[CurrPos]);
for (int i = 0; i < AmountSymbols; i++)
Vectors[i][CurrPos] = V[i];
CurrPos++;
}
if (PrevPos < MatrixRows)
{
DrawVector(V);
SaveData(UName + "i.dat", PrevPos);
FlagChange = TRUE;
}
}
if (GlobalVariableCheck(Name))
{
GetSaveData(UName + ".dat", UName + "i.dat");
DrawVector(V);
GlobalVariableDel(Name);
FlagChange = TRUE;
}
if (FlagChange)
GlobalVariableSet(UName, GlobalVariableGet(UName) + 1);
return;
}
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---