I have been learning more MQL4 and have been trying to get the hang of arrays, which is going OK but I have noticed a problem with iMAonArray. I have scoured the internet for most of the weekend and I can't find anybody else reporting the problem so I am guessing I am doing something wrong but for my life I cannot work out what that might be.
1st is the HiLoDeltaAV doesn't work properly at all
The problem is, when I apply the iMAonArray to the whole array for either MA, it doesn't calculate it properly. I am looking for a 4 Period SMA, and when I set the iMAonArray to only cover the last four bars of the array, it calculates it correctly. However when I set the the iMAonArray to use the entire array I *think* it is calculating the average against all bars, rather than a 4-period SMA, but either way it isn't calculating correctly. I have attached the work I have done so far.
You will notice that I have multiple loops, this was an attempt to fix the problem, as well as initializing the array and setting it as series (I have tried it in both directions),
If anybody could spare a minute to give me any tips I would be grateful.
Many thanks in advance
Code: Select all
//+------------------------------------------------------------------+
//| Candle Price Action.mq4 |
//| itsbigyellow |
//+------------------------------------------------------------------+
#property copyright "itsbigyellow"
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_color1 DarkGray
#property indicator_color2 Red
#property indicator_color3 DarkGray
#property indicator_color4 Green
#property indicator_color5 Green
#property indicator_color6 Red
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width4 2
#property indicator_width5 4
#property indicator_width6 4
//
//
//
//
//
double Buffer1[];
double OpClDeltaAv[10000];
double Buffer3[];
double HiLoDeltaAv[10000];
double Buffer5[];
double Buffer6[];
double Multiplier=0;
double CalculateNormalizedDigits()
{
// If there are 3 or fewer digits (JPY, for example), then return 0.01, which is the pip value.
if (Digits == 5){
return(0.0001);
}
// If there are 4 or more digits, then return 0.0001, which is the pip value.
else if (Digits ==4 ){
return(0.001);
}
else if (Digits ==3 ){
return(0.01);
}
else if (Digits ==2 ){
return(0.1);
}
// In all other cases, return 0.
else return(1);
}
double nDigits = CalculateNormalizedDigits();
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//
//
//
//
//
int init()
{
SetIndexBuffer(0,Buffer1);
SetIndexBuffer(1,OpClDeltaAv);
SetIndexBuffer(2,Buffer3);
SetIndexBuffer(3,HiLoDeltaAv);
SetIndexBuffer(4,Buffer5);
SetIndexBuffer(5,Buffer6);
SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexStyle(1,DRAW_LINE);
SetIndexStyle(2,DRAW_HISTOGRAM);
SetIndexStyle(3,DRAW_LINE);
SetIndexStyle(4,DRAW_HISTOGRAM);
SetIndexStyle(5,DRAW_HISTOGRAM);
SetIndexLabel(1,"OpClDeltaAv");
SetIndexLabel(3,"HiLoDeltaAv");
IndicatorShortName("Candle Price Action");
IndicatorDigits(2);
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int countedBars = IndicatorCounted();
int limit, i;
if(countedBars<0) return(-1);
if(countedBars>0) countedBars--;
limit = Bars-countedBars;
double HiLoDelta[10000];
double OpClDelta[10000];
ArrayInitialize(HiLoDeltaAv,EMPTY_VALUE);
ArraySetAsSeries (OpClDeltaAv,true);
ArraySetAsSeries (HiLoDeltaAv,true);
for(i=limit; i>=0; i--)
{
if (Open[i]>=Close[i]) {OpClDelta[i]=(Open[i]-Close[i])/nDigits;}
if (Close[i]>Open[i]) {OpClDelta[i]=(Close[i]-Open[i])/nDigits;}
}
for(i=limit; i>=0; i--)
{
HiLoDelta[i] = (High[i]-Low[i])/nDigits;
}
for(i=limit; i>=0; i--)
{
OpClDeltaAv[i] = iMAOnArray(OpClDelta,0,4,0,MODE_SMA,i);
//Print("[0] "+HiLoDelta[0]+" [1] "+HiLoDelta[1]+" [2] "+HiLoDelta[2]+" [3] "+HiLoDelta[3]+ " [4] "+HiLoDelta[4] );
}
for(i=limit; i>=0; i--)
{
HiLoDeltaAv[i] = iMAOnArray(HiLoDelta,0,4,0,MODE_SMA,i);
//Print("[0] "+HiLoDelta[0]+" [1] "+HiLoDelta[1]+" [2] "+HiLoDelta[2]+" [3] "+HiLoDelta[3]+ " [4] "+HiLoDelta[4] );
}
for(i=limit; i>=0; i--)
{
if (OpClDelta[i+1] > (OpClDeltaAv[i+1]*1.25) && HiLoDelta[i+1] > (HiLoDeltaAv[i+1]*1.25) ){
Buffer5[i] = HiLoDelta[i];
Buffer1[i] = OpClDelta[i];
Buffer3[i] = 0;
} else {
Buffer5[i] = 0;
Buffer1[i] = OpClDelta[i];
Buffer3[i] = HiLoDelta[i];
}
}
for(i=limit; i>=0; i--)
{
if (OpClDelta[i+1] > (OpClDeltaAv[i+1]*1.25) && HiLoDelta[i+1] > (HiLoDeltaAv[i+1]*1.25) ){
Buffer6[i] = HiLoDelta[i];
Buffer1[i] = OpClDelta[i];
Buffer3[i] = 0;
} else {
Buffer6[i] = 0;
Buffer1[i] = OpClDelta[i];
Buffer3[i] = HiLoDelta[i];
}
}
return(0);
}