WPF
Die Windows Presentation Foundation (WPF) ist eine Windows-Benutzeroberflächenlösung (UI), die Teil von .NET ist. Ursprünglich im Jahr 2006 entwickelt, war sie als Nachfolger von WinForms gedacht. Weitere Informationen finden Sie in der offiziellen Dokumentation.
WPF ermöglicht die Erstellung einer umfangreichen und anspruchsvollen Benutzeroberfläche. Es trennt den Code von der Benutzeroberfläche durch die Verwendung von XAML, einer von Microsoft entwickelten XML-basierten Sprache. cTrader Windows ist eine WPF-Anwendung und alle UI-Elemente, die Sie sehen, werden von dieser Lösung unterstützt.
Die Verwendung von WPF ermöglicht die Entwicklung einer nahezu pixelgenauen, funktionsreichen Benutzeroberfläche. WPF hat jedoch eine steile Lernkurve. Wenn Sie relativ einfache UI-Elemente erstellen möchten, sollten Sie Chart-Steuerelemente oder WinForms verwenden.
Hinweis
Algorithmen, die WinForms oder WPF verwenden, können nur auf Windows-Rechnern ausgeführt werden.
Um WPF mit cBots und Indikatoren zu verwenden, ändern Sie Ihren cTrader-Compiler vom eingebetteten Compiler zum .NET SDK-Compiler.
Ihr Projekt konfigurieren
Ähnlich wie bei WinForms müssen Sie, bevor Sie WPF mit Ihren cBots und Indikatoren verwenden können, einige Änderungen an Ihrer Indikator- oder cBot-Projektdatei vornehmen. Da WPF nur unter Windows funktioniert, müssen Sie das Ziel-Framework Ihres Indikator- oder cBot-Projekts auf die Windows-Variante von .NET ändern.
Öffnen Sie dazu Ihre Projektdatei in Visual Studio und ersetzen Sie deren Inhalt durch Folgendes:
1 2 3 4 5 6 7 8 9 10 | |
Wir haben das Tag UseWpf hinzugefügt und den Wert von TargetFramework in net6.0-windows geändert.
Ändern Sie anschließend den Wert des Klassenparameters AccessRights in FullAccess. Wenn diese Änderung nicht vorgenommen wird, verfügt Ihre Erweiterung nicht über ausreichende Zugriffsrechte, um mit WPF zu arbeiten.
Erstellen Sie Ihr Projekt nach den oben genannten Änderungen neu.
Erstellen und Anzeigen eines Fensters mit WPF
Der Prozess zum Erstellen eines benutzerdefinierten Fensters ähnelt dem Erstellen eines benutzerdefinierten WinForm.
Nachdem Sie Ihr Projekt konfiguriert haben, klicken Sie mit der rechten Maustaste darauf, wählen Sie Hinzufügen und dann Fenster (WPF)....

Wählen Sie im neu geöffneten Fenster die Option WPF-Fenster. Setzen Sie den Fensternamen auf MainWindow und klicken Sie auf die Schaltfläche Hinzufügen. Das neue WPF-Fenster wird in Ihrem Projekt-Lösungs-Explorer angezeigt. Es wird zwei Dateien haben, eine .XAML-Datei und eine .cs-Datei, die den Backend-Code enthält.
Öffnen Sie die .XAML-Datei und kopieren Sie den folgenden Code hinein, um die Hintergrundfarbe in "SlateGray" zu ändern.
1 2 3 4 5 6 7 8 9 10 | |
Fügen Sie den folgenden Code in Ihre Indikator-Hauptquelldatei ein:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |
Wenn Sie ein neues WPF-Fenster hinzufügen, verwendet es den Namespace Ihres Indikators oder cBots (z. B. cAlgo). Ändern Sie ihn in der .cs-Datei, die den Fenster-Backend-Code enthält, in WPF_Test und stellen Sie sicher, dass er mit Ihrer using-Anweisung im Indikatorcode übereinstimmt.
Erstellen Sie den Indikator entweder von Visual Studio oder mit cTrader Algo neu.
Nachdem der Build-Prozess abgeschlossen ist, erstellen Sie eine Indikatorinstanz. Sie sollten Ihr benutzerdefiniertes Fenster fast unmittelbar nach dem Start erscheinen sehen.

Ein Handelspanel anzeigen
In diesem Beispiel erstellen wir ein einfaches Handelspanel mit WPF. Erstellen Sie einen neuen cBot und setzen Sie seinen Namen auf WPF Trading Panel.
Öffnen Sie Ihren neuen Roboter in Visual Studio und fügen Sie eine neue WPF-Ressource hinzu, wie oben beschrieben. Setzen Sie den Fensternamen auf MainWindow.

Öffnen Sie anschließend die .XAML-Datei des Fensters und fügen Sie den folgenden Code ein:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | |
Öffnen Sie anschließend die Backend-.cs-Datei und fügen Sie den folgenden Code ein:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | |
Wir sind nun bereit, unser benutzerdefiniertes Fenster mit unserem cBot zu starten. Öffnen Sie die cBot-Quelldatei und fügen Sie den folgenden Code ein:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
Erstellen Sie Ihren Code mit Visual Studio neu und erstellen Sie eine Instanz Ihres cBots. Führen Sie ihn aus und das folgende Fenster sollte erscheinen.

Wählen Sie im Fenster ein Symbol aus der Symbolliste aus und klicken Sie auf Ausführen. Obwohl unser Handelspanel etwas einfach ist, funktioniert es wie beabsichtigt. Sie können es als Vorlage für die Erstellung komplexer WPF-Steuerelemente verwenden.
Der Code in der .xaml.cs-Datei für unser Fenster ist dafür verantwortlich, Anweisungen an unseren cBot zu senden. Befolgen Sie beim Entwickeln von Backend-Code für Ihre Fenster diese Richtlinien:
- Erstellen Sie einen Dienst zur Verwaltung von Interaktionen mit einem cBot oder Indikator mithilfe der
BeginInvokeOnMainThread()-Methode. - Wenn Sie komplexe WPF-Steuerelemente erstellen, verwenden Sie MVVM, IoC und trennen Sie Ihre Geschäftslogikkomponenten von der Benutzeroberfläche (z. B. durch Verwendung von Prism)
Verwenden Sie einen dedizierten Thread für die Benutzeroberfläche
WinForms- und WPF-Fenster müssen innerhalb eines STA-markierten Threads ausgeführt werden, andernfalls funktionieren sie nicht. Weitere Informationen finden Sie in der offiziellen Dokumentation.
Sie können die ApartmentState-Eigenschaft eines bereits laufenden Threads nicht ändern. Da der Haupt-cBot- oder Indikator-Thread nicht STA-markiert ist, müssen Sie einen neuen STA-markierten Thread für WinForms und WPF verwenden.
Auf API-Mitglieder vom UI-Thread zugreifen
Wie wir bereits erklärt haben, müssen Sie einen separaten dedizierten Thread verwenden, um Ihre WPF-Steuerelemente auszuführen. Nur der Code, der auf diesem Thread ausgeführt wird, kann auf die Fenstersteuerelemente und -eigenschaften zugreifen.
Dasselbe gilt für alle Algo-API-Mitglieder. Da die API nicht thread-sicher ist, können Sie nicht vom UI-Thread auf API-Mitglieder zugreifen. Stattdessen müssen Sie die Arbeit verteilen, indem Sie die BeginInvokeOnMainThread()-Methode in Ihrem Indikator- oder cBot-Code verwenden.
Dies kann zu Komplikationen führen, wenn Sie Daten zwischen Ihrem Indikator oder cBot und einem WPF-Fenster austauschen möchten. Um dieses Problem zu lösen, können Sie eine Proxy-Klasse erstellen, um die Interaktionen zwischen Ihrem cBot oder Indikator und UI-bezogenen Threads zu verwalten.