diff --git a/MtApi/MtApi.csproj b/MtApi/MtApi.csproj index af7bae5e..c3ccf8f4 100755 --- a/MtApi/MtApi.csproj +++ b/MtApi/MtApi.csproj @@ -78,6 +78,7 @@ + diff --git a/MtApi/MtApiClient.cs b/MtApi/MtApiClient.cs index ac7ab6ed..8c347af7 100755 --- a/MtApi/MtApiClient.cs +++ b/MtApi/MtApiClient.cs @@ -1,11 +1,9 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using MTApiService; using System.Drawing; using System.Collections; -using System.Net; using System.ServiceModel; using MtApi.Requests; using MtApi.Responses; @@ -99,7 +97,21 @@ namespace MtApi public int OrderSend(string symbol, TradeOperation cmd, double volume, double price, int slippage, double stoploss, double takeprofit , string comment, int magic, DateTime expiration, Color arrowColor) { - return InternalOrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrowColor); + var response = SendRequest(new OrderSendRequest + { + Symbol = symbol, + Cmd = (int)cmd, + Volume = volume, + Price = price, + Slippage = slippage, + Stoploss = stoploss, + Takeprofit = takeprofit, + Comment = comment, + Magic = magic, + Expiration = MtApiTimeConverter.ConvertToMtTime(expiration), + ArrowColor = MtApiColorConverter.ConvertToMtColor(arrowColor) + }); + return response != null ? response.Ticket : -1; } public int OrderSend(string symbol, TradeOperation cmd, double volume, double price, int slippage, double stoploss, double takeprofit @@ -154,51 +166,107 @@ namespace MtApi public int OrderSendBuy(string symbol, double volume, int slippage, double stoploss, double takeprofit, string comment, int magic) { - return InternalOrderSend(symbol, TradeOperation.OP_BUY, volume, null, slippage, stoploss, takeprofit, comment, - magic, null, null); + var response = SendRequest(new OrderSendRequest + { + Symbol = symbol, + Cmd = (int)TradeOperation.OP_BUY, + Volume = volume, + Slippage = slippage, + Stoploss = stoploss, + Takeprofit = takeprofit, + Comment = comment, + Magic = magic, + }); + return response != null ? response.Ticket : -1; } public int OrderSendSell(string symbol, double volume, int slippage, double stoploss, double takeprofit, string comment, int magic) { - return InternalOrderSend(symbol, TradeOperation.OP_SELL, volume, null, slippage, stoploss, takeprofit, comment, - magic, null, null); + var response = SendRequest(new OrderSendRequest + { + Symbol = symbol, + Cmd = (int)TradeOperation.OP_SELL, + Volume = volume, + Slippage = slippage, + Stoploss = stoploss, + Takeprofit = takeprofit, + Comment = comment, + Magic = magic, + }); + return response != null ? response.Ticket : -1; } public bool OrderClose(int ticket, double lots, double price, int slippage, Color color) { - return InternalOrderClose(ticket, lots, price, slippage, color); + var response = SendRequest(new OrderCloseRequest + { + Ticket = ticket, + Lots = lots, + Price = price, + Slippage = slippage, + ArrowColor = MtApiColorConverter.ConvertToMtColor(color) + }); + return response != null; } public bool OrderClose(int ticket, double lots, double price, int slippage) { - return InternalOrderClose(ticket, lots, price, slippage, null); + var response = SendRequest(new OrderCloseRequest + { + Ticket = ticket, + Lots = lots, + Price = price, + Slippage = slippage, + }); + return response != null; } public bool OrderClose(int ticket, double lots, int slippage) { - return InternalOrderClose(ticket, lots, null, slippage, null); + var response = SendRequest(new OrderCloseRequest + { + Ticket = ticket, + Lots = lots, + Slippage = slippage, + }); + return response != null; } public bool OrderClose(int ticket, int slippage) { - return InternalOrderClose(ticket, null, null, slippage, null); + var response = SendRequest(new OrderCloseRequest + { + Ticket = ticket, + Slippage = slippage, + }); + return response != null; } [Obsolete("OrderCloseByCurrentPrice is deprecated, please use OrderClose instead.")] public bool OrderCloseByCurrentPrice(int ticket, int slippage) { - return InternalOrderClose(ticket, null, null, slippage, null); + return OrderClose(ticket, slippage); } public bool OrderCloseBy(int ticket, int opposite, Color color) { - var commandParameters = new ArrayList { ticket, opposite, MtApiColorConverter.ConvertToMtColor(color) }; - return SendCommand(MtCommandType.OrderCloseBy, commandParameters); + var response = SendRequest(new OrderCloseByRequest + { + Ticket = ticket, + Opposite = opposite, + ArrowColor = MtApiColorConverter.ConvertToMtColor(color) + }); + return response != null; } public bool OrderCloseBy(int ticket, int opposite) { - return OrderCloseBy(ticket, opposite, Color.Empty); + var response = SendRequest(new OrderCloseByRequest + { + Ticket = ticket, + Opposite = opposite, + }); + return response != null; } public double OrderClosePrice() @@ -1302,45 +1370,17 @@ namespace MtApi ConnectionStateChanged.FireEvent(this, new MtConnectionEventArgs(MtConnectionState.Disconnected, "Disconnected")); } - private int InternalOrderSend(string symbol, TradeOperation cmd, double volume, double? price, - int? slippage, double? stoploss, double? takeprofit, string comment, int? magic, DateTime? expiration, Color? arrowColor) - { - var response = SendRequest(new OrderSendRequest - { - Symbol = symbol, - Cmd = (int)cmd, - Volume = volume, - Price = price, - Slippage = slippage, - Stoploss = stoploss, - Takeprofit = takeprofit, - Comment = comment, - Magic = magic, - Expiration = expiration.HasValue ? MtApiTimeConverter.ConvertToMtTime(expiration.Value) : default(int?), - ArrowColor = arrowColor.HasValue ? MtApiColorConverter.ConvertToMtColor(arrowColor.Value) : default(int?) - }); - return response != null ? response.Ticket : -1; - } - - public bool InternalOrderClose(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); - - var response = SendRequest(new OrderCloseRequest - { - Ticket = ticket, - Lots = lots, - Price = price, - Slippage = slippage, - ArrowColor = color.HasValue ? MtApiColorConverter.ConvertToMtColor(color.Value) : default(int?) - }); - return response != null; - } - private T SendCommand(MtCommandType commandType, ArrayList commandParameters) { - var response = mClient.SendCommand((int)commandType, commandParameters); + MtResponse response; + try + { + response = mClient.SendCommand((int)commandType, commandParameters); + } + catch (CommunicationException ex) + { + throw new MtConnectionException(ex.Message, ex); + } T result = default(T); diff --git a/MtApi/MtCommandType.cs b/MtApi/MtCommandType.cs index 66cf81ca..f537758d 100755 --- a/MtApi/MtCommandType.cs +++ b/MtApi/MtCommandType.cs @@ -16,7 +16,7 @@ namespace MtApi // OrderClose = 2, // OrderCloseByCurrentPrice = 152, - OrderCloseBy = 3, +// OrderCloseBy = 3, OrderClosePrice = 4, OrderClosePriceByTicket = 1004, OrderCloseTime = 5, diff --git a/MtApi/Requests/OrderCloseByRequest.cs b/MtApi/Requests/OrderCloseByRequest.cs new file mode 100644 index 00000000..5908362e --- /dev/null +++ b/MtApi/Requests/OrderCloseByRequest.cs @@ -0,0 +1,15 @@ +namespace MtApi.Requests +{ + public 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; } + } + } +} \ No newline at end of file diff --git a/MtApi/Requests/RequestType.cs b/MtApi/Requests/RequestType.cs index eb1794e9..d4dce25b 100644 --- a/MtApi/Requests/RequestType.cs +++ b/MtApi/Requests/RequestType.cs @@ -7,5 +7,6 @@ GetOrders = 2, OrderSend = 3, OrderClose = 4, + OrderCloseBy = 5 } } \ No newline at end of file diff --git a/TestApiClientUI/Form1.Designer.cs b/TestApiClientUI/Form1.Designer.cs index d09d0870..a10cb297 100755 --- a/TestApiClientUI/Form1.Designer.cs +++ b/TestApiClientUI/Form1.Designer.cs @@ -48,6 +48,7 @@ this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); this.tabControl1 = new System.Windows.Forms.TabControl(); this.tabPage2 = new System.Windows.Forms.TabPage(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); this.button20 = new System.Windows.Forms.Button(); this.button17 = new System.Windows.Forms.Button(); this.comboBox2 = new System.Windows.Forms.ComboBox(); @@ -123,7 +124,9 @@ this.tabPage6 = new System.Windows.Forms.TabPage(); this.button14 = new System.Windows.Forms.Button(); this.button13 = new System.Windows.Forms.Button(); - this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.button15 = new System.Windows.Forms.Button(); + this.textBoxOppositeTicket = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); this.groupBox1.SuspendLayout(); this.statusStrip1.SuspendLayout(); this.groupBox2.SuspendLayout(); @@ -304,6 +307,9 @@ // // tabPage2 // + this.tabPage2.Controls.Add(this.label3); + this.tabPage2.Controls.Add(this.textBoxOppositeTicket); + this.tabPage2.Controls.Add(this.button15); this.tabPage2.Controls.Add(this.checkBox1); this.tabPage2.Controls.Add(this.button20); this.tabPage2.Controls.Add(this.button17); @@ -327,19 +333,29 @@ this.tabPage2.Text = "Trade Operations"; this.tabPage2.UseVisualStyleBackColor = true; // + // checkBox1 + // + this.checkBox1.AutoSize = true; + this.checkBox1.Location = new System.Drawing.Point(297, 208); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.Size = new System.Drawing.Size(205, 17); + this.checkBox1.TabIndex = 14; + this.checkBox1.Text = "Close order by current price on market"; + this.checkBox1.UseVisualStyleBackColor = true; + // // button20 // - this.button20.Location = new System.Drawing.Point(216, 185); + this.button20.Location = new System.Drawing.Point(216, 202); this.button20.Name = "button20"; this.button20.Size = new System.Drawing.Size(75, 23); this.button20.TabIndex = 13; - this.button20.Text = "CloseOrder"; + this.button20.Text = "OrderClose"; this.button20.UseVisualStyleBackColor = true; this.button20.Click += new System.EventHandler(this.button20_Click); // // button17 // - this.button17.Location = new System.Drawing.Point(601, 158); + this.button17.Location = new System.Drawing.Point(558, 158); this.button17.Name = "button17"; this.button17.Size = new System.Drawing.Size(75, 23); this.button17.TabIndex = 12; @@ -386,9 +402,9 @@ this.label21.AutoSize = true; this.label21.Location = new System.Drawing.Point(213, 135); this.label21.Name = "label21"; - this.label21.Size = new System.Drawing.Size(71, 13); + this.label21.Size = new System.Drawing.Size(68, 13); this.label21.TabIndex = 8; - this.label21.Text = "Index/Ticket:"; + this.label21.Text = "Index/Ticket"; // // textBoxIndexTicket // @@ -1173,15 +1189,32 @@ this.button13.UseVisualStyleBackColor = true; this.button13.Click += new System.EventHandler(this.button13_Click); // - // checkBox1 + // button15 // - this.checkBox1.AutoSize = true; - this.checkBox1.Location = new System.Drawing.Point(297, 191); - this.checkBox1.Name = "checkBox1"; - this.checkBox1.Size = new System.Drawing.Size(205, 17); - this.checkBox1.TabIndex = 14; - this.checkBox1.Text = "Close order by current price on market"; - this.checkBox1.UseVisualStyleBackColor = true; + this.button15.Location = new System.Drawing.Point(410, 237); + this.button15.Name = "button15"; + this.button15.Size = new System.Drawing.Size(92, 23); + this.button15.TabIndex = 15; + this.button15.Text = "OrderCloseBy"; + this.button15.UseVisualStyleBackColor = true; + this.button15.Click += new System.EventHandler(this.button15_Click); + // + // textBoxOppositeTicket + // + this.textBoxOppositeTicket.Location = new System.Drawing.Point(303, 239); + this.textBoxOppositeTicket.Name = "textBoxOppositeTicket"; + this.textBoxOppositeTicket.Size = new System.Drawing.Size(100, 20); + this.textBoxOppositeTicket.TabIndex = 16; + this.textBoxOppositeTicket.Text = "0"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(219, 242); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(78, 13); + this.label3.TabIndex = 17; + this.label3.Text = "Opposite ticket"; // // Form1 // @@ -1319,6 +1352,9 @@ private System.Windows.Forms.Button button18; private System.Windows.Forms.Button button20; private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox textBoxOppositeTicket; + private System.Windows.Forms.Button button15; } } diff --git a/TestApiClientUI/Form1.cs b/TestApiClientUI/Form1.cs index 81ddc4e6..19b2b85f 100755 --- a/TestApiClientUI/Form1.cs +++ b/TestApiClientUI/Form1.cs @@ -1,16 +1,8 @@ using System; using System.Collections.Generic; -using System.ComponentModel; -using System.Data; using System.Drawing; -using System.Linq; -using System.Text; using System.Windows.Forms; -using System.Security.Cryptography; -using System.IO; using MtApi; -using System.Net; -using System.Diagnostics; using System.Threading.Tasks; namespace TestApiClientUI @@ -78,22 +70,20 @@ namespace TestApiClientUI switch (e.Status) { case MtConnectionState.Connected: - RunOnUiThread(onConnected); + RunOnUiThread(OnConnected); break; case MtConnectionState.Disconnected: case MtConnectionState.Failed: - RunOnUiThread(onDisconnected); + RunOnUiThread(OnDisconnected); break; } } private void apiClient_QuoteRemoved(object sender, MtQuoteEventArgs e) { - string instrument = e.Quote.Instrument; - RunOnUiThread(() => { - removeQuote(e.Quote); + RemoveQuote(e.Quote); }); } @@ -101,7 +91,7 @@ namespace TestApiClientUI { RunOnUiThread(() => { - addNewQuote(e.Quote); + AddNewQuote(e.Quote); }); } @@ -109,11 +99,11 @@ namespace TestApiClientUI { this.BeginInvoke((Action)(() => { - changeQuote(symbol, bid, ask); + ChangeQuote(symbol, bid, ask); })); } - private void addNewQuote(MtQuote quote) + private void AddNewQuote(MtQuote quote) { if (quote != null && string.IsNullOrEmpty(quote.Instrument) == false @@ -136,7 +126,7 @@ namespace TestApiClientUI } } - private void removeQuote(MtQuote quote) + private void RemoveQuote(MtQuote quote) { if (quote != null && string.IsNullOrEmpty(quote.Instrument) == false @@ -157,7 +147,7 @@ namespace TestApiClientUI } } - private void changeQuote(string symbol, double bid, double ask) + private void ChangeQuote(string symbol, double bid, double ask) { if (string.IsNullOrEmpty(symbol) == false) { @@ -170,7 +160,7 @@ namespace TestApiClientUI } } - private void onConnected() + private void OnConnected() { var quotes = _apiClient.GetQuotes(); @@ -178,12 +168,12 @@ namespace TestApiClientUI { foreach (var quote in quotes) { - addNewQuote(quote); + AddNewQuote(quote); } } } - private void onDisconnected() + private void OnDisconnected() { listViewQuotes.Items.Clear(); } @@ -200,7 +190,7 @@ namespace TestApiClientUI else _apiClient.BeginConnect(serverName, port); - onConnected(); + OnConnected(); } private void buttonDisconnect_Click(object sender, EventArgs e) @@ -213,78 +203,6 @@ namespace TestApiClientUI _apiClient.BeginDisconnect(); } - private void sendOrder(string symbol, TradeOperation command, double volume, double price, int slippage, double stoploss, double takeprofit - , string comment, int magic, DateTime expiration, Color arrow_color) - { - - int ticket = 0; - try - { - ticket = _apiClient.OrderSend(symbol, command, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color); - } - catch (MtConnectionException ex) - { - addToLog("MtExecutionException: " + ex.Message); - return; - } - catch (MtExecutionException ex) - { - addToLog("MtExecutionException: " + ex.Message + "; ErrorCode = " + ex.ErrorCode); - return; - } - - addToLog(string.Format("Sended order result: ticketId = {0}, symbol = {1}, volume = {2}, slippage = {3}", - ticket, symbol, volume, slippage)); - } - - private void button1_Click(object sender, EventArgs e) - { - string symbol = textBoxOrderSymbol.Text; - - var op_command = (TradeOperation)(comboBoxOrderCommand.SelectedIndex); - - double volume; - double.TryParse(textBoxOrderVolume.Text, out volume); - - double price; - double.TryParse(textBoxOrderPrice.Text, out price); - - int slippage = (int)numericOrderSlippage.Value; - - double stoploss; - double.TryParse(textBoxOrderStoploss.Text, out stoploss); - - double takeprofit; - double.TryParse(textBoxOrderProffit.Text, out takeprofit); - - string comment = textBoxOrderComment.Text; - - int magic; - int.TryParse(textBoxOrderMagic.Text, out magic); - - DateTime expiration = DateTime.Now; - - Color arrow_color = new Color(); - switch (comboBoxOrderColor.SelectedIndex) - { - case 0: - arrow_color = Color.Green; - break; - case 1: - arrow_color = Color.Blue; - break; - case 2: - arrow_color = Color.Red; - break; - } - - Action a = () => - { - sendOrder(symbol, op_command, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color); - }; - a.BeginInvoke(null, null); - } - private void listViewQuotes_SelectedIndexChanged(object sender, EventArgs e) { if (listViewQuotes.SelectedItems.Count > 0) @@ -319,7 +237,7 @@ namespace TestApiClientUI sendedOrders.Add(orderId); } - addToLog(string.Format("Closed order result: {0}, ticketId = {1}, volume - {2}, slippage {3}", result, orderId, volume, slippage)); + AddToLog(string.Format("Closed order result: {0}, ticketId = {1}, volume - {2}, slippage {3}", result, orderId, volume, slippage)); } foreach (var orderId in sendedOrders) @@ -353,7 +271,7 @@ namespace TestApiClientUI var result = _apiClient.OrderCloseBy(ticket, opposite, color); - addToLog(string.Format("ClosedBy order result: {0}, ticketId = {1}, opposite {2}", result, ticket, opposite)); + AddToLog(string.Format("ClosedBy order result: {0}, ticketId = {1}, opposite {2}", result, ticket, opposite)); } } @@ -361,26 +279,26 @@ namespace TestApiClientUI { var result = _apiClient.OrderClosePrice(); textBoxOrderPrice.Text = result.ToString(); - addToLog(string.Format("OrderClosePrice result: {0}", result)); + AddToLog(string.Format("OrderClosePrice result: {0}", result)); } private void orderCloseTime() { var result = _apiClient.OrderCloseTime(); - addToLog(string.Format("OrderCloseTime result: {0}", result)); + AddToLog(string.Format("OrderCloseTime result: {0}", result)); } private void orderComment() { var result = _apiClient.OrderComment(); textBoxOrderComment.Text = result.ToString(); - addToLog(string.Format("OrderComment result: {0}", result)); + AddToLog(string.Format("OrderComment result: {0}", result)); } private void orderCommission() { var result = _apiClient.OrderCommission(); - addToLog(string.Format("OrderCommission result: {0}", result)); + AddToLog(string.Format("OrderCommission result: {0}", result)); } private void orderDelete() @@ -391,26 +309,26 @@ namespace TestApiClientUI var result = _apiClient.OrderDelete(ticket); - addToLog(string.Format("Delete order result: {0}, ticketId = {1}", result, ticket)); + AddToLog(string.Format("Delete order result: {0}, ticketId = {1}", result, ticket)); } } private void orderExpiration() { var result = _apiClient.OrderExpiration(); - addToLog(string.Format("Expiration order result: {0}", result)); + AddToLog(string.Format("Expiration order result: {0}", result)); } private void orderLots() { var result = _apiClient.OrderLots(); - addToLog(string.Format("Lots order result: {0}", result)); + AddToLog(string.Format("Lots order result: {0}", result)); } private void orderMagicNumber() { var result = _apiClient.OrderMagicNumber(); - addToLog(string.Format("MagicNumber order result: {0}", result)); + AddToLog(string.Format("MagicNumber order result: {0}", result)); } private void orderModify() @@ -446,20 +364,20 @@ namespace TestApiClientUI var result = _apiClient.OrderModify(ticket, price, stoploss, takeprofit, expiration, arrow_color); - addToLog(string.Format("OrderModify result: {0}", result)); + AddToLog(string.Format("OrderModify result: {0}", result)); } } private void orderOpenPrice() { var result = _apiClient.OrderOpenPrice(); - addToLog(string.Format("OrderOpenPrice result: {0}", result)); + AddToLog(string.Format("OrderOpenPrice result: {0}", result)); } private void orderOpenTime() { var result = _apiClient.OrderOpenTime(); - addToLog(string.Format("OpenTime order result: {0}", result)); + AddToLog(string.Format("OpenTime order result: {0}", result)); } private void orderPrint() @@ -470,7 +388,7 @@ namespace TestApiClientUI private void orderProfit() { var result = _apiClient.OrderProfit(); - addToLog(string.Format("Profit order result: {0}", result)); + AddToLog(string.Format("Profit order result: {0}", result)); } private void orderSelect() @@ -488,60 +406,60 @@ namespace TestApiClientUI { var result = _apiClient.OrderSelect(ticket, OrderSelectMode.SELECT_BY_POS); - addToLog(string.Format("OrderSelect result: {0}", result)); + AddToLog(string.Format("OrderSelect result: {0}", result)); } } private void ordersHistoryTotal() { var result = _apiClient.OrdersHistoryTotal(); - addToLog(string.Format("OrdersHistoryTotal result: {0}", result)); + AddToLog(string.Format("OrdersHistoryTotal result: {0}", result)); } private void orderStopLoss() { var result = _apiClient.OrderStopLoss(); textBoxOrderStoploss.Text = result.ToString(); - addToLog(string.Format("OrderStopLoss result: {0}", result)); + AddToLog(string.Format("OrderStopLoss result: {0}", result)); } private void ordersTotal() { var result = _apiClient.OrdersTotal(); - addToLog(string.Format("OrdersTotal result: {0}", result)); + AddToLog(string.Format("OrdersTotal result: {0}", result)); } private void orderSwap() { var result = _apiClient.OrderSwap(); - addToLog(string.Format("OrderSwap result: {0}", result)); + AddToLog(string.Format("OrderSwap result: {0}", result)); } private void orderSymbol() { var result = _apiClient.OrderSymbol(); textBoxOrderSymbol.Text = result; - addToLog(string.Format("OrderSymbol result: {0}", result)); + AddToLog(string.Format("OrderSymbol result: {0}", result)); } private void orderTakeProfit() { var result = _apiClient.OrderTakeProfit(); textBoxOrderProffit.Text = result.ToString(); - addToLog(string.Format("OrderTakeProfit result: {0}", result)); + AddToLog(string.Format("OrderTakeProfit result: {0}", result)); } private void orderTicket() { var result = _apiClient.OrderTicket(); - addToLog(string.Format("OrderTicket result: {0}", result)); + AddToLog(string.Format("OrderTicket result: {0}", result)); } private void orderType() { var result = _apiClient.OrderType(); comboBoxOrderCommand.SelectedIndex = (int)result; - addToLog(string.Format("OrderType result: {0}", result)); + AddToLog(string.Format("OrderType result: {0}", result)); } private void button2_Click(object sender, EventArgs e) @@ -549,7 +467,7 @@ namespace TestApiClientUI _groupOrderCommands[comboBoxSelectedCommand.SelectedIndex](); } - private void addToLog(string msg) + private void AddToLog(string msg) { RunOnUiThread(() => { @@ -566,79 +484,79 @@ namespace TestApiClientUI case 0: { var result = _apiClient.GetLastError(); - addToLog(string.Format("GetLastError result: {0}", result)); + AddToLog(string.Format("GetLastError result: {0}", result)); } break; case 1: { var result = _apiClient.IsConnected(); - addToLog(string.Format("IsConnected result: {0}", result)); + AddToLog(string.Format("IsConnected result: {0}", result)); } break; case 2: { var result = _apiClient.IsDemo(); - addToLog(string.Format("IsDemo result: {0}", result)); + AddToLog(string.Format("IsDemo result: {0}", result)); } break; case 3: { var result = _apiClient.IsDllsAllowed(); - addToLog(string.Format("IsDllsAllowed result: {0}", result)); + AddToLog(string.Format("IsDllsAllowed result: {0}", result)); } break; case 4: { var result = _apiClient.IsExpertEnabled(); - addToLog(string.Format("IsExpertEnabled result: {0}", result)); + AddToLog(string.Format("IsExpertEnabled result: {0}", result)); } break; case 5: { var result = _apiClient.IsLibrariesAllowed(); - addToLog(string.Format("IsLibrariesAllowed result: {0}", result)); + AddToLog(string.Format("IsLibrariesAllowed result: {0}", result)); } break; case 6: { var result = _apiClient.IsOptimization(); - addToLog(string.Format("IsOptimization result: {0}", result)); + AddToLog(string.Format("IsOptimization result: {0}", result)); } break; case 7: { var result = _apiClient.IsStopped(); - addToLog(string.Format("IsStopped result: {0}", result)); + AddToLog(string.Format("IsStopped result: {0}", result)); } break; case 8: { var result = _apiClient.IsTesting(); - addToLog(string.Format("IsTesting result: {0}", result)); + AddToLog(string.Format("IsTesting result: {0}", result)); } break; case 9: { var result = _apiClient.IsTradeAllowed(); - addToLog(string.Format("IsTradeAllowed result: {0}", result)); + AddToLog(string.Format("IsTradeAllowed result: {0}", result)); } break; case 10: { var result = _apiClient.IsTradeContextBusy(); - addToLog(string.Format("IsTradeContextBusy result: {0}", result)); + AddToLog(string.Format("IsTradeContextBusy result: {0}", result)); } break; case 11: { var result = _apiClient.IsVisualMode(); - addToLog(string.Format("IsVisualMode result: {0}", result)); + AddToLog(string.Format("IsVisualMode result: {0}", result)); } break; case 12: { var result = _apiClient.UninitializeReason(); - addToLog(string.Format("UninitializeReason result: {0}", result)); + AddToLog(string.Format("UninitializeReason result: {0}", result)); } break; case 13: @@ -646,7 +564,7 @@ namespace TestApiClientUI int errorCode = -1; int.TryParse(textBoxErrorCode.Text, out errorCode); var result = _apiClient.ErrorDescription(errorCode); - addToLog(string.Format("ErrorDescription result: {0}", result)); + AddToLog(string.Format("ErrorDescription result: {0}", result)); } break; } @@ -659,97 +577,97 @@ namespace TestApiClientUI case 0: { var result = _apiClient.AccountBalance(); - addToLog(string.Format("AccountBalance result: {0}", result)); + AddToLog(string.Format("AccountBalance result: {0}", result)); } break; case 1: { var result = _apiClient.AccountCredit(); - addToLog(string.Format("AccountCredit result: {0}", result)); + AddToLog(string.Format("AccountCredit result: {0}", result)); } break; case 2: { var result = _apiClient.AccountCompany(); - addToLog(string.Format("AccountCompany result: {0}", result)); + AddToLog(string.Format("AccountCompany result: {0}", result)); } break; case 3: { var result = _apiClient.AccountCurrency(); - addToLog(string.Format("AccountCurrency result: {0}", result)); + AddToLog(string.Format("AccountCurrency result: {0}", result)); } break; case 4: { var result = _apiClient.AccountEquity(); - addToLog(string.Format("AccountEquity result: {0}", result)); + AddToLog(string.Format("AccountEquity result: {0}", result)); } break; case 5: { var result = _apiClient.AccountFreeMargin(); - addToLog(string.Format("AccountFreeMargin result: {0}", result)); + AddToLog(string.Format("AccountFreeMargin result: {0}", result)); } break; case 6: { var result = _apiClient.AccountFreeMarginCheck(textBoxAccountInfoSymbol.Text, (TradeOperation)comboBoxAccountInfoCmd.SelectedIndex, int.Parse(textBoxAccountInfoVolume.Text)); - addToLog(string.Format("AccountFreeMarginCheck result: {0}", result)); + AddToLog(string.Format("AccountFreeMarginCheck result: {0}", result)); } break; case 7: { var result = _apiClient.AccountFreeMarginMode(); - addToLog(string.Format("AccountFreeMarginMode result: {0}", result)); + AddToLog(string.Format("AccountFreeMarginMode result: {0}", result)); } break; case 8: { var result = _apiClient.AccountLeverage(); - addToLog(string.Format("AccountLeverage result: {0}", result)); + AddToLog(string.Format("AccountLeverage result: {0}", result)); } break; case 9: { var result = _apiClient.AccountMargin(); - addToLog(string.Format("AccountMargin result: {0}", result)); + AddToLog(string.Format("AccountMargin result: {0}", result)); } break; case 10: { var result = _apiClient.AccountName(); - addToLog(string.Format("AccountName result: {0}", result)); + AddToLog(string.Format("AccountName result: {0}", result)); } break; case 11: { var result = _apiClient.AccountNumber(); - addToLog(string.Format("AccountNumber result: {0}", result)); + AddToLog(string.Format("AccountNumber result: {0}", result)); } break; case 12: { var result = _apiClient.AccountProfit(); - addToLog(string.Format("AccountProfit result: {0}", result)); + AddToLog(string.Format("AccountProfit result: {0}", result)); } break; case 13: { var result = _apiClient.AccountServer(); - addToLog(string.Format("AccountServer result: {0}", result)); + AddToLog(string.Format("AccountServer result: {0}", result)); } break; case 14: { var result = _apiClient.AccountStopoutLevel(); - addToLog(string.Format("AccountStopoutLevel result: {0}", result)); + AddToLog(string.Format("AccountStopoutLevel result: {0}", result)); } break; case 15: { var result = _apiClient.AccountStopoutMode(); - addToLog(string.Format("AccountStopoutMode result: {0}", result)); + AddToLog(string.Format("AccountStopoutMode result: {0}", result)); } break; } @@ -761,7 +679,7 @@ namespace TestApiClientUI return; var result = _apiClient.MarketInfo(txtMarketInfoSymbol.Text, (MarketInfoModeType)listBoxMarketInfo.SelectedIndex); - addToLog(string.Format("MarketInfo result: {0}", result)); + AddToLog(string.Format("MarketInfo result: {0}", result)); } private void button6_Click(object sender, EventArgs e) @@ -849,25 +767,25 @@ namespace TestApiClientUI string symbol = textBoxSelectedSymbol.Text; int[] param = {11, 12, 13}; var retVal = _apiClient.iCustom(symbol, (int)ChartPeriod.PERIOD_H1, "Zigzag", param, 1, 0); - addToLog(string.Format("ICustom result: {0}", retVal)); + AddToLog(string.Format("ICustom result: {0}", retVal)); } private void button13_Click(object sender, EventArgs e) { var retVal = _apiClient.TimeCurrent(); - addToLog(string.Format("TimeCurrent result: {0}", retVal)); + AddToLog(string.Format("TimeCurrent result: {0}", retVal)); } private void button14_Click(object sender, EventArgs e) { var retVal = _apiClient.TimeLocal(); - addToLog(string.Format("TimeLocal result: {0}", retVal)); + AddToLog(string.Format("TimeLocal result: {0}", retVal)); } private void buttonRefreshRates_Click(object sender, EventArgs e) { var retVal = _apiClient.RefreshRates(); - addToLog(string.Format("RefreshRates result: {0}", retVal)); + AddToLog(string.Format("RefreshRates result: {0}", retVal)); } private void listBoxEventLog_MouseDoubleClick(object sender, MouseEventArgs e) @@ -875,33 +793,83 @@ namespace TestApiClientUI listBoxEventLog.Items.Clear(); } - private TResult Execute(Func func) + private async Task Execute(Func func) { - var result = default(TResult); - try + return await Task.Factory.StartNew(() => { - result = func(); - } - catch (MtConnectionException ex) + var result = default(TResult); + try + { + result = func(); + } + catch (MtConnectionException ex) + { + AddToLog("MtExecutionException: " + ex.Message); + } + catch (MtExecutionException ex) + { + AddToLog("MtExecutionException: " + ex.Message + "; ErrorCode = " + ex.ErrorCode); + } + + return result; + }); + } + + //OrderSend + private void button1_Click(object sender, EventArgs e) + { + var symbol = textBoxOrderSymbol.Text; + + var cmd = (TradeOperation)(comboBoxOrderCommand.SelectedIndex); + + double volume; + double.TryParse(textBoxOrderVolume.Text, out volume); + + double price; + double.TryParse(textBoxOrderPrice.Text, out price); + + var slippage = (int)numericOrderSlippage.Value; + + double stoploss; + double.TryParse(textBoxOrderStoploss.Text, out stoploss); + + double takeprofit; + double.TryParse(textBoxOrderProffit.Text, out takeprofit); + + var comment = textBoxOrderComment.Text; + + int magic; + int.TryParse(textBoxOrderMagic.Text, out magic); + + var expiration = DateTime.Now; + + var arrowColor = new Color(); + switch (comboBoxOrderColor.SelectedIndex) { - addToLog("MtExecutionException: " + ex.Message); - } - catch (MtExecutionException ex) - { - addToLog("MtExecutionException: " + ex.Message + "; ErrorCode = " + ex.ErrorCode); + case 0: + arrowColor = Color.Green; + break; + case 1: + arrowColor = Color.Blue; + break; + case 2: + arrowColor = Color.Red; + break; } - return result; + var ticket = Execute(() => _apiClient.OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrowColor)); + + AddToLog(string.Format("Sended order result: ticket = {0}", ticket)); } //GetOrder - private void button16_Click(object sender, EventArgs e) + private async void button16_Click(object sender, EventArgs e) { var ticket = int.Parse(textBoxIndexTicket.Text); var selectMode = (OrderSelectMode) comboBox1.SelectedIndex; var selectSource = (OrderSelectSource) comboBox2.SelectedIndex; - var order = Execute(() => _apiClient.GetOrder(ticket, selectMode, selectSource)); + var order = await Execute(() => _apiClient.GetOrder(ticket, selectMode, selectSource)); if (order != null) { @@ -909,17 +877,17 @@ namespace TestApiClientUI string.Format( "Order: Ticket = {0}, Symbol = {1}, Operation = {2}, OpenPrice = {3}, ClosePrice = {4}, Lots = {5}, Profit = {6}, Comment = {7}, Commission = {8}, MagicNumber = {9}, OpenTime = {10}, CloseTime = {11}", order.Ticket, order.Symbol, order.Operation, order.OpenPrice, order.ClosePrice, order.Lots, order.Profit, order.Comment, order.Commission, order.MagicNumber, order.OpenTime, order.CloseTime); - addToLog(result); + AddToLog(result); } } //GetOrders - private void button17_Click(object sender, EventArgs e) + private async void button17_Click(object sender, EventArgs e) { var selectSource = (OrderSelectSource)comboBox2.SelectedIndex; - var orders = Execute(() => _apiClient.GetOrders(selectSource)); ; + var orders = await Execute(() => _apiClient.GetOrders(selectSource)); ; if (orders != null) { @@ -929,13 +897,13 @@ namespace TestApiClientUI string.Format( "Order: Ticket = {0}, Symbol = {1}, Operation = {2}, OpenPrice = {3}, ClosePrice = {4}, Lots = {5}, Profit = {6}, Comment = {7}, Commission = {8}, MagicNumber = {9}, OpenTime = {10}, CloseTime = {11}", order.Ticket, order.Symbol, order.Operation, order.OpenPrice, order.ClosePrice, order.Lots, order.Profit, order.Comment, order.Commission, order.MagicNumber, order.OpenTime, order.CloseTime); - addToLog(result); + AddToLog(result); } } } //OrderSendBuy - private void button18_Click(object sender, EventArgs e) + private async void button18_Click(object sender, EventArgs e) { var symbol = textBoxOrderSymbol.Text; @@ -944,14 +912,14 @@ namespace TestApiClientUI var slippage = (int)numericOrderSlippage.Value; - var ticket = Execute(() => _apiClient.OrderSendBuy(symbol, volume, slippage)); + var ticket = await Execute(() => _apiClient.OrderSendBuy(symbol, volume, slippage)); - addToLog(string.Format("Sended order result: ticketId = {0}, symbol = {1}, volume = {2}, slippage = {3}", + AddToLog(string.Format("Sended order result: ticketId = {0}, symbol = {1}, volume = {2}, slippage = {3}", ticket, symbol, volume, slippage)); } //OrderSendSell - private void button19_Click(object sender, EventArgs e) + private async void button19_Click(object sender, EventArgs e) { var symbol = textBoxOrderSymbol.Text; @@ -960,14 +928,14 @@ namespace TestApiClientUI var slippage = (int)numericOrderSlippage.Value; - var ticket = Execute(() => _apiClient.OrderSendSell(symbol, volume, slippage)); + var ticket = await Execute(() => _apiClient.OrderSendSell(symbol, volume, slippage)); - addToLog(string.Format("Sended order result: ticketId = {0}, symbol = {1}, volume = {2}, slippage = {3}", + AddToLog(string.Format("Sended order result: ticketId = {0}, symbol = {1}, volume = {2}, slippage = {3}", ticket, symbol, volume, slippage)); } //OrderClose - private void button20_Click(object sender, EventArgs e) + private async void button20_Click(object sender, EventArgs e) { var ticket = int.Parse(textBoxIndexTicket.Text); var slippage = (int)numericOrderSlippage.Value; @@ -976,7 +944,7 @@ namespace TestApiClientUI if (checkBox1.Checked) { - closed = Execute(() => _apiClient.OrderClose(ticket, slippage)); + closed = await Execute(() => _apiClient.OrderClose(ticket, slippage)); } else { @@ -985,10 +953,21 @@ namespace TestApiClientUI double price; double.TryParse(textBoxOrderPrice.Text, out price); - closed = Execute(() => _apiClient.OrderClose(ticket, volume, price, slippage)); + closed = await Execute(() => _apiClient.OrderClose(ticket, volume, price, slippage)); } - addToLog(string.Format("Close order result: {0}, ticket = {1}", closed, ticket)); + AddToLog(string.Format("Close order result: {0}, ticket = {1}", closed, ticket)); + } + + //OrderCloseBy + private async void button15_Click(object sender, EventArgs e) + { + var ticket = int.Parse(textBoxIndexTicket.Text); + var opposite = int.Parse(textBoxOppositeTicket.Text); + + var closed = await Execute(() => _apiClient.OrderCloseBy(ticket, opposite)); ; + + AddToLog(string.Format("Close order result: {0}, ticket = {1}", closed, ticket)); } } } diff --git a/mq4/MtApi.ex4 b/mq4/MtApi.ex4 index 98387f51..cd0b6fc8 100755 Binary files a/mq4/MtApi.ex4 and b/mq4/MtApi.ex4 differ diff --git a/mq4/MtApi.mq4 b/mq4/MtApi.mq4 index 5820cae3..5e765c97 100755 --- a/mq4/MtApi.mq4 +++ b/mq4/MtApi.mq4 @@ -3419,6 +3419,9 @@ string OnRequest(string json) case 4: //OrderClose response = ExecuteRequestOrderClose(jo); break; + case 5: //OrderCloseBy + response = ExecuteRequestOrderCloseBy(jo); + break; default: Print("OnRequest [WARNING]: Unknown request type ", requestType); response = CreateErrorResponse(-1, "Unknown request type"); @@ -3624,4 +3627,22 @@ string ExecuteRequestOrderClose(JSONObject *jo) if (!OrderClose(ticket, lots, price, slippage, arrowcolor)) return CreateErrorResponse(GetLastError(), "OrderClose failed"); return CreateSuccessResponse("", NULL); +} + +string ExecuteRequestOrderCloseBy(JSONObject *jo) +{ + if (jo.getValue("Ticket") == NULL) + return CreateErrorResponse(-1, "Undefinded mandatory parameter Ticket"); + if (jo.getValue("Opposite") == NULL) + return CreateErrorResponse(-1, "Undefinded mandatory parameter Opposite"); + + int ticket = jo.getInt("Ticket"); + int opposite = jo.getInt("Opposite"); + + JSONValue *jvArrowColor = jo.getValue("ArrowColor"); + int arrowcolor = (jvArrowColor != NULL) ? jvArrowColor.getInt() : CLR_NONE; + + if (!OrderCloseBy(ticket, opposite, arrowcolor)) + return CreateErrorResponse(GetLastError(), "OrderCloseBy failed"); + return CreateSuccessResponse("", NULL); } \ No newline at end of file