[ARCHIV] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 3. - Seite 309

 
artmedia70:

Das stimmt: Es gehört zum guten Ton, den eigenen Müll aufzuräumen...

Aber wie kann man in diesem Zusammenhang sagen, ob der "Müll" jetzt bereinigt werden muss oder umgekehrt: Es ist kein Müll - es sind die notwendigen Daten für weitere Berechnungen.

So wie ich es verstehe, sollte deinit() verwendet werden, um den Papierkorb aufzuräumen, aber... Sie wird nicht nur ausgeführt, wenn das Diagramm eines Handelsinstruments gelöscht oder der Expert Advisor entfernt wird, sondern auch, wenn die TF geändert wird. In diesem Fall gehen alle akkumulierten Daten für den TF verloren und der Expert Advisor beginnt seine Arbeit mit einem Null-Array, wenn er zum vorherigen Zeitrahmen zurückkehrt. Dasselbe geschieht, wenn wir einen der Parameter des Expert Advisors ändern.

Es hat sich herausgestellt, dass die "Müllabfuhr" in manchen Situationen ein komplexer logischer Prozess ist und keine einfache Änderung der Feldgröße.


Nun, es ist nicht kompliziert. In der Schleife initialisieren Sie das Array mit Werten. Dann arbeiten wir mit dem resultierenden Array. Wenn die Arbeit getan ist, machen wir sie zu einer Null-Länge. Im Zweifelsfall können Sie dies am Ende des Codes kurz vor return(0) tun.
 

Bitte schlagen Sie den folgenden Code vor, um die Protokolldatei zu lesen. Liest automatisch die aktuelle Protokolldatei nach Datum und gibt sie auf dem Drucker aus.

Wo:

while (result>0) {

Die Datei wird aus Teilen zusammengesetzt. Ich benötige aber nicht die gesamte Datei, sondern nur die letzte Zeile. Bitte helfen Sie bei der Korrektur.

void ReadWrite() {
   string tekTime=TimeStr1(CurTime(),1);
   string path=TerminalPath()+"\\logs\\"+tekTime+".log";
   string title="Чтение из файла";
   string msg;
   int result;
   int handle=_lopen(path,4);
   if (handle<0) {
      msg="Ошибка открытия файла";
      //MessageBox(msg,title,MB_OK|MB_ICONERROR);
      Print(msg);
      return;
   }
   result=_llseek (handle,0,0);
   string buffer="";
   //string char="x                      ";
   string char="x                                                                                                                                                                                                                                                         ";
   int count=0;
   result=_lread (handle,char,250);
   while (result>0) {
      buffer=buffer+char;
      char="x                                                                                                                                                                                                                                                         ";
      count++;
      result=_lread (handle,char,250);
   }
   result=_lclose (handle);
   msg=StringTrimRight(buffer);
   //MessageBox(msg,title,MB_OK|MB_ICONINFORMATION);
   Print(msg);
}

//------------------расчет времени----------------
string TimeStr1(int taim,int tip)
{
   string sTaim;
   string sTaim1,sTaim2,sTaim3;
   if (tip==1) 
   {
      int GD=TimeYear(taim);                  
      int MN=TimeMonth(taim);                  
      int DD=TimeDay(taim);  
      
      sTaim1 = DoubleToStr(GD,0);
      if (MN<10) sTaim2 = StringConcatenate(sTaim2,"0"+DoubleToStr(MN,0));
      else sTaim2 = StringConcatenate(sTaim2,DoubleToStr(MN,0));
      if (DD<10) sTaim3 = StringConcatenate("0",DoubleToStr(DD,0));
      else sTaim3 = DoubleToStr(DD,0);
      sTaim=sTaim1+sTaim2+sTaim3;
   }
   return(sTaim);
}
 
drknn:

Nun, das ist nicht schwer. In der Schleife wird das Array mit Werten initialisiert. Dann haben wir mit dem resultierenden Array gearbeitet. Wenn die Arbeit beendet ist, machen wir daraus ein Array der Länge Null. Im Zweifelsfall können Sie dies am Ende des Codes kurz vor return(0) tun.

Ich wurde missverstanden.

Im Kontext dieses Gesprächs (wenn ich die Prämisse dieses Gesprächs richtig verstanden habe), ist die Schleife der EA selbst. Jedes Mal, wenn ein Tick kommt, vergrößert sich das Array entweder oder bleibt gleich, je nachdem, ob ein neuer Wert hineingeschrieben werden muss.

Wie können wir wissen, dass die Arbeit abgeschlossen ist und nicht nur eine Person beispielsweise den Zeitrahmen ändert? Sogar aus Versehen... In diesem Fall wird deinit() aufgerufen und alle Daten gehen verloren. Der Expert Advisor beginnt mit der Speicherung (Schreiben in ein dynamisches Array) dieser Werte auf der Grundlage der im neuen Zeitrahmen(einem neuen Zyklus) erhaltenen Werte.

Ich meine es ernst.

 
artmedia70:

Ich wurde nicht verstanden.

Im Kontext unserer Diskussion (wenn ich die Prämisse dieser Diskussion richtig verstanden habe), ist der Zyklus die Arbeit des Expert Advisors selbst. Jedes Mal, wenn ein Tick kommt, wird das Array entweder vergrößert oder es bleibt unverändert, je nachdem, ob ein neuer Wert hineingeschrieben werden muss.

Woran erkennt man, dass eine Arbeit abgeschlossen ist und nicht nur eine Person, die beispielsweise den Zeitplan ändert? Sogar aus Versehen... In diesem Fall wird deinit() aufgerufen und alle Daten gehen verloren. Der Expert Advisor fängt an, sie zu akkumulieren (sie in ein dynamisches Array zu schreiben), und zwar auf der Grundlage der im neuen Zeitrahmen(einem neuen Zyklus) erhaltenen Werte.

Mein Standpunkt ist folgender.

Wenn Sie ins Detail gehen, können Sie diese Funktion nutzen. Dort erfahren Sie, was der Grund für die Deinitialisierung ist.
 

Mir ist eine Besonderheit des Terminals aufgefallen. Da die Berechnung des Auftragsgewinns den OrderSwap() nicht berücksichtigt, möchte ich, dass der Auftrag sofort geschlossen wird.


Das bedeutet, dass wir diese Formel verwenden sollten, um den Auftrag mit einem Gewinn abzuschließen:

(OrderProfit()+OrderSwap()+OrderCommission())>0

Ich habe noch nie mit Provisionen gearbeitet und Provisionen werden in der Demo nicht verwendet, deshalb kann ich sie nicht im Konto überprüfen.

Sind meine Berechnungen korrekt?

 
Zhunko:
Wenn Sie ins Detail gehen, können Sie diese Funktion nutzen. Sie wird Ihnen den Grund für die Deinitialisierung mitteilen.

Stimmt genau... :)

Ich habe es vergessen. Nun, da ich die Angewohnheit habe, "idiotensicher" zu verwenden, werden wir es benutzen...

 
artmedia70:

ObjectGetValueByShift(), um Ihnen zu helfen

Und wie Sie damit arbeiten werden - das wissen nur Sie...


Vielen Dank, lieber Mann!
 
Zwei Fragen.

1. Wie schreibe/eingebe ich die erste und die folgenden Variablen double abc[10] in das Feld double ab=a*b?
2. Wie schreibt man die elfte Variable in ein Array und entfernt die erste?

Die Reihenfolge, in der die Variablen in das Feld geschrieben werden (vorwärts oder rückwärts), spielt keine Rolle. Die Variablen im Array werden benötigt, um das arithmetische Mittel zu bestimmen.
 
Kann ich die Losgröße eines schwebenden Auftrags ändern?
 
Parn25:
Kann ich die Losgröße eines schwebenden Auftrags ändern?


Nein, das können Sie nicht.

alles, was Sie ändern können, wird hier erklärt https://docs.mql4.com/ru/trading/OrderModify

Grund der Beschwerde: