diff --git a/MtApi/EnumSeriesInfoInteger.cs b/MtApi/EnumSeriesInfoInteger.cs new file mode 100755 index 00000000..fa0c0a24 --- /dev/null +++ b/MtApi/EnumSeriesInfoInteger.cs @@ -0,0 +1,10 @@ +namespace MtApi +{ + public enum EnumSeriesInfoInteger + { + SERIES_BARS_COUNT = 0, + SERIES_FIRSTDATE = 1, + SERIES_LASTBAR_DATE = 5, + SERIES_SERVER_FIRSTDATE = 2 + } +} \ No newline at end of file diff --git a/MtApi/Monitors/TimeframeTradeMonitor.cs b/MtApi/Monitors/TimeframeTradeMonitor.cs index 6a172f9a..41663663 100644 --- a/MtApi/Monitors/TimeframeTradeMonitor.cs +++ b/MtApi/Monitors/TimeframeTradeMonitor.cs @@ -4,7 +4,7 @@ namespace MtApi.Monitors public class TimeframeTradeMonitor : TradeMonitor { #region Fields - private volatile bool _isStarted = false; + private volatile bool _isStarted; #endregion #region ctor @@ -23,13 +23,8 @@ namespace MtApi.Monitors // Returns: // true if PositionMonitor should check orders // otherwise, false. - public override bool IsStarted - { - get - { - return _isStarted; - } - } + public override bool IsStarted => _isStarted; + #endregion #region Protected Methods diff --git a/MtApi/Monitors/TradeMonitor.cs b/MtApi/Monitors/TradeMonitor.cs index d6fe0007..fc746339 100644 --- a/MtApi/Monitors/TradeMonitor.cs +++ b/MtApi/Monitors/TradeMonitor.cs @@ -13,7 +13,7 @@ namespace MtApi.Monitors #endregion #region ctor - public TradeMonitor(MtApiClient apiClient) + protected TradeMonitor(MtApiClient apiClient) { if (apiClient == null) throw new ArgumentNullException(nameof(apiClient)); @@ -73,13 +73,7 @@ namespace MtApi.Monitors protected abstract void OnMtConnected(); protected abstract void OnMtDisconnected(); - public bool IsMtConnected - { - get - { - return _apiClient.ConnectionState == MtConnectionState.Connected; - } - } + public bool IsMtConnected => _apiClient.ConnectionState == MtConnectionState.Connected; protected void Check() { @@ -113,12 +107,12 @@ namespace MtApi.Monitors prevOrders = _prevOrders; } - if (_prevOrders != null) //skip checking on first load orders + if (prevOrders != null) //skip checking on first load orders { //check open orders foreach (var order in tradesOrders) { - if (_prevOrders.Find(a => a.Ticket == order.Ticket) == null) + if (prevOrders.Find(a => a.Ticket == order.Ticket) == null) { openedOrders.Add(order); } @@ -126,7 +120,7 @@ namespace MtApi.Monitors //check closed orders var closeOrdersTemp = new List(); - foreach (var order in _prevOrders) + foreach (var order in prevOrders) { if (tradesOrders.Find(a => a.Ticket == order.Ticket) == null) { @@ -180,10 +174,7 @@ namespace MtApi.Monitors _prevOrders = null; } - Task.Factory.StartNew(() => - { - Check(); - }); + Task.Factory.StartNew(Check); } #endregion } diff --git a/MtApi/MtApi.csproj b/MtApi/MtApi.csproj index 0721be6a..4b3b33ad 100755 --- a/MtApi/MtApi.csproj +++ b/MtApi/MtApi.csproj @@ -59,6 +59,7 @@ + @@ -92,6 +93,7 @@ + @@ -100,6 +102,7 @@ + diff --git a/MtApi/MtApiClient.cs b/MtApi/MtApiClient.cs index 4db52061..55bcf2d2 100755 --- a/MtApi/MtApiClient.cs +++ b/MtApi/MtApiClient.cs @@ -1466,6 +1466,18 @@ namespace MtApi return response?.Rates; } + public long SeriesInfoInteger(string symbolName, ENUM_TIMEFRAMES timeframe, EnumSeriesInfoInteger propId) + { + var response = SendRequest(new SeriesInfoIntegerRequest + { + SymbolName = symbolName, + Timeframe = (int)timeframe, + PropId = (int)propId + }); + + return response?.Value ?? 0; + } + #endregion #region Checkup diff --git a/MtApi/Requests/CopyRatesRequest.cs b/MtApi/Requests/CopyRatesRequest.cs index b2e4275a..a45c77a8 100644 --- a/MtApi/Requests/CopyRatesRequest.cs +++ b/MtApi/Requests/CopyRatesRequest.cs @@ -1,12 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MtApi.Requests +namespace MtApi.Requests { - public abstract class CopyRatesRequestBase : RequestBase + internal abstract class CopyRatesRequestBase : RequestBase { public enum CopyRatesTypeEnum { @@ -15,10 +9,7 @@ namespace MtApi.Requests CopyRates_3 = 3, } - public override RequestType RequestType - { - get { return RequestType.CopyRates; } - } + public override RequestType RequestType => RequestType.CopyRates; public abstract CopyRatesTypeEnum CopyRatesType { get; } @@ -26,34 +17,25 @@ namespace MtApi.Requests public ENUM_TIMEFRAMES Timeframe { get; set; } } - public class CopyRates1Request : CopyRatesRequestBase + internal class CopyRates1Request : CopyRatesRequestBase { - public override CopyRatesTypeEnum CopyRatesType - { - get { return CopyRatesTypeEnum.CopyRates_1; } - } + public override CopyRatesTypeEnum CopyRatesType => CopyRatesTypeEnum.CopyRates_1; public int StartPos { get; set; } public int Count { get; set; } } - public class CopyRates2Request : CopyRatesRequestBase + internal class CopyRates2Request : CopyRatesRequestBase { - public override CopyRatesTypeEnum CopyRatesType - { - get { return CopyRatesTypeEnum.CopyRates_2; } - } + public override CopyRatesTypeEnum CopyRatesType => CopyRatesTypeEnum.CopyRates_2; public int StartTime { get; set; } public int Count { get; set; } } - public class CopyRates3Request : CopyRatesRequestBase + internal class CopyRates3Request : CopyRatesRequestBase { - public override CopyRatesTypeEnum CopyRatesType - { - get { return CopyRatesTypeEnum.CopyRates_3; } - } + public override CopyRatesTypeEnum CopyRatesType => CopyRatesTypeEnum.CopyRates_3; public int StartTime { get; set; } public int StopTime { get; set; } diff --git a/MtApi/Requests/GetOrderRequest.cs b/MtApi/Requests/GetOrderRequest.cs old mode 100644 new mode 100755 index bd0d10a2..01cb77de --- a/MtApi/Requests/GetOrderRequest.cs +++ b/MtApi/Requests/GetOrderRequest.cs @@ -1,14 +1,11 @@ namespace MtApi.Requests { - public class GetOrderRequest: RequestBase + internal class GetOrderRequest: RequestBase { public int Index { get; set; } public int Select { get; set; } public int Pool { get; set; } - public override RequestType RequestType - { - get { return RequestType.GetOrder; } - } + public override RequestType RequestType => RequestType.GetOrder; } } \ No newline at end of file diff --git a/MtApi/Requests/GetOrdersRequest.cs b/MtApi/Requests/GetOrdersRequest.cs old mode 100644 new mode 100755 index 41777ce4..8166c907 --- a/MtApi/Requests/GetOrdersRequest.cs +++ b/MtApi/Requests/GetOrdersRequest.cs @@ -1,12 +1,9 @@ namespace MtApi.Requests { - public class GetOrdersRequest: RequestBase + internal class GetOrdersRequest: RequestBase { public int Pool { get; set; } - public override RequestType RequestType - { - get { return RequestType.GetOrders; } - } + public override RequestType RequestType => RequestType.GetOrders; } } \ No newline at end of file diff --git a/MtApi/Requests/ICustomRequest.cs b/MtApi/Requests/ICustomRequest.cs old mode 100644 new mode 100755 index f75d3d63..c70ba300 --- a/MtApi/Requests/ICustomRequest.cs +++ b/MtApi/Requests/ICustomRequest.cs @@ -1,10 +1,8 @@ - -using System; -using System.Collections; +using System.Collections; namespace MtApi.Requests { - public class ICustomRequest : RequestBase + internal class ICustomRequest : RequestBase { public enum ParametersType { @@ -22,9 +20,6 @@ namespace MtApi.Requests public ArrayList Params { get; set; } public ParametersType ParamsType { get; set; } - public override RequestType RequestType - { - get { return RequestType.iCustom; } - } + public override RequestType RequestType => RequestType.iCustom; } } diff --git a/MtApi/Requests/OrderCloseByRequest.cs b/MtApi/Requests/OrderCloseByRequest.cs old mode 100644 new mode 100755 index 5908362e..30d4e04b --- a/MtApi/Requests/OrderCloseByRequest.cs +++ b/MtApi/Requests/OrderCloseByRequest.cs @@ -1,15 +1,12 @@ namespace MtApi.Requests { - public class OrderCloseByRequest: RequestBase + internal class OrderCloseByRequest: RequestBase { public int Ticket { get; set; } public int Opposite { get; set; } public int? ArrowColor { get; set; } - public override RequestType RequestType - { - get { return RequestType.OrderCloseBy; } - } + public override RequestType RequestType => RequestType.OrderCloseBy; } } \ No newline at end of file diff --git a/MtApi/Requests/OrderCloseRequest.cs b/MtApi/Requests/OrderCloseRequest.cs old mode 100644 new mode 100755 index 2b34b829..8874a45e --- a/MtApi/Requests/OrderCloseRequest.cs +++ b/MtApi/Requests/OrderCloseRequest.cs @@ -1,6 +1,6 @@ namespace MtApi.Requests { - public class OrderCloseRequest: RequestBase + internal class OrderCloseRequest: RequestBase { public int Ticket { get; set; } @@ -9,9 +9,6 @@ public int? Slippage { get; set; } public int? ArrowColor { get; set; } - public override RequestType RequestType - { - get { return RequestType.OrderClose; } - } + public override RequestType RequestType => RequestType.OrderClose; } } \ No newline at end of file diff --git a/MtApi/Requests/OrderDeleteRequest.cs b/MtApi/Requests/OrderDeleteRequest.cs old mode 100644 new mode 100755 index 2d205597..c02076fb --- a/MtApi/Requests/OrderDeleteRequest.cs +++ b/MtApi/Requests/OrderDeleteRequest.cs @@ -1,14 +1,11 @@ namespace MtApi.Requests { - public class OrderDeleteRequest: RequestBase + internal class OrderDeleteRequest: RequestBase { public int Ticket { get; set; } public int? ArrowColor { get; set; } - public override RequestType RequestType - { - get { return RequestType.OrderDelete; } - } + public override RequestType RequestType => RequestType.OrderDelete; } } \ No newline at end of file diff --git a/MtApi/Requests/OrderModifyRequest.cs b/MtApi/Requests/OrderModifyRequest.cs old mode 100644 new mode 100755 index ca8edbea..91d6ae59 --- a/MtApi/Requests/OrderModifyRequest.cs +++ b/MtApi/Requests/OrderModifyRequest.cs @@ -1,6 +1,6 @@ namespace MtApi.Requests { - public class OrderModifyRequest: RequestBase + internal class OrderModifyRequest: RequestBase { public int Ticket { get; set; } public double Price { get; set; } @@ -10,9 +10,6 @@ public int? ArrowColor { get; set; } - public override RequestType RequestType - { - get { return RequestType.OrderModify; } - } + public override RequestType RequestType => RequestType.OrderModify; } } \ No newline at end of file diff --git a/MtApi/Requests/OrderSendRequest.cs b/MtApi/Requests/OrderSendRequest.cs old mode 100644 new mode 100755 index 001caec4..331302a3 --- a/MtApi/Requests/OrderSendRequest.cs +++ b/MtApi/Requests/OrderSendRequest.cs @@ -1,6 +1,6 @@ namespace MtApi.Requests { - public class OrderSendRequest: RequestBase + internal class OrderSendRequest: RequestBase { public string Symbol { get; set; } public int Cmd { get; set; } @@ -15,9 +15,6 @@ public int? Expiration { get; set; } public int? ArrowColor { get; set; } - public override RequestType RequestType - { - get { return RequestType.OrderSend; } - } + public override RequestType RequestType => RequestType.OrderSend; } } \ No newline at end of file diff --git a/MtApi/Requests/RequestBase.cs b/MtApi/Requests/RequestBase.cs index 666b2a1a..28988500 100644 --- a/MtApi/Requests/RequestBase.cs +++ b/MtApi/Requests/RequestBase.cs @@ -1,9 +1,7 @@ -using Newtonsoft.Json; - -namespace MtApi.Requests -{ - public abstract class RequestBase +namespace MtApi.Requests +{ + internal abstract class RequestBase { - public abstract RequestType RequestType { get; } - } -} + public abstract RequestType RequestType { get; } + } +} diff --git a/MtApi/Requests/RequestType.cs b/MtApi/Requests/RequestType.cs index 1d222555..df2b0892 100644 --- a/MtApi/Requests/RequestType.cs +++ b/MtApi/Requests/RequestType.cs @@ -1,17 +1,18 @@ namespace MtApi.Requests { - public enum RequestType + internal enum RequestType { - Unknown = 0, - GetOrder = 1, - GetOrders = 2, - OrderSend = 3, - OrderClose = 4, - OrderCloseBy = 5, - OrderDelete = 6, - OrderModify = 7, - iCustom = 8, - CopyRates = 9, - Session = 10, + Unknown = 0, + GetOrder = 1, + GetOrders = 2, + OrderSend = 3, + OrderClose = 4, + OrderCloseBy = 5, + OrderDelete = 6, + OrderModify = 7, + iCustom = 8, + CopyRates = 9, + Session = 10, + SeriesInfoInteger = 11 } } \ No newline at end of file diff --git a/MtApi/Requests/SeriesInfoIntegerRequest.cs b/MtApi/Requests/SeriesInfoIntegerRequest.cs new file mode 100755 index 00000000..72df77fb --- /dev/null +++ b/MtApi/Requests/SeriesInfoIntegerRequest.cs @@ -0,0 +1,11 @@ +namespace MtApi.Requests +{ + internal class SeriesInfoIntegerRequest: RequestBase + { + public override RequestType RequestType => RequestType.SeriesInfoInteger; + + public string SymbolName { get; set; } + public int Timeframe { get; set; } + public int PropId { get; set; } + } +} diff --git a/MtApi/Requests/SessionRequest.cs b/MtApi/Requests/SessionRequest.cs index ab836e16..a0da423b 100644 --- a/MtApi/Requests/SessionRequest.cs +++ b/MtApi/Requests/SessionRequest.cs @@ -2,16 +2,13 @@ namespace MtApi.Requests { - public class SessionRequest : RequestBase + internal class SessionRequest : RequestBase { public string Symbol { get; set; } public DayOfWeek DayOfWeek { get; set; } public int SessionIndex { get; set; } public SessionType SessionType { get; set; } - public override RequestType RequestType - { - get { return RequestType.Session; } - } + public override RequestType RequestType => RequestType.Session; } } \ No newline at end of file diff --git a/MtApi/Responses/CopyRatesResponse.cs b/MtApi/Responses/CopyRatesResponse.cs index e8e0c7e8..2f303486 100644 --- a/MtApi/Responses/CopyRatesResponse.cs +++ b/MtApi/Responses/CopyRatesResponse.cs @@ -2,7 +2,7 @@ namespace MtApi.Responses { - public class CopyRatesResponse: ResponseBase + internal class CopyRatesResponse: ResponseBase { public List Rates { get; set; } } diff --git a/MtApi/Responses/GetOrderResponse.cs b/MtApi/Responses/GetOrderResponse.cs old mode 100644 new mode 100755 index a99d3b68..84c7d4d3 --- a/MtApi/Responses/GetOrderResponse.cs +++ b/MtApi/Responses/GetOrderResponse.cs @@ -1,6 +1,6 @@ namespace MtApi.Responses { - public class GetOrderResponse: ResponseBase + internal class GetOrderResponse: ResponseBase { public MtOrder Order { get; set; } } diff --git a/MtApi/Responses/GetOrdersResponse.cs b/MtApi/Responses/GetOrdersResponse.cs old mode 100644 new mode 100755 index 20e927a1..ce89e563 --- a/MtApi/Responses/GetOrdersResponse.cs +++ b/MtApi/Responses/GetOrdersResponse.cs @@ -2,7 +2,7 @@ namespace MtApi.Responses { - public class GetOrdersResponse: ResponseBase + internal class GetOrdersResponse: ResponseBase { public List Orders { get; set; } } diff --git a/MtApi/Responses/ICustomResponse.cs b/MtApi/Responses/ICustomResponse.cs old mode 100644 new mode 100755 index 601eb5fd..bb42b0d9 --- a/MtApi/Responses/ICustomResponse.cs +++ b/MtApi/Responses/ICustomResponse.cs @@ -1,12 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MtApi.Responses +namespace MtApi.Responses { - public class ICustomResponse: ResponseBase + internal class ICustomResponse: ResponseBase { public double Value { get; set; } } diff --git a/MtApi/Responses/OrderSendResponse.cs b/MtApi/Responses/OrderSendResponse.cs old mode 100644 new mode 100755 index fea4d10d..b74f17e3 --- a/MtApi/Responses/OrderSendResponse.cs +++ b/MtApi/Responses/OrderSendResponse.cs @@ -1,6 +1,6 @@ namespace MtApi.Responses { - public class OrderSendResponse: ResponseBase + internal class OrderSendResponse: ResponseBase { public int Ticket { get; set; } } diff --git a/MtApi/Responses/ResponseBase.cs b/MtApi/Responses/ResponseBase.cs old mode 100644 new mode 100755 index 470f0b6a..85a5224a --- a/MtApi/Responses/ResponseBase.cs +++ b/MtApi/Responses/ResponseBase.cs @@ -1,6 +1,6 @@ namespace MtApi.Responses { - public class ResponseBase + internal class ResponseBase { public int ErrorCode { get; set; } public string ErrorMessage { get; set; } diff --git a/MtApi/Responses/SeriesInfoIntegerResponse.cs b/MtApi/Responses/SeriesInfoIntegerResponse.cs new file mode 100755 index 00000000..542c0f67 --- /dev/null +++ b/MtApi/Responses/SeriesInfoIntegerResponse.cs @@ -0,0 +1,7 @@ +namespace MtApi.Responses +{ + internal class SeriesInfoIntegerResponse: ResponseBase + { + public long Value { get; set; } + } +} diff --git a/MtApi/Responses/SessionResponse.cs b/MtApi/Responses/SessionResponse.cs index 7665a67c..53333b8d 100644 --- a/MtApi/Responses/SessionResponse.cs +++ b/MtApi/Responses/SessionResponse.cs @@ -1,6 +1,6 @@ namespace MtApi.Responses { - public class SessionResponse : ResponseBase + internal class SessionResponse : ResponseBase { public MtSession Session { get; set; } } diff --git a/TestClients/TestApiClientUI/Form1.Designer.cs b/TestClients/TestApiClientUI/Form1.Designer.cs index b033d782..17433f60 100644 --- a/TestClients/TestApiClientUI/Form1.Designer.cs +++ b/TestClients/TestApiClientUI/Form1.Designer.cs @@ -154,6 +154,8 @@ this.button28 = new System.Windows.Forms.Button(); this.label28 = new System.Windows.Forms.Label(); this.textBox1 = new System.Windows.Forms.TextBox(); + this.button31 = new System.Windows.Forms.Button(); + this.comboBox5 = new System.Windows.Forms.ComboBox(); this.groupBox1.SuspendLayout(); this.statusStrip1.SuspendLayout(); this.groupBox2.SuspendLayout(); @@ -1109,6 +1111,8 @@ // // tabPage5 // + this.tabPage5.Controls.Add(this.comboBox5); + this.tabPage5.Controls.Add(this.button31); this.tabPage5.Controls.Add(this.dateTimePicker2); this.tabPage5.Controls.Add(this.dateTimePicker1); this.tabPage5.Controls.Add(this.label6); @@ -1546,6 +1550,30 @@ this.textBox1.TabIndex = 0; this.textBox1.Text = "EURUSD"; // + // button31 + // + this.button31.Location = new System.Drawing.Point(287, 298); + this.button31.Name = "button31"; + this.button31.Size = new System.Drawing.Size(128, 23); + this.button31.TabIndex = 22; + this.button31.Text = "SeriesInfoInteger"; + this.button31.UseVisualStyleBackColor = true; + this.button31.Click += new System.EventHandler(this.button31_Click); + // + // comboBox5 + // + this.comboBox5.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox5.FormattingEnabled = true; + this.comboBox5.Items.AddRange(new object[] { + "SERIES_BARS_COUNT", + "SERIES_FIRSTDATE", + "SERIES_LASTBAR_DATE", + "SERIES_SERVER_FIRSTDATE"}); + this.comboBox5.Location = new System.Drawing.Point(160, 298); + this.comboBox5.Name = "comboBox5"; + this.comboBox5.Size = new System.Drawing.Size(121, 21); + this.comboBox5.TabIndex = 23; + // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -1718,6 +1746,8 @@ private System.Windows.Forms.Button button30; private System.Windows.Forms.Button button32; private System.Windows.Forms.ComboBox comboBox4; + private System.Windows.Forms.Button button31; + private System.Windows.Forms.ComboBox comboBox5; } } diff --git a/TestClients/TestApiClientUI/Form1.cs b/TestClients/TestApiClientUI/Form1.cs index a7d1f4fd..66baf572 100644 --- a/TestClients/TestApiClientUI/Form1.cs +++ b/TestClients/TestApiClientUI/Form1.cs @@ -39,7 +39,9 @@ namespace TestApiClientUI comboBox1.SelectedIndex = 0; comboBox2.SelectedIndex = 0; + comboBox3.SelectedIndex = 0; comboBox4.SelectedIndex = 0; + comboBox5.SelectedIndex = 0; _timerTradeMonitor = new TimerTradeMonitor(_apiClient) { Interval = 10000 }; // 10 sec _timerTradeMonitor.AvailabilityOrdersChanged += _tradeMonitor_AvailabilityOrdersChanged; @@ -1221,5 +1223,18 @@ namespace TestApiClientUI AddToLog($"{sender.GetType()}: Closed orders - {string.Join(", ", e.Closed.Select(o => o.Ticket).ToList())}"); } } + + //SeriesInfoInteger + private async void button31_Click(object sender, EventArgs e) + { + var symbol = textBoxSelectedSymbol.Text; + ENUM_TIMEFRAMES timeframes; + Enum.TryParse(comboBox3.Text, out timeframes); + EnumSeriesInfoInteger propId; + Enum.TryParse(comboBox5.Text, out propId); + + var result = await Execute(() => _apiClient.SeriesInfoInteger(symbol, timeframes, propId)); + AddToLog($"SeriesInfoInteger: result = {result}"); + } } } diff --git a/TestClients/TestApiClientUI/Form1.resx b/TestClients/TestApiClientUI/Form1.resx old mode 100644 new mode 100755 diff --git a/mq4/MtApi.ex4 b/mq4/MtApi.ex4 index 1f2e651d..e55b7d23 100755 Binary files a/mq4/MtApi.ex4 and b/mq4/MtApi.ex4 differ diff --git a/mq4/MtApi.mq4 b/mq4/MtApi.mq4 index 11699716..08795a19 100755 Binary files a/mq4/MtApi.mq4 and b/mq4/MtApi.mq4 differ