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

 
trader781:

Ich weiß in der Theorie, warum das passiert ist, also ist meine Frage, können wir kurz über die Verwendung von Arrays sprechen?

Wo müssen Sie sie initialisieren, löschen und verarbeiten, damit sie funktionieren?

P.S.

Wenn Google es verbannt, sieht es ungefähr so aus:

Wie kommen Sie darauf, dass es sich um eine Anordnung handelt?
 
Alexey Viktorov:
Warum denken Sie, dass es an der Anordnung liegt?
Denn so etwas ist noch nie passiert, und wenn doch, dann habe ich irgendwo einen Fehler gemacht, und deshalb bin ich hier. Sie könnten es selbst machen, aber das kostet viel mehr Zeit.
 
trader781:

brauchen

1) irgendwo anlegen (in einem globalen Bereich, als Funktion, in onit oder ontic?)

2) beim Absenden einer Bestellung jedes Ticket mit einer Nummer versehen

3) ziehe sie von dort nach Bedarf durch die Nummer heraus

4) Wenn Sie das gesamte Raster schließen, setzen Sie die Parameter auf Null zurück.

Sie müssen es nicht die ganze Zeit im Gedächtnis behalten. Wenn Sie sie finden müssen, müssen Sie die Funktion mit einem lokalen Array aufrufen, in dem Sie alle Aufträge/Positionen in der Schleife ablegen, das Array nach Bedarf sortieren, die erforderlichen Aufträge daraus auswählen, mit ihnen tun, was immer Sie brauchen, und wenn Sie die Funktion verlassen, vergessen Sie dieses lokale Array. Und wenn Sie die Funktion das nächste Mal aufrufen, wird sie die zum Zeitpunkt des Aufrufs vorhandenen Aufträge/Positionen sortieren und mit ihnen dasselbe tun. Und Sie brauchen kein globales Array, das Sie ständig überwachen und kontrollieren müssen.
 
Artyom Trishkin:
Sie müssen es nicht die ganze Zeit im Gedächtnis behalten. Wenn Sie sie finden müssen, rufen Sie die Funktion mit einem lokalen Array auf, in dem Sie alle Aufträge/Positionen in die Schleife stellen, das Array nach Bedarf sortieren, die erforderlichen Aufträge daraus auswählen, mit ihnen tun, was immer Sie brauchen, und wenn Sie die Funktion verlassen, vergessen Sie das lokale Array. Und wenn Sie die Funktion das nächste Mal aufrufen, wird sie die zum Zeitpunkt des Aufrufs vorhandenen Aufträge/Positionen sortieren und mit ihnen dasselbe tun. Und Sie brauchen kein globales Array, das Sie ständig überwachen und kontrollieren müssen.

Ich weiß nicht, wie viel billiger das ist. Jede Situation hat ihre eigene Lösung. Es gibt kein OnTradeTransaction()-Ereignis in MQL4, aber wir müssen "unsere" Aufträge irgendwie im Auge behalten... Hier kommt das Array der globalen Variablen ins Spiel.

Stellen Sie sich vor, dass auf einem Konto mehrere Expert Advisors laufen, von denen einer umfangreiche Berechnungen durchführt und der andere eine große Anzahl von Aufträgen hat... Wie würde es mit schweren Berechnungen funktionieren? Wird dieser EA eine große Anzahl von Aufträgen durchsuchen müssen? Auf die Suche kann man im Allgemeinen nicht verzichten, aber man sollte dieses Verfahren auf ein Minimum reduzieren.

Und um festzustellen, ob der Auftrag abgeschlossen ist oder nicht? Die gesamte Geschichte durchgehen? Ist das nicht zu teuer?

 
trader781:
Ich habe noch nie einen solchen Fehler gemacht, aber wenn, dann habe ich einen Fehler gemacht, deshalb frage ich hier. Ich könnte es selbst machen, aber das kostet viel mehr Zeit.

Wie Sie meinem vorherigen Beitrag entnehmen konnten, verwende ich Arrays recht häufig und hatte noch nie Probleme mit ihnen. Ich habe einmal einen EA geschrieben, der mehr als 2000 Aufträge öffnete, deren Tickets in einem Array gespeichert waren, und es gab überhaupt keine Probleme. Ich glaube nicht, dass die Probleme wegen der Anordnung auftreten. Ich kann mir auch nicht vorstellen, welcher Fehler solche Probleme verursacht haben könnte.

Das erinnert mich an den Film "It Can't Be"... "Es ist nicht das Bier, das die Menschen tötet, es ist das Wasser, das die Menschen tötet"...

 
Alexey Viktorov:

Ich weiß nicht, wie viel billiger das ist. Jede Situation hat ihre eigene Lösung. Es gibt kein OnTradeTransaction()-Ereignis in MQL4, aber wir müssen "unsere" Aufträge irgendwie im Auge behalten... Hier kommt das Array der globalen Variablen ins Spiel.

Stellen Sie sich vor, dass auf einem Konto mehrere Expert Advisors laufen, von denen einer umfangreiche Berechnungen durchführt und der andere eine große Anzahl von Aufträgen hat... Wie würde es mit schweren Berechnungen funktionieren? Wird dieser EA eine große Anzahl von Aufträgen durchsuchen müssen? Auf die Suche kann man im Allgemeinen nicht verzichten, aber es wäre schön, dieses Verfahren zu minimieren.

Wie kann ich überprüfen, ob die Bestellung abgeschlossen wurde? Die gesamte Geschichte durchgehen? Ist das nicht zu teuer?

Alles kann gelöst werden.

Ich habe zum Beispiel vor langer Zeit eine Klasse geschaffen, die all dies überwacht. Sie können Klassenobjekte dynamisch für jedes Symbol, jede Magie, jeden Zeitrahmen oder alle für ein Konto oder eine Kombination von ihnen erstellen/löschen - Sie haben die Wahl. Jeder notwendige Suchzyklus wird bereits einmal auf einem neuen Häkchen durchgeführt, und es sind alle erforderlichen Daten vorhanden. Natürlich gibt es Fälle, in denen es unmöglich ist, auf einen weiteren Zyklus zu verzichten, aber es ist der zweite zusätzliche Zyklus pro Tick. Und nicht in jeder Funktion eine eigene Schleife zu haben, ist eine schreckliche Verschwendung von Ressourcen.

 
Artyom Trishkin:

Alles ist lösbar.

Ich zum Beispiel habe vor langer Zeit eine Klasse entwickelt, die sich um all dies kümmert. Sie können Klassenobjekte dynamisch für jedes Symbol, jede Magie, jeden Zeitrahmen oder alle für ein Konto oder Kombinationen davon erstellen/löschen - Sie haben die Wahl. Jeder notwendige Suchzyklus wird bereits einmal auf einem neuen Häkchen durchgeführt, und es sind alle erforderlichen Daten vorhanden. Natürlich gibt es Fälle, in denen es unmöglich ist, auf einen weiteren Zyklus zu verzichten, aber es ist der zweite zusätzliche Zyklus pro Tick. Und nicht in jeder Funktion eine eigene Schleife zu haben, ist eine schreckliche Verschwendung von Ressourcen.

Nun, das wird niemand bestreiten. Mit dem Aufkommen der Strukturen wurde es noch bequemer.
 
Artyom Trishkin:
Sie müssen es nicht die ganze Zeit im Gedächtnis behalten. Wenn Sie sie finden müssen, sollten Sie die Funktion mit einem lokalen Array aufrufen, in dem Sie alle Aufträge/Positionen in der Schleife ablegen, das Array nach Bedarf sortieren, die erforderlichen Aufträge daraus auswählen, mit ihnen tun, was immer Sie brauchen, und wenn Sie die Funktion verlassen, vergessen Sie das lokale Array. Und wenn Sie die Funktion das nächste Mal aufrufen, wird sie die zum Zeitpunkt des Aufrufs vorhandenen Aufträge/Positionen sortieren und mit ihnen dasselbe tun. Und Sie brauchen kein globales Array, das Sie ständig überwachen und kontrollieren müssen.

OK, hier ist eine vereinfachte Darstellung.

Wenn das Array lokal ist, wo wollen Sie es unterbringen? Offensichtlich nicht im Ontik.

void OnTick()
{  

       if(FindLastOType()==OP_BUY)  //+------ если последний покупка
           {
            if(Ask<=FindLastOrderOpenPrice()-Step*Point())//+------------если ордер в минус
              {
               TotalClose();
              }
            else
            if(Ask>=FindLastOrderOpenPrice()+Step*Point())//+------------если ордер в плюс и это 5 ордер в списке
              {
               ticket=OrderSend(Symbol(),OP_BUY,(лот2 ордера+лот4 ордера),Ask,50,0,0,"",Magic,0,clrAzure);
              }        
           }  
}

 
trader781:

OK, hier ist eine vereinfachte Darstellung.

Wenn das Array lokal ist, wo wollen Sie es unterbringen? Offensichtlich nicht im Ontik.

void OnTick()
{  

       if(FindLastOType()==OP_BUY)  //+------ если последний покупка
           {
            if(Ask<=FindLastOrderOpenPrice()-Step*Point())//+------------если ордер в минус
              {
               TotalClose();
              }
            else
            if(Ask>=FindLastOrderOpenPrice()+Step*Point())//+------------если ордер в плюс и это 5 ордер в списке
              {
               ticket=OrderSend(Symbol(),OP_BUY,(лот2 ордера+лот4 ордера),Ask,50,0,0,"",Magic,0,clrAzure);
              }        
           }  
}

Bitte lesen Sie, was eine Funktion ist. Dann werden Sie verstehen, dass das im Funktionsrumpf deklarierte Array lokal ist - außerhalb der Sichtweite des restlichen Programms.
 
bool WriteToFile(int FileHandle,string DataToWrite)
  {
// Receives the number of bytes written to the file. Note that MQL can only pass
// arrays as by-reference parameters to DLLs
   int BytesWritten[1]={0};

// Get the length of the string
   int szData=StringLen(DataToWrite);

// Do the write
   WriteFile(FileHandle,DataToWrite,szData,BytesWritten,0);

// Return true if the number of bytes written matches the expected number
   return (BytesWritten[0] == szData);
  }

Ich möchte eine Zeile in die Datei mit Übersetzungen in eine neue Zeile schreiben, aber es funktioniert nicht, dieser Code ist von hierhttps://www.mql5.com/en/forum/118999

dieser Code schreibt eine Zeile mit Leerzeichen nach jedem Buchstaben, ich brauche einen Ersatz für FileWrite() , aber es funktioniert

Reading and writing files anywhere on disk using CreateFileA() etc.
Reading and writing files anywhere on disk using CreateFileA() etc.
  • www.mql5.com
There are frequent questions in this forum (e.g...