Po utworzeniu wystąpienia poniższego wskaźnika będziesz mógł nawigować między różnymi stronami internetowymi na cTrader.com. Wybrane okno wyjściowe będzie zachowywać się podobnie do przeglądarki internetowej.
Klasa WebView ma dwa potężne elementy, a mianowicie metodę ExecuteScript() i zdarzenie WebMessageReceived. Możesz ich użyć do tworzenia algorytmów, które uzyskują dostęp do wybranej strony internetowej (na przykład kanału wiadomości Forex lub dowolnej strony z niestandardowym HTML), wykonują niestandardowy JavaScript na tej stronie i poprawnie obsługują wszelkie komunikaty wysyłane z WebView z powrotem do algorytmu.
Wykonywanie skryptów
Aby wykonać niestandardowy skrypt wewnątrz WebView, wystarczy wywołać metodę WebView.ExecuteScript(StringjavaScript), jak pokazano poniżej.
Skrypt, który ma zostać wykonany wewnątrz WebView, można po prostu przekazać jako ciąg znaków do metody ExecuteString().
Należy pamiętać, że ten ciąg znaków musi zawierać w pełni poprawny JavaScript. Na przykład musi zawierać średnik po każdej wykonywalnej linii.
Wieloliniowy JavaScript
Możesz swobodnie przekazywać wieloliniowy JavaScript do metody ExecuteScript(), jak pokazano w poniższym przykładzie (zwróć uwagę na użycie literału ciągu).
1234
_webView.ExecuteScript(@"const element = document.getElementById('nextButton');element.style.display = 'none';");
Obsługa zdarzeń wiadomości
Zdarzenie WebMessageReceived jest wywoływane, gdy zawartość wyświetlana w WebView wysyła wiadomość. Możesz zareagować na to zdarzenie, subskrybując dowolny odpowiedni program obsługi zdarzeń.
Aby wysłać wiadomość z WebView, wystarczy wywołać window.postMessage() z kodu JavaScript wewnątrz strony HTML. Na przykład możesz przekazać skrypt z poniższego przykładu, aby obliczyć różnicę percentylową między dwiema liczbami (takimi jak możliwe ceny wejścia i wyjścia dla pozycji).
Kontekst nie jest współdzielony między C# a JavaScript, gdy wywołujesz metodę ExecuteScript(). Jeśli chcesz przekazać zmienną z zakresu C# do zakresu JavaScript, będziesz musiał użyć interpolacji ciągów.
Możliwe jest połączenie ExecuteScript() i OnWebMessageReceived, aby umieścić kontrolki wewnątrz strony otwartej przez WebView, które po interakcji wysyłają wiadomości z powrotem do cBota. W poniższym przykładzie używamy tej funkcjonalności, aby umożliwić handel bezpośrednio wewnątrz WebView. Zauważ, że WebView otwiera niestandardową stronę HTML, a nie istniejący zasób.
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;}}}
Za pośrednictwem WebView cBot otwiera niestandardową stronę HTML zawierającą kontrolki, które pozwalają nam składać nowe zlecenia. Używając metody SendSymbolsToHtml(), cBot wypełnia menu rozwijane wewnątrz HTML listą wszystkich symboli, którymi konto może handlować. Podczas działania cBota użytkownik może wybrać symbol, określić wolumen zlecenia, a następnie złożyć nowe zlecenie bezpośrednio wewnątrz strony internetowej bez konieczności interakcji z kontrolkami wewnątrz cTradera.