using System; using System.Collections.Generic; using System.Linq; using System.Text; using MTApiService; using System.Drawing; using System.Collections; using System.Net; namespace MtApi { public delegate void MtApiQuoteHandler(object sender, string symbol, double bid, double ask); public sealed class MtApiClient { private const int DOUBLE_ARRAY_LIMIT = 64800; #region MetaTrader Constants //Special constant public const int NULL = 0; public const int EMPTY = -1; #endregion #region ctor public MtApiClient() { mClient.QuoteAdded +=new MtClient.MtQuoteHandler(mClient_QuoteAdded); mClient.QuoteRemoved += new MtClient.MtQuoteHandler(mClient_QuoteRemoved); mClient.QuoteUpdated += new MtClient.MtQuoteHandler(mClient_QuoteUpdated); mClient.ServerDisconnected += new EventHandler(mClient_ServerDisconnected); mClient.ServerFailed += new EventHandler(mClient_ServerFailed); } #endregion #region Public Methods /// ///Connect with MetaTrader API. Async method. /// ///Address of MetaTrader host (ex. 192.168.1.2) ///Port of host connection (default 8222) public void BeginConnect(string host, int port) { //if (string.IsNullOrEmpty(host) == false && (host.Equals("localhost") || host.Equals("127.0.0.1"))) //{ // this.BeginConnect(port); //} //else //{ Action connectAction = Connect; connectAction.BeginInvoke(host, port, null, null); //} } /// ///Connect with MetaTrader API. Async method. /// ///Port of host connection (default 8222) public void BeginConnect(int port) { Action connectAction = Connect; connectAction.BeginInvoke(port, null, null); } /// ///Disconnect from MetaTrader API. Async method. /// public void BeginDisconnect() { Action disconnectAction = Disconnect; disconnectAction.BeginInvoke(null, null); } /// ///Load quotes connected into MetaTrader API. /// public IEnumerable GetQuotes() { var quotes = mClient.GetQuotes(); return quotes != null ? (from q in quotes select q.Parse()) : null; } #endregion #region Properties /// ///Connection status of MetaTrader API. /// public MtConnectionState ConnectionState { get; private set; } #endregion #region Trading functions public int OrderSend(string symbol, TradeOperation cmd, double volume, double price, int slippage, double stoploss, double takeprofit , string comment, int magic, DateTime expiration, Color arrow_color) { var commandParameters = new ArrayList { symbol, (int)cmd, volume, price, slippage, stoploss, takeprofit , comment, magic, MtApiTimeConverter.ConvertToMtTime(expiration), MtApiColorConverter.ConvertToMtColor(arrow_color) }; return sendCommand(MtCommandType.OrderSend, commandParameters); } public int OrderSend(string symbol, TradeOperation cmd, double volume, double price, int slippage, double stoploss, double takeprofit , string comment, int magic, DateTime expiration) { return OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, Color.Empty); } public int OrderSend(string symbol, TradeOperation cmd, double volume, double price, int slippage, double stoploss, double takeprofit , string comment, int magic) { return OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, DateTime.MinValue, Color.Empty); } public int OrderSend(string symbol, TradeOperation cmd, double volume, double price, int slippage, double stoploss, double takeprofit , string comment) { return OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, 0, DateTime.MinValue, Color.Empty); } public int OrderSend(string symbol, TradeOperation cmd, double volume, double price, int slippage, double stoploss, double takeprofit) { return OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, null, 0, DateTime.MinValue, Color.Empty); } public int OrderSend(string symbol, TradeOperation cmd, double volume, string price, int slippage, double stoploss, double takeprofit) { double dPrice = 0; if (Double.TryParse(price, out dPrice)) return OrderSend(symbol, cmd, volume, dPrice, slippage, stoploss, takeprofit, null, 0, DateTime.MinValue, Color.Empty); return 0; } public int OrderSendBuy(string symbol, double volume, int slippage) { return OrderSendBuy(symbol, volume, slippage, 0, 0, null, 0); } public int OrderSendSell(string symbol, double volume, int slippage) { return OrderSendSell(symbol, volume, slippage, 0, 0, null, 0); } public int OrderSendBuy(string symbol, double volume, int slippage, double stoploss, double takeprofit) { return OrderSendBuy(symbol, volume, slippage, stoploss, takeprofit, null, 0); } public int OrderSendSell(string symbol, double volume, int slippage, double stoploss, double takeprofit) { return OrderSendSell(symbol, volume, slippage, stoploss, takeprofit, null, 0); } public int OrderSendBuy(string symbol, double volume, int slippage, double stoploss, double takeprofit, string comment, int magic) { var commandParameters = new ArrayList { symbol, volume, slippage, stoploss, takeprofit, comment, magic }; return sendCommand(MtCommandType.OrderSendBuy, commandParameters); } public int OrderSendSell(string symbol, double volume, int slippage, double stoploss, double takeprofit, string comment, int magic) { var commandParameters = new ArrayList { symbol, volume, slippage, stoploss, takeprofit, comment, magic }; return sendCommand(MtCommandType.OrderSendSell, commandParameters); } public bool OrderClose(int ticket, double lots, double price, int slippage, Color color) { var commandParameters = new ArrayList { ticket, lots, price, slippage, MtApiColorConverter.ConvertToMtColor(color) }; return sendCommand(MtCommandType.OrderClose, commandParameters); } public bool OrderClose(int ticket, double lots, double price, int slippage) { return OrderClose(ticket, lots, price, slippage, Color.Empty); } public bool OrderCloseBy(int ticket, int opposite, Color color) { var commandParameters = new ArrayList { ticket, opposite, MtApiColorConverter.ConvertToMtColor(color) }; return sendCommand(MtCommandType.OrderCloseBy, commandParameters); } public bool OrderCloseBy(int ticket, int opposite) { return OrderCloseBy(ticket, opposite, Color.Empty); } public bool OrderCloseByCurrentPrice(int ticket, int slippage) { var commandParameters = new ArrayList { ticket, slippage }; return sendCommand(MtCommandType.OrderCloseByCurrentPrice, commandParameters); } public double OrderClosePrice() { return sendCommand(MtCommandType.OrderClosePrice, null); } public double OrderClosePrice(int ticket) { var commandParameters = new ArrayList { ticket }; double retVal = sendCommand(MtCommandType.OrderClosePriceByTicket, commandParameters); return retVal; } public DateTime OrderCloseTime() { var commandResponse = sendCommand(MtCommandType.OrderCloseTime, null); return MtApiTimeConverter.ConvertFromMtTime(commandResponse); } public string OrderComment() { return sendCommand(MtCommandType.OrderComment, null); } public double OrderCommission() { return sendCommand(MtCommandType.OrderCommission, null); } public bool OrderDelete(int ticket, Color color) { var commandParameters = new ArrayList { ticket, MtApiColorConverter.ConvertToMtColor(color) }; return sendCommand(MtCommandType.OrderDelete, commandParameters); } public bool OrderDelete(int ticket) { return OrderDelete(ticket, Color.Empty); } public DateTime OrderExpiration() { var commandResponse = sendCommand(MtCommandType.OrderExpiration, null); return MtApiTimeConverter.ConvertFromMtTime(commandResponse); } public double OrderLots() { return sendCommand(MtCommandType.OrderLots, null); } public int OrderMagicNumber() { return sendCommand(MtCommandType.OrderMagicNumber, null); } public bool OrderModify(int ticket, double price, double stoploss, double takeprofit, DateTime expiration, Color arrow_color) { var commandParameters = new ArrayList { ticket, price, stoploss, takeprofit, MtApiTimeConverter.ConvertToMtTime(expiration), MtApiColorConverter.ConvertToMtColor(arrow_color) }; return sendCommand(MtCommandType.OrderModify, commandParameters); } public bool OrderModify(int ticket, double price, double stoploss, double takeprofit, DateTime expiration) { return OrderModify(ticket, price, stoploss, takeprofit, expiration, Color.Empty); } public double OrderOpenPrice() { return sendCommand(MtCommandType.OrderOpenPrice, null); } public double OrderOpenPrice(int ticket) { var commandParameters = new ArrayList { ticket }; double retVal = sendCommand(MtCommandType.OrderOpenPriceByTicket, commandParameters); return retVal; } public DateTime OrderOpenTime() { var commandResponse = sendCommand(MtCommandType.OrderOpenTime, null); return MtApiTimeConverter.ConvertFromMtTime(commandResponse); } public void OrderPrint() { sendCommand(MtCommandType.OrderPrint, null); } public double OrderProfit() { return sendCommand(MtCommandType.OrderProfit, null); } public bool OrderSelect(int index, OrderSelectMode select, OrderSelectSource pool) { var commandParameters = new ArrayList { index, (int)select, (int)pool }; return sendCommand(MtCommandType.OrderSelect, commandParameters); } public bool OrderSelect(int index, OrderSelectMode select) { return OrderSelect(index, select, OrderSelectSource.MODE_TRADES); } public int OrdersHistoryTotal() { return sendCommand(MtCommandType.OrdersHistoryTotal, null); } public double OrderStopLoss() { return sendCommand(MtCommandType.OrderStopLoss, null); } public int OrdersTotal() { return sendCommand(MtCommandType.OrdersTotal, null); } public double OrderSwap() { return sendCommand(MtCommandType.OrderSwap, null); } public string OrderSymbol() { return sendCommand(MtCommandType.OrderSymbol, null); } public double OrderTakeProfit() { return sendCommand(MtCommandType.OrderTakeProfit, null); } public int OrderTicket() { return sendCommand(MtCommandType.OrderTicket, null); } public TradeOperation OrderType() { int retVal = sendCommand(MtCommandType.OrderType, null); return (TradeOperation) retVal; } public bool OrderCloseAll() { return sendCommand(MtCommandType.OrderCloseAll, null); } #endregion #region Check Status public int GetLastError() { return sendCommand(MtCommandType.GetLastError, null); } public bool IsConnected() { return sendCommand(MtCommandType.IsConnected, null); } public bool IsDemo() { return sendCommand(MtCommandType.IsDemo, null); } public bool IsDllsAllowed() { return sendCommand(MtCommandType.IsDllsAllowed, null); } public bool IsExpertEnabled() { return sendCommand(MtCommandType.IsExpertEnabled, null); } public bool IsLibrariesAllowed() { return sendCommand(MtCommandType.IsLibrariesAllowed, null); } public bool IsOptimization() { return sendCommand(MtCommandType.IsOptimization, null); } public bool IsStopped() { return sendCommand(MtCommandType.IsStopped, null); } public bool IsTesting() { return sendCommand(MtCommandType.IsTesting, null); } public bool IsTradeAllowed() { return sendCommand(MtCommandType.IsTradeAllowed, null); } public bool IsTradeContextBusy() { return sendCommand(MtCommandType.IsTradeContextBusy, null); } public bool IsVisualMode() { return sendCommand(MtCommandType.IsVisualMode, null); } public int UninitializeReason() { return sendCommand(MtCommandType.UninitializeReason, null); } public string ErrorDescription(int errorCode) { var commandParameters = new ArrayList { errorCode }; return sendCommand(MtCommandType.ErrorDescription, commandParameters); } #endregion #region Account Information public double AccountBalance() { return sendCommand(MtCommandType.AccountBalance, null); } public double AccountCredit() { return sendCommand(MtCommandType.AccountCredit, null); } public string AccountCompany() { return sendCommand(MtCommandType.AccountCompany, null); } public string AccountCurrency() { return sendCommand(MtCommandType.AccountCurrency, null); } public double AccountEquity() { return sendCommand(MtCommandType.AccountEquity, null); } public double AccountFreeMargin() { return sendCommand(MtCommandType.AccountFreeMargin, null); } public double AccountFreeMarginCheck(string symbol, TradeOperation cmd, double volume) { var commandParameters = new ArrayList { symbol, (int)cmd, volume }; return sendCommand(MtCommandType.AccountFreeMarginCheck, commandParameters); } public double AccountFreeMarginMode() { return sendCommand(MtCommandType.AccountFreeMarginMode, null); } public int AccountLeverage() { return sendCommand(MtCommandType.AccountLeverage, null); } public double AccountMargin() { return sendCommand(MtCommandType.AccountMargin, null); } public string AccountName() { return sendCommand(MtCommandType.AccountName, null); } public int AccountNumber() { return sendCommand(MtCommandType.AccountNumber, null); } public double AccountProfit() { return sendCommand(MtCommandType.AccountProfit, null); } public string AccountServer() { return sendCommand(MtCommandType.AccountServer, null); } public int AccountStopoutLevel() { return sendCommand(MtCommandType.AccountStopoutLevel, null); } public int AccountStopoutMode() { return sendCommand(MtCommandType.AccountStopoutMode, null); } #endregion #region Common Function public void Alert(string msg) { var commandParameters = new ArrayList { msg }; sendCommand(MtCommandType.Alert, commandParameters); } public void Comment(string msg) { var commandParameters = new ArrayList { msg }; sendCommand(MtCommandType.Comment, commandParameters); } public int GetTickCount() { return sendCommand(MtCommandType.GetTickCount, null); } public double MarketInfo(string symbol, MarketInfoModeType type) { var commandParameters = new ArrayList { symbol, (int)type }; return sendCommand(MtCommandType.MarketInfo, commandParameters); } public int MessageBox(string text, string caption, int flag) { var commandParameters = new ArrayList { text, caption, flag }; return sendCommand(MtCommandType.MessageBoxA, commandParameters); } public int MessageBox(string text, string caption) { return MessageBox(text, caption, EMPTY); } public int MessageBox(string text) { var commandParameters = new ArrayList { text }; return sendCommand(MtCommandType.MessageBox, commandParameters); } public void PlaySound(string filename) { var commandParameters = new ArrayList { filename }; sendCommand(MtCommandType.PlaySound, commandParameters); } public void Print(string msg) { var commandParameters = new ArrayList { msg }; sendCommand(MtCommandType.Print, commandParameters); } public bool SendFTP(string filename) { var commandParameters = new ArrayList { filename }; return sendCommand(MtCommandType.SendFTP, commandParameters); } public bool SendFTP(string filename, string ftp_path) { var commandParameters = new ArrayList { filename, ftp_path }; return sendCommand(MtCommandType.SendFTPA, commandParameters); } public void SendMail(string subject, string some_text) { var commandParameters = new ArrayList { subject, some_text }; sendCommand(MtCommandType.SendMail, commandParameters); } public void Sleep(int milliseconds) { var commandParameters = new ArrayList { milliseconds }; sendCommand(MtCommandType.Sleep, commandParameters); } #endregion #region Client Terminal Functions public string TerminalCompany() { return sendCommand(MtCommandType.TerminalCompany, null); } public string TerminalName() { return sendCommand(MtCommandType.TerminalName, null); } public string TerminalPath() { return sendCommand(MtCommandType.TerminalPath, null); } #endregion #region Date and Time Functions public int Day() { return sendCommand(MtCommandType.Day, null); } public int DayOfWeek() { return sendCommand(MtCommandType.DayOfWeek, null); } public int DayOfYear() { return sendCommand(MtCommandType.DayOfYear, null); } public int Hour() { return sendCommand(MtCommandType.Hour, null); } public int Minute() { return sendCommand(MtCommandType.Minute, null); } public int Month() { return sendCommand(MtCommandType.Month, null); } public int Seconds() { return sendCommand(MtCommandType.Seconds, null); } public DateTime TimeCurrent() { var commandResponse = sendCommand(MtCommandType.TimeCurrent, null); return MtApiTimeConverter.ConvertFromMtTime(commandResponse); } public int TimeDay(DateTime date) { var commandParameters = new ArrayList { MtApiTimeConverter.ConvertToMtTime(date) }; return sendCommand(MtCommandType.TimeDay, commandParameters); } public int TimeDayOfWeek(DateTime date) { var commandParameters = new ArrayList { MtApiTimeConverter.ConvertToMtTime(date) }; return sendCommand(MtCommandType.TimeDayOfWeek, commandParameters); } public int TimeDayOfYear(DateTime date) { var commandParameters = new ArrayList { MtApiTimeConverter.ConvertToMtTime(date) }; return sendCommand(MtCommandType.TimeDayOfYear, commandParameters); } public int TimeHour(DateTime time) { var commandParameters = new ArrayList { MtApiTimeConverter.ConvertToMtTime(time) }; return sendCommand(MtCommandType.TimeHour, commandParameters); } public DateTime TimeLocal() { var commandResponse = sendCommand(MtCommandType.TimeLocal, null); return MtApiTimeConverter.ConvertFromMtTime(commandResponse); } public int TimeMinute(DateTime time) { var commandParameters = new ArrayList { MtApiTimeConverter.ConvertToMtTime(time) }; return sendCommand(MtCommandType.TimeMinute, commandParameters); } public int TimeMonth(DateTime time) { var commandParameters = new ArrayList { MtApiTimeConverter.ConvertToMtTime(time) }; return sendCommand(MtCommandType.TimeMonth, commandParameters); } public int TimeSeconds(DateTime time) { var commandParameters = new ArrayList { MtApiTimeConverter.ConvertToMtTime(time) }; return sendCommand(MtCommandType.TimeSeconds, commandParameters); } public int TimeYear(DateTime time) { var commandParameters = new ArrayList { MtApiTimeConverter.ConvertToMtTime(time) }; return sendCommand(MtCommandType.TimeYear, commandParameters); } public int Year(DateTime time) { var commandParameters = new ArrayList { MtApiTimeConverter.ConvertToMtTime(time) }; return sendCommand(MtCommandType.Year, commandParameters); } #endregion #region Global Variables Functions public bool GlobalVariableCheck(string name) { var commandParameters = new ArrayList { name }; return sendCommand(MtCommandType.GlobalVariableCheck, commandParameters); } public bool GlobalVariableDel(string name) { var commandParameters = new ArrayList { name }; return sendCommand(MtCommandType.GlobalVariableDel, commandParameters); } public double GlobalVariableGet(string name) { var commandParameters = new ArrayList { name }; return sendCommand(MtCommandType.GlobalVariableGet, commandParameters); } public string GlobalVariableName(int index) { var commandParameters = new ArrayList { index }; return sendCommand(MtCommandType.GlobalVariableName, commandParameters); } public DateTime GlobalVariableSet(string name, double value) { var commandParameters = new ArrayList { name, value }; var commandResponse = sendCommand(MtCommandType.GlobalVariableSet, commandParameters); return MtApiTimeConverter.ConvertFromMtTime(commandResponse); } public bool GlobalVariableSetOnCondition(string name, double value, double check_value) { var commandParameters = new ArrayList { name, value, check_value }; return sendCommand(MtCommandType.GlobalVariableSetOnCondition, commandParameters); } public int GlobalVariablesDeleteAll(string prefix_name) { var commandParameters = new ArrayList { prefix_name }; return sendCommand(MtCommandType.GlobalVariableSetOnCondition, commandParameters); } public int GlobalVariablesTotal() { return sendCommand(MtCommandType.GlobalVariablesTotal, null); } #endregion #region Technical Indicators public double iAC(string symbol, ChartPeriod timeframe, int shift) { var commandParameters = new ArrayList { symbol, (int)timeframe, shift }; return sendCommand(MtCommandType.iAC, commandParameters); } public double iAD(string symbol, int timeframe, int shift) { var commandParameters = new ArrayList { symbol, timeframe, shift }; return sendCommand(MtCommandType.iAD, commandParameters); } public double iAlligator(string symbol, int timeframe, int jaw_period, int jaw_shift, int teeth_period, int teeth_shift, int lips_period, int lips_shift, int ma_method, int applied_price, int mode, int shift) { var commandParameters = new ArrayList { symbol, timeframe, jaw_period, jaw_shift, teeth_period, teeth_shift, lips_period, lips_shift, ma_method, applied_price, mode, shift }; return sendCommand(MtCommandType.iAlligator, commandParameters); } public double iADX(string symbol, int timeframe, int period, int applied_price, int mode, int shift) { var commandParameters = new ArrayList { symbol, timeframe, period, applied_price, mode, shift }; return sendCommand(MtCommandType.iADX, commandParameters); } public double iATR(string symbol, int timeframe, int period, int shift) { var commandParameters = new ArrayList { symbol, timeframe, period, shift }; return sendCommand(MtCommandType.iATR, commandParameters); } public double iAO(string symbol, int timeframe, int shift) { var commandParameters = new ArrayList { symbol, timeframe, shift }; return sendCommand(MtCommandType.iAO, commandParameters); } public double iBearsPower(string symbol, int timeframe, int period, int applied_price, int shift) { var commandParameters = new ArrayList { symbol, timeframe, period, applied_price, shift }; return sendCommand(MtCommandType.iBearsPower, commandParameters); } public double iBands(string symbol, int timeframe, int period, int deviation, int bands_shift, int applied_price, int mode, int shift) { var commandParameters = new ArrayList { symbol, timeframe, period, deviation, bands_shift, applied_price, mode, shift }; return sendCommand(MtCommandType.iBands, commandParameters); } public double iBandsOnArray(double[] array, int total, int period, int deviation, int bands_shift, int mode, int shift) { int arraySize = array != null ? array.Length : 0; var commandParameters = new ArrayList { arraySize }; commandParameters.AddRange(array); commandParameters.Add(total); commandParameters.Add(period); commandParameters.Add(deviation); commandParameters.Add(bands_shift); commandParameters.Add(mode); commandParameters.Add(shift); return sendCommand(MtCommandType.iBandsOnArray, commandParameters); } public double iBullsPower(string symbol, int timeframe, int period, int applied_price, int shift) { var commandParameters = new ArrayList { symbol, timeframe, period, applied_price, shift }; return sendCommand(MtCommandType.iBullsPower, commandParameters); } public double iCCI(string symbol, int timeframe, int period, int applied_price, int shift) { var commandParameters = new ArrayList { symbol, timeframe, period, applied_price, shift }; return sendCommand(MtCommandType.iCCI, commandParameters); } public double iCCIOnArray(double[] array, int total, int period, int shift) { int arraySize = array != null ? array.Length : 0; var commandParameters = new ArrayList { arraySize }; commandParameters.AddRange(array); commandParameters.Add(total); commandParameters.Add(period); commandParameters.Add(shift); return sendCommand(MtCommandType.iCCIOnArray, commandParameters); } public double iCustom(string symbol, int timeframe, string name, int[] parameters, int mode, int shift) { var commandParameters = new ArrayList { symbol, timeframe, name }; int arraySize = parameters != null ? parameters.Length : 0; commandParameters.Add(arraySize); if (arraySize > 0) { commandParameters.AddRange(parameters); } commandParameters.Add(mode); commandParameters.Add(shift); return sendCommand(MtCommandType.iCustom, commandParameters); } public double iCustom(string symbol, int timeframe, string name, double[] parameters, int mode, int shift) { var commandParameters = new ArrayList { symbol, timeframe, name }; int arraySize = parameters != null ? parameters.Length : 0; commandParameters.Add(arraySize); commandParameters.AddRange(parameters); commandParameters.Add(mode); commandParameters.Add(shift); return sendCommand(MtCommandType.iCustom_d, commandParameters); } public double iDeMarker(string symbol, int timeframe, int period, int shift) { var commandParameters = new ArrayList { symbol, timeframe, period, shift }; return sendCommand(MtCommandType.iDeMarker, commandParameters); } public double iEnvelopes(string symbol, int timeframe, int ma_period, int ma_method, int ma_shift, int applied_price, double deviation, int mode, int shift) { var commandParameters = new ArrayList { symbol, timeframe, ma_period, ma_method, ma_shift, applied_price, deviation, mode, shift }; return sendCommand(MtCommandType.iEnvelopes, commandParameters); } public double iEnvelopesOnArray(double[] array, int total, int ma_period, int ma_method, int ma_shift, double deviation, int mode, int shift) { int arraySize = array != null ? array.Length : 0; var commandParameters = new ArrayList { arraySize }; commandParameters.AddRange(array); commandParameters.Add(total); commandParameters.Add(ma_period); commandParameters.Add(ma_method); commandParameters.Add(ma_shift); commandParameters.Add(deviation); commandParameters.Add(mode); commandParameters.Add(shift); return sendCommand(MtCommandType.iEnvelopesOnArray, commandParameters); } public double iForce(string symbol, int timeframe, int period, int ma_method, int applied_price, int shift) { var commandParameters = new ArrayList { symbol, timeframe, period, ma_method, applied_price, shift }; return sendCommand(MtCommandType.iForce, commandParameters); } public double iFractals(string symbol, int timeframe, int mode, int shift) { var commandParameters = new ArrayList { symbol, timeframe, mode, shift }; return sendCommand(MtCommandType.iFractals, commandParameters); } public double iGator(string symbol, int timeframe, int jaw_period, int jaw_shift, int teeth_period, int teeth_shift, int lips_period, int lips_shift, int ma_method, int applied_price, int mode, int shift) { var commandParameters = new ArrayList { symbol, timeframe, jaw_period, jaw_shift, teeth_period, teeth_shift, lips_period, lips_shift, ma_method, applied_price, mode, shift }; return sendCommand(MtCommandType.iGator, commandParameters); } public double iIchimoku(string symbol, int timeframe, int tenkan_sen, int kijun_sen, int senkou_span_b, int mode, int shift) { var commandParameters = new ArrayList { symbol, timeframe, tenkan_sen, kijun_sen, senkou_span_b, mode, shift }; return sendCommand(MtCommandType.iIchimoku, commandParameters); } public double iBWMFI(string symbol, int timeframe, int shift) { var commandParameters = new ArrayList { symbol, timeframe, shift }; return sendCommand(MtCommandType.iBWMFI, commandParameters); } public double iMomentum(string symbol, int timeframe, int period, int applied_price, int shift) { var commandParameters = new ArrayList { symbol, timeframe, period, applied_price, shift }; return sendCommand(MtCommandType.iMomentum, commandParameters); } public double iMomentumOnArray(double[] array, int total, int period, int shift) { int arraySize = array != null ? array.Length : 0; var commandParameters = new ArrayList { arraySize }; commandParameters.AddRange(array); commandParameters.Add(total); commandParameters.Add(period); commandParameters.Add(shift); return sendCommand(MtCommandType.iMomentumOnArray, commandParameters); } public double iMFI(string symbol, int timeframe, int period, int shift) { var commandParameters = new ArrayList { symbol, timeframe, period, shift }; return sendCommand(MtCommandType.iMFI, commandParameters); } public double iMA(string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift) { var commandParameters = new ArrayList { symbol, timeframe, period, ma_shift, ma_method, applied_price, shift }; return sendCommand(MtCommandType.iMA, commandParameters); } double iMAOnArray(double[] array, int total, int period, int ma_shift, int ma_method, int shift) { int arraySize = array != null ? array.Length : 0; var commandParameters = new ArrayList { arraySize }; commandParameters.AddRange(array); commandParameters.Add(total); commandParameters.Add(period); commandParameters.Add(ma_shift); commandParameters.Add(ma_method); commandParameters.Add(shift); return sendCommand(MtCommandType.iMAOnArray, commandParameters); } public double iOsMA(string symbol, int timeframe, int fast_ema_period, int slow_ema_period, int signal_period, int applied_price, int shift) { var commandParameters = new ArrayList { symbol, timeframe, fast_ema_period, slow_ema_period, signal_period, applied_price, shift }; return sendCommand(MtCommandType.iOsMA, commandParameters); } public double iMACD(string symbol, int timeframe, int fast_ema_period, int slow_ema_period, int signal_period, int applied_price, int mode, int shift) { var commandParameters = new ArrayList { symbol, timeframe, fast_ema_period, slow_ema_period, signal_period, applied_price, mode, shift }; return sendCommand(MtCommandType.iMACD, commandParameters); } public double iOBV(string symbol, int timeframe, int applied_price, int shift) { var commandParameters = new ArrayList { symbol, timeframe, applied_price, shift }; return sendCommand(MtCommandType.iOBV, commandParameters); } public double iSAR(string symbol, int timeframe, double step, double maximum, int shift) { var commandParameters = new ArrayList { symbol, timeframe, step, maximum, shift }; return sendCommand(MtCommandType.iSAR, commandParameters); } public double iRSI( string symbol, int timeframe, int period, int applied_price, int shift) { var commandParameters = new ArrayList { symbol, timeframe, period, applied_price, shift }; return sendCommand(MtCommandType.iRSI, commandParameters); } public double iRSIOnArray(double[] array, int total, int period, int shift) { int arraySize = array != null ? array.Length : 0; var commandParameters = new ArrayList { arraySize }; commandParameters.AddRange(array); commandParameters.Add(total); commandParameters.Add(period); commandParameters.Add(shift); return sendCommand(MtCommandType.iMomentumOnArray, commandParameters); } public double iRVI(string symbol, int timeframe, int period, int mode, int shift) { var commandParameters = new ArrayList { symbol, timeframe, period, mode, shift }; return sendCommand(MtCommandType.iRVI, commandParameters); } public double iStdDev(string symbol, int timeframe, int ma_period, int ma_shift, int ma_method, int applied_price, int shift) { var commandParameters = new ArrayList { symbol, timeframe, ma_period, ma_shift, ma_method, applied_price, shift }; return sendCommand(MtCommandType.iStdDev, commandParameters); } public double iStdDevOnArray(double[] array, int total, int ma_period, int ma_shift, int ma_method, int shift) { int arraySize = array != null ? array.Length : 0; var commandParameters = new ArrayList { arraySize }; commandParameters.AddRange(array); commandParameters.Add(total); commandParameters.Add(ma_period); commandParameters.Add(ma_shift); commandParameters.Add(ma_method); commandParameters.Add(shift); return sendCommand(MtCommandType.iStdDevOnArray, commandParameters); } public double iStochastic(string symbol, int timeframe, int pKperiod, int pDperiod, int slowing, int method, int price_field, int mode, int shift) { var commandParameters = new ArrayList { symbol, timeframe, pKperiod, pDperiod, slowing, method, price_field, mode, shift }; return sendCommand(MtCommandType.iStochastic, commandParameters); } public double iWPR(string symbol, int timeframe, int period, int shift) { var commandParameters = new ArrayList { symbol, timeframe, period, shift }; return sendCommand(MtCommandType.iWPR, commandParameters); } #endregion #region Timeseries access public int iBars(string symbol, ChartPeriod timeframe) { var commandParameters = new ArrayList { symbol, (int)timeframe }; return sendCommand(MtCommandType.iBars, commandParameters); } public int iBarShift(string symbol, ChartPeriod timeframe, DateTime time, bool exact) { var commandParameters = new ArrayList { symbol, (int)timeframe, MtApiTimeConverter.ConvertToMtTime(time), exact }; return sendCommand(MtCommandType.iBarShift, commandParameters); } public double iClose(string symbol, ChartPeriod timeframe, int shift) { var commandParameters = new ArrayList { symbol, (int)timeframe, shift }; return sendCommand(MtCommandType.iClose, commandParameters); } public double iHigh(string symbol, ChartPeriod timeframe, int shift) { var commandParameters = new ArrayList { symbol, (int)timeframe, shift }; return sendCommand(MtCommandType.iHigh, commandParameters); } public int iHighest(string symbol, ChartPeriod timeframe, SeriesIdentifier type, int count, int start) { var commandParameters = new ArrayList { symbol, (int)timeframe, (int)type, count, start }; return sendCommand(MtCommandType.iHighest, commandParameters); } public double iLow(string symbol, ChartPeriod timeframe, int shift) { var commandParameters = new ArrayList { symbol, (int)timeframe, shift }; return sendCommand(MtCommandType.iLow, commandParameters); } public int iLowest(string symbol, ChartPeriod timeframe, SeriesIdentifier type, int count, int start) { var commandParameters = new ArrayList { symbol, (int)timeframe, (int)type, count, start }; return sendCommand(MtCommandType.iLowest, commandParameters); } public double iOpen(string symbol, ChartPeriod timeframe, int shift) { var commandParameters = new ArrayList { symbol, (int)timeframe, shift }; return sendCommand(MtCommandType.iOpen, commandParameters); } public DateTime iTime(string symbol, ChartPeriod timeframe, int shift) { var commandParameters = new ArrayList { symbol, (int)timeframe, shift }; var commandResponse = sendCommand(MtCommandType.iTime, commandParameters); return MtApiTimeConverter.ConvertFromMtTime(commandResponse); } public double iVolume(string symbol, ChartPeriod timeframe, int shift) { var commandParameters = new ArrayList { symbol, (int)timeframe, shift }; return sendCommand(MtCommandType.iVolume, commandParameters); } //public double[] iCloseArray(string symbol, ChartPeriod timeframe, int shift, int valueCount) //{ // int doubleArraySendLimit = DOUBLE_ARRAY_LIMIT; // int limitCount = valueCount / doubleArraySendLimit; // int valueCountModulo = valueCount - limitCount * doubleArraySendLimit; // var resultArray = new double[valueCount]; // for (int i = 0; i < limitCount; i++) // { // var commandParameters = new ArrayList { symbol, (int)timeframe, i * doubleArraySendLimit, doubleArraySendLimit }; // var result = sendCommand(MtCommandType.iCloseArray, commandParameters); // if (result != null) // Array.Copy(result, 0, resultArray, i * doubleArraySendLimit, doubleArraySendLimit); // } // if (valueCountModulo > 0) // { // var commandParameters = new ArrayList { symbol, (int)timeframe, limitCount * doubleArraySendLimit, valueCountModulo }; // var result = sendCommand(MtCommandType.iCloseArray, commandParameters); // if (result != null) // Array.Copy(result, 0, resultArray, limitCount * doubleArraySendLimit, valueCountModulo); // } // return resultArray; // var commandParameters = new ArrayList { symbol, (int)timeframe, shift, valueCount }; // return sendCommand(MtCommandType.iCloseArray, commandParameters); //} public double[] iCloseArray(string symbol, ChartPeriod timeframe) { var commandParameters = new ArrayList { symbol, (int)timeframe }; return sendCommand(MtCommandType.iCloseArray, commandParameters); } public double[] iHighArray(string symbol, ChartPeriod timeframe) { var commandParameters = new ArrayList { symbol, (int)timeframe }; return sendCommand(MtCommandType.iHighArray, commandParameters); } public double[] iLowArray(string symbol, ChartPeriod timeframe) { var commandParameters = new ArrayList { symbol, (int)timeframe }; return sendCommand(MtCommandType.iLowArray, commandParameters); } public double[] iOpenArray(string symbol, ChartPeriod timeframe) { var commandParameters = new ArrayList { symbol, (int)timeframe }; return sendCommand(MtCommandType.iOpenArray, commandParameters); } public double[] iVolumeArray(string symbol, ChartPeriod timeframe) { var commandParameters = new ArrayList { symbol, (int)timeframe }; return sendCommand(MtCommandType.iVolumeArray, commandParameters); } public DateTime[] iTimeArray(string symbol, ChartPeriod timeframe) { DateTime[] result = null; var commandParameters = new ArrayList { symbol, (int)timeframe }; var response = sendCommand(MtCommandType.iTimeArray, commandParameters); if (response != null) { result = new DateTime[response.Length]; for(int i = 0; i < response.Length; i++) { result[i] = MtApiTimeConverter.ConvertFromMtTime(response[i]); } } return result; } public bool RefreshRates() { return sendCommand(MtCommandType.RefreshRates, null); } #endregion #region Private Methods private void Connect(string host, int port) { ConnectionState = MtConnectionState.Connecting; ConnectionStateChanged.FireEvent(this , new MtConnectionEventArgs(MtConnectionState.Connecting, "Connecting to " + host + ":" + port)); try { mClient.Open(host, port); mClient.Connect(); } catch (Exception e) { ConnectionState = MtConnectionState.Failed; ConnectionStateChanged.FireEvent(this , new MtConnectionEventArgs(MtConnectionState.Failed, "Failed connection to " + host + ":" + port + ". " + e.Message)); return; } ConnectionState = MtConnectionState.Connected; ConnectionStateChanged.FireEvent(this , new MtConnectionEventArgs(MtConnectionState.Connected, "Connected to " + host + ":" + port)); } private void Connect(int port) { ConnectionState = MtConnectionState.Connecting; ConnectionStateChanged.FireEvent(this , new MtConnectionEventArgs(MtConnectionState.Connecting, "Connecting to 'localhost':" + port)); try { mClient.Open(port); mClient.Connect(); } catch (Exception e) { ConnectionState = MtConnectionState.Failed; ConnectionStateChanged.FireEvent(this , new MtConnectionEventArgs(MtConnectionState.Failed, "Failed connection to 'localhost':" + port + ". " + e.Message)); return; } ConnectionState = MtConnectionState.Connected; ConnectionStateChanged.FireEvent(this , new MtConnectionEventArgs(MtConnectionState.Connected, "Connected to 'localhost':" + port)); } private void Disconnect() { mClient.Disconnect(); mClient.Close(); ConnectionState = MtConnectionState.Disconnected; ConnectionStateChanged.FireEvent(this, new MtConnectionEventArgs(MtConnectionState.Disconnected, "Disconnected")); } private T sendCommand(MtCommandType commandType, ArrayList commandParameters) { var response = mClient.SendCommand((int)commandType, commandParameters); T result = default(T); if (response is MtResponseDouble) result = (T)Convert.ChangeType(((MtResponseDouble)response).Value, typeof(T)); if (response is MtResponseInt) result = (T)Convert.ChangeType(((MtResponseInt)response).Value, typeof(T)); if (response is MtResponseBool) result = (T)Convert.ChangeType(((MtResponseBool)response).Value, typeof(T)); if (response is MtResponseString) result = (T)Convert.ChangeType(((MtResponseString)response).Value, typeof(T)); if (response is MtResponseDoubleArray) result = (T)Convert.ChangeType(((MtResponseDoubleArray)response).Value, typeof(T)); if (response is MtResponseIntArray) result = (T)Convert.ChangeType(((MtResponseIntArray)response).Value, typeof(T)); if (response is MtResponseArrayList) result = (T)Convert.ChangeType(((MtResponseArrayList)response).Value, typeof(T)); return result; } private void mClient_QuoteUpdated(MTApiService.MtQuote quote) { if (quote != null) { if (QuoteUpdated != null) { QuoteUpdated(this, quote.Instrument, quote.Bid, quote.Ask); } } } private void mClient_ServerDisconnected(object sender, EventArgs e) { ConnectionState = MtConnectionState.Disconnected; ConnectionStateChanged.FireEvent(this , new MtConnectionEventArgs(MtConnectionState.Disconnected, "MtApi is disconnected")); } private void mClient_ServerFailed(object sender, EventArgs e) { ConnectionState = MtConnectionState.Failed; ConnectionStateChanged.FireEvent(this , new MtConnectionEventArgs(MtConnectionState.Failed, "Failed connection with MtApi")); } private void mClient_QuoteRemoved(MTApiService.MtQuote quote) { QuoteRemoved.FireEvent(this, new MtQuoteEventArgs(quote.Parse())); } private void mClient_QuoteAdded(MTApiService.MtQuote quote) { QuoteAdded.FireEvent(this, new MtQuoteEventArgs(quote.Parse())); } #endregion #region Events public event MtApiQuoteHandler QuoteUpdated; public event EventHandler QuoteAdded; public event EventHandler QuoteRemoved; public event EventHandler ConnectionStateChanged; #endregion #region Private Fields private readonly MtClient mClient = new MtClient(); #endregion } }