Après avoir créé une instance de l'indicateur ci-dessous, vous pourrez naviguer entre différentes pages web sur cTrader.com. Votre fenêtre de sortie choisie se comportera de manière similaire à un navigateur web.
Utiliser des scripts et gérer les événements de message
La classe WebView possède deux membres puissants, à savoir la méthode ExecuteScript() et l'événement WebMessageReceived. Vous pouvez les utiliser pour créer des algorithmes qui accèdent à une page web de votre choix (par exemple, un flux d'actualités Forex ou toute page avec du HTML personnalisé), exécutent du JavaScript personnalisé sur cette page et gèrent correctement tous les messages envoyés depuis le WebView vers l'algorithme.
Exécuter des scripts
Pour exécuter un script personnalisé dans votre WebView, il vous suffit d'appeler la méthode WebView.ExecuteScript(StringjavaScript) comme indiqué ci-dessous.
Le script qui doit être exécuté dans le WebView peut simplement être transmis sous forme de chaîne à la méthode ExecuteString().
Notez que cette chaîne doit contenir du JavaScript parfaitement exact. Par exemple, elle doit inclure un point-virgule après chaque ligne exécutable.
JavaScript multiligne
Vous pouvez librement transmettre du JavaScript multiligne à la méthode ExecuteScript() comme indiqué dans l'exemple ci-dessous (notez l'utilisation d'un littéral de chaîne).
1234
_webView.ExecuteScript(@"const element = document.getElementById('nextButton');element.style.display = 'none';");
Gérer les événements de message
L'événement WebMessageReceived est déclenché lorsque le contenu affiché dans un WebView envoie un message. Vous pouvez réagir à cet événement en vous abonnant à tout gestionnaire d'événements approprié.
Pour envoyer un message depuis un WebView, il vous suffit d'appeler window.postMessage() depuis le code JavaScript à l'intérieur de la page HTML. Par exemple, vous pouvez transmettre le script de l'exemple ci-dessous pour calculer la différence en pourcentage entre deux nombres (tels que les prix d'entrée et de sortie possibles pour une position).
Le contexte n'est pas partagé entre C# et JavaScript lorsque vous appelez la méthode ExecuteScript(). Si vous souhaitez transmettre une variable de la portée C# à la portée JavaScript, vous devrez utiliser l'interpolation de chaînes.
Il est possible de combiner ExecuteScript() et OnWebMessageReceived pour placer des contrôles dans une page ouverte via WebView qui, lors de l'interaction, renvoient des messages au cBot. Dans l'exemple ci-dessous, nous utilisons cette fonctionnalité pour permettre le trading directement dans le WebView. Notez que le WebView ouvre une page HTML personnalisée plutôt qu'une ressource existante.
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;}}}
Via WebView, le cBot ouvre une page HTML personnalisée contenant des contrôles qui nous permettent de placer de nouveaux ordres. À l'aide de la méthode SendSymbolsToHtml(), le cBot remplit un menu déroulant dans le HTML avec une liste de tous les symboles qu'un compte peut trader. Pendant que le cBot est en cours d'exécution, l'utilisateur peut sélectionner un symbole, spécifier le volume de l'ordre, puis placer un nouvel ordre directement dans la page web sans jamais interagir avec les contrôles de cTrader.