using MtApi2Net.Client; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net; using NinjaTrader.Data; using System.ComponentModel.DataAnnotations; using System.Threading; namespace NinjaTrader.NinjaScript.Indicators.Tapi { public class TestApi : Indicator { private ApiClient _apiClient; private bool _stop; protected override void OnStateChange() { if (State == State.SetDefaults) { Name = "TestApi"; Calculate = Calculate.OnEachTick; IsChartOnly = true; IsOverlay = true; Host = "127.0.0.1"; Port = 3333; Symbol = "EURUSD"; } else if (State == State.Configure) { if (_apiClient == null) { IPAddress ip; if (IPAddress.TryParse(Host, out ip)) { _apiClient = new ApiClient(ip, Port); _apiClient.OnTransactionArrived += _apiClient_OnTransactionArrived; _apiClient.OnClientConnected += _apiClient_OnClientConnected; _apiClient.OnClientDisconnected += _apiClient_OnClientDisconnected; _apiClient.OnClientReceived += _apiClient_OnClientReceived; _apiClient.ConnectAsync(); } } } else if (State == State.Historical) { } else if (State == State.Terminated) { if (_apiClient != null) { _apiClient.Disconnect(); _apiClient.Dispose(); } _apiClient = null; } } private void _apiClient_OnClientDisconnected(object sender, OnClientConnectionEventArgs e) { Print("Disconnected."); // Wait for a while... Thread.Sleep(1000); // Try to connect again if (!_stop) _apiClient.ConnectAsync(); } private void _apiClient_OnClientConnected(object sender, OnClientConnectionEventArgs e) { Print("Connected."); } private void _apiClient_OnTransactionArrived(object sender, OnTransactionReceivedEventArgs e) { string time = DateTime.Now.ToString("HH:mm:ss") + "." + DateTime.Now.ToString("fff") + ": "; try { Print(time + e.TradeTransaction.MqlTradeRequest.ToString()); Print(time + e.TradeTransaction.MqlTradeResult.ToString()); } catch (Exception ex) { Print(time + ex.ToString()); } } private void _apiClient_OnClientReceived(object sender, OnClientReceivedEventArgs e) { string msg = Encoding.UTF8.GetString(e.Buffer); Print("OnClientReceived: " + msg); } protected override void OnBarUpdate() { if (State != State.Historical) { string time = DateTime.Now.ToString("HH:mm:ss") + "." + DateTime.Now.ToString("fff") + ": "; try { var quote = _apiClient.GetLastTick(Symbol).Result; Print(time + quote.ToString()); } catch (Exception ex) { Print(time + ex.ToString()); } } } // Async method //protected async override void OnBarUpdate() //{ // if (State != State.Historical) // { // string time = DateTime.Now.ToString("HH:mm:ss") + "." + DateTime.Now.ToString("fff") + ": "; // try // { // var quote = await _apiClient.GetLastTick(Symbol); // Print(time + quote.ToString()); // } // catch (Exception ex) // { // Print(time + ex.ToString()); // } // } //} [Display(Name = "Host", GroupName = "1. api", Order = 0)] public string Host { get; set; } [Range(0, 65000)] [Display(Name = "Port", GroupName = "1. api", Order = 10)] public int Port { get; set; } [Display(Name = "Symbol", GroupName = "1. api", Order = 20)] public string Symbol { get; set; } } } #region NinjaScript generated code. Neither change nor remove. namespace NinjaTrader.NinjaScript.Indicators { public partial class Indicator : NinjaTrader.Gui.NinjaScript.IndicatorRenderBase { private Tapi.TestApi[] cacheTestApi; public Tapi.TestApi TestApi() { return TestApi(Input); } public Tapi.TestApi TestApi(ISeries input) { if (cacheTestApi != null) for (int idx = 0; idx < cacheTestApi.Length; idx++) if (cacheTestApi[idx] != null && cacheTestApi[idx].EqualsInput(input)) return cacheTestApi[idx]; return CacheIndicator(new Tapi.TestApi(), input, ref cacheTestApi); } } } namespace NinjaTrader.NinjaScript.MarketAnalyzerColumns { public partial class MarketAnalyzerColumn : MarketAnalyzerColumnBase { public Indicators.Tapi.TestApi TestApi() { return indicator.TestApi(Input); } public Indicators.Tapi.TestApi TestApi(ISeries input) { return indicator.TestApi(input); } } } namespace NinjaTrader.NinjaScript.Strategies { public partial class Strategy : NinjaTrader.Gui.NinjaScript.StrategyRenderBase { public Indicators.Tapi.TestApi TestApi() { return indicator.TestApi(Input); } public Indicators.Tapi.TestApi TestApi(ISeries input) { return indicator.TestApi(input); } } } #endregion