mirror of
https://github.com/vdemydiuk/mtapi.git
synced 2026-08-18 21:28:10 +00:00
Refactored MTApiService and connectors projects
This commit is contained in:
@@ -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
@@ -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, ¶mIndex, 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, ¶mIndex, 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, ¶mIndex, 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, ¶mIndex, 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, ¶mIndex, 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, ¶mIndex, 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, ¶mIndex, 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;
|
|
||||||
}
|
}
|
||||||
@@ -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
|
|
||||||
@@ -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,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
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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")]
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user