Nach dem Erstellen einer Instanz des nachfolgenden Indikators können Sie zwischen verschiedenen Webseiten auf cTrader.com navigieren. Ihr gewähltes Ausgabefenster verhält sich ähnlich wie ein Webbrowser.
Skripte verwenden und Nachrichtenereignisse verarbeiten
Die Klasse WebView verfügt über zwei leistungsstarke Elemente, nämlich die Methode ExecuteScript() und das Ereignis WebMessageReceived. Sie können diese verwenden, um Algorithmen zu erstellen, die auf eine Webseite Ihrer Wahl zugreifen (z. B. einen Forex-Newsfeed oder eine beliebige Seite mit benutzerdefiniertem HTML), benutzerdefiniertes JavaScript auf dieser Seite ausführen und alle vom WebView an den Algorithmus gesendeten Nachrichten korrekt verarbeiten.
Skripte ausführen
Um ein benutzerdefiniertes Skript in Ihrem WebView auszuführen, müssen Sie lediglich die Methode WebView.ExecuteScript(StringjavaScript) wie unten gezeigt aufrufen.
Das Skript, das im WebView ausgeführt werden soll, kann einfach als String an die Methode ExecuteString() übergeben werden.
Beachten Sie, dass dieser String vollständig korrektes JavaScript enthalten muss. Er muss beispielsweise nach jeder ausführbaren Zeile ein Semikolon enthalten.
Mehrzeiliges JavaScript
Sie können der Methode ExecuteScript() problemlos mehrzeiliges JavaScript übergeben, wie im folgenden Beispiel gezeigt (beachten Sie die Verwendung eines Zeichenfolgenliterals).
1234
_webView.ExecuteScript(@"const element = document.getElementById('nextButton');element.style.display = 'none';");
Nachrichtenereignisse verarbeiten
Das Ereignis WebMessageReceived wird ausgelöst, wenn der in einem WebView angezeigte Inhalt eine Nachricht sendet. Sie können auf dieses Ereignis reagieren, indem Sie einen geeigneten Ereignishandler abonnieren.
Um eine Nachricht von einem WebView zu senden, müssen Sie lediglich window.postMessage() aus dem JavaScript-Code innerhalb der HTML-Seite aufrufen. Sie können beispielsweise das Skript im folgenden Beispiel übergeben, um die prozentuale Differenz zwischen zwei Zahlen zu berechnen (z. B. mögliche Einstiegs- und Ausstiegspreise für eine Position).
Der Kontext wird nicht zwischen C# und JavaScript geteilt, wenn Sie die Methode ExecuteScript() aufrufen. Wenn Sie eine Variable aus dem C#-Bereich an den JavaScript-Bereich übergeben möchten, müssen Sie String-Interpolation verwenden.
Es ist möglich, ExecuteScript() und OnWebMessageReceived zu kombinieren, um Steuerelemente in einer über WebView geöffneten Seite zu platzieren, die bei Interaktion Nachrichten an den cBot zurücksenden. Im folgenden Beispiel verwenden wir diese Funktionalität, um den Handel direkt im WebView zu ermöglichen. Beachten Sie, dass das WebView eine benutzerdefinierte HTML-Seite anstelle einer vorhandenen Ressource öffnet.
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingcAlgo.API;usingcAlgo.API.Collections;usingcAlgo.API.Indicators;usingcAlgo.API.Internals;usingSystem.Text.Json;namespacecAlgo.Robots{[Robot(AccessRights = AccessRights.None)]publicclassWebViewInteractionsExample:Robot{privateWebView_webView;protectedoverridevoidOnStart(){varwindow=newWindow();_webView=newWebView();_webView.Loaded+=WebView_Loaded;_webView.NavigationCompleted+=WebView_NavigationCompleted;_webView.WebMessageReceived+=WebView_WebMessageReceived;window.Child=_webView;window.Width=500;window.Height=500;window.Show();window.Closed+=args=>Stop();// stop cBot when window is closed}privatevoidWebView_WebMessageReceived(WebViewWebMessageReceivedEventArgsargs){Print("Message received from WebView: {0}",args.Message);vartradeMessage=JsonSerializer.Deserialize<TradeMessage>(args.Message);;vartradeType=tradeMessage.side=="buy"?TradeType.Buy:TradeType.Sell;ExecuteMarketOrder(tradeType,tradeMessage.symbolName,tradeMessage.volume);}privatevoidWebView_Loaded(WebViewLoadedEventArgsargs){args.WebView.NavigateToStringAsync(@" <script> function setSymbols(symbols) // called from the cBot { const symbolSelector = document.getElementById('symbolHtml'); symbolSelector.innerHTML = ''; symbols.forEach((symbol) => { symbolSelector.add(new Option(symbol)); }); } function trade(operation) { const symbolSelector = document.getElementById('symbolHtml'); const selectedSymbolName = symbolSelector.options[symbolSelector.selectedIndex].text; window.postMessage({ side: operation, volume: Number(document.getElementById('volumeHtml').value), symbolName: selectedSymbolName }); //send message to cBot } </script> <body bgcolor='white'> <div style='display:flex;flex-direction:column;width:300px'> <h1>This is HTML page</h1> <div>Symbol:</div> <select id='symbolHtml'></select> <span style='margin-top: 10px'>Volume:</span> <input id='volumeHtml' value='1000' /> <div style='margin-top:10px'> <input type='button' value='Buy' onclick='trade(`buy`)' /> <input type='button' value='Sell' onclick='trade(`sell`)' /> </div> </div> </body> ");}privatevoidWebView_NavigationCompleted(WebViewNavigationCompletedEventArgsobj){SendSymbolsToHtml();}privatevoidSendSymbolsToHtml(){varallSymbols="";foreach(varsymbolinSymbols){allSymbols=allSymbols+"'"+symbol+"',";}_webView.ExecuteScript("setSymbols(["+allSymbols+"]);");// invokes the corresponding function inside HTML}}classTradeMessage{publicstringside{get;set;}publicdoublevolume{get;set;}publicstringsymbolName{get;set;}}}
Über WebView öffnet der cBot eine benutzerdefinierte HTML-Seite mit Steuerelementen, die es uns ermöglichen, neue Orders zu platzieren. Mithilfe der Methode SendSymbolsToHtml() füllt der cBot ein Dropdown-Menü im HTML mit einer Liste aller Währungspaare, mit denen ein Konto handeln kann. Während der cBot läuft, kann der Benutzer ein Währungspaar auswählen, das Ordervolumen angeben und dann eine neue Order direkt auf der Webseite platzieren, ohne jemals mit Steuerelementen in cTrader zu interagieren.