Fragen von einem "Dummy" - Seite 86

 

Renat, die Frage war eher theoretisch als praktisch.

Um nicht im Nebel zu versinken, verweise ich auf das Beispiel in der iFractals-Hilfe. Es stimmt, dass es dort einen Indikator gibt, aber lassen Sie uns die Aufgabe auf eine einzige Berechnung des grafischen Layouts durch ein Skript vereinfachen.

Angenommen, ich möchte die Zeiten aller fraktalen Balken auf der Oberseite der gesamten Geschichte (oder eines wesentlichen Teils davon in einem mittleren Zeitrahmen, in dem es viele Fraktale geben wird) herausfinden. Habe ich richtig verstanden, dass es besser ist,CopyTime in der Schleife bei FrUpBuffer[shift]!=EMPTY_VALUE bis zu einer Tiefe von 1 Element wiederholt zu stören:

handle=iFractals(_Symbol,PERIOD_H4);
// вызов FillArraysFromBuffers(...)
// ...
// прочёс буфера
for(int shift=0; shift<BarsCalculated(handle); shift++)
{
   if(FrUpBuffer[shift]!=EMPTY_VALUE)
   {
     CopyTime(_Symbol,PERIOD_H4, shift, 1, Arr);
     Print(Arr[0]);
   }
}

bool FillArraysFromBuffers(double &up_arrows[],
                           int ind_handle,
                           int amount
                          )
  {
   if(CopyBuffer(ind_handle,0,0,amount,up_arrows)<0) return(false);

   return(true);
  }

und erhalten ein schnelleres Ergebnis, als den gesamten Verlauf auf einmal mit CopyTime nach Tiefe des FrUpBuffers zu essen:

handle=iFractals(_Symbol,PERIOD_H4);
// вызов FillArraysFromBuffers(...)
// ...
// прочёс буфера
for(int shift=0; shift<BarsCalculated(handle); shift++)
{
   if(FrUpBuffer[shift]!=EMPTY_VALUE)
     Print(TimeUpBuffer[shift]);
}

bool FillArraysFromBuffers(double &up_arrows[],
                           int ind_handle,
                           int amount
                          )
  {
   if(CopyBuffer(ind_handle,0,0,amount,up_arrows)<0) return(false);
   else CopyTime(_Symbol,PERIOD_H4,0,amount,TimeUpBuffer);

   return(true);
  }
und dann in der gleichen Schleife bei den gleichen if's nur die Fraktal-Balkenzeitwerte drucken?

Beide Aufgaben sind identisch, nur die Umsetzung ist etwas anders.

Intuitiv verstehe ich, dass es länger und teurer, eine enorme Zeichenfolge von bar Zeiten (beide fraktale und leer) in ein Array zu kopieren ist; auf der anderen Seite ist es zweifelhaft, CopyTime wiederholt zu einer Tiefe von 1 Element zu ziehen.

Wenn die erste Variante schneller ist, handelt es sich dann um einen absoluten Gewinn oder hängt es von der Gesamtzahl der Fraktale ab (z. B. gibt es auf kleinen TF viel mehr von ihnen)?

 

Hierhttps://www.mql5.com/ru/forum/3775/page59#comment_94865 habe ich eine Frage gestellt, wie man Deklaration, Verknüpfung, Initialisierung und andere Aktionen für mehrere Puffer desselben Typs in eine Schleife packen kann, um den Code zu reduzieren und die Lesbarkeit und Handhabbarkeit zu verbessern. Ich erhielt eine Antwort mit einem Beispiel (Klasse, Struktur) und habe sie verstanden.

Nach dem gleichen Prinzip habe ich nun versucht, Mehrfachzuweisungen vom Typ #property einzudämmen:

#property indicator_label1  "FractalUp1"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrGreen

#property indicator_label2  "FractalDown1"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrGreen
// ---
#property indicator_label3  "FractalUp2"
#property indicator_type3   DRAW_ARROW
#property indicator_color3  clrBlue

#property indicator_label4  "FractalDown2"
#property indicator_type4   DRAW_ARROW
#property indicator_color4  clrBlue
[...]

und stieß auf mindestens zwei Probleme:

1. für auf der globalen Ebene ist verboten, d.h. die früheste Verwendung ist nicht früher als in OnInit(), aber #property ist bekanntlich auf der globalen Ebene vor allen anderen Funktionen deklariert;

2. beim Versuch, den Indikatoren in der Schleife in OnInit() Eigenschaften zuzuweisen:

// понимаю, что сочинил бред
for (int i=0; i<NUMBER; i++)
{
  #property Property_Array[i].indicator_label (string)("Fractal"+i)
  #property Property_Array[i].indicator_type  DRAW_ARROW
  #property Property_Array[i].indicator_color clrArr[i]
}
Compiler flucht bei '#' (wie erwartet): '#property' - unerwartetes Token.
Können Sie mir sagen, ob und wie die Idee grundsätzlich realisierbar ist?
 

Können Sie mir sagen, wie man ein zweidimensionales Array von Arrays deklariert?

Etwa so:

double Buffers[6][3]={ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] };
 
tol64:

Können Sie mir sagen, ob es möglich ist, ein zweidimensionales Array von Arrays zu deklarieren?

Ein Array von Strukturen mit Feldern als Arrays kann deklariert werden, der Compiler überspringt sogar dynamische Arrays in der Struktur:

struct arr{double arr_str[];};
arr buffers[6][3];
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
tol64:

Können Sie mir sagen, wie man ein zweidimensionales Array von Arrays deklariert?

Etwa so:

#define DIM1_NUMBER 6
#define DIM2_NUMBER 3

struct TBuffer
{
  string Buffer[3]; // для нагляднсти поменяем double на string
};

TBuffer Buffer_Array[DIM1_NUMBER];

string prefixArr[6]={"a","b","c","d","e","f"};

int OnInit()
  {
   for (int j=0; j<DIM1_NUMBER; j++)
   {
      for (int i=0; i<DIM2_NUMBER; i++)
      {
        string t;
   
        StringConcatenate(t,prefixArr[j],i);
        Buffer_Array[j].Buffer[i]=t;
      }
   }

   Print(Buffer_Array[0].Buffer[0],", ",
         Buffer_Array[0].Buffer[1],", ",
         Buffer_Array[0].Buffer[2],"; ",

         Buffer_Array[1].Buffer[0],", ",
         Buffer_Array[1].Buffer[1],", ",
         Buffer_Array[1].Buffer[2],"; ",

         Buffer_Array[2].Buffer[0],", ",
         Buffer_Array[2].Buffer[1],", ",
         Buffer_Array[2].Buffer[2],"; ",

         Buffer_Array[3].Buffer[0],", ",
         Buffer_Array[3].Buffer[1],", ",
         Buffer_Array[3].Buffer[2],"; ",

         Buffer_Array[4].Buffer[0],", ",
         Buffer_Array[4].Buffer[1],", ",
         Buffer_Array[4].Buffer[2],"; ",

         Buffer_Array[5].Buffer[0],", ",
         Buffer_Array[5].Buffer[1],", ",
         Buffer_Array[5].Buffer[2]
   );

   return(0);
  }
[Behoben.]
 

IgorM, x100intraday

Danke für die Optionen. Ich denke, damit sollte es klappen, ich werde es ausprobieren.

 
tol64:

IgorM, x100intraday

Danke für die Optionen. Ich denke, das sollte funktionieren, ich werde es ausprobieren.

Übrigens, der Name "Buffer" kann in "_" oder andere Rätsel geändert werden, dann ist der Aufruf völlig klar:

Buffer_Array[0]._[0]

Buffer_Array[0].¦[0]

 
Urain:

Übrigens kann der Name "Buffer" in "_" oder etwas anderes geändert werden, damit der Aufruf völlig klar ist:

DankeUrain. Auch eine interessante Ergänzung. Es ist vertrauter.))
 

Aber wie macht man das alles mit #property? - Ich frage mich...

Keine Ahnung?

 
x100intraday:

Aber wie macht man das alles mit #property? - Ich frage mich...

Keine Ahnung?

entschlüsseln