Refactored MTApiService and connectors projects

This commit is contained in:
DW
2017-09-07 17:46:25 +03:00
parent 3a62ff56d7
commit 1f72b2b790
12 changed files with 181 additions and 413 deletions
+1 -3
View File
@@ -35,6 +35,4 @@ using namespace System::Security::Permissions;
[assembly:ComVisible(false)]; [assembly:ComVisible(false)];
[assembly:CLSCompliantAttribute(true)]; [assembly:CLSCompliantAttribute(true)];
[assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)];
+116 -318
View File
@@ -6,14 +6,15 @@
#include "MT5Handler.h" #include "MT5Handler.h"
#include "Windows.h" #include "Windows.h"
#include < vcclr.h > #include <vcclr.h>
#include <functional>
using namespace System; using namespace System;
using namespace MTApiService; using namespace MTApiService;
using namespace System::Runtime::InteropServices; using namespace System::Runtime::InteropServices;
using namespace System::Reflection; using namespace System::Reflection;
using namespace System::Text; using namespace System::Text;
using namespace System::Collections::Generic; using namespace System::Collections::Generic;
using namespace System::Diagnostics; using namespace System::Diagnostics;
using namespace System::Security::Cryptography; using namespace System::Security::Cryptography;
using namespace System::Security; using namespace System::Security;
@@ -55,272 +56,142 @@ void convertSystemString(wchar_t* dest, String^ src)
dest[wcslen(wch)] = '\0'; dest[wcslen(wch)] = '\0';
} }
bool VerifySignature(System::String^ inputData, System::String^ signature, System::String^ publicKey) #define _DLLAPI extern "C" __declspec(dllexport)
{
bool verifyResult = false;
template <typename T> T Execute(std::function<T()> func, wchar_t* err, T default_value)
{
T result = default_value;
try try
{ {
DSACryptoServiceProvider^ dsa = gcnew DSACryptoServiceProvider(); result = func();
dsa->FromXmlString(publicKey);
array<System::Byte>^ data = UTF8Encoding::ASCII->GetBytes(inputData);
array<System::Byte>^ 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);
} }
catch (Exception^ e) catch (Exception^ e)
{ {
convertSystemString(err, e->Message); 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 return Execute<int>([&expertHandle, &port, symbol, &bid, &ask]() {
{ auto expert = gcnew MtExpert(expertHandle, gcnew String(symbol), bid, ask, gcnew MT5Handler());
MtAdapter::GetInstance()->DeinitExpert(expertHandle); MtAdapter::GetInstance()->AddExpert(port, expert);
} return 1;
catch (Exception^ e) }, err, 0);
{
convertSystemString(err, e->Message);
Debug::WriteLine("[ERROR] MT5Connector:deinitExpert(): " + e->Message);
return 0;
}
return 1;
} }
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<int>([&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<int>([&expertHandle, symbol, &bid, &ask]() {
MtAdapter::GetInstance()->SendQuote(expertHandle, gcnew String(symbol), bid, ask); MtAdapter::GetInstance()->SendQuote(expertHandle, gcnew String(symbol), bid, ask);
} return 1;
catch (Exception^ e) }, err, 0);
{
convertSystemString(err, e->Message);
Debug::WriteLine("[ERROR] MT5Connector:updateQuote(): " + e->Message);
return 0;
}
return 1;
} }
int _stdcall sendIntResponse(int expertHandle, int response) _DLLAPI int _stdcall sendIntResponse(int expertHandle, int response, wchar_t* err)
{ {
try return Execute<int>([&expertHandle, &response]() {
{
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseInt(response)); MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseInt(response));
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:sendIntResponse(): " + e->Message);
return 0;
}
return 1;
} }
int _stdcall sendLongResponse(int expertHandle, __int64 response) _DLLAPI int _stdcall sendLongResponse(int expertHandle, __int64 response, wchar_t* err)
{ {
try return Execute<int>([&expertHandle, &response]() {
{
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseLong(response)); MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseLong(response));
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:sendLongResponse(): " + e->Message);
return 0;
}
return 1;
} }
int _stdcall sendULongResponse(int expertHandle, unsigned __int64 response) _DLLAPI int _stdcall sendULongResponse(int expertHandle, unsigned __int64 response, wchar_t* err)
{ {
try return Execute<int>([&expertHandle, &response]() {
{
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseULong(response)); MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseULong(response));
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:sendLongResponse(): " + e->Message);
return 0;
}
return 1;
} }
int _stdcall sendBooleanResponse(int expertHandle, int response) _DLLAPI int _stdcall sendBooleanResponse(int expertHandle, int response, wchar_t* err)
{ {
try return Execute<int>([&expertHandle, &response]() {
{
bool value = (response != 0) ? true : false; bool value = (response != 0) ? true : false;
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseBool(value)); MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseBool(value));
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:sendBooleanResponse(): " + e->Message);
return 0;
}
return 1;
} }
int _stdcall sendDoubleResponse(int expertHandle, double response) _DLLAPI int _stdcall sendDoubleResponse(int expertHandle, double response, wchar_t* err)
{ {
try return Execute<int>([&expertHandle, &response]() {
{
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseDouble(response)); MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseDouble(response));
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:sendDoubleResponse(): " + e->Message);
return 0;
}
return 1;
} }
int _stdcall sendStringResponse(int expertHandle, wchar_t* response) _DLLAPI int _stdcall sendStringResponse(int expertHandle, wchar_t* response, wchar_t* err)
{ {
try return Execute<int>([&expertHandle, response]() {
{
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseString(gcnew String(response))); MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseString(gcnew String(response)));
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:sendStringResponse(): " + e->Message);
return 0;
}
return 1;
} }
int _stdcall sendVoidResponse(int expertHandle) _DLLAPI int _stdcall sendVoidResponse(int expertHandle, wchar_t* err)
{ {
try return Execute<int>([&expertHandle]() {
{
MtAdapter::GetInstance()->SendResponse(expertHandle, nullptr); MtAdapter::GetInstance()->SendResponse(expertHandle, nullptr);
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:sendVoidResponse(): " + e->Message);
return 0;
}
return 1;
} }
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<int>([&expertHandle, values, &size]() {
{
array<double>^ list = gcnew array<double>(size); array<double>^ list = gcnew array<double>(size);
for (int i = 0; i < size; i++)
for(int i = 0; i < size; i++)
{
list[i] = values[i]; list[i] = values[i];
}
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseDoubleArray(list)); MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseDoubleArray(list));
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:sendDoubleArrayResponse(): " + e->Message);
return 0;
}
return 1;
} }
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<int>([&expertHandle, values, &size]() {
{
array<int>^ list = gcnew array<int>(size); array<int>^ list = gcnew array<int>(size);
for (int i = 0; i < size; i++)
for(int i = 0; i < size; i++)
{
list[i] = values[i]; list[i] = values[i];
}
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseIntArray(list)); MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseIntArray(list));
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:sendIntArrayResponse(): " + e->Message);
return 0;
}
return 1;
} }
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<int>([&expertHandle, values, &size]() {
{
array<System::Int64>^ list = gcnew array<System::Int64>(size); array<System::Int64>^ list = gcnew array<System::Int64>(size);
for (int i = 0; i < size; i++)
for(int i = 0; i < size; i++)
{
list[i] = values[i]; list[i] = values[i];
}
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseLongArray(list)); MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseLongArray(list));
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:sendLongArrayResponse(): " + e->Message);
return 0;
}
return 1;
} }
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<int>([&expertHandle, values, &size]() {
{
array<MtMqlRates^>^ list = gcnew array<MtMqlRates^>(size); array<MtMqlRates^>^ list = gcnew array<MtMqlRates^>(size);
for (int i = 0; i < size; i++)
for(int i = 0; i < size; i++)
{ {
MtMqlRates^ rates = gcnew MtMqlRates(); MtMqlRates^ rates = gcnew MtMqlRates();
rates->time = values[i].time; 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->tick_volume = values[i].tick_volume;
rates->spread = values[i].spread; rates->spread = values[i].spread;
rates->real_volume = values[i].real_volume; rates->real_volume = values[i].real_volume;
list[i] = rates; list[i] = rates;
} }
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlRatesArray(list)); MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlRatesArray(list));
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:sendMqlRatesArrayResponse(): " + e->Message);
return 0;
}
return 1;
} }
int _stdcall sendMqlTickResponse(int expertHandle, CMqlTick* response, int size) _DLLAPI int _stdcall sendMqlTickResponse(int expertHandle, CMqlTick* response, wchar_t* err)
{ {
try return Execute<int>([&expertHandle, response]() {
{
MtMqlTick^ mtResponse = gcnew MtMqlTick(); MtMqlTick^ mtResponse = gcnew MtMqlTick();
mtResponse->time = response->time; mtResponse->time = response->time;
mtResponse->bid = response->bid; mtResponse->bid = response->bid;
mtResponse->ask = response->ask; mtResponse->ask = response->ask;
mtResponse->last = response->last; mtResponse->last = response->last;
mtResponse->volume = response->volume; mtResponse->volume = response->volume;
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlTick(mtResponse)); MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlTick(mtResponse));
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:sendMqlTickResponse(): " + e->Message);
return 0;
}
return 1;
} }
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<int>([&expertHandle, values, &size]() {
{
array<MtMqlBookInfo^>^ list = gcnew array<MtMqlBookInfo^>(size); array<MtMqlBookInfo^>^ list = gcnew array<MtMqlBookInfo^>(size);
for (int i = 0; i < size; i++)
for(int i = 0; i < size; i++)
{ {
MtMqlBookInfo^ info = gcnew MtMqlBookInfo(); MtMqlBookInfo^ info = gcnew MtMqlBookInfo();
info->type = values[i].type; info->type = values[i].type;
info->price = values[i].price; info->price = values[i].price;
info->volume = values[i].volume; info->volume = values[i].volume;
list[i] = info; list[i] = info;
} }
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlBookInfoArray(list)); MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlBookInfoArray(list));
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:sendMqlRatesArrayResponse(): " + e->Message);
return 0;
}
return 1;
} }
//----------- get values ------------------------------- //----------- get values -------------------------------
int _stdcall getCommandType(int expertHandle, int* res) _DLLAPI int _stdcall getCommandType(int expertHandle, int* res, wchar_t* err)
{ {
try return Execute<int>([&expertHandle, res]() {
{
*res = MtAdapter::GetInstance()->GetCommandType(expertHandle); *res = MtAdapter::GetInstance()->GetCommandType(expertHandle);
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:getCommandType(): " + e->Message);
return 0;
}
return 1;
} }
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<int>([&expertHandle, &paramIndex, res]() {
{
*res = (int)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex); *res = (int)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:getIntValue(): " + e->Message);
return 0;
}
return 1;
} }
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<int>([&expertHandle, &paramIndex, res]() {
{
*res = (double)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex); *res = (double)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:getDoubleValue(): " + e->Message);
return 0;
}
return 1;
} }
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<int>([&expertHandle, &paramIndex, res]() {
{
convertSystemString(res, (String^)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex)); convertSystemString(res, (String^)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex));
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:getStringValue(): " + e->Message);
return 0;
}
return 1;
} }
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<int>([&expertHandle, &paramIndex, res]() {
{
*res = (unsigned long)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex); *res = (unsigned long)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:getULongValue(): " + e->Message);
return 0;
}
return 1;
} }
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<int>([&expertHandle, &paramIndex, res]() {
{
*res = (long)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex); *res = (long)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:getLongValue(): " + e->Message);
return 0;
}
return 1;
} }
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<int>([&expertHandle, &paramIndex, res]() {
{
bool val = (bool)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex); bool val = (bool)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
*res = val == true ? 1 : 0; *res = val == true ? 1 : 0;
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:getBooleanValue(): " + e->Message);
return 0;
}
return 1;
} }
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<int>([&expertHandle, &paramIndex, res]() {
{
*res = (unsigned int)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex); *res = (unsigned int)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
} return 1;
catch (Exception^ e) }, err, 0);
{
Debug::WriteLine("[ERROR] MT5Connector:getUIntValue(): " + e->Message);
return 0;
}
return 1;
} }
-27
View File
@@ -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
-5
View File
@@ -95,7 +95,6 @@
<Link> <Link>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>user32.lib</AdditionalDependencies> <AdditionalDependencies>user32.lib</AdditionalDependencies>
<ModuleDefinitionFile>.\MT5Connector.def</ModuleDefinitionFile>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@@ -108,7 +107,6 @@
<Link> <Link>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>user32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>user32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>.\MT5Connector.def</ModuleDefinitionFile>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -120,7 +118,6 @@
<Link> <Link>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>user32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>user32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>.\MT5Connector.def</ModuleDefinitionFile>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -132,7 +129,6 @@
<Link> <Link>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>user32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>user32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>.\MT5Connector.def</ModuleDefinitionFile>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
@@ -157,7 +153,6 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="app.ico" /> <None Include="app.ico" />
<None Include="MT5Connector.def" />
<None Include="ReadMe.txt" /> <None Include="ReadMe.txt" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@@ -44,9 +44,6 @@
<None Include="app.ico"> <None Include="app.ico">
<Filter>Resource Files</Filter> <Filter>Resource Files</Filter>
</None> </None>
<None Include="MT5Connector.def">
<Filter>Source Files</Filter>
</None>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="app.rc"> <ResourceCompile Include="app.rc">
+1 -6
View File
@@ -1,9 +1,4 @@
using System; namespace MTApiService
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MTApiService
{ {
public interface IMetaTraderHandler public interface IMetaTraderHandler
{ {
+47 -13
View File
@@ -36,12 +36,48 @@ namespace MTApiService
#region Public Methods #region Public Methods
public void InitExpert(int expertHandle, int port, string symbol, double bid, double ask, IMetaTraderHandler mtHandler) //public void InitExpert(int expertHandle, int port, string symbol, double bid, double ask, IMetaTraderHandler mtHandler)
{ //{
if (mtHandler == null) // if (mtHandler == null)
throw new ArgumentNullException(nameof(mtHandler)); // 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; MtServer server;
lock (_servers) 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) lock (_experts)
{ {
_experts[expert.Handle] = expert; _experts[expert.Handle] = expert;
@@ -69,12 +103,12 @@ namespace MTApiService
server.AddExpert(expert); 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; MtExpert expert = null;
@@ -93,10 +127,10 @@ namespace MTApiService
} }
else 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) public void SendQuote(int expertHandle, string symbol, double bid, double ask)
@@ -111,7 +145,7 @@ namespace MTApiService
if (expert != null) 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 else
{ {
+1 -1
View File
@@ -17,7 +17,7 @@ namespace MTApiService
Command = command; Command = command;
} }
public MtCommand Command { get; private set; } public MtCommand Command { get; }
public MtResponse WaitResult(int time) public MtResponse WaitResult(int time)
{ {
+10 -26
View File
@@ -4,7 +4,7 @@ using System.Collections.Generic;
namespace MTApiService namespace MTApiService
{ {
internal class MtExpert: ITaskExecutor public class MtExpert: ITaskExecutor
{ {
public delegate void MtQuoteHandler(MtExpert expert, MtQuote quote); public delegate void MtQuoteHandler(MtExpert expert, MtQuote quote);
public delegate void MtEventHandler(MtExpert expert, MtEvent e); public delegate void MtEventHandler(MtExpert expert, MtEvent e);
@@ -19,12 +19,12 @@ namespace MTApiService
#endregion #endregion
#region Public Methods #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) if (mtHandler == null)
throw new ArgumentNullException(nameof(mtHandler)); throw new ArgumentNullException(nameof(mtHandler));
Quote = quote; _quote = new MtQuote { ExpertHandle = handle, Instrument = symbol, Bid = bid, Ask = ask};
Handle = handle; Handle = handle;
_mtHadler = mtHandler; _mtHadler = mtHandler;
} }
@@ -33,7 +33,6 @@ namespace MTApiService
{ {
Log.Debug("Deinit: begin."); Log.Debug("Deinit: begin.");
IsEnable = false;
FireOnDeinited(); FireOnDeinited();
Log.Debug("Deinit: end."); Log.Debug("Deinit: end.");
@@ -120,9 +119,14 @@ namespace MTApiService
Log.Debug("SendEvent: end."); Log.Debug("SendEvent: end.");
} }
public virtual void SendQuote(MtQuote quote)
{
Quote = quote;
}
public override string ToString() public override string ToString()
{ {
return $"ExpertHandle = {Handle}"; return $"ExpertHandle = {Handle}, Quote = {Quote}";
} }
#endregion #endregion
@@ -153,7 +157,7 @@ namespace MTApiService
return _quote; return _quote;
} }
} }
set private set
{ {
lock (_locker) lock (_locker)
{ {
@@ -165,26 +169,6 @@ namespace MTApiService
} }
public int Handle { get; } public int Handle { get; }
private bool _isEnable = true;
public bool IsEnable
{
get
{
lock (_locker)
{
return _isEnable;
}
}
private set
{
lock (_locker)
{
_isEnable = value;
}
}
}
#endregion #endregion
#region Private Methods #region Private Methods
-5
View File
@@ -80,11 +80,6 @@ namespace MTApiService
//init network hosts //init network hosts
var dnsHostName = Dns.GetHostName(); var dnsHostName = Dns.GetHostName();
var ips = Dns.GetHostEntry(dnsHostName); 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) foreach (var ipAddress in ips.AddressList)
{ {
+2 -2
View File
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.27.0")] [assembly: AssemblyVersion("1.0.28.0")]
[assembly: AssemblyFileVersion("1.0.27.0")] [assembly: AssemblyFileVersion("1.0.28.0")]
+3 -4
View File
@@ -44,17 +44,16 @@ template <typename T> T Execute(std::function<T()> func, wchar_t* err, T default
_DLLAPI bool _stdcall initExpert(int expertHandle, int port, wchar_t* symbol, double bid, double ask, wchar_t* err) _DLLAPI bool _stdcall initExpert(int expertHandle, int port, wchar_t* symbol, double bid, double ask, wchar_t* err)
{ {
return Execute<bool>([&expertHandle, &port, symbol, &bid, &ask]() { return Execute<bool>([&expertHandle, &port, symbol, &bid, &ask]() {
MT4Handler^ mtHandler = gcnew MT4Handler(); auto expert = gcnew MtExpert(expertHandle, gcnew String(symbol), bid, ask, gcnew MT4Handler());
MtAdapter::GetInstance()->InitExpert(expertHandle, port, gcnew String(symbol), bid, ask, mtHandler); MtAdapter::GetInstance()->AddExpert(port, expert);
return true; return true;
}, err, false); }, err, false);
} }
_DLLAPI bool _stdcall deinitExpert(int expertHandle, wchar_t* err) _DLLAPI bool _stdcall deinitExpert(int expertHandle, wchar_t* err)
{ {
return Execute<bool>([&expertHandle]() { return Execute<bool>([&expertHandle]() {
MtAdapter::GetInstance()->DeinitExpert(expertHandle); MtAdapter::GetInstance()->RemoveExpert(expertHandle);
return true; return true;
}, err, false); }, err, false);
} }