Setelah membuat instance indikator di bawah ini, Anda akan dapat bernavigasi di antara berbagai halaman web di cTrader.com. Jendela output yang Anda pilih akan berperilaku mirip dengan browser web.
Kelas WebView memiliki dua anggota yang kuat, yaitu metode ExecuteScript() dan event WebMessageReceived. Anda dapat menggunakannya untuk membuat algo yang mengakses halaman web pilihan Anda (misalnya, feed berita Forex atau halaman apa pun dengan HTML kustom), menjalankan JavaScript kustom pada halaman ini, dan menangani dengan benar pesan apa pun yang dikirim dari WebView kembali ke algo.
Menjalankan skrip
Untuk menjalankan skrip kustom di dalam WebView Anda, yang perlu Anda lakukan hanyalah memanggil metode WebView.ExecuteScript(StringjavaScript) seperti yang ditunjukkan di bawah ini.
Skrip yang perlu dijalankan di dalam WebView cukup dilewatkan sebagai string ke metode ExecuteString().
Perhatikan bahwa string ini harus berisi JavaScript yang sepenuhnya akurat. Misalnya, harus menyertakan titik koma setelah setiap baris yang dapat dieksekusi.
JavaScript Multi-baris
Anda dapat dengan bebas melewatkan JavaScript multi-baris ke metode ExecuteScript() seperti yang ditunjukkan dalam contoh di bawah ini (perhatikan penggunaan literal string).
1234
_webView.ExecuteScript(@"const element = document.getElementById('nextButton');element.style.display = 'none';");
Menangani peristiwa pesan
Peristiwa WebMessageReceived dipicu ketika konten yang ditampilkan di WebView mengirim pesan. Anda dapat bereaksi terhadap peristiwa ini dengan berlangganan ke penangan peristiwa yang sesuai.
Untuk mengirim pesan dari WebView, yang perlu Anda lakukan hanyalah memanggil window.postMessage() dari kode JavaScript di dalam halaman HTML. Misalnya, Anda dapat melewatkan skrip dalam contoh di bawah ini untuk menghitung perbedaan persentil antara dua angka (seperti kemungkinan harga masuk dan keluar untuk suatu posisi).
Konteks tidak dibagikan antara C# dan JavaScript ketika Anda memanggil metode ExecuteScript(). Jika Anda ingin melewatkan variabel dari lingkup C# ke lingkup JavaScript, Anda harus menggunakan interpolasi string.
Dimungkinkan untuk menggabungkan ExecuteScript() dan OnWebMessageReceived untuk menempatkan kontrol di dalam halaman yang dibuka melalui WebView yang, saat berinteraksi, mengirim pesan kembali ke cBot. Dalam contoh di bawah ini, kita menggunakan fungsionalitas ini untuk memungkinkan trading langsung di dalam WebView. Perhatikan bahwa WebView membuka halaman HTML kustom daripada sumber daya yang sudah ada.
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;}}}
Melalui WebView, cBot membuka halaman HTML kustom yang berisi kontrol yang memungkinkan kita menempatkan order baru. Menggunakan metode SendSymbolsToHtml(), cBot mengisi menu dropdown di dalam HTML dengan daftar semua simbol yang dapat diperdagangkan oleh akun. Saat cBot berjalan, pengguna dapat memilih simbol, menentukan volume order dan kemudian menempatkan order baru langsung di dalam halaman web tanpa pernah berinteraksi dengan kontrol di dalam cTrader.