From 12141775f36f3a65cf7e6f4c4c20fa6963c60c10 Mon Sep 17 00:00:00 2001 From: Tr4Dr Date: Sun, 17 Sep 2017 22:05:56 +0200 Subject: [PATCH 1/5] Fixed type casting to __int64 [MT5] long long type should be an alternative. --- MT5Connector/MT5Connector.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MT5Connector/MT5Connector.cpp b/MT5Connector/MT5Connector.cpp index 78d279f8..a1f4bdd5 100755 --- a/MT5Connector/MT5Connector.cpp +++ b/MT5Connector/MT5Connector.cpp @@ -278,7 +278,7 @@ _DLLAPI int _stdcall getStringValue(int expertHandle, int paramIndex, wchar_t* r _DLLAPI int _stdcall getULongValue(int expertHandle, int paramIndex, unsigned __int64* res, wchar_t* err) { return Execute([&expertHandle, ¶mIndex, res]() { - *res = (unsigned long)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex); + *res = (unsigned __int64)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex); return 1; }, err, 0); } @@ -286,7 +286,7 @@ _DLLAPI int _stdcall getULongValue(int expertHandle, int paramIndex, unsigned __ _DLLAPI int _stdcall getLongValue(int expertHandle, int paramIndex, __int64* res, wchar_t* err) { return Execute([&expertHandle, ¶mIndex, res]() { - *res = (long)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex); + *res = (__int64)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex); return 1; }, err, 0); } @@ -306,4 +306,4 @@ _DLLAPI int _stdcall getUIntValue(int expertHandle, int paramIndex, unsigned int *res = (unsigned int)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex); return 1; }, err, 0); -} \ No newline at end of file +} From e29a11de68b89b455bba7331372ce4f50c06d2f6 Mon Sep 17 00:00:00 2001 From: Tr4Dr Date: Sun, 17 Sep 2017 22:18:21 +0200 Subject: [PATCH 2/5] Changed type of '\0' literal to wchar_t [MT5] --- MT5Connector/MT5Connector.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MT5Connector/MT5Connector.cpp b/MT5Connector/MT5Connector.cpp index a1f4bdd5..ee7acda3 100755 --- a/MT5Connector/MT5Connector.cpp +++ b/MT5Connector/MT5Connector.cpp @@ -53,7 +53,7 @@ void convertSystemString(wchar_t* dest, String^ src) { pin_ptr wch = PtrToStringChars(src); memcpy(dest, wch, wcslen(wch) * sizeof(wchar_t)); - dest[wcslen(wch)] = '\0'; + dest[wcslen(wch)] = L'\0'; } #define _DLLAPI extern "C" __declspec(dllexport) From f50925c8d375171f938fe06672dabdd1974e375a Mon Sep 17 00:00:00 2001 From: Tr4Dr Date: Sun, 17 Sep 2017 22:35:15 +0200 Subject: [PATCH 3/5] Changed wcslen to wcsnlen [MT5] Maximum character length set to 1000 based on preinit() MQL5 function. This value must be kept synchronized with MQL side. --- MT5Connector/MT5Connector.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MT5Connector/MT5Connector.cpp b/MT5Connector/MT5Connector.cpp index ee7acda3..137fb90f 100755 --- a/MT5Connector/MT5Connector.cpp +++ b/MT5Connector/MT5Connector.cpp @@ -52,8 +52,8 @@ public struct CMqlBookInfo void convertSystemString(wchar_t* dest, String^ src) { pin_ptr wch = PtrToStringChars(src); - memcpy(dest, wch, wcslen(wch) * sizeof(wchar_t)); - dest[wcslen(wch)] = L'\0'; + memcpy(dest, wch, wcsnlen(wch, 1000) * sizeof(wchar_t)); + dest[wcsnlen(wch, 1000)] = L'\0'; } #define _DLLAPI extern "C" __declspec(dllexport) From a7cb14de25afb8219d0f8958f563ac2eb96e9cdb Mon Sep 17 00:00:00 2001 From: Tr4Dr Date: Mon, 18 Sep 2017 02:05:22 +0200 Subject: [PATCH 4/5] Updated MqlTradeRequest [MT5] --- MTApiService/MtMqlTradeRequest.cs | 10 +++++++--- MtApi5/MtConverters.cs | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/MTApiService/MtMqlTradeRequest.cs b/MTApiService/MtMqlTradeRequest.cs index 7e3037d3..873422dd 100755 --- a/MTApiService/MtMqlTradeRequest.cs +++ b/MTApiService/MtMqlTradeRequest.cs @@ -9,9 +9,9 @@ namespace MTApiService [DataMember] public int Action { get; set; } [DataMember] - public uint Magic { get; set; } + public ulong Magic { get; set; } [DataMember] - public uint Order { get; set; } + public ulong Order { get; set; } [DataMember] public string Symbol { get; set; } [DataMember] @@ -25,7 +25,7 @@ namespace MTApiService [DataMember] public double Tp { get; set; } [DataMember] - public uint Deviation { get; set; } + public ulong Deviation { get; set; } [DataMember] public int Type { get; set; } [DataMember] @@ -36,5 +36,9 @@ namespace MTApiService public DateTime Expiration { get; set; } [DataMember] public string Comment { get; set; } + [DataMember] + public ulong Position { get; set; } + [DataMember] + public ulong PositionBy { get; set; } } } diff --git a/MtApi5/MtConverters.cs b/MtApi5/MtConverters.cs index 73d355ee..e1e47336 100755 --- a/MtApi5/MtConverters.cs +++ b/MtApi5/MtConverters.cs @@ -149,7 +149,7 @@ namespace MtApi5 return new ArrayList { (int)request.Action, request.Magic, request.Order, request.Symbol, request.Volume , request.Price, request.Stoplimit, request.Sl, request.Tp, request.Deviation, (int)request.Type - , (int)request.Type_filling, (int)request.Type_time, exp, request.Comment }; + , (int)request.Type_filling, (int)request.Type_time, exp, request.Comment, request.Position, request.PositionBy }; } #endregion From f7b00a8d88694cdf9f36c449c5bd9bcec214e510 Mon Sep 17 00:00:00 2001 From: Tr4Dr Date: Mon, 18 Sep 2017 14:55:03 +0200 Subject: [PATCH 5/5] Added null check to convertSystemString [MT5] Whithout this fix, the OrderSend method crashing if we doesn't set the "request.Comment" property. --- MT5Connector/MT5Connector.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/MT5Connector/MT5Connector.cpp b/MT5Connector/MT5Connector.cpp index 137fb90f..130cbc77 100755 --- a/MT5Connector/MT5Connector.cpp +++ b/MT5Connector/MT5Connector.cpp @@ -51,9 +51,15 @@ public struct CMqlBookInfo void convertSystemString(wchar_t* dest, String^ src) { - pin_ptr wch = PtrToStringChars(src); - memcpy(dest, wch, wcsnlen(wch, 1000) * sizeof(wchar_t)); - dest[wcsnlen(wch, 1000)] = L'\0'; + if (src != nullptr) { + pin_ptr wch = PtrToStringChars(src); + memcpy(dest, wch, wcsnlen(wch, 1000) * sizeof(wchar_t)); + dest[wcsnlen(wch, 1000)] = L'\0'; + } + else + { + dest[0] = L'\0'; + } } #define _DLLAPI extern "C" __declspec(dllexport)