Effektive Programmierung - was ist schneller

 

Ich hab da mal eine Frage bzw. überleg mir wie man effektiver bzw. für die Rechner schonender und in der Ausführungszeit schneller programmiert.

Ich habe einen Indikator, der als State-Maschine aufgebaut ist. Beim ersten Aufruf des Indikators geht er die Vergangenheit durch und kommt zu einem aktuellen Status und 6 für mich wichtige Zahlenwerte. 

Bei den folgenden Ticks wird dann nur noch der aktuelle Wert mit den 6 Zahlenwerten verglichen und evtl. muss anhand dieser Werte etwas neu berechnet werden, aber die Vergangenheit braucht nicht mehr durchgescrollt zu werden.

Diese 6 Werte und auch die daraus berechneten 9 Levels stelle ich in Buffer für einen EA zur Verfügung.


Ist es nun so, dass jedes Mal wenn ich den Buffer über iCustom aufrufe, der Indikator die komplette Berechnung mit der Berücksichtigung der Vergangenheit durchführen muss?

Dann wäre es ja besser, ich würde die 6 Grundwerte auslesen und daraus im EA die 9 Level berechnen?

Oder könnte ich mir auch die 6 Grundwerten zu einem String zusammensetzen und diesen dann in einen Buffer schreiben und übergeben, sodass ich im EA diesen String dann zerlege und damit weiterrechne?

Ich hoffe es ist irgendwie verständlich, was bzw. wie ich das meine.

 

Schau Dir die Programmierung des Indikators an. Ist sie (in diesem Aspekt) 'schlecht' wird bei jedem neuen Tick (OnCalculate() wird aufgerufen, die notwendige Historie zu Neuberechnung der Werte verwendet, ist sie 'gut' werden mit bekannten Werten nur die Werte der letzten Balken berechnet.

Beispiel: https://www.mql5.com/en/code/39735

  if(rates_total - prev_calculated == 1) {
    startBar = rates_total - 1; // calculate the actual new open bar
    ...

Das

.. 6 Grundwerten zu einem String zusammensetzen...

halte ich für eine schlechte Idee. iCustom() (in MT5) liefert nur ein Handle zum im eigenen Thread laufenden Indikator und CopyBuffer() dann die Werte des jew. Puffers - ohne einen Aufruf der zu einer Berechnung führt:

   double arr0[],arr1[],arr2[],arr3[];
   int iVv = CopyBuffer(hVVB,0,tC,2,arr0); 
       iVv = CopyBuffer(hVVB,1,tC,2,arr1);
       iVv = CopyBuffer(hVVB,2,tC,2,arr2);
       iVv = CopyBuffer(hVVB,3,tC,2,arr3);
...
Hull Moving Average
Hull Moving Average
  • www.mql5.com
Here is my implementation of a colored Hull Moving Average.
 

Danke für deine Antwort!

Ich programmiere noch mit dem MT4, somit steht du CopyBuffer Funktion nicht zur Verfügung. 

Also in einen Buffer zu kopieren und die einzelnen Werte als String zusammenzusetzen ist nicht möglich, da der Buffer ein double sein muss. 

Aber versteh ich dass dann schon richtig, dann führt jeder iCustom Aufruf dazu, dass die Berechnung einmal vollständig - mit der Vergangenheit - im Indikator durchläuft?

Ich könnte ja rein theoretisch auch die Berechnung des Indikators direkt im EA selbst ablaufen lassen, allerdings nutze ich den Indikator und dessen State Maschine auch für einen MTF-Indikator und somit wäre ich froh, die Logik nur in einem Programmfile zu haben, so dass ich im Fehlerfall auch nur dort was ändern muss. 

 
Alternativ könnte ich die berechneten Werte ja in ein txt Schreiben oder als Objekt auf den Chart. 
 

Bedenke: End of MT4: https://www.mql5.com/en/forum/454319

und das vielleicht: https://www.mql5.com/de/forum/455957#comment_50048608

MT4 End Of Life - End of active support for MT4 with no active support and updates; "What the future holds formt4 and the vast array of
MT4 End Of Life - End of active support for MT4 with no active support and updates; "What the future holds formt4 and the vast array of
  • 2023.09.19
  • www.mql5.com
I have heard reports that mt4 is soon to become 'end of life' with no active support or updates. Can anyone explain what the future holds for mt4 and the vast array of millions of ex4 indicators, scripts and ea's. Com/ru/forum/447913/page6#comment_47273082
 
sunshineh #:
Alternativ könnte ich die berechneten Werte ja in ein txt Schreiben oder als Objekt auf den Chart. 

iCustom ist der übliche Weg und da MQ viel Gewicht auf Geschwindigkeit legt, ist der übliche Weg auch der schnellste (imho). Nur wenn Du den Indikator über iCustom() mit anderen Parametern aufruft, wird er neu berechnet, machst Du das öfter kannst Du Thread-Grenze des PC erreichen und Du musst einen Neustart machen. txt oder noch mehr grafische Objekte verlangsamen alles.

 

Das heißt, wenn ich es richtig verstehe, dass ich die 6 Buffer hintereinander auslesen und der Indikator nur 1x berechnet wird, wenn ich die iCustom Funktion mit den gleichen Parametern aufrufe?

Das der MT4 abgestellt werden wird, heißt es doch schon seit Jahren, auf den Seiten der Brocker ist er immer noch verfügbar und ich lese dort nicht, dass es nun konkret soweit ist. Oder hab ich was verpasst?

 
sunshineh #:

Das heißt, wenn ich es richtig verstehe, dass ich die 6 Buffer hintereinander auslesen und der Indikator nur 1x berechnet wird, wenn ich die iCustom Funktion mit den gleichen Parametern aufrufe?

Das der MT4 abgestellt werden wird, heißt es doch schon seit Jahren, auf den Seiten der Brocker ist er immer noch verfügbar und ich lese dort nicht, dass es nun konkret soweit ist. Oder hab ich was verpasst?

Ja.

Es ist aber teuer 2 Versionen zu betreuen. Das Terminal ist doch nur eine Seite, den Server der Broker gibt es ja auch noch.

Außerdem würde, wenn, ein betrügerischer Broker eher zur billigen Version greifen im Gegensatz zu einem seriösen Broker mit langer Planungs- und Entwicklungsperspektive <= das ist aber nur meine Privatmeinung!!

Grund der Beschwerde: