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