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

 

1. ich habe so eine Frage, wie kann ich ein Element eines Arrays durch den Speicher löschen, im Moment lösche ich ein Element durch Verschieben des Arrays mathematisch durch eine Schleife, ist es möglich in mql4? Wenn es möglich ist, geben Sie bitte ein Beispiel dafür, wie dies bei einem eindimensionalen Array gemacht wird.

2. auch, welche Art und Weise wäre mehr High-Performance, unter Berücksichtigung: wenn ich über den Speicher zu löschen, schneiden Sie ein Segment mit unnötigen Elementen, wird das Array zu reduzieren und seine Zahl wird durch den Wert der gelöschten Elemente zu verringern, und in der folgenden Verwendung des Arrays, müssen wir das Array in seinen ursprünglichen Zustand wiederherzustellen; wenn ich über eine mathematische Methode zu löschen, die Verarbeitung des Zyklus, die ständige Berechnungen beinhaltet, um Werte zu Variablen, die wiederum Auswirkungen auf das Programm zuweisen?

 
Seric29:

1. ich habe so eine Frage, wie kann ich ein Element eines Arrays durch den Speicher löschen, im Moment lösche ich ein Element durch Verschieben des Arrays mathematisch durch eine Schleife, ist es möglich in mql4? Wenn es möglich ist, geben Sie bitte ein Beispiel dafür, wie dies bei einem eindimensionalen Array gemacht wird.

2. auch, welche Art und Weise wird mehr High-Performance, unter Berücksichtigung der Tatsache, dass, wenn Sie über den Speicher zu löschen, schneiden Sie ein Array mit unnötigen Elementen, wird das Array zu reduzieren und seine Zahl wird durch den Wert der gelöschten Elemente zu verringern, und in der folgenden Verwendung eines Arrays, müssen wir das Array in seinen ursprünglichen Zustand wiederherzustellen; wenn Sie über eine mathematische Methode zu löschen, die Verarbeitung des Zyklus, die ständige Berechnungen beinhaltet, um Werte zu Variablen, die wiederum Auswirkungen auf das Programm zuweisen?

Kopieren Sie das Array einfach "in sich selbst" und reduzieren Sie die Größe des Arrays um die Anzahl der nicht benötigten Elemente.

Um ein einzelnes Element einzufügen, vergrößern Sie einfach die Größe, kopieren Sie wieder "auf sich selbst" und fügen Sie den gewünschten Wert in den freien Platz ein.

 
Alexey Viktorov:

Kopieren Sie das Array einfach "in sich selbst" und reduzieren Sie die Größe des Arrays um die Anzahl der nicht benötigten Elemente.

Um ein einzelnes Element einzufügen, vergrößern Sie einfach die Größe, kopieren Sie wieder "auf sich selbst" und fügen Sie den gewünschten Wert in den freien Raum ein.

Ich habe versucht, ein 3-dimensionales Array in die Kopierfunktion einzufügen, es gibt keine Fehler, also kann diese Funktion mit Arrays verschiedener Dimensionen arbeiten oder hat einfach Duplikate für verschiedene Dimensionen. Wie sich herausstellt, kann diese Funktion anstelle einer Verschiebefunktion verwendet werden, man muss also keine eigene schreiben, ich wünschte, ich hätte früher daran gedacht, wie riskant es ist , ein Array in sich selbst zu kopieren, es steht geschrieben, dass das Ergebnis nicht definiert sein darf.

 
Seric29:

Ich habe versucht, ein 3-dimensionales Array in die Kopierfunktion einzufügen, keine Fehler, so dass diese Funktion mit Arrays von verschiedenen Dimensionen arbeiten kann oder einfach Duplikate für verschiedene Dimensionen hat. Wie sich herausstellt, kann diese Funktion anstelle einer Verschiebefunktion verwendet werden, man muss also keine eigene schreiben, ich wünschte, ich hätte früher daran gedacht, wie riskant es ist, ein Array in sich selbst zu kopieren, es steht geschrieben, dass das Ergebnis nicht definiert sein darf.

Wenn Sie ein mehrdimensionales Array kopieren, müssen Sie die Dimensionalität der zweiten und der folgenden Dimensionen berücksichtigen. Dies bestimmt, wie viel Sie beim Kopieren verschieben müssen. Einfach ausgedrückt, so wie ich es in meinen Experimenten verstanden habe, werden alle Werte des mehrdimensionalen Arrays in "einer Zeile" und dann wieder in "einer Spalte" aneinandergereiht.

Alles in allem kann ich die Theorie jetzt nicht nacherzählen. Ich muss es noch einmal überprüfen, wenn ich es verwenden muss.

 
Alexey Viktorov:

Beim Kopieren eines mehrdimensionalen Arrays muss die Dimensionalität der zweiten und nachfolgenden Dimensionen berücksichtigt werden. Dies bestimmt, wie viel Verschiebung beim Kopieren erforderlich ist. Einfach ausgedrückt, so wie ich es in meinen Experimenten verstanden habe, werden alle Werte eines mehrdimensionalen Arrays in "einer Zeile" und dann wieder in "Spalte nach..." aufgereiht.

Im Allgemeinen kann ich die Theorie jetzt nicht wiederholen. Auch hier muss geprüft werden, ob es notwendig ist, sie zu verwenden.

In C++ gibt es keinen Unterschied zwischen diesem

   вывести в консоль massiv[0][0][0]
   или так
   вывести в консоль massiv[0]

in jedem dieser Fälle gibt es eine Ausgabe. Weil sie in einem Speicherblock liegen und C++ direkt auf sie zugreift, während in unserer Shell der Speicherzugriff geschlossen ist und es keine Möglichkeit gibt, Arrays verschiedener Dimensionen korrekt an eine Funktion zu übergeben oder sie auf diese Weise zu adressieren, ist die einzige Nuance, dass mehrdimensionale Arrays in C++ im dynamischen Speicher angeordnet sind, vielleicht sogar verstreut, obwohl niemand die elektronische Karte gesehen hat. Also, zu kopieren mehrdimensionale Arrays durch das Konzept an sich ist eine sehr subtile Angelegenheit oder es kann nicht richtig funktionieren?

 
Wie kann ich programmatisch feststellen, ob ich mich mit meinem Anlagepasswort oder mit meinem Handelspasswort in mein Konto eingeloggt habe?
 

Ich habe einen Code, der nicht in MQL5 in meinem Indikator ausgeführt wird

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH ? High[a] : Close[a]) > vhigh ? (price == STO_LOWHIGH ? High[a] : Close[a]) : vhigh);
      vlow  = ((price == STO_LOWHIGH ? Low[a] : Close[a]) < vlow ? (price == STO_LOWHIGH ? Low[a] : Close[a]) : vlow);
     };
  }

Der Punkt ist, dass wennPreis == STO_LOWHIGH alles richtig funktioniert, aber wennPreis == STO_CLOSECLOSE die Funktion nur statischen Variablen zuweist

vhigh = 0; vlow = High[i];

... Umgehung der Schleife

 
Alexandr Sokolov:

Ich habe einen Code, der nicht in MQL5 in meinem Indikator ausgeführt wird

Die Sache ist die, wennPreis == STO_LOWHIGH alles richtig funktioniert, aber wenn Preis == STO_CLOSECLOSE die Funktion nur statische Variablen zuweist

... Umgehung der Schleife

Mit den Klammern ist etwas nicht in Ordnung. Meiner Meinung nach sind sie hier überhaupt nicht notwendig. Sie sind alle nicht notwendig.

Oder verschieben Sie zumindest die hervorgehobenen Einträge vor dem Fragezeichen nach links.

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH ? High[a] : Close[a]) > vhigh ? (price == STO_LOWHIGH ? High[a] : Close[a]) : vhigh);
      vlow  = ((price == STO_LOWHIGH ? Low[a] : Close[a]) < vlow ? (price == STO_LOWHIGH ? Low[a] : Close[a]) : vlow);
     };
  }

Im Allgemeinen müssen Sie nur verstehen, dass der Operator ?: gleichbedeutend ist mit if else

Sie haben eine Bedingung zweimal. Eine Bedingung wie diese würde ausreichen

vhigh = price == STO_LOWHIGH ? High[a] : Close[a];
vlow  = price == STO_LOWHIGH ? Low[a] : Close[a];
Oder ich habe nicht verstanden, worauf Sie hinauswollten.
 
Alexey Viktorov:

Mit den Klammern ist etwas nicht in Ordnung. Meiner Meinung nach werden sie hier überhaupt nicht gebraucht. Keiner von ihnen ist es.

Oder verschieben Sie zumindest die hervorgehobenen Wörter nach links vor das Fragezeichen.

Im Allgemeinen müssen Sie nur verstehen, dass der Operator ?: gleichbedeutend ist mit if else

Sie haben eine Bedingung zweimal. Eine solche Bedingung würde ausreichen.

Oder ich habe nicht verstanden, worauf Sie hinauswollten.

Ich möchte normale maxHigh und minLow Stochastik innerhalb der Periode K durch Low/High und Close/Close erhalten

Low/High während der Initialisierung funktioniert gut, Close/Close jedoch nicht

 
Alexey Viktorov:

Mit den Klammern ist etwas nicht in Ordnung. Meiner Meinung nach werden sie hier überhaupt nicht gebraucht. Keiner von ihnen ist es.

Oder verschieben Sie zumindest die hervorgehobenen Wörter nach links vor das Fragezeichen.

Im Allgemeinen müssen Sie nur verstehen, dass der Operator ?: gleichbedeutend ist mit if else

Sie haben eine Bedingung zweimal. Eine solche Bedingung ist ausreichend.

Oder ich habe nicht verstanden, worauf Sie hinauswollten.

Ich habe es nicht sofort verstanden, aber wenn Sie das meinen.

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH) ? High[a] : Close[a] > vhigh ? (price == STO_LOWHIGH) ? High[a] : Close[a] : vhigh);
      vlow  = ((price == STO_LOWHIGH) ? Low[a] : Close[a] < vlow ? (price == STO_LOWHIGH) ? Low[a] : Close[a] : vlow);
     };
  }

es löst mein Problem nicht.

Grund der Beschwerde: