diff --git a/MTApiService/MtResponse.cs b/MTApiService/MtResponse.cs
index 0dfbf5db..06b84727 100755
--- a/MTApiService/MtResponse.cs
+++ b/MTApiService/MtResponse.cs
@@ -19,6 +19,8 @@ namespace MTApiService
typeof(MtResponseArrayList), typeof(MtResponseMqlRatesArray),
typeof(MtResponseMqlBookInfoArray)};
}
+
+ public abstract object GetValue();
}
[DataContract]
@@ -31,6 +33,8 @@ namespace MTApiService
[DataMember]
public int Value { get; private set; }
+
+ public override object GetValue() { return Value; }
}
[DataContract]
@@ -43,6 +47,8 @@ namespace MTApiService
[DataMember]
public long Value { get; private set; }
+
+ public override object GetValue() { return Value; }
}
[DataContract]
@@ -55,6 +61,8 @@ namespace MTApiService
[DataMember]
public ulong Value { get; private set; }
+
+ public override object GetValue() { return Value; }
}
[DataContract]
@@ -67,6 +75,8 @@ namespace MTApiService
[DataMember]
public double Value { get; private set; }
+
+ public override object GetValue() { return Value; }
}
[DataContract]
@@ -79,6 +89,8 @@ namespace MTApiService
[DataMember]
public string Value { get; private set; }
+
+ public override object GetValue() { return Value; }
}
[DataContract]
@@ -91,6 +103,8 @@ namespace MTApiService
[DataMember]
public bool Value { get; private set; }
+
+ public override object GetValue() { return Value; }
}
[DataContract]
@@ -103,6 +117,8 @@ namespace MTApiService
[DataMember]
public double[] Value { get; private set; }
+
+ public override object GetValue() { return Value; }
}
[DataContract]
@@ -115,6 +131,8 @@ namespace MTApiService
[DataMember]
public int[] Value { get; private set; }
+
+ public override object GetValue() { return Value; }
}
[DataContract]
@@ -127,6 +145,8 @@ namespace MTApiService
[DataMember]
public long[] Value { get; private set; }
+
+ public override object GetValue() { return Value; }
}
[DataContract]
@@ -139,6 +159,8 @@ namespace MTApiService
[DataMember]
public ArrayList Value { get; private set; }
+
+ public override object GetValue() { return Value; }
}
[DataContract]
@@ -151,6 +173,8 @@ namespace MTApiService
[DataMember]
public MtMqlRates[] Value { get; private set; }
+
+ public override object GetValue() { return Value; }
}
[DataContract]
@@ -163,6 +187,8 @@ namespace MTApiService
[DataMember]
public MtMqlTick Value { get; private set; }
+
+ public override object GetValue() { return Value; }
}
[DataContract]
@@ -175,6 +201,8 @@ namespace MTApiService
[DataMember]
public MtMqlBookInfo[] Value { get; private set; }
+
+ public override object GetValue() { return Value; }
}
}
diff --git a/MtApi/MtApiClient.cs b/MtApi/MtApiClient.cs
index cf01f89a..85314cfe 100755
--- a/MtApi/MtApiClient.cs
+++ b/MtApi/MtApiClient.cs
@@ -15,8 +15,7 @@ namespace MtApi
public sealed class MtApiClient
{
- private const int DoubleArrayLimit = 64800;
- private volatile bool IsBacktestingMode = false;
+ private volatile bool _isBacktestingMode;
#region MetaTrader Constants
@@ -25,15 +24,21 @@ namespace MtApi
public const int EMPTY = -1;
#endregion
+ #region Private Fields
+ private readonly MtClient _client = new MtClient();
+ private readonly object _locker = new object();
+ private MtConnectionState _connectionState = MtConnectionState.Disconnected;
+ #endregion
+
#region ctor
public MtApiClient()
{
- _client.QuoteAdded += mClient_QuoteAdded;
- _client.QuoteRemoved += mClient_QuoteRemoved;
- _client.QuoteUpdated += mClient_QuoteUpdated;
- _client.ServerDisconnected += mClient_ServerDisconnected;
- _client.ServerFailed += mClient_ServerFailed;
+ _client.QuoteAdded += _client_QuoteAdded;
+ _client.QuoteRemoved += _client_QuoteRemoved;
+ _client.QuoteUpdated += _client_QuoteUpdated;
+ _client.ServerDisconnected += _client_ServerDisconnected;
+ _client.ServerFailed += _client_ServerFailed;
_client.MtEventReceived += _client_MtEventReceived;
}
#endregion
@@ -46,15 +51,8 @@ namespace MtApi
///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);
- //}
}
///
@@ -81,12 +79,16 @@ namespace MtApi
///
public IEnumerable GetQuotes()
{
- var quotes = _client.GetQuotes();
- return quotes != null ? (from q in quotes select q.Convert()) : null;
+ IEnumerable quotes;
+ lock (_client)
+ {
+ quotes = _client.GetQuotes();
+ }
+ return quotes?.Select(q => q.Convert());
}
#endregion
- #region Properties
+ #region Properties
///
///Connection status of MetaTrader API.
@@ -174,7 +176,7 @@ namespace MtApi
public double OrderOpenPrice(int ticket)
{
var commandParameters = new ArrayList { ticket };
- double retVal = SendCommand(MtCommandType.OrderOpenPriceByTicket, commandParameters);
+ var retVal = SendCommand(MtCommandType.OrderOpenPriceByTicket, commandParameters);
return retVal;
}
@@ -219,7 +221,7 @@ namespace MtApi
[Obsolete("OrderType is deprecated, please use GetOrder instead.")]
public TradeOperation OrderType()
{
- int retVal = SendCommand(MtCommandType.OrderType, null);
+ var retVal = SendCommand(MtCommandType.OrderType, null);
return (TradeOperation)retVal;
}
@@ -250,7 +252,7 @@ namespace MtApi
Expiration = MtApiTimeConverter.ConvertToMtTime(expiration),
ArrowColor = MtApiColorConverter.ConvertToMtColor(arrowColor)
});
- return response != null ? response.Ticket : -1;
+ return response?.Ticket ?? -1;
}
public int OrderSend(string symbol, TradeOperation cmd, double volume, double price, int slippage, double stoploss, double takeprofit
@@ -278,7 +280,7 @@ namespace MtApi
public int OrderSend(string symbol, TradeOperation cmd, double volume, string price, int slippage, double stoploss, double takeprofit)
{
- double dPrice = 0;
+ double dPrice;
return double.TryParse(price, out dPrice) ?
OrderSend(symbol, cmd, volume, dPrice, slippage, stoploss, takeprofit, null, 0, DateTime.MinValue, Color.Empty) : 0;
}
@@ -316,7 +318,7 @@ namespace MtApi
Comment = comment,
Magic = magic,
});
- return response != null ? response.Ticket : -1;
+ return response?.Ticket ?? -1;
}
public int OrderSendSell(string symbol, double volume, int slippage, double stoploss, double takeprofit, string comment, int magic)
@@ -332,7 +334,7 @@ namespace MtApi
Comment = comment,
Magic = magic,
});
- return response != null ? response.Ticket : -1;
+ return response?.Ticket ?? -1;
}
public bool OrderClose(int ticket, double lots, double price, int slippage, Color color)
@@ -421,7 +423,7 @@ namespace MtApi
return response != null;
}
- public bool OrderModify(int ticket, double price, double stoploss, double takeprofit, DateTime expiration, Color arrow_color)
+ public bool OrderModify(int ticket, double price, double stoploss, double takeprofit, DateTime expiration, Color arrowColor)
{
var response = SendRequest(new OrderModifyRequest
{
@@ -430,7 +432,7 @@ namespace MtApi
Stoploss = stoploss,
Takeprofit = takeprofit,
Expiration = MtApiTimeConverter.ConvertToMtTime(expiration),
- ArrowColor = MtApiColorConverter.ConvertToMtColor(arrow_color)
+ ArrowColor = MtApiColorConverter.ConvertToMtColor(arrowColor)
});
return response != null;
}
@@ -482,7 +484,7 @@ namespace MtApi
public MtOrder GetOrder(int index, OrderSelectMode select, OrderSelectSource pool)
{
var response = SendRequest(new GetOrderRequest { Index = index, Select = (int) select, Pool = (int) pool});
- return response != null ? response.Order : null;
+ return response?.Order;
}
public List GetOrders(OrderSelectSource pool)
@@ -712,15 +714,15 @@ namespace MtApi
return SendCommand(MtCommandType.SendFTP, commandParameters);
}
- public bool SendFTP(string filename, string ftp_path)
+ public bool SendFTP(string filename, string ftpPath)
{
- var commandParameters = new ArrayList { filename, ftp_path };
+ var commandParameters = new ArrayList { filename, ftpPath };
return SendCommand(MtCommandType.SendFTPA, commandParameters);
}
- public void SendMail(string subject, string some_text)
+ public void SendMail(string subject, string someText)
{
- var commandParameters = new ArrayList { subject, some_text };
+ var commandParameters = new ArrayList { subject, someText };
SendCommand