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

 

Haben Sie also versucht, die Variablen global zu machen?

int izmb=0, izms=0;

void OnTick()
   {
   double LB=0,LS=0;
   int b=0,s=0;
   
   for(int i=0; i<OrdersTotal(); i++)
      {    
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         { 
         if(OrderSymbol()==Symbol())
            { 
            if(OrderType()==OP_BUY)             
               {  
               LB+=OrderLots();
               b++; 
               }                                         
            else if(OrderType()==OP_SELL)        
               {
               LS+=OrderLots();
               s++;
               } 
            }
         }     
      }
   if(izmb!=b || izms!=s)
      { 
      izmb=b;
      izms=s 
           // далее идут условия для открытия ордера.
      }
 
scomoroh:

Wir wollten die Bedingungen für das Finden eines EA-Eintrags nicht bei jedem Tick überprüfen, sondern nur, wenn eine andere Order von einem anderen EA oder manuell geöffnet oder geschlossen wird (damit der Prozessor nicht überlastet wird). Deshalb müssen wir prüfen, ob die Anzahl der Aufträge mit jedem Tick übereinstimmt.

Können wir eine statische Variable verwenden ? Wird das Programm in einer solchen Form funktionieren?

Alternativ dazu ist die einfachste und leichteste Bedingung

OnTrade() ist ein Analogon für mt4 mit mt5

void OnTrade()
 {
  ... // сюда код, который будет работать только по изменению ситуации по счёту: открытие/закрытие позиций, установка/удаление ордеров
 }

static _OTotal = -1;
static _HTotal = -1;
int OT=OrdersTotal();
int HT=OrdersHistoryTotal();
  if(OT!=_OTotal || HT!=_HTotal) // если изменилось - выполняем
   {
     OnTrade(); // здесь дёргаем текущую ситуацию на счёте и заполняем структуры
     _OTotal=OrdersTotal(); // запомним текущее количество
     _HTotal=OrdersHistoryTotal(); // запомним количество в истории
   }
 
ANDREY:

Ich danke Ihnen für Ihre Antwort. Ich habe alles verstanden, was Sie geschrieben haben. Aber ich habe den Sinn dessen, was Sie geschrieben haben, nicht verstanden, was mein Problem betrifft.

Unter einem horizontalen zweidimensionalen Array in meinem Code verstehe ich, dass es 2 Zeilen unter dem Index 0 oder 1 und Spalten unter den Indizes von 0 bis 30 gibt. Die erste Dimension wird als[0][0],[0][1],[0][2], ... bezeichnet.[0][30] Die zweite Dimension wird bezeichnet als[1][0],[1][1],[1][2], ...[1][30]

Mit vertikalen zweidimensionalen Array in meinem Code meine ich, wenn es 31 Zeilen mit den Indizes 0 bis 30 und 2 Spalten mit den Indizes 0 und 1gibt. Die erste Dimension wird als[0][0],[1[0],[2][0], ... bezeichnet.[30][0] Die zweite Dimension wird als[0][1],[1][1],[2][1], ... bezeichnet.[30][1]

Wenn Sie meinen Code ausführen, wird das Feld vertikal gefüllt. Und die Funktion ArraySort() sortiert das Array so, wie es sein sollte.

QUESTION Warum funktioniert die Funktion ArrayFill() in diesem Fall nicht? Schließlich habe ich ihn gebeten, die erste Dimension des Arrays (31 Elemente) mit denselben Werten 0,5555 zu füllen.
Danke für die Hilfe.

MQL4 kann mit nicht mehr als 4-dimensionalen Arrays arbeiten. Folglich ist arr[31][31] ein Fehler. Ein Array kann nicht größer als arr[][4] sein. Und die erste Dimension wird nicht durch MMS begrenzt, sondern durch was, weiß ich nicht genau. Vielleicht kann das jemand erklären.

Die Funktion ArrayFill() wird funktionieren, aber wir müssen verstehen, dass die Anzahl der Elemente in dem Array arr[3][2] 6 sein wird, und wir müssen 6 in diese Funktion schreiben, nicht 3 durch die Größe der ersten Dimension.

 

Vierdimensionale Dimension: arr[][][][] oder arr[,,,].

Die Dimensionen der letzten drei Dimensionen müssen in der Deklaration angegeben und fixiert werden. Die erste Dimension kann unbestimmt bleiben und kann später geändert werden:

int arr[,100,200,500];

Im Beispiel eines zweidimensionalen Arrays sind die Daten im Array wie folgt angeordnet:

int arr[2,5]={0,1,2,3,4,  - в нулевом элементе первого измерения 
              5,6,7,8,9}; - в первом элементе первого измерения

Sortieren verschiebt die gesamte Horizontale durch Sortieren nach der ersten Dimension,

und ArrayFill() füllt von einem Element zum anderen, z.B. von 3 nach 8. Das Ergebnis ist ein Chaos.

Wenn Sie einige Werte in der Horizontalen durch die erste Dimension ausfüllen wollen, müssen Sie den Beginn und das Ende des Ausfüllens kontrollieren, da Sie wissen, wie die Daten angeordnet sind.

Zum Beispiel das gesamte Lineal des Nullelements der ersten Dimension:

int value=5;
int index=0;
ArrayFill(arr, index*ArrayRange(arr,1), ArrayRange(arr,1), value); 

Wenn nur ein Nullelement, dann so:

ArrayFill(arr, index*ArrayRange(arr,1), 1, value); 

Wenn viele Nullelemente, dann durch Schleifen und einfache Zuweisung.


Ich habe es wohl nicht sehr deutlich erklärt... Benutzen Sie den Drucker, drucken Sie alles in der Schleife aus, so und so, und Sie werden den Dreh raus haben. Auf diese Weise lernen Sie schneller.

printf ist mein Freund!

 
Alexey Viktorov:

MQL4 kann nicht mehr als 4-dimensionale Arrays verarbeiten. Folglich ist arr[31][31] ein Fehler. Ein Array kann nicht größer als arr[][4] sein. Und die erste Dimension wird nicht durch MMS begrenzt , sondern durch was, weiß ich nicht genau. Vielleicht kann das jemand erklären.


Und die erste Dimension (d. h. die Anzahl der Zeichenfolgen) ist durch wie viele begrenzt? Nicht mehr als welche Anzahl von Zeilen in mehrdimensionalen Arrays erlaubt MQL4?

 

Ich glaube, alle vier Dimensionen haben eine Grenze:INT_MAX

Über die Struktur.

zweidimensional:

By-Struktur stellt ein eindimensionales Array dar, in dem die Elemente wie folgt angeordnet sind: zuerst die erste Zeile, dann die zweite, dann die dritte.

dreidimensional:

Auch im Dreidimensionalen. Es handelt sich um ein eindimensionales Array, bei dem die ersten Zeilen hintereinander stehen, dann die zweiten,.....

Warum eindimensional? Weil mehrere Zellen in einer Reihe für das Feld im Computerspeicher reserviert sind, so dass alles in dieser Reihenfolge geschrieben wird: row00+row01+row02+row10+row11....


Und es ist auch möglich, eine vierte Dimension hinzuzufügen - Stapel von dreidimensionalen Array-Blättern.

Nur die Anzahl der Zeilen kann im Laufe des Programms geändert werden. Alle Zeilen, Spalten, Blätter und Stapel sind nur eine Konvention, um die Struktur zu verstehen. Die Dimensionen befinden sich nicht tatsächlich in unserem Raum, sondern sind nur Messungen.

Wie Alexej sagt:

Alexey Viktorov:

... Spalte ... ist ... waagerecht, weil ich sie auf der Couch liegend betrachte.........

 
Alexey Viktorov:

Ist Ihnendie folgende Notiz aufgefallen

ArrayFill

Einmehrdimensionales Array wird bei der Verarbeitung mit ArrayFill()als eindimensional dargestellt, z.B. array[2][4] wird als array[8] verarbeitet, so dass es bei der Arbeit mit diesem Array akzeptabel ist, den Index des ersten Elements mit 5 anzugeben. Der Aufruf ArrayFill(array, 5, 2, 3.14) für array[2][4] füllt also die Elemente array[1][1] und array[1][2] mit dem Wert 3.14.


Ich habe alles herausgefunden, außer ArrayFill().

1. Wenn ich ein Array double LoY[31][31] deklariere, erstelle ich im Wesentlichen eine Tabelle mit 31 Zeilen und 31 Spalten. Ich habe ein zweidimensionales (statt vierdimensionales) Array erstellt, es aber noch nicht gefüllt.

2. Als nächstes fülle ich im Code jedes einzelne Array-Element mit einem Bid-Wert. Ich kann es mit 2 Optionen füllen
a) LoY[31][0]=Bid; - Ich fülle Zeile 31 und die erste Spalte des Arrays mit Bid-Werten. Und die zweite Dimension (Spalte unter Index 1) ist standardmäßig mit 0 gefüllt, weil ich sie nicht ausfülle. In dieser Variante habe ich alsodie erste Dimension mit 31 gefüllten Elementen und die zweite Dimension mit 1.

b) LoY[0][31]=Bid - Ich fülle Spalte 31 und die erste Zeile des Arrays mit Bid-Werten. Und die zweite Dimension (Zeile unter Index 1) ist standardmäßig mit 0 gefüllt, weil ich sie nicht ausfülle. In dieser Variante besteht die zweite Dimension also aus 31 gefüllten Elementen, die zweite Dimension besteht aus 1.

ArraySort() sortiert das zweidimensionale Array nur nach der ersten Dimension. Daher wird sie Option a) sortieren in der die erste Dimension 31 Zeilen hat und die Option b), in der die erste Dimension nur eine Zeile hat, nicht sortiert werden kann, weil eine Zeile nicht sortiert werden kann.
JetztArrayFill() Es zieht das zweidimensionale Array in eine einzige Zeile, bevor es den Elementen des zweidimensionalen Arrays die erforderlichen Werte zuweist. Das heißt, es muss mein Array LoY[31][31] in eine einzige Zeile der Größe 961 Elemente ziehen. Es handelt sich um eine sehr lange Zeichenkette, und die meisten Elemente werden überflüssig sein.

Erstellen wir also ein Array LoY[31][2] (Variante a)) oder LoY[2][31] (Variante b))

Es ist klar, wieArrayFill() in der Variante b) 1 Zeile einzeichnet. Die zweite Zeile wird einfach mit der ersten verbunden und nach dem letzten Element der ersten Zeile LoY[0][31] wird die erste Zeile des Arrays in ArrayFill() mitLoY[0][32] fortgesetzt und endet mitLoY[0][62] Und die Werte der Array-Elemente in ArrayFill() werden in folgender Reihenfolge gefüllt: Von Index 0 bis 31 werden die Array-Elemente mit Preiswerten gefüllt und von Index 32 bis zum Ende mit 0 .

QUESTION: Wie zeichnetArrayFill() Option a) in 1 Zeile? Immerhin gibt es bei dieser Variante 28 Zeilen. Und wenn es sich um eine Zeile handelt, in welcher Reihenfolge wird sie die Werte der Array-Elemente enthalten? Und kann ich Print() verwenden, um die Elemente meines zweidimensionalen Arrays zu drucken, nachdem ArrayFill() sie in ein eindimensionales Array konvertiert? Diese Funktion selbst gibt keinen Wert zurück, so dass Print() ihn nicht ausgibt, wenn er in sie eingefügt wird.

Vielen Dank für die Hilfe.

 

Ich habe hier ein bisschen Mist gebaut... Ich schäme mich.

Array-Element mit einem Bid-Wert. Ich kann es mit 2 Optionen füllen
a) LoY[31][0]=Bid; - Ich fülle Zeile 31 und die erste Spalte des Arrays mit Bid-Werten. Und die zweite Dimension (Spalte unter Index 1) ist standardmäßig mit 0 gefüllt, weil ich sie nicht ausfülle. In dieser Variante habe ich alsodie erste Dimension mit 31 gefüllten Elementen und die zweite Dimension mit 1.

b) LoY[0][31]=Bid - Ich fülle Spalte 31 und die erste Zeile des Arrays mit Bid-Werten. Und die zweite Dimension (Zeile unter Index 1) ist standardmäßig mit 0 gefüllt, weil ich sie nicht ausfülle. In dieser Variante besteht die zweite Dimension also aus 31 gefüllten Elementen, die zweite Dimension besteht aus 1.

ArraySort() sortiert das zweidimensionale Array nur nach der ersten Dimension. Daher wird sie Option a) sortieren in der die erste Dimension 31 Zeilen hat und die Option b), in der die erste Dimension nur eine Zeile hat, nicht sortiert werden kann, weil eine Zeile nicht sortiert werden kann.
JetztArrayFill() Es zieht das zweidimensionale Array in eine einzige Zeile, bevor es den Elementen des zweidimensionalen Arrays die erforderlichen Werte zuweist. Das heißt, es muss mein Array LoY[31][31] in eine einzige Zeile der Größe 961 Elemente ziehen. Es handelt sich um eine sehr lange Zeichenkette, und die meisten Elemente werden überflüssig sein.

Erstellen wir also ein Array LoY[31][2] (Variante a)) oder LoY[2][31] (Variante b))

Es ist klar, wieArrayFill() in der Variante b) 1 Zeile einzeichnet. Die zweite Zeile wird einfach mit der ersten verbunden und nach dem letzten Element der ersten Zeile LoY[0][31] wird die erste Zeile des Arrays in ArrayFill() mitLoY[0][32] fortgesetzt und endet mitLoY[0][62] Und die Werte der Array-Elemente in ArrayFill() werden in folgender Reihenfolge gefüllt: Von Index 0 bis 31 werden die Array-Elemente mit Preiswerten gefüllt und von Index 32 bis zum Ende mit 0 .

QUESTION: Wie zeichnetArrayFill() Option a) in 1 Zeile? Immerhin gibt es bei dieser Variante 28 Zeilen. Und wenn es sich um eine Zeile handelt, in welcher Reihenfolge wird sie die Werte der Array-Elemente enthalten? Und kann ich Print() verwenden, um die Elemente meines zweidimensionalen Arrays zu drucken, nachdem ArrayFill() sie in ein eindimensionales Array konvertiert? Diese Funktion selbst gibt keinen Wert zurück, so dass Print() ihn nicht ausgibt, wenn er in sie eingefügt wird.

Ich danke Ihnen für Ihre Hilfe.

Es fällt mir schwer, Sie zu verstehen. Vielleicht ist das der Grund, warum ich es nicht richtig verstehen kann. Wiederholen Sie die Frage mit dem Array LoY[5][3], d. h. mit 5 Zeilen und 3 Spalten.

ArrayFill konvertiert das ursprüngliche Array in keiner Weise. Nur die Verarbeitung des Arrays wird sodurchgeführt, als ob ein eindimensionales Array dort abgelegt wäre. Die Funktion führt die notwendigen Aktionen am Array durch und fällt zurück, ohne die Dimensionalität zu beeinträchtigen.

Der Dokumentation zufolge füllt die FunktionArrayFill(LoY, 3, 6, 12) nur die Zeilen mit dem Index 1 und 2 im Array LoY mit dem Wert 12.

LoY[1][0] wird mit 12 gefüllt.

LoY[1][1] wird den Wert 12 haben.

LoY[1][2] wird den Wert 12 haben.

LoY[2][0] wird den Wert 12 haben.

LoY[2][1] wird den Wert 12 haben.

LoY[2][2] wird auf 12 gesetzt.

Alle anderen bleiben unangetastet.

Versuchen Sie es mit einem kleinen Feld und Zahlen, die leicht zu verstehen sind. Zum Beispiel 12 und 8. Sie werden schnell merken, was größer ist. Und 1,123654 und 1,123583 ist komplizierter

 
Alexey Viktorov:

ArrayFill konvertiert das ursprüngliche Array in keiner Weise. Es verarbeitet das Array nur so, als wäre es ein eindimensionales Array. Die Funktion führte die notwendigen Aktionen mit dem Array durch und löschte es, ohne die Dimensionalität zu beeinträchtigen.


Dadurch wurden meine Missverständnisse erheblich verringert und mein Verständnis verbessert. Jetzt werde ich alles, was ich geschrieben habe, unter Berücksichtigung der neu entdeckten Umstände neu analysieren....

 
Alexey Viktorov:


Laut Dokumentation füllt die FunktionArrayFill(LoY, 3, 6, 12) nur die Zeilen mit Index 1 und 2 im Array LoY mit dem Wert 12.

LoY[1][0] wird den Wert 12 haben.

LoY[1][1] wird den Wert 12 haben.

LoY[1][2] wird den Wert 12 haben.

LoY[2][0] wird den Wert 12 haben.

LoY[2][1] wird den Wert 12 haben.

LoY[2][2] wird auf 12 gesetzt.


FRAGE
Wie und welche Werte sollte ich inArrayFill() eingeben, wenn ich die gelben Elemente desselben Arrays mit dem Wert 12 füllen muss?

OPTION N 1

OPTION N 2


Ich danke Ihnen für Ihre Hilfe.