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

 
Alexey Viktorov:

Die Funktionen IntegerToString() und DoubleToString() stellen die Zahl einfach als Zeichenkette dar, die an die Funktion übergeben wird. In diesem Beispiel

es handelt sich um die Umwandlung von r in eine Zeichenkette und die Zeichenketten werden "addiert". Aber vorher ändert sich der Wert von r.

Ich verstehe die Frage nicht ganz, aber wenn Sie nur geradzahlige Elemente aus dem Array auswählen müssen, sollte die Schleife folgendermaßen aufgebaut sein


Vielen Dank für die Erklärung.

 
Alexey Viktorov:

Die Funktionen IntegerToString() und DoubleToString() stellen die Zahl einfach als Zeichenkette dar, die an die Funktion übergeben wird. In diesem Beispiel

es handelt sich um die Umwandlung von r in eine Zeichenkette und die Zeichenketten werden "addiert". Vorher ändert sich jedoch der Wert von r.



Ich kann den Prozess des "Hinzufügens" von Werten von String-Variablen nicht verstehen. Ich sehe 2 Varianten des "Hinzufügens" von Zeichenketten in meinem Code.

1. Sie addieren den Wert der String-Variablen der aktuellen Iteration mit dem Wert der gleichen String-Variablen der vorherigen Iteration.

2. Bei der aktuellen Iteration werden die Werte der beiden Termvariablen addiert, d. h. IntegerToString(r) + DoubleToString(LoY[r],4).

Ich habe den Eindruck, dass Sie die erste Variante meinen.

Aber dann .... Der Wert von IntegerToString(r) bei der vorherigen Iteration = "0". und bei der aktuellen Iteration = "1" . Das Ergebnis der Addition sollte "01" sein.

Wenn sich in der aktuellen Iteration vor dem Aufsummieren der Wert von IntegerToString(r) von der vorherigen 0 zur aktuellen 1 ändert, erhalten wir immer noch eine zweistellige String-Darstellung der Zahl, also "11".

Wenn wir den gleichen Algorithmus verwenden, um die Werte der String-Variablen DoubleToString(LoY[r],4) zu addieren , dann sollte das Ergebnis der Addition zweier Strings Werte wie 1.61041.6105 sein

Aber Print() gibt die Additionsergebnisse aus irgendeinem Grund als andere Zahlen aus (so wie sie sein sollten)
Ich verstehe es nicht.
Hier ist Ihr Beispiel, wie die Werte von String-Variablen summiert werden "...... und wenn Sie Strings summierenDoubleToString(2.3, 1)+DoubleToString(3.6, 1), wird es 2.33.6 als String sein." Das heißt, vor der Addition betrug die String-Darstellung der Zahl jeder Variablen 2 Zeichen, aber nach der Addition von zwei String-Variablen ist das Ergebnis der Addition eine String-Darstellung der Zahl von 4 Zeichen. Warum führt die Addition in Ihrem Code nicht zu einer Zahl mit der doppelten Anzahl von Zeichen?

 
Alexey Viktorov:


Ich verstehe die Frage nicht ganz, aber wenn Sie nur geradzahlige Elemente aus einem Array auswählen möchten, dann sollte die Schleife wie folgt aufgebaut sein


Genau das habe ich mit.... gemeint. Hier ist der ursprüngliche Code mit BOX 2 ergänzt

int P1=0;
double LoY[31];
void OnTick()
{
if (P1==0)
{
for(int r=0; r<31;r++)
{
LoY[r]=1.6104+(r*2)*0.0001;
Print("-------------------------------------LoY[r]--------------=",  LoY[r]);
P1=1;
}
}
//*************************************************************  Б Л О К    N 2
for(int x=0; x<31;x++)
{
if (Bid < LoY[x] )
{
LoY[x]=Bid;
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
Print("---LoY[0]--",  X, "---LoY[1]--" ,  X,   "---LoY[2]--" ,  X,  "---LoY[3]--" ,  X,  "---LoY[4]--" ,  X, ................  "---LoY[30]--" ,  X );
}
}
}

Im zweiten Block unterscheiden sich die Werte der Arrayelemente nicht mehr um das gleiche Delta wie im ersten Block. Das Delta zwischen benachbarten Elementen kann unterschiedlich sein und daher ist der Algorithmus zum Verbinden von Zeichenketten aus dem ersten Block nicht für den zweiten Block geeignet...., wie mir scheint.

FRAGE Mit welchem MQL4-Sprachkonstrukt oder welcher Funktion im zweiten Block des obigen Codes wird die Print()-Funktion am Ende der Schleifenur ein einziges Mal drucken, wobei alle Werte der Array-Elemente ausgefüllt und in einer Zeile angeordnet werden, d.h. sie wird die folgende Form haben

Print("---LoY[0]--" , X,"---LoY[1]--", X,"---LoY[2]--", X,"---LoY[3]--", X,"---LoY[4]--", X................"---LoY[30]--", X );

Verurteilen Sie mich nicht, aber ich bin mir nicht sicher, ob ich die Erklärung in Worten verstehen kann, denn der zweite Block ist viel komplizierter als der erste...., wie mir scheint.
Vielen Dank für Ihre Hilfe.

 

Beim Programmieren gibt es, zumindest am Anfang, viel Routinearbeit. Sie denken über die Idee nach, schreiben den Code und debuggen ihn dann. Manchmal dauert die Fehlersuche länger als alles andere.

Es kommt häufig vor, dass die ursprüngliche Idee nicht funktioniert. Man sucht von oben nach unten, in der Reihenfolge, in der etwas nicht stimmt.

Fügen Sie überall printf() ein und sehen Sie, ob das Ergebnis Ihren Erwartungen entspricht oder nicht. So können Sie schneller erkennen, wie der Code funktioniert und wo Sie einen Fehler haben. Andernfalls wird das Verstehen sehr lange dauern.


Nicht meine Sache, aber versuchen Sie, schön zu schreiben. Wählen Sie einen Stil für sich und bleiben Sie dabei. Setzen Sie Klammern in Klammern in Stufen, um die Befestigungen sichtbar zu machen. Wenn Sie Leerzeichen zwischen Aussagen verwenden, dann verwenden Sie sie überall, oder umgekehrt, verwenden Sie sie nicht überall.

for(int x=0; x<31;x++)

if (Bid < LoY[x] )

Dann wird es für Sie leichter sein, Ihren eigenen Code zu lesen.

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

Im zweiten Block:

Im zweiten Block sind Kleinbuchstaben x und Großbuchstaben X unterschiedliche Variablen, der Code wird nicht so funktionieren, wie Sie es wünschen.

Es wäre besser, das Array außerhalb der Schleife zu sortieren.

In Print verwenden Sie X viele Male, Sie werden die gleiche Anzahl von Malen drucken.

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

Was den Code betrifft. Es ist schwierig, die Frage zu verstehen, also werde ich Ihnen sagen, was ich verstanden habe.

Wenn Sie Print in eine Schleife schreiben, erhalten Sie so viele Ausdrucke, wie die Schleife iteriert. Wenn Sie die Ausgabe einmal ausdrucken müssen, platzieren Sie Print nach der Schleife.

In diesem Fall sollten Sie eine Variable verwenden, in die Sie den Wert jeder Iteration schreiben, um die Informationen zu sammeln. Unsere Variable ist ein String, daher müssen alle Zahlen in einen String umgewandelt werden.

Wir haben eine String-Variable, weil die Print-Funktion einen String akzeptiert.

Was ist hier los?

Erster Durchgang. Vor dem ersten Durchlauf vor der Schleife haben wir eine leere Variable: string str="";
Als Nächstes weisen wir der Variablen plus "--LoY["+IntegerToString(r)+"]--, "+DoubleToString(LoY[r],4)+"," einen leeren Wert zu;
hier ist r 0 und wir fügen tatsächlich einige Strings hinzu:

"--LoY["+

IntegerToString(0)+

"]--, "+

DoubleToString(LoY[0],4)+

", ";

Zweiter Durchgang.

Zu all dem fügen wir die Informationen des zweiten Elements hinzu

"--LoY["+IntegerToString(1)+"]--, "+DoubleToString(LoY[1],4)+", ";

Dadurch wird die Zeichenkette ab dem ersten Element nicht verändert.



Es ist besser, den Zweck in Worten zu erklären, was Sie brauchen, als wie Sie es tun. Andernfalls können wir noch so lange über Ihren Code diskutieren und es wird sich herausstellen, dass Ihr Ziel auf andere Weise gelöst werden kann.

 
ANDREY:

Ich kann den Prozess des "Hinzufügens" von Werten von String-Variablen nicht verstehen. Ich sehe 2 Optionen für das "Hinzufügen" von Zeichenfolgen in meinem Code.

1. Der Wert der String-Variablen der aktuellen Iteration wird zum Wert der gleichen String-Variablen aus der vorherigen Iteration addiert.

2. Bei der aktuellen Iteration werden die Werte der beiden Termvariablen addiert, d. h. IntegerToString(r) + DoubleToString(LoY[r],4).

Ich habe den Eindruck, dass Sie die erste Variante meinen.

Aber dann .... Der Wert von IntegerToString(r) bei der vorherigen Iteration = "0". und bei der aktuellen Iteration = "1" . Das Ergebnis der Addition sollte "01" sein.

Wenn sich in der aktuellen Iteration vor der Addition der Wert von IntegerToString(r) von der vorherigen 0 zur aktuellen 1 ändert, erhalten wir immer noch eine zweistellige String-Darstellung der Zahl, also "11".

Wenn wir die Werte der String-Variablen DoubleToString(LoY[r],4) nach demselben Algorithmus addieren , dann muss das Ergebnis der Addition zweier Strings Werte wie 1.61041.6105 sein

Aber Print() gibt aus irgendeinem Grund Additionsergebnisse als andere Zahlen aus (so wie sie sein sollten)
Ich verstehe es nicht.
Hier ist Ihr Beispiel für das Hinzufügen von Werten von String-Variablen "...... und wenn Sie Strings hinzufügenDoubleToString(2.3, 1)+DoubleToString(3.6, 1), wird es 2.33.6 als String sein." Das heißt, vor der Addition betrug die String-Darstellung der Zahl jeder Variablen 2 Zeichen, aber nach der Addition von zwei String-Variablen ist das Ergebnis der Addition eine String-Darstellung der Zahl von 4 Zeichen. Warum führt die Addition in Ihrem Code nicht zu einer Zahl mit der doppelten Anzahl von Zeichen?

Im Grunde ist es wie beim Schreiben eines beliebigen Textes. Wir beginnen mit einem leeren Blatt Papier, oder sollte ich sagen, einer leeren Zeile. Dann schreiben wir das erste Wort, hängen das zweite Wort daran an und so weiter.......... Und wenn wir Zahlen im Text sehen, schreiben wir sie als Liniensymbol. Das heißt, wenn wir 2 + 5 addieren, erhalten wir 7, und wenn wir dieselben Zahlen schreiben, dann schreiben wir zuerst 2 und dann 5... so erhalten wir zwei Zahlen 25, die nebeneinander geschrieben werden. Ich weiß nicht, wie ich es sonst erklären soll.

Wenn Sie die Warnungen des Compilers ignorieren, ist die Umwandlung von r-Werten in eine Zeichenkette in Ihrem Beispiel nicht erforderlich. Hier können Sie diese beiden Optionen ankreuzen

Print("Test 1 " + (string)1 + (string)2);
Print("Test 2 " + 1 + 2);
 
Aleksei Stepanenko:


Ich danke Ihnen für Ihre Hilfe und Ihren Rat.

 
Alexey Viktorov:

Im Grunde ist es genau dasselbe wie das Schreiben eines beliebigen Textes. Zuerst haben wir ein leeres Blatt Papier, oder sollte ich sagen, eine leere Zeile. Dann schreiben wir das erste Wort, fügen das zweite Wort hinzu und so weiter.......... Und wenn wir Zahlen im Text sehen, schreiben wir sie als Liniensymbol. Das heißt, wenn wir 2 + 5 addieren, erhalten wir 7, und wenn wir einfach dieselben Zahlen schreiben, dann schreiben wir zuerst 2 und dann 5... so erhalten wir zwei Zahlen 25, die nebeneinander geschrieben werden. Ich weiß nicht, wie ich es sonst erklären soll.

Wenn Sie die Warnungen des Compilers ignorieren, ist die Umwandlung von r-Werten in eine Zeichenkette in Ihrem Beispiel nicht erforderlich. Hier sind Sie und überprüfen Sie zwei solcher Varianten.

Danke für alles

 
ANDREY:

Das ist es, was ich mit.... meinte. Hier ist der ursprüngliche Code, ergänzt durch BOX 2

Im zweiten Block unterscheiden sich die Werte der Arrayelemente nicht mehr um das gleiche Delta wie im ersten Block. Das Delta zwischen benachbarten Elementen kann unterschiedlich sein und daher ist der Algorithmus zum Verbinden von Zeichenketten aus dem ersten Block nicht für den zweiten Block geeignet...., wie mir scheint.

FRAGE Mit welchem MQL4-Sprachkonstrukt oder welcher Funktion im zweiten Block des obigen Codes wird die Print()-Funktionnur 1 Mal nach Beendigung der Schleife drucken, wobei alle Werte der Array-Elemente in eine Zeile gefüllt werden, d.h. sie wird die folgende Form haben

Print("---LoY[0]--" , X,"---LoY[1]--", X,"---LoY[2]--", X,"---LoY[3]--", X,"---LoY[4]--", X................"---LoY[30]--", X );

Verurteilen Sie mich nicht hart, aber ich bin mir nicht sicher, ob ich die Erklärung in Worten verstehen kann, denn der zweite Block ist viel komplizierter als der erste...., wie mir scheint.
Vielen Dank für die Hilfe.

Und warum wird das Array bei jeder Iteration der Schleife sortiert? Denn wenn Sie den Wert des 0-ten Elements des Arrays ersetzt haben und nach dem Sortieren an das Ende des Arrays gegangen sind, dann wird Null der Wert sein, der der erste war, und der erste wird der Wert sein, der der zweite war. Somit wird der Wert des ersten Array-Elements übersprungen und Sie erhalten "Müll". Alles in allem ist Ihr gesamter Code etwas fehl am Platz.

Wozu brauchen Sie den ersten Block, in dem Sie das Feld füllen? Füllen Sie das Feld sofort mit den benötigten Werten und sortieren Sie es dann. True, müssen Sie eine weitere Schleife ausführen, um die Zeichenfolge zu füllen und zu drucken. Ich wünschte, mql4 hätte ArrayPrint()... Aber es ist nur Experimente, und Sie müssen nicht tatsächlich die Array-Werte zu drucken.

 
Aleksei Stepanenko:

Erklären Sie besser in Worten, was Sie brauchen, nicht wie Sie es tun. Andernfalls können wir noch so lange über Ihren Code diskutieren, und es wird sich herausstellen, dass Ihr Ziel auf andere Weise gelöst werden kann.

Während ich mql4 (und ein wenig mql5) studiere , schreibe ich verschiedene Codes. Dies gilt auch für Codes, die Arrays verwenden. Es ist oft notwendig, die Array-Elemente an irgendeiner Stelle des Codes zu überprüfen. Ich habe gelernt, wie man es mit Print() in einer Schleife macht. Aber in diesem Fall wird Print() bei jeder Iteration gedruckt. Wenn es viele Iterationen gibt, ist das sowohl für das Programm als auch für das Lesen unpraktisch. Sie haben richtig gesagt, dass Print( ) außerhalb der Schleife für Print() entfernt werden muss , wobei die Werte der Array-Elemente nur einmal ausgegeben werden sollen. Ich hatte es schon vor Ihren Worten vermutet.

Ich habe sehr schnell gelernt, Print() außerhalb der Schleife einzusetzen. Und jetzt versuche ich zu lernen, wie man Print() dazu bringt, alle Werte von Array-Elementen in einer Zeile zu drucken.

Man hat mir erklärt, wie ich das mit dem ersten Block meines Codes machen soll. Bis jetzt habe ich diese Technologie im Großen und Ganzen verstanden. Ich werde mir weiter den Kopf zerbrechen, um die Einzelheiten dieser Methode zu verstehen.
Aber im zweiten Block meines Codes, wie es mir scheint, ist die Methode aus dem ersten Block nicht geeignet, weil, im Gegensatz zum ersten Block, das Delta zwischen den Werten der Array-Elemente im zweiten Block anders ist.
Wenn ich richtig liege und die Methode aus dem ersten Block nicht zum zweiten passt, wäre ich Ihnen dankbar, wenn Sie mir zeigen könnten, wie man das Gleiche wie im ersten Block macht, aber mit Bezug auf den zweiten Block.

Ich habe den zweiten Block korrigiert. Ich habe Print() und ArraySort() außerhalb der Schleife platziert. Ich habe die Variable X aus Print() entfernt, um Sie nicht in die Irre zu führen.

int P1=0;
double LoY[31];
void OnTick()
{
if (P1==0)
{
for(int r=0; r<31;r++)
{
LoY[r]=1.6104+(r*2)*0.0001;
P1=1;
}
}
//*************************************************************  Б Л О К    N 2
for(int x=0; x<31;x++)
{
if (Bid < LoY[x] )
{
LoY[x]=Bid;
}
}
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
Print("-LoY[0]-", (знач.эл.масс с инд.0), "---LoY[1]--" ,  (знач.эл.масс с инд.1),   "---LoY[2]--" ,  (знач.эл.масс с инд.2),  "---LoY[3]--" ,  (знач.эл.масс с инд.3),................  "---LoY[30]--" ,  (знач.эл.масс с инд.30) );
}
 
Print("-LoY[0]-", DoubleToString(LoY[0],4), "---LoY[1]--", DoubleToString(LoY[1],4), "---LoY[2]--" , DoubleToString(LoY[2],4), "---LoY[3]--" , DoubleToString(LoY[3],4),................  "---LoY[30]--" ,  DoubleToString(LoY[30],4) );

oder erstellen Sie eine separate Array-Druckfunktion:

void PrintArray(double &eArray)
   {
   string eStr="";
   int eSize=ArraySize(eArray);
   for(int i=0; i<eSize; i++)
      {
      eStr+=IntegerToString(i)+": "+DoubleToString(eArray[i],4)+", ";
      }
   Print(str);
   }

Und rufen Sie sie von überall aus an

PrintArray(LoY);
Grund der Beschwerde: