Hi Radar,
I hope you managed to get your project going!
If I could go back in time by a year I would tell myself to start working with as much code as possible in a DLL created using a better development environment and programming language.
I am being forced to use 3 dimensional arrays in a very awkward way
1 dimension per pair
1 dimesion per timeframe
1 dimesion for history
the reason for this is to make a number of functions more generic
and not to recalculate the same data every tick,
in particular
daily pivots, weekly pivots, Bollinger bands and zigzags
Example
Code: Select all
#define ZZMAXTIMEFRAMES 4
#define ZZTF_M15_IDX 0
#define ZZTF_H1_IDX 1
#define ZZTF_H4_IDX 2
#define ZZTF_D1_IDX 3
int arrZzIndexToTf[] = { PERIOD_M15, PERIOD_H1, PERIOD_H4, PERIOD_D1 };
int ZZTrend[MAXPAIRS][ZZMAXTIMEFRAMES][ZZMAXIMUMBACKBARS];
double ZZBuffer[MAXPAIRS][ZZMAXTIMEFRAMES][ZZMAXIMUMBACKBARS];
double ZZHighMapBuffer[MAXPAIRS][ZZMAXTIMEFRAMES][ZZMAXIMUMBACKBARS];
double ZZLowMapBuffer[MAXPAIRS][ZZMAXTIMEFRAMES][ZZMAXIMUMBACKBARS];
double ZZTopBuffer[MAXPAIRS][ZZMAXTIMEFRAMES][ZZMAXIMUMBACKBARS];
double ZZBottomBuffer[MAXPAIRS][ZZMAXTIMEFRAMES][ZZMAXIMUMBACKBARS];
double ZZChange[MAXPAIRS][ZZMAXTIMEFRAMES][ZZMAXIMUMBACKBARS];
//+------------------------------------------------------------------+
//| ZZTimeframeToIndex |
//+------------------------------------------------------------------+
int ZZTimeframeToIndex(int timeframe) {
int index = ZZTF_M15_IDX;
if( timeframe == PERIOD_H1)
index = ZZTF_H1_IDX;
else if( timeframe == PERIOD_H4)
index = ZZTF_H4_IDX;
else if( timeframe == PERIOD_D1)
index = ZZTF_D1_IDX;
return(index);
}
I did produce some code for shuffling two dimesional arrays
As I have produced so much code in mql generally I might be trapped in this hell forever
Here is some utility code which I hope no pour soul has to make use of:
Code: Select all
//+------------------------------------------------------------------+
//| bwaShiftArrayOfDoubles() |
//+------------------------------------------------------------------+
void bwaShiftArrayOfDoubles(double& arrData[])
{
int size = ArraySize(arrData);
for(int i1 = 0; i1 < size; i1++ )
{
int rIdxLast = size - 1 - i1;
int rIdxPrev = rIdxLast - 1;
if( rIdxPrev < 0 )
break;
arrData[rIdxLast] = arrData[rIdxPrev];
if( rIdxPrev == 0 ) arrData[0] = 0;
}
}
//+------------------------------------------------------------------+
//| bwaShift2DimArrayOfDoubles() |
//+------------------------------------------------------------------+
bool bwaShift2DimArrayOfDoubles(double& arrData[][], int dim1, int dim2)
{
int maxsize = ArraySize(arrData);
if( (dim1 * dim2) > maxsize )
return(false);
for(int i1 = 0; i1 < dim1; i1++ )
{
int rIdxLast = dim1 - 1 - i1;
int rIdxPrev = rIdxLast - 1;
if( rIdxPrev < 0 )
break;
for(int i2 = 0; i2 < dim2; i2++ ) {
arrData[rIdxLast][i2] = arrData[rIdxPrev][i2];
if( rIdxPrev == 0 ) arrData[0][i2] = 0;
}
}
return(true);
}
bool bwaDump2DDoubleHistory(double& arr2DHist[][], int dim1, int dim2 )
{
int maxsize = ArraySize(arr2DHist);
if( (dim1 * dim2) > maxsize )
return(false);
string strLine = "dump2DHistory: dim1, dim2 :" + dim1 + ", " + dim2;
Print(strLine);
for(int i1 = 0; i1 < dim1; i1++ )
{
strLine = "";
for(int i2 = 0; i2 < dim2; i2++ ) {
strLine = strLine + DoubleToStr(arr2DHist[i1][i2],5) + ", ";
}
Print( strLine );
}
return(true);
}
bool bwaDump2DIntegerHistory(int& arr2DHist[][], int dim1, int dim2 )
{
int maxsize = ArraySize(arr2DHist);
if( (dim1 * dim2) > maxsize )
return(false);
string strLine = "dump2DHistory: dim1, dim2 :" + dim1 + ", " + dim2;
Print(strLine);
for(int i1 = 0; i1 < dim1; i1++ )
{
strLine = "";
for(int i2 = 0; i2 < dim2; i2++ ) {
strLine = strLine + arr2DHist[i1][i2] + ", ";
}
Print( strLine );
}
return(true);
}
//+------------------------------------------------------------------+
//| bwaShift2DimArrayOfInt() |
//+------------------------------------------------------------------+
bool bwaShift2DimArrayOfInt(int& arrData[][], int dim1, int dim2)
{
int maxsize = ArraySize(arrData);
if( (dim1 * dim2) > maxsize )
return(false);
for(int i1 = 0; i1 < dim1; i1++ )
{
int rIdxLast = dim1 - 1 - i1;
int rIdxPrev = rIdxLast - 1;
if( rIdxPrev < 0 )
break;
for(int i2 = 0; i2 < dim2; i2++ ) {
arrData[rIdxLast][i2] = arrData[rIdxPrev][i2];
if( rIdxPrev == 0 ) arrData[0][i2] = 0;
}
}
return(true);
}
//+------------------------------------------------------------------+
//| bwaShift2DimArrayOfBool() |
//+------------------------------------------------------------------+
bool bwaShift2DimArrayOfBool(bool& arrData[][], int dim1, int dim2)
{
int maxsize = ArraySize(arrData);
if( (dim1 * dim2) > maxsize )
return(false);
for(int i1 = 0; i1 < dim1; i1++ )
{
int rIdxLast = dim1 - 1 - i1;
int rIdxPrev = rIdxLast - 1;
if( rIdxPrev < 0 )
break;
for(int i2 = 0; i2 < dim2; i2++ ) {
arrData[rIdxLast][i2] = arrData[rIdxPrev][i2];
if( rIdxPrev == 0 ) arrData[0][i2] = 0;
}
}
return(true);
}
//+------------------------------------------------------------------+
//| bwaCompare2DimArrayOfDoubles() |
//+------------------------------------------------------------------+
bool bwaCompare2DimArrayOfDoubles(double& arrData[][], double& arrData2[][], int dim1, int dim2)
{
bool bSuccess = true;
bool bReport = false;
int maxsize = ArraySize(arrData);
if( (dim1 * dim2) > maxsize )
return(false);
int size2 = ArraySize(arrData2);
if( (dim1 * dim2) > size2 )
return(false);
for(int i1 = 0; i1 < dim1; i1++ )
{
int rIdxLast = dim1 - 1 - i1;
for(int i2 = 0; i2 < dim2; i2++ ) {
if( arrData[rIdxLast][i2] != arrData2[rIdxLast][i2] )
{
bSuccess = false;
if( bReport ) {
Print("bwaCompare2DimArrayOfDoubles() : Arrays are different!!!");
Print("index: " + rIdxLast + ", " + i2 + " : arrData: " + DoubleToStr(arrData[rIdxLast][i2],5) + ", " + ", arrData2 : " + DoubleToStr(arrData2[rIdxLast][i2],5) );
}
}
}
}
if( (bSuccess == false) && (bReport == true) )
for( i1 = 0; i1 < dim1; i1++ )
for( i2 = 0; i2 < dim2; i2++ )
Print("index: " + i1 + ", " + i2 + " : arrData: " + DoubleToStr(arrData[i1][i2],5) + ", " + ", arrData2 : " + DoubleToStr(arrData2[i1][i2],5) );
return(bSuccess);
}
//+------------------------------------------------------------------+
//| bwaCompare2DimArrayOfInt() |
//+------------------------------------------------------------------+
bool bwaCompare2DimArrayOfInt(int& arrData[][], int& arrData2[][], int dim1, int dim2)
{
bool bSuccess = true;
bool bReport = false;
int maxsize = ArraySize(arrData);
if( (dim1 * dim2) > maxsize )
{
Print("bwaCompare2DimArrayOfInt() : Array arrData[][] dimension error!");
return(false);
}
int size2 = ArraySize(arrData2);
if( (dim1 * dim2) > size2 )
{
Print("bwaCompare2DimArrayOfInt() : Array arrData2[][] dimension error!");
return(false);
}
for(int i1 = 0; i1 < dim1; i1++ )
{
int rIdxLast = dim1 - 1 - i1;
for(int i2 = 0; i2 < dim2; i2++ ) {
if( arrData[rIdxLast][i2] != arrData2[rIdxLast][i2] )
{
bSuccess = false;
if( bReport ) {
Print("bwaCompare2DimArrayOfInt() : Arrays are different!!!");
Print("index: " + rIdxLast + ", " + i2 + " : arrData: " +arrData[rIdxLast][i2] + ", " + ", arrData2 : " + arrData2[rIdxLast][i2] );
}
}
}
}
Print("bwaCompare2DimArrayOfInt(): No. of Ints compared: [" + i1 +"], [" + i2+"]");
if( (bSuccess == false) && (bReport == true) )
for( i1 = 0; i1 < dim1; i1++ )
for( i2 = 0; i2 < dim2; i2++ )
Print("index: " + i1 + ", " + i2 + " : arrData: " + arrData[i1][i2] + ", " + ", arrData2 : " + arrData2[i1][i2] );
return(bSuccess);
}
//+------------------------------------------------------------------+
//| testbwaShift2DimArrayOfDoubles() |
//+------------------------------------------------------------------+
void test_bwaShift2DimArrayOfDoubles()
{
static double testDataIn[5][2] =
{
0.11, 0.12,
0.21, 0.13,
0.31, 0.14,
0.41, 0.15,
0.51, 0.16
};
static double testDataOut[5][2] =
{
0.0, 0.0,
0.11, 0.12,
0.21, 0.13,
0.31, 0.14,
0.41, 0.15
};
double arr1[5][2];
ArrayCopy( arr1, testDataIn, 0, 0, WHOLE_ARRAY );
bool bSuccess = bwaShift2DimArrayOfDoubles(arr1, 5, 2);
if( bSuccess == false ) Print("Test Failed: testbwaShift2DimArrayOfDoubles()");
bSuccess = bwaCompare2DimArrayOfDoubles( arr1, testDataOut, 5, 2);
if( bSuccess == false ) Print("Test Failed: testbwaShift2DimArrayOfDoubles()");
}
//+------------------------------------------------------------------+
//| bwaShiftArrayOfInts() |
//+------------------------------------------------------------------+
void bwaShiftArrayOfInts(int& arrData[])
{
int maxsize = ArraySize(arrData);
for(int i1 = 0; i1 < maxsize; i1++ )
{
int rIdxLast = maxsize - 1 - i1;
int rIdxPrev = rIdxLast - 1;
if( rIdxPrev < 0 )
break;
arrData[rIdxLast] = arrData[rIdxPrev];
if( rIdxPrev == 0 ) arrData[rIdxPrev] = 0;
}
}
//+------------------------------------------------------------------+
//| bwaShift2DimArrayOfInts() |
//+------------------------------------------------------------------+
bool bwaShift2DimArrayOfInts(int& arrData[][], int dim1, int dim2)
{
int maxsize = ArraySize(arrData);
if( (dim1 * dim2) > maxsize )
{
Print( "ERROR! bwaShift2DimArrayOfInts() dim1 * dim2 > size! ");
return(false);
}
for(int i1 = 0; i1 < dim1; i1++ )
{
int rIdxLast = dim1 - 1 - i1;
int rIdxPrev = rIdxLast - 1;
if( rIdxPrev < 0 )
break;
for(int i2 = 0; i2 < dim2; i2++ ) {
arrData[rIdxLast][i2] = arrData[rIdxPrev][i2];
if( rIdxPrev == 0 ) arrData[rIdxPrev][i2] = 0;
}
}
return(true);
}
//+------------------------------------------------------------------+
//| testbwaShift2DimArrayOfDoubles() |
//+------------------------------------------------------------------+
void test_bwaShift2DimArrayOfInt()
{
static int testDataIn[5][2] =
{
11, 12,
21, 13,
31, 14,
41, 15,
51, 16
};
static int testDataOut[5][2] =
{
0, 0,
11, 12,
21, 13,
31, 14,
41, 15
};
int arr1[5][2];
ArrayCopy( arr1, testDataIn, 0, 0, WHOLE_ARRAY );
bool bSuccess = bwaShift2DimArrayOfInt(arr1, 5, 2);
if( bSuccess == false ) Print("Test Failed: testbwaShift2DimArrayOfInt()");
else {
bSuccess = bwaCompare2DimArrayOfInt( arr1, testDataOut, 5, 2);
if( bSuccess == false ) Print("Test Failed: testbwaShift2DimArrayOfInt()");
else Print("Test Passed: testbwaShift2DimArrayOfInt()");
}
}