После создания экземпляра приведенного ниже индикатора вы сможете перемещаться между различными веб-страницами на cTrader.com. Выбранное вами окно вывода будет вести себя аналогично веб-браузеру.
Использование скриптов и обработка событий сообщений
Класс WebView имеет два мощных члена, а именно метод ExecuteScript() и событие WebMessageReceived. Вы можете использовать их для создания алгоритмов, которые получают доступ к выбранной вами веб-странице (например, к ленте новостей Forex или любой странице с пользовательским HTML), выполняют на этой странице пользовательский JavaScript и корректно обрабатывают любые сообщения, отправленные из WebView обратно в алгоритм.
Выполнение скриптов
Чтобы выполнить пользовательский скрипт внутри вашего WebView, все, что вам нужно сделать, — это вызвать метод WebView.ExecuteScript(StringjavaScript), как показано ниже.
Скрипт, который необходимо выполнить внутри WebView, можно просто передать в виде строки в метод ExecuteString().
Обратите внимание, что эта строка должна содержать полностью корректный JavaScript. Например, она должна включать точку с запятой после каждой исполняемой строки.
Многострочный JavaScript
Вы можете свободно передавать многострочный JavaScript в метод ExecuteScript(), как показано в примере ниже (обратите внимание на использование строкового литерала).
1234
_webView.ExecuteScript(@"const element = document.getElementById('nextButton');element.style.display = 'none';");
Обработка событий сообщений
Событие WebMessageReceived возникает, когда содержимое, отображаемое в WebView, отправляет сообщение. Вы можете реагировать на это событие, подписавшись на любой подходящий обработчик событий.
Чтобы отправить сообщение из WebView, все, что вам нужно сделать, — это вызвать window.postMessage() из кода JavaScript внутри HTML-страницы. Например, вы можете передать скрипт из приведенного ниже примера для вычисления процентной разницы между двумя числами (такими как возможные цены входа и выхода для позиции).
Контекст не является общим для C# и JavaScript при вызове метода ExecuteScript(). Если вы хотите передать переменную из области видимости C# в область видимости JavaScript, вам придется использовать интерполяцию строк.
Можно комбинировать ExecuteScript() и OnWebMessageReceived, чтобы разместить элементы управления внутри страницы, открытой через WebView, которые при взаимодействии отправляют сообщения обратно в сиБот. В приведенном ниже примере мы используем эту функциональность, чтобы разрешить торговлю непосредственно внутри WebView. Обратите внимание, что WebView открывает пользовательскую HTML-страницу, а не существующий ресурс.
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;}}}
Через WebView сиБот открывает пользовательскую HTML-страницу, содержащую элементы управления, которые позволяют нам размещать новые ордера. Используя метод SendSymbolsToHtml(), сиБот заполняет выпадающее меню внутри HTML списком всех инструментов, которыми может торговать счет. Пока сиБот работает, пользователь может выбрать инструмент, указать объем ордера, а затем разместить новый ордер непосредственно внутри веб-страницы, не взаимодействуя с элементами управления внутри cTrader.