Dopo aver creato un'istanza dell'indicatore qui sotto, potrai navigare tra varie pagine web su cTrader.com. La finestra di output scelta si comporterà in modo simile a un browser web.
La classe WebView dispone di due membri potenti, ovvero il metodo ExecuteScript() e l'evento WebMessageReceived. Puoi utilizzarli per creare algoritmi che accedono a una pagina web di tua scelta (ad esempio, un feed di notizie Forex o qualsiasi pagina con HTML personalizzato), eseguono JavaScript personalizzato su questa pagina e gestiscono correttamente tutti i messaggi inviati dalla WebView all'algoritmo.
Esecuzione di script
Per eseguire uno script personalizzato all'interno della tua WebView, devi solo chiamare il metodo WebView.ExecuteScript(StringjavaScript) come mostrato di seguito.
Lo script che deve essere eseguito all'interno della WebView può essere semplicemente passato come stringa al metodo ExecuteString().
Nota che questa stringa deve contenere JavaScript completamente accurato. Ad esempio, deve includere un punto e virgola dopo ogni riga eseguibile.
JavaScript multiriga
Puoi passare liberamente JavaScript multiriga al metodo ExecuteScript() come mostrato nell'esempio seguente (nota l'uso di un valore letterale stringa).
1234
_webView.ExecuteScript(@"const element = document.getElementById('nextButton');element.style.display = 'none';");
Gestione di eventi messaggio
L'evento WebMessageReceived viene generato quando il contenuto visualizzato in una WebView invia un messaggio. Puoi reagire a questo evento sottoscrivendo qualsiasi gestore di eventi adatto.
Per inviare un messaggio da una WebView, devi solo chiamare window.postMessage() dal codice JavaScript all'interno della pagina HTML. Ad esempio, puoi passare lo script nell'esempio seguente per calcolare la differenza percentuale tra due numeri (come possibili prezzi di entrata e uscita per una posizione).
Il contesto non è condiviso tra C# e JavaScript quando chiami il metodo ExecuteScript(). Se desideri passare una variabile dall'ambito C# all'ambito JavaScript, dovrai utilizzare l'interpolazione di stringhe.
Posizionamento di controlli all'interno di una WebView
È possibile combinare ExecuteScript() e OnWebMessageReceived per posizionare controlli all'interno di una pagina aperta tramite WebView che, all'interazione, inviano messaggi al cBot. Nell'esempio seguente, utilizziamo questa funzionalità per consentire il trading direttamente all'interno della WebView. Nota che la WebView apre una pagina HTML personalizzata anziché una risorsa esistente.
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;}}}
Tramite WebView, il cBot apre una pagina HTML personalizzata contenente controlli che ci consentono di piazzare nuovi ordini. Utilizzando il metodo SendSymbolsToHtml(), il cBot riempie un menu a discesa all'interno dell'HTML con un elenco di tutti i simboli che un conto può negoziare. Mentre il cBot è in esecuzione, l'utente può selezionare un simbolo, specificare il volume dell'ordine e quindi piazzare un nuovo ordine direttamente all'interno della pagina web senza mai interagire con i controlli all'interno di cTrader.