Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Es wurde die Möglichkeit hinzugefügt, die Farbe von Elementrahmen programmatisch zu ändern und sie mit Parameterwerten zu verknüpfen. Dies ist ein informativer und nützlicher Indikator, der hilft, das Risikoniveau der eingegebenen Werte schnell zu erkennen. Er hat sich als praktisch und übersichtlich erwiesen. Außerdem erscheinen bei Überschreitung der festgelegten Grenzwerte Warnfenster.
Ein paar Beispiele:
Morgen werden wir es mit Beispielen und Code durchgehen.
Bevor wir mit dem Thema der Implementierung des gestaffelten Schutzes der Parametergrenzen und der Benutzerwarnungen fortfahren, sollten wir ein anderes Thema erwähnen, das diesem unmittelbar vorausgeht. Nämlich die Voreinstellung der Parameter.
Ich beginne mit dem Bekannten: Die meisten MQL-Programme haben Variablen der Kategorie Eingabe. Sie werden auf der globalen Ebene deklariert und sind in einem einzigen Einstellungsfenster sichtbar. Das Fenster erscheint beim Start des Programms, und darin kann der Benutzer die Anfangswerte der "externen" Variablen ändern, wenn dies erforderlich ist. Zuvor jedoch initialisiert der Benutzer die externen Variablen innerhalb des Programms. Der Punkt ist, dass die Voreinstellungen des Programms nicht universell sind, und deshalb gibt es eine Kategorie von Variablen, die bei jedem Start die Möglichkeit der Einstellung erfordern. Es ist auch bekannt, dass jeder Versuch, während der Programmausführung manuell auf externe Variablen zuzugreifen, unmöglich ist und einen Neustart erfordert. Mit einer grafischen Schnittstelle entfällt diese Notwendigkeit. Die Programmeinstellungen können zur Laufzeit geöffnet werden.
Es besteht jedoch nach wie vor die Notwendigkeit, die Programmparameter beim Start mit Anfangswerten zu versehen.
Bei einer grafischen Oberfläche macht es keinen Sinn, Variablen vom Typ Eingabe zu deklarieren , da wir das Standard-Einstellungsfenster nicht mehr benötigen , aber das Wesen bleibt dasselbe: Anstelle von Eingabevariablen müssen wir den Parametern von Steuerelementen Anfangswerte zuweisen.
Bei der Initialisierung des Programms sollten wir eine Funktion aufrufen, die unsere eigenen Fenster, nicht das Standardfenster, mit Initialwerten versieht. Optional kann dies im KIB-Konstruktor in der Phase der Schnittstellenerstellung geschehen, wenn V_CURRENT-Werte oder EIN/AUS-Zustände usw. gesetzt werden, aber jetzt ist es möglich, Elemente programmatisch zu initialisieren. Jetzt ist es möglich, die Initialisierung von Elementen im Konstruktor und im Programm zu kombinieren.
Daher benötigen wir eine spezielle Funktion, die von OnInit() aufgerufen wird, um diese Aufgabe zu erledigen.
Was genau diese Funktion macht:
Wie soll die Funktion heißen?
Ich würde sie Initialize() nennen, aber jeder kann sich seine eigene Variante ausdenken.
DieHauptsache ist, dass diese Funktion in jeder Schnittstelle Expert Advisor sein muss. Sie kann mit der Funktion OnTick() eines Expert Advisors oder OnCalculate() eines Indikators verglichen werden. Es ist wichtig, dies zu verstehen.
Welchen Wert wird die Funktion zurückgeben?
Die Funktion hat den Typ void. Es besteht keine Notwendigkeit, einen Wert zurückzugeben. Wenn sie aufgerufen wird, öffnet sie die notwendigen Fenster, initialisiert die Parameter der Elemente und stellt möglicherweise einige Eigenschaften ein. Das ist im Grunde alles. Theoretisch kann man darin auch anfängliche Parametergrenzen setzen, aber ich denke, dass die Wertkontrolle in einer separaten Funktion implementiert werden wird, die bei Elementereignissen aus der API-Datei und dem Timer aufgerufen wird. Ich werde wahrscheinlich in der nächsten Version einen Ausdruck der Kontrollaufrufe schreiben.
*Es ist wichtig zuberücksichtigen, dass sich das Konzept der Schnittstelle Expert Advisors im Moment noch im Aufbau befindet und viele Entdeckungen noch vor uns liegen.
Hier ist ein Beispiel für die Initialisierungsfunktion eines Interface Expert Advisors im Rahmen des aktuellen Demoprojekts:
1. Funktionsaufruf:
2. Funktionsimplementierung:
Bis jetzt sehe ich die Struktur der Funktion wie folgt. Eine sehr einfache Funktion. Sie öffnet Fenster und sendet die gewünschten Werte an die Elementparameter. Die Initialisierung von Elementen und das Öffnen von Fenstern kann man an einigen Stellen ändern, denn beim Öffnen von Fenstern werden sofort die gewünschten Werte der Elemente angezeigt, ohne dass ein zusätzliches Redrawing nötig ist. Dies sind jedoch Kleinigkeiten.
Kommen wir nun zum Hauptthema: der Implementierung des schrittweisen Schutzes von Parametern.
14.Realisierung des Stufenschutzes von Parametergrenzen:
//------------------------------------------------------------------------------------------------------------
Schreiben der Logik zur Kontrolle der Einstellungen innerhalb der vorgegebenen Grenzen und Erstellen eines Warnsystems:
//-----------------------------------------------------------------------------
Fahren wir fort:
1. setzen Sie die Anfangswerte der Parameter der ausgewählten Elemente und öffnen Sie die erforderlichen Fenster. Zu diesem Zweck schreiben wir die FunktionInitialise() und rufen sie in der Funktion _OnInit() auf.
Ergebnis: Die erforderlichen Fenster werden geöffnet und die Anfangswerte für die Zielelemente werden gesetzt.
2. öffnen Sie die API-Datei und schreiben Sie die Verbindung der Elemente.Schreiben Sie für jedes Element Aufrufe und übergeben Sie den Wert an die anderen Zielelemente in der Kette:
3. Testen Sie die Verbindung:
Ergebnis: Die Elementwerte sind wie vorgesehen verbunden.
4. Schreiben Sie eine Funktion zur Steuerung der Parameter unserer Gruppe von Elementen: void Risk_management_group_1().
Rufen Sie die Funktion Risk_management_group_1() über die Funktion _OnInit() auf:
Ergebnis: funktioniert wie vorgesehen, aber bei der Eingabe eines Wertes in das Eingabefeld setzt das Warnfenster den eingegebenen Wert nicht zurück, wenn es erscheint(muss verbessert werden).
(*Auch - die Einstellung der Rahmenfarbe wurde im Update hinzugefügt, fehlt aber in der aktuellen Version).
Die nächste Aufgabe besteht darin, die eingegebenen Parameter durch Drücken der Schaltfläche "Abbrechen" zu löschen.
Dies ist eine sehr schwierige Aufgabe, aber ich habe sie bereits teilweise umgesetzt. Ich werde versuchen, die frühere Funktionalität wiederherzustellen.
In der letzten Aufschlüsselung habe ich gezeigt, wie die farbliche Anzeige von Risiken und das Öffnen von Sperrfenstern bei der Überschreitung von festgelegten Parametergrenzen funktioniert. Es wurden jedoch zwei Probleme entdeckt, die ich nicht erwartet hatte.
1. Die Risikomanagementfunktion öffnet das erste Warnfenster, wenn ein gefährliches Niveau überschritten wird, aber wenn Sie den Cursor in diesem Moment auf dem Element gedrückt halten, wächst der Wert weiter und erreicht das nächste bedingte Niveau. - Kritisch.
2. Beim Überschreiten des kritischen Wertes öffnet sich das letzte Warnfenster, aber auch dieses stoppt die Veränderung des Wertes nicht, wenn der Benutzer die linke Maustaste weiterhin gedrückt hält.
(3) Wenn der Benutzer die Maustaste loslässt und die Warnfenster schließen möchte, kann er dies nicht tun. Um genau zu sein, kann er es nicht. Der Grund dafür ist, dass die beiden blockierenden Fenster beginnen, sich gegenseitig zu blockieren. Wenn eines der blockierenden Fenster geöffnet ist, lässt es sich leicht schließen, aber wenn zwei Fenster gleichzeitig geöffnet sind, kann nichts anderes auf der Benutzeroberfläche funktionieren. Das Programm fällt in einen Stupor, obwohl es noch funktioniert.
Das folgende Bild zeigt, wie das passiert ist:
Dann habe ich die Probleme mit der gegenseitigen Verriegelung der Einstellungsfenster behoben, und jetzt stören sich die Fenster nicht mehr gegenseitig. Sie führen die Sperrfunktion gemeinsam aus, ohne sich gegenseitig zu behindern.
Jetzt muss ich dafür sorgen, dass das Warnfenster automatisch Änderungen am Parameterwert stoppt, auch wenn die linke Maustaste gedrückt wird und das Element aktiv ist.