Die Anzahl der Indexbuffer und Plottbuffer werden separat verwaltet und haben andere Indizes.
Das tritt nur dann auf wenn manColorLines etc definiert.
Ist nichts mit Color dabei sind diese Indizes ident.
Ich bin durch den T3_velocity indikator draufgekommen.
Der definiertColorline und ColorHistogram.
Ich habe noch Erklärungen als Comment hineingeschrieben
Hier der Code für MT5. Ist auf dynamische Definition der Buffer umgeschrieben
Code:
//------------------------------------------------------------------
// https://www.mql5.com/en/code/16838 von Mladen Rakic
//------------------------------------------------------------------
#property copyright "www.forex-tsd.com"
#property link "www.forex-tsd.com"
//------------------------------------------------------------------
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 2
//#property indicator_label1 "T3 velocity histo"
//#property indicator_type1 DRAW_COLOR_HISTOGRAM
//#property indicator_style1 STYLE_SOLID
//#property indicator_width1 2
//
//#property indicator_label2 "T3 velocity line"
//#property indicator_type2 DRAW_COLOR_LINE
//#property indicator_style2 STYLE_SOLID
//#property indicator_width2 2
input double T3Period = 12; // T3 velocity calculation period
input double T3Hot = 1.0; // T3 hot value
input bool T3Original = false; // T3 original Tillson calculation?
input int ColorNorm = 20; // Colors normalization period
input color ColorFrom = clrRed; // Color down
input color ColorTo = clrLime; // Color Up
input int ColorSteps = 20; // Color steps for drawing
double velL[]; // Line
double velH[]; // Histogram
double colorBufferL[]; // Line
double colorBufferH[]; // Histogram
int cSteps;
int OnInit()
{
SetIndexBuffer(0,velH,INDICATOR_DATA); // Indexbuffer werden einfach durchnummeriert,egal was der TYÜ ist
SetIndexBuffer(1,colorBufferH,INDICATOR_COLOR_INDEX); // ColorIndexes werden bei INDICATOR_COLOR_INDEX NICHT mitgezählt, wachreinlich auch bei INDICATOR_CALCULATIONS
SetIndexBuffer(2,velL,INDICATOR_DATA); // wird mitgezählt
SetIndexBuffer(3,colorBufferL,INDDICATOR_COLOR_INDEX); // wird nicht mitgezählt
PlotIndexSetString (0,PLOT_LABEL,"T3 velocity histo"); // PlotIndexes gehen jetzt von 0 bis 1
PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_COLOR_HISTOGRAM); // das muß man erst einmal behirnen !
PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);
PlotIndexSetString (1,PLOT_LABEL,"T3 velocity line");
PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_COLOR_LINE);
PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_SOLID);
PlotIndexSetInteger(1,PLOT_LINE_WIDTH,2);
cSteps = (ColorSteps>1) ? ColorSteps : 2;
PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,cSteps+1);
PlotIndexSetInteger(1,PLOT_COLOR_INDEXES,cSteps+1);
for (int i=0;i<cSteps+1;i++) PlotIndexSetInteger(0,PLOT_LINE_COLOR,i,gradientColor(i,cSteps+1,ColorFrom,ColorTo));
for (int i=0;i<cSteps+1;i++) PlotIndexSetInteger(1,PLOT_LINE_COLOR,i,gradientColor(i,cSteps+1,ColorFrom,ColorTo));
return(INIT_SUCCEEDED);
}
int OnCalculate (const int rates_total, // size of the price[] array
const int prev_calculated, // bars handled on a previous call
const int begin, // where the significant data start from
const double& price[]) // array to calculate
{
for (int i=(int)MathMax(prev_calculated-1,0); i<rates_total; i++)
{
velL[i] = iT3(price[i],T3Period,T3Hot ,T3Original,i,rates_total,0)-
iT3(price[i],T3Period,T3Hot/2.0,T3Original,i,rates_total,1);
velH[i] = velL[i];
double min = velL[i];
double max = velL[i];
double sto = 50;
for (int k=1; k<ColorNorm && (i-k)>=0; k++)
{
min = MathMin(min,velL[i-k]);
max = MathMax(max,velL[i-k]);
}
if (max!=min)
sto = 100*(velL[i]-min)/(max-min);
colorBufferL[i] = MathFloor(sto*cSteps/100.0);
colorBufferH[i] = MathFloor(sto*cSteps/100.0);
}
return(rates_total);
}
double workT3 [][12];
double workT3Coeffs[][12];
#define _period 0
#define _c1 1
#define _c2 2
#define _c3 3
#define _c4 4
#define _alpha 5
double iT3(double price, double period, double hot, bool original, int r, int bars, int instanceNo=0)
{
if (ArrayRange(workT3,0) != bars) ArrayResize(workT3,bars);
if (ArrayRange(workT3Coeffs,0) < (instanceNo+1)) ArrayResize(workT3Coeffs,instanceNo+1);
if (workT3Coeffs[instanceNo][_period] != period)
{
workT3Coeffs[instanceNo][_period] = period;
double a = hot;
workT3Coeffs[instanceNo][_c1] = -a*a*a;
workT3Coeffs[instanceNo][_c2] = 3*a*a+3*a*a*a;
workT3Coeffs[instanceNo][_c3] = -6*a*a-3*a-3*a*a*a;
workT3Coeffs[instanceNo][_c4] = 1+3*a+a*a*a+3*a*a;
if (original)
workT3Coeffs[instanceNo][_alpha] = 2.0/(1.0 + period);
else workT3Coeffs[instanceNo][_alpha] = 2.0/(2.0 + (period-1.0)/2.0);
}
int buffer = instanceNo*6;
if (r == 0)
{
workT3[r][0+buffer] = price;
workT3[r][1+buffer] = price;
workT3[r][2+buffer] = price;
workT3[r][3+buffer] = price;
workT3[r][4+buffer] = price;
workT3[r][5+buffer] = price;
}
else
{
workT3[r][0+buffer] = workT3[r-1][0+buffer]+workT3Coeffs[instanceNo][_alpha]*(price -workT3[r-1][0+buffer]);
workT3[r][1+buffer] = workT3[r-1][1+buffer]+workT3Coeffs[instanceNo][_alpha]*(workT3[r][0+buffer]-workT3[r-1][1+buffer]);
workT3[r][2+buffer] = workT3[r-1][2+buffer]+workT3Coeffs[instanceNo][_alpha]*(workT3[r][1+buffer]-workT3[r-1][2+buffer]);
workT3[r][3+buffer] = workT3[r-1][3+buffer]+workT3Coeffs[instanceNo][_alpha]*(workT3[r][2+buffer]-workT3[r-1][3+buffer]);
workT3[r][4+buffer] = workT3[r-1][4+buffer]+workT3Coeffs[instanceNo][_alpha]*(workT3[r][3+buffer]-workT3[r-1][4+buffer]);
workT3[r][5+buffer] = workT3[r-1][5+buffer]+workT3Coeffs[instanceNo][_alpha]*(workT3[r][4+buffer]-workT3[r-1][5+buffer]);
}
return(workT3Coeffs[instanceNo][_c1]*workT3[r][5+buffer] +
workT3Coeffs[instanceNo][_c2]*workT3[r][4+buffer] +
workT3Coeffs[instanceNo][_c3]*workT3[r][3+buffer] +
workT3Coeffs[instanceNo][_c4]*workT3[r][2+buffer]);
}
color getColor(int stepNo, int totalSteps, color from, color to)
{
double stes = (double)totalSteps-1.0;
double step = (from-to)/(stes);
return((color)round(from-step*stepNo));
}
color gradientColor(int step, int totalSteps, color from, color to)
{
color newBlue = getColor(step,totalSteps,(from & 0XFF0000)>>16,(to & 0XFF0000)>>16)<<16;
color newGreen = getColor(step,totalSteps,(from & 0X00FF00)>> 8,(to & 0X00FF00)>> 8) <<8;
color newRed = getColor(step,totalSteps,(from & 0X0000FF) ,(to & 0X0000FF) ) ;
return(newBlue+newGreen+newRed);
}
Vielleicht hift es anderen auch.
Grüße
Otto
PS: absolut geil ist der Farbverlauf
Code:
color getColor(int stepNo, int totalSteps, color from, color to)
{
double stes = (double)totalSteps-1.0;
double step = (from-to)/(stes);
return((color)round(from-step*stepNo));
}
color gradientColor(int step, int totalSteps, color from, color to)
{
color newBlue = getColor(step,totalSteps,(from & 0XFF0000)>>16,(to & 0XFF0000)>>16)<<16;
color newGreen = getColor(step,totalSteps,(from & 0X00FF00)>> 8,(to & 0X00FF00)>> 8) <<8;
color newRed = getColor(step,totalSteps,(from & 0X0000FF) ,(to & 0X0000FF) ) ;
return(newBlue+newGreen+newRed);
}