Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1445

 
Vitaly Muzichenko:

Ich danke Ihnen!

Ich habe es versucht und bekam eine Fehlermeldung, ich mache etwas falsch:

Ist buffer[] verteilt? Ich sehe die Erklärung, aber ich sehe nicht die Größeneinstellung

 
Artyom Trishkin:

Ist buffer[] verteilt? Ich sehe die Deklaration, aber ich sehe nicht die eingestellte Größe

Größe einstellen, Fehler an anderer Stelle, funktioniert nicht.

 
Vitaly Muzichenko:

Größe einstellen, Fehler an anderer Stelle, funktioniert nicht.

Was übermitteln Sie?

 
Artyom Trishkin:

Was geben Sie weiter?

   double Array_1[];
   double Array_2[];
   ArraySetAsSeries(close, true);
   int count = rates_total-1;
   if(count < 0)
      return (-1);
   int i = 1;
   int period = (int)MathFloor(MathSqrt(a));
   int val_1 = (int)MathFloor(a / 1.9);
   int counter = Bars(_Symbol,_Period) - count + a + 1;
   if(counter > Bars(_Symbol,_Period))
      counter = Bars(_Symbol,_Period);
  // ArraySetAsSeries(Array_1, true);
   ArrayResize(Array_1, counter);
  // ArraySetAsSeries(Array_2, true);
   ArrayResize(Array_2, counter);
   double d_close = close[1];
   double buff[];
   ArrayResize(buff, counter);
   for(i = 0; i < counter; i++)
      Array_1[i] = 2.0 * ma_1(i, val_1) - ma_1(i, a);
   for(i = 0; i < counter - a; i++) {
      // buf_3[i] = iMAOnArray(Array_1, 0, period, 0, MODE_SMMA, i);
      // buf_3[i] = iMA(NULL, 0, period, 0, MODE_SMMA, PRICE_LOW);
      //  CopyBuffer(10,0,i,1,buff);
      SmoothedMAOnBuffer(counter, prev_calculated, i, period, Array_1, buff);
      buf_3[i] = buff[0];
      }
     .....

//+------------------------------------------------------------------+
int SmoothedMAOnBuffer(const int rates_total,const int prev_calculated,const int begin,const int period,const double& price[],double& buffer[])
{
//--- check period
   if(period<=1 || period>(rates_total-begin))
      return(0);
//--- save as_series flags
   bool as_series_price=ArrayGetAsSeries(price);
   bool as_series_buffer=ArrayGetAsSeries(buffer);
   ArraySetAsSeries(price,false);
   ArraySetAsSeries(buffer,false);
//--- calculate start position
   int start_position;
   if(prev_calculated==0) { // first calculation or number of bars was changed
      //--- set empty value for first bars
      start_position=period+begin;
      for(int i=0; i<start_position-1; i++)
         buffer[i]=0.0;
      //--- calculate first visible value
      double first_value=0;
      for(int i=begin; i<start_position; i++)
         first_value+=price[i];
      buffer[start_position-1]=first_value/period;
   } else
      start_position=prev_calculated-1;
//--- main loop
   for(int i=start_position; i<rates_total; i++)
      buffer[i]=(buffer[i-1]*(period-1)+price[i])/period;
//--- restore as_series flags
   ArraySetAsSeries(price,as_series_price);
   ArraySetAsSeries(buffer,as_series_buffer);
//---
   return(rates_total);
}
 
Vitaly Muzichenko:

Vitaly, warum kopieren Sie die Funktion aus dem Inluder? Wäre es nicht einfacher, eine Bibliothek anzuschließen?

#include <MovingAverages.mqh>
 
Vitaly Muzichenko:

Im Allgemeinen sollte der Aufruf dieser Funktion aus der Schleife entfernt werden. In dieser Funktion gibt es bereits eine vollständige Schleife. Zu Beginn müssen Sie den Anfang der signifikanten Daten im Array übergeben, auf deren Grundlage Sie die Glättung vornehmen. Für einige Arten der Glättung benötigen Sie eine Vorberechnung. Beim SMMA handelt es sich um zwei Berechnungszeiträume.

 
Artyom Trishkin:

Im Allgemeinen sollte der Aufruf dieser Funktion aus der Schleife entfernt werden. In dieser Funktion gibt es bereits eine vollständige Schleife. Zu Beginn müssen Sie den Anfang der signifikanten Daten im Array übergeben, auf deren Grundlage Sie die Glättung vornehmen. Für einige Arten der Glättung benötigen Sie eine Vorberechnung. Beim SMMA handelt es sich um zwei Berechnungszeiträume.

Aber wenn ein neuer Balken hinzugefügt wird, wird dann nicht das gesamte Feld neu berechnet? Und wenn sich der aktuelle Wert im Array ändert, muss auch der Puffer neu berechnet werden. Wie können wir in diesem Fall die Schleife vermeiden?

Einmal zu Beginn des Indikators, durch den gesamten Puffer und dann nur den letzten Index bei jedem Tick? Dies ist ein Stegreifspiel. Ich habe es noch nicht getan... Ich muss es überprüfen.

 
Alexey Viktorov:

Und wird in diesem Fall, wenn ein neuer Balken hinzugefügt wird, nicht das gesamte Array neu berechnet? Und es würde auch nicht schaden, eine Neuberechnung durchzuführen, wenn sich der aktuelle Wert im Pufferfeld ändert. Wie können wir in diesem Fall die Schleife vermeiden?

Einmal zu Beginn des Indikators, durch den gesamten Puffer und dann nur den letzten Index bei jedem Tick? Dies ist ein Stegreifspiel. Ich habe es noch nicht getan... Ich muss es überprüfen.

Nun, schauen Sie sich den Code an - Vitaly hat ihn direkt dargelegt

 
Artyom Trishkin:

Nun, schauen Sie sich den Code an - Vitaly hat ihn direkt gepostet

Jetzt bin ich dazu gekommen, das "SmoothedMAOnBuffer()" Konstrukt in mt4 zu debuggen.

Ich verstehe nicht, was los ist

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[])
{
   double Array_1[];
   double Array_2[];
   int count = IndicatorCounted();
   if(count < 0)
      return (-1);
   int i = 1;
   int period = (int)MathFloor(MathSqrt(a));
   int val_1 = (int)MathFloor(a / 1.9);
   int counter = Bars - count + a + 1;
   if(counter > Bars)
      counter = Bars;
   ArraySetAsSeries(Array_1, TRUE);
   ArrayResize(Array_1, counter);
   ArraySetAsSeries(Array_2, TRUE);
   ArrayResize(Array_2, counter);
   double d_close = close[1];
   double buff[];
   ArrayResize(buff, counter);
   for(i = 0; i < counter; i++)
      Array_1[i] = 2.0 * ma_1(i, val_1) - ma_1(i, a);
   for(i = 0; i < counter - a; i++) {
     // buf_3[i] = iMAOnArray(Array_1, 0, period, 0, MODE_SMMA, i); // Так индикатор работает
      SmoothedMAOnBuffer(counter, prev_calculated, i, period, Array_1, buff); Совсем не работает, но и ошибок в журнале нет
      buf_3[i] = buff[0]; ???
   }
   for(i = counter - a; i > 0; i--) {
      Array_2[i] = Array_2[i + 1];
      if(buf_3[i] > buf_3[i + 1])
         Array_2[i] = 1;
      if(buf_3[i] < buf_3[i + 1])
         Array_2[i] = -1;
      if(Array_2[i] > 0.0) {
         buf_1[i] = buf_3[i];
         if(Array_2[i + 1] < 0.0)
            buf_1[i + 1] = buf_3[i + 1];
         if(Array_2[i + 1] < 0.0) {
         }
         buf_2[i] = EMPTY_VALUE;
      } else {
         if(Array_2[i] < 0.0) {
            buf_2[i] = buf_3[i];
            if(Array_2[i + 1] > 0.0)
               buf_2[i + 1] = buf_3[i + 1];
            if(Array_2[i + 1] > 0.0) {
            }
            buf_1[i] = EMPTY_VALUE;
         }
      }
   }
   for(i = 0; i < counter-1; i++) {
      if(buf_2[i + 1] == EMPTY_VALUE && buf_2[i] != EMPTY_VALUE)
         buf_4[i] = buf_2[i];
      if(buf_1[i + 1] == EMPTY_VALUE && buf_1[i] != EMPTY_VALUE)
         buf_5[i] = buf_1[i];
   }
   return(rates_total);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int SmoothedMAOnBuffer(const int rates_total,const int prev_calculated,const int begin,const int period,const double& price[],double& buffer[])
{
//--- check period
   if(period<=1 || period>(rates_total-begin))
      return(0);
//--- save as_series flags
   bool as_series_price=ArrayGetAsSeries(price);
   bool as_series_buffer=ArrayGetAsSeries(buffer);
   ArraySetAsSeries(price,false);
   ArraySetAsSeries(buffer,false);
//--- calculate start position
   int start_position;
   int i=0;
   if(prev_calculated==0) { // first calculation or number of bars was changed
      //--- set empty value for first bars
      start_position=period+begin;
      for(i=0; i<start_position-1; i++)
         buffer[i]=0.0;
      //--- calculate first visible value
      double first_value=0;
      for(i=begin; i<start_position; i++)
         first_value+=price[i];
      buffer[start_position-1]=first_value/period;
   } else
      start_position=prev_calculated-1;
//--- main loop
   for(i=start_position; i<rates_total; i++)
      buffer[i]=(buffer[i-1]*(period-1)+price[i])/period;
//--- restore as_series flags
   ArraySetAsSeries(price,as_series_price);
   ArraySetAsSeries(buffer,as_series_buffer);
//---
   return(rates_total);
}
 
Vitaly Muzichenko:

Jetzt bin ich dazu gekommen, das "SmoothedMAOnBuffer()"-Konstrukt in mt4 zu debuggen.

Was ist los, ich verstehe das überhaupt nicht

Aus der Schleife entfernen
Grund der Beschwerde: