Einzelnen Beitrag anzeigen
  #5 (permalink)  
Alt 21.12.16
Kronenchakra Kronenchakra ist offline
Gesperrter Benutzer
 
Registriert seit: Feb 2016
Ort: 2100 Österreich
Beiträge: 313
Kronenchakra befindet sich auf einem aufstrebenden Ast
Lightbulb Indexbuffer / Plotbuffer ich denke ich hab das Problem durchschaut

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);
}

Geändert von Kronenchakra (21.12.16 um 20:22 Uhr) Grund: Ergänzung