diff --git a/MtApi5/MqlBookInfo.cs b/MtApi5/MqlBookInfo.cs index c8acf5a9..5a3c1d87 100755 --- a/MtApi5/MqlBookInfo.cs +++ b/MtApi5/MqlBookInfo.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - +// ReSharper disable InconsistentNaming namespace MtApi5 { public class MqlBookInfo @@ -14,8 +10,13 @@ namespace MtApi5 this.volume = volume; } - public ENUM_BOOK_TYPE type { get; private set; } // Order type from ENUM_BOOK_TYPE enumeration - public double price { get; private set; } // Price - public long volume { get; private set; } // Volume + public ENUM_BOOK_TYPE type { get; } // Order type from ENUM_BOOK_TYPE enumeration + public double price { get; } // Price + public long volume { get; } // Volume + + public override string ToString() + { + return $"{type}|{price}|{volume}"; + } } } diff --git a/MtApi5/Mt5CommandType.cs b/MtApi5/Mt5CommandType.cs index eabaa3dd..3adc3e9c 100755 --- a/MtApi5/Mt5CommandType.cs +++ b/MtApi5/Mt5CommandType.cs @@ -95,7 +95,7 @@ namespace MtApi5 SymbolInfoSessionTrade = 59, MarketBookAdd = 60, MarketBookRelease = 61, - MarketBookGet = 62, + //MarketBookGet = 62, OrderCloseAll = 63, //CTrade diff --git a/MtApi5/MtApi5.csproj b/MtApi5/MtApi5.csproj index b643a58e..d012aecc 100755 --- a/MtApi5/MtApi5.csproj +++ b/MtApi5/MtApi5.csproj @@ -68,6 +68,7 @@ + diff --git a/MtApi5/MtApi5Client.cs b/MtApi5/MtApi5Client.cs index ca805000..4c55b6e5 100755 --- a/MtApi5/MtApi5Client.cs +++ b/MtApi5/MtApi5Client.cs @@ -1434,22 +1434,13 @@ namespace MtApi5 ///Reference to an array of Depth of Market records. public bool MarketBookGet(string symbol, out MqlBookInfo[] book) { - var commandParameters = new ArrayList { symbol }; - - var retVal = SendCommand(Mt5CommandType.MarketBookGet, commandParameters); - - book = null; - if (retVal != null) + var response = SendRequest>(new MarketBookGetRequest { - book = new MqlBookInfo[retVal.Length]; + Symbol = symbol + }); - foreach (var t in retVal) - { - book[0] = new MqlBookInfo((ENUM_BOOK_TYPE)t.type, t.price, t.volume); - } - } - - return book != null; + book = response?.ToArray(); + return response != null; } #endregion diff --git a/MtApi5/Requests/MarketBookGetRequest.cs b/MtApi5/Requests/MarketBookGetRequest.cs new file mode 100644 index 00000000..e5fe7114 --- /dev/null +++ b/MtApi5/Requests/MarketBookGetRequest.cs @@ -0,0 +1,9 @@ +namespace MtApi5.Requests +{ + internal class MarketBookGetRequest: RequestBase + { + public override RequestType RequestType => RequestType.MarketBookGet; + + public string Symbol { get; set; } + } +} \ No newline at end of file diff --git a/MtApi5/Requests/RequestType.cs b/MtApi5/Requests/RequestType.cs index 0bec2a6e..52bdd181 100755 --- a/MtApi5/Requests/RequestType.cs +++ b/MtApi5/Requests/RequestType.cs @@ -9,6 +9,7 @@ namespace MtApi5.Requests iCustom = 2, OrderSend = 3, PositionOpen = 4, - OrderCheck = 5 + OrderCheck = 5, + MarketBookGet = 6 } } \ No newline at end of file diff --git a/TestClients/MtApi5TestClient/ViewModel.cs b/TestClients/MtApi5TestClient/ViewModel.cs index 18fd5329..8659fa7b 100755 --- a/TestClients/MtApi5TestClient/ViewModel.cs +++ b/TestClients/MtApi5TestClient/ViewModel.cs @@ -807,14 +807,14 @@ namespace MtApi5TestClient private async void ExecuteMarketBookAdd(object o) { - var retVal = await Execute(() => _mtApiClient.MarketBookAdd("CHFJPY")); - AddLog($"MarketBookAdd(CHFJPY): result = {retVal}"); + var retVal = await Execute(() => _mtApiClient.MarketBookAdd("EURUSD")); + AddLog($"MarketBookAdd(EURUSD): result = {retVal}"); } private async void ExecuteMarketBookRelease(object o) { - var retVal = await Execute(() => _mtApiClient.MarketBookRelease("CHFJPY")); - AddLog($"MarketBookRelease(CHFJPY): result = {retVal}"); + var retVal = await Execute(() => _mtApiClient.MarketBookRelease("EURUSD")); + AddLog($"MarketBookRelease(EURUSD): result = {retVal}"); } private async void ExecuteMarketBookGet(object o) @@ -832,13 +832,11 @@ namespace MtApi5TestClient return; } - AddLog("MarketBookGet(EURUSD): success"); + AddLog($"MarketBookGet(EURUSD): success. Count = {result.Length}"); for (var i = 0; i < result.Length; i++) { - AddLog($"MarketBookGet: book[{i}].price = {result[i].price}"); - AddLog($"MarketBookGet: book[{i}].price = {result[i].volume}"); - AddLog($"MarketBookGet: book[{i}].price = {result[i].type}"); + AddLog($"MarketBookGet: [{i}] - {result[i].price} | {result[i].volume} | {result[i].type}"); } } @@ -1039,6 +1037,10 @@ namespace MtApi5TestClient { result = func(); } + catch (ExecutionException ex) + { + AddLog($"Exception: {ex.ErrorCode} - {ex.Message}"); + } catch (Exception ex) { AddLog($"Exception: {ex.Message}"); diff --git a/mq5/MtApi5.ex5 b/mq5/MtApi5.ex5 index 55d90be5..2df1a6e1 100755 Binary files a/mq5/MtApi5.ex5 and b/mq5/MtApi5.ex5 differ diff --git a/mq5/MtApi5.mq5 b/mq5/MtApi5.mq5 index 9e00e50f..576a8196 100755 --- a/mq5/MtApi5.mq5 +++ b/mq5/MtApi5.mq5 @@ -45,7 +45,6 @@ input int Port = 8228; int ExpertHandle; -//string message; string _error; string _response_error; bool isCrashed = false; @@ -482,9 +481,8 @@ int executeCommand() case 61: //MarketBookRelease Execute_MarketBookRelease(); break; - case 62: //MarketBookGet - Execute_MarketBookGet(); - break; +// case 62: //MarketBookGet +// break; case 65: //PositionOpen Execute_PositionOpen(false); break; @@ -3036,38 +3034,6 @@ void Execute_MarketBookRelease() } } -void Execute_MarketBookGet() -{ - string symbol; - StringInit(symbol, 100, 0); - - if (!getStringValue(ExpertHandle, 0, symbol, _error)) - { - PrintParamError("MarketBookGet", "symbol", _error); - sendErrorResponse(ExpertHandle, -1, _error, _response_error); - return; - } - - MqlBookInfo book[]; - bool retVal = MarketBookGet(symbol, book); - - if(retVal) - { - int size = ArraySize(book); - if (!sendMqlBookInfoArrayResponse(ExpertHandle, book, size, _response_error)) - { - PrintResponseError("MarketBookGet", _response_error); - } - } - else - { - if (!sendVoidResponse(ExpertHandle, _response_error)) - { - PrintResponseError("MarketBookGet", _response_error); - } - } -} - void Execute_PositionOpen(bool isTradeResultRequired) { string symbol; @@ -5634,6 +5600,9 @@ string OnRequest(string json) case 5: //OrderCheck response = ExecuteRequest_OrderCheck(jo); break; + case 6: //MarketBookGet + response = ExecuteRequest_MarketBookGet(jo); + break; default: PrintFormat("%s [WARNING]: Unknown request type %d", __FUNCTION__, requestType); response = CreateErrorResponse(-1, "Unknown request type"); @@ -5719,7 +5688,7 @@ string ExecuteRequest_CopyTicks(JSONObject *jo) jaTicks.put(i, Serialize(ticks[i])); } - return CreateSuccessResponse("Value", jaTicks);; + return CreateSuccessResponse("Value", jaTicks); } string ExecuteRequest_iCustom(JSONObject *jo) @@ -6033,4 +6002,42 @@ string ExecuteRequest_OrderCheck(JSONObject *jo) result_value_jo.put("TradeCheckResult", MqlTradeCheckResultToJson(trade_check_result)); return CreateSuccessResponse("Value", result_value_jo); +} + +JSONObject* MqlBookInfoToJson(MqlBookInfo& info) +{ + JSONObject *jo = new JSONObject(); + jo.put("type", new JSONNumber((int)info.type)); + jo.put("price", new JSONNumber(info.price)); + jo.put("volume", new JSONNumber(info.volume)); + return jo; +} + +string ExecuteRequest_MarketBookGet(JSONObject *jo) +{ + CHECK_JSON_VALUE(jo, "Symbol", CreateErrorResponse(-1, "Undefinded mandatory parameter Symbol")); + string symbol = jo.getString("Symbol"); + + MqlBookInfo info_array[]; + bool ok = MarketBookGet(symbol, info_array); + +#ifdef __DEBUG_LOG__ + PrintFormat("%s: return value = %s.", __FUNCTION__, ok ? "true" : "false"); +#endif + + if (!ok) + return CreateErrorResponse(GetLastError(), "MarketBookGet failed"); + + int size = ArraySize(info_array); + JSONArray* book_ja = new JSONArray(); + for(int i = 0; i < size; i++) + { + book_ja.put(i, MqlBookInfoToJson(info_array[i])); + } + +#ifdef __DEBUG_LOG__ + PrintFormat("%s: array size = %d.", __FUNCTION__, size); +#endif + + return CreateSuccessResponse("Value", book_ja); } \ No newline at end of file