Después de crear una instancia del indicador a continuación, podrá navegar entre varias páginas web en cTrader.com. La ventana de salida elegida se comportará de manera similar a un navegador web.
La clase WebView tiene dos miembros poderosos, a saber, el método ExecuteScript() y el evento WebMessageReceived. Puede usarlos para crear algoritmos que accedan a una página web de su elección (por ejemplo, un feed de noticias de Forex o cualquier página con HTML personalizado), ejecuten JavaScript personalizado en esta página y manejen correctamente cualquier mensaje enviado desde WebView de vuelta al algoritmo.
Ejecutar scripts
Para ejecutar un script personalizado dentro de su WebView, todo lo que necesita hacer es llamar al método WebView.ExecuteScript(StringjavaScript) como se muestra a continuación.
El script que debe ejecutarse dentro de WebView simplemente se puede pasar como una cadena al método ExecuteString().
Tenga en cuenta que esta cadena debe contener JavaScript completamente preciso. Por ejemplo, debe incluir un punto y coma después de cada línea ejecutable.
JavaScript de varias líneas
Puede pasar libremente JavaScript de varias líneas al método ExecuteScript() como se muestra en el ejemplo a continuación (observe el uso de un literal de cadena).
1234
_webView.ExecuteScript(@"const element = document.getElementById('nextButton');element.style.display = 'none';");
Manejar eventos de mensaje
El evento WebMessageReceived se activa cuando el contenido mostrado en un WebView envía un mensaje. Puede reaccionar a este evento suscribiéndose a cualquier controlador de eventos adecuado.
Para enviar un mensaje desde un WebView, todo lo que tiene que hacer es llamar a window.postMessage() desde el código JavaScript dentro de la página HTML. Por ejemplo, puede pasar el script en el ejemplo a continuación para calcular la diferencia porcentual entre dos números (como posibles precios de entrada y salida para una posición).
El contexto no se comparte entre C# y JavaScript cuando llama al método ExecuteScript(). Si desea pasar una variable del ámbito de C# al ámbito de JavaScript, tendrá que usar interpolación de cadenas.
Es posible combinar ExecuteScript() y OnWebMessageReceived para colocar controles dentro de una página abierta a través de WebView que, al interactuar, envíen mensajes de vuelta al cBot. En el ejemplo a continuación, usamos esta funcionalidad para permitir operar directamente dentro del WebView. Tenga en cuenta que WebView abre una página HTML personalizada en lugar de un recurso existente.
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;}}}
A través de WebView, el cBot abre una página HTML personalizada que contiene controles que nos permiten colocar nuevas órdenes. Mediante el método SendSymbolsToHtml(), el cBot llena un menú desplegable dentro del HTML con una lista de todos los símbolos con los que una cuenta puede operar. Mientras el cBot está en ejecución, el usuario puede seleccionar un símbolo, especificar el volumen de la orden y luego colocar una nueva orden directamente dentro de la página web sin interactuar nunca con los controles dentro de cTrader.