Indikator Grundlagen - Seite 3

Einloggen oder registrieren, um einen Kommentar zu schreiben
Otto Pauser
1368
Otto Pauser  

Das inf könnte für 'infinitely' (unendlich) stehen, ist mir noch nicht untergekommen.

Das mit den 2 Variablen in der for-schleife ist ok.

amando
1346
amando  
Otto Pauser:

Das inf könnte für 'infinitely' (unendlich) stehen, ist mir noch nicht untergekommen.

Das mit den 2 Variablen in der for-schleife ist ok.

das unendlich würde irgendwie passen, das würde auch den zeitweiligen Wert von -inf erklären


was mir aufgefallen ist,

bei MT4 war ja im Indicator noch erlaubt

for(i=limit; i>=0; i--)

das ist ja beim MT5 (scheinbar) nicht mehr erlaubt, ich muss in der for schleife + zählen oder?

bzw müsste ich sonst den Array mit ArraySetAsSeries(Array,false) initialisieren? nicht das es jetzt einen großen unterschied machen würde, aber rein der neugierde halber, da man ja im MT5 generell -- verwenden sollte


rein theoretisch darf ich ja in der for schleife für die Berechnung den MA verwenden

buffer1[i] = MA[i]*1.1;

welchen ich zuvor über

if(CopyBuffer(MA_Handle,0,0,iCopy,MA)!=iCopy) return(0); 

eingefügt habe oder seh ich das falsch?


interessanterweise den MA berechnet er noch richtig, zeichnet ihn richtig ein, 

aber dann bei der weiterverarbeitung bekomme ich eben den Array out of range.


Muss ich die Range noch definieren? das wäre mir ja so noch nicht untergekommen

Otto Pauser
1368
Otto Pauser  

In der for-schleife darfst du rauf UND runter zählen. Ist simples standard C.
Hast du den buffer1 als IndicatorBuffer definiert? Nur dann wird er für dich verwaltet. INDICATOR_CALCULATION.

Und der Debugger ist da natürlich auch sehr hilfreich. Diese 'Array_out_of_range' Fehler können dir sogar den Tester abstürzen lassen.

amando
1346
amando  

Hier hab ich eine Frage, und zwar bekomme ich beim dekompilieren immer einen Error

viel einfacher kann ich einen Code ja eigentlich gar nicht machen, Periode ist übrigens als input Periode = x definiert

     double test3=0;
     ArraySetAsSeries(open,true);
     ArraySetAsSeries(high,true);
     ArraySetAsSeries(low,true);
     ArraySetAsSeries(close,true);
     

     ArraySetAsSeries(Medium,true);

   
//--- main calculation loop 
   for(int i=0;i<rates_total && !IsStopped();i++) 
      {
      
    //  for(int j = Periode; j>0;j--)
      for(int j = 0; j < Periode; j++)
      {
         
         test3 += (open[i+j] + high[i+j]);
      }
      
      Medium[i]=test3;
        
      }


das funkt soweit, der Indi zeigt sogar was an

es verändern sich nur die Werte nicht, egal was ich für eine Periode nehme

und war schreit er in dieser Zeile

test3 =+ (open[i+j] + high[i+j])/2 ;

da gefällt ihm

open[i+j]

nicht, was ich natürlich nicht versehe


die Idee dahinter ist, ich kumuliere nur Open + High auf 

quasi sollte das dann aussehen

test 3 = (Open1+High1) / 2 + ........+ (openX + HighX)/2;

lassen wir die sinnhaftigkeit dahin, aber warum bekomme ich den Error.

Im Debugger sieht alles gut aus, da bekomme ich keinen Fehler


Edit: die Werte verändern sich schon, nur werden Sie mit zunehmender Periode kleiner statt größer

Carl Schreiber
Moderator
7661
Carl Schreiber  

Amando, mach Dir mal mit dem Degugger klar wie Deine Schleifen  laufen. Zugegeben das ist bei MQL5 ziemlich verwirrend!

Wenn das ein Indikator ist kannst Du ja im Debugger die Zeitpunkte und deren indices der verwendeten Preise anzeigen lassen: i, time[i], j, time[j], i+j, time{i+j] anzeigen lassen und dann überleg, welche Werte da wie berechnet werden.

Und vergiss nicht ganz oben im Debugger _LastError!

Otto Pauser
1368
Otto Pauser  
Carl Schreiber:

Amando, mach Dir mal mit dem Degugger klar wie Deine Schleifen  laufen. Zugegeben das ist bei MQL5 ziemlich verwirrend!

Wenn das ein Indikator ist kannst Du ja im Debugger die Zeitpunkte und deren indices der verwendeten Preise anzeigen lassen: i, time[i], j, time[j], i+j, time{i+j] anzeigen lassen und dann überleg, welche Werte da wie berechnet werden.

Und vergiss nicht ganz oben im Debugger _LastError!

  • Amando, mach Dir mal mit dem Degugger klar wie Deine Schleifen  laufen.
    Es kann hilfreich sein auf kariertem Papier sich die 'Zellen' des Arrays vorzustellen oder aufzuzeichnen.

  • Zugegeben das ist bei MQL5 ziemlich verwirrend!
    Das ist aber bei MQL4 ganz genauso, besonders bei verschachtelten Schleifen.

  • Zeitpunkte und deren indices der verwendeten Preise anzeigen lassen:
    StartIndex und EndIndex der Schleifen vorher berechnen und diese zu überprüfen bringt's.

  • Und vergiss nicht ganz oben im Debugger _LastError!
    ResetLastError() wird überbewertet, da _LastError beim Auftreten eines Fehlers sowieso verändert wird.
    Viele Funktionen (wie zB. CopyBuffer()) liefern im Fehlerfall WRONG_VALUE (-1).
    Erst dann ist der Aufruf von GetLastError() sinnvoll.

Ist alles Info für amando, ich kann es aber oben nicht mehr einfügen.

Zu dem obigen Codefragment denke ich daß da in der Grundstruktur was nicht passt.
Ich vermute amando meint etwa das:

   for(aussenschleife) 
      {
         test3=0;
         for(innenschleife)
         {
            test3 += (open[i+j] + high[i+j]);
         }
         Medium[i]=test3;
      }

Da raucht dir schon mal die Birne beim Berechnen der Indizes ;)

Otto Pauser
1368
Otto Pauser  

Ich frag mich halt ob es sinnvoll ist Indikatoren neu zu erfinden.

Da gibt es ziemlich komplexe wie den Hull, Ozymandias oder Regressionskanäle(linear oder n-ter Ordnung).
Als Einsteiger schnallt man das nicht und es sind auch profunde mathematische Grundlagen erforderlich.

Ich beschränke mich darauf bestehende Indikatoren zu überarbeiten und meinen Wünschen anzupassen.
Das ist nicht so viel Aufwand und kann einen EA deutlich entlasten.

Da ist einer meiner Lieblinge. Ein Simpler MA, der aber Signalbuffer besitzt die der EA lesen kann.

Kannst vielleicht brauchen:

//+------------------------------------------------------------------+
//|                                                         MYMA.mq5 |
//|                                Copyright © 2018 Ing. Otto Pauser |
//|                        https://www.mql5.com/de/users/kronenchakra|
//+------------------------------------------------------------------+

#property indicator_chart_window
#property indicator_buffers 5                   // ein buffer mehr für die farben
#property indicator_plots   4                   // 4 sichtbare buffer
                                                // simple abkürzungen
#define METHOD    ENUM_MA_METHOD
#define APRICE    ENUM_APPLIED_PRICE
#define BUFTYPE   ENUM_INDEXBUFFER_TYPE
#define DRAWTYPE  ENUM_DRAW_TYPE
#define LINESTYLE ENUM_LINE_STYLE

//+------------------------------------------------------------------+
input int      inp_MA_Period   =          50;   // Period
input METHOD   inp_MA_Method   =   MODE_LWMA;   // Method
input APRICE   inp_MA_APrice   = PRICE_CLOSE;   // Price
input uint     inp_MA_DeltaMin =           1;   // Delta Min for Signal (points)
input bool     inp_MA_ShowLine =        true;   // Show Line
input bool     inp_MA_ShowSign =        true;   // Show Signal
input uint     inp_MA_LWidth   =           1;   // Linewidth
input uint     inp_MA_SigSize  =           1;   // SignalSize
input uint     inp_MA_SIgSymb  =         159;   // Signalsymbol
//+------------------------------------------------------------------+

int    handle;                                  // handle für iMA
double Buffer[];                                // buffer für iMA
double ColBuf[];                                // buffer für die farben
color  Colors[3] = {clrRed,clrLime,clrGray};    // die farben

double sig_UP[];                                // buffer für signal rauf
double sig_DN[];                                // buffer für signal runter
double buf_DX[];                                // buffer für steigung (slope)

double delta, 
       deltaMin=inp_MA_DeltaMin;

string IndName = "MYMA("+IntegerToString(inp_MA_Period)+")";

int OnInit()
{
   DRAWTYPE DRAW_TYPE = inp_MA_ShowSign?DRAW_ARROW     :DRAW_NONE;
   DRAWTYPE DRAW_HLIN = inp_MA_ShowLine?DRAW_COLOR_LINE:DRAW_NONE;
   
   Indi.InitArrow (sig_DN,DRAW_TYPE,STYLE_SOLID,inp_MA_SigSize ,Colors[0],inp_MA_SIgSymb,0,"MYMA DN"   );
   Indi.InitArrow (sig_UP,DRAW_TYPE,STYLE_SOLID,inp_MA_SigSize ,Colors[1],inp_MA_SIgSymb,0,"MYMA UP"   );
   Indi.InitArrow (buf_DX,DRAW_NONE,STYLE_SOLID,inp_MA_SigSize ,Colors[2],inp_MA_SIgSymb,0,"MYMA Delta");
   Indi.ColorLine (Buffer,DRAW_HLIN,STYLE_SOLID,inp_MA_LWidth  ,Colors                    ,"MYMA Value");
   Indi.ColorIndex(ColBuf);

   for(int i=0; i<7; i++)
      PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,inp_MA_Period);

   IndicatorSetString (INDICATOR_SHORTNAME,IndName);
   
   handle=iMA(_Symbol,_Period,inp_MA_Period,0,inp_MA_Method,inp_MA_APrice);
   if(handle==INVALID_HANDLE)
      return(INIT_FAILED);

   return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
{
   int iStart=(prev_calculated==0)?1:prev_calculated-1;     // Startindex berechnen ACHTUNG nicht 0 sondern 1
   int iEnd  = rates_total-1;                               // Endindex berechnen
   int iCopy = iEnd-iStart+1;                               // amount of data to copy
   int bar;

   if(prev_calculated==0)
      {
         ArrayInitialize (Buffer,NULL);
         ArrayInitialize (sig_UP,NULL);
         ArrayInitialize (sig_DN,NULL);
         ArrayInitialize (buf_DX,NULL);
         ArrayInitialize (ColBuf,NULL);
      }
      
   CopyBuffer(handle,0,0,iCopy,Buffer);

   for(bar=iStart; bar<rates_total; bar++)                // main loop of the signal line coloring
      {
         delta=(Buffer[bar]-Buffer[bar-1])/_Point;
         buf_DX[bar]=delta;
         ColBuf[bar]=2;                                  // color clrGray
         sig_DN[bar]=NULL;                               // default no signal
         sig_UP[bar]=NULL;
         
         if(Buffer[bar-1]>Buffer[bar])                   // down
            {
               ColBuf[bar]=0;
               if(buf_DX[bar]< -deltaMin)
                  sig_DN[bar]=Buffer[bar];
            } 

         if(Buffer[bar-1]<Buffer[bar])                   // up
            {
               ColBuf[bar]=1; 
               if(buf_DX[bar]> +deltaMin)
                  sig_UP[bar]=Buffer[bar];
            } 
      }

   return(rates_total);
}

//+------------------------------------------------------------------+
//| sollte als buffer.mqh ausgelagert werden                         |
//+------------------------------------------------------------------+

class CIndi
{
   private:
      int   m_BufIdx;                                          // counter for bufferindex
   public:
      bool InitLine (double     &aBuffer[],                    // the buffer
                     DRAWTYPE    aDrwType  =DRAW_LINE,         // DRAW_NONE .. DRAW_COLOR_CANDLES
                     LINESTYLE   aLineStyle=STYLE_SOLID,       // STYLE_SOLID .. STYLE_DASHDOTDOT
                     int         aLineWidth=1,                 // PLOT_LINE_WIDTH
                     int         aLineColor=clrRed,            // PLOT_LINE_COLOR
                     string      aPlotLabel="",                // PLOT_LABEL - "Any String"
                     int         aPlotShift=0,                 // PLOT_SHIFT
                     bool        aAsSeries=false)              // SetAsSeries
                     {
                        SetIndexBuffer     (m_BufIdx,aBuffer,         INDICATOR_DATA);
                        PlotIndexSetInteger(m_BufIdx,PLOT_DRAW_TYPE,  aDrwType  );
                        PlotIndexSetInteger(m_BufIdx,PLOT_LINE_STYLE, aLineStyle);
                        PlotIndexSetInteger(m_BufIdx,PLOT_LINE_WIDTH, aLineWidth);
                        PlotIndexSetInteger(m_BufIdx,PLOT_LINE_COLOR, aLineColor);
                        PlotIndexSetString (m_BufIdx,PLOT_LABEL,      aPlotLabel);
                        PlotIndexSetInteger(m_BufIdx,PLOT_SHIFT,      aPlotShift);
                        PlotIndexSetDouble (m_BufIdx,PLOT_EMPTY_VALUE,NULL);
                        ArrayInitialize    (aBuffer ,NULL);
                        ArraySetAsSeries   (aBuffer ,aAsSeries);
                        m_BufIdx++;                            // increment bufferindex for next Init()
                        return(true);
                     }

      bool InitArrow(double     &aBuffer[],                    // the buffer
                     DRAWTYPE    aDrwType   =DRAW_ARROW,       // DRAW_NONE .. DRAW_COLOR_CANDLES
                     LINESTYLE   aLineStyle =STYLE_SOLID,      // STYLE_SOLID .. STYLE_DASHDOTDOT
                     int         aArrowSize =1,                // PLOT_LINE_WIDTH
                     int         aArrowColor=clrRed,           // PLOT_LINE_COLOR
                     int         aArrowCode =159,              // ArrowCode (Wingdings Number)
                     int         aArrowShift=0,                // PLOT_ARROW_SHIFT
                     string      aPlotLabel="",                // PLOT_LABEL - "Any String"
                     int         aPlotShift=0,                 // PLOT_SHIFT
                     bool        aAsSeries=false)              // SetAsSeries
                     {
                        SetIndexBuffer     (m_BufIdx,aBuffer,         INDICATOR_DATA);
                        PlotIndexSetInteger(m_BufIdx,PLOT_DRAW_TYPE,  aDrwType  );
                        PlotIndexSetInteger(m_BufIdx,PLOT_LINE_STYLE, aLineStyle);
                        PlotIndexSetInteger(m_BufIdx,PLOT_LINE_WIDTH, aArrowSize);
                        PlotIndexSetInteger(m_BufIdx,PLOT_LINE_COLOR, aArrowColor);
                        PlotIndexSetInteger(m_BufIdx,PLOT_ARROW,      aArrowCode);
                        PlotIndexSetInteger(m_BufIdx,PLOT_ARROW_SHIFT,aArrowShift);
                        PlotIndexSetString (m_BufIdx,PLOT_LABEL,      aPlotLabel);
                        PlotIndexSetInteger(m_BufIdx,PLOT_SHIFT,      aPlotShift);
                        PlotIndexSetDouble (m_BufIdx,PLOT_EMPTY_VALUE,NULL);
                        ArrayInitialize    (aBuffer ,NULL);
                        ArraySetAsSeries   (aBuffer ,aAsSeries);
                        m_BufIdx++;                                            // increment bufferindex for next Init()
                        return(true);
                     }
      bool ColorLine(double     &aBuffer[],                    // the buffer
                     DRAWTYPE    aDrwType,                     // DRAW_NONE .. DRAW_COLOR_CANDLES
                     LINESTYLE   aLineStyle,                   // STYLE_SOLID .. STYLE_DASHDOTDOT
                     int         aLineWidth,                   // PLOT_LINE_WIDTH
                     color      &aColors[],                    // Array of color
                     string      aPlotLabel="",                // PLOT_LABEL - "Any String"
                     int         aPlotShift=0,                 // PLOT_SHIFT
                     bool        aAsSeries=false)              // SetAsSeries
                     {
                        int nColors=ArraySize(aColors);
                        SetIndexBuffer     (m_BufIdx,aBuffer,         INDICATOR_DATA);
                        PlotIndexSetInteger(m_BufIdx,PLOT_DRAW_TYPE,  aDrwType  );
                        PlotIndexSetInteger(m_BufIdx,PLOT_LINE_STYLE, aLineStyle);
                        PlotIndexSetInteger(m_BufIdx,PLOT_LINE_WIDTH, aLineWidth);
                        PlotIndexSetString (m_BufIdx,PLOT_LABEL,      aPlotLabel);
                        PlotIndexSetInteger(m_BufIdx,PLOT_SHIFT,      aPlotShift);
                        PlotIndexSetDouble (m_BufIdx,PLOT_EMPTY_VALUE,NULL);
                        PlotIndexSetInteger(m_BufIdx,PLOT_COLOR_INDEXES,nColors);
                        ArrayInitialize    (aBuffer ,NULL);
                        ArraySetAsSeries   (aBuffer ,aAsSeries );
               
                        for(int i=0; i<nColors; i++)
                           PlotIndexSetInteger(m_BufIdx,PLOT_LINE_COLOR,i,aColors[i]);
               
                        m_BufIdx++;                                            // increment bufferindex for next Init()
                        return(true);
                     }

      bool ColorIndex(double    &aBuffer[],                    // the buffer
                     int         aPlotShift=0,                 // PLOT_SHIFT
                     bool        aAsSeries=false)              // SetAsSeries
                     {
                        SetIndexBuffer     (m_BufIdx,aBuffer,         INDICATOR_COLOR_INDEX);
                        PlotIndexSetInteger(m_BufIdx,PLOT_SHIFT,      aPlotShift);
                        PlotIndexSetDouble (m_BufIdx,PLOT_EMPTY_VALUE,NULL);
                        ArrayInitialize    (aBuffer ,NULL);
                        ArraySetAsSeries   (aBuffer,aAsSeries);

                        m_BufIdx++;                                                       // increment bufferindex for next Init()
                        return(true);
                     }

};

CIndi Indi;

PS: Diesen Code kann man auch am Tablet lesen.
      Es gibt für Android einen sehr guten Editor: DroidEdit (gratis Version reicht, ich hab's gekauft um den Ersteller zu unterstützen)

amando
1346
amando  

zuerst mal danke Otto, Du hast mich auf den richtigen hinweis gebracht

in der Aussenschleife muss ich zumindest die Periode abziehen, sonst gehen ihm nach hinten die Bars aus und das gibt den Fehler aus. Darum war auch im Debugger nie ein Problem, ich klicke mich ja keine 10000 Bars durch ;-9


jetzt mal eine einfache Frage,

#property indicator_maximum 20
#property indicator_minimum -20

gibts das auch als eine andere Funktion? würde das gerne mit dem Zeitframe anpassen

da steht zwar was mit Indicator High, gilt das für obere und untere Grenze? 

im generellen ist das ja nur ein Hilfsmittel, ich würde ja viel lieber die Mitte definieren mit 0


danke

Otto Pauser
1368
Otto Pauser  
#property indicator_maximum 20
#property indicator_minimum -20
#property indicator_height 120
#property indicator_level1 -80
#property indicator_level2 +80

Diese Precompiler dirktiven sind für Indikatoren im Subwindow gedacht.

Vorsicht: definierst du

#property indicator_height xx

kann der Benutzer die Höhe des Subwindows nicht mehr verändern. Imho ein bug, der aber vom damaligen Servicedesk ignoriert wurde.

'gibts das auch als eine andere Funktion? würde das gerne mit dem Zeitframe anpassen'

Das versteh ich nicht was du meinst.

'da steht zwar was mit Indicator High, gilt das für obere und untere Grenze? '

Ohne diese Angaben stellt sich die Subwindowhöhe automatisch ein. Null ist dann irgendwo.

maximum und minimum auf den gleichen Wert setzen und level null definieren und du hast was du willst.

amando
1346
amando  
Otto Pauser:

Diese Precompiler dirktiven sind für Indikatoren im Subwindow gedacht.

Vorsicht: definierst du

kann der Benutzer die Höhe des Subwindows nicht mehr verändern. Imho ein bug, der aber vom damaligen Servicedesk ignoriert wurde.

'gibts das auch als eine andere Funktion? würde das gerne mit dem Zeitframe anpassen'

Das versteh ich nicht was du meinst.

'da steht zwar was mit Indicator High, gilt das für obere und untere Grenze? '

Ohne diese Angaben stellt sich die Subwindowhöhe automatisch ein. Null ist dann irgendwo.

maximum und minimum auf den gleichen Wert setzen und level null definieren und du hast was du willst.

Das maximum und minimum kann ich aber nur über die #property einstellen oder?

in der OnInit kann ich diese soviel ich gesehen habe nicht indizieren

Einloggen oder registrieren, um einen Kommentar zu schreiben