From 1f72b2b790e52d857c659264aeb572e241de4c29 Mon Sep 17 00:00:00 2001 From: DW Date: Thu, 7 Sep 2017 17:46:25 +0300 Subject: [PATCH] Refactored MTApiService and connectors projects --- MT5Connector/AssemblyInfo.cpp | 4 +- MT5Connector/MT5Connector.cpp | 434 ++++++---------------- MT5Connector/MT5Connector.def | 27 -- MT5Connector/MT5Connector.vcxproj | 5 - MT5Connector/MT5Connector.vcxproj.filters | 3 - MTApiService/IMetaTraderHandler.cs | 7 +- MTApiService/MtAdapter.cs | 60 ++- MTApiService/MtCommandTask.cs | 2 +- MTApiService/MtExpert.cs | 36 +- MTApiService/MtServer.cs | 5 - MTApiService/Properties/AssemblyInfo.cs | 4 +- MTConnector/MTConnector.cpp | 7 +- 12 files changed, 181 insertions(+), 413 deletions(-) delete mode 100755 MT5Connector/MT5Connector.def diff --git a/MT5Connector/AssemblyInfo.cpp b/MT5Connector/AssemblyInfo.cpp index f309014b..97ac31b8 100755 --- a/MT5Connector/AssemblyInfo.cpp +++ b/MT5Connector/AssemblyInfo.cpp @@ -35,6 +35,4 @@ using namespace System::Security::Permissions; [assembly:ComVisible(false)]; -[assembly:CLSCompliantAttribute(true)]; - -[assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)]; +[assembly:CLSCompliantAttribute(true)]; \ No newline at end of file diff --git a/MT5Connector/MT5Connector.cpp b/MT5Connector/MT5Connector.cpp index 566b60d2..9895f87d 100755 --- a/MT5Connector/MT5Connector.cpp +++ b/MT5Connector/MT5Connector.cpp @@ -6,14 +6,15 @@ #include "MT5Handler.h" #include "Windows.h" -#include < vcclr.h > +#include +#include using namespace System; using namespace MTApiService; using namespace System::Runtime::InteropServices; using namespace System::Reflection; using namespace System::Text; -using namespace System::Collections::Generic; +using namespace System::Collections::Generic; using namespace System::Diagnostics; using namespace System::Security::Cryptography; using namespace System::Security; @@ -55,272 +56,142 @@ void convertSystemString(wchar_t* dest, String^ src) dest[wcslen(wch)] = '\0'; } -bool VerifySignature(System::String^ inputData, System::String^ signature, System::String^ publicKey) -{ - bool verifyResult = false; +#define _DLLAPI extern "C" __declspec(dllexport) +template T Execute(std::function func, wchar_t* err, T default_value) +{ + T result = default_value; try { - DSACryptoServiceProvider^ dsa = gcnew DSACryptoServiceProvider(); - dsa->FromXmlString(publicKey); - array^ data = UTF8Encoding::ASCII->GetBytes(inputData); - array^ signatureData = Convert::FromBase64String(signature); - verifyResult = dsa->VerifyData(data, signatureData); - } - catch(Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:VerifySignature(): failed. " + e->Message); - verifyResult = false; - } - - return verifyResult; -} - -bool g_IsVerified = true; - -void _stdcall verify(int isDemo, wchar_t* accountName, long accountNumber) -{ - if (isDemo != 0) - { - g_IsVerified = true; - return; - } - - System::String^ signature = MtRegistryManager::ReadSignatureKey(gcnew String(accountName), accountNumber.ToString()); - Resources::ResourceManager^ rm = gcnew Resources::ResourceManager(L"MT5Connector.cl", Assembly::GetExecutingAssembly()); - System::String^ inputData = gcnew System::String(accountName); - inputData += accountNumber.ToString(); - System::String^ publicKey = rm->GetString(L"cl"); - g_IsVerified = VerifySignature(inputData, gcnew System::String(signature), publicKey); -} - -int _stdcall initExpert(int expertHandle, int port, wchar_t* symbol, double bid, double ask, wchar_t* err) -{ - if (g_IsVerified == false) - { - System::String^ errorVerified = "Verification is failed!\nPlease contact with support."; - convertSystemString(err, errorVerified); - Debug::WriteLine("[ERROR] MT5Connector:initExpert(): not verified"); - return 0; - } - - try - { - MT5Handler^ mtHander = gcnew MT5Handler(); - MtAdapter::GetInstance()->InitExpert(expertHandle, port, gcnew String(symbol), bid, ask, mtHander); + result = func(); } catch (Exception^ e) { convertSystemString(err, e->Message); - Debug::WriteLine("[ERROR] MT5Connector:initExpert(): " + e->Message); - - return 0; } - return 1; + return result; } -int _stdcall deinitExpert(int expertHandle, wchar_t* err) +_DLLAPI int _stdcall initExpert(int expertHandle, int port, wchar_t* symbol, double bid, double ask, wchar_t* err) { - try - { - MtAdapter::GetInstance()->DeinitExpert(expertHandle); - } - catch (Exception^ e) - { - convertSystemString(err, e->Message); - Debug::WriteLine("[ERROR] MT5Connector:deinitExpert(): " + e->Message); - - return 0; - } - return 1; + return Execute([&expertHandle, &port, symbol, &bid, &ask]() { + auto expert = gcnew MtExpert(expertHandle, gcnew String(symbol), bid, ask, gcnew MT5Handler()); + MtAdapter::GetInstance()->AddExpert(port, expert); + return 1; + }, err, 0); } -int _stdcall updateQuote(int expertHandle, wchar_t* symbol, double bid, double ask, wchar_t* err) +_DLLAPI int _stdcall deinitExpert(int expertHandle, wchar_t* err) { - try - { + return Execute([&expertHandle]() { + MtAdapter::GetInstance()->RemoveExpert(expertHandle); + return 1; + }, err, 0); +} + +_DLLAPI int _stdcall updateQuote(int expertHandle, wchar_t* symbol, double bid, double ask, wchar_t* err) +{ + return Execute([&expertHandle, symbol, &bid, &ask]() { MtAdapter::GetInstance()->SendQuote(expertHandle, gcnew String(symbol), bid, ask); - } - catch (Exception^ e) - { - convertSystemString(err, e->Message); - Debug::WriteLine("[ERROR] MT5Connector:updateQuote(): " + e->Message); - - return 0; - } - return 1; + return 1; + }, err, 0); } -int _stdcall sendIntResponse(int expertHandle, int response) +_DLLAPI int _stdcall sendIntResponse(int expertHandle, int response, wchar_t* err) { - try - { + return Execute([&expertHandle, &response]() { MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseInt(response)); - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:sendIntResponse(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } -int _stdcall sendLongResponse(int expertHandle, __int64 response) +_DLLAPI int _stdcall sendLongResponse(int expertHandle, __int64 response, wchar_t* err) { - try - { + return Execute([&expertHandle, &response]() { MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseLong(response)); - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:sendLongResponse(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } -int _stdcall sendULongResponse(int expertHandle, unsigned __int64 response) +_DLLAPI int _stdcall sendULongResponse(int expertHandle, unsigned __int64 response, wchar_t* err) { - try - { + return Execute([&expertHandle, &response]() { MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseULong(response)); - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:sendLongResponse(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } -int _stdcall sendBooleanResponse(int expertHandle, int response) +_DLLAPI int _stdcall sendBooleanResponse(int expertHandle, int response, wchar_t* err) { - try - { + return Execute([&expertHandle, &response]() { bool value = (response != 0) ? true : false; - MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseBool(value)); - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:sendBooleanResponse(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } -int _stdcall sendDoubleResponse(int expertHandle, double response) +_DLLAPI int _stdcall sendDoubleResponse(int expertHandle, double response, wchar_t* err) { - try - { + return Execute([&expertHandle, &response]() { MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseDouble(response)); - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:sendDoubleResponse(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } -int _stdcall sendStringResponse(int expertHandle, wchar_t* response) +_DLLAPI int _stdcall sendStringResponse(int expertHandle, wchar_t* response, wchar_t* err) { - try - { + return Execute([&expertHandle, response]() { MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseString(gcnew String(response))); - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:sendStringResponse(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } -int _stdcall sendVoidResponse(int expertHandle) +_DLLAPI int _stdcall sendVoidResponse(int expertHandle, wchar_t* err) { - try - { + return Execute([&expertHandle]() { MtAdapter::GetInstance()->SendResponse(expertHandle, nullptr); - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:sendVoidResponse(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } -int _stdcall sendDoubleArrayResponse(int expertHandle, double* values, int size) +_DLLAPI int _stdcall sendDoubleArrayResponse(int expertHandle, double* values, int size, wchar_t* err) { - try - { + return Execute([&expertHandle, values, &size]() { array^ list = gcnew array(size); - - for(int i = 0; i < size; i++) - { + for (int i = 0; i < size; i++) list[i] = values[i]; - } - MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseDoubleArray(list)); - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:sendDoubleArrayResponse(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } -int _stdcall sendIntArrayResponse(int expertHandle, int* values, int size) +_DLLAPI int _stdcall sendIntArrayResponse(int expertHandle, int* values, int size, wchar_t* err) { - try - { + return Execute([&expertHandle, values, &size]() { array^ list = gcnew array(size); - - for(int i = 0; i < size; i++) - { + for (int i = 0; i < size; i++) list[i] = values[i]; - } - MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseIntArray(list)); - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:sendIntArrayResponse(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } -int _stdcall sendLongArrayResponse(int expertHandle, __int64* values, int size) +_DLLAPI int _stdcall sendLongArrayResponse(int expertHandle, __int64* values, int size, wchar_t* err) { - try - { + return Execute([&expertHandle, values, &size]() { array^ list = gcnew array(size); - - for(int i = 0; i < size; i++) - { + for (int i = 0; i < size; i++) list[i] = values[i]; - } - MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseLongArray(list)); - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:sendLongArrayResponse(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } -int _stdcall sendMqlRatesArrayResponse(int expertHandle, CMqlRates values[], int size) +_DLLAPI int _stdcall sendMqlRatesArrayResponse(int expertHandle, CMqlRates values[], int size, wchar_t* err) { - try - { + return Execute([&expertHandle, values, &size]() { array^ list = gcnew array(size); - - for(int i = 0; i < size; i++) + for (int i = 0; i < size; i++) { MtMqlRates^ rates = gcnew MtMqlRates(); rates->time = values[i].time; @@ -331,180 +202,107 @@ int _stdcall sendMqlRatesArrayResponse(int expertHandle, CMqlRates values[], int rates->tick_volume = values[i].tick_volume; rates->spread = values[i].spread; rates->real_volume = values[i].real_volume; - list[i] = rates; } - MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlRatesArray(list)); - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:sendMqlRatesArrayResponse(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } -int _stdcall sendMqlTickResponse(int expertHandle, CMqlTick* response, int size) +_DLLAPI int _stdcall sendMqlTickResponse(int expertHandle, CMqlTick* response, wchar_t* err) { - try - { + return Execute([&expertHandle, response]() { MtMqlTick^ mtResponse = gcnew MtMqlTick(); - mtResponse->time = response->time; mtResponse->bid = response->bid; mtResponse->ask = response->ask; mtResponse->last = response->last; mtResponse->volume = response->volume; - MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlTick(mtResponse)); - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:sendMqlTickResponse(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } -int _stdcall sendMqlBookInfoArrayResponse(int expertHandle, CMqlBookInfo values[], int size) +_DLLAPI int _stdcall sendMqlBookInfoArrayResponse(int expertHandle, CMqlBookInfo values[], int size, wchar_t* err) { - try - { + return Execute([&expertHandle, values, &size]() { array^ list = gcnew array(size); - - for(int i = 0; i < size; i++) + for (int i = 0; i < size; i++) { MtMqlBookInfo^ info = gcnew MtMqlBookInfo(); - info->type = values[i].type; info->price = values[i].price; info->volume = values[i].volume; - list[i] = info; } - MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlBookInfoArray(list)); - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:sendMqlRatesArrayResponse(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } //----------- get values ------------------------------- -int _stdcall getCommandType(int expertHandle, int* res) +_DLLAPI int _stdcall getCommandType(int expertHandle, int* res, wchar_t* err) { - try - { + return Execute([&expertHandle, res]() { *res = MtAdapter::GetInstance()->GetCommandType(expertHandle); - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:getCommandType(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } -int _stdcall getIntValue(int expertHandle, int paramIndex, int* res) +_DLLAPI int _stdcall getIntValue(int expertHandle, int paramIndex, int* res, wchar_t* err) { - try - { + return Execute([&expertHandle, ¶mIndex, res]() { *res = (int)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex); - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:getIntValue(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } -int _stdcall getDoubleValue(int expertHandle, int paramIndex, double* res) +_DLLAPI int _stdcall getDoubleValue(int expertHandle, int paramIndex, double* res, wchar_t* err) { - try - { + return Execute([&expertHandle, ¶mIndex, res]() { *res = (double)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex); - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:getDoubleValue(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } -int _stdcall getStringValue(int expertHandle, int paramIndex, wchar_t* res) +_DLLAPI int _stdcall getStringValue(int expertHandle, int paramIndex, wchar_t* res, wchar_t* err) { - try - { + return Execute([&expertHandle, ¶mIndex, res]() { convertSystemString(res, (String^)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex)); - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:getStringValue(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } -int _stdcall getULongValue(int expertHandle, int paramIndex, unsigned __int64* res) +_DLLAPI int _stdcall getULongValue(int expertHandle, int paramIndex, unsigned __int64* res, wchar_t* err) { - try - { + return Execute([&expertHandle, ¶mIndex, res]() { *res = (unsigned long)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex); - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:getULongValue(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } -int _stdcall getLongValue(int expertHandle, int paramIndex, __int64* res) +_DLLAPI int _stdcall getLongValue(int expertHandle, int paramIndex, __int64* res, wchar_t* err) { - try - { + return Execute([&expertHandle, ¶mIndex, res]() { *res = (long)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex); - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:getLongValue(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } -int _stdcall getBooleanValue(int expertHandle, int paramIndex, int* res) +_DLLAPI int _stdcall getBooleanValue(int expertHandle, int paramIndex, int* res, wchar_t* err) { - try - { + return Execute([&expertHandle, ¶mIndex, res]() { bool val = (bool)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex); *res = val == true ? 1 : 0; - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:getBooleanValue(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } -int _stdcall getUIntValue(int expertHandle, int paramIndex, unsigned int* res) +_DLLAPI int _stdcall getUIntValue(int expertHandle, int paramIndex, unsigned int* res, wchar_t* err) { - try - { + return Execute([&expertHandle, ¶mIndex, res]() { *res = (unsigned int)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex); - } - catch (Exception^ e) - { - Debug::WriteLine("[ERROR] MT5Connector:getUIntValue(): " + e->Message); - return 0; - } - return 1; + return 1; + }, err, 0); } \ No newline at end of file diff --git a/MT5Connector/MT5Connector.def b/MT5Connector/MT5Connector.def deleted file mode 100755 index f1ff1116..00000000 --- a/MT5Connector/MT5Connector.def +++ /dev/null @@ -1,27 +0,0 @@ -LIBRARY MT5Connector - -EXPORTS initExpert - deinitExpert - updateQuote - sendIntResponse - sendBooleanResponse - sendDoubleResponse - sendStringResponse - sendVoidResponse - sendDoubleArrayResponse - sendIntArrayResponse - sendLongArrayResponse - sendMqlRatesArrayResponse - sendLongResponse - sendULongResponse - sendMqlTickResponse - sendMqlBookInfoArrayResponse - getCommandType - getIntValue - getUIntValue - getDoubleValue - getStringValue - getLongValue - getULongValue - getBooleanValue - verify \ No newline at end of file diff --git a/MT5Connector/MT5Connector.vcxproj b/MT5Connector/MT5Connector.vcxproj index 8dd0d20a..2ce81a19 100755 --- a/MT5Connector/MT5Connector.vcxproj +++ b/MT5Connector/MT5Connector.vcxproj @@ -95,7 +95,6 @@ true user32.lib - .\MT5Connector.def @@ -108,7 +107,6 @@ true user32.lib;%(AdditionalDependencies) - .\MT5Connector.def @@ -120,7 +118,6 @@ true user32.lib;%(AdditionalDependencies) - .\MT5Connector.def @@ -132,7 +129,6 @@ true user32.lib;%(AdditionalDependencies) - .\MT5Connector.def @@ -157,7 +153,6 @@ - diff --git a/MT5Connector/MT5Connector.vcxproj.filters b/MT5Connector/MT5Connector.vcxproj.filters index 767e86f7..6b8a48e7 100755 --- a/MT5Connector/MT5Connector.vcxproj.filters +++ b/MT5Connector/MT5Connector.vcxproj.filters @@ -44,9 +44,6 @@ Resource Files - - Source Files - diff --git a/MTApiService/IMetaTraderHandler.cs b/MTApiService/IMetaTraderHandler.cs index 36a80e76..87797914 100755 --- a/MTApiService/IMetaTraderHandler.cs +++ b/MTApiService/IMetaTraderHandler.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace MTApiService +namespace MTApiService { public interface IMetaTraderHandler { diff --git a/MTApiService/MtAdapter.cs b/MTApiService/MtAdapter.cs index ac203b54..8cb57f4c 100644 --- a/MTApiService/MtAdapter.cs +++ b/MTApiService/MtAdapter.cs @@ -36,12 +36,48 @@ namespace MTApiService #region Public Methods - public void InitExpert(int expertHandle, int port, string symbol, double bid, double ask, IMetaTraderHandler mtHandler) - { - if (mtHandler == null) - throw new ArgumentNullException(nameof(mtHandler)); + //public void InitExpert(int expertHandle, int port, string symbol, double bid, double ask, IMetaTraderHandler mtHandler) + //{ + // if (mtHandler == null) + // throw new ArgumentNullException(nameof(mtHandler)); - Log.InfoFormat("InitExpert: begin. symbol = {0}, expertHandle = {1}, port = {2}", symbol, expertHandle, port); + // Log.InfoFormat("InitExpert: begin. symbol = {0}, expertHandle = {1}, port = {2}", symbol, expertHandle, port); + + // MtServer server; + // lock (_servers) + // { + // if (_servers.ContainsKey(port)) + // { + // server = _servers[port]; + // } + // else + // { + // server = new MtServer(port); + // server.Stopped += server_Stopped; + // _servers[port] = server; + + // server.Start(); + // } + // } + + // var expert = new MtExpert(expertHandle, new MtQuote { Instrument = symbol, Bid = bid, Ask = ask, ExpertHandle = expertHandle }, mtHandler); + + // lock (_experts) + // { + // _experts[expert.Handle] = expert; + // } + + // server.AddExpert(expert); + + // Log.Info("InitExpert: end"); + //} + + public void AddExpert(int port, MtExpert expert) + { + if (expert == null) + throw new ArgumentNullException(nameof(expert)); + + Log.InfoFormat("AddExpert: begin. expert = {0}", expert); MtServer server; lock (_servers) @@ -60,8 +96,6 @@ namespace MTApiService } } - var expert = new MtExpert(expertHandle, new MtQuote { Instrument = symbol, Bid = bid, Ask = ask, ExpertHandle = expertHandle }, mtHandler); - lock (_experts) { _experts[expert.Handle] = expert; @@ -69,12 +103,12 @@ namespace MTApiService server.AddExpert(expert); - Log.Info("InitExpert: end"); + Log.Info("AddExpert: end"); } - public void DeinitExpert(int expertHandle) + public void RemoveExpert(int expertHandle) { - Log.InfoFormat("DeinitExpert: begin. expertHandle = {0}", expertHandle); + Log.InfoFormat("RemoveExpert: begin. expertHandle = {0}", expertHandle); MtExpert expert = null; @@ -93,10 +127,10 @@ namespace MTApiService } else { - Log.WarnFormat("DeinitExpert: expert with id {0} has not been found.", expertHandle); + Log.WarnFormat("RemoveExpert: expert with id {0} has not been found.", expertHandle); } - Log.Info("DeinitExpert: end"); + Log.Info("RemoveExpert: end"); } public void SendQuote(int expertHandle, string symbol, double bid, double ask) @@ -111,7 +145,7 @@ namespace MTApiService if (expert != null) { - expert.Quote = new MtQuote { Instrument = symbol, Bid = bid, Ask = ask, ExpertHandle = expertHandle }; + expert.SendQuote(new MtQuote { Instrument = symbol, Bid = bid, Ask = ask, ExpertHandle = expertHandle }); } else { diff --git a/MTApiService/MtCommandTask.cs b/MTApiService/MtCommandTask.cs index df1968c9..fe80b053 100755 --- a/MTApiService/MtCommandTask.cs +++ b/MTApiService/MtCommandTask.cs @@ -17,7 +17,7 @@ namespace MTApiService Command = command; } - public MtCommand Command { get; private set; } + public MtCommand Command { get; } public MtResponse WaitResult(int time) { diff --git a/MTApiService/MtExpert.cs b/MTApiService/MtExpert.cs index 4f05f569..ea07452b 100755 --- a/MTApiService/MtExpert.cs +++ b/MTApiService/MtExpert.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; namespace MTApiService { - internal class MtExpert: ITaskExecutor + public class MtExpert: ITaskExecutor { public delegate void MtQuoteHandler(MtExpert expert, MtQuote quote); public delegate void MtEventHandler(MtExpert expert, MtEvent e); @@ -19,12 +19,12 @@ namespace MTApiService #endregion #region Public Methods - public MtExpert(int handle, MtQuote quote, IMetaTraderHandler mtHandler) + public MtExpert(int handle, string symbol, double bid, double ask, IMetaTraderHandler mtHandler) { if (mtHandler == null) throw new ArgumentNullException(nameof(mtHandler)); - Quote = quote; + _quote = new MtQuote { ExpertHandle = handle, Instrument = symbol, Bid = bid, Ask = ask}; Handle = handle; _mtHadler = mtHandler; } @@ -33,7 +33,6 @@ namespace MTApiService { Log.Debug("Deinit: begin."); - IsEnable = false; FireOnDeinited(); Log.Debug("Deinit: end."); @@ -120,9 +119,14 @@ namespace MTApiService Log.Debug("SendEvent: end."); } + public virtual void SendQuote(MtQuote quote) + { + Quote = quote; + } + public override string ToString() { - return $"ExpertHandle = {Handle}"; + return $"ExpertHandle = {Handle}, Quote = {Quote}"; } #endregion @@ -153,7 +157,7 @@ namespace MTApiService return _quote; } } - set + private set { lock (_locker) { @@ -165,26 +169,6 @@ namespace MTApiService } public int Handle { get; } - - private bool _isEnable = true; - public bool IsEnable - { - get - { - lock (_locker) - { - return _isEnable; - } - } - private set - { - lock (_locker) - { - _isEnable = value; - } - } - } - #endregion #region Private Methods diff --git a/MTApiService/MtServer.cs b/MTApiService/MtServer.cs index 08a07eb0..0888544b 100755 --- a/MTApiService/MtServer.cs +++ b/MTApiService/MtServer.cs @@ -80,11 +80,6 @@ namespace MTApiService //init network hosts var dnsHostName = Dns.GetHostName(); var ips = Dns.GetHostEntry(dnsHostName); - if (ips == null) - { - Log.WarnFormat("InitHosts: end. Dns.GetHostEntry has returned null for DNS Host Name {0}", dnsHostName); - return false; - } foreach (var ipAddress in ips.AddressList) { diff --git a/MTApiService/Properties/AssemblyInfo.cs b/MTApiService/Properties/AssemblyInfo.cs index bbe6bdb8..c85694b7 100644 --- a/MTApiService/Properties/AssemblyInfo.cs +++ b/MTApiService/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.27.0")] -[assembly: AssemblyFileVersion("1.0.27.0")] \ No newline at end of file +[assembly: AssemblyVersion("1.0.28.0")] +[assembly: AssemblyFileVersion("1.0.28.0")] \ No newline at end of file diff --git a/MTConnector/MTConnector.cpp b/MTConnector/MTConnector.cpp index 1d3046d6..ed41a7b6 100755 --- a/MTConnector/MTConnector.cpp +++ b/MTConnector/MTConnector.cpp @@ -44,17 +44,16 @@ template T Execute(std::function func, wchar_t* err, T default _DLLAPI bool _stdcall initExpert(int expertHandle, int port, wchar_t* symbol, double bid, double ask, wchar_t* err) { return Execute([&expertHandle, &port, symbol, &bid, &ask]() { - MT4Handler^ mtHandler = gcnew MT4Handler(); - MtAdapter::GetInstance()->InitExpert(expertHandle, port, gcnew String(symbol), bid, ask, mtHandler); + auto expert = gcnew MtExpert(expertHandle, gcnew String(symbol), bid, ask, gcnew MT4Handler()); + MtAdapter::GetInstance()->AddExpert(port, expert); return true; }, err, false); - } _DLLAPI bool _stdcall deinitExpert(int expertHandle, wchar_t* err) { return Execute([&expertHandle]() { - MtAdapter::GetInstance()->DeinitExpert(expertHandle); + MtAdapter::GetInstance()->RemoveExpert(expertHandle); return true; }, err, false); }