Helfen Sie mir, das Programmieren zu lernen. - Seite 4

 

Dmitry Fedoseev:
Berechnet jedes Mal neu, oder berechnet nicht neu

Sie haben nichts verstanden. Mit PositionTotal() ist die Welt noch nicht untergegangen. Ich weise nur darauf hin, dass es falsch ist, dies zu tun.

Dmitry Fedoseev:
Aber anstatt ein Killer-Experiment zu bringen

Was gefällt Ihnen an meinem Experiment nicht? Hat der Compiler das Ergebnis des ersten Aufrufs überoptimiert?

Genau das wird optimiert: for (int i = 0; i < 1+2 ; i++) {}

oder so: const int X = 1 ;for (int i = 0; i < X+2; i++) {}

aber das ist definitiv nicht: int X = 1 ; for (int i = 0; i < X+1; i++) {} weil ich kein Telepath bin und nicht weiß, was und wo mit diesem X passieren kann - es kann innerhalb der Schleife oder indirekt, zum Beispiel durch einen Link/Zeiger, geändert werden? Bei jeder Iteration wird die Addition 'X+1' durchgeführt. Auch wenn Sie '+1' entfernen, wird das Programm den aktuellen Wert von 'X' verwenden, es sei denn, 'X' wird als Konstante deklariert.

Und ganz sicher wird das von der Funktion zurückgegebene Ergebnis nicht zwischengespeichert, Karl (um Ihr "was wäre wenn for (int index=f();)" vorwegzunehmen) - es gibt hier nur einen Aufruf, bei der Indexinitialisierung).

Dmitry Fedoseev:
Und der Compiler - ich meinte, dass er den Code optimiert und die Variable direkt aufruft, nicht über eine Funktion

Ja, natürlich, der Compiler kennt die Situation auf dem Markt genau und ist sich sicher, dass ein Funktionsaufruf immer den gleichen Wert zurückgibt, also warum diese Funktion überhaupt mehrmals aufrufen, man muss sich nur einmal das Ergebnis in OnInit() merken und OK!

Und es kümmert nicht, dass sogar innerhalb der Ausführung des Zyklus selbst, in Ihrem Fall mit PositionsTotal(), einige Aufträge bereits verschwunden sein können - gestoppt, geschlossen durch Hände oder einen anderen EA - und der Rest wird nicht verarbeitet werden, weil sie alle plötzlich! weniger geworden?

Dmitry Fedoseev:
Dies ist bei der Funktion ArraySize() deutlich sichtbar, man kann keinen Unterschied zwischen dem Aufruf der Funktion und der Verwendung einer Variablen erkennen. Bei PositionsTotsl() ist das leider nicht der Fall.

Wie hängen die Größe eines Arrays und die Anzahl der aktuell geöffneten Positionen miteinander zusammen? Sie greifen auf Array-Elemente über einen Index zu, also zum Beispiel auf array[999] mit der Größe 3 Elemente. Wenn dieses Array tatsächlich ein "intelligenter" Typ ist, beispielsweise eine Klasse mit dem Operator '[]', bei dem eine Gültigkeitsprüfung durchgeführt wird, dann ist das in Ordnung. Aber was ist, wenn nicht? Auf jeden Fall ist dies ein klassisches Beispiel für Shitcode. Warum sollten wir die Pfütze vergasen, es einfach zugeben und uns nicht darum kümmern.

 
Tio Nisla:

Dmitry Fedoseev:
Berechnet jedes Mal neu, oder berechnet nicht neu

Sie haben nichts verstanden. Mit PositionTotal() ist die Welt noch nicht untergegangen. Ich weise nur darauf hin, dass es falsch ist, dies zu tun.

Dmitry Fedoseev:
Aber anstatt ein Killer-Experiment zu bringen

Was gefällt Ihnen an meinem Experiment nicht? Hat der Compiler das Ergebnis des ersten Aufrufs überoptimiert?

Genau das wird optimiert: for (int i = 0; i = 1+2; i++) {}

oder so: const int X = 1 ;for (int i = 0; i = X+2; i++) {}

aber das ist definitiv nicht: int X = 1 ; for (int i = 0; i = X+1; i++) {} weil ich kein Telepath bin und nicht weiß, was und wo mit diesem X passieren kann - es kann innerhalb der Schleife oder indirekt, zum Beispiel durch einen Link/Zeiger, geändert werden? Bei jeder Iteration wird die Addition 'X+1' durchgeführt. Auch wenn Sie '+1' entfernen, wird das Programm den aktuellen Wert von 'X' verwenden, es sei denn, 'X' wird als Konstante deklariert.

Und ganz sicher wird das von der Funktion zurückgegebene Ergebnis nicht zwischengespeichert, Karl (um Ihr "was wäre wenn for (int index=f();)" vorwegzunehmen) - es gibt hier nur einen Aufruf, bei der Indexinitialisierung).

Dmitry Fedoseev:
Und der Compiler - ich meinte, dass er den Code optimiert und die Variable direkt aufruft, nicht über eine Funktion

Nun, ja, natürlich, der Compiler kennt die Situation auf dem Markt genau und ist sich sicher, dass ein Funktionsaufruf immer den gleichen Wert zurückgibt, also warum diese Funktion überhaupt mehrmals aufrufen, man muss das Ergebnis nur einmal in OnInit() speichern, und gut ist!

Und es kümmert sich nicht, dass sogar innerhalb der Ausführung des Zyklus selbst, in Ihrem Fall mit PositionsTotal(), einige Aufträge können bereits weg sein - gestoppt, geschlossen durch Hände oder einen anderen EA - und der Rest wird nicht verarbeitet werden, weil sie alle plötzlich! weniger geworden?

Dmitry Fedoseev:
Dies ist bei der Funktion ArraySize() deutlich sichtbar, man kann keinen Unterschied zwischen dem Aufruf der Funktion und der Verwendung einer Variablen erkennen. Bei PositionsTotsl() ist das leider nicht der Fall.

In welchem Verhältnis stehen die Größe eines Arrays und die Anzahl der aktuell geöffneten Positionen zueinander? Sie greifen auf Array-Elemente über einen Index zu, also zum Beispiel auf array[999] mit einer Größe von 3 Elementen. Wenn dieses Array tatsächlich ein "intelligenter" Typ ist, beispielsweise eine Klasse mit dem Operator '[]', bei dem eine Gültigkeitsprüfung durchgeführt wird, dann ist das in Ordnung. Aber was ist, wenn nicht? Auf jeden Fall ist dies ein klassisches Beispiel für Shitcode. Sie sollten nicht versuchen, die Situation zu beschönigen.

Wenn bei PositionTotal() kein Ende in Sicht ist, haben Sie das Ziel überhaupt nicht erreicht. Denn die Funktion ArraySize() kann bei jeder Schleifenwiederholung aufgerufen werden, und die Geschwindigkeit ändert sich nicht.

Ich bin mit Ihrem Experiment nicht zufrieden, weil es fehlt.

Alle anderen Phantasien sind uninteressant, weil sie Phantasien sind (und außerdem sind sie wild und sehr weit von der Realität entfernt und sogar falsch).

Du solltest im Kindergarten sein.

 
Dmitry Fedoseev:

Mit dem Wissen um was? Wenn es sich um einen Algorithmus handelt, den es in der Natur nicht gibt, sondern den man selbst erfinden muss, und der alles bestimmt.

Mit dem Wissen, wie man kompetent den richtigen Code in der gewünschten Sprache schreibt.

Ich verstehe das nicht, es gibt keinen Algorithmus, der so etwas kann?

Wie sammelt man Informationen über Transaktionen und wie verwendet man sie? Ich muss Informationen über alle EA-Positionen, deren Volumen, Gewinn, Typ und Eröffnungskurs sammeln. Und dann auf Informationen über die jüngste Position oder die größte Position zu verweisen.

In der Tat hat der Autor das Thema mit dieser Frage geschaffen.

Und die Zyklen und die Ausführung der Funktionen wurden von anderen diskutiert. Aber es sind auch diejenigen, die wissen wollen, wie es am besten geht oder wie es richtig geht.

 
Nikolay Mitrofanov:

Mit dem Wissen, wie man den richtigen Code kompetent in der gewünschten Sprache schreibt.

Ich verstehe das nicht, es gibt keinen Algorithmus, der das kann?

Mit dieser Frage im Hinterkopf hat der Autor das Thema erstellt.

Und an Schleifen und der Ausführung von Funktionen waren auch andere Leute interessiert. Aber auch sie sind diejenigen, die wissen wollen, wie man es besser oder richtig macht.

Es geht also immer noch darum, wie man Positionen berechnet? Nun, dann tut es mir leid.

Interessant, diese Anspruchsvollen, die es immer noch wissen wollen... und immer noch nicht wissen. Und hier geht es auch um das Zählen von Positionen?

Nochmals Entschuldigung, wenn ich mich nicht irre: Meinen Sie mit dem Ausdruck "Algorithmus-Implementierung" eine Positionszählungsfunktion? Das heißt, ob Sie PositionsTots() in eine Schleife schreiben oder eine Variable verwenden - nennen Sie dies einen Algorithmus?
 
Dmitry Fedoseev:

Sie sprechen also immer noch darüber, wie man Positionen zählen kann? Nun, dann tut es mir leid.

Interessant, diese kultivierten Leute, die es immer noch wissen wollen... und es immer noch nicht wissen. Und dabei geht es auch um das Zählen von Positionen?

Worüber streiten Sie also, wenn die Frage erschöpft ist?) LOL.

Es gibt eine Aufgabe zum Abrufen von Positionsdaten.

Es gibt eine Sprachfunktion zur Ermittlung der Anzahl der offenen Positionen, die in der Schleife verwendet wird.

Es stellt sich die Frage, wie man sie in der Schleife richtig verwendet: im ersten Parameter der for-Schleife oder im zweiten - wo die Bedingung geprüft wird.

Es ist seltsam, dass du nicht verstehst, was du willst)))

Sie schreiben, dass es kostspielig ist, weil die Zahl nicht konstant ist. Aber warum, das können Sie nicht erklären.

Können Sie erklären, warum das so kostspielig ist?

Ich persönlich glaube, dass die Entwickler dafür gesorgt haben, dass diese Funktion die offenen Positionen nicht jeden Tick neu berechnet, sondern nur beim Öffnen und Schließen einer Position.

Glauben Sie, dass die Entwickler nicht daran gedacht haben?

Wie können Sie so sicher sein, dass die Funktion kostspielig ist und neu berechnet und nicht einfach den Wert aus dem Speicher des Terminals übernimmt?

Bislang habe ich statt einer substanziellen Antwort nur leeres Geschwätz gelesen.

 
Nikolay Mitrofanov:

Worüber streiten Sie sich also, wenn das Thema erledigt ist?) LOL.

Das ist der Witz an der Sache - zum zweiten Mal vierundzwanzig Stunden lang auf Seite vier ein Symposium darüber, wie man Positionen zählt. Sehr interessant.

 
Dmitry Fedoseev:

Wenn PositionTotal() nicht das Einzige ist, was zählt, dann haben Sie das Thema verfehlt. Denn die Funktion ArraySize() kann bei jeder Schleifenwiederholung aufgerufen werden, und die Geschwindigkeit ändert sich nicht.

Ich bin mit Ihrem Experiment nicht zufrieden, weil es fehlt.

Alle anderen Phantasien sind uninteressant, weil sie Phantasien sind (und außerdem sind sie wild und sehr weit von der Realität entfernt, und sogar falsch).

ArraySize(), wenn ein Array nicht dynamisch oder vom Typ einer Klasse ist, ist es bereits eine Konstante bei der Deklaration des Arrays selbst. Aber das bedeutet noch nichts, denn ArraySize(array) und sizeof(array) sind zwei große Unterschiede. Die erste wird aufgerufen, aber Sie sehen sie nicht; die zweite wird in der Kompilierungsphase berechnet.

int arr[5];

PrintFormat("sizeof(array): %d, num_elem = %d\n", sizeof(arr), sizeof(arr) / sizeof(int));
PrintFormat("ArraySize(): %d\n", ArraySize(arr));
ArrayResize(arr, 7);
PrintFormat("ArraySize(): %d\n", ArraySize(arr));
PrintFormat("sizeof(array): %d, num_elem = %d\n", sizeof(arr), sizeof(arr) / sizeof(int));
ArrayResize(arr, 3);
PrintFormat("ArraySize(): %d\n", ArraySize(arr));
PrintFormat("sizeof(array): %d, num_elem = %d\n", sizeof(arr), sizeof(arr) / sizeof(int));

2021.05.03 22:01:37.253 show_the_shitz EURJPY,H4: initialized
2021.05.03 22:01:37.253 show_the_shitz EURJPY,H4: sizeof(array): 20, num_elem = 5
2021.05.03 22:01:37.253 show_the_shitz EURJPY,H4: ArraySize(): 3
2021.05.03 22:01:37.253 show_the_shitz EURJPY,H4: sizeof(array): 20, num_elem = 5
2021.05.03 22:01:37.253 show_the_shitz EURJPY,H4: ArraySize(): 7
2021.05.03 22:01:37.252 show_the_shitz EURJPY,H4: ArraySize(): 5
2021.05.03 22:01:37.252 show_the_shitz EURJPY,H4: sizeof(array): 20, num_elem = 5

Erzählen Sie Ihren alternativen Standpunkt also woanders.

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

Warum versuche ich, mich zu erklären? Der Mensch will nicht sehen und denken. Nun gut, lassen Sie ihn einen Code erstellen, dessen Funktion von der Mondphase, der mittleren Mars-Meridianzeit und dem Jucken der linken hinteren Ferse abhängt. Schade ist nur, dass viele Leute, vor allem Anfänger, nicht einmal zweimal darüber nachdenken, *neuen* Code in ihre Projekte zu kopieren und dann rätseln, was falsch ist.

 
Tio Nisla:

ArraySize(), wenn das Array nicht dynamisch und nicht vom Klassentyp ist, ist es bereits eine Konstante, wenn das Array selbst deklariert wird. Aber auch das hat nichts zu bedeuten, denn ArraySize(array) und sizeof(array) sind zwei große Unterschiede. Die erste wird aufgerufen, aber Sie sehen sie nicht; die zweite wird in der Kompilierungsphase berechnet.

Erzählen Sie Ihren alternativen Standpunkt also woanders.

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

Warum versuche ich, mich zu erklären? Der Mensch will nicht sehen und denken. Nun gut, lassen Sie ihn einen Code erstellen, dessen Funktion von der Mondphase, der mittleren Mars-Meridianzeit und dem Jucken der linken hinteren Ferse abhängt. Schade ist nur, dass viele Leute, vor allem Anfänger, nicht einmal zweimal darüber nachdenken, *neuen* Code in ihre Projekte zu kopieren und dann rätseln, was falsch ist.

Das ist ein schlagendes Argument! Ohne Worte... Warum sollten Sie ArraySize() auf ein nicht-dynamisches Array anwenden? Ich kann mir nicht vorstellen, wie man sich so etwas ausdenken kann. Und was hat sizeof() damit zu tun? Ist dort alles in Ordnung?

Und das ist nicht meine Meinung, sondern eine, die schon lange von Forumsteilnehmern bestätigt wurde. Aber ich werde nicht nach diesem Thema suchen.

Aber ich kann Ihnen sagen, dass es überhaupt nichts mit Caching zu tun hat.

 
Nikolay Mitrofanov:

Ich finde es gut, wenn jemand versucht, zu verstehen und tiefer zu graben...

Wenn der Programmierer nicht auf Kleinigkeiten achtet, gewöhnt er sich an, den Code auf die falsche Weise zu schreiben. Und dann bedeutet das Kämmen des Codes doppelte Arbeit, und zwar oft nicht nur für den Autor, sondern auch für diejenigen, die noch das Glück haben, mit dem Code zu arbeiten.

Warum sollte man sich die Mühe machen, Code zu schreiben, wenn man es auch richtig und gut machen kann und die Details versteht?)

Ihr Rat ist... nun ja... IMHO


Ihr Rat ist gut für einen erfahrenen Programmierer (mit viel Selbstvertrauen), der es dann durchkämmen kann, weil er oder sie weiß, wo und was gekämmt werden muss.

Fedosejew hat Recht. Das müssen Sie nicht, und es wird einige Zeit dauern, bis Sie den Code so durchkämmt haben, wie Sie es wünschen. Aber man versteht mit der Zeit, dass man besser etwas Neues schreiben sollte. Jeder neue Code wird also zunächst durchkämmt.

 

Interessante Realitäten des Forums. Wenn jemand nach etwas fragt, wird niemand eine Zeile Code schreiben. Aber sobald sie das tun, kommen sie, stellen sich auf und fangen an zu klopfen - ah, ah, ah, was für ein falscher Code. Und was interessant ist, es handelt sich in der Regel um den Code so einfach wie drei Kopeken. Jeder Raum steht auf dem Prüfstand. Was etwas komplizierter ist, ist die Stille, taub wie ein Panzer.