MQL5: ALMA Indikator durch einfache EMA-200 Linie erweitert - Plot wird nicht mehr angezeigt.

 

Hallo allerseits,

bevor Sie mir das Handbuch vor die Füße werfen und mich wegschicken, bestätige ich bitte, dass ich alles Mögliche versucht und recherchiert habe. Vielleicht liegt in meinem bearbeiteten Code ein einfaches Missverständnis vor, aber ich kann es nicht allein herausfinden.

1.) Ich habe den ALMA-Indikator V2 genommen und wollte nur den EMA-200 hinzufügen. Ich weiß, dass ich das tun kann, indem ich einen zweiten Indikator in das Diagramm einfüge, aber ich möchte den EMA-200 im Code weiter verwenden, um den Trend zu bestätigen und eine Art Alarm oder Kauf- und Verkaufs-Pfeil zu erstellen, wenn sich der ALMA-Trend ändert. Ich mache das, um eine Strategie zu überprüfen, bevor ich mit der Erstellung eines EA fortfahre.

2.) Der grundlegende ALMA-Indikator funktioniert gut, aber wenn ich versuche, den iMA(_symbol, Current_timeframe, 200, ..... )-Handle hinzuzufügen und alle notwendigen Schritte auszuführen, um die Daten in ein Array zu bekommen, wird das Diagramm nicht angezeigt.
Tatsächlich macht es sowohl das Alma-Trenddiagramm als auch das EMA-200-Diagramm zunichte.

3.) Ich habe alle CopyBuffer-Fehler selbst behoben, sodass die Array-Größen usw. alle passen.

4.) Ich habe es geprüft und das Ungewöhnlichste ist, dass der Indikator von latestbar = Index von total_rates-1 zählt... und der erste Balken links im Diagramm ist offensichtlich array[0]

5.) Ich habe ArrayAsSeries(EMALine,FALSE) festgelegt, da dies zu funktionieren schien.

6.) Ich habe die (neuesten) ALMA- und EMA-Werte oben rechts in einem Kommentar in der linken oberen Ecke aufgetragen – dies dient der Überprüfung, ob sich tatsächlich Daten im Array befinden.

7.) wenn man die Alma entfernt und durch die EMA-Linie ersetzt: nichts passiert. Es ist, als ob es keine Daten zum Aufzeichnen gäbe.

8.) Mir ist aufgefallen, dass auch der Kurzname PlotIndexSetString(0,PLOT_LABEL,"ALMA_v2["+timeframeToString(TimeFrame)+"]");

PlotIndexSetString(1,PLOT_LABEL,"EMA_["+IntegerToString(inpEMAPer)+"]");

schlägt fehl. Wie im Screenshot zu sehen, zeigen beide Diagramme den gleichen Namen. Was zum Teufel ist hier los?


9.) Ich weiß nicht, wo ich den Fehler suchen soll. Liegt er im oberen OnInit-Bereich beim Setzen des Buffers? Oder liegt der Fehler beim Einpflegen der Daten per ForLoop und byCopyBuffer ?

10.) Ich markiere die hinzugefügten Sachen gelb

Bitte helft mir! Oder zeigt mir einen Indikator , der das richtig eingestellt hat? Ich habe in der Vergangenheit einige Indikatoren im MQL erstellt, auch von Grund auf, also verstehe ich nicht wirklich, warum ich mit diesem hier scheitere. Aber natürlich ist Reverse Engineering und das Hinzufügen von Dingen nicht einfach.

DANKE SCHÖN!

//+------------------------------------------------------------------+

//|                                                      ALMA_v2.mq5 |

//|                   ALMA by Arnaud Legoux / Dimitris Kouzis-Loukas |

//|                                             www.arnaudlegoux.com |

//|                         Written by IgorAD,igorad2003@yahoo.co.uk |

//|            http://finance.groups.yahoo.com/group/TrendLaboratory |

//+------------------------------------------------------------------+

#property copyright ""

#property link      ""

#property description "Adapted ALMA Indicator including the EMA-200 2024"



#property indicator_chart_window

#property indicator_buffers 5

#property indicator_plots   2



#property indicator_type1   DRAW_COLOR_LINE

#property indicator_color1  Silver,DeepSkyBlue,OrangeRed

#property indicator_width1  2

#property indicator_label1   "ALMA"



#property indicator_type2   DRAW_COLOR_LINE

#property indicator_color2  clrAquamarine

#property indicator_width2  2

#property indicator_style2  STYLE_DASH



input ENUM_TIMEFRAMES      TimeFrame   =     0;

input ENUM_APPLIED_PRICE   Price       = PRICE_CLOSE; //Apply to

input int                  Length      =     9;       //Window Size

input double               Sigma       =   6.0;       //Sigma parameter

input double               Offset      =  0.85;       //Offset of Gaussian distribution (0...1)

input int                  Shift       =     1;       //Shift in Bars

input int                  inpEMAPer   =   200;       //EMA Period

input int                  ColorMode   =     1;       //Color Mode(0-off,1-on)



double  alma[];

double  trend[];

double  price[];

double  EMALine_BUF[];

double  EMALine[];



ENUM_TIMEFRAMES  tf;

int      mtf_handle, Price_handle, barsTotal, ema_handle;

bool     runonce;

double   W[], mtf_alma[1], mtf_trend[1];

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

void OnInit()

  {

   if(TimeFrame <= Period())

      tf = Period();

   else

      tf = TimeFrame;

//--- indicator buffers mapping

   SetIndexBuffer(0,alma, INDICATOR_DATA);

   SetIndexBuffer(1,EMALine,INDICATOR_DATA);

   SetIndexBuffer(2,trend, INDICATOR_COLOR_INDEX);

   SetIndexBuffer(3,price,INDICATOR_CALCULATIONS);

   SetIndexBuffer(4,EMALine_BUF,INDICATOR_CALCULATIONS);





//---

   PlotIndexSetInteger(1,PLOT_LINE_COLOR,clrAquamarine);

   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_COLOR_LINE);

   PlotIndexSetInteger(1,PLOT_LINE_WIDTH,2);

   PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_DASH);



//---

   PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,3);

   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,Length+1);

   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,Length+1);

//---

   PlotIndexSetInteger(0,PLOT_SHIFT,Shift);

   PlotIndexSetInteger(1,PLOT_SHIFT,Shift);

//---

   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);

//---

//   string short_name = "ALMA_v2["+timeframeToString(TimeFrame)+"]("+priceToString(Price)+","+(string)Length+","+(string)Sigma+","+(string)Offset+")";

   string short_name = "ALMA_v2";

   IndicatorSetString(INDICATOR_SHORTNAME,short_name);

   PlotIndexSetString(0,PLOT_LABEL,"ALMA_v2["+timeframeToString(TimeFrame)+"]");

   PlotIndexSetString(1,PLOT_LABEL,"EMA_["+IntegerToString(inpEMAPer)+"]");



//---

   Price_handle = iMA(_Symbol,TimeFrame,1,0,0,Price);

   ema_handle   = iMA(_Symbol,PERIOD_CURRENT,inpEMAPer,0,MODE_EMA,PRICE_CLOSE);





   if(TimeFrame > 0)

      //mtf_handle = iCustom(NULL,TimeFrame,"ALMA_v2",0,Price,Length,Sigma,Offset,Shift,ColorMode);

      mtf_handle=iMA(_Symbol,PERIOD_CURRENT,inpEMAPer*2,0,MODE_EMA,PRICE_CLOSE);  // THATS JUST FOR THE SAKE OF BACKTESTING. the above ICustom works fine, but can't be backtested!

   else

     {

      ArrayResize(W,Length);



      double m = MathFloor(Offset*(Length - 1));

      double s = Length/Sigma;

      double wSum = 0;

      for(int i=0;i < Length;i++)

        {

         W[i] = MathExp(-((i-m)*(i-m))/(2*s*s));

         wSum += W[i];

        }



      for(int i=0;i < Length;i++)

         W[i] = W[i]/wSum;

     }



   barsTotal = iBars(_Symbol, PERIOD_CURRENT);

   ArraySetAsSeries(EMALine_BUF,false);

   ArraySetAsSeries(EMALine,false);



   runonce = false;

   ChartSetString(0, CHART_COMMENT, "");



   Print("ALMA INDICATOR INITIALIZED");

//--- initialization done

  }





//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

   if(Price_handle!=INVALID_HANDLE)

      IndicatorRelease(Price_handle);

   if(ema_handle!=INVALID_HANDLE)

      IndicatorRelease(ema_handle);

   ChartSetString(0, CHART_COMMENT, "");



   Print("Indicator \"ALMA\" stopped");



  }







//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

int OnCalculate(const int rates_total,const int prev_calculated,

                const datetime &Time[],

                const double   &Open[],

                const double   &High[],

                const double   &Low[],

                const double   &Close[],

                const long     &TickVolume[],

                const long     &Volume[],

                const int      &Spread[])

  {

   int x, y, shift, limit, mtflimit, copied = 0;

   datetime mtf_time;









//-- CHECK ON NEW BAR

   int bars = iBars(_Symbol, PERIOD_CURRENT);

   if(barsTotal != bars)

     {

      barsTotal = bars;

      ChartSetString(0, CHART_COMMENT, "EMA: "+DoubleToString(EMALine[rates_total-1],_Digits) + "\n" +

                     "ALMA: " + DoubleToString(alma[rates_total-1],_Digits));





     }//---END CHECK OF NEW BAR done







//--- preliminary calculations

   if(prev_calculated == 0)

     {

      limit  = 0;

      mtflimit = rates_total - 1;

      ArrayInitialize(alma,EMPTY_VALUE);

      ArrayResize(EMALine,mtflimit+1);

      ArrayInitialize(EMALine,EMPTY_VALUE);

     }

   else

     {

      limit = rates_total - 1;

      mtflimit = rates_total - prev_calculated + PeriodSeconds(tf)/PeriodSeconds(Period());

     }

   copied = CopyBuffer(Price_handle,0,Time[rates_total-1],Time[0],price);



   if(copied < 0)

     {

      Print("not all prices copied. Will try on next tick Error =",GetLastError(),", copied =",copied);

      return(0);

     }



   if(CopyBuffer(ema_handle,0,Time[rates_total-1],Time[0],EMALine_BUF) < 0)

      Print("EMA_BUFFER_COPY ERROR: ",GetLastError());





//--- the main loop of calculations

   if(tf > Period())

     {

      ArraySetAsSeries(Time,true);



      for(shift=0,y=0;shift<mtflimit;shift++)

        {

         if(Time[shift] < iTime(NULL,TimeFrame,y))

            y++;

         mtf_time = iTime(NULL,TimeFrame,y);



         copied = CopyBuffer(mtf_handle,0,mtf_time,mtf_time,mtf_alma);

         if(copied <= 0)

            return(0);

         x = rates_total - shift - 1;

         alma[x] = mtf_alma[0];



         if(ColorMode > 0)

           {

            copied = CopyBuffer(mtf_handle,1,mtf_time,mtf_time,mtf_trend);

            if(copied <= 0)

               return(0);

            trend[x] = mtf_trend[0];

           }

         else

            trend[x] = 0;

        }

     }

   else

     {

      for(shift=limit;shift<rates_total;shift++)

        {

         if(shift < Length)

            continue;

         double sum = 0.0;

         for(int i = 0; i < Length; i++)

            sum += price[shift-(Length - 1 - i)]*W[i];



         alma[shift] = sum;



         if(shift < Length + 2)

            continue;



         if(shift > 0)

           {

            if(ColorMode > 0 && alma[shift-1] > 0)

              {

               trend[shift] = trend[shift-1];

               if(alma[shift] > alma[shift-1])

                  trend[shift] = 1;

               if(alma[shift] < alma[shift-1])

                  trend[shift] = 2;

              }

            else

               trend[shift] = 0;

           }

        }

     }

//ArrayReverse(EMALine_BUF,WHOLE_ARRAY);

// I thought, maybe I limit it down to 1000 to save resources, but still no plot

   for(shift=rates_total-1000;shift<rates_total;shift++)

     {

      EMALine[shift] = EMALine_BUF[shift-1];



     }



   if(!runonce)

     {

      Comment("EMA: "+DoubleToString(EMALine[rates_total-1],_Digits) + "\n" +

              "ALMA: " + DoubleToString(alma[rates_total-1],_Digits));



      runonce = true;

     } // -- END RUN ONCE



   return(rates_total);

  }

//+------------------------------------------------------------------+

string timeframeToString(ENUM_TIMEFRAMES TF)

  {

   switch(TF)

     {

      case PERIOD_CURRENT  :

         return("Current");

      case PERIOD_M1       :

         return("M1");

      case PERIOD_M2       :

         return("M2");

      case PERIOD_M3       :

         return("M3");

      case PERIOD_M4       :

         return("M4");

      case PERIOD_M5       :

         return("M5");

      case PERIOD_M6       :

         return("M6");

      case PERIOD_M10      :

         return("M10");

      case PERIOD_M12      :

         return("M12");

      case PERIOD_M15      :

         return("M15");

      case PERIOD_M20      :

         return("M20");

      case PERIOD_M30      :

         return("M30");

      case PERIOD_H1       :

         return("H1");

      case PERIOD_H2       :

         return("H2");

      case PERIOD_H3       :

         return("H3");

      case PERIOD_H4       :

         return("H4");

      case PERIOD_H6       :

         return("H6");

      case PERIOD_H8       :

         return("H8");

      case PERIOD_H12      :

         return("H12");

      case PERIOD_D1       :

         return("D1");

      case PERIOD_W1       :

         return("W1");

      case PERIOD_MN1      :

         return("MN1");

      default              :

         return("Current");

     }

  }



//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

string priceToString(ENUM_APPLIED_PRICE app_price)

  {

   switch(app_price)

     {

      case PRICE_CLOSE   :

         return("Close");

      case PRICE_HIGH    :

         return("High");

      case PRICE_LOW     :

         return("Low");

      case PRICE_MEDIAN  :

         return("Median");

      case PRICE_OPEN    :

         return("Open");

      case PRICE_TYPICAL :

         return("Typical");

      case PRICE_WEIGHTED:

         return("Weighted");

      default            :

         return("");

     }

  }



//+------------------------------------------------------------------+



//+------------------------------------------------------------------+



//+------------------------------------------------------------------+
 

Bin gerade am Sprung, aber im Datenfenster werden die Preise unter der Maus angezeigt, daher bitte noch mal mit Zeitangabe auf dem Chart, also in Comment().

Wenn es da (Chart - Datenfenster) aber einen Unterschied geben sollte, kann man das auch mit dem Debugger herausfinden.

 
Carl Schreiber #:

Bin gerade am Sprung, aber im Datenfenster werden die Preise unter der Maus angezeigt, daher bitte noch mal mit Zeitangabe auf dem Chart, also in Comment().

Wenn es da (Chart - Datenfenster) aber einen Unterschied geben sollte, kann man das auch mit dem Debugger herausfinden.

DANKE für Deine Rückmeldung

Aha, ja, Danke, kann ich dazu fügen. Guter Plan.

Ich habe den Code nochmal neu aufgebaut und bin auf ein Paar FEhlerchen gestoßen.
Ich habe es nun geschafft, dass beide Kurven schon mal angezeigt werden.

Allerdings zeigt er mir die EMA Linie immer noch nicht im Datenfenster an.

Die EMA Linie wird nicht korrekt dargestellt. Irgendwas hat es da mit dem CopyBuffer und dem Auflösen auf der Zeitachse.
Ich habe die CopyBuffer und die Shift-Buffer Logk nochmal korrigiert und das ganze in eine eigene FUnktion gesteckt.

DIese FUnktion wird 2x aufgerufen. Einmal ganz zu Beginn, und dann nur mehr 1x pr neuer Kerze.
Das ganze shiftet um 1 um stabile Signale zu haben. (kein Repainting)

//+------------------------------------------------------------------+
//|                                                     ALMA-EMA.mq5 |
//|                   ALMA by Arnaud Legoux / Dimitris Kouzis-Loukas |
//|                                             www.arnaudlegoux.com |
//|                         Written by IgorAD,igorad2003@yahoo.co.uk |
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |
///+------------------------------------------------------------------+
#property copyright "adapted by Peter Kreißl 2024"
#property link      "https://www.freimprovisation.net"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots   2
//--- plot ALMA
#property indicator_label1  "ALMA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Silver,DeepSkyBlue,OrangeRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- plot EMA
#property indicator_label2  "EMA"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrAquamarine
#property indicator_style2  STYLE_DASH
#property indicator_width2  2

#property indicator_type1   DRAW_COLOR_LINE
#property indicator_color1  Silver,DeepSkyBlue,OrangeRed
#property indicator_width1  2
#property indicator_label1   "ALMA"

#property indicator_type3   INDICATOR_COLOR_INDEX
#property indicator_type4   INDICATOR_CALCULATIONS

//--- input parameters
input ENUM_TIMEFRAMES      TimeFrame=0;
input ENUM_APPLIED_PRICE   Price = PRICE_CLOSE;
input int                  Length=9;
input double               Sigma=6.0;
input double               Offset=0.85;
input int                  inpEMAPer=200;
input int                  ColorMode=1;
input int                  Shift=1;

//--- indicator buffers
double         ALMABuffer[];
double         EMABuffer[];

double  trend[];
double  price[];

//--- VARIABLES

ENUM_TIMEFRAMES  tf;
int      mtf_handle, Price_handle, barsTotal, ema_handle;
bool     runonce;
double   W[], mtf_alma[1], mtf_trend[1];
string str_commtext = "";


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(TimeFrame <= Period())
      tf = Period();
   else
      tf = TimeFrame;

//--- indicator buffers mapping
   SetIndexBuffer(0,ALMABuffer,INDICATOR_DATA);
   SetIndexBuffer(1,trend, INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,price,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,EMABuffer,INDICATOR_DATA);

//---
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,Length+1);
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,Length+1);
//---
//   PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
//   PlotIndexSetInteger(3,PLOT_SHIFT,Shift);
//---
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---
//   string short_name = "ALMA_v2["+timeframeToString(TimeFrame)+"]("+priceToString(Price)+","+(string)Length+","+(string)Sigma+","+(string)Offset+")";
   string short_name = "ALMA_v2";
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
   PlotIndexSetString(0,PLOT_LABEL,"ALMA_v2["+timeframeToString(TimeFrame)+"]");
   PlotIndexSetString(3,PLOT_LABEL,"EMA_["+IntegerToString(inpEMAPer)+"]");  // DAS HIER WIRD IGNORIERT!???
 
//---
   Price_handle = iMA(_Symbol,TimeFrame,1,0,0,Price);
   ema_handle   = iMA(_Symbol,_Period,inpEMAPer,0,MODE_EMA,PRICE_CLOSE);


   if(TimeFrame > 0)
      //mtf_handle = iCustom(NULL,TimeFrame,"ALMA_v2",0,Price,Length,Sigma,Offset,Shift,ColorMode);
      mtf_handle=iMA(_Symbol,_Period,inpEMAPer*2,0,MODE_EMA,PRICE_CLOSE);
   else
     {
      ArrayResize(W,Length);

      double m = MathFloor(Offset*(Length - 1));
      double s = Length/Sigma;
      double wSum = 0;
      for(int i=0;i < Length;i++)
        {
         W[i] = MathExp(-((i-m)*(i-m))/(2*s*s));
         wSum += W[i];
        }

      for(int i=0;i < Length;i++)
         W[i] = W[i]/wSum;
     }

   barsTotal = iBars(_Symbol, PERIOD_CURRENT);
   ArraySetAsSeries(EMABuffer,false);

   runonce = false;
   ChartSetString(0, CHART_COMMENT, "");

   Print("ALMA INDICATOR INITIALIZED");
//--- initialization done
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Custom indicator DEINIT  function                                |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(Price_handle!=INVALID_HANDLE)
      IndicatorRelease(Price_handle);
   if(ema_handle!=INVALID_HANDLE)
      IndicatorRelease(ema_handle);
   ChartSetString(0, CHART_COMMENT, "");

   Print("Indicator \"ALMA\" stopped");
//DEINIT done

  }


//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,const int prev_calculated,
                const datetime &Time[],
                const double   &Open[],
                const double   &High[],
                const double   &Low[],
                const double   &Close[],
                const long     &TickVolume[],
                const long     &Volume[],
                const int      &Spread[])
  {
   int x, y, shift, limit, mtflimit, copied = 0;
   datetime mtf_time;


//--- preliminary calculations
   if(prev_calculated == 0)
     {
      limit  = 0;
      mtflimit = rates_total - 1;
      ArrayInitialize(ALMABuffer,EMPTY_VALUE);
      ArrayResize(EMABuffer,mtflimit+1);
      ArrayInitialize(EMABuffer,EMPTY_VALUE);
     }
   else
     {
      limit = rates_total - 1;
      mtflimit = rates_total - prev_calculated + PeriodSeconds(tf)/PeriodSeconds(Period());
     }
   copied = CopyBuffer(Price_handle,0,Time[rates_total-1],Time[0],price);

   if(copied < 0)
     {
      Print("not all prices copied. Will try on next tick Error =",GetLastError(),", copied =",copied);
      return(0);
     }



//--- the main loop of calculations
   if(tf > Period())
     {
      ArraySetAsSeries(Time,true);

      for(shift=0,y=0;shift<mtflimit;shift++)
        {
         if(Time[shift] < iTime(NULL,TimeFrame,y))
            y++;
         mtf_time = iTime(NULL,TimeFrame,y);

         copied = CopyBuffer(mtf_handle,0,mtf_time,mtf_time,mtf_alma);
         if(copied <= 0)
            return(0);
         x = rates_total - shift - 1;
         ALMABuffer[x] = mtf_alma[0];

         if(ColorMode > 0)
           {
            copied = CopyBuffer(mtf_handle,1,mtf_time,mtf_time,mtf_trend);
            if(copied <= 0)
               return(0);
            trend[x] = mtf_trend[0];
           }
         else
            trend[x] = 0;
        }
     }
   else
     {
      for(shift=limit;shift<rates_total;shift++)
        {
         if(shift < Length)
            continue;
         double sum = 0.0;
         for(int i = 0; i < Length; i++)
            sum += price[shift-(Length - 1 - i)]*W[i];

         ALMABuffer[shift] = sum;

         if(shift < Length + 2)
            continue;

         if(shift > 0)
           {
            if(ColorMode > 0 && ALMABuffer[shift-1] > 0)
              {
               trend[shift] = trend[shift-1];
               if(ALMABuffer[shift] > ALMABuffer[shift-1])
                  trend[shift] = 1;
               if(ALMABuffer[shift] < ALMABuffer[shift-1])
                  trend[shift] = 2;
              }
            else
               trend[shift] = 0;
           }
        }
     }

   if(!runonce)
     {
      F_getArraysAndShift(rates_total);

      str_commtext = "EMA: "+DoubleToString(EMABuffer[rates_total-1],_Digits) + "....." +
                     "Date: " + TimeToString(Time[rates_total-1],TIME_DATE) + "....." +
                     "Time: " + TimeToString(Time[rates_total-1],TIME_MINUTES) + "\n" +
                     "Bar Number: " + IntegerToString(rates_total-1) + "\n" +
                     "ALMA: " + DoubleToString(ALMABuffer[rates_total-1],_Digits);
      Comment(str_commtext);

      runonce = true;
     } // -- END RUN ONCE




//-- CHECK ON NEW BAR
   int bars = iBars(_Symbol, PERIOD_CURRENT);
   if(barsTotal != bars)
     {
      F_getArraysAndShift(rates_total);
      str_commtext = "EMA: "+DoubleToString(EMABuffer[rates_total-1],_Digits) + "....." +
                     "Date: " + TimeToString(Time[rates_total-1],TIME_DATE) + "....." +
                     "Time: " + TimeToString(Time[rates_total-1],TIME_MINUTES) + "\n" +
                     "Bar Number: " + IntegerToString(rates_total-1) + "\n" +
                     "ALMA: " + DoubleToString(ALMABuffer[rates_total-1],_Digits);
      ChartSetString(0, CHART_COMMENT, str_commtext);

      barsTotal = bars;
     }//---END CHECK OF NEW BAR done
   return(rates_total);   } //+------------------------------------------------------------------+ string timeframeToString(ENUM_TIMEFRAMES TF)   {    switch(TF)      {       case PERIOD_CURRENT  :          return("Current");       case PERIOD_M1       :          return("M1");       case PERIOD_M2       :          return("M2");       case PERIOD_M3       :          return("M3");       case PERIOD_M4       :          return("M4");       case PERIOD_M5       :          return("M5");       case PERIOD_M6       :          return("M6");       case PERIOD_M10      :          return("M10");       case PERIOD_M12      :          return("M12");       case PERIOD_M15      :          return("M15");       case PERIOD_M20      :          return("M20");       case PERIOD_M30      :          return("M30");       case PERIOD_H1       :          return("H1");       case PERIOD_H2       :          return("H2");       case PERIOD_H3       :          return("H3");       case PERIOD_H4       :          return("H4");       case PERIOD_H6       :          return("H6");       case PERIOD_H8       :          return("H8");       case PERIOD_H12      :          return("H12");       case PERIOD_D1       :          return("D1");       case PERIOD_W1       :          return("W1");       case PERIOD_MN1      :          return("MN1");       default              :          return("Current");      }   } //+------------------------------------------------------------------+ //|                                                                  | //+------------------------------------------------------------------+ string priceToString(ENUM_APPLIED_PRICE app_price)   {    switch(app_price)      {       case PRICE_CLOSE   :          return("Close");       case PRICE_HIGH    :          return("High");       case PRICE_LOW     :          return("Low");       case PRICE_MEDIAN  :          return("Median");       case PRICE_OPEN    :          return("Open");       case PRICE_TYPICAL :          return("Typical");       case PRICE_WEIGHTED:          return("Weighted");       default            :          return("");      }   } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //|                                                                  | //+------------------------------------------------------------------+ void F_getArraysAndShift(int nrofbars)   {    if(tf == Period())      {       if(ArrayCopy(ALMABuffer, ALMABuffer, Shift, 0, nrofbars-1) < 0)         {          Print("EMA Shift Error:", GetLastError());         }      } // get the EMA BUFFER    if(CopyBuffer(ema_handle,0,0,nrofbars-1,EMABuffer) < 0)       Print("EMA_BUFFER_COPY ERROR: ",GetLastError());    if(ArrayCopy(EMABuffer, EMABuffer, Shift,0, nrofbars-1) < 0)      {       Print("EMA Shift Error:", GetLastError());      }   } //+------------------------------------------------------------------+
Dateien:
CLipALMA-EMA.jpg  210 kb
 
Wenn ich bei Timeframe die höhere Timeframe eingebe macht ALMA alles richtig... aber die EMA verschwindet.
Ich checks nicht. Mit einem normalen CopyBuffer sollte das doch klappen!??
Oder liegts am Time-frame Array?

Die ALMA wird über copyBuffer(handle, start time, end time, buffer) definiert
die EMA haue ich einfach über copyBuffer(handle, 0, rates_total-1, buffer) rein.

aber ich weiß nicht, wie ich es sonst auflösen könnte?
 
Hier anbei der aktualisierte code.
Ich habe weitere Funktionen hinzugefügt um die Errorcodes vom CopyBuffer endlich zu verstehen.
Dateien:
ALMA-EMA.mq5  89 kb
 
hab gerade noch einen Fehler gefunden:
Time[] ist natürlich per default setasSeries = TRUE.
im Comment() muss die aktuelle Zeit per Time[0] ausgelesen werden.

das heißt: Bar[0] = Bartime TIME[0]
EMA[VALUE] = EMA[rates_total-1]
ALMA[value] = ALMA[rates_total-1]


das scheint auch zu stimmen, nur die EMA WErte sind alles Blödsinn. Irgenwas stimmt da nicht.
Habe einen Knopf.. Mache jetzt eine Pause.
Wer auch immer mir helfen kann, BITTE DANKE
 

Die Ausrichtung der Puffer mit den versch. Daten ist verwirrend - für mich. Ich prüfe daher immer im Debugger welche Zeit dem Index 0 (älter oder aktuell) und der letzte Index entspricht.

Sie die Erklärung und die Beispiele in CopyBuffe.

 
Carl Schreiber #:

Die Ausrichtung der Puffer mit den versch. Daten ist verwirrend - für mich. Ich prüfe daher immer im Debugger welche Zeit dem Index 0 (älter oder aktuell) und der letzte Index entspricht.

Sie die Erklärung und die Beispiele in CopyBuffe.

Ja. Das ist verwirrend. 
Ich hab schon versucht die Ausrichtung vom EMA zu ändern. Setasseries = true. Es wird denn nichts angezeigt. 
 
PetziK #:
Ja. Das ist verwirrend. 
Ich hab schon versucht die Ausrichtung vom EMA zu ändern. Setasseries = true. Es wird denn nichts angezeigt. 

Deshalb der Debugger um zB. beim Aufwärtstrend, als wenn der EMA steigt zu erkennen, wo sind die höheren Werten bei 0 oder am anderen Ende.

Du kannst dann auch ein #define verwenden als Gedächtnisstütze

#define ÄltesterWert 0
#define ZweitÄltesterWert 1
#define DrittÄltesterWert 2
...

oder

#define JüngsterWert 0
...

je nachdem wie Du Dir Deine Puffer mit oder ohne ArraySetAsSeries() einrichtest.

 
Carl Schreiber #:

Deshalb der Debugger um zB. beim Aufwärtstrend, als wenn der EMA steigt zu erkennen, wo sind die höheren Werten bei 0 oder am anderen Ende.

Du kannst dann auch ein #define verwenden als Gedächtnisstütze

oder

je nachdem wie Du Dir Deine Puffer mit oder ohne ArraySetAsSeries() einrichtest.

Ja, das ist aber eh schon da:

es genügt mir ein Wert, ich sehe ja sofort, ob das stimmt oder nicht. Der EMA ist nicht weit weg vom ALMA
und bei TIME ist es ja noch eindeutiger.
Time[0] ist aktuelle Zeit
EMA[rates_total-1] aktueller Wert
ALMA[rates_total-1] aktueller Wert

 str_commtext = "EMA: "+DoubleToString(EMABuffer[rates_total-1],_Digits) + "....." +
                     "Date: " + TimeToString(Time[0],TIME_DATE) + "....." +
                     "Time: " + TimeToString(Time[0],TIME_MINUTES) + "\n" +
                     "Bar Number: " + IntegerToString(rates_total-1) + "\n" +
                     "ALMA: " + DoubleToString(ALMABuffer[rates_total-1],_Digits);
      Comment(str_commtext);
 

UPDATE des Indikators.

Funktionelle Verbesserung bei der Wahl der higher timeframes.
Korrektur der Timeframe im iMA()... für die EMA Linie.

Grundsätzliche Frage:
Der Ansatz, über handleEMA = iMA(xyz) einen existierenden MA Indikator aufzurufen,

und über den HAndle dann mittels CopyBuffer den Inidkator in den EMA200 IndikatorBuffer[] einzlesen ist schon richtig?

Oder muss ich die Were alle einzeln über eine FOR Schleife einlesen (so wie im MT4) ?

Es müsste doch genügen, den EMA Buffer mit jeder neuen Kerze aufzurufen, oder? Ich brauche die EMA Information nicht auf oder für jeden Tick, das ist Ressourcenverschwendung.

Derjenige, der den ALMA INdikator geschrieben hat, rechnet das auch auf jeden Tick, ich hatte schon versucht das zu reduzieren auf 1x am BEginn (run once) und dann auch nur mehr 1x je neuer Kerze.
Würde grundsätzlich funktionieren, aber das Problem mit dem fehlenden EMA im Plot besteht weiterhin.

Ich bin mir nicht sicher, ob es an der TimeSeries liegt? Irgendwie passen die zwei IndikatorBuffer nicht zusammen. 

Jedenfalls, anbei das update:

EDIT: Meiner Ansicht nach stimmen die PUFFWER WERTE Des EMABuffers.
Wenn man sich manuell den MA(200... MODE_EMA) Indikator drauflegt (rote Kurve) dann stimmt der Wert bei Bar[0].
Auch der WErt von Alma wird im Kommentar richtig angezeigt.

Warum also vesagt der PLOT?

Grund der Beschwerde: