Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 545

 
GSB:

Was für eine Aufnahme? Sie können denselben Indikator mit völlig anderen Parametern aufrufen



Wenn im Indikator selbst
extern int       periodAMA=10;
in der EA
extern int periodAMA_1= 8; 
extern int periodAMA_2=13; 

Wie erkennt der Indikatorcode die übermittelten Parameter, deren Namen unterschiedlich sind?

Aber alles ist so, wie Sie gesagt haben. Ich habe es noch einmal mit dem Skript überprüft)

 
Forexman77:
Wenn im Indikator selbst im Expert Advisor

Wie erkennt der Indikatorcode die übermittelten Parameter, wenn die Namen unterschiedlich sind?

Aber alles ist so, wie Sie gesagt haben. Erneut mit dem Skript geprüft)


Die Variable(n) im aufrufenden Programm kann/können beliebig benannt werden und ihr Name steht in keinem Zusammenhang mit dem Variablennamen im Indikator, es handelt sich um unterschiedliche Variablen und sie werden von unterschiedlichen Terminal-Threads aufgerufen.

Der Indikator wird anhand seines Namens aufgerufen, die Parameter dafür werden bei jedem Aufruf ab der 4. Position und dann die iCustom()-Parameter übergeben.

Wenn die Variable per1=9; deklariert wird und iCustom() auf Position 4 steht, wird der Indikator mit einer Periode von 9 berechnet, wenn Sie eine andere Variable setzen, wird deren Wert bei der Berechnung verwendet. Die Variable, die als erster Parameter des Indikators übergeben wird (ihre Referenz) - an vierter Stelle iCustom() des zweiten und so weiter.



 
GSB:

Die Variable(n) im aufrufenden Programm können beliebig benannt werden, ihr Name steht in keinem Zusammenhang mit dem Variablennamen im Indikator, es handelt sich um unterschiedliche Variablen, und sie werden von unterschiedlichen Terminal-Threads aufgerufen.

Der Indikator wird über seinen Namen aufgerufen, die Parameter werden ihm bei jedem Aufruf ab der 4. Position übergeben, und dann die iCustom()-Parameter.

Wenn die Variable per1=9 deklariert wird und iCustom() auf 4 steht, wird der Indikator mit einer Periode von 9 berechnet; wenn Sie eine andere Variable setzen, wird ihr Wert bei der Berechnung verwendet, und dies gilt für alle Parameter des Indikators, wobei es darauf ankommt, sie in der richtigen Reihenfolge zu setzen, wie im Indikator selbst. Die Variable, die als erster Parameter des Indikators übergeben wird (ihre Referenz) - der vierte iCustom() des zweiten und so weiter.



Ich habe sie. Im Lehrbuch heißt es, dass die zitierten Werte übertragen werden.
 

Ich dachte, ich sollte das Forum nicht überfrachten und ein separates Thema eröffnen, aber ich hoffe wirklich auf ein konstruktives Feedback zu meinem Problem, ohne das ich nicht weiterkomme :(.
Ich habe versucht, verschiedene Indikatoren zu schreiben, alles scheint OK zu sein, jetzt habe ich alles in meinen EA mit iCustom() Funktion importiert. Der Code im Expert Advisor:

double ma=iCustom(NULL,0,"TestMA",0,1);

Der Indikator selbst (ich habe ihn zu Testzwecken geschrieben)

//+------------------------------------------------------------------+
//|                                                       TestMA.mq4 |
//|                                  Copyright 2014, Semyon Polyakov |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Semyon Polyakov"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
 
   SetIndexStyle(0,DRAW_LINE,EMPTY,1,clrRed);
   SetIndexBuffer(0,ExtMapBuffer1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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 &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
    int counted_bars=IndicatorCounted(),
       limit;
 
   if(counted_bars>0)
      counted_bars--;
   
   limit=Bars-counted_bars;
     
   for(int i=0;i<limit;i++)
   {
      ExtMapBuffer1[i]=SimpleMA(i,20,close);
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  
  double SimpleMA(const int position,const int period,const double &price[])
  {
//---
   double result=0.0;
//--- check position
   if(position>=0 && period>0)
     {
      //--- calculate value
      for(int i=0;i<period;i++) result+=price[position+i];
      result/=period;
     }
//---
   return(result);
  }
//+------------------------------------------------------------------+

Als nächstes die EMPTY_VALUE-Sache beim Testen.

D.h., wenn wir anfangen zu testen, haben wir das Startdatum des EA und alles vor diesem Datum gibt iCustom die richtigen Indikatorwerte, alles danach wird direkt getestet - EMPTY_VALUE. :(
Ich bin schon müde, Google und Forum, sie schreiben über "nicht in die Zukunft schauen", aber ich sehe nicht, dass in den Code. Wo bin ich ein Narr?)

 
Semionn:

Ich dachte, ich sollte das Forum nicht vermüllen und ein separates Thema eröffnen, aber ich hoffe wirklich auf ein konstruktives Feedback zu meinem Problem, ohne das ich nicht weiterkomme :(.
Ich habe versucht, verschiedene Indikatoren zu schreiben, alles scheint OK zu sein, jetzt habe ich alles in meinen EA mit iCustom() Funktion importiert. Der Code im Expert Advisor:

Der Indikator selbst (ich habe ihn zu Testzwecken geschrieben)

Als nächstes die EMPTY_VALUE-Sache beim Testen.

D.h., wenn wir anfangen zu testen, haben wir das Startdatum des EA und alles vor diesem Datum gibt iCustom die richtigen Indikatorwerte, alles danach wird direkt getestet - EMPTY_VALUE. :(
Ich bin schon müde, Google und Forum, sie schreiben über "nicht in die Zukunft schauen", aber ich sehe nicht, dass in den Code. Wo bin ich ein Narr?)

Der Fehler scheint im Code des Expert Advisors zu liegen, warum benutzen Sie nicht einen Debugger? Setzen Sie Kontrollpunkte, sehen Sie Variablenwerte, und sehen Sie, ob der Indikator aufgerufen wird, was vor und nach Ihrem Datum ist
 
GSB:
Der Fehler scheint im Code des Expert Advisors zu liegen, warum verwenden Sie nicht einen Debugger? Setzen Sie Kontrollpunkte, sehen Sie Variablenwerte, und sehen Sie, ob der Indikator aufgerufen wird, was vor und nach Ihrem Datum ist

Der Debugger kann nur im Demokonto-Modus verwendet werden, nicht in der Testphase, außerdem habe ich geschrieben - der Indikator wird aufgerufen, funktioniert und gibt Werte zurück, sogar korrekt, aber nur vor dem angegebenen Datum (Startdatum der Testphase). Ich gebe die Werte der Variablen im EA aus, deshalb sage ich, dass zunächst alles gut ist, und dann EMPTY_VALUE
 
Semionn:

Der Debugger kann nur im Demokontomodus verwendet werden, nicht im Testmodus, außerdem habe ich geschrieben - der Indikator wird aufgerufen, funktioniert und liefert Werte, sogar korrekte, aber nur bis zum angegebenen Datum (Teststartdatum). Ich gebe die Werte der Variablen im EA aus, deshalb sage ich, dass zunächst alles gut ist, und dann EMPTY_VALUE


Haben Sie sorgfältig gelesen, wie man neue Balken in benutzerdefinierten Indikatoren verfolgt?

[QUOTE]Der erste Parameter rates_total enthält die Anzahl der Balken, die dem Indikator zur Berechnung zur Verfügung stehen, und entspricht der Anzahl der im Chart verfügbaren Balken.

Beachten Sie die Verbindung zwischen dem von OnCalculate() zurückgegebenen Wert und dem zweiten Eingabeparameter prev_calculated. Der Parameter prev_calculated im Funktionsaufruf enthält einen Wert, der von OnCalculate() beim vorherigen Aufruf zurückgegeben wurde. Dies ermöglicht sparsame Algorithmen für die Berechnung des benutzerdefinierten Indikators, um wiederholte Berechnungen für die Balken zu vermeiden, die sich seit dem letzten Aufruf dieser Funktion nicht verändert haben.

Dazu reicht es in der Regel aus, den Wert des Parameters rates_total zurückzugeben, der die Anzahl der Takte im aktuellen Funktionsaufruf enthält. Wenn sich seit dem letzten Aufruf von OnCalculate() die Preisdaten geändert haben (eine tiefere Historie wurde gepumpt oder Historienleerstellen wurden aufgefüllt), dann wird der Wert des Eingabeparameters prev_calculated vom Terminal auf Null gesetzt. [/QUOTE]

 

Sie müssen den Durchschnitt der Ein-Tages-Momente über 20 Tage ermitteln und dann den Durchschnitt der 20-Tages-Momente über fünf Tage.

Es war kein Problem, den 20-Tage-Durchschnitt zu finden. Aber ich weiß nicht, wie manaus diesem Durchschnitt den Fünftagesdurchschnitt ermitteln kann.

#property indicator_separate_window
#property indicator_buffers 1
#property  indicator_color1 Lime

//--- input parameters
extern int       Period_MA_1=1;
extern int       p          =20;
//--- buffers
double ExtMapBuffer1[];
double val20[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),                      
    limit;
    double momentum20;
   if(counted_bars>0)
      counted_bars--;  
   limit=Bars-counted_bars;
    
   for(int i=0;i<limit;i++)
   {
      momentum20=0;
      ArrayInitialize(val20,0);      
      for(int k=p;k>=0;k--)
      {
      ArrayResize(val20,p);
      val20[k]=Close[i+k]-Close[i+k+Period_MA_1];
      momentum20=momentum20+val20[k];
      }
      momentum20=momentum20/p;
      ExtMapBuffer1[i]=momentum20;
   }
   return(0);
  }
 
Forexman77:

Sie müssen den Durchschnitt der Ein-Tages-Momente über 20 Tage ermitteln und dann den Durchschnitt der 20-Tages-Momente über fünf Tage.

Es war kein Problem, den 20-Tage-Durchschnitt zu finden. Aber ich weiß nicht, wie manaus diesem Durchschnitt den Fünftagesdurchschnitt ermitteln kann.



//+------------------------------------------------------------------+
//|                                                   ForexMan77.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "vinin@mail.ru"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 Lime
#property  indicator_color2 Yellow
#property  indicator_color3 Red

//--- input parameters
extern int       Period_MA_1=1;
extern int       p2          =20;
extern int       p3          =5;
//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,ExtMapBuffer3);

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted(),
   i,limit1,limit2,limit3;
   limit1=Bars-counted_bars-1;
   limit2=limit1;
   limit3=limit2;
   if(limit1>0) 
     {
      limit1=Bars-Period_MA_1-1;
      limit2=limit1-p2;
      limit3=limit2-p3;
     }

   for(i=limit1;i>=0;i--) ExtMapBuffer1[i]=iMomentum(NULL, 0, Period_MA_1, PRICE_CLOSE, i);
   for(i=limit2;i>=0;i--) ExtMapBuffer2[i]=iMAOnArray(ExtMapBuffer1, 0, p2, 0, MODE_SMA,i);
   for(i=limit3;i>=0;i--) ExtMapBuffer3[i]=iMAOnArray(ExtMapBuffer2, 0, p3, 0, MODE_SMA,i);

   return(0);
  }
//+------------------------------------------------------------------+
 

Hilfe

int OnInit()
{
   EventSetTimer(60);
   Print(GetLastError());

   return(INIT_SUCCEEDED);
}

Timer funktioniert nicht, liefert Fouls und Fehler 4051

Oder sollte es im Testgerät nicht funktionieren?