Aşağıdaki göstergenin bir örneğini oluşturduktan sonra, cTrader.com'daki çeşitli web sayfaları arasında gezinebileceksiniz. Seçtiğiniz çıktı penceresi bir web tarayıcısı gibi davranacaktır.
WebView sınıfının iki güçlü üyesi vardır: ExecuteScript() yöntemi ve WebMessageReceived olayı. Bunları kullanarak seçtiğiniz bir web sayfasına (örneğin, bir Forex haber akışı veya özel HTML içeren herhangi bir sayfa) erişen, bu sayfada özel JavaScript çalıştıran ve WebView'dan algoritmaya geri gönderilen tüm mesajları doğru şekilde işleyen algoritmalar oluşturabilirsiniz.
Betikleri yürütme
WebView'ınızın içinde özel bir betik yürütmek için yapmanız gereken tek şey aşağıda gösterildiği gibi WebView.ExecuteScript(StringjavaScript) yöntemini çağırmaktır.
WebView içinde yürütülmesi gereken betik, ExecuteString() yöntemine basitçe bir dize olarak geçirilebilir.
Bu dizenin tamamen doğru JavaScript içermesi gerektiğini unutmayın. Örneğin, her yürütülebilir satırdan sonra bir noktalı virgül içermelidir.
Çok satırlı JavaScript
Aşağıdaki örnekte gösterildiği gibi çok satırlı JavaScript'i ExecuteScript() yöntemine serbestçe geçirebilirsiniz (dize değişmezinin kullanımına dikkat edin).
1234
_webView.ExecuteScript(@"const element = document.getElementById('nextButton');element.style.display = 'none';");
Mesaj olaylarını işleme
WebMessageReceived olayı, bir WebView'da görüntülenen içerik bir mesaj gönderdiğinde tetiklenir. Bu olaya uygun bir olay işleyiciye abone olarak tepki verebilirsiniz.
Bir WebView'dan mesaj göndermek için yapmanız gereken tek şey, HTML sayfasındaki JavaScript kodundan window.postMessage() öğesini çağırmaktır. Örneğin, iki sayı arasındaki yüzdelik farkı (bir pozisyon için olası giriş ve çıkış fiyatları gibi) hesaplamak için aşağıdaki örnekteki betiği geçirebilirsiniz.
ExecuteScript() ve OnWebMessageReceived yöntemlerini birleştirerek, WebView aracılığıyla açılan bir sayfaya, etkileşim üzerine cBot'a mesaj gönderen kontroller yerleştirmek mümkündür. Aşağıdaki örnekte, bu işlevselliği WebView içinde doğrudan işlem yapmaya izin vermek için kullanıyoruz. WebView'ın mevcut bir kaynak yerine özel bir HTML sayfası açtığını unutmayın.
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 aracılığıyla cBot, yeni emirler vermemizi sağlayan kontroller içeren özel bir HTML sayfası açar. #!c# SendSymbolsToHtml()` yöntemini kullanarak cBot, bir hesabın işlem yapabileceği tüm sembollerin bir listesiyle HTML içindeki bir açılır menüyü doldurur. cBot çalışırken, kullanıcı bir sembol seçebilir, emir hacmini belirleyebilir ve ardından cTrader içindeki kontrollerle hiç etkileşime girmeden doğrudan web sayfasının içinden yeni bir emir verebilir.