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

 
Artyom Trishkin:

Problem-Code.

Warum...? Wenn es darum geht, die Logik bei jeder Überquerung derselben Linie zu verdoppeln, dann sollte die gesamte Logik (die ich nicht geschrieben habe) natürlich direkt von der Person geschrieben werden. Ich weiß nicht, was sein ultimatives Ziel ist, vielleicht will er zählen, wie oft der Preis jede Linie überquert, solange er sie überquert...

Ich habe verstanden, dass es dem Mann nicht gelungen ist, ein solches Ereignis für seine Zwecke zu bekommen. Jetzt wird er ein solches Ereignis bekommen, und dann liegt es in seinem Ermessen.


Es wäre logisch, die Linie selbst an der ersten Kreuzung in ein bestimmtes Format umzubenennen (oder eine Bezeichnung in die Beschreibung dieser Abbildung aufzunehmen). Und wenn alle Objekte angekreuzt sind, überprüfen Sie die Linie auf das Fehlen dieser Markierung.

Wenn es darum geht, dass es ineffektiv ist, alle Objekte bei jedem Tick auszuprobieren, dann ist das ein ganz anderes Thema.

 
Roman:

Versuchen Sie, den von der Variablen _Period zurückgegebenen Wert für Perioden größer als H1 in Ihren mathematischen Berechnungen zu verwenden.
Dann wissen Sie sofort, wer im Unrecht ist.

Niemand, der bei Verstand ist, würde die Werte der genannten Konstanten für mathematische Berechnungen verwenden. Benannte Konstanten sind dazu da, dass Sie leichter verstehen, worauf Sie sich beziehen oder welche Eigenschaftskennung Sie zum Abrufen der Daten verwenden. Benannte Konstanten ersetzen den Wert des gewünschten Eigenschaftsbezeichners durch eine textuelle Beschreibung.

Wenn Sie Daten z. B. von SymbolInfoDouble() abrufen, können Sie den numerischen Wert des Bezeichners verwenden, um anzugeben, welchen Wert Sie von der Funktion abrufen möchten. Dazu müssen Sie sich jedoch merken, welchen Bezeichnerwert Sie in der Funktion ersetzen müssen. Benannte Enum-Konstanten wurden eingeführt, um Sie von der Konstantenreferenz zu befreien oder um zu verhindern, dass Sie sich den Wert jedes Bezeichners jeder Funktion in MQL auswendig merken müssen. Um den Wert des aktuellen Briefkurses zu erhalten, sollten Sie entweder den Bezeichnerwert gleich 4 schreiben, wenn Sie Daten für das aktuelle Symbol anfordern: SymbolInfoDouble(NULL,4) oder schreiben Sie SymbolInfoDouble(NULL,SYMBOL_ASK);

Warum ist es für Sie in Ordnung und verursacht keine Dissonanz, dass SYMBOL_ASK 4 zurückgibt und nicht den aktuellen Briefkurs?

Warum stürzen Sie sich dann auf die Bezeichnungen der Diagrammzeiträume? Das ist es, was die Entwickler wollten. Aus ihren internen Gründen. Es gibt einen Bezeichner für Sie, zum Beispiel PERIOD_H4. Es sollte Ihnen egal sein, welcher numerische Wert ihm vom Entwickler aus irgendeinem Grund zugewiesen wurde. Sie haben einen Namen (Textersatz für einen numerischen Wert) für eine Konstante erhalten - verwenden Sie ihn, wenn Sie möchten. Aber den Wert dieser Konstante in Ihren Berechnungen zu verwenden, ist, Entschuldigung, Unsinn. Diese benannte Konstante wird verwendet, um anzugeben, aus welchem Diagramm Sie die Daten beziehen möchten. Die Periode des Diagramms wird jedoch nicht angezeigt. Sie wird für einen ganz anderen Zweck verwendet - um Ihnen das Leben leichter zu machen, um der Funktion mitzuteilen, was sie zurückgeben soll.

Wenn Sie die Anzahl der Minuten in der Periode benötigen, ermitteln Sie diese aus der Anzahl der Sekunden in der Periode geteilt durch 60. Und nennen Sie nicht etwas, das keine Krücke ist. Krücken sind das, was Sie tun - Sie versuchen, Zahlennamen in Ihren Berechnungen zu verwenden.

Das ist schade...

 
Vadim Lin:

Warum...? Wenn es darum geht, die Logik bei jeder Überquerung derselben Linie zu verdoppeln, dann muss natürlich die gesamte Logik (die ich nicht geschrieben habe) direkt von der Person geschrieben werden. Ich weiß nicht, was sein ultimatives Ziel ist, vielleicht will er zählen, wie oft der Preis jede Linie überquert, solange er sie überquert...

Ich habe verstanden, dass es dem Mann nicht gelungen ist, ein solches Ereignis für seine Zwecke zu bekommen. Jetzt wird er ein solches Ereignis bekommen, und dann liegt es in seinem Ermessen.


Es wäre logisch, die Linie selbst an der ersten Kreuzung in ein bestimmtes Format umzubenennen (oder eine Bezeichnung in die Beschreibung dieser Abbildung aufzunehmen). Und wenn alle Objekte angekreuzt sind, überprüfen Sie die Linie auf das Fehlen dieser Markierung.

Wenn es darum geht, dass es ineffektiv ist, alle Objekte bei jedem Tick auszuprobieren, ist das ein anderes Thema.

Sie verwenden alte Funktionen, die bald in Vergessenheit geraten werden. Aus diesem Grund ist der Code nicht plattformübergreifend, obwohl man ihn ohne weiteres auf jeder Plattform ohne Änderungen einsetzen könnte.

Und das Umbenennen macht viel Spaß. Sie müssen sich nur die vom Indikator ausgegebenen Zeilennamen ansehen, den expliziten Bezeichner daraus extrahieren und ihn verwenden, um die richtigen Zeilen zu finden.

 
Vadim Lin:

Herzlichen Dank! Es warwchar_t, das geholfen hat! Ich habe gelesen, dass es 2 Bytes pro Zeichen speichert, im Gegensatz zu char.

Aber der Funktionsparameter "str" gibt immer noch nicht den ihm zugewiesenen Wert zurück... Ich frage mich, warum...

Wahrscheinlich, weil Sie den Rückgabewert der Funktion zurückgeben müssen.

extern "C" __declspec(dllexport) wchar_t* __stdcall ToString(wchar_t* str)
{
   wchar_t wcs[256];
   wcscpy(wcs, str);

   wchar_t* addStr = L" --- Привет! ---";
   
   wchar_t* res = wcsncat(wcs, addStr, wcslen(addStr) + 1);
   
   return(res);
}
 
Artyom Trishkin:

Sie verwenden alte Funktionen, die bald in Vergessenheit geraten werden. Und der Code ist nicht plattformübergreifend, obwohl man ihn ohne weiteres auf jeder Plattform ohne Änderungen zum Laufen bringen könnte.

Und das Umbenennen macht viel Spaß. Sie brauchen sich nur die Namen der Zeilen im Indikator anzusehen, den expliziten Bezeichner zu extrahieren und ihn zu verwenden, um die erforderlichen Zeilen zu finden.

Danke für die Bearbeitung!

In der Tat habe ich eher selten in MQL4 programmiert, während ich MQL5 kaum benutzt habe. Deshalb gebe ich zu, dass einige Methoden veraltet sind (aber ich arbeite trotzdem daran!).

Нужно просто поглядеть какие имена линий выдаёт индикатор, вычленить из них их явный идентификатор

Sicherlich, aber nicht Sie oder ich - wir kennen die Eigenheiten der Namensgebung dieser Linien nicht. Das "Auswendiglernen" solcher Levels ist auch eine Option, aber dann müssten die Ergebnisse unserer "Auswendiglernerei" irgendwo in einer Datei gespeichert werden, und ohne das - bei jedem Zusammenbruch des Terminals - wäre das Bild dessen, was vor sich geht, ziemlich unklar. Zumindest die Umbenennung löst dieses Problem, auch wenn diese Methode nicht unbedingt die beste ist.

Ich könnte mich irren, aber die Person hat geschrieben, dass bis zu 100 Zeilen gleichzeitig verwendet werden, und zwar nur Zeilen, und sonst ist nichts auf der Karte zu sehen. Soweit ich weiß, müssen alle Leitungen auf Überkreuzungen überwacht werden. Was Sie also aus den Namen "herauslesen" wollen, weiß ich nicht))

 
Artyom Trishkin:


Der Punkt ist, dass die Variable _Period Zeitrahmenwerte zurückgeben sollte.
Und die Konstanten müssen den Periodenwerten entsprechen, nicht nur den Enum-Konstanten.
Andernfalls geht der Sinn dieser Variable verloren, die speziell dafür gedacht ist, den Zeitrahmenwert schnell und ohne Umrechnung durch zusätzliche Funktionen zu ermitteln.

 
Vadim Lin:

Danke für die Bearbeitung!

In der Tat habe ich in den letzten Jahren relativ selten in MQL4 programmiert, und MQL5 habe ich kaum benutzt. Daher gebe ich zu, dass einige Methoden veraltet sind (aber ich arbeite trotzdem daran!).

Sicherlich, aber nicht Sie oder ich - wir kennen die Eigenheiten der Namensgebung dieser Linien nicht. Das "Auswendiglernen" solcher Levels ist auch eine Option, aber dann müssten die Ergebnisse unserer "Auswendiglernerei" irgendwo in einer Datei gespeichert werden, und ohne das - jedes Mal, wenn das Terminal abstürzt - wäre das Bild dessen, was vor sich geht, sehr unklar. Zumindest die Umbenennung löst dieses Problem, auch wenn diese Methode nicht unbedingt die beste ist.

Ich könnte mich irren, aber die Person schrieb, dass bis zu 100 Zeilen gleichzeitig verwendet werden, und zwar nur Zeilen, und sonst nichts auf der Karte. Soweit ich weiß, müssen alle Leitungen auf Überkreuzungen überwacht werden. Was Sie also aus den Namen "herauslesen" werden, weiß ich nicht))

Wenn das Terminal abstürzt, muss es neu gestartet werden. Der Indikator muss erneut auf das Diagramm angewendet werden, oder es muss ein Expert Advisor ausgeführt werden, der die Daten dieses Indikators verwendet (dann lädt der EA den Indikator selbst, wenn er darauf zugreift). In diesem Fall (und auch beim normalen Neustart des Terminals mit automatischem Laden der auf dem Chart installierten Programme) zeichnet der Indikator alle seine Linien neu - es ist nicht nötig, etwas zu speichern. Diese Zeilen können später noch einmal gelesen werden. Außerdem müssen sie ohnehin gelesen werden.

Damit der EA nur die vom Indikator erzeugten Linien überwacht, reicht es aus, die Namen der vom Indikator erzeugten Linien zu betrachten und zu versuchen, die sich wiederholende Teilzeichenkette in den Namen zu finden - die gleiche für alle Linien. Diese Teilstrings werden verwendet, um die erforderlichen Zeilen zu finden.

Das ist ganz einfach: Schauen Sie sich die Liste der Objekte an, wenn der Indikator läuft.

 
Roman:

Der Punkt ist, dass die Variable _Period Werte für den Zeitrahmen liefern muss.
Und die Konstanten müssen den Periodenwerten entsprechen, nicht nur den Enum-Konstanten.
Andernfalls geht der Sinn dieser Variable verloren, die speziell dafür gedacht ist, den Zeitrahmenwert schnell und ohne Umrechnung durch zusätzliche Funktionen zu ermitteln.

Du hast überall Menschen und Pferde durcheinander gebracht... Nicht nur in dieser Frage. Wenn Sie Änderungen gemäß Ihren Vorschlägen vornehmen, wird die Hälfte von allem, was bisher funktioniert hat, einfach sterben.

Die Gleichsetzung einer Tickgröße mit einer Punktgröße ist nichts wert...

 
Roman:

Versuchen Sie, den von der Variablen _Period zurückgegebenen Wert für Zeiträume über H1 in Ihren mathematischen Berechnungen zu verwenden.
Sie werden sofort sehen, wer im Unrecht ist.

Ich verwende es in fast jedem EA. Das ist nicht mehr lustig. Es tut mir leid, das ist das erste Mal, dass ich das sehe.
 
Artyom Trishkin:

Du hast überall Menschen und Pferde durcheinander gebracht... Nicht nur in dieser Frage. Wenn Sie Änderungen gemäß Ihren Vorschlägen vornehmen, wird die Hälfte von allem, was bisher funktioniert hat, einfach verschwinden.

Allein die Gleichsetzung von Zeckengröße und Punktgröße...

Denn es gibt eine Menge Ungereimtheiten mit der aktuellen Realität.
Und Sie versuchen, Entschuldigungen für diese Ungereimtheiten zu finden.
Im Gegenteil, ich habe geschrieben, dass ein Tick nicht mit einem Punkt gleichzusetzen ist!
Es ist Ihr eigener, erfundener Standpunkt.
In Anbetracht der Tatsache, dass Punkt früher genau einem Punkt entsprach, als es nur eine vierstellige Zahl gab.
Aber nach der Einführung der fünften Ziffer haben Sie angefangen, mit Ihren Ausreden Namen zu erfinden.