Diskussion zum Artikel "Die Stärke von ZigZag (Teil I). Entwicklung der Basisklasse des Indikators" - Seite 8

 
 

Die dritte und vierte lassen sich immer noch nicht kompilieren.

 

'GetZigZagData' - keine der Überladungen kann auf den Funktionsaufruf angewandt werden TestZZZ_03.mq5 77 15

"Get ZigZag Data" - keine der Überladungen kann auf den Funktionsaufruf angewandt werden test z_03.mq5 77 15

---------------------

könnte eine von 2 Funktionen sein TestZZZ_03.mq5 77 15

könnte eine von 2 Funktion(en) sein TestZZ_03.at MQL5 77 15

---------------------

void CZigZagModule::GetZigZagData(const int,int,int,const string,const ENUM_TIMEFRAMES,const datetime,const datetime) ZigZagModule.mqh 52 22

void CZigZagModule::GetZigZagData(const double&[],const double&[],const datetime&[]) ZigZagModule.mqh 51 22

______________

Das heißt, der Compiler schwört, dass ein und dieselbe Funktion mit unterschiedlichen Parametern gestartet wird.

 
Sergey Voytsekhovsky:

Die dritte und vierte sind immer noch nicht kompilierbar.

Überprüfen Sie die übertragenen Parameter. Entweder ist ihre Anzahl oder ihr Typ falsch. Dies ist beim Aufruf von GetZigZagData.

 
ZY: Warum programmieren Sie in C, wenn Sie nicht sicher sind, dass Sie eine Funktion mit verschiedenen Parametern ansprechen können?
 

Danke für die Rückmeldung. Ich weiß nicht, wie man die Parameter zu überprüfen, noch, ich bin gerade lernen, Programmierung. Soweit ich es verstanden habe - im Code ruft der Expert Advisor die Methode GetZigZagData() auf.

Das erste Mal mit den Parametern GetZigZagData(h_zz,l_zz,t_zz),

das zweite Mal mit anderen Parametern GetZigZagData(zz_handle_current,_Symbol,_Period,start_time_in,stop_time_in).

Die Einschlussdatei hat beide Optionen

void CZigZagModule::GetZigZagData(const double &zz_h[],const double &zz_l[],const datetime &time[])
  {
   int h_total =::ArraySize(zz_h);
   int l_total =::ArraySize(zz_l);
   int total   =h_total+l_total;
//--- Nullstellung von ZZ-Variablen
   ZeroZigZagData();
//--- Gehen wir die kopierten ZZ-Werte in einer Schleife durch
   for(int i=0; i<total; i++)
     {
      //--- Wenn wir bereits die erforderliche Anzahl von Maxima und Minima von ZZ erhalten haben, verlassen wir die Schleife
      if(m_counter_highs==m_copy_extremums && m_counter_lows==m_copy_extremums)
         break;
      //--- Array-Überlaufkontrolle
      if(i>=h_total || i>=l_total)
         break;
      //--- Füllen Sie das Maxima-Array, bis Sie die erforderliche Anzahl von Maxima kopiert haben
      if(zz_h[i]>0 && m_counter_highs<m_copy_extremums)
        {
         m_zz_high[m_counter_highs]      =zz_h[i];
         m_zz_high_bar[m_counter_highs]  =i;
         m_zz_high_time[m_counter_highs] =time[i];
         //--- Erhöhen des Maxima-Zählers
         m_counter_highs++;
        }
      //--- Füllen Sie das Feld der Minima, bis die gewünschte Anzahl kopiert ist
      if(zz_l[i]>0 && m_counter_lows<m_copy_extremums)
        {
         m_zz_low[m_counter_lows]      =zz_l[i];
         m_zz_low_bar[m_counter_lows]  =i;
         m_zz_low_time[m_counter_lows] =time[i];
         //--- Erhöhen Sie die Mindestanzahl.
         m_counter_lows++;
        }
     }
//--- Bestimmen Sie die Richtung der Kursbewegung
   m_direction=(m_zz_high_time[0]>m_zz_low_time[0])? 1 : -1;
  }
//+------------------------------------------------------------------+
//|| Ermittelt ZZ-Daten aus dem übergebenen Handle |
//+------------------------------------------------------------------+
void CZigZagModule::GetZigZagData(const int handle,int buffer_num_highs,int buffer_num_lows,
                                  const string symbol,const ENUM_TIMEFRAMES period,
                                  const datetime start_time,const datetime stop_time)
  {
//--- Holen wir uns die Ausgangsdaten
   int times_total =::CopyTime(symbol,period,start_time,stop_time,m_zz_time_temp);
   int highs_total =::CopyBuffer(handle,buffer_num_highs,start_time,stop_time,m_zz_highs_temp);
   int lows_total  =::CopyBuffer(handle,buffer_num_lows,start_time,stop_time,m_zz_lows_temp);
//--- Maximale Anzahl von Extrema
   int max_items =(int)::fmax((double)highs_total,(double)lows_total);
//--- Wenn das nicht ausreicht, versuchen wir es noch einmal.
   if(times_total<max_items)
     {
      while(true)
        {
         ::Sleep(100);
         times_total=::CopyTime(symbol,period,start_time,stop_time,m_zz_time_temp);
         if(times_total>=max_items)
            break;
        }
     }
//--- Zähler
   int lows_counter  =0;
   int highs_counter =0;
//--- Berechnen Sie die Maxima
   int h_total=::ArraySize(m_zz_highs_temp);
   for(int i=0; i<h_total; i++)
     {
      if(m_zz_highs_temp[i]>0)
         highs_counter++;
     }
//--- Berechne die Minima
   int l_total=::ArraySize(m_zz_lows_temp);
   for(int i=0; i<l_total; i++)
     {
      if(m_zz_lows_temp[i]>0)
         lows_counter++;
     }
//--- Ermitteln der Anzahl der Extrema
   int copy_extremums=(int)::fmin((double)highs_counter,(double)lows_counter);
   CopyExtremums(copy_extremums);
//--- Gehen wir die kopierten ZZ-Werte in einer Schleife durch
   GetZigZagData(m_zz_highs_temp,m_zz_lows_temp,m_zz_time_temp);
  }

nacheinander geschrieben.

Ich habe alte Archive geladen, dann neue, MT5 ganz gelöscht, ein neues von Grund auf installiert, nichts hilft, der Fehler vom obigen Bildschirm bleibt bestehen.

 
Алексей Тарабанов:
ZY: Warum programmieren Sie in C, wenn Sie nicht sicher sind, dass Sie eine Funktion mit verschiedenen Parametern ansprechen können?

Ich verstehe Sie nicht ganz. Ich habe eine Menge Möglichkeiten, worauf ich programmieren kann? Ich habe MT5, es ist in MQL5, und ich versuche, es zu lernen.

Ich denke, dass auf eine Funktion mit verschiedenen Parametern zugegriffen werden kann, ich habe sogar gelesen, dass man das Überladen nennt. Aber ich verstehe nicht, wie man das handhabt. Außerdem bin ich mir sicher, dass es gar nicht der Fehler des Autors ist, sondern dass ich höchstwahrscheinlich einen Fehler mache, die Frage ist nur, wo genau ????.

 
   CopyExtremums(copy_extremums);
//--- Gehen wir die kopierten ZZ-Werte in einer Schleife durch
   GetZigZagData(m_zz_highs_temp,m_zz_lows_temp,m_zz_time_temp);
Ich glaube, es ist hier.
 
Kann mir bitte jemand erklären, was Überladen ist? Ich programmiere nicht in C.
 

Ich habe die Namen dieser Funktionen in der Einschlussdatei geändert und ihnen jeweils die Nummern 1 und 2 hinzugefügt.

Ich habe alle Verweise auf diese Funktionen im Expert Advisor gefunden und sie bearbeitet. Der alte Fehler verschwand, aber ein neuer trat auf. In der Tat - ein Problem mit den Datentypen. Der Übersetzer schrieb wie folgt:

stop_time_in' - unable to convert enumeration TestZZ_03.mq5 77 78