mirror of
https://github.com/vdemydiuk/mtapi.git
synced 2026-07-28 11:07:48 +00:00
Compare commits
96 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5c96aeb2fd | |||
| a238e5eb36 | |||
| 11fd5b7527 | |||
| cbe75cfbf6 | |||
| 9581431a9f | |||
| acf0c12531 | |||
| 1eccda9b2c | |||
| fd4aac7c32 | |||
| 36c90c8481 | |||
| fefa451371 | |||
| 1c57f88cb1 | |||
| 08ba45c65f | |||
| b8314e9ed7 | |||
| 9587b10c8c | |||
| b838084ba2 | |||
| cd24891022 | |||
| add69a4c03 | |||
| 5a3407e47c | |||
| ce8cfbbb70 | |||
| 8470bbd5cc | |||
| 5c7ae748a5 | |||
| 7abb4d3b5e | |||
| 486c42685a | |||
| f41ab37b6f | |||
| 9e129fb6e2 | |||
| f7b00a8d88 | |||
| a7cb14de25 | |||
| f50925c8d3 | |||
| e29a11de68 | |||
| 12141775f3 | |||
| b6d24b8aa9 | |||
| 7175fae18c | |||
| 3c4d8d52ca | |||
| 6873363d41 | |||
| 947599327a | |||
| 5645902a48 | |||
| c82787473f | |||
| c213fb709a | |||
| 2ac29dc871 | |||
| 1f72b2b790 | |||
| 3a62ff56d7 | |||
| d25fe529b4 | |||
| 15538e81f4 | |||
| a33be3c764 | |||
| 023fe8c7c9 | |||
| b77516e324 | |||
| 4b48423c3f | |||
| 9800177b08 | |||
| a33d4a4594 | |||
| 29722f362d | |||
| e072343fe1 | |||
| acb0c20ca8 | |||
| 83543fee88 | |||
| 3ce6b042de | |||
| 9dd770e768 | |||
| abb8b8afaa | |||
| 1d6569caa8 | |||
| 441a3cb8de | |||
| 443f5c982c | |||
| 515a12ab15 | |||
| 84b00b605a | |||
| 10e267d031 | |||
| abcd489367 | |||
| d630e61e3c | |||
| 280bab7faf | |||
| 26d270422b | |||
| 9cd2e3b18f | |||
| 50013c0c29 | |||
| ca49d23017 | |||
| 0346836d35 | |||
| 2cc41df01a | |||
| f05ade2cbf | |||
| d34524d77f | |||
| d06cc67a5d | |||
| 5b76bf0547 | |||
| 1c269f7339 | |||
| 21fb790d8c | |||
| 7c9a0aa8cc | |||
| 18ddf3df1c | |||
| a8832b79ba | |||
| 39146d68b2 | |||
| 5b03f01e9b | |||
| 8f5a1c8222 | |||
| f5f13a13cc | |||
| 9ef970cf1e | |||
| b5878ccb62 | |||
| 4a7bb6f2cb | |||
| 5abfeebc90 | |||
| e333164552 | |||
| 9a6968f618 | |||
| d63a53b8a9 | |||
| 7e821fcade | |||
| 88e2d22abe | |||
| fcfd741e5b | |||
| c722511c03 | |||
| 39599436ab |
@@ -35,6 +35,4 @@ using namespace System::Security::Permissions;
|
||||
|
||||
[assembly:ComVisible(false)];
|
||||
|
||||
[assembly:CLSCompliantAttribute(true)];
|
||||
|
||||
[assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)];
|
||||
[assembly:CLSCompliantAttribute(true)];
|
||||
+149
-344
@@ -6,14 +6,15 @@
|
||||
#include "MT5Handler.h"
|
||||
|
||||
#include "Windows.h"
|
||||
#include < vcclr.h >
|
||||
#include <vcclr.h>
|
||||
#include <functional>
|
||||
|
||||
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;
|
||||
@@ -50,277 +51,154 @@ public struct CMqlBookInfo
|
||||
|
||||
void convertSystemString(wchar_t* dest, String^ src)
|
||||
{
|
||||
pin_ptr<const wchar_t> wch = PtrToStringChars(src);
|
||||
memcpy(dest, wch, wcslen(wch) * sizeof(wchar_t));
|
||||
dest[wcslen(wch)] = '\0';
|
||||
if (src != nullptr) {
|
||||
pin_ptr<const wchar_t> wch = PtrToStringChars(src);
|
||||
memcpy(dest, wch, wcsnlen(wch, 1000) * sizeof(wchar_t));
|
||||
dest[wcsnlen(wch, 1000)] = L'\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
dest[0] = L'\0';
|
||||
}
|
||||
}
|
||||
|
||||
bool VerifySignature(System::String^ inputData, System::String^ signature, System::String^ publicKey)
|
||||
{
|
||||
bool verifyResult = false;
|
||||
#define _DLLAPI extern "C" __declspec(dllexport)
|
||||
|
||||
template <typename T> T Execute(std::function<T()> func, wchar_t* err, T default_value)
|
||||
{
|
||||
T result = default_value;
|
||||
try
|
||||
{
|
||||
DSACryptoServiceProvider^ dsa = gcnew DSACryptoServiceProvider();
|
||||
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();
|
||||
MtServerInstance::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, int isTestMode, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
MtServerInstance::GetInstance()->DeinitExpert(expertHandle);
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
convertSystemString(err, e->Message);
|
||||
Debug::WriteLine("[ERROR] MT5Connector:deinitExpert(): " + e->Message);
|
||||
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<int>([&expertHandle, &port, symbol, &bid, &ask, &isTestMode]() {
|
||||
bool isTesting = (isTestMode != 0) ? true : false;
|
||||
auto expert = gcnew Mt5Expert(expertHandle, gcnew String(symbol), bid, ask, gcnew MT5Handler(), isTesting);
|
||||
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
|
||||
{
|
||||
MtServerInstance::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 Execute<int>([&expertHandle]() {
|
||||
MtAdapter::GetInstance()->RemoveExpert(expertHandle);
|
||||
return 1;
|
||||
}, err, 0);
|
||||
}
|
||||
|
||||
int _stdcall sendIntResponse(int expertHandle, int response)
|
||||
_DLLAPI int _stdcall updateQuote(int expertHandle, wchar_t* symbol, double bid, double ask, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, gcnew MtResponseInt(response));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:sendIntResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<int>([&expertHandle, symbol, &bid, &ask]() {
|
||||
MtAdapter::GetInstance()->SendQuote(expertHandle, gcnew String(symbol), bid, ask);
|
||||
return 1;
|
||||
}, err, 0);
|
||||
}
|
||||
|
||||
int _stdcall sendLongResponse(int expertHandle, __int64 response)
|
||||
_DLLAPI int _stdcall sendIntResponse(int expertHandle, int response, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, gcnew MtResponseLong(response));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:sendLongResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<int>([&expertHandle, &response]() {
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseInt(response));
|
||||
return 1;
|
||||
}, err, 0);
|
||||
}
|
||||
|
||||
int _stdcall sendULongResponse(int expertHandle, unsigned __int64 response)
|
||||
_DLLAPI int _stdcall sendLongResponse(int expertHandle, __int64 response, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, gcnew MtResponseULong(response));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:sendLongResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<int>([&expertHandle, &response]() {
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseLong(response));
|
||||
return 1;
|
||||
}, err, 0);
|
||||
}
|
||||
|
||||
int _stdcall sendBooleanResponse(int expertHandle, int 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));
|
||||
return 1;
|
||||
}, err, 0);
|
||||
}
|
||||
|
||||
_DLLAPI int _stdcall sendBooleanResponse(int expertHandle, int response, wchar_t* err)
|
||||
{
|
||||
return Execute<int>([&expertHandle, &response]() {
|
||||
bool value = (response != 0) ? true : false;
|
||||
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, gcnew MtResponseBool(value));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:sendBooleanResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseBool(value));
|
||||
return 1;
|
||||
}, err, 0);
|
||||
}
|
||||
|
||||
int _stdcall sendDoubleResponse(int expertHandle, double response)
|
||||
_DLLAPI int _stdcall sendDoubleResponse(int expertHandle, double response, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, gcnew MtResponseDouble(response));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:sendDoubleResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<int>([&expertHandle, &response]() {
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseDouble(response));
|
||||
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
|
||||
{
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, gcnew MtResponseString(gcnew String(response)));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:sendStringResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<int>([&expertHandle, response]() {
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseString(gcnew String(response)));
|
||||
return 1;
|
||||
}, err, 0);
|
||||
}
|
||||
|
||||
int _stdcall sendVoidResponse(int expertHandle)
|
||||
_DLLAPI int _stdcall sendVoidResponse(int expertHandle, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, nullptr);
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:sendVoidResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<int>([&expertHandle]() {
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, nullptr);
|
||||
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<int>([&expertHandle, values, &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];
|
||||
}
|
||||
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, gcnew MtResponseDoubleArray(list));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:sendDoubleArrayResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseDoubleArray(list));
|
||||
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<int>([&expertHandle, values, &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];
|
||||
}
|
||||
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, gcnew MtResponseIntArray(list));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:sendIntArrayResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseIntArray(list));
|
||||
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<int>([&expertHandle, values, &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];
|
||||
}
|
||||
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, gcnew MtResponseLongArray(list));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:sendLongArrayResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseLongArray(list));
|
||||
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<int>([&expertHandle, values, &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();
|
||||
rates->time = values[i].time;
|
||||
@@ -331,180 +209,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;
|
||||
}
|
||||
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlRatesArray(list));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:sendMqlRatesArrayResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlRatesArray(list));
|
||||
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<int>([&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;
|
||||
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlTick(mtResponse));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:sendMqlTickResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlTick(mtResponse));
|
||||
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<int>([&expertHandle, values, &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();
|
||||
|
||||
info->type = values[i].type;
|
||||
info->price = values[i].price;
|
||||
info->volume = values[i].volume;
|
||||
|
||||
list[i] = info;
|
||||
}
|
||||
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlBookInfoArray(list));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:sendMqlRatesArrayResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlBookInfoArray(list));
|
||||
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
|
||||
{
|
||||
*res = MtServerInstance::GetInstance()->GetCommandType(expertHandle);
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:getCommandType(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<int>([&expertHandle, res]() {
|
||||
*res = MtAdapter::GetInstance()->GetCommandType(expertHandle);
|
||||
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
|
||||
{
|
||||
*res = (int)MtServerInstance::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:getIntValue(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<int>([&expertHandle, ¶mIndex, res]() {
|
||||
*res = (int)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||
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
|
||||
{
|
||||
*res = (double)MtServerInstance::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:getDoubleValue(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<int>([&expertHandle, ¶mIndex, res]() {
|
||||
*res = (double)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||
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
|
||||
{
|
||||
convertSystemString(res, (String^)MtServerInstance::GetInstance()->GetCommandParameter(expertHandle, paramIndex));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:getStringValue(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<int>([&expertHandle, ¶mIndex, res]() {
|
||||
convertSystemString(res, (String^)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex));
|
||||
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
|
||||
{
|
||||
*res = (unsigned long)MtServerInstance::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:getULongValue(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<int>([&expertHandle, ¶mIndex, res]() {
|
||||
*res = (unsigned __int64)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||
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
|
||||
{
|
||||
*res = (long)MtServerInstance::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:getLongValue(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<int>([&expertHandle, ¶mIndex, res]() {
|
||||
*res = (__int64)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||
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
|
||||
{
|
||||
bool val = (bool)MtServerInstance::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||
return Execute<int>([&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
|
||||
{
|
||||
*res = (unsigned int)MtServerInstance::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:getUIntValue(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
return Execute<int>([&expertHandle, ¶mIndex, res]() {
|
||||
*res = (unsigned int)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||
return 1;
|
||||
}, err, 0);
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>user32.lib</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>.\MT5Connector.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
@@ -108,7 +107,6 @@
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>user32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>.\MT5Connector.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
@@ -120,7 +118,6 @@
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>user32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>.\MT5Connector.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
@@ -132,7 +129,6 @@
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>user32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>.\MT5Connector.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
@@ -157,7 +153,6 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.ico" />
|
||||
<None Include="MT5Connector.def" />
|
||||
<None Include="ReadMe.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -44,9 +44,6 @@
|
||||
<None Include="app.ico">
|
||||
<Filter>Resource Files</Filter>
|
||||
</None>
|
||||
<None Include="MT5Connector.def">
|
||||
<Filter>Source Files</Filter>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="app.rc">
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
namespace MTApiService
|
||||
{
|
||||
public interface ICommandManager
|
||||
internal interface ICommandManager
|
||||
{
|
||||
void EnqueueCommandTask(MtCommandTask task);
|
||||
MtCommandTask DequeueCommandTask();
|
||||
MtCommandTask SendCommand(MtCommand task);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace MTApiService
|
||||
namespace MTApiService
|
||||
{
|
||||
public interface IMetaTraderHandler
|
||||
{
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace MTApiService
|
||||
{
|
||||
internal interface ITaskExecutor
|
||||
{
|
||||
void Execute(MtCommandTask task);
|
||||
|
||||
int Handle { get; }
|
||||
}
|
||||
}
|
||||
@@ -29,7 +29,7 @@ namespace MTApiService
|
||||
|
||||
var roller = new RollingFileAppender
|
||||
{
|
||||
AppendToFile = false,
|
||||
AppendToFile = true,
|
||||
File = $@"{System.IO.Path.GetTempPath()}{profileName}\Logs\{filename}",
|
||||
Layout = patternLayout,
|
||||
PreserveLogFileNameExtension = true,
|
||||
@@ -41,10 +41,6 @@ namespace MTApiService
|
||||
roller.ActivateOptions();
|
||||
hierarchy.Root.AddAppender(roller);
|
||||
|
||||
var memory = new MemoryAppender();
|
||||
memory.ActivateOptions();
|
||||
hierarchy.Root.AddAppender(memory);
|
||||
|
||||
#if (DEBUG)
|
||||
hierarchy.Root.Level = Level.Debug;
|
||||
#else
|
||||
|
||||
@@ -62,7 +62,9 @@
|
||||
<ItemGroup>
|
||||
<Compile Include="ICommandManager.cs" />
|
||||
<Compile Include="IMetaTraderHandler.cs" />
|
||||
<Compile Include="ITaskExecutor.cs" />
|
||||
<Compile Include="LogConfigurator.cs" />
|
||||
<Compile Include="Mt5Expert.cs" />
|
||||
<Compile Include="MtCommandEventArgs.cs" />
|
||||
<Compile Include="IDisposableChannel.cs" />
|
||||
<Compile Include="IMtApiServer.cs" />
|
||||
@@ -78,11 +80,11 @@
|
||||
<Compile Include="MtConnectionProfile.cs" />
|
||||
<Compile Include="MtExecutorManager.cs" />
|
||||
<Compile Include="MtExpert.cs" />
|
||||
<Compile Include="MtInstrument.cs" />
|
||||
<Compile Include="MtQuote.cs" />
|
||||
<Compile Include="MtResponse.cs" />
|
||||
<Compile Include="MtServer.cs" />
|
||||
<Compile Include="MtCommand.cs" />
|
||||
<Compile Include="MtServerInstance.cs" />
|
||||
<Compile Include="MtAdapter.cs" />
|
||||
<Compile Include="MtService.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
using log4net;
|
||||
|
||||
namespace MTApiService
|
||||
{
|
||||
public class Mt5Expert : MtExpert
|
||||
{
|
||||
private static readonly ILog Log = LogManager.GetLogger(typeof(MtExpert));
|
||||
private const int StopExpertInterval = 2000; // 2 sec for testing mode
|
||||
private readonly System.Timers.Timer _stopTimer = new System.Timers.Timer();
|
||||
|
||||
|
||||
public Mt5Expert(int handle, string symbol, double bid, double ask, IMetaTraderHandler mtHandler, bool isTestMode) :
|
||||
base(handle, symbol, bid, ask, mtHandler)
|
||||
{
|
||||
IsTestMode = isTestMode;
|
||||
_stopTimer.Interval = StopExpertInterval;
|
||||
_stopTimer.Elapsed += _stopTimer_Elapsed;
|
||||
}
|
||||
|
||||
public bool IsTestMode { get; }
|
||||
|
||||
public override void UpdateQuote(MtQuote quote)
|
||||
{
|
||||
Log.Debug("UpdateQuote: begin.");
|
||||
|
||||
base.UpdateQuote(quote);
|
||||
|
||||
if (IsTestMode)
|
||||
{
|
||||
//reset timer
|
||||
_stopTimer.Stop();
|
||||
_stopTimer.Start();
|
||||
}
|
||||
|
||||
Log.Debug("UpdateQuote: end.");
|
||||
}
|
||||
|
||||
private void _stopTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
|
||||
{
|
||||
Log.Debug("_stopTimer_Elapsed: begin.");
|
||||
|
||||
Log.Warn("Mt5Expert has received new tick during 2 sec in testing mode. The possible cause: user has stopped the tester manually in MetaTrader 5.");
|
||||
Deinit();
|
||||
|
||||
Log.Debug("_stopTimer_Elapsed: end.");
|
||||
}
|
||||
}
|
||||
}
|
||||
Executable → Regular
+64
-22
@@ -4,13 +4,13 @@ using log4net;
|
||||
|
||||
namespace MTApiService
|
||||
{
|
||||
public class MtServerInstance
|
||||
public class MtAdapter
|
||||
{
|
||||
#region Fields
|
||||
private const string LogProfileName = "MtApiService";
|
||||
|
||||
private static readonly ILog Log = LogManager.GetLogger(typeof(MtServerInstance));
|
||||
private static readonly MtServerInstance Instance = new MtServerInstance();
|
||||
private static readonly ILog Log = LogManager.GetLogger(typeof(MtAdapter));
|
||||
private static readonly MtAdapter Instance = new MtAdapter();
|
||||
|
||||
private readonly Dictionary<int, MtServer> _servers = new Dictionary<int, MtServer>();
|
||||
private readonly Dictionary<int, MtExpert> _experts = new Dictionary<int, MtExpert>();
|
||||
@@ -18,16 +18,16 @@ namespace MTApiService
|
||||
|
||||
#region Init Instance
|
||||
|
||||
private MtServerInstance()
|
||||
private MtAdapter()
|
||||
{
|
||||
LogConfigurator.Setup(LogProfileName);
|
||||
}
|
||||
|
||||
static MtServerInstance()
|
||||
static MtAdapter()
|
||||
{
|
||||
}
|
||||
|
||||
public static MtServerInstance GetInstance()
|
||||
public static MtAdapter GetInstance()
|
||||
{
|
||||
return Instance;
|
||||
}
|
||||
@@ -36,12 +36,12 @@ namespace MTApiService
|
||||
|
||||
|
||||
#region Public Methods
|
||||
public void InitExpert(int expertHandle, int port, string symbol, double bid, double ask, IMetaTraderHandler mtHandler)
|
||||
public void AddExpert(int port, MtExpert expert)
|
||||
{
|
||||
if (mtHandler == null)
|
||||
throw new ArgumentNullException(nameof(mtHandler));
|
||||
if (expert == null)
|
||||
throw new ArgumentNullException(nameof(expert));
|
||||
|
||||
Log.InfoFormat("InitExpert: begin. symbol = {0}, expertHandle = {1}, port = {2}", symbol, expertHandle, port);
|
||||
Log.InfoFormat("AddExpert: begin. expert = {0}", expert);
|
||||
|
||||
MtServer server;
|
||||
lock (_servers)
|
||||
@@ -60,8 +60,6 @@ namespace MTApiService
|
||||
}
|
||||
}
|
||||
|
||||
var expert = new MtExpert(expertHandle, new MtQuote(symbol, bid, ask), mtHandler);
|
||||
|
||||
lock (_experts)
|
||||
{
|
||||
_experts[expert.Handle] = expert;
|
||||
@@ -69,12 +67,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,15 +91,15 @@ 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)
|
||||
{
|
||||
Log.DebugFormat("SendQuote: begin. symbol = {0}, bid = {1}, ask = {2}", symbol, bid, ask);
|
||||
Log.DebugFormat("UpdateQuote: begin. symbol = {0}, bid = {1}, ask = {2}", symbol, bid, ask);
|
||||
|
||||
MtExpert expert;
|
||||
lock (_experts)
|
||||
@@ -111,14 +109,14 @@ namespace MTApiService
|
||||
|
||||
if (expert != null)
|
||||
{
|
||||
expert.Quote = new MtQuote(symbol, bid, ask);
|
||||
expert.UpdateQuote(new MtQuote { Instrument = symbol, Bid = bid, Ask = ask, ExpertHandle = expertHandle });
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.WarnFormat("SendQuote: expert with id {0} has not been found.", expertHandle);
|
||||
Log.WarnFormat("UpdateQuote: expert with id {0} has not been found.", expertHandle);
|
||||
}
|
||||
|
||||
Log.Debug("SendQuote: end");
|
||||
Log.Debug("UpdateQuote: end");
|
||||
}
|
||||
|
||||
public void SendEvent(int expertHandle, int eventType, string payload)
|
||||
@@ -133,7 +131,7 @@ namespace MTApiService
|
||||
|
||||
if (expert != null)
|
||||
{
|
||||
expert.SendEvent(new MtEvent(eventType, payload));
|
||||
expert.SendEvent(new MtEvent { EventType = eventType, Payload = payload, ExpertHandle = expertHandle });
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -208,6 +206,50 @@ namespace MTApiService
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
public object GetNamedParameter(int expertHandle, string name)
|
||||
{
|
||||
Log.DebugFormat("GetNamedParameter: begin. expertHandle = {0}, name = {1}", expertHandle, name);
|
||||
|
||||
MtExpert expert;
|
||||
lock (_experts)
|
||||
{
|
||||
expert = _experts[expertHandle];
|
||||
}
|
||||
|
||||
if (expert == null)
|
||||
{
|
||||
Log.WarnFormat("GetNamedParameter: expert with id {0} has not been found.", expertHandle);
|
||||
}
|
||||
|
||||
var retval = expert?.GetNamedParameter(name);
|
||||
|
||||
Log.DebugFormat("GetNamedParameter: end. retval = {0}", retval);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
public bool ContainsNamedParameter(int expertHandle, string name)
|
||||
{
|
||||
Log.DebugFormat("ContainsNamedParameter: begin. expertHandle = {0}, name = {1}", expertHandle, name);
|
||||
|
||||
MtExpert expert;
|
||||
lock (_experts)
|
||||
{
|
||||
expert = _experts[expertHandle];
|
||||
}
|
||||
|
||||
if (expert == null)
|
||||
{
|
||||
Log.WarnFormat("ContainsNamedParameter: expert with id {0} has not been found.", expertHandle);
|
||||
}
|
||||
|
||||
bool retval = expert != null ? expert.ContainsNamedParameter(name) : false;
|
||||
|
||||
Log.DebugFormat("ContainsNamedParameter: end. retval = {0}", retval);
|
||||
|
||||
return retval;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Private Methods
|
||||
@@ -11,13 +11,13 @@ namespace MTApiService
|
||||
: base(callbackContext, binding, remoteAddress)
|
||||
{
|
||||
InnerDuplexChannel.Faulted += InnerDuplexChannel_Faulted;
|
||||
InnerDuplexChannel.Open();
|
||||
}
|
||||
|
||||
#region IMtApi Members
|
||||
|
||||
public bool Connect()
|
||||
{
|
||||
InnerDuplexChannel.Open();
|
||||
return Channel.Connect();
|
||||
}
|
||||
|
||||
|
||||
+42
-90
@@ -6,38 +6,33 @@ using log4net;
|
||||
|
||||
namespace MTApiService
|
||||
{
|
||||
[CallbackBehavior(UseSynchronizationContext = false)]
|
||||
public class MtClient: IMtApiCallback, IDisposable
|
||||
[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)]
|
||||
public class MtClient : IMtApiCallback, IDisposable
|
||||
{
|
||||
private const string ServiceName = "MtApiService";
|
||||
|
||||
public delegate void MtQuoteHandler(MtQuote quote);
|
||||
public delegate void MtEventHandler(MtEvent e);
|
||||
|
||||
#region Fields
|
||||
private static readonly ILog Log = LogManager.GetLogger(typeof(MtClient));
|
||||
|
||||
private MtApiProxy _proxy;
|
||||
private bool _isConnected;
|
||||
private readonly MtApiProxy _proxy;
|
||||
#endregion
|
||||
|
||||
#region Public Methods
|
||||
public void Open(string host, int port)
|
||||
#region ctor
|
||||
public MtClient(string host, int port)
|
||||
{
|
||||
Log.DebugFormat("Open: begin. host = {0}, port = {1}", host, port);
|
||||
|
||||
if (string.IsNullOrEmpty(host))
|
||||
throw new ArgumentNullException(nameof(host), "host is null or empty");
|
||||
|
||||
if (port < 0 || port > 65536)
|
||||
throw new ArgumentOutOfRangeException(nameof(port), "port value is invalid");
|
||||
|
||||
var urlService = $"net.tcp://{host}:{port}/{ServiceName}";
|
||||
Host = host;
|
||||
Port = port;
|
||||
|
||||
if (_proxy != null)
|
||||
{
|
||||
Log.Warn("Open: end. _proxy is not null.");
|
||||
return;
|
||||
}
|
||||
var urlService = $"net.tcp://{host}:{port}/{ServiceName}";
|
||||
|
||||
var bind = new NetTcpBinding(SecurityMode.None)
|
||||
{
|
||||
@@ -55,28 +50,19 @@ namespace MTApiService
|
||||
MaxNameTableCharCount = 2147483647
|
||||
}
|
||||
};
|
||||
// Commented next statement since it is not required
|
||||
|
||||
_proxy = new MtApiProxy(new InstanceContext(this), bind, new EndpointAddress(urlService));
|
||||
_proxy.Faulted += ProxyFaulted;
|
||||
|
||||
Log.Debug("Open: end.");
|
||||
}
|
||||
|
||||
public void Open(int port)
|
||||
public MtClient(int port)
|
||||
{
|
||||
Log.DebugFormat("Open: begin. port = {0}", port);
|
||||
|
||||
if (port < 0 || port > 65536)
|
||||
throw new ArgumentOutOfRangeException(nameof(port), "port value is invalid");
|
||||
|
||||
var urlService = $"net.pipe://localhost/{ServiceName}_{port}";
|
||||
Port = port;
|
||||
|
||||
if (_proxy != null)
|
||||
{
|
||||
Log.Warn("Open: end. _proxy is not null.");
|
||||
return;
|
||||
}
|
||||
var urlService = $"net.pipe://localhost/{ServiceName}_{port}";
|
||||
|
||||
var bind = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None)
|
||||
{
|
||||
@@ -94,61 +80,40 @@ namespace MTApiService
|
||||
MaxNameTableCharCount = 2147483647
|
||||
}
|
||||
};
|
||||
// Commented next statement since it is not required
|
||||
|
||||
_proxy = new MtApiProxy(new InstanceContext(this), bind, new EndpointAddress(urlService));
|
||||
_proxy.Faulted += ProxyFaulted;
|
||||
|
||||
Log.Debug("Open: end.");
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
Log.Debug("Close: begin.");
|
||||
|
||||
if (_proxy != null)
|
||||
{
|
||||
_proxy.Faulted -= ProxyFaulted;
|
||||
_proxy.Dispose();
|
||||
_proxy = null;
|
||||
}
|
||||
|
||||
_isConnected = false;
|
||||
|
||||
Log.Debug("Close: end.");
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Public Methods
|
||||
/// <exception cref="CommunicationException">Thrown when connection failed</exception>
|
||||
public void Connect()
|
||||
{
|
||||
Log.Debug("Connect: begin.");
|
||||
|
||||
if (_proxy == null)
|
||||
if (_proxy.State != CommunicationState.Created)
|
||||
{
|
||||
Log.Error("Connect: _proxy is not defined.");
|
||||
throw new CommunicationException("Connection failed to service. Proxy is not defined (needs to call Open)");
|
||||
}
|
||||
|
||||
if (_isConnected)
|
||||
{
|
||||
Log.Warn("Connected: end. Client is already connected.");
|
||||
Log.ErrorFormat("Connected: end. Client has invalid state {0}", _proxy.State);
|
||||
return;
|
||||
}
|
||||
|
||||
bool coonected;
|
||||
|
||||
try
|
||||
{
|
||||
_isConnected = _proxy.Connect();
|
||||
coonected = _proxy.Connect();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.ErrorFormat("Connect: Exception - {0}", ex.Message);
|
||||
|
||||
Close();
|
||||
|
||||
throw new CommunicationException($"Connection failed to service. {ex.Message}");
|
||||
}
|
||||
|
||||
if (_isConnected == false)
|
||||
if (coonected == false)
|
||||
{
|
||||
Log.Error("Connect: end. Connection failed.");
|
||||
throw new CommunicationException("Connection failed");
|
||||
@@ -163,72 +128,60 @@ namespace MTApiService
|
||||
|
||||
try
|
||||
{
|
||||
_isConnected = false;
|
||||
|
||||
_proxy?.Disconnect();
|
||||
_proxy.Disconnect();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.ErrorFormat("Disconnect: Exception - {0}", ex.Message);
|
||||
|
||||
Close();
|
||||
}
|
||||
|
||||
Log.Debug("Disconnect: end.");
|
||||
}
|
||||
|
||||
/// <exception cref="CommunicationException">Thrown when connection failed</exception>
|
||||
public MtResponse SendCommand(int commandType, ArrayList parameters)
|
||||
public MtResponse SendCommand(int commandType, ArrayList parameters, Dictionary<string, object> namedParams, int expertHandle)
|
||||
{
|
||||
Log.DebugFormat("SendCommand: begin. commandType = {0}, parameters count = {1}", commandType, parameters?.Count);
|
||||
|
||||
MtResponse result;
|
||||
|
||||
if (_isConnected == false)
|
||||
if (IsConnected == false)
|
||||
{
|
||||
Log.Error("SendCommand: Client is not connected.");
|
||||
throw new CommunicationException("Client is not connected.");
|
||||
}
|
||||
|
||||
if (_proxy == null)
|
||||
{
|
||||
Log.Error("SendCommand: Proxy is not defined.");
|
||||
throw new CommunicationException("Proxy is not defined.");
|
||||
}
|
||||
MtResponse result;
|
||||
|
||||
try
|
||||
{
|
||||
result = _proxy.SendCommand(new MtCommand(commandType, parameters));
|
||||
result = _proxy.SendCommand(new MtCommand {
|
||||
CommandType = commandType,
|
||||
Parameters = parameters,
|
||||
NamedParams = namedParams,
|
||||
ExpertHandle = expertHandle});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.ErrorFormat("SendCommand: Exception - {0}", ex.Message);
|
||||
|
||||
Close();
|
||||
|
||||
throw new CommunicationException("Service connection failed! " + ex.Message);
|
||||
}
|
||||
|
||||
Log.DebugFormat("SendCommand: end. result = {0}", result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <exception cref="CommunicationException">Thrown when connection failed</exception>
|
||||
public IEnumerable<MtQuote> GetQuotes()
|
||||
public List<MtQuote> GetQuotes()
|
||||
{
|
||||
Log.Debug("GetQuotes: begin.");
|
||||
|
||||
if (_isConnected == false)
|
||||
if (IsConnected == false)
|
||||
{
|
||||
Log.Warn("GetQuotes: end. Client is not connected.");
|
||||
return null;
|
||||
}
|
||||
|
||||
if (_proxy == null)
|
||||
{
|
||||
Log.Warn("GetQuotes: end. _proxy is not defined.");
|
||||
return null;
|
||||
}
|
||||
|
||||
List<MtQuote> result;
|
||||
|
||||
try
|
||||
@@ -239,8 +192,6 @@ namespace MTApiService
|
||||
{
|
||||
Log.ErrorFormat("GetQuotes: Exception - {0}", ex.Message);
|
||||
|
||||
Close();
|
||||
|
||||
throw new CommunicationException($"Service connection failed! {ex.Message}");
|
||||
}
|
||||
|
||||
@@ -286,18 +237,17 @@ namespace MTApiService
|
||||
{
|
||||
Log.Debug("OnServerStopped: begin.");
|
||||
|
||||
Close();
|
||||
ServerDisconnected?.Invoke(this, EventArgs.Empty);
|
||||
|
||||
Log.Debug("OnServerStopped: end.");
|
||||
}
|
||||
|
||||
|
||||
public void OnMtEvent(MtEvent mtEvent)
|
||||
public void OnMtEvent(MtEvent e)
|
||||
{
|
||||
Log.DebugFormat("OnMtEvent: begin. event = {0}", mtEvent);
|
||||
Log.DebugFormat("OnMtEvent: begin. event = {0}", e);
|
||||
|
||||
MtEventReceived?.Invoke(this, new MtEventArgs(mtEvent));
|
||||
MtEventReceived?.Invoke(e);
|
||||
|
||||
Log.Debug("OnMtEvent: end.");
|
||||
}
|
||||
@@ -305,7 +255,10 @@ namespace MTApiService
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
public bool IsConnected => _proxy.State == CommunicationState.Opened && _isConnected;
|
||||
public string Host { get; private set; }
|
||||
public int Port { get; private set; }
|
||||
|
||||
private bool IsConnected => _proxy.State == CommunicationState.Opened;
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -315,7 +268,6 @@ namespace MTApiService
|
||||
{
|
||||
Log.Debug("ProxyFaulted: begin.");
|
||||
|
||||
Close();
|
||||
ServerFailed?.Invoke(this, EventArgs.Empty);
|
||||
|
||||
Log.Debug("ProxyFaulted: end.");
|
||||
@@ -329,7 +281,7 @@ namespace MTApiService
|
||||
{
|
||||
Log.Debug("Dispose: begin.");
|
||||
|
||||
Close();
|
||||
_proxy.Dispose();
|
||||
|
||||
Log.Debug("Dispose: end.");
|
||||
}
|
||||
@@ -342,7 +294,7 @@ namespace MTApiService
|
||||
public event MtQuoteHandler QuoteUpdated;
|
||||
public event EventHandler ServerDisconnected;
|
||||
public event EventHandler ServerFailed;
|
||||
public event EventHandler<MtEventArgs> MtEventReceived;
|
||||
public event MtEventHandler MtEventReceived;
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,27 @@
|
||||
using System.Runtime.Serialization;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace MTApiService
|
||||
{
|
||||
[DataContract]
|
||||
public class MtCommand
|
||||
{
|
||||
public MtCommand(int commandType, ArrayList parameters)
|
||||
{
|
||||
CommandType = commandType;
|
||||
Parameters = parameters;
|
||||
}
|
||||
[DataMember]
|
||||
public int CommandType { get; set; }
|
||||
|
||||
[DataMember]
|
||||
public int CommandType { get; private set; }
|
||||
public ArrayList Parameters { get; set; }
|
||||
|
||||
[DataMember]
|
||||
public ArrayList Parameters { get; private set; }
|
||||
public Dictionary<string, object> NamedParams { get; set; }
|
||||
|
||||
[DataMember]
|
||||
public int ExpertHandle { get; set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"CommandType = {CommandType}";
|
||||
return $"CommandType = {CommandType}; ExpertHandle = {ExpertHandle}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace MTApiService
|
||||
Command = command;
|
||||
}
|
||||
|
||||
public MtCommand Command { get; private set; }
|
||||
public MtCommand Command { get; }
|
||||
|
||||
public MtResponse WaitResult(int time)
|
||||
{
|
||||
|
||||
+5
-18
@@ -7,30 +7,17 @@ namespace MTApiService
|
||||
public class MtEvent
|
||||
{
|
||||
[DataMember]
|
||||
public int EventType { get; private set; }
|
||||
public int EventType { get; internal set; }
|
||||
|
||||
[DataMember]
|
||||
public string Payload { get; private set; }
|
||||
public string Payload { get; internal set; }
|
||||
|
||||
public MtEvent(int eventType, string payload)
|
||||
{
|
||||
EventType = eventType;
|
||||
Payload = payload;
|
||||
}
|
||||
[DataMember]
|
||||
public int ExpertHandle { get; internal set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return "MtEvent = " + EventType + ", Payload = " + Payload;
|
||||
return $"EventType = {EventType}; Payload = {Payload}; ExpertHandle = {ExpertHandle}";
|
||||
}
|
||||
}
|
||||
|
||||
public class MtEventArgs: EventArgs
|
||||
{
|
||||
public MtEventArgs(MtEvent e)
|
||||
{
|
||||
Event = e;
|
||||
}
|
||||
|
||||
public MtEvent Event { get; private set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,14 +4,13 @@ using log4net;
|
||||
|
||||
namespace MTApiService
|
||||
{
|
||||
internal class MtCommandExecutorManager : ICommandManager
|
||||
internal class MtExecutorManager : ICommandManager
|
||||
{
|
||||
#region Private Fields
|
||||
private static readonly ILog Log = LogManager.GetLogger(typeof(MtCommandExecutorManager));
|
||||
|
||||
private readonly List<MtExpert> _commandExecutors = new List<MtExpert>();
|
||||
private readonly Queue<MtCommandTask> _commandTasks = new Queue<MtCommandTask>();
|
||||
private static readonly ILog Log = LogManager.GetLogger(typeof(MtExecutorManager));
|
||||
|
||||
private readonly List<ITaskExecutor> _executorList = new List<ITaskExecutor>();
|
||||
private readonly Dictionary<int, ITaskExecutor> _executorMap = new Dictionary<int, ITaskExecutor>();
|
||||
private readonly object _locker = new object();
|
||||
#endregion
|
||||
|
||||
@@ -23,149 +22,94 @@ namespace MTApiService
|
||||
|
||||
lock (_locker)
|
||||
{
|
||||
_commandExecutors.Clear();
|
||||
_commandTasks.Clear();
|
||||
_executorList.Clear();
|
||||
_executorMap.Clear();
|
||||
}
|
||||
|
||||
Log.Debug("Stop: end.");
|
||||
}
|
||||
|
||||
public void AddCommandExecutor(MtExpert commandExecutor)
|
||||
public void AddExecutor(ITaskExecutor executor)
|
||||
{
|
||||
if (commandExecutor == null)
|
||||
throw new ArgumentNullException(nameof(commandExecutor));
|
||||
if (executor == null)
|
||||
throw new ArgumentNullException(nameof(executor));
|
||||
|
||||
Log.DebugFormat("AddCommandExecutor: begin. commandExecutor = {0}", commandExecutor);
|
||||
Log.DebugFormat("AddExecutor: begin. executor = {0}", executor);
|
||||
|
||||
var notify = false;
|
||||
lock (_locker)
|
||||
{
|
||||
if (_commandExecutors.Contains(commandExecutor))
|
||||
if (_executorList.Contains(executor))
|
||||
{
|
||||
Log.Warn("AddCommandExecutor: end. Command executor already exist.");
|
||||
Log.Warn("AddExecutor: end. Executor already exist.");
|
||||
return;
|
||||
}
|
||||
|
||||
_commandExecutors.Add(commandExecutor);
|
||||
if (_commandTasks.Count > 0)
|
||||
{
|
||||
notify = true;
|
||||
}
|
||||
}
|
||||
|
||||
commandExecutor.CommandExecuted += CommandExecutor_CommandExecuted;
|
||||
commandExecutor.CommandManager = this;
|
||||
|
||||
if (notify)
|
||||
{
|
||||
NotifyCommandReady();
|
||||
_executorList.Add(executor);
|
||||
_executorMap[executor.Handle] = executor;
|
||||
}
|
||||
|
||||
Log.Debug("AddCommandExecutor: end.");
|
||||
}
|
||||
|
||||
public void RemoveCommandExecutor(MtExpert commandExecutor)
|
||||
public void RemoveExecutor(ITaskExecutor executor)
|
||||
{
|
||||
if (commandExecutor == null)
|
||||
throw new ArgumentNullException(nameof(commandExecutor));
|
||||
if (executor == null)
|
||||
throw new ArgumentNullException(nameof(executor));
|
||||
|
||||
Log.DebugFormat("RemoveCommandExecutor: begin. commandExecutor = {0}", commandExecutor);
|
||||
Log.DebugFormat("RemoveExecutor: begin. executor = {0}", executor);
|
||||
|
||||
var notify = false;
|
||||
lock (_locker)
|
||||
{
|
||||
if (_commandExecutors.Contains(commandExecutor) == false)
|
||||
if (_executorList.Contains(executor) == false)
|
||||
{
|
||||
Log.Warn("RemoveCommandExecutor: end. Command executor is not exist in collection.");
|
||||
Log.Warn("RemoveExecutor: end. Executor is not exist in collection.");
|
||||
return;
|
||||
}
|
||||
|
||||
_commandExecutors.Remove(commandExecutor);
|
||||
if (_commandTasks.Count > 0)
|
||||
_executorList.Remove(executor);
|
||||
_executorMap.Remove(executor.Handle);
|
||||
}
|
||||
|
||||
Log.Debug("RemoveExecutor: end.");
|
||||
}
|
||||
|
||||
public MtCommandTask SendCommand(MtCommand command)
|
||||
{
|
||||
if (command == null)
|
||||
throw new ArgumentNullException(nameof(command));
|
||||
|
||||
var task = new MtCommandTask(command);
|
||||
|
||||
Log.DebugFormat("SendTask: begin. command = {0}", command);
|
||||
|
||||
ITaskExecutor executor;
|
||||
|
||||
lock (_locker)
|
||||
{
|
||||
if (_executorMap.ContainsKey(command.ExpertHandle))
|
||||
{
|
||||
notify = true;
|
||||
executor = _executorMap[command.ExpertHandle];
|
||||
}
|
||||
else
|
||||
{
|
||||
executor = _executorList.Count > 0 ? _executorList[0] : null;
|
||||
}
|
||||
}
|
||||
|
||||
commandExecutor.CommandExecuted -= CommandExecutor_CommandExecuted;
|
||||
commandExecutor.CommandManager = null;
|
||||
|
||||
if (notify)
|
||||
if (executor == null)
|
||||
{
|
||||
NotifyCommandReady();
|
||||
Log.Error("SendTask: Executor is null!");
|
||||
}
|
||||
else
|
||||
{
|
||||
executor.Execute(task);
|
||||
}
|
||||
|
||||
Log.Debug("RemoveCommandExecutor: end.");
|
||||
Log.Debug("SendTask: end.");
|
||||
|
||||
return task;
|
||||
}
|
||||
|
||||
public void EnqueueCommandTask(MtCommandTask task)
|
||||
{
|
||||
if (task == null)
|
||||
throw new ArgumentNullException(nameof(task));
|
||||
|
||||
Log.DebugFormat("EnqueueCommandTask: begin. task = {0}", task);
|
||||
|
||||
lock (_locker)
|
||||
{
|
||||
_commandTasks.Enqueue(task);
|
||||
}
|
||||
|
||||
NotifyCommandReady();
|
||||
|
||||
Log.Debug("EnqueueCommandTask: end.");
|
||||
}
|
||||
|
||||
public MtCommandTask DequeueCommandTask()
|
||||
{
|
||||
Log.Debug("DequeueCommandTask: called.");
|
||||
|
||||
lock (_locker)
|
||||
{
|
||||
return _commandTasks.Count > 0 ? _commandTasks.Dequeue() : null;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private Methods
|
||||
private void NotifyCommandReady()
|
||||
{
|
||||
Log.Debug("NotifyCommandReady: begin.");
|
||||
|
||||
var commandExecutors = new List<MtExpert>();
|
||||
lock (_locker)
|
||||
{
|
||||
commandExecutors.AddRange(_commandExecutors);
|
||||
}
|
||||
|
||||
foreach (var executor in commandExecutors)
|
||||
{
|
||||
executor.NotifyCommandReady();
|
||||
}
|
||||
|
||||
Log.DebugFormat("NotifyCommandReady: end. Notified executor count = {0}", commandExecutors.Count);
|
||||
}
|
||||
|
||||
private void CommandExecutor_CommandExecuted(object sender, EventArgs e)
|
||||
{
|
||||
Log.Debug("CommandExecutor_CommandExecuted: begin.");
|
||||
|
||||
var notify = false;
|
||||
lock (_locker)
|
||||
{
|
||||
if (_commandTasks.Count > 0)
|
||||
{
|
||||
notify = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (notify)
|
||||
{
|
||||
NotifyCommandReady();
|
||||
}
|
||||
|
||||
Log.Debug("CommandExecutor_CommandExecuted: end.");
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
+105
-78
@@ -1,37 +1,38 @@
|
||||
using System;
|
||||
using log4net;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace MTApiService
|
||||
{
|
||||
public class MtExpert
|
||||
public class MtExpert: ITaskExecutor
|
||||
{
|
||||
public delegate void MtQuoteHandler(MtExpert expert, MtQuote quote);
|
||||
public delegate void MtEventHandler(MtExpert expert, MtEvent e);
|
||||
|
||||
#region Private Fields
|
||||
private static readonly ILog Log = LogManager.GetLogger(typeof(MtExpert));
|
||||
|
||||
private readonly IMetaTraderHandler _mtHadler;
|
||||
private MtCommandTask _commandTask;
|
||||
private ICommandManager _commandManager;
|
||||
private MtCommandTask _currentTask;
|
||||
private readonly Queue<MtCommandTask> _taskQueue = new Queue<MtCommandTask>();
|
||||
private readonly object _locker = new object();
|
||||
#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;
|
||||
}
|
||||
|
||||
public void Deinit()
|
||||
public virtual void Deinit()
|
||||
{
|
||||
Log.Debug("Deinit: begin.");
|
||||
|
||||
IsEnable = false;
|
||||
FireOnDeinited();
|
||||
|
||||
Log.Debug("Deinit: end.");
|
||||
@@ -41,9 +42,8 @@ namespace MTApiService
|
||||
{
|
||||
Log.DebugFormat("SendResponse: begin. response = {0}", response);
|
||||
|
||||
_commandTask.SetResult(response);
|
||||
_commandTask = null;
|
||||
FireOnCommandExecuted();
|
||||
_currentTask.SetResult(response);
|
||||
_currentTask = null;
|
||||
|
||||
Log.Debug("SendResponse: end.");
|
||||
}
|
||||
@@ -52,20 +52,16 @@ namespace MTApiService
|
||||
{
|
||||
Log.Debug("GetCommandType: called.");
|
||||
|
||||
var commandManager = CommandManager;
|
||||
if (commandManager != null)
|
||||
{
|
||||
_commandTask = commandManager.DequeueCommandTask();
|
||||
}
|
||||
_currentTask = DequeueTask();
|
||||
|
||||
return _commandTask?.Command?.CommandType ?? 0;
|
||||
return _currentTask?.Command?.CommandType ?? 0;
|
||||
}
|
||||
|
||||
public object GetCommandParameter(int index)
|
||||
{
|
||||
Log.DebugFormat("GetCommandType: called. index = {0}", index);
|
||||
Log.DebugFormat("GetCommandParameter: called. index = {0}", index);
|
||||
|
||||
var command = _commandTask?.Command;
|
||||
var command = _currentTask?.Command;
|
||||
if (command?.Parameters != null && index >= 0 && index < command.Parameters.Count)
|
||||
{
|
||||
return command.Parameters[index];
|
||||
@@ -74,6 +70,46 @@ namespace MTApiService
|
||||
return null;
|
||||
}
|
||||
|
||||
public object GetNamedParameter(string name)
|
||||
{
|
||||
Log.DebugFormat("GetNamedParameter: called. name = {0}", name);
|
||||
|
||||
var command = _currentTask?.Command;
|
||||
if (command == null)
|
||||
{
|
||||
Log.Warn("GetNamedParameter: command is not defined in task.");
|
||||
return null;
|
||||
}
|
||||
|
||||
if (command.NamedParams == null)
|
||||
{
|
||||
Log.Warn("GetNamedParameter: NamedParams is not defined in command.");
|
||||
return null;
|
||||
}
|
||||
|
||||
return command.NamedParams[name];
|
||||
}
|
||||
|
||||
public bool ContainsNamedParameter(string name)
|
||||
{
|
||||
Log.DebugFormat("ContainsNamedParameter: called. name = {0}", name);
|
||||
|
||||
var command = _currentTask?.Command;
|
||||
if (command == null)
|
||||
{
|
||||
Log.Warn("ContainsNamedParameter: command is not defined in task.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (command.NamedParams == null)
|
||||
{
|
||||
Log.Warn("ContainsNamedParameter: NamedParams is not defined in command.");
|
||||
return false;
|
||||
}
|
||||
|
||||
return command.NamedParams.ContainsKey(name);
|
||||
}
|
||||
|
||||
public void SendEvent(MtEvent mtEvent)
|
||||
{
|
||||
Log.DebugFormat("SendEvent: begin. event = {0}", mtEvent);
|
||||
@@ -83,14 +119,38 @@ namespace MTApiService
|
||||
Log.Debug("SendEvent: end.");
|
||||
}
|
||||
|
||||
public virtual void UpdateQuote(MtQuote quote)
|
||||
{
|
||||
Log.DebugFormat("UpdateQuote: begin. quote = {0}", quote);
|
||||
|
||||
Quote = quote;
|
||||
|
||||
Log.Debug("UpdateQuote: end.");
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"ExpertHandle = {Handle}";
|
||||
return $"ExpertHandle = {Handle}, Quote = {Quote}";
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region ITaskExecutor
|
||||
|
||||
public void Execute(MtCommandTask task)
|
||||
{
|
||||
lock (_taskQueue)
|
||||
{
|
||||
_taskQueue.Enqueue(task);
|
||||
}
|
||||
|
||||
NotifyCommandReady();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
|
||||
private MtQuote _quote;
|
||||
public MtQuote Quote
|
||||
{
|
||||
@@ -101,7 +161,7 @@ namespace MTApiService
|
||||
return _quote;
|
||||
}
|
||||
}
|
||||
set
|
||||
private set
|
||||
{
|
||||
lock (_locker)
|
||||
{
|
||||
@@ -113,61 +173,34 @@ namespace MTApiService
|
||||
}
|
||||
|
||||
public int Handle { get; }
|
||||
|
||||
private bool _isEnable = true;
|
||||
public bool IsEnable
|
||||
{
|
||||
get
|
||||
{
|
||||
lock (_locker)
|
||||
{
|
||||
return _isEnable;
|
||||
}
|
||||
}
|
||||
private set
|
||||
{
|
||||
lock (_locker)
|
||||
{
|
||||
_isEnable = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public ICommandManager CommandManager
|
||||
{
|
||||
private get
|
||||
{
|
||||
lock (_locker)
|
||||
{
|
||||
return _commandManager;
|
||||
}
|
||||
}
|
||||
set
|
||||
{
|
||||
lock (_locker)
|
||||
{
|
||||
_commandManager = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IMtCommandExecutor
|
||||
public void NotifyCommandReady()
|
||||
{
|
||||
Log.Debug("NotifyCommandReady: begin.");
|
||||
|
||||
SendTickToMetaTrader();
|
||||
|
||||
Log.Debug("NotifyCommandReady: end.");
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Private Methods
|
||||
private void SendTickToMetaTrader()
|
||||
private MtCommandTask DequeueTask()
|
||||
{
|
||||
Log.Debug("DequeueTask: called.");
|
||||
|
||||
MtCommandTask task;
|
||||
int count;
|
||||
|
||||
lock (_locker)
|
||||
{
|
||||
count = _taskQueue.Count;
|
||||
task = _taskQueue.Count > 0 ? _taskQueue.Dequeue() : null;
|
||||
}
|
||||
|
||||
Log.DebugFormat("DequeueTask: end. left task count = {0}.", count);
|
||||
|
||||
return task;
|
||||
}
|
||||
|
||||
private void NotifyCommandReady()
|
||||
{
|
||||
Log.Debug("NotifyCommandReady: begin.");
|
||||
|
||||
_mtHadler.SendTickToMetaTrader(Handle);
|
||||
|
||||
Log.Debug("NotifyCommandReady: end.");
|
||||
}
|
||||
|
||||
private void FireOnQuoteChanged(MtQuote quote)
|
||||
@@ -180,22 +213,16 @@ namespace MTApiService
|
||||
Deinited?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
|
||||
private void FireOnCommandExecuted()
|
||||
{
|
||||
CommandExecuted?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
|
||||
private void FireOnMtEvent(MtEvent mtEvent)
|
||||
{
|
||||
OnMtEvent?.Invoke(this, new MtEventArgs(mtEvent));
|
||||
OnMtEvent?.Invoke(this, mtEvent);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Events
|
||||
public event EventHandler Deinited;
|
||||
public event MtQuoteHandler QuoteChanged;
|
||||
public event EventHandler CommandExecuted;
|
||||
public event EventHandler<MtEventArgs> OnMtEvent;
|
||||
public event MtEventHandler OnMtEvent;
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace MTApiService
|
||||
{
|
||||
[DataContract]
|
||||
public class MtQuote
|
||||
{
|
||||
[DataMember]
|
||||
public string Instrument { get; private set; }
|
||||
|
||||
[DataMember]
|
||||
public double Bid { get; private set; }
|
||||
|
||||
[DataMember]
|
||||
public double Ask { get; private set; }
|
||||
|
||||
public MtQuote(string instrument, double bid, double ask)
|
||||
{
|
||||
Instrument = instrument;
|
||||
Bid = bid;
|
||||
Ask = ask;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return "Instrument = " + Instrument + ", Bid = " + Bid + ", Ask = " + Ask;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,9 +9,9 @@ namespace MTApiService
|
||||
[DataMember]
|
||||
public int Action { get; set; }
|
||||
[DataMember]
|
||||
public uint Magic { get; set; }
|
||||
public ulong Magic { get; set; }
|
||||
[DataMember]
|
||||
public uint Order { get; set; }
|
||||
public ulong Order { get; set; }
|
||||
[DataMember]
|
||||
public string Symbol { get; set; }
|
||||
[DataMember]
|
||||
@@ -25,7 +25,7 @@ namespace MTApiService
|
||||
[DataMember]
|
||||
public double Tp { get; set; }
|
||||
[DataMember]
|
||||
public uint Deviation { get; set; }
|
||||
public ulong Deviation { get; set; }
|
||||
[DataMember]
|
||||
public int Type { get; set; }
|
||||
[DataMember]
|
||||
@@ -36,5 +36,9 @@ namespace MTApiService
|
||||
public DateTime Expiration { get; set; }
|
||||
[DataMember]
|
||||
public string Comment { get; set; }
|
||||
[DataMember]
|
||||
public ulong Position { get; set; }
|
||||
[DataMember]
|
||||
public ulong PositionBy { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace MTApiService
|
||||
{
|
||||
[DataContract]
|
||||
public class MtQuote
|
||||
{
|
||||
[DataMember]
|
||||
public string Instrument { get; internal set; }
|
||||
|
||||
[DataMember]
|
||||
public double Bid { get; internal set; }
|
||||
|
||||
[DataMember]
|
||||
public double Ask { get; internal set; }
|
||||
|
||||
[DataMember]
|
||||
public int ExpertHandle { get; internal set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"Instrument = {Instrument}; Bid = {Bid}; Ask = {Ask}; ExpertHandle = {ExpertHandle}";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,8 @@ namespace MTApiService
|
||||
{
|
||||
static IEnumerable<Type> GetKnownTypes()
|
||||
{
|
||||
return new Type[] { typeof(MtResponseInt), typeof(MtResponseDouble),
|
||||
return new Type[] { typeof(MtResponseObject),
|
||||
typeof(MtResponseInt), typeof(MtResponseDouble),
|
||||
typeof(MtResponseString), typeof(MtResponseBool),
|
||||
typeof(MtResponseLong), typeof(MtResponseULong),
|
||||
typeof(MtResponseDoubleArray), typeof(MtResponseIntArray),
|
||||
@@ -22,6 +23,28 @@ namespace MTApiService
|
||||
}
|
||||
|
||||
public abstract object GetValue();
|
||||
|
||||
[DataMember]
|
||||
public int ErrorCode { get; set; }
|
||||
}
|
||||
|
||||
[DataContract]
|
||||
public class MtResponseObject : MtResponse
|
||||
{
|
||||
public MtResponseObject(object value)
|
||||
{
|
||||
Value = value;
|
||||
}
|
||||
|
||||
[DataMember]
|
||||
public object Value { get; private set; }
|
||||
|
||||
public override object GetValue() { return Value; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return Value?.ToString() ?? string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
[DataContract]
|
||||
|
||||
+29
-17
@@ -21,7 +21,7 @@ namespace MTApiService
|
||||
|
||||
private readonly MtService _service;
|
||||
private readonly List<ServiceHost> _hosts = new List<ServiceHost>();
|
||||
private readonly MtCommandExecutorManager _executorManager = new MtCommandExecutorManager();
|
||||
private readonly MtExecutorManager _executorManager = new MtExecutorManager();
|
||||
private readonly List<MtExpert> _experts = new List<MtExpert>();
|
||||
#endregion
|
||||
|
||||
@@ -62,21 +62,24 @@ namespace MTApiService
|
||||
}
|
||||
|
||||
//init local pipe host
|
||||
var localUrl = CreateConnectionAddress(null, port, true);
|
||||
var localServiceHost = CreateServiceHost(localUrl, true);
|
||||
var localPipeUrl = CreateConnectionAddress(null, port, true);
|
||||
var localPipeServiceHost = CreateServiceHost(localPipeUrl, true);
|
||||
if (localPipeServiceHost != null)
|
||||
{
|
||||
_hosts.Add(localPipeServiceHost);
|
||||
}
|
||||
|
||||
//init localhost
|
||||
var localUrl = CreateConnectionAddress("localhost", port, false);
|
||||
var localServiceHost = CreateServiceHost(localUrl, false);
|
||||
if (localServiceHost != null)
|
||||
{
|
||||
_hosts.Add(localServiceHost);
|
||||
}
|
||||
|
||||
|
||||
//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)
|
||||
{
|
||||
@@ -149,7 +152,7 @@ namespace MTApiService
|
||||
_experts.Add(expert);
|
||||
}
|
||||
|
||||
_executorManager.AddCommandExecutor(expert);
|
||||
_executorManager.AddExecutor(expert);
|
||||
|
||||
_service.OnQuoteAdded(expert.Quote);
|
||||
|
||||
@@ -170,11 +173,20 @@ namespace MTApiService
|
||||
return null;
|
||||
}
|
||||
|
||||
var task = new MtCommandTask(command);
|
||||
_executorManager.EnqueueCommandTask(task);
|
||||
var task = _executorManager.SendCommand(command);
|
||||
|
||||
//wait for execute command in MetaTrader
|
||||
var response = task.WaitResult(WaitResponseTime);
|
||||
MtResponse response = null;
|
||||
try
|
||||
{
|
||||
response = task.WaitResult(WaitResponseTime);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.WarnFormat("SendCommand: Exception - {0}", ex.Message);
|
||||
}
|
||||
|
||||
Log.DebugFormat("SendCommand: end. response = {0}", response);
|
||||
|
||||
return response;
|
||||
}
|
||||
@@ -371,7 +383,7 @@ namespace MTApiService
|
||||
expertsCount = _experts.Count;
|
||||
}
|
||||
|
||||
_executorManager.RemoveCommandExecutor(expert);
|
||||
_executorManager.RemoveExecutor(expert);
|
||||
|
||||
expert.Deinited -= expert_Deinited;
|
||||
expert.QuoteChanged -= expert_QuoteChanged;
|
||||
@@ -398,11 +410,11 @@ namespace MTApiService
|
||||
Log.Debug("expert_QuoteChanged: end.");
|
||||
}
|
||||
|
||||
private void Expert_OnMtEvent(object sender, MtEventArgs e)
|
||||
private void Expert_OnMtEvent(MtExpert expert, MtEvent e)
|
||||
{
|
||||
Log.DebugFormat("Expert_OnMtEvent: begin. event = {0}", e.Event);
|
||||
Log.DebugFormat("Expert_OnMtEvent: begin. expert = {0}, event = {1}", expert, e);
|
||||
|
||||
_service.OnMtEvent(e.Event);
|
||||
_service.OnMtEvent(e);
|
||||
|
||||
Log.Debug("Expert_OnMtEvent: end.");
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ namespace MTApiService
|
||||
|
||||
if (callback == null)
|
||||
{
|
||||
Log.Warn("Connect: end. Callback is not definded.");
|
||||
Log.Warn("Connect: end. Callback is not defined.");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -158,7 +158,7 @@ namespace MTApiService
|
||||
|
||||
public void QuoteUpdate(MtQuote quote)
|
||||
{
|
||||
Log.Debug("QuoteUpdate: begin.");
|
||||
Log.DebugFormat("QuoteUpdate: begin. quote = {0}", quote);
|
||||
|
||||
ExecuteCallbackAction(a => a.OnQuoteUpdate(quote));
|
||||
|
||||
@@ -167,7 +167,7 @@ namespace MTApiService
|
||||
|
||||
public void OnQuoteAdded(MtQuote quote)
|
||||
{
|
||||
Log.Debug("OnQuoteAdded: begin.");
|
||||
Log.DebugFormat("OnQuoteAdded: begin. quote = {0}", quote);
|
||||
|
||||
ExecuteCallbackAction(a => a.OnQuoteAdded(quote));
|
||||
|
||||
@@ -176,18 +176,18 @@ namespace MTApiService
|
||||
|
||||
public void OnQuoteRemoved(MtQuote quote)
|
||||
{
|
||||
Log.Debug("OnQuoteRemoved: begin.");
|
||||
Log.DebugFormat("OnQuoteRemoved: begin. quote = {0}", quote);
|
||||
|
||||
ExecuteCallbackAction(a => a.OnQuoteRemoved(quote));
|
||||
|
||||
Log.Debug("OnQuoteRemoved: end.");
|
||||
}
|
||||
|
||||
public void OnMtEvent(MtEvent mtEvent)
|
||||
public void OnMtEvent(MtEvent e)
|
||||
{
|
||||
Log.Debug("OnMtEvent: begin.");
|
||||
Log.DebugFormat("OnMtEvent: begin.quote = {0}", e);
|
||||
|
||||
ExecuteCallbackAction(a => a.OnMtEvent(mtEvent));
|
||||
ExecuteCallbackAction(a => a.OnMtEvent(e));
|
||||
|
||||
Log.Debug("OnMtEvent: end.");
|
||||
}
|
||||
|
||||
Executable → Regular
+2
-2
@@ -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.23.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.23.0")]
|
||||
[assembly: AssemblyVersion("1.0.28.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.28.0")]
|
||||
+175
-196
@@ -4,7 +4,8 @@
|
||||
|
||||
#include "MT4Handler.h"
|
||||
#include "Windows.h"
|
||||
#include < vcclr.h >
|
||||
#include <vcclr.h>
|
||||
#include <functional>
|
||||
|
||||
using namespace System;
|
||||
using namespace MTApiService;
|
||||
@@ -17,6 +18,8 @@ using namespace System::IO;
|
||||
using namespace System::Collections::Generic;
|
||||
using namespace System::Diagnostics;
|
||||
|
||||
#define _DLLAPI extern "C" __declspec(dllexport)
|
||||
|
||||
void convertSystemString(wchar_t* dest, String^ src)
|
||||
{
|
||||
pin_ptr<const wchar_t> wch = PtrToStringChars(src);
|
||||
@@ -24,264 +27,240 @@ void convertSystemString(wchar_t* dest, String^ src)
|
||||
dest[wcslen(wch)] = '\0';
|
||||
}
|
||||
|
||||
int _stdcall initExpert(int expertHandle, int port, wchar_t* symbol, double bid, double ask, wchar_t* err)
|
||||
template <typename T> T Execute(std::function<T()> func, wchar_t* err, T default_value)
|
||||
{
|
||||
T result = default_value;
|
||||
try
|
||||
{
|
||||
MT4Handler^ mtHandler = gcnew MT4Handler();
|
||||
|
||||
MtServerInstance::GetInstance()->InitExpert(expertHandle, port, gcnew String(symbol), bid, ask, mtHandler);
|
||||
result = func();
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
convertSystemString(err, e->Message);
|
||||
Debug::WriteLine("[ERROR] MTConnector:initExpert(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return result;
|
||||
}
|
||||
|
||||
int _stdcall deinitExpert(int expertHandle, wchar_t* err)
|
||||
_DLLAPI bool _stdcall initExpert(int expertHandle, int port, wchar_t* symbol, double bid, double ask, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
MtServerInstance::GetInstance()->DeinitExpert(expertHandle);
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
convertSystemString(err, e->Message);
|
||||
Debug::WriteLine("[ERROR] MTConnector:deinitExpert(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<bool>([&expertHandle, &port, symbol, &bid, &ask]() {
|
||||
auto expert = gcnew MtExpert(expertHandle, gcnew String(symbol), bid, ask, gcnew MT4Handler());
|
||||
MtAdapter::GetInstance()->AddExpert(port, expert);
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
int _stdcall updateQuote(int expertHandle, wchar_t* symbol, double bid, double ask, wchar_t* err)
|
||||
_DLLAPI bool _stdcall deinitExpert(int expertHandle, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
MtServerInstance::GetInstance()->SendQuote(expertHandle, gcnew String(symbol), bid, ask);
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
convertSystemString(err, e->Message);
|
||||
Debug::WriteLine("[ERROR] MTConnector:updateQuote(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<bool>([&expertHandle]() {
|
||||
MtAdapter::GetInstance()->RemoveExpert(expertHandle);
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
_DLLAPI bool _stdcall updateQuote(int expertHandle, wchar_t* symbol, double bid, double ask, wchar_t* err)
|
||||
{
|
||||
return Execute<bool>([&expertHandle, symbol, &bid, &ask]() {
|
||||
MtAdapter::GetInstance()->SendQuote(expertHandle, gcnew String(symbol), bid, ask);
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
|
||||
int _stdcall sendEvent(int expertHandle, int eventType, wchar_t* payload, wchar_t* err)
|
||||
_DLLAPI bool _stdcall sendEvent(int expertHandle, int eventType, wchar_t* payload, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
MtServerInstance::GetInstance()->SendEvent(expertHandle, eventType, gcnew String(payload));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
convertSystemString(err, e->Message);
|
||||
Debug::WriteLine("[ERROR] MTConnector:updateTimeBar(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<bool>([&expertHandle, &eventType, payload]() {
|
||||
MtAdapter::GetInstance()->SendEvent(expertHandle, eventType, gcnew String(payload));
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
int _stdcall sendIntResponse(int expertHandle, int response)
|
||||
_DLLAPI bool _stdcall sendIntResponse(int expertHandle, int response, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, gcnew MtResponseInt(response));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MTConnector:sendIntResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<bool>([&expertHandle, &response]() {
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseInt(response));
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
int _stdcall sendBooleanResponse(int expertHandle, int response)
|
||||
_DLLAPI bool _stdcall sendBooleanResponse(int expertHandle, bool response, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
bool value = (response != 0) ? true : false;
|
||||
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, gcnew MtResponseBool(value));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MTConnector:sendBooleanResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<bool>([&expertHandle, &response]() {
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseBool(response));
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
int _stdcall sendDoubleResponse(int expertHandle, double response)
|
||||
_DLLAPI bool _stdcall sendDoubleResponse(int expertHandle, double response, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, gcnew MtResponseDouble(response));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MTConnector:sendDoubleResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<bool>([&expertHandle, &response]() {
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseDouble(response));
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
int _stdcall sendStringResponse(int expertHandle, wchar_t* response)
|
||||
_DLLAPI bool _stdcall sendStringResponse(int expertHandle, wchar_t* response, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, gcnew MtResponseString(gcnew String(response)));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MTConnector:sendStringResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<bool>([&expertHandle, response]() {
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseString(gcnew String(response)));
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
int _stdcall sendVoidResponse(int expertHandle)
|
||||
_DLLAPI bool _stdcall sendErrorResponse(int expertHandle, int code, wchar_t* message, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, nullptr);
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MTConnector:sendVoidResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<bool>([&expertHandle, &code, message]() {
|
||||
MtResponseString^ res = gcnew MtResponseString(gcnew String(message));
|
||||
res->ErrorCode = code;
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, res);
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
int _stdcall sendDoubleArrayResponse(int expertHandle, double* values, int size)
|
||||
_DLLAPI bool _stdcall sendVoidResponse(int expertHandle, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
return Execute<bool>([&expertHandle]() {
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseObject(nullptr));
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
_DLLAPI bool _stdcall sendDoubleArrayResponse(int expertHandle, double* values, int size, wchar_t* err)
|
||||
{
|
||||
return Execute<bool>([&expertHandle, values, &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];
|
||||
}
|
||||
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, gcnew MtResponseDoubleArray(list));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MTConnector:sendDoubleArrayResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseDoubleArray(list));
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
int _stdcall sendIntArrayResponse(int expertHandle, int* values, int size)
|
||||
_DLLAPI bool _stdcall sendIntArrayResponse(int expertHandle, int* values, int size, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
return Execute<bool>([&expertHandle, values, &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];
|
||||
}
|
||||
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, gcnew MtResponseIntArray(list));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MTConnector:sendIntArrayResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseIntArray(list));
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
int _stdcall sendLongResponse(int expertHandle, __int64 response)
|
||||
_DLLAPI bool _stdcall sendLongResponse(int expertHandle, __int64 response, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
MtServerInstance::GetInstance()->SendResponse(expertHandle, gcnew MtResponseLong(response));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MTConnector:sendLongResponse(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<bool>([&expertHandle, &response]() {
|
||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseLong(response));
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
int _stdcall getCommandType(int expertHandle, int* res)
|
||||
_DLLAPI bool _stdcall getCommandType(int expertHandle, int* res, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
*res = MtServerInstance::GetInstance()->GetCommandType(expertHandle);
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MTConnector:getCommandType(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<bool>([&expertHandle, res]() {
|
||||
*res = MtAdapter::GetInstance()->GetCommandType(expertHandle);
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
int _stdcall getIntValue(int expertHandle, int paramIndex, int* res)
|
||||
_DLLAPI bool _stdcall getIntValue(int expertHandle, int paramIndex, int* res, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
*res = (int)MtServerInstance::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MTConnector:getIntValue(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<bool>([&expertHandle, ¶mIndex, res]() {
|
||||
*res = (int)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
int _stdcall getDoubleValue(int expertHandle, int paramIndex, double* res)
|
||||
// --- index parameters
|
||||
|
||||
_DLLAPI bool _stdcall getDoubleValue(int expertHandle, int paramIndex, double* res, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
*res = (double)MtServerInstance::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MTConnector:getDoubleValue(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<bool>([&expertHandle, ¶mIndex, res]() {
|
||||
*res = (double)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
int _stdcall getStringValue(int expertHandle, int paramIndex, wchar_t* res)
|
||||
_DLLAPI bool _stdcall getStringValue(int expertHandle, int paramIndex, wchar_t* res, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
convertSystemString(res, (String^)MtServerInstance::GetInstance()->GetCommandParameter(expertHandle, paramIndex));
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MTConnector:getStringValue(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<bool>([&expertHandle, ¶mIndex, res]() {
|
||||
convertSystemString(res, (String^)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex));
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
int _stdcall getBooleanValue(int expertHandle, int paramIndex, int* res)
|
||||
_DLLAPI bool _stdcall getBooleanValue(int expertHandle, int paramIndex, int* res, wchar_t* err)
|
||||
{
|
||||
try
|
||||
{
|
||||
bool val = (bool)MtServerInstance::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||
*res = val == true ? 1 : 0;
|
||||
}
|
||||
catch (Exception^ e)
|
||||
{
|
||||
Debug::WriteLine("[ERROR] MT5Connector:getBooleanValue(): " + e->Message);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return Execute<bool>([&expertHandle, ¶mIndex, res]() {
|
||||
*res = (bool)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
_DLLAPI bool _stdcall getLongValue(int expertHandle, int paramIndex, __int64* res, wchar_t* err)
|
||||
{
|
||||
return Execute<bool>([&expertHandle, ¶mIndex, res]() {
|
||||
*res = (__int64)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
// --- named parameters
|
||||
|
||||
_DLLAPI bool _stdcall containsNamedValue(int expertHandle, wchar_t* paramName)
|
||||
{
|
||||
wchar_t err[1000];
|
||||
return Execute<bool>([&expertHandle, paramName]() {
|
||||
return MtAdapter::GetInstance()->ContainsNamedParameter(expertHandle, gcnew String(paramName));
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
_DLLAPI bool _stdcall getNamedIntValue(int expertHandle, wchar_t* paramName, int* res, wchar_t* err)
|
||||
{
|
||||
return Execute<bool>([&expertHandle, paramName, res]() {
|
||||
System::Object^ obj = MtAdapter::GetInstance()->GetNamedParameter(expertHandle, gcnew String(paramName));
|
||||
*res = (int)obj;
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
_DLLAPI bool _stdcall getNamedDoubleValue(int expertHandle, wchar_t* paramName, double* res, wchar_t* err)
|
||||
{
|
||||
return Execute<bool>([&expertHandle, paramName, res]() {
|
||||
System::Object^ obj = MtAdapter::GetInstance()->GetNamedParameter(expertHandle, gcnew String(paramName));
|
||||
*res = (double)obj;
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
_DLLAPI bool _stdcall getNamedStringValue(int expertHandle, wchar_t* paramName, wchar_t* res, wchar_t* err)
|
||||
{
|
||||
return Execute<bool>([&expertHandle, paramName, res]() {
|
||||
System::Object^ obj = MtAdapter::GetInstance()->GetNamedParameter(expertHandle, gcnew String(paramName));
|
||||
convertSystemString(res, (String^)obj);
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
_DLLAPI bool _stdcall getNamedBooleanValue(int expertHandle, wchar_t* paramName, int* res, wchar_t* err)
|
||||
{
|
||||
return Execute<bool>([&expertHandle, paramName, res]() {
|
||||
System::Object^ obj = MtAdapter::GetInstance()->GetNamedParameter(expertHandle, gcnew String(paramName));
|
||||
*res = (bool)obj;
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
|
||||
_DLLAPI bool _stdcall getNamedLongValue(int expertHandle, wchar_t* paramName, __int64* res, wchar_t* err)
|
||||
{
|
||||
return Execute<bool>([&expertHandle, paramName, res]() {
|
||||
System::Object^ obj = MtAdapter::GetInstance()->GetNamedParameter(expertHandle, gcnew String(paramName));
|
||||
if (obj != nullptr)
|
||||
*res = (__int64)obj;
|
||||
return true;
|
||||
}, err, false);
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
LIBRARY MTConnector
|
||||
|
||||
EXPORTS initExpert
|
||||
deinitExpert
|
||||
updateQuote
|
||||
sendEvent
|
||||
sendIntResponse
|
||||
sendBooleanResponse
|
||||
sendDoubleResponse
|
||||
sendStringResponse
|
||||
sendVoidResponse
|
||||
sendDoubleArrayResponse
|
||||
sendIntArrayResponse
|
||||
sendLongResponse
|
||||
getCommandType
|
||||
getIntValue
|
||||
getDoubleValue
|
||||
getStringValue
|
||||
getBooleanValue
|
||||
@@ -96,7 +96,6 @@
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>user32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>.\MTConnector.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
@@ -109,7 +108,6 @@
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>user32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>.\MTConnector.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
@@ -121,7 +119,6 @@
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>user32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>.\MTConnector.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
@@ -133,7 +130,6 @@
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>user32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>.\MTConnector.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
@@ -154,7 +150,6 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.ico" />
|
||||
<None Include="MTConnector.def" />
|
||||
<None Include="ReadMe.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -44,9 +44,6 @@
|
||||
<None Include="app.ico">
|
||||
<Filter>Resource Files</Filter>
|
||||
</None>
|
||||
<None Include="MTConnector.def">
|
||||
<Filter>Source Files</Filter>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="app.rc">
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
using System;
|
||||
|
||||
namespace MtApi
|
||||
{
|
||||
public class ChartEventArgs : EventArgs
|
||||
{
|
||||
internal ChartEventArgs(int expertHandle, MtChartEvent chartEvent)
|
||||
{
|
||||
ExpertHandle = expertHandle;
|
||||
ChartId = chartEvent.ChartId;
|
||||
EventId = chartEvent.EventId;
|
||||
Lparam = chartEvent.Lparam;
|
||||
Dparam = chartEvent.Dparam;
|
||||
Sparam = chartEvent.Sparam;
|
||||
}
|
||||
|
||||
public int ExpertHandle { get; }
|
||||
public long ChartId { get; }
|
||||
public int EventId { get; }
|
||||
public long Lparam { get; }
|
||||
public double Dparam { get; }
|
||||
public string Sparam { get; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace MtApi
|
||||
{
|
||||
public enum EnumAlignMode
|
||||
{
|
||||
ALIGN_LEFT = 1,
|
||||
ALIGN_CENTER = 2,
|
||||
ALIGN_RIGHT = 0
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
namespace MtApi
|
||||
{
|
||||
public enum EnumChartEvent
|
||||
{
|
||||
CHARTEVENT_KEYDOWN = 0,
|
||||
CHARTEVENT_MOUSE_MOVE = 10,
|
||||
CHARTEVENT_OBJECT_CREATE = 7,
|
||||
CHARTEVENT_OBJECT_CHANGE = 8,
|
||||
CHARTEVENT_OBJECT_DELETE = 6,
|
||||
CHARTEVENT_CLICK = 4,
|
||||
CHARTEVENT_OBJECT_CLICK = 1,
|
||||
CHARTEVENT_OBJECT_DRAG = 2,
|
||||
CHARTEVENT_OBJECT_ENDEDIT = 3,
|
||||
CHARTEVENT_CHART_CHANGE = 9,
|
||||
CHARTEVENT_CUSTOM = 1000,
|
||||
CHARTEVENT_CUSTOM_LAST = 66534
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
namespace MtApi
|
||||
{
|
||||
public enum EnumChartPropertyDouble
|
||||
{
|
||||
CHART_SHIFT_SIZE = 3,
|
||||
CHART_FIXED_POSITION = 41,
|
||||
CHART_FIXED_MAX = 8,
|
||||
CHART_FIXED_MIN = 9,
|
||||
CHART_POINTS_PER_BAR = 11,
|
||||
CHART_PRICE_MIN = 108,
|
||||
CHART_PRICE_MAX = 109
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
namespace MtApi
|
||||
{
|
||||
public enum EnumChartPropertyInteger
|
||||
{
|
||||
CHART_BRING_TO_TOP = 35,
|
||||
CHART_MOUSE_SCROLL = 42,
|
||||
CHART_EVENT_MOUSE_MOVE = 40,
|
||||
CHART_EVENT_OBJECT_CREATE = 38,
|
||||
CHART_EVENT_OBJECT_DELETE = 39,
|
||||
CHART_MODE = 0,
|
||||
CHART_FOREGROUND = 1,
|
||||
CHART_SHIFT = 2,
|
||||
CHART_AUTOSCROLL = 4,
|
||||
CHART_QUICK_NAVIGATION = 45,
|
||||
CHART_SCALE = 5,
|
||||
CHART_SCALEFIX = 6,
|
||||
CHART_SCALEFIX_11 = 7,
|
||||
CHART_SCALE_PT_PER_BAR = 10,
|
||||
CHART_SHOW_OHLC = 12,
|
||||
CHART_SHOW_BID_LINE = 13,
|
||||
CHART_SHOW_ASK_LINE = 14,
|
||||
CHART_SHOW_LAST_LINE = 15,
|
||||
CHART_SHOW_PERIOD_SEP = 16,
|
||||
CHART_SHOW_GRID = 17,
|
||||
CHART_SHOW_VOLUMES = 18,
|
||||
CHART_SHOW_OBJECT_DESCR = 19,
|
||||
CHART_VISIBLE_BARS = 100,
|
||||
CHART_WINDOWS_TOTAL = 101,
|
||||
CHART_WINDOW_IS_VISIBLE = 102,
|
||||
CHART_WINDOW_HANDLE = 103,
|
||||
CHART_WINDOW_YDISTANCE = 110,
|
||||
CHART_FIRST_VISIBLE_BAR = 104,
|
||||
CHART_WIDTH_IN_BARS = 105,
|
||||
CHART_WIDTH_IN_PIXELS = 106,
|
||||
CHART_HEIGHT_IN_PIXELS = 107,
|
||||
CHART_COLOR_BACKGROUND = 21,
|
||||
CHART_COLOR_FOREGROUND = 22,
|
||||
CHART_COLOR_GRID = 23,
|
||||
CHART_COLOR_VOLUME = 24,
|
||||
CHART_COLOR_CHART_UP = 25,
|
||||
CHART_COLOR_CHART_DOWN = 26,
|
||||
CHART_COLOR_CHART_LINE = 27,
|
||||
CHART_COLOR_CANDLE_BULL = 28,
|
||||
CHART_COLOR_CANDLE_BEAR = 29,
|
||||
CHART_COLOR_BID = 30,
|
||||
CHART_COLOR_ASK = 31,
|
||||
CHART_COLOR_LAST = 32,
|
||||
CHART_COLOR_STOP_LEVEL = 33,
|
||||
CHART_SHOW_TRADE_LEVELS = 34,
|
||||
CHART_DRAG_TRADE_LEVELS = 43,
|
||||
CHART_SHOW_DATE_SCALE = 36,
|
||||
CHART_SHOW_PRICE_SCALE = 37,
|
||||
CHART_IS_OFFLINE = 112
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace MtApi
|
||||
{
|
||||
public enum EnumChartPropertyString
|
||||
{
|
||||
CHART_COMMENT = 20
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace MtApi
|
||||
{
|
||||
enum EnumColorFormat
|
||||
{
|
||||
COLOR_FORMAT_XRGB_NOALPHA = 0, //The component of the alpha channel is ignored
|
||||
COLOR_FORMAT_ARGB_RAW = 1, //Color components are not handled by the terminal (must be correctly set by the user)
|
||||
COLOR_FORMAT_ARGB_NORMALIZE = 2 //Color components are handled by the terminal
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
namespace MtApi
|
||||
{
|
||||
public enum EnumObject
|
||||
{
|
||||
OBJ_VLINE = 0, //Vertical Line
|
||||
OBJ_HLINE = 1, //Horizontal Line
|
||||
OBJ_TREND = 2, //Trend Line
|
||||
BJ_TRENDBYANGLE = 3, //Trend Line By Angle
|
||||
OBJ_CYCLES = 20, //Cycle Lines
|
||||
OBJ_CHANNEL = 5, //Equidistant Channel
|
||||
OBJ_STDDEVCHANNEL = 6, //Standard Deviation Channel
|
||||
OBJ_REGRESSION = 4, //Linear Regression Channel
|
||||
OBJ_PITCHFORK = 19, //Andrews Pitchfork
|
||||
OBJ_GANNLINE = 7, //Gann Line
|
||||
OBJ_GANNFAN = 8, //Gann Fan
|
||||
OBJ_GANNGRID = 9, //Gann Grid
|
||||
OBJ_FIBO = 10, //Fibonacci Retracement
|
||||
OBJ_FIBOTIMES = 11, //Fibonacci Time Zones
|
||||
OBJ_FIBOFAN = 12, //Fibonacci Fan
|
||||
OBJ_FIBOARC = 13, //Fibonacci Arcs
|
||||
OBJ_FIBOCHANNEL = 15, //Fibonacci Channel
|
||||
OBJ_EXPANSION = 14, //Fibonacci Expansion
|
||||
OBJ_RECTANGLE = 16, //Rectangle
|
||||
OBJ_TRIANGLE = 17, //Triangle
|
||||
OBJ_ELLIPSE = 18, //Ellipse
|
||||
OBJ_ARROW_THUMB_UP = 29, //Thumbs Up
|
||||
OBJ_ARROW_THUMB_DOWN = 30, //Thumbs Down
|
||||
OBJ_ARROW_UP = 31, //Arrow Up
|
||||
OBJ_ARROW_DOWN = 32, //Arrow Down
|
||||
OBJ_ARROW_STOP = 33, //Stop Sign
|
||||
OBJ_ARROW_CHECK = 34, //Check Sign
|
||||
OBJ_ARROW_LEFT_PRICE = 35, //Left Price Label
|
||||
OBJ_ARROW_RIGHT_PRICE = 36, //Right Price Label
|
||||
OBJ_ARROW_BUY = 37, //Buy Sign
|
||||
OBJ_ARROW_SELL = 38, //Sell Sign
|
||||
OBJ_ARROW = 22, //Arrow
|
||||
OBJ_TEXT = 21, //Text
|
||||
OBJ_LABEL = 23, //Label
|
||||
OBJ_BUTTON = 25, //Button
|
||||
OBJ_BITMAP = 26, //Bitmap
|
||||
OBJ_BITMAP_LABEL = 24, //Bitmap Label
|
||||
OBJ_EDIT = 27, //Edit
|
||||
OBJ_EVENT = 42, //The "Event" object corresponding to an event in the economic calendar
|
||||
OBJ_RECTANGLE_LABEL = 28 //The "Rectangle label" object for creating and designing the custom graphical interface.
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
namespace MtApi
|
||||
{
|
||||
public enum EnumObjectPropertyDouble
|
||||
{
|
||||
OBJPROP_PRICE = 20, // Price coordinate
|
||||
OBJPROP_LEVELVALUE = 204, // Level value
|
||||
OBJPROP_SCALE = 12, // Scale (properties of Gann objects, Fibonacci Arcs and Ellipse)
|
||||
OBJPROP_ANGLE = 13, // Angle. For the objects with no angle specified, created from a program, the value is equal to EMPTY_VALUE
|
||||
OBJPROP_DEVIATION = 16, // Deviation for the Standard Deviation Channel
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
namespace MtApi
|
||||
{
|
||||
public enum EnumObjectPropertyInteger
|
||||
{
|
||||
OBJPROP_COLOR = 6,
|
||||
OBJPROP_STYLE = 7,
|
||||
OBJPROP_WIDTH = 8,
|
||||
OBJPROP_BACK = 9,
|
||||
OBJPROP_ZORDER = 207,
|
||||
OBJPROP_HIDDEN = 208,
|
||||
OBJPROP_SELECTED = 17,
|
||||
OBJPROP_READONLY = 1028,
|
||||
OBJPROP_TYPE = 18,
|
||||
OBJPROP_TIME = 19,
|
||||
OBJPROP_SELECTABLE = 1000,
|
||||
OBJPROP_CREATETIME = 998,
|
||||
OBJPROP_LEVELS = 200,
|
||||
OBJPROP_LEVELCOLOR = 201,
|
||||
OBJPROP_LEVELSTYLE = 202,
|
||||
OBJPROP_LEVELWIDTH = 203,
|
||||
OBJPROP_ALIGN = 1036,
|
||||
OBJPROP_FONTSIZE = 100,
|
||||
OBJPROP_RAY_RIGHT = 1004,
|
||||
OBJPROP_ELLIPSE = 11,
|
||||
OBJPROP_ARROWCODE = 14,
|
||||
OBJPROP_TIMEFRAMES = 15,
|
||||
OBJPROP_ANCHOR = 1011,
|
||||
OBJPROP_XDISTANCE = 102,
|
||||
OBJPROP_YDISTANCE = 103,
|
||||
OBJPROP_STATE = 1018,
|
||||
OBJPROP_XSIZE = 1019,
|
||||
OBJPROP_YSIZE = 1020,
|
||||
OBJPROP_XOFFSET = 1033,
|
||||
OBJPROP_YOFFSET = 1034,
|
||||
OBJPROP_BGCOLOR = 1025,
|
||||
OBJPROP_CORNER = 101,
|
||||
OBJPROP_BORDER_TYPE = 1029,
|
||||
OBJPROP_BORDER_COLOR = 1035
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
namespace MtApi
|
||||
{
|
||||
public enum EnumObjectPropertyString
|
||||
{
|
||||
OBJPROP_NAME = 1037,
|
||||
OBJPROP_TEXT = 999,
|
||||
OBJPROP_TOOLTIP = 206,
|
||||
OBJPROP_LEVELTEXT = 205,
|
||||
OBJPROP_FONT = 1001,
|
||||
OBJPROP_BMPFILE = 1017,
|
||||
OBJPROP_SYMBOL = 1021
|
||||
}
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MtApi
|
||||
{
|
||||
static class ExtensionMethods
|
||||
{
|
||||
#region Event Methods
|
||||
|
||||
public static Task FireEventAsync(this MtApiQuoteHandler evenHandler, object sender, string symbol, double bid, double ask)
|
||||
{
|
||||
return Task.Factory.StartNew(() =>
|
||||
{
|
||||
evenHandler?.Invoke(sender, symbol, bid, ask);
|
||||
});
|
||||
}
|
||||
|
||||
public static Task FireEventAsync(this EventHandler eventHandler, object sender)
|
||||
{
|
||||
return Task.Factory.StartNew(() =>
|
||||
{
|
||||
eventHandler?.Invoke(sender, EventArgs.Empty);
|
||||
});
|
||||
}
|
||||
|
||||
public static Task FireEventAsync<T>(this EventHandler<T> eventHandler, object sender, T e)
|
||||
where T : EventArgs
|
||||
{
|
||||
return Task.Factory.StartNew(() =>
|
||||
{
|
||||
eventHandler?.Invoke(sender, e);
|
||||
});
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public static MtQuote Convert(this MTApiService.MtQuote quote)
|
||||
{
|
||||
return (quote != null) ? new MtQuote(quote.Instrument, quote.Bid, quote.Ask) : null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
using System;
|
||||
|
||||
namespace MtApi
|
||||
{
|
||||
[Flags]
|
||||
public enum FlagFontStyle
|
||||
{
|
||||
//Flags for specifying font style
|
||||
FONT_ITALIC = -2147483648,
|
||||
FONT_UNDERLINE = 1073741824,
|
||||
FONT_STRIKEOUT = 536870912,
|
||||
|
||||
//Flags for specifying font width
|
||||
FW_DONTCARE = 0,
|
||||
FW_THIN = 1,
|
||||
FW_EXTRALIGHT = 2,
|
||||
FW_ULTRALIGHT = 3,
|
||||
FW_LIGHT = 4,
|
||||
FW_NORMAL = 5,
|
||||
FW_REGULAR = 6,
|
||||
FW_MEDIUM = 7,
|
||||
FW_SEMIBOLD = 8,
|
||||
FW_DEMIBOLD = 9,
|
||||
FW_BOLD = 10,
|
||||
FW_EXTRABOLD = 11,
|
||||
FW_ULTRABOLD = 12,
|
||||
FW_HEAVY = 13,
|
||||
FW_BLACK = 14
|
||||
}
|
||||
}
|
||||
+12
-1
@@ -58,16 +58,27 @@
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="ChartEventArgs.cs" />
|
||||
<Compile Include="ChartPeriod.cs" />
|
||||
<Compile Include="EnumAlignMode.cs" />
|
||||
<Compile Include="EnumChartPropertyDouble.cs" />
|
||||
<Compile Include="EnumChartPropertyInteger.cs" />
|
||||
<Compile Include="EnumChartPropertyString.cs" />
|
||||
<Compile Include="EnumColorFormat.cs" />
|
||||
<Compile Include="EnumObject.cs" />
|
||||
<Compile Include="EnumObjectPropertyDouble.cs" />
|
||||
<Compile Include="EnumObjectPropertyInteger.cs" />
|
||||
<Compile Include="EnumObjectPropertyString.cs" />
|
||||
<Compile Include="EnumSeriesInfoInteger.cs" />
|
||||
<Compile Include="EnumSymbolInfoDouble.cs" />
|
||||
<Compile Include="EnumSymbolInfoInteger.cs" />
|
||||
<Compile Include="EnumTerminalInfoDouble.cs" />
|
||||
<Compile Include="EnumTerminalInfoInteger.cs" />
|
||||
<Compile Include="ExtensionMethods.cs" />
|
||||
<Compile Include="FlagFontStyle.cs" />
|
||||
<Compile Include="Monitors\AvailabilityOrdersEventArgs.cs" />
|
||||
<Compile Include="MqlRates.cs" />
|
||||
<Compile Include="MqlTick.cs" />
|
||||
<Compile Include="MtChartEvent.cs" />
|
||||
<Compile Include="MtConnectionEventArgs.cs" />
|
||||
<Compile Include="MtConnectionException.cs" />
|
||||
<Compile Include="MtConnectionState.cs" />
|
||||
|
||||
+1320
-121
File diff suppressed because it is too large
Load Diff
@@ -13,9 +13,9 @@ namespace MtApi
|
||||
return Color.FromArgb((byte)(color), (byte)(color >> 8), (byte)(color >> 16));
|
||||
}
|
||||
|
||||
public static int ConvertToMtColor(Color color)
|
||||
public static int ConvertToMtColor(Color? color)
|
||||
{
|
||||
return color == Color.Empty ? 0xffffff : (Color.FromArgb(color.B, color.G, color.R).ToArgb() & 0xffffff);
|
||||
return color == null || color == Color.Empty ? 0xffffff : (Color.FromArgb(color.Value.B, color.Value.G, color.Value.R).ToArgb() & 0xffffff);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,13 +13,13 @@ namespace MtApi
|
||||
return new DateTime(tmpTime.Ticks + (time * 0x989680L));
|
||||
}
|
||||
|
||||
public static int ConvertToMtTime(DateTime time)
|
||||
public static int ConvertToMtTime(DateTime? time)
|
||||
{
|
||||
int result = 0;
|
||||
if (time != DateTime.MinValue)
|
||||
if (time != null && time != DateTime.MinValue)
|
||||
{
|
||||
DateTime tmpTime = new DateTime(1970, 1, 1);
|
||||
result = (int)((time.Ticks - tmpTime.Ticks) / 0x989680L);
|
||||
result = (int)((time.Value.Ticks - tmpTime.Ticks) / 0x989680L);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
namespace MtApi
|
||||
{
|
||||
internal class MtChartEvent
|
||||
{
|
||||
public long ChartId { get; set; }
|
||||
public int EventId { get; set; }
|
||||
public long Lparam { get; set; }
|
||||
public double Dparam { get; set; }
|
||||
public string Sparam { get; set; }
|
||||
}
|
||||
}
|
||||
Executable → Regular
+86
-9
@@ -1,9 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace MtApi
|
||||
namespace MtApi
|
||||
{
|
||||
enum MtCommandType
|
||||
{
|
||||
@@ -116,6 +111,7 @@ namespace MtApi
|
||||
TimeSeconds = 86,
|
||||
TimeYear = 87,
|
||||
Year = 88,
|
||||
TimeGMT = 281,
|
||||
|
||||
//Global Variables
|
||||
GlobalVariableCheck = 89,
|
||||
@@ -140,8 +136,8 @@ namespace MtApi
|
||||
iBullsPower = 106,
|
||||
iCCI = 107,
|
||||
iCCIOnArray = 108,
|
||||
iCustom = 109,
|
||||
iCustom_d = 10109,
|
||||
//iCustom = 109,
|
||||
//iCustom_d = 10109,
|
||||
iDeMarker = 110,
|
||||
iEnvelopes = 111,
|
||||
iEnvelopesOnArray = 112,
|
||||
@@ -201,6 +197,87 @@ namespace MtApi
|
||||
SymbolsTotal = 200,
|
||||
SymbolName = 201,
|
||||
SymbolSelect = 202,
|
||||
SymbolInfoInteger = 203
|
||||
SymbolInfoInteger = 203,
|
||||
|
||||
//Object Functions
|
||||
ObjectCreate = 208,
|
||||
ObjectName = 209,
|
||||
ObjectDelete = 210,
|
||||
ObjectsDeleteAll = 211,
|
||||
ObjectFind = 212,
|
||||
ObjectGetTimeByValue = 213,
|
||||
ObjectGetValueByTime = 214,
|
||||
ObjectMove = 215,
|
||||
ObjectsTotal = 216,
|
||||
ObjectGetDouble = 217,
|
||||
ObjectGetInteger = 218,
|
||||
ObjectGetString = 219,
|
||||
ObjectSetDouble = 220,
|
||||
ObjectSetInteger = 221,
|
||||
ObjectSetString = 222,
|
||||
TextSetFont = 223,
|
||||
TextOut = 224,
|
||||
TextGetSize = 225,
|
||||
ObjectDescription = 226,
|
||||
ObjectGet = 227,
|
||||
ObjectGetFiboDescription = 228,
|
||||
ObjectGetShiftByValue = 229,
|
||||
ObjectGetValueByShift = 230,
|
||||
ObjectSet = 231,
|
||||
ObjectSetFiboDescription = 232,
|
||||
ObjectSetText = 233,
|
||||
ObjectType = 234,
|
||||
|
||||
UnlockTicks = 235,
|
||||
|
||||
//Chart Operations
|
||||
ChartId = 206,
|
||||
ChartRedraw = 207,
|
||||
ChartApplyTemplate = 236,
|
||||
ChartSaveTemplate = 237,
|
||||
ChartWindowFind = 238,
|
||||
ChartTimePriceToXY = 239,
|
||||
ChartXYToTimePrice = 240,
|
||||
ChartOpen = 241,
|
||||
ChartFirst = 242,
|
||||
ChartNext = 243,
|
||||
ChartClose = 244,
|
||||
ChartSymbol = 245,
|
||||
ChartPeriod = 246,
|
||||
ChartSetDouble = 247,
|
||||
ChartSetInteger = 248,
|
||||
ChartSetString = 249,
|
||||
ChartGetDouble = 250,
|
||||
ChartGetInteger = 251,
|
||||
ChartGetString = 252,
|
||||
ChartNavigate = 253,
|
||||
ChartIndicatorDelete = 254,
|
||||
ChartIndicatorName = 255,
|
||||
ChartIndicatorsTotal = 256,
|
||||
ChartWindowOnDropped = 257,
|
||||
ChartPriceOnDropped = 258,
|
||||
ChartTimeOnDropped = 259,
|
||||
ChartXOnDropped = 260,
|
||||
ChartYOnDropped = 261,
|
||||
ChartSetSymbolPeriod = 262,
|
||||
ChartScreenShot = 263,
|
||||
WindowBarsPerChart = 264,
|
||||
WindowExpertName = 265,
|
||||
WindowFind = 266,
|
||||
WindowFirstVisibleBar = 267,
|
||||
WindowHandle = 268,
|
||||
WindowIsVisible = 269,
|
||||
WindowOnDropped = 270,
|
||||
WindowPriceMax = 271,
|
||||
WindowPriceMin = 272,
|
||||
WindowPriceOnDropped = 273,
|
||||
WindowRedraw = 274,
|
||||
WindowScreenShot = 275,
|
||||
WindowTimeOnDropped = 276,
|
||||
WindowsTotal = 277,
|
||||
WindowXOnDropped = 278,
|
||||
WindowYOnDropped = 279,
|
||||
|
||||
ChangeAccount = 280
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,11 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace MtApi
|
||||
{
|
||||
public class MtConnectionEventArgs: EventArgs
|
||||
{
|
||||
public MtConnectionState Status { get; private set; }
|
||||
public String ConnectionMessage { get; private set; }
|
||||
public string ConnectionMessage { get; private set; }
|
||||
|
||||
public MtConnectionEventArgs(MtConnectionState status, string message)
|
||||
{
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
{
|
||||
public enum MtEventTypes
|
||||
{
|
||||
LastTimeBar = 1
|
||||
LastTimeBar = 1,
|
||||
ChartEvent = 2
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
public string Instrument { get; private set; }
|
||||
public double Bid { get; private set; }
|
||||
public double Ask { get; private set; }
|
||||
public int ExpertHandle { get; private set; }
|
||||
|
||||
public MtQuote(string instrument, double bid, double ask)
|
||||
{
|
||||
@@ -12,5 +13,13 @@
|
||||
Bid = bid;
|
||||
Ask = ask;
|
||||
}
|
||||
|
||||
internal MtQuote(MTApiService.MtQuote quote)
|
||||
{
|
||||
Instrument = quote.Instrument;
|
||||
Bid = quote.Bid;
|
||||
Ask = quote.Ask;
|
||||
ExpertHandle = quote.ExpertHandle;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace MtApi
|
||||
{
|
||||
|
||||
+2
-11
@@ -11,16 +11,7 @@ namespace MtApi
|
||||
public double Close { get; set; }
|
||||
public double High { get; set; }
|
||||
public double Low { get; set; }
|
||||
|
||||
public DateTime OpenTime
|
||||
{
|
||||
get { return MtApiTimeConverter.ConvertFromMtTime(MtOpenTime); }
|
||||
}
|
||||
|
||||
public DateTime CloseTime
|
||||
{
|
||||
get { return MtApiTimeConverter.ConvertFromMtTime(MtCloseTime); }
|
||||
}
|
||||
|
||||
public DateTime OpenTime => MtApiTimeConverter.ConvertFromMtTime(MtOpenTime);
|
||||
public DateTime CloseTime => MtApiTimeConverter.ConvertFromMtTime(MtCloseTime);
|
||||
}
|
||||
}
|
||||
|
||||
Executable → Regular
+2
-2
@@ -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.32.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.32.0")]
|
||||
[assembly: AssemblyVersion("1.0.40.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.40.0")]
|
||||
@@ -1,18 +1,21 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MtApi
|
||||
{
|
||||
public class TimeBarArgs: EventArgs
|
||||
{
|
||||
internal TimeBarArgs(int expertHandle, MtTimeBar timeBar)
|
||||
: this(timeBar)
|
||||
{
|
||||
ExpertHandle = expertHandle;
|
||||
}
|
||||
|
||||
public TimeBarArgs(MtTimeBar timeBar)
|
||||
{
|
||||
TimeBar = timeBar;
|
||||
}
|
||||
|
||||
public MtTimeBar TimeBar { get; private set; }
|
||||
public int ExpertHandle { get; }
|
||||
public MtTimeBar TimeBar { get; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace MtApi5
|
||||
{
|
||||
internal static class ExtensionMethods
|
||||
{
|
||||
#region Event Methods
|
||||
public static void FireEvent(this EventHandler eventHandler, object sender)
|
||||
{
|
||||
eventHandler?.Invoke(sender, EventArgs.Empty);
|
||||
}
|
||||
|
||||
public static void FireEvent<T>(this EventHandler<T> eventHandler, object sender, T e)
|
||||
where T : EventArgs
|
||||
{
|
||||
eventHandler?.Invoke(sender, e);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace MtApi5
|
||||
namespace MtApi5
|
||||
{
|
||||
public class MqlTradeCheckResult
|
||||
{
|
||||
|
||||
@@ -5,7 +5,7 @@ namespace MtApi5
|
||||
public class MqlTradeRequest
|
||||
{
|
||||
public ENUM_TRADE_REQUEST_ACTIONS Action { get; set; } // Trade operation type
|
||||
public uint Magic { get; set; } // Expert Advisor ID (magic number)
|
||||
public ulong Magic { get; set; } // Expert Advisor ID (magic number)
|
||||
public ulong Order { get; set; } // Order ticket
|
||||
public string Symbol { get; set; } // Trade symbol
|
||||
public double Volume { get; set; } // Requested volume for a deal in lots
|
||||
@@ -13,11 +13,13 @@ namespace MtApi5
|
||||
public double Stoplimit { get; set; } // StopLimit level of the order
|
||||
public double Sl { get; set; } // Stop Loss level of the order
|
||||
public double Tp { get; set; } // Take Profit level of the order
|
||||
public uint Deviation { get; set; } // Maximal possible deviation from the requested price
|
||||
public ulong Deviation { get; set; } // Maximal possible deviation from the requested price
|
||||
public ENUM_ORDER_TYPE Type { get; set; } // Order type
|
||||
public ENUM_ORDER_TYPE_FILLING Type_filling { get; set; } // Order execution type
|
||||
public ENUM_ORDER_TYPE_TIME Type_time { get; set; } // Order expiration type
|
||||
public DateTime Expiration { get; set; } // Order expiration time (for the orders of ORDER_TIME_SPECIFIED type)
|
||||
public string Comment { get; set; } // Order comment
|
||||
public ulong Position { get; set; } // Position ticket
|
||||
public ulong PositionBy { get; set; } // The ticket of an opposite position
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace MtApi5
|
||||
namespace MtApi5
|
||||
{
|
||||
public class MqlTradeResult
|
||||
{
|
||||
@@ -27,6 +23,11 @@ namespace MtApi5
|
||||
public double Bid { get; private set; } // Current Bid price
|
||||
public double Ask { get; private set; } // Current Ask price
|
||||
public string Comment { get; private set; } // Broker comment to operation (by default it is filled by the operation description)
|
||||
public uint Request_id { get; private set; } // Request ID set by the terminal during the dispatch
|
||||
public uint Request_id { get; private set; } // Request ID set by the terminal during the dispatch
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"Retcode={Retcode}; Deal={Deal}; Order={Order}; Volume={Volume}; Price={Price}; Bid={Bid}; Ask={Ask}; Comment={Comment}; Request_id={Request_id}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace MtApi5
|
||||
namespace MtApi5
|
||||
{
|
||||
internal enum Mt5CommandType
|
||||
{
|
||||
@@ -105,6 +100,7 @@ namespace MtApi5
|
||||
//CTrade
|
||||
PositionClose = 64,
|
||||
PositionOpen = 65,
|
||||
PositionOpenWithResult = 1065,
|
||||
|
||||
//Backtesting
|
||||
BacktestingReady = 66,
|
||||
@@ -114,5 +110,66 @@ namespace MtApi5
|
||||
|
||||
//Requests
|
||||
MtRequest = 155,
|
||||
|
||||
PositionSelectByTicket = 69,
|
||||
|
||||
ObjectCreate = 70,
|
||||
ObjectName = 71,
|
||||
ObjectDelete = 72,
|
||||
ObjectsDeleteAll = 73,
|
||||
ObjectFind = 74,
|
||||
ObjectGetTimeByValue = 75,
|
||||
ObjectGetValueByTime = 76,
|
||||
ObjectMove = 77,
|
||||
ObjectsTotal = 78,
|
||||
ObjectGetDouble = 79,
|
||||
ObjectGetInteger = 80,
|
||||
ObjectGetString = 81,
|
||||
ObjectSetDouble = 82,
|
||||
ObjectSetInteger = 83,
|
||||
ObjectSetString = 84,
|
||||
//TextSetFont = 85,
|
||||
//TextOut = 86,
|
||||
//TextGetSize = 87,
|
||||
|
||||
iAC = 88,
|
||||
iAD = 89,
|
||||
iADX = 90,
|
||||
iADXWilder = 91,
|
||||
iAlligator = 92,
|
||||
iAMA = 93,
|
||||
iAO = 94,
|
||||
iATR = 95,
|
||||
iBearsPower = 96,
|
||||
iBands = 97,
|
||||
iBullsPower = 98,
|
||||
iCCI = 99,
|
||||
iChaikin = 100,
|
||||
//iCustom = 101,
|
||||
iDEMA = 102,
|
||||
iDeMarker = 103,
|
||||
iEnvelopes = 104,
|
||||
iForce = 105,
|
||||
iFractals = 106,
|
||||
iFrAMA = 107,
|
||||
iGator = 108,
|
||||
iIchimoku = 109,
|
||||
iBWMFI = 110,
|
||||
iMomentum = 111,
|
||||
iMFI = 112,
|
||||
iMA = 113,
|
||||
iOsMA = 114,
|
||||
iMACD = 115,
|
||||
iOBV = 116,
|
||||
iSAR = 117,
|
||||
iRSI = 118,
|
||||
iRVI = 119,
|
||||
iStdDev = 120,
|
||||
iStochastic = 121,
|
||||
iTEMA = 122,
|
||||
iTriX = 123,
|
||||
iWPR = 124,
|
||||
iVIDyA = 125,
|
||||
iVolumes = 126
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,11 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace MtApi5
|
||||
{
|
||||
public class Mt5ConnectionEventArgs: EventArgs
|
||||
{
|
||||
public Mt5ConnectionState Status { get; private set; }
|
||||
public String ConnectionMessage { get; private set; }
|
||||
public string ConnectionMessage { get; private set; }
|
||||
|
||||
public Mt5ConnectionEventArgs(Mt5ConnectionState status, string message)
|
||||
{
|
||||
|
||||
+664
-212
@@ -1,200 +1,10 @@
|
||||
namespace MtApi5
|
||||
{
|
||||
public enum ENUM_TRADE_REQUEST_ACTIONS
|
||||
{
|
||||
TRADE_ACTION_DEAL = 1, //Place a trade order for an immediate execution with the specified parameters (market order)
|
||||
TRADE_ACTION_PENDING = 5, //Place a trade order for an immediate execution with the specified parameters (market order)
|
||||
TRADE_ACTION_SLTP = 6, //Place a trade order for an immediate execution with the specified parameters (market order)
|
||||
TRADE_ACTION_MODIFY = 7, //Place a trade order for an immediate execution with the specified parameters (market order)
|
||||
TRADE_ACTION_REMOVE = 8 //Place a trade order for an immediate execution with the specified parameters (market order)
|
||||
}
|
||||
|
||||
public enum ENUM_ORDER_TYPE
|
||||
{
|
||||
ORDER_TYPE_BUY = 0, //Market Buy order
|
||||
ORDER_TYPE_SELL = 1, //Market Sell order
|
||||
ORDER_TYPE_BUY_LIMIT = 2, //Buy Limit pending order
|
||||
ORDER_TYPE_SELL_LIMIT = 3, //Sell Limit pending order
|
||||
ORDER_TYPE_BUY_STOP = 4, //Buy Stop pending order
|
||||
ORDER_TYPE_SELL_STOP = 5, //Sell Stop pending order
|
||||
ORDER_TYPE_BUY_STOP_LIMIT = 6, //Upon reaching the order price, a pending Buy Limit order is places at the StopLimit price
|
||||
ORDER_TYPE_SELL_STOP_LIMIT = 7, //Upon reaching the order price, a pending Sell Limit order is places at the StopLimit price
|
||||
}
|
||||
|
||||
public enum ENUM_ORDER_TYPE_FILLING
|
||||
{
|
||||
ORDER_FILLING_FOK = 0,
|
||||
ORDER_FILLING_IOC = 1,
|
||||
ORDER_FILLING_RETURN = 2
|
||||
}
|
||||
|
||||
public enum ENUM_ORDER_TYPE_TIME
|
||||
{
|
||||
ORDER_TIME_GTC = 0,
|
||||
ORDER_TIME_DAY = 1,
|
||||
ORDER_TIME_SPECIFIED = 2,
|
||||
ORDER_TIME_SPECIFIED_DAY = 3
|
||||
}
|
||||
|
||||
public enum ENUM_POSITION_PROPERTY_DOUBLE
|
||||
{
|
||||
POSITION_VOLUME = 3, //Position volume
|
||||
POSITION_PRICE_OPEN = 4, //Position open price
|
||||
POSITION_SL = 6, //Stop Loss level of opened position
|
||||
POSITION_TP = 7, //Take Profit level of opened position
|
||||
POSITION_PRICE_CURRENT = 5, //Current price of the position symbol
|
||||
POSITION_COMMISSION = 8, //Commission
|
||||
POSITION_SWAP = 9, //Cumulative swap
|
||||
POSITION_PROFIT = 10 //Current profit
|
||||
}
|
||||
|
||||
public enum ENUM_POSITION_PROPERTY_INTEGER
|
||||
{
|
||||
POSITION_TIME = 1, //Position open time
|
||||
POSITION_TYPE = 2, //Position type
|
||||
POSITION_MAGIC = 12, //Position magic number
|
||||
POSITION_IDENTIFIER = 13 //Position identifier is a unique number that is assigned to every newly opened position and doesn't change during the entire lifetime of the position. Position turnover doesn't change its identifier.
|
||||
}
|
||||
|
||||
public enum ENUM_POSITION_TYPE
|
||||
{
|
||||
POSITION_TYPE_BUY = 0, //Buy
|
||||
POSITION_TYPE_SELL = 1 //Sell
|
||||
}
|
||||
|
||||
public enum ENUM_POSITION_PROPERTY_STRING
|
||||
{
|
||||
POSITION_SYMBOL = 0, //Symbol of the position
|
||||
POSITION_COMMENT = 11 //Position comment
|
||||
}
|
||||
|
||||
public enum ENUM_ORDER_PROPERTY_DOUBLE
|
||||
{
|
||||
ORDER_VOLUME_INITIAL = 7, //Order initial volume
|
||||
ORDER_VOLUME_CURRENT = 8, //Order current volume
|
||||
ORDER_PRICE_OPEN = 9, //Price specified in the order
|
||||
ORDER_SL = 12, //Stop Loss value
|
||||
ORDER_TP = 13, //Take Profit value
|
||||
ORDER_PRICE_CURRENT = 10, //The current price of the order symbol
|
||||
ORDER_PRICE_STOPLIMIT = 11 //The Limit order price for the StopLimit order
|
||||
}
|
||||
|
||||
public enum ENUM_ORDER_PROPERTY_STRING
|
||||
{
|
||||
ORDER_SYMBOL = 0, //Symbol of the order
|
||||
ORDER_COMMENT = 16 //Order comment
|
||||
}
|
||||
|
||||
public enum ENUM_ORDER_PROPERTY_INTEGER
|
||||
{
|
||||
ORDER_TIME_SETUP = 1, //Order setup time
|
||||
ORDER_TYPE = 4, //Order type
|
||||
ORDER_STATE = 14, //Order state
|
||||
ORDER_TIME_EXPIRATION = 2, //Order expiration time
|
||||
ORDER_TIME_DONE = 3, //Order execution or cancellation time
|
||||
ORDER_TYPE_FILLING = 5, //Order filling type
|
||||
ORDER_TYPE_TIME = 6, //Order lifetime
|
||||
ORDER_MAGIC = 15, //ID of an Expert Advisor that has placed the order (designed to ensure that each Expert Advisor places its own unique number)
|
||||
ORDER_POSITION_ID = 17 //Position identifier that is set to an order as soon as it is executed. Each executed order results in a deal that opens or modifies an already existing position. The identifier of exactly this position is set to the executed order at this moment.
|
||||
}
|
||||
|
||||
public enum ENUM_DEAL_PROPERTY_DOUBLE
|
||||
{
|
||||
DEAL_VOLUME = 5,
|
||||
DEAL_PRICE = 6,
|
||||
DEAL_COMMISSION = 7,
|
||||
DEAL_SWAP = 8,
|
||||
DEAL_PROFIT = 9
|
||||
}
|
||||
|
||||
public enum ENUM_DEAL_PROPERTY_STRING
|
||||
{
|
||||
DEAL_SYMBOL = 0,
|
||||
DEAL_COMMENT = 10
|
||||
}
|
||||
|
||||
public enum ENUM_DEAL_TYPE
|
||||
{
|
||||
DEAL_TYPE_BUY = 0,
|
||||
DEAL_TYPE_SELL = 1,
|
||||
DEAL_TYPE_BALANCE = 2,
|
||||
DEAL_TYPE_CREDIT = 3,
|
||||
DEAL_TYPE_CHARGE = 4,
|
||||
DEAL_TYPE_CORRECTION = 5,
|
||||
DEAL_TYPE_BONUS = 6,
|
||||
DEAL_TYPE_COMMISSION = 7,
|
||||
DEAL_TYPE_COMMISSION_DAILY = 8,
|
||||
DEAL_TYPE_COMMISSION_MONTHLY = 9,
|
||||
DEAL_TYPE_COMMISSION_AGENT_DAILY = 10,
|
||||
DEAL_TYPE_COMMISSION_AGENT_MONTHLY = 11,
|
||||
DEAL_TYPE_INTEREST = 12,
|
||||
DEAL_TYPE_BUY_CANCELED = 13,
|
||||
DEAL_TYPE_SELL_CANCELED = 14
|
||||
}
|
||||
|
||||
public enum ENUM_DEAL_ENTRY
|
||||
{
|
||||
DEAL_ENTRY_IN = 0,
|
||||
DEAL_ENTRY_OUT = 1,
|
||||
DEAL_ENTRY_INOUT = 2,
|
||||
DEAL_ENTRY_STATE = 255
|
||||
}
|
||||
|
||||
public enum ENUM_DEAL_PROPERTY_INTEGER
|
||||
{
|
||||
DEAL_ORDER = 1,
|
||||
DEAL_TIME = 2,
|
||||
DEAL_TYPE = 3,
|
||||
DEAL_ENTRY = 4,
|
||||
DEAL_MAGIC = 11,
|
||||
DEAL_POSITION_ID = 12
|
||||
}
|
||||
|
||||
public enum ENUM_ACCOUNT_INFO_INTEGER
|
||||
{
|
||||
ACCOUNT_LOGIN = 0,
|
||||
ACCOUNT_TRADE_MODE = 32,
|
||||
ACCOUNT_LEVERAGE = 35,
|
||||
ACCOUNT_LIMIT_ORDERS = 47,
|
||||
ACCOUNT_MARGIN_SO_MODE = 44,
|
||||
ACCOUNT_TRADE_ALLOWED = 33,
|
||||
ACCOUNT_TRADE_EXPERT = 34
|
||||
}
|
||||
|
||||
public enum ENUM_ACCOUNT_INFO_DOUBLE
|
||||
{
|
||||
ACCOUNT_BALANCE = 37,
|
||||
ACCOUNT_CREDIT = 38,
|
||||
ACCOUNT_PROFIT = 39,
|
||||
ACCOUNT_EQUITY = 40,
|
||||
ACCOUNT_MARGIN = 41,
|
||||
ACCOUNT_FREEMARGIN = 42,
|
||||
ACCOUNT_MARGIN_LEVEL = 43,
|
||||
ACCOUNT_MARGIN_SO_CALL = 45,
|
||||
ACCOUNT_MARGIN_SO_SO = 46
|
||||
}
|
||||
|
||||
public enum ENUM_ACCOUNT_INFO_STRING
|
||||
{
|
||||
ACCOUNT_NAME = 1,
|
||||
ACCOUNT_SERVER = 3,
|
||||
ACCOUNT_CURRENCY = 36,
|
||||
ACCOUNT_COMPANY = 2
|
||||
}
|
||||
|
||||
public enum ENUM_ACCOUNT_TRADE_MODE
|
||||
{
|
||||
ACCOUNT_TRADE_MODE_DEMO = 0,
|
||||
ACCOUNT_TRADE_MODE_CONTEST = 1,
|
||||
ACCOUNT_TRADE_MODE_REAL = 2
|
||||
}
|
||||
|
||||
public enum ENUM_ACCOUNT_STOPOUT_MODE
|
||||
{
|
||||
ACCOUNT_STOPOUT_MODE_PERCENT = 0,
|
||||
ACCOUNT_STOPOUT_MODE_MONEY = 1
|
||||
}
|
||||
// Chart Constants:
|
||||
|
||||
#region Chart Timeframes
|
||||
|
||||
public enum ENUM_TIMEFRAMES
|
||||
{
|
||||
PERIOD_CURRENT = 0,
|
||||
@@ -221,19 +31,66 @@
|
||||
PERIOD_MN1 = 49153
|
||||
}
|
||||
|
||||
public enum ENUM_SERIES_INFO_INTEGER
|
||||
#endregion //Chart Timeframes
|
||||
|
||||
|
||||
// Environment State:
|
||||
|
||||
#region Client Terminal Properties
|
||||
|
||||
public enum ENUM_TERMINAL_INFO_INTEGER
|
||||
{
|
||||
SERIES_BARS_COUNT = 0,
|
||||
SERIES_FIRSTDATE = 1,
|
||||
SERIES_LASTBAR_DATE = 5,
|
||||
SERIES_SERVER_FIRSTDATE = 2,
|
||||
SERIES_TERMINAL_FIRSTDATE = 3,
|
||||
SERIES_SYNCHRONIZED = 4
|
||||
TERMINAL_BUILD = 5,
|
||||
TERMINAL_COMMUNITY_ACCOUNT = 23,
|
||||
TERMINAL_COMMUNITY_CONNECTION = 24,
|
||||
TERMINAL_CONNECTED = 6,
|
||||
TERMINAL_DLLS_ALLOWED = 7,
|
||||
TERMINAL_TRADE_ALLOWED = 8,
|
||||
TERMINAL_EMAIL_ENABLED = 9,
|
||||
TERMINAL_FTP_ENABLED = 10,
|
||||
TERMINAL_NOTIFICATIONS_ENABLED = 26,
|
||||
TERMINAL_MAXBARS = 11,
|
||||
TERMINAL_MQID = 22,
|
||||
TERMINAL_CODEPAGE = 12,
|
||||
TERMINAL_CPU_CORES = 21,
|
||||
TERMINAL_DISK_SPACE = 20,
|
||||
TERMINAL_MEMORY_PHYSICAL = 14,
|
||||
TERMINAL_MEMORY_TOTAL = 15,
|
||||
TERMINAL_MEMORY_AVAILABLE = 16,
|
||||
TERMINAL_MEMORY_USED = 17,
|
||||
TERMINAL_X64 = 18,
|
||||
TERMINAL_OPENCL_SUPPORT = 19,
|
||||
TERMINAL_SCREEN_DPI = 27,
|
||||
TERMINAL_PING_LAST = 29
|
||||
}
|
||||
|
||||
public enum ENUM_TERMINAL_INFO_DOUBLE
|
||||
{
|
||||
TERMINAL_COMMUNITY_BALANCE = 25
|
||||
}
|
||||
|
||||
public enum ENUM_TERMINAL_INFO_STRING
|
||||
{
|
||||
TERMINAL_LANGUAGE = 13,
|
||||
TERMINAL_COMPANY = 0,
|
||||
TERMINAL_NAME = 1,
|
||||
TERMINAL_PATH = 2,
|
||||
TERMINAL_DATA_PATH = 3,
|
||||
TERMINAL_COMMONDATA_PATH = 4
|
||||
}
|
||||
|
||||
#endregion //Client Terminal Properties
|
||||
|
||||
#region Symbol Properties
|
||||
|
||||
public enum ENUM_SYMBOL_INFO_INTEGER
|
||||
{
|
||||
SYMBOL_CUSTOM = 78,
|
||||
SYMBOL_BACKGROUND_COLOR = 79,
|
||||
SYMBOL_CHART_MODE = 80,
|
||||
SYMBOL_SELECT = 0,
|
||||
//FIXME: SYMBOL_VISIBLE not found in MQL5 environment!
|
||||
//SYMBOL_VISIBLE = ?
|
||||
SYMBOL_SESSION_DEALS = 56,
|
||||
SYMBOL_SESSION_BUY_ORDERS = 60,
|
||||
SYMBOL_SESSION_SELL_ORDERS = 62,
|
||||
@@ -254,8 +111,14 @@
|
||||
SYMBOL_TRADE_EXEMODE = 33,
|
||||
SYMBOL_SWAP_MODE = 37,
|
||||
SYMBOL_SWAP_ROLLOVER3DAYS = 40,
|
||||
SYMBOL_MARGIN_HEDGED_USE_LEG = 82,
|
||||
SYMBOL_EXPIRATION_MODE = 49,
|
||||
SYMBOL_FILLING_MODE = 50
|
||||
SYMBOL_FILLING_MODE = 50,
|
||||
SYMBOL_ORDER_MODE = 71,
|
||||
SYMBOL_ORDER_GTC_MODE = 81,
|
||||
SYMBOL_ORDER_CLOSEBY = 64,
|
||||
SYMBOL_OPTION_MODE = 75,
|
||||
SYMBOL_OPTION_RIGHT = 74,
|
||||
}
|
||||
|
||||
public enum ENUM_SYMBOL_INFO_DOUBLE
|
||||
@@ -269,12 +132,16 @@
|
||||
SYMBOL_LAST = 7,
|
||||
SYMBOL_LASTHIGH = 8,
|
||||
SYMBOL_LASTLOW = 9,
|
||||
SYMBOL_OPTION_STRIKE = 72,
|
||||
SYMBOL_POINT = 16,
|
||||
SYMBOL_TRADE_TICK_VALUE = 26,
|
||||
SYMBOL_TRADE_TICK_VALUE_PROFIT = 53,
|
||||
SYMBOL_TRADE_TICK_VALUE_LOSS = 54,
|
||||
SYMBOL_TRADE_TICK_SIZE = 27,
|
||||
SYMBOL_TRADE_CONTRACT_SIZE = 28,
|
||||
SYMBOL_TRADE_ACCRUED_INTEREST = 87,
|
||||
SYMBOL_TRADE_FACE_VALUE = 86,
|
||||
SYMBOL_TRADE_LIQUIDITY_RATE = 85,
|
||||
SYMBOL_VOLUME_MIN = 34,
|
||||
SYMBOL_VOLUME_MAX = 35,
|
||||
SYMBOL_VOLUME_STEP = 36,
|
||||
@@ -283,11 +150,11 @@
|
||||
SYMBOL_SWAP_SHORT = 39,
|
||||
SYMBOL_MARGIN_INITIAL = 42,
|
||||
SYMBOL_MARGIN_MAINTENANCE = 43,
|
||||
SYMBOL_MARGIN_LONG = 44,
|
||||
SYMBOL_MARGIN_SHORT = 45,
|
||||
SYMBOL_MARGIN_LIMIT = 46,
|
||||
SYMBOL_MARGIN_STOP = 47,
|
||||
SYMBOL_MARGIN_STOPLIMIT = 48,
|
||||
SYMBOL_MARGIN_LONG = 44, //FIXME: Undocumented!
|
||||
SYMBOL_MARGIN_SHORT = 45, //FIXME: Undocumented!
|
||||
SYMBOL_MARGIN_LIMIT = 46, //FIXME: Undocumented!
|
||||
SYMBOL_MARGIN_STOP = 47, //FIXME: Undocumented!
|
||||
SYMBOL_MARGIN_STOPLIMIT = 48, //FIXME: Undocumented!
|
||||
SYMBOL_SESSION_VOLUME = 57,
|
||||
SYMBOL_SESSION_TURNOVER = 58,
|
||||
SYMBOL_SESSION_INTEREST = 59,
|
||||
@@ -298,20 +165,80 @@
|
||||
SYMBOL_SESSION_AW = 66,
|
||||
SYMBOL_SESSION_PRICE_SETTLEMENT = 67,
|
||||
SYMBOL_SESSION_PRICE_LIMIT_MIN = 68,
|
||||
SYMBOL_SESSION_PRICE_LIMIT_MAX = 69
|
||||
SYMBOL_SESSION_PRICE_LIMIT_MAX = 69,
|
||||
SYMBOL_MARGIN_HEDGED = 77
|
||||
}
|
||||
|
||||
public enum ENUM_SYMBOL_INFO_STRING
|
||||
{
|
||||
SYMBOL_BASIS = 73,
|
||||
SYMBOL_CURRENCY_BASE = 22,
|
||||
SYMBOL_CURRENCY_PROFIT = 23,
|
||||
SYMBOL_CURRENCY_MARGIN = 24,
|
||||
SYMBOL_BANK = 19,
|
||||
SYMBOL_DESCRIPTION = 20,
|
||||
SYMBOL_FORMULA = 84,
|
||||
SYMBOL_PAGE = 83,
|
||||
SYMBOL_ISIN = 70,
|
||||
SYMBOL_PATH = 21
|
||||
}
|
||||
|
||||
public enum ENUM_SYMBOL_CHART_MODE
|
||||
{
|
||||
SYMBOL_CHART_MODE_BID = 0,
|
||||
SYMBOL_CHART_MODE_LAST = 1
|
||||
}
|
||||
|
||||
public enum ENUM_SYMBOL_ORDER_GTC_MODE
|
||||
{
|
||||
SYMBOL_ORDERS_GTC = 0,
|
||||
SYMBOL_ORDERS_DAILY = 1,
|
||||
SYMBOL_ORDERS_DAILY_EXCLUDING_STOPS = 2
|
||||
}
|
||||
|
||||
public enum ENUM_SYMBOL_CALC_MODE
|
||||
{
|
||||
SYMBOL_CALC_MODE_FOREX = 0,
|
||||
SYMBOL_CALC_MODE_FUTURES = 1,
|
||||
SYMBOL_CALC_MODE_CFD = 2,
|
||||
SYMBOL_CALC_MODE_CFDINDEX = 3,
|
||||
SYMBOL_CALC_MODE_CFDLEVERAGE = 4,
|
||||
SYMBOL_CALC_MODE_EXCH_STOCKS = 32,
|
||||
SYMBOL_CALC_MODE_EXCH_FUTURES = 33,
|
||||
SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS = 34,
|
||||
SYMBOL_CALC_MODE_SERV_COLLATERAL = 64
|
||||
}
|
||||
|
||||
public enum ENUM_SYMBOL_TRADE_MODE
|
||||
{
|
||||
SYMBOL_TRADE_MODE_DISABLED = 0,
|
||||
SYMBOL_TRADE_MODE_LONGONLY = 1,
|
||||
SYMBOL_TRADE_MODE_SHORTONLY = 2,
|
||||
SYMBOL_TRADE_MODE_CLOSEONLY = 3,
|
||||
SYMBOL_TRADE_MODE_FULL = 4
|
||||
}
|
||||
|
||||
public enum ENUM_SYMBOL_TRADE_EXECUTION
|
||||
{
|
||||
SYMBOL_TRADE_EXECUTION_REQUEST = 0,
|
||||
SYMBOL_TRADE_EXECUTION_INSTANT = 1,
|
||||
SYMBOL_TRADE_EXECUTION_MARKET = 2,
|
||||
SYMBOL_TRADE_EXECUTION_EXCHANGE = 3
|
||||
}
|
||||
|
||||
public enum ENUM_SYMBOL_SWAP_MODE
|
||||
{
|
||||
SYMBOL_SWAP_MODE_DISABLED = 0,
|
||||
SYMBOL_SWAP_MODE_POINTS = 1,
|
||||
SYMBOL_SWAP_MODE_CURRENCY_SYMBOL = 2,
|
||||
SYMBOL_SWAP_MODE_CURRENCY_MARGIN = 3,
|
||||
SYMBOL_SWAP_MODE_CURRENCY_DEPOSIT = 4,
|
||||
SYMBOL_SWAP_MODE_INTEREST_CURRENT = 5,
|
||||
SYMBOL_SWAP_MODE_INTEREST_OPEN = 6,
|
||||
SYMBOL_SWAP_MODE_REOPEN_CURRENT = 7,
|
||||
SYMBOL_SWAP_MODE_REOPEN_BID = 8
|
||||
}
|
||||
|
||||
public enum ENUM_DAY_OF_WEEK
|
||||
{
|
||||
SUNDAY = 0,
|
||||
@@ -323,11 +250,536 @@
|
||||
SATURDAY = 6
|
||||
}
|
||||
|
||||
public enum ENUM_SYMBOL_OPTION_RIGHT
|
||||
{
|
||||
SYMBOL_OPTION_RIGHT_CALL = 0,
|
||||
SYMBOL_OPTION_RIGHT_PUT = 1
|
||||
}
|
||||
|
||||
public enum ENUM_SYMBOL_OPTION_MODE
|
||||
{
|
||||
SYMBOL_OPTION_MODE_EUROPEAN = 0,
|
||||
SYMBOL_OPTION_MODE_AMERICAN = 1
|
||||
}
|
||||
|
||||
#endregion //Symbol Properties
|
||||
|
||||
#region Account Properties
|
||||
|
||||
public enum ENUM_ACCOUNT_INFO_INTEGER
|
||||
{
|
||||
ACCOUNT_LOGIN = 0, //Account number
|
||||
ACCOUNT_TRADE_MODE = 32, //Account trade mode
|
||||
ACCOUNT_LEVERAGE = 35, //Account leverage
|
||||
ACCOUNT_LIMIT_ORDERS = 47, //Maximum allowed number of active pending orders
|
||||
ACCOUNT_MARGIN_SO_MODE = 44, //Mode for setting the minimal allowed margin
|
||||
ACCOUNT_TRADE_ALLOWED = 33, //Allowed trade for the current account
|
||||
ACCOUNT_TRADE_EXPERT = 34, //Allowed trade for an Expert Advisor
|
||||
ACCOUNT_MARGIN_MODE = 53 //Margin calculation mode
|
||||
}
|
||||
|
||||
public enum ENUM_ACCOUNT_INFO_DOUBLE
|
||||
{
|
||||
ACCOUNT_BALANCE = 37, //Account balance in the deposit currency
|
||||
ACCOUNT_CREDIT = 38, //Account credit in the deposit currency
|
||||
ACCOUNT_PROFIT = 39, //Current profit of an account in the deposit currency
|
||||
ACCOUNT_EQUITY = 40, //Account equity in the deposit currency
|
||||
ACCOUNT_MARGIN = 41, //Account margin used in the deposit currency
|
||||
ACCOUNT_MARGIN_FREE = 42, //Free margin of an account in the deposit currency
|
||||
ACCOUNT_MARGIN_LEVEL = 43, //Account margin level in percents
|
||||
ACCOUNT_MARGIN_SO_CALL = 45, //Margin call level
|
||||
ACCOUNT_MARGIN_SO_SO = 46, //Margin stop out level
|
||||
ACCOUNT_MARGIN_INITIAL = 48, //Initial margin
|
||||
ACCOUNT_MARGIN_MAINTENANCE = 49, //Maintenance margin
|
||||
ACCOUNT_ASSETS = 50, //The current assets of an account
|
||||
ACCOUNT_LIABILITIES = 51, //The current liabilities on an account
|
||||
ACCOUNT_COMMISSION_BLOCKED = 52 //The current blocked commission amount on an account
|
||||
}
|
||||
|
||||
public enum ENUM_ACCOUNT_INFO_STRING
|
||||
{
|
||||
ACCOUNT_NAME = 1, //Client name
|
||||
ACCOUNT_SERVER = 3, //Trade server name
|
||||
ACCOUNT_CURRENCY = 36, //Account currency
|
||||
ACCOUNT_COMPANY = 2 //Name of a company that serves the account
|
||||
}
|
||||
|
||||
public enum ENUM_ACCOUNT_TRADE_MODE
|
||||
{
|
||||
ACCOUNT_TRADE_MODE_DEMO = 0, //Demo account
|
||||
ACCOUNT_TRADE_MODE_CONTEST = 1, //Contest account
|
||||
ACCOUNT_TRADE_MODE_REAL = 2 //Real account
|
||||
}
|
||||
|
||||
public enum ENUM_ACCOUNT_STOPOUT_MODE
|
||||
{
|
||||
ACCOUNT_STOPOUT_MODE_PERCENT = 0, //Account stop out mode in percents
|
||||
ACCOUNT_STOPOUT_MODE_MONEY = 1 //Account stop out mode in money
|
||||
}
|
||||
|
||||
public enum ENUM_ACCOUNT_MARGIN_MODE
|
||||
{
|
||||
ACCOUNT_MARGIN_MODE_RETAIL_NETTING = 0, //Used for the OTC markets to interpret positions in the "netting" mode
|
||||
ACCOUNT_MARGIN_MODE_EXCHANGE = 1, //Used for the exchange markets
|
||||
ACCOUNT_MARGIN_MODE_RETAIL_HEDGING = 2 //Used for the exchange markets where individual positions are possible
|
||||
}
|
||||
|
||||
#endregion //Account Properties
|
||||
|
||||
// Trade Constants:
|
||||
|
||||
#region History Database Properties
|
||||
|
||||
public enum ENUM_SERIES_INFO_INTEGER
|
||||
{
|
||||
SERIES_BARS_COUNT = 0, //Bars count for the symbol-period for the current moment
|
||||
SERIES_FIRSTDATE = 1, //The very first date for the symbol-period for the current moment
|
||||
SERIES_LASTBAR_DATE = 5, //Open time of the last bar of the symbol-period
|
||||
SERIES_SERVER_FIRSTDATE = 2, //The very first date in the history of the symbol on the server regardless of the timeframe
|
||||
SERIES_TERMINAL_FIRSTDATE = 3, //The very first date in the history of the symbol in the client terminal, regardless of the timeframe
|
||||
SERIES_SYNCHRONIZED = 4 //Symbol/period data synchronization flag for the current moment
|
||||
}
|
||||
|
||||
#endregion //History Database Properties
|
||||
|
||||
#region Order Properties
|
||||
|
||||
public enum ENUM_ORDER_PROPERTY_INTEGER
|
||||
{
|
||||
ORDER_TICKET = 22, //Order ticket. Unique number assigned to each order
|
||||
ORDER_TIME_SETUP = 1, //Order setup time
|
||||
ORDER_TYPE = 4, //Order type
|
||||
ORDER_STATE = 14, //Order state
|
||||
ORDER_TIME_EXPIRATION = 2, //Order expiration time
|
||||
ORDER_TIME_DONE = 3, //Order execution or cancellation time
|
||||
ORDER_TIME_SETUP_MSC = 18, //The time of placing an order for execution in milliseconds since 01.01.1970
|
||||
ORDER_TIME_DONE_MSC = 19, //Order execution/cancellation time in milliseconds since 01.01.1970
|
||||
ORDER_TYPE_FILLING = 5, //Order filling type
|
||||
ORDER_TYPE_TIME = 6, //Order lifetime
|
||||
ORDER_MAGIC = 15, //ID of an Expert Advisor that has placed the order (designed to ensure that each Expert Advisor places its own unique number)
|
||||
ORDER_REASON = 23, //The reason or source for placing an order
|
||||
ORDER_POSITION_ID = 17, //Position identifier that is set to an order as soon as it is executed. Each executed order results in a deal that opens or modifies an already existing position. The identifier of exactly this position is set to the executed order at this moment.
|
||||
ORDER_POSITION_BY_ID = 21 //Identifier of an opposite position used for closing by order ORDER_TYPE_CLOSE_BY
|
||||
}
|
||||
|
||||
public enum ENUM_ORDER_PROPERTY_DOUBLE
|
||||
{
|
||||
ORDER_VOLUME_INITIAL = 7, //Order initial volume
|
||||
ORDER_VOLUME_CURRENT = 8, //Order current volume
|
||||
ORDER_PRICE_OPEN = 9, //Price specified in the order
|
||||
ORDER_SL = 12, //Stop Loss value
|
||||
ORDER_TP = 13, //Take Profit value
|
||||
ORDER_PRICE_CURRENT = 10, //The current price of the order symbol
|
||||
ORDER_PRICE_STOPLIMIT = 11 //The Limit order price for the StopLimit order
|
||||
}
|
||||
|
||||
public enum ENUM_ORDER_PROPERTY_STRING
|
||||
{
|
||||
ORDER_SYMBOL = 0, //Symbol of the order
|
||||
ORDER_COMMENT = 16, //Order comment
|
||||
ORDER_EXTERNAL_ID = 20 //Order identifier in an external trading system (on the Exchange)
|
||||
}
|
||||
|
||||
public enum ENUM_ORDER_TYPE
|
||||
{
|
||||
ORDER_TYPE_BUY = 0, //Market Buy order
|
||||
ORDER_TYPE_SELL = 1, //Market Sell order
|
||||
ORDER_TYPE_BUY_LIMIT = 2, //Buy Limit pending order
|
||||
ORDER_TYPE_SELL_LIMIT = 3, //Sell Limit pending order
|
||||
ORDER_TYPE_BUY_STOP = 4, //Buy Stop pending order
|
||||
ORDER_TYPE_SELL_STOP = 5, //Sell Stop pending order
|
||||
ORDER_TYPE_BUY_STOP_LIMIT = 6, //Upon reaching the order price, a pending Buy Limit order is places at the StopLimit price
|
||||
ORDER_TYPE_SELL_STOP_LIMIT = 7, //Upon reaching the order price, a pending Sell Limit order is places at the StopLimit price
|
||||
ORDER_TYPE_CLOSE_BY = 8 //Order to close a position by an opposite one
|
||||
}
|
||||
|
||||
public enum ENUM_ORDER_STATE
|
||||
{
|
||||
ORDER_STATE_STARTED = 0, //Order checked, but not yet accepted by broker
|
||||
ORDER_STATE_PLACED = 1, //Order accepted
|
||||
ORDER_STATE_CANCELED = 2, //Order canceled by client
|
||||
ORDER_STATE_PARTIAL = 3, //Order partially executed
|
||||
ORDER_STATE_FILLED = 4, //Order fully executed
|
||||
ORDER_STATE_REJECTED = 5, //Order rejected
|
||||
ORDER_STATE_EXPIRED = 6, //Order expired
|
||||
ORDER_STATE_REQUEST_ADD = 7, //Order is being registered (placing to the trading system)
|
||||
ORDER_STATE_REQUEST_MODIFY = 8, //Order is being modified (changing its parameters)
|
||||
ORDER_STATE_REQUEST_CANCEL = 9 //Order is being deleted (deleting from the trading system)
|
||||
}
|
||||
|
||||
public enum ENUM_ORDER_TYPE_FILLING
|
||||
{
|
||||
ORDER_FILLING_FOK = 0,
|
||||
ORDER_FILLING_IOC = 1,
|
||||
ORDER_FILLING_RETURN = 2
|
||||
}
|
||||
|
||||
public enum ENUM_ORDER_TYPE_TIME
|
||||
{
|
||||
ORDER_TIME_GTC = 0,
|
||||
ORDER_TIME_DAY = 1,
|
||||
ORDER_TIME_SPECIFIED = 2,
|
||||
ORDER_TIME_SPECIFIED_DAY = 3
|
||||
}
|
||||
|
||||
public enum ENUM_ORDER_REASON
|
||||
{
|
||||
ORDER_REASON_CLIENT = 0, //The order was placed from a desktop terminal
|
||||
ORDER_REASON_MOBILE = 1, //The order was placed from a mobile application
|
||||
ORDER_REASON_WEB = 2, //The order was placed from a web platform
|
||||
ORDER_REASON_EXPERT = 3, //The order was placed from an MQL5-program, i.e. by an Expert Advisor or a script
|
||||
ORDER_REASON_SL = 4, //The order was placed as a result of Stop Loss activation
|
||||
ORDER_REASON_TP = 5, //The order was placed as a result of Take Profit activation
|
||||
ORDER_REASON_SO = 6 //The order was placed as a result of the Stop Out event
|
||||
}
|
||||
|
||||
#endregion //Order Properties
|
||||
|
||||
#region Position Properties
|
||||
|
||||
public enum ENUM_POSITION_PROPERTY_INTEGER
|
||||
{
|
||||
POSITION_TICKET = 17, //Position ticket
|
||||
POSITION_TIME = 1, //Position open time
|
||||
POSITION_TIME_MSC = 14, //Position opening time in milliseconds since 01.01.1970
|
||||
POSITION_TIME_UPDATE = 15, //Position changing time in seconds since 01.01.1970
|
||||
POSITION_TIME_UPDATE_MSC = 16, //Position changing time in milliseconds since 01.01.1970
|
||||
POSITION_TYPE = 2, //Position type
|
||||
POSITION_MAGIC = 12, //Position magic number
|
||||
POSITION_IDENTIFIER = 13, //Position identifier is a unique number that is assigned to every newly opened position and doesn't change during the entire lifetime of the position. Position turnover doesn't change its identifier.
|
||||
POSITION_REASON = 18 //The reason for opening a position
|
||||
}
|
||||
|
||||
public enum ENUM_POSITION_PROPERTY_DOUBLE
|
||||
{
|
||||
POSITION_VOLUME = 3, //Position volume
|
||||
POSITION_PRICE_OPEN = 4, //Position open price
|
||||
POSITION_SL = 6, //Stop Loss level of opened position
|
||||
POSITION_TP = 7, //Take Profit level of opened position
|
||||
POSITION_PRICE_CURRENT = 5, //Current price of the position symbol
|
||||
POSITION_COMMISSION = 8, //FIXME: Undocumented!
|
||||
POSITION_SWAP = 9, //Cumulative swap
|
||||
POSITION_PROFIT = 10 //Current profit
|
||||
}
|
||||
|
||||
public enum ENUM_POSITION_PROPERTY_STRING
|
||||
{
|
||||
POSITION_SYMBOL = 0, //Symbol of the position
|
||||
POSITION_COMMENT = 11 //Position comment
|
||||
}
|
||||
|
||||
public enum ENUM_POSITION_TYPE
|
||||
{
|
||||
POSITION_TYPE_BUY = 0, //Buy
|
||||
POSITION_TYPE_SELL = 1 //Sell
|
||||
}
|
||||
|
||||
public enum ENUM_POSITION_REASON
|
||||
{
|
||||
POSITION_REASON_CLIENT = 0, //The position was opened as a result of activation of an order placed from a desktop terminal
|
||||
POSITION_REASON_MOBILE = 1, //The position was opened as a result of activation of an order placed from a mobile application
|
||||
POSITION_REASON_WEB = 2, //The position was opened as a result of activation of an order placed from the web platform
|
||||
POSITION_REASON_EXPERT = 3 //The position was opened as a result of activation of an order placed from an MQL5 program
|
||||
}
|
||||
|
||||
#endregion //Position Properties
|
||||
|
||||
#region Deal Properties
|
||||
|
||||
public enum ENUM_DEAL_PROPERTY_INTEGER
|
||||
{
|
||||
DEAL_TICKET = 15, //Deal ticket. Unique number assigned to each deal
|
||||
DEAL_ORDER = 1, //Deal order number
|
||||
DEAL_TIME = 2, //Deal time
|
||||
DEAL_TIME_MSC = 13, //The time of a deal execution in milliseconds since 01.01.1970
|
||||
DEAL_TYPE = 3, //Deal type
|
||||
DEAL_ENTRY = 4, //Deal entry - entry in, entry out, reverse
|
||||
DEAL_MAGIC = 11, //Deal magic number
|
||||
DEAL_REASON = 16, //The reason or source for deal execution
|
||||
DEAL_POSITION_ID = 12 //Identifier of a position
|
||||
}
|
||||
|
||||
public enum ENUM_DEAL_PROPERTY_DOUBLE
|
||||
{
|
||||
DEAL_VOLUME = 5, //Deal volume
|
||||
DEAL_PRICE = 6, //Deal price
|
||||
DEAL_COMMISSION = 7, //Deal commission
|
||||
DEAL_SWAP = 8, //Cumulative swap on close
|
||||
DEAL_PROFIT = 9 //Deal profit
|
||||
}
|
||||
|
||||
public enum ENUM_DEAL_PROPERTY_STRING
|
||||
{
|
||||
DEAL_SYMBOL = 0, //Deal symbol
|
||||
DEAL_COMMENT = 10, //Deal comment
|
||||
DEAL_EXTERNAL_ID = 14 //Deal identifier in an external trading system (on the Exchange)
|
||||
}
|
||||
|
||||
public enum ENUM_DEAL_TYPE
|
||||
{
|
||||
DEAL_TYPE_BUY = 0, //Buy
|
||||
DEAL_TYPE_SELL = 1, //Sell
|
||||
DEAL_TYPE_BALANCE = 2, //Balance
|
||||
DEAL_TYPE_CREDIT = 3, //Credit
|
||||
DEAL_TYPE_CHARGE = 4, //Additional charge
|
||||
DEAL_TYPE_CORRECTION = 5, //Correction
|
||||
DEAL_TYPE_BONUS = 6, //Bonus
|
||||
DEAL_TYPE_COMMISSION = 7, //Additional commission
|
||||
DEAL_TYPE_COMMISSION_DAILY = 8, //Daily commission
|
||||
DEAL_TYPE_COMMISSION_MONTHLY = 9, //Monthly commission
|
||||
DEAL_TYPE_COMMISSION_AGENT_DAILY = 10, //Daily agent commission
|
||||
DEAL_TYPE_COMMISSION_AGENT_MONTHLY = 11, //Monthly agent commission
|
||||
DEAL_TYPE_INTEREST = 12, //Interest rate
|
||||
DEAL_TYPE_BUY_CANCELED = 13, //Canceled buy deal
|
||||
DEAL_TYPE_SELL_CANCELED = 14, //Canceled sell deal
|
||||
DEAL_DIVIDEND = 15, //Dividend operations
|
||||
DEAL_DIVIDEND_FRANKED = 16, //Franked (non-taxable) dividend operations
|
||||
DEAL_TAX = 17 //Tax charges
|
||||
}
|
||||
|
||||
public enum ENUM_DEAL_ENTRY
|
||||
{
|
||||
DEAL_ENTRY_IN = 0, //Entry in
|
||||
DEAL_ENTRY_OUT = 1, //Entry out
|
||||
DEAL_ENTRY_INOUT = 2, //Reverse
|
||||
DEAL_ENTRY_STATE = 255 //Close a position by an opposite one
|
||||
}
|
||||
|
||||
public enum ENUM_DEAL_REASON
|
||||
{
|
||||
DEAL_REASON_CLIENT = 0, //The deal was executed as a result of activation of an order placed from a desktop terminal
|
||||
DEAL_REASON_MOBILE = 1, //The deal was executed as a result of activation of an order placed from a mobile application
|
||||
DEAL_REASON_WEB = 2, //The deal was executed as a result of activation of an order placed from the web platform
|
||||
DEAL_REASON_EXPERT = 3, //The deal was executed as a result of activation of an order placed from an MQL5 program, i.e. an Expert Advisor or a script
|
||||
DEAL_REASON_SL = 4, //The deal was executed as a result of Stop Loss activation
|
||||
DEAL_REASON_TP = 5, //The deal was executed as a result of Take Profit activation
|
||||
DEAL_REASON_SO = 6, //The deal was executed as a result of the Stop Out event
|
||||
DEAL_REASON_ROLLOVER = 7, //The deal was executed due to a rollover
|
||||
DEAL_REASON_VMARGIN = 8, //The deal was executed after charging the variation margin
|
||||
DEAL_REASON_SPLIT = 9 //The deal was executed after the split (price reduction) of an instrument, which had an open position during split announcement
|
||||
}
|
||||
|
||||
#endregion //Deal Properties
|
||||
|
||||
#region Trade Operation Types
|
||||
|
||||
public enum ENUM_TRADE_REQUEST_ACTIONS
|
||||
{
|
||||
TRADE_ACTION_DEAL = 1, //Place a trade order for an immediate execution with the specified parameters (market order)
|
||||
TRADE_ACTION_PENDING = 5, //Place a trade order for the execution under specified conditions (pending order)
|
||||
TRADE_ACTION_SLTP = 6, //Modify Stop Loss and Take Profit values of an opened position
|
||||
TRADE_ACTION_MODIFY = 7, //Modify the parameters of the order placed previously
|
||||
TRADE_ACTION_REMOVE = 8, //Delete the pending order placed previously
|
||||
TRADE_ACTION_CLOSE_BY = 10 //Close a position by an opposite one
|
||||
}
|
||||
|
||||
#endregion //Trade Operation Types
|
||||
|
||||
#region Trade Transaction Types
|
||||
|
||||
public enum ENUM_TRADE_TRANSACTION_TYPE
|
||||
{
|
||||
TRADE_TRANSACTION_ORDER_ADD = 0, //Adding a new open order
|
||||
TRADE_TRANSACTION_ORDER_UPDATE = 1, //Updating an open order
|
||||
TRADE_TRANSACTION_ORDER_DELETE = 2, //Removing an order from the list of the open ones
|
||||
TRADE_TRANSACTION_DEAL_ADD = 6, //Adding a deal to the history
|
||||
TRADE_TRANSACTION_DEAL_UPDATE = 7, //Updating a deal in the history
|
||||
TRADE_TRANSACTION_DEAL_DELETE = 8, //Deleting a deal from the history
|
||||
TRADE_TRANSACTION_HISTORY_ADD = 3, //Adding an order to the history as a result of execution or cancellation
|
||||
TRADE_TRANSACTION_HISTORY_UPDATE = 4, //Changing an order located in the orders history
|
||||
TRADE_TRANSACTION_HISTORY_DELETE = 5, //Deleting an order from the orders history
|
||||
TRADE_TRANSACTION_POSITION = 9, //Changing a position not related to a deal execution
|
||||
TRADE_TRANSACTION_REQUEST = 10 //Notification of the fact that a trade request has been processed by a server and processing result has been received
|
||||
}
|
||||
|
||||
#endregion //Trade Transaction Types
|
||||
|
||||
#region Trade Orders in Depth Of Market
|
||||
|
||||
public enum ENUM_BOOK_TYPE
|
||||
{
|
||||
BOOK_TYPE_SELL = 1,
|
||||
BOOK_TYPE_BUY = 2,
|
||||
BOOK_TYPE_SELL_MARKET = 3,
|
||||
BOOK_TYPE_BUY_MARKET = 4
|
||||
BOOK_TYPE_SELL = 1, //Sell order (Offer)
|
||||
BOOK_TYPE_BUY = 2, //Buy order (Bid)
|
||||
BOOK_TYPE_SELL_MARKET = 3, //Sell order by Market
|
||||
BOOK_TYPE_BUY_MARKET = 4 //Buy order by Market
|
||||
}
|
||||
|
||||
#endregion //Trade Orders in Depth Of Market
|
||||
|
||||
#region Object Types
|
||||
|
||||
public enum ENUM_OBJECT
|
||||
{
|
||||
OBJ_VLINE = 0, // Vertical Line
|
||||
OBJ_HLINE = 1, // Horizontal Line
|
||||
OBJ_TREND = 2, // Trend Line
|
||||
OBJ_TRENDBYANGLE = 3, // Trend Line By Angle
|
||||
OBJ_CYCLES = 4, // Cycle Lines
|
||||
OBJ_ARROWED_LINE = 108, // Arrowed Line
|
||||
OBJ_CHANNEL = 5, // Equidistant Channel
|
||||
OBJ_STDDEVCHANNEL = 6, // Standard Deviation Channel
|
||||
OBJ_REGRESSION = 7, // Linear Regression Channel
|
||||
OBJ_PITCHFORK = 8, // Andrews Pitchfork
|
||||
OBJ_GANNLINE = 9, // Gann Line
|
||||
OBJ_GANNFAN = 10, // Gann Fan
|
||||
OBJ_GANNGRID = 11, // Gann Grid
|
||||
OBJ_FIBO = 12, // Fibonacci Retracement
|
||||
OBJ_FIBOTIMES = 13, // Fibonacci Time Zones
|
||||
OBJ_FIBOFAN = 14, // Fibonacci Fan
|
||||
OBJ_FIBOARC = 15, // Fibonacci Arcs
|
||||
OBJ_FIBOCHANNEL = 16, // Fibonacci Channel
|
||||
OBJ_EXPANSION = 17, // Fibonacci Expansion
|
||||
OBJ_ELLIOTWAVE5 = 18, // Elliott Motive Wave
|
||||
OBJ_ELLIOTWAVE3 = 19, // Elliott Correction Wave
|
||||
OBJ_RECTANGLE = 20, // Rectangle
|
||||
OBJ_TRIANGLE = 21, // Triangle
|
||||
OBJ_ELLIPSE = 22, // Ellipse
|
||||
OBJ_ARROW_THUMB_UP = 23, // Thumbs Up
|
||||
OBJ_ARROW_THUMB_DOWN = 24, // Thumbs Down
|
||||
OBJ_ARROW_UP = 25, // Arrow Up
|
||||
OBJ_ARROW_DOWN = 26, // Arrow Down
|
||||
OBJ_ARROW_STOP = 27, // Stop Sign
|
||||
OBJ_ARROW_CHECK = 28, // Check Sign
|
||||
OBJ_ARROW_LEFT_PRICE = 29, // Left Price Label
|
||||
OBJ_ARROW_RIGHT_PRICE = 30, // Right Price Label
|
||||
OBJ_ARROW_BUY = 31, // Buy Sign
|
||||
OBJ_ARROW_SELL = 32, // Sell Sign
|
||||
OBJ_ARROW = 100, // Arrow
|
||||
OBJ_TEXT = 101, // Text
|
||||
OBJ_LABEL = 102, // Label
|
||||
OBJ_BUTTON = 103, // Button
|
||||
OBJ_CHART = 104, // Chart
|
||||
OBJ_BITMAP = 105, // Bitmap
|
||||
OBJ_BITMAP_LABEL = 106, // Bitmap Label
|
||||
OBJ_EDIT = 107, // Edit
|
||||
OBJ_EVENT = 109, // The "Event" object corresponding to an event in the economic calendar
|
||||
OBJ_RECTANGLE_LABEL = 110 // The "Rectangle label" object for creating and designing the custom graphical interface.
|
||||
}
|
||||
|
||||
#endregion // Object Types
|
||||
|
||||
#region Object Properties
|
||||
|
||||
public enum ENUM_OBJECT_PROPERTY_DOUBLE
|
||||
{
|
||||
OBJPROP_PRICE = 9, // Price coordinate
|
||||
OBJPROP_LEVELVALUE = 204, // Level value
|
||||
OBJPROP_SCALE = 1006, // Scale (properties of Gann objects and Fibonacci Arcs)
|
||||
OBJPROP_ANGLE = 1007, // Angle. For the objects with no angle specified, created from a program, the value is equal to EMPTY_VALUE
|
||||
OBJPROP_DEVIATION = 1010 // Deviation for the Standard Deviation Channel
|
||||
}
|
||||
|
||||
public enum ENUM_OBJECT_PROPERTY_INTEGER
|
||||
{
|
||||
OBJPROP_COLOR = 0, // Color
|
||||
OBJPROP_STYLE = 1, // Style
|
||||
OBJPROP_WIDTH = 2, // Line thickness
|
||||
OBJPROP_BACK = 3, // Object in the background
|
||||
OBJPROP_ZORDER = 207, // Priority of a graphical object for receiving events of clicking on a chart (CHARTEVENT_CLICK). The default zero value is set when creating an object; the priority can be increased if necessary. When objects are placed one atop another, only one of them with the highest priority will receive the CHARTEVENT_CLICK event.
|
||||
OBJPROP_FILL = 1031, // Fill an object with color (for OBJ_RECTANGLE, OBJ_TRIANGLE, OBJ_ELLIPSE, OBJ_CHANNEL, OBJ_STDDEVCHANNEL, OBJ_REGRESSION)
|
||||
OBJPROP_HIDDEN = 208, // Prohibit showing of the name of a graphical object in the list of objects from the terminal menu "Charts" - "Objects" - "List of objects". The true value allows to hide an object from the list. By default, true is set to the objects that display calendar events, trading history and to the objects created from MQL5 programs. To see such graphical objects and access their properties, click on the "All" button in the "List of objects" window.
|
||||
OBJPROP_SELECTED = 4, // Object is selected
|
||||
OBJPROP_READONLY = 1028, // Ability to edit text in the Edit object
|
||||
OBJPROP_TYPE = 7, // Object type
|
||||
OBJPROP_TIME = 8, // Time coordinate
|
||||
OBJPROP_SELECTABLE = 10, // Object availability
|
||||
OBJPROP_CREATETIME = 11, // Time of object creation
|
||||
OBJPROP_LEVELS = 200, // Number of levels
|
||||
OBJPROP_LEVELCOLOR = 201, // Color of the line-level
|
||||
OBJPROP_LEVELSTYLE = 202, // Style of the line-level
|
||||
OBJPROP_LEVELWIDTH = 203, // Thickness of the line-level
|
||||
OBJPROP_ALIGN = 1036, // Horizontal text alignment in the "Edit" object (OBJ_EDIT)
|
||||
OBJPROP_FONTSIZE = 1002, // Font size
|
||||
OBJPROP_RAY_LEFT = 1003, // Ray goes to the left
|
||||
OBJPROP_RAY_RIGHT = 1004, // Ray goes to the right
|
||||
OBJPROP_RAY = 1032, // A vertical line goes through all the windows of a chart
|
||||
OBJPROP_ELLIPSE = 1005, // Showing the full ellipse of the Fibonacci Arc object (OBJ_FIBOARC)
|
||||
OBJPROP_ARROWCODE = 1008, // Arrow code for the Arrow object
|
||||
OBJPROP_TIMEFRAMES = 12, // Visibility of an object at timeframes
|
||||
OBJPROP_ANCHOR = 1011, // Location of the anchor point of a graphical object
|
||||
OBJPROP_XDISTANCE = 1012, // The distance in pixels along the X axis from the binding corner
|
||||
OBJPROP_YDISTANCE = 1013, // The distance in pixels along the Y axis from the binding corner
|
||||
OBJPROP_DIRECTION = 1014, // Trend of the Gann object
|
||||
OBJPROP_DEGREE = 1015, // Level of the Elliott Wave Marking
|
||||
OBJPROP_DRAWLINES = 1016, // Displaying lines for marking the Elliott Wave
|
||||
OBJPROP_STATE = 1018, // Button state (pressed / depressed)
|
||||
OBJPROP_CHART_ID = 1030, // ID of the "Chart" object (OBJ_CHART). It allows working with the properties of this object like with a normal chart using the functions described in Chart Operations, but there some exceptions.
|
||||
OBJPROP_XSIZE = 1019, // The object's width along the X axis in pixels. Specified for OBJ_LABEL (read only), OBJ_BUTTON, OBJ_CHART, OBJ_BITMAP, OBJ_BITMAP_LABEL, OBJ_EDIT, OBJ_RECTANGLE_LABEL objects.
|
||||
OBJPROP_YSIZE = 1020, // The object's height along the Y axis in pixels. Specified for OBJ_LABEL (read only), OBJ_BUTTON, OBJ_CHART, OBJ_BITMAP, OBJ_BITMAP_LABEL, OBJ_EDIT, OBJ_RECTANGLE_LABEL objects.
|
||||
OBJPROP_XOFFSET = 1033, // The X coordinate of the upper left corner of the rectangular visible area in the graphical objects "Bitmap Label" and "Bitmap" (OBJ_BITMAP_LABEL and OBJ_BITMAP). The value is set in pixels relative to the upper left corner of the original image.
|
||||
OBJPROP_YOFFSET = 1034, // The Y coordinate of the upper left corner of the rectangular visible area in the graphical objects "Bitmap Label" and "Bitmap" (OBJ_BITMAP_LABEL and OBJ_BITMAP). The value is set in pixels relative to the upper left corner of the original image.
|
||||
OBJPROP_PERIOD = 1022, // Timeframe for the Chart object
|
||||
OBJPROP_DATE_SCALE = 1023, // Displaying the time scale for the Chart object
|
||||
OBJPROP_PRICE_SCALE = 1024, // Displaying the price scale for the Chart object
|
||||
OBJPROP_CHART_SCALE = 1027, // The scale for the Chart object
|
||||
OBJPROP_BGCOLOR = 1025, // The background color for OBJ_EDIT, OBJ_BUTTON, OBJ_RECTANGLE_LABEL
|
||||
OBJPROP_CORNER = 1026, // The corner of the chart to link a graphical object
|
||||
OBJPROP_BORDER_TYPE = 1029, // Border type for the "Rectangle label" object
|
||||
OBJPROP_BORDER_COLOR = 1035 // Border color for the OBJ_EDIT and OBJ_BUTTON objects
|
||||
}
|
||||
|
||||
public enum ENUM_OBJECT_PROPERTY_STRING
|
||||
{
|
||||
OBJPROP_NAME = 5, // Object name
|
||||
OBJPROP_TEXT = 6, // Description of the object (the text contained in the object)
|
||||
OBJPROP_TOOLTIP = 206, // The text of a tooltip. If the property is not set, then the tooltip generated automatically by the terminal is shown. A tooltip can be disabled by setting the "\n" (line feed) value to it
|
||||
OBJPROP_LEVELTEXT = 205, // Level description
|
||||
OBJPROP_FONT = 1001, // Font
|
||||
OBJPROP_BMPFILE = 1017, // The name of BMP-file for Bitmap Label.
|
||||
OBJPROP_SYMBOL = 1021 // Symbol for the Chart object
|
||||
}
|
||||
|
||||
public enum ENUM_BORDER_TYPE
|
||||
{
|
||||
BORDER_FLAT = 0, // Flat form
|
||||
BORDER_RAISED = 1, // Prominent form
|
||||
BORDER_SUNKEN = 2 // Concave form
|
||||
}
|
||||
|
||||
public enum ENUM_ALIGN_MODE
|
||||
{
|
||||
ALIGN_LEFT = 1, // Left alignment
|
||||
ALIGN_CENTER = 2, // Centered (only for the Edit object)
|
||||
ALIGN_RIGHT = 0, // Right alignment
|
||||
}
|
||||
#endregion //Object Properties
|
||||
|
||||
#region Price Constants
|
||||
|
||||
public enum ENUM_APPLIED_PRICE
|
||||
{
|
||||
PRICE_CLOSE = 1, //Close price
|
||||
PRICE_OPEN = 2, //Open price
|
||||
PRICE_HIGH = 3, //The maximum price for the period
|
||||
PRICE_LOW = 4, //The minimum price for the period
|
||||
PRICE_MEDIAN = 5, //Median price, (high + low)/2
|
||||
PRICE_TYPICAL = 6, //Typical price, (high + low + close)/3
|
||||
PRICE_WEIGHTED = 7 //Average price, (high + low + close + close)/4
|
||||
}
|
||||
|
||||
public enum ENUM_APPLIED_VOLUME
|
||||
{
|
||||
VOLUME_TICK = 0, //Tick volume
|
||||
VOLUME_REAL = 1 //Trade volume
|
||||
}
|
||||
|
||||
public enum ENUM_STO_PRICE
|
||||
{
|
||||
STO_LOWHIGH = 0, //Calculation is based on Low/High prices
|
||||
STO_CLOSECLOSE = 1 //Calculation is based on Close/Close prices
|
||||
}
|
||||
|
||||
#endregion //Price Constants
|
||||
|
||||
#region Smoothing Methods
|
||||
|
||||
public enum ENUM_MA_METHOD
|
||||
{
|
||||
MODE_SMA = 0, //Simple averaging
|
||||
MODE_EMA = 1, //Exponential averaging
|
||||
MODE_SMMA = 2, //Smoothed averaging
|
||||
MODE_LWMA = 3 //Linear-weighted averaging
|
||||
}
|
||||
|
||||
#endregion //Smoothing Methods
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,7 +56,6 @@
|
||||
<Compile Include="Mt5Enums.cs" />
|
||||
<Compile Include="Mt5ConnectionEventArgs.cs" />
|
||||
<Compile Include="Mt5ConnectionState.cs" />
|
||||
<Compile Include="ExtensionMethods.cs" />
|
||||
<Compile Include="MqlTradeRequest.cs" />
|
||||
<Compile Include="MqlTradeResult.cs" />
|
||||
<Compile Include="Mt5QuoteEventArgs.cs" />
|
||||
@@ -68,9 +67,11 @@
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Mt5Quote.cs" />
|
||||
<Compile Include="Requests\CopyTicksRequest.cs" />
|
||||
<Compile Include="Requests\ICustomRequest.cs" />
|
||||
<Compile Include="Requests\RequestBase.cs" />
|
||||
<Compile Include="Requests\RequestType.cs" />
|
||||
<Compile Include="Responses\CopyTicksResponse.cs" />
|
||||
<Compile Include="Responses\ICustomResponse.cs" />
|
||||
<Compile Include="Responses\ResponseBase.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
+962
-120
File diff suppressed because it is too large
Load Diff
@@ -149,7 +149,7 @@ namespace MtApi5
|
||||
|
||||
return new ArrayList { (int)request.Action, request.Magic, request.Order, request.Symbol, request.Volume
|
||||
, request.Price, request.Stoplimit, request.Sl, request.Tp, request.Deviation, (int)request.Type
|
||||
, (int)request.Type_filling, (int)request.Type_time, exp, request.Comment };
|
||||
, (int)request.Type_filling, (int)request.Type_time, exp, request.Comment, request.Position, request.PositionBy };
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -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.11.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.11.0")]
|
||||
[assembly: AssemblyVersion("1.0.15")]
|
||||
[assembly: AssemblyFileVersion("1.0.15")]
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
using System.Collections;
|
||||
|
||||
namespace MtApi5.Requests
|
||||
{
|
||||
internal class ICustomRequest : RequestBase
|
||||
{
|
||||
public enum ParametersType
|
||||
{
|
||||
Int = 0,
|
||||
Double = 1,
|
||||
String = 2,
|
||||
Boolean = 3
|
||||
}
|
||||
|
||||
public string Symbol { get; set; }
|
||||
public int Timeframe { get; set; }
|
||||
public string Name { get; set; }
|
||||
public ArrayList Params { get; set; }
|
||||
public ParametersType ParamsType { get; set; }
|
||||
|
||||
public override RequestType RequestType => RequestType.iCustom;
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
internal enum RequestType
|
||||
{
|
||||
Unknown = 0,
|
||||
CopyTicks = 1
|
||||
CopyTicks = 1,
|
||||
iCustom = 2
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace MtApi5.Responses
|
||||
{
|
||||
internal class ICustomResponse: ResponseBase
|
||||
{
|
||||
public int Value { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,7 @@
|
||||
<OutputType>Package</OutputType>
|
||||
<WixTargetsPath Condition=" '$(WixTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
|
||||
<WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
|
||||
<RunWixToolsOutOfProc>true</RunWixToolsOutOfProc>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||
<OutputPath>..\build\installers\$(Configuration)\</OutputPath>
|
||||
|
||||
@@ -254,8 +254,13 @@
|
||||
</Grid>
|
||||
</Expander>
|
||||
|
||||
<StackPanel Grid.Row="1" Orientation="Horizontal">
|
||||
<Button Content="OrderSend" Command="{Binding OrderSendCommand}" Width="100" Height="25"/>
|
||||
<StackPanel Grid.Row="1" Orientation="Vertical">
|
||||
<Button Content="OrderSend" Command="{Binding OrderSendCommand}" Width="100" Height="25" HorizontalAlignment="Left" Margin="4"/>
|
||||
<Button Content="HistoryDealGetDouble" Command="{Binding HistoryDealGetDoubleCommand}" Height="25" HorizontalAlignment="Left" Margin="4"/>
|
||||
<Button Content="HistoryDealGetInteger" Command="{Binding HistoryDealGetIntegerCommand}" Height="25" HorizontalAlignment="Left" Margin="4"/>
|
||||
<Button Content="HistoryDealGetString" Command="{Binding HistoryDealGetStringCommand}" Height="25" HorizontalAlignment="Left" Margin="4"/>
|
||||
<Button Content="HistoryOrderGetInteger" Command="{Binding HistoryOrderGetIntegerCommand}" Height="25" HorizontalAlignment="Left" Margin="4"/>
|
||||
<Button Content="HistoryDealMethods" Command="{Binding HistoryDealMethodsCommand}" Height="25" HorizontalAlignment="Left" Margin="4"/>
|
||||
</StackPanel>
|
||||
|
||||
</Grid>
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.ComponentModel;
|
||||
using MtApi5;
|
||||
|
||||
@@ -29,7 +26,7 @@ namespace MtApi5TestClient
|
||||
}
|
||||
}
|
||||
|
||||
public uint Magic
|
||||
public ulong Magic
|
||||
{
|
||||
get { return TradeRequest.Magic; }
|
||||
set
|
||||
@@ -109,7 +106,7 @@ namespace MtApi5TestClient
|
||||
}
|
||||
}
|
||||
|
||||
public uint Deviation
|
||||
public ulong Deviation
|
||||
{
|
||||
get { return TradeRequest.Deviation; }
|
||||
set
|
||||
|
||||
@@ -16,6 +16,11 @@ namespace MtApi5TestClient
|
||||
public DelegateCommand DisconnectCommand { get; private set; }
|
||||
|
||||
public DelegateCommand OrderSendCommand { get; private set; }
|
||||
public DelegateCommand HistoryOrderGetIntegerCommand { get; private set; }
|
||||
public DelegateCommand HistoryDealGetDoubleCommand { get; private set; }
|
||||
public DelegateCommand HistoryDealGetIntegerCommand { get; private set; }
|
||||
public DelegateCommand HistoryDealGetStringCommand { get; private set; }
|
||||
public DelegateCommand HistoryDealMethodsCommand { get; private set; }
|
||||
|
||||
public DelegateCommand AccountInfoDoubleCommand { get; private set; }
|
||||
public DelegateCommand AccountInfoIntegerCommand { get; private set; }
|
||||
@@ -193,6 +198,11 @@ namespace MtApi5TestClient
|
||||
DisconnectCommand = new DelegateCommand(ExecuteDisconnect, CanExecuteDisconnect);
|
||||
|
||||
OrderSendCommand = new DelegateCommand(ExecuteOrderSend);
|
||||
HistoryOrderGetIntegerCommand = new DelegateCommand(ExecuteHistoryOrderGetInteger);
|
||||
HistoryDealGetDoubleCommand = new DelegateCommand(ExecuteHistoryDealGetDouble);
|
||||
HistoryDealGetIntegerCommand = new DelegateCommand(ExecuteHistoryDealGetInteger);
|
||||
HistoryDealGetStringCommand = new DelegateCommand(ExecuteHistoryDealGetString);
|
||||
HistoryDealMethodsCommand = new DelegateCommand(ExecuteHistoryDealMethods);
|
||||
|
||||
AccountInfoDoubleCommand = new DelegateCommand(ExecuteAccountInfoDouble);
|
||||
AccountInfoIntegerCommand = new DelegateCommand(ExecuteAccountInfoInteger);
|
||||
@@ -271,6 +281,66 @@ namespace MtApi5TestClient
|
||||
AddLog(message);
|
||||
}
|
||||
|
||||
private async void ExecuteHistoryOrderGetInteger(object o)
|
||||
{
|
||||
const ulong ticket = 12345;
|
||||
const ENUM_ORDER_PROPERTY_INTEGER propertyId = ENUM_ORDER_PROPERTY_INTEGER.ORDER_POSITION_ID;
|
||||
|
||||
var retVal = await Execute(() => _mtApiClient.HistoryOrderGetInteger(ticket, propertyId));
|
||||
|
||||
AddLog($"HistoryOrderGetInteger: {retVal}");
|
||||
}
|
||||
|
||||
private async void ExecuteHistoryDealGetDouble(object o)
|
||||
{
|
||||
const ulong ticket = 12345;
|
||||
const ENUM_DEAL_PROPERTY_DOUBLE propertyId = ENUM_DEAL_PROPERTY_DOUBLE.DEAL_PROFIT;
|
||||
|
||||
var retVal = await Execute(() => _mtApiClient.HistoryDealGetDouble(ticket, propertyId));
|
||||
|
||||
AddLog($"HistoryDealGetDouble: {retVal}");
|
||||
}
|
||||
|
||||
private async void ExecuteHistoryDealGetInteger(object o)
|
||||
{
|
||||
const ulong ticket = 12345;
|
||||
const ENUM_DEAL_PROPERTY_INTEGER propertyId = ENUM_DEAL_PROPERTY_INTEGER.DEAL_TICKET;
|
||||
|
||||
var retVal = await Execute(() => _mtApiClient.HistoryDealGetInteger(ticket, propertyId));
|
||||
|
||||
AddLog($"HistoryDealGetInteger: {retVal}");
|
||||
}
|
||||
|
||||
private async void ExecuteHistoryDealGetString(object o)
|
||||
{
|
||||
const ulong ticket = 12345;
|
||||
const ENUM_DEAL_PROPERTY_STRING propertyId = ENUM_DEAL_PROPERTY_STRING.DEAL_SYMBOL;
|
||||
|
||||
var retVal = await Execute(() => _mtApiClient.HistoryDealGetString(ticket, propertyId));
|
||||
|
||||
AddLog($"HistoryDealGetString: {retVal}");
|
||||
}
|
||||
|
||||
private async void ExecuteHistoryDealMethods(object o)
|
||||
{
|
||||
try
|
||||
{
|
||||
var posId = await Execute(() => _mtApiClient.PositionGetInteger(ENUM_POSITION_PROPERTY_INTEGER.POSITION_IDENTIFIER)); // posId = 7247951
|
||||
var history = await Execute(() => _mtApiClient.HistorySelectByPosition(posId)); // history = true
|
||||
var historyDealsTotal = await Execute(() => _mtApiClient.HistoryDealsTotal()); // historyDealsCount = 4
|
||||
var histDealTicket = await Execute(() => _mtApiClient.HistoryDealGetTicket(0)); // histDealTicket = 6632442
|
||||
var histDealPrice = await Execute(() => _mtApiClient.HistoryDealGetDouble(histDealTicket, ENUM_DEAL_PROPERTY_DOUBLE.DEAL_PRICE)); // Exception
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// ex.Messsage = "Service connection failed! Ошибка сериализации параметра http://tempuri.org/:command. Сообщение InnerException было \"Тип \"MtApi5.ENUM_DEAL_PROPERTY_DOUBLE\" с именем контракта данных \"ENUM_DEAL_PROPERTY_DOUBLE:http://schemas.datacontract.org/2004/07/MtApi5\" не ожидается. Попробуйте использовать DataContractResolver, если вы используете DataContractSerializer, или добавьте любые статически неизвестные типы в список известных типов - например, используя атрибут KnownTypeAttribute или путем их добавления в список известных типов, передаваемый в сериализатор.\". Подробнее см. InnerException."
|
||||
AddLog(ex.Message);
|
||||
return;
|
||||
}
|
||||
|
||||
AddLog("ExecuteHistoryDealMethods: success.");
|
||||
}
|
||||
|
||||
private async void ExecuteAccountInfoDouble(object o)
|
||||
{
|
||||
var result = await Execute(() => _mtApiClient.AccountInfoDouble(AccountInfoDoublePropertyId));
|
||||
@@ -745,13 +815,14 @@ namespace MtApi5TestClient
|
||||
const string symbol = "EURUSD";
|
||||
const ENUM_ORDER_TYPE orderType = ENUM_ORDER_TYPE.ORDER_TYPE_BUY;
|
||||
const double volume = 0.1;
|
||||
const double price = 1.013;
|
||||
const double sl = 1.00;
|
||||
const double tp = 1.020;
|
||||
const double price = 1.18129;
|
||||
const double sl = 1.1811;
|
||||
const double tp = 1.1814;
|
||||
const string comment = "Test PositionOpen";
|
||||
MqlTradeResult tradeResult = null;
|
||||
|
||||
var retVal = await Execute (() => _mtApiClient.PositionOpen(symbol, orderType, volume, price, sl, tp, comment));
|
||||
AddLog($"PositionOpen: symbol EURUSD result = {retVal}");
|
||||
var retVal = await Execute (() => _mtApiClient.PositionOpen(symbol, orderType, volume, price, sl, tp, comment, out tradeResult));
|
||||
AddLog($"PositionOpen: symbol EURUSD retVal = {retVal}, result = {tradeResult}");
|
||||
}
|
||||
|
||||
private async void ExecutePrint(object obj)
|
||||
|
||||
+826
-247
File diff suppressed because it is too large
Load Diff
@@ -33,12 +33,17 @@ namespace TestApiClientUI
|
||||
comboBox8.DataSource = Enum.GetNames(typeof(MarketInfoModeType));
|
||||
comboBox9.DataSource = Enum.GetNames(typeof(EnumTerminalInfoInteger));
|
||||
comboBox10.DataSource = Enum.GetNames(typeof(EnumTerminalInfoDouble));
|
||||
comboBox11.DataSource = Enum.GetNames(typeof(EnumObject));
|
||||
comboBox12.DataSource = Enum.GetNames(typeof(ENUM_TERMINAL_INFO_STRING));
|
||||
comboBoxAccountInfoCmd.DataSource = Enum.GetNames(typeof(TradeOperation));
|
||||
|
||||
_apiClient.QuoteUpdated += apiClient_QuoteUpdated;
|
||||
_apiClient.QuoteUpdate += _apiClient_QuoteUpdate;
|
||||
_apiClient.QuoteAdded += apiClient_QuoteAdded;
|
||||
_apiClient.QuoteRemoved += apiClient_QuoteRemoved;
|
||||
_apiClient.ConnectionStateChanged += apiClient_ConnectionStateChanged;
|
||||
_apiClient.OnLastTimeBar += _apiClient_OnLastTimeBar;
|
||||
_apiClient.OnChartEvent += _apiClient_OnChartEvent;
|
||||
|
||||
InitOrderCommandsGroup();
|
||||
|
||||
@@ -47,6 +52,8 @@ namespace TestApiClientUI
|
||||
comboBox3.SelectedIndex = 0;
|
||||
comboBox4.SelectedIndex = 0;
|
||||
comboBox5.SelectedIndex = 0;
|
||||
comboBox11.SelectedIndex = 0;
|
||||
comboBoxAccountInfoCmd.SelectedIndex = 0;
|
||||
|
||||
_timerTradeMonitor = new TimerTradeMonitor(_apiClient) { Interval = 10000 }; // 10 sec
|
||||
_timerTradeMonitor.AvailabilityOrdersChanged += _tradeMonitor_AvailabilityOrdersChanged;
|
||||
@@ -112,18 +119,32 @@ namespace TestApiClientUI
|
||||
|
||||
private void apiClient_QuoteRemoved(object sender, MtQuoteEventArgs e)
|
||||
{
|
||||
RunOnUiThread(() => RemoveQuote(e.Quote) );
|
||||
if (e.Quote != null)
|
||||
{
|
||||
RunOnUiThread(() => RemoveQuote(e.Quote));
|
||||
}
|
||||
}
|
||||
|
||||
private void apiClient_QuoteAdded(object sender, MtQuoteEventArgs e)
|
||||
{
|
||||
RunOnUiThread(() => AddNewQuote(e.Quote));
|
||||
if (e.Quote != null)
|
||||
{
|
||||
RunOnUiThread(() => AddNewQuote(e.Quote));
|
||||
}
|
||||
}
|
||||
|
||||
private void _apiClient_OnLastTimeBar(object sender, TimeBarArgs e)
|
||||
{
|
||||
var msg =
|
||||
$"TimeBar: Symbol = {e.TimeBar.Symbol}, OpenTime = {e.TimeBar.OpenTime}, CloseTime = {e.TimeBar.CloseTime}, Open = {e.TimeBar.Open}, Close = {e.TimeBar.Close}, High = {e.TimeBar.High}, Low = {e.TimeBar.Low}";
|
||||
$"TimeBar: ExpertHandle = {e.ExpertHandle}, Symbol = {e.TimeBar.Symbol}, OpenTime = {e.TimeBar.OpenTime}, CloseTime = {e.TimeBar.CloseTime}, Open = {e.TimeBar.Open}, Close = {e.TimeBar.Close}, High = {e.TimeBar.High}, Low = {e.TimeBar.Low}";
|
||||
Console.WriteLine(msg);
|
||||
PrintLog(msg);
|
||||
}
|
||||
|
||||
private void _apiClient_OnChartEvent(object sender, ChartEventArgs e)
|
||||
{
|
||||
var msg =
|
||||
$"OnChartEvent: ExpertHandle = {e.ExpertHandle}, ChartId = {e.ChartId}, EventId = {e.EventId}, Lparam = {e.Lparam}, Dparam = {e.Dparam}, Sparam = {e.Sparam}";
|
||||
Console.WriteLine(msg);
|
||||
PrintLog(msg);
|
||||
}
|
||||
@@ -131,72 +152,52 @@ namespace TestApiClientUI
|
||||
private void apiClient_QuoteUpdated(object sender, string symbol, double bid, double ask)
|
||||
{
|
||||
Console.WriteLine(@"Quote: Symbol = {0}, Bid = {1}, Ask = {2}", symbol, bid, ask);
|
||||
}
|
||||
|
||||
private void _apiClient_QuoteUpdate(object sender, MtQuoteEventArgs e)
|
||||
{
|
||||
//if UI of quite is busy we are skipping this update
|
||||
if (_isUiQuoteUpdateReady)
|
||||
{
|
||||
RunOnUiThread(() => ChangeQuote(symbol, bid, ask));
|
||||
RunOnUiThread(() => ChangeQuote(e.Quote));
|
||||
}
|
||||
}
|
||||
|
||||
private void AddNewQuote(MtQuote quote)
|
||||
{
|
||||
if (quote == null)
|
||||
return;
|
||||
var key = quote.ExpertHandle.ToString();
|
||||
|
||||
if (string.IsNullOrEmpty(quote.Instrument) == false
|
||||
&& listViewQuotes.Items.ContainsKey(quote.Instrument) == false)
|
||||
if (listViewQuotes.Items.ContainsKey(key) == false)
|
||||
{
|
||||
var item = new ListViewItem(quote.Instrument) { Name = quote.Instrument };
|
||||
var item = new ListViewItem(quote.Instrument) { Name = key };
|
||||
item.SubItems.Add(quote.Bid.ToString(CultureInfo.CurrentCulture));
|
||||
item.SubItems.Add(quote.Ask.ToString(CultureInfo.CurrentCulture));
|
||||
item.SubItems.Add("1");
|
||||
item.SubItems.Add(key);
|
||||
listViewQuotes.Items.Add(item);
|
||||
}
|
||||
else
|
||||
{
|
||||
var item = listViewQuotes.Items[quote.Instrument];
|
||||
int feedCount;
|
||||
int.TryParse(item.SubItems[3].Text, out feedCount);
|
||||
feedCount++;
|
||||
item.SubItems[3].Text = feedCount.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
private void RemoveQuote(MtQuote quote)
|
||||
{
|
||||
if (quote == null)
|
||||
return;
|
||||
var key = quote.ExpertHandle.ToString();
|
||||
|
||||
if (string.IsNullOrEmpty(quote.Instrument) == false
|
||||
&& listViewQuotes.Items.ContainsKey(quote.Instrument))
|
||||
if (listViewQuotes.Items.ContainsKey(key))
|
||||
{
|
||||
var item = listViewQuotes.Items[quote.Instrument];
|
||||
int feedCount;
|
||||
int.TryParse(item.SubItems[3].Text, out feedCount);
|
||||
feedCount--;
|
||||
if (feedCount <= 0)
|
||||
{
|
||||
listViewQuotes.Items.RemoveByKey(quote.Instrument);
|
||||
}
|
||||
else
|
||||
{
|
||||
item.SubItems[3].Text = feedCount.ToString();
|
||||
}
|
||||
listViewQuotes.Items.RemoveByKey(key);
|
||||
}
|
||||
}
|
||||
|
||||
private void ChangeQuote(string symbol, double bid, double ask)
|
||||
private void ChangeQuote(MtQuote quote)
|
||||
{
|
||||
_isUiQuoteUpdateReady = false;
|
||||
|
||||
if (string.IsNullOrEmpty(symbol) == false)
|
||||
var key = quote.ExpertHandle.ToString();
|
||||
|
||||
if (listViewQuotes.Items.ContainsKey(key))
|
||||
{
|
||||
if (listViewQuotes.Items.ContainsKey(symbol))
|
||||
{
|
||||
var item = listViewQuotes.Items[symbol];
|
||||
item.SubItems[1].Text = bid.ToString(CultureInfo.CurrentCulture);
|
||||
item.SubItems[2].Text = ask.ToString(CultureInfo.CurrentCulture);
|
||||
}
|
||||
var item = listViewQuotes.Items[key];
|
||||
item.SubItems[1].Text = quote.Bid.ToString(CultureInfo.CurrentCulture);
|
||||
item.SubItems[2].Text = quote.Ask.ToString(CultureInfo.CurrentCulture);
|
||||
}
|
||||
|
||||
_isUiQuoteUpdateReady = true;
|
||||
@@ -256,6 +257,12 @@ namespace TestApiClientUI
|
||||
textBoxOrderSymbol.Text = listViewQuotes.SelectedItems[0].Text;
|
||||
txtMarketInfoSymbol.Text = listViewQuotes.SelectedItems[0].Text;
|
||||
textBoxSelectedSymbol.Text = listViewQuotes.SelectedItems[0].Text;
|
||||
textBoxAccountInfoSymbol.Text = listViewQuotes.SelectedItems[0].Text;
|
||||
|
||||
if (checkBox2.Checked)
|
||||
{
|
||||
_apiClient.ExecutorHandle = int.Parse(listViewQuotes.SelectedItems[0].SubItems[3].Text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -526,206 +533,6 @@ namespace TestApiClientUI
|
||||
});
|
||||
}
|
||||
|
||||
private void button3_Click(object sender, EventArgs e)
|
||||
{
|
||||
switch (comboBoxStatusCommand.SelectedIndex)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
var result = _apiClient.GetLastError();
|
||||
PrintLog($"GetLastError result: {result}");
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
{
|
||||
var result = _apiClient.IsConnected();
|
||||
PrintLog($"IsConnected result: {result}");
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
{
|
||||
var result = _apiClient.IsDemo();
|
||||
PrintLog($"IsDemo result: {result}");
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
{
|
||||
var result = _apiClient.IsDllsAllowed();
|
||||
PrintLog($"IsDllsAllowed result: {result}");
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
{
|
||||
var result = _apiClient.IsExpertEnabled();
|
||||
PrintLog($"IsExpertEnabled result: {result}");
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
{
|
||||
var result = _apiClient.IsLibrariesAllowed();
|
||||
PrintLog($"IsLibrariesAllowed result: {result}");
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
{
|
||||
var result = _apiClient.IsOptimization();
|
||||
PrintLog($"IsOptimization result: {result}");
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
{
|
||||
var result = _apiClient.IsStopped();
|
||||
PrintLog($"IsStopped result: {result}");
|
||||
}
|
||||
break;
|
||||
case 8:
|
||||
{
|
||||
var result = _apiClient.IsTesting();
|
||||
PrintLog($"IsTesting result: {result}");
|
||||
}
|
||||
break;
|
||||
case 9:
|
||||
{
|
||||
var result = _apiClient.IsTradeAllowed();
|
||||
PrintLog($"IsTradeAllowed result: {result}");
|
||||
}
|
||||
break;
|
||||
case 10:
|
||||
{
|
||||
var result = _apiClient.IsTradeContextBusy();
|
||||
PrintLog($"IsTradeContextBusy result: {result}");
|
||||
}
|
||||
break;
|
||||
case 11:
|
||||
{
|
||||
var result = _apiClient.IsVisualMode();
|
||||
PrintLog($"IsVisualMode result: {result}");
|
||||
}
|
||||
break;
|
||||
case 12:
|
||||
{
|
||||
var result = _apiClient.UninitializeReason();
|
||||
PrintLog($"UninitializeReason result: {result}");
|
||||
}
|
||||
break;
|
||||
case 13:
|
||||
{
|
||||
int errorCode;
|
||||
int.TryParse(textBoxErrorCode.Text, out errorCode);
|
||||
var result = _apiClient.ErrorDescription(errorCode);
|
||||
PrintLog($"ErrorDescription result: {result}");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private void button4_Click(object sender, EventArgs e)
|
||||
{
|
||||
switch (listBoxAccountInfo.SelectedIndex)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
var result = _apiClient.AccountBalance();
|
||||
PrintLog($"AccountBalance result: {result}");
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
{
|
||||
var result = _apiClient.AccountCredit();
|
||||
PrintLog($"AccountCredit result: {result}");
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
{
|
||||
var result = _apiClient.AccountCompany();
|
||||
PrintLog($"AccountCompany result: {result}");
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
{
|
||||
var result = _apiClient.AccountCurrency();
|
||||
PrintLog($"AccountCurrency result: {result}");
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
{
|
||||
var result = _apiClient.AccountEquity();
|
||||
PrintLog($"AccountEquity result: {result}");
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
{
|
||||
var result = _apiClient.AccountFreeMargin();
|
||||
PrintLog($"AccountFreeMargin result: {result}");
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
{
|
||||
var result = _apiClient.AccountFreeMarginCheck(textBoxAccountInfoSymbol.Text, (TradeOperation)comboBoxAccountInfoCmd.SelectedIndex, int.Parse(textBoxAccountInfoVolume.Text));
|
||||
PrintLog($"AccountFreeMarginCheck result: {result}");
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
{
|
||||
var result = _apiClient.AccountFreeMarginMode();
|
||||
PrintLog($"AccountFreeMarginMode result: {result}");
|
||||
}
|
||||
break;
|
||||
case 8:
|
||||
{
|
||||
var result = _apiClient.AccountLeverage();
|
||||
PrintLog($"AccountLeverage result: {result}");
|
||||
}
|
||||
break;
|
||||
case 9:
|
||||
{
|
||||
var result = _apiClient.AccountMargin();
|
||||
PrintLog($"AccountMargin result: {result}");
|
||||
}
|
||||
break;
|
||||
case 10:
|
||||
{
|
||||
var result = _apiClient.AccountName();
|
||||
PrintLog($"AccountName result: {result}");
|
||||
}
|
||||
break;
|
||||
case 11:
|
||||
{
|
||||
var result = _apiClient.AccountNumber();
|
||||
PrintLog($"AccountNumber result: {result}");
|
||||
}
|
||||
break;
|
||||
case 12:
|
||||
{
|
||||
var result = _apiClient.AccountProfit();
|
||||
PrintLog($"AccountProfit result: {result}");
|
||||
}
|
||||
break;
|
||||
case 13:
|
||||
{
|
||||
var result = _apiClient.AccountServer();
|
||||
PrintLog($"AccountServer result: {result}");
|
||||
}
|
||||
break;
|
||||
case 14:
|
||||
{
|
||||
var result = _apiClient.AccountStopoutLevel();
|
||||
PrintLog($"AccountStopoutLevel result: {result}");
|
||||
}
|
||||
break;
|
||||
case 15:
|
||||
{
|
||||
var result = _apiClient.AccountStopoutMode();
|
||||
PrintLog($"AccountStopoutMode result: {result}");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//MarketInfo
|
||||
private async void button5_Click(object sender, EventArgs e)
|
||||
{
|
||||
@@ -753,13 +560,13 @@ namespace TestApiClientUI
|
||||
|
||||
Console.WriteLine($"Finished time: {DateTime.Now}");
|
||||
|
||||
using (var file = new System.IO.StreamWriter($@"{System.IO.Path.GetTempPath()}\MtApi\test.txt"))
|
||||
{
|
||||
foreach (var value in openPriceList)
|
||||
{
|
||||
file.WriteLine(value);
|
||||
}
|
||||
}
|
||||
//using (var file = new System.IO.StreamWriter($@"{System.IO.Path.GetTempPath()}\MtApi\test.txt"))
|
||||
//{
|
||||
// foreach (var value in openPriceList)
|
||||
// {
|
||||
// file.WriteLine(value);
|
||||
// }
|
||||
//}
|
||||
}
|
||||
|
||||
private void button7_Click(object sender, EventArgs e)
|
||||
@@ -809,18 +616,28 @@ namespace TestApiClientUI
|
||||
listBoxProceHistory.DataSource = items;
|
||||
}
|
||||
|
||||
//TimeCurrent
|
||||
private void button13_Click(object sender, EventArgs e)
|
||||
{
|
||||
var retVal = _apiClient.TimeCurrent();
|
||||
PrintLog($"TimeCurrent result: {retVal}");
|
||||
}
|
||||
|
||||
//TimeLocal
|
||||
private void button14_Click(object sender, EventArgs e)
|
||||
{
|
||||
var retVal = _apiClient.TimeLocal();
|
||||
PrintLog($"TimeLocal result: {retVal}");
|
||||
}
|
||||
|
||||
//TimeGMT
|
||||
private void button73_Click(object sender, EventArgs e)
|
||||
{
|
||||
var retVal = _apiClient.TimeGMT();
|
||||
PrintLog($"TimeGMT result: {retVal}");
|
||||
}
|
||||
|
||||
//RefreshRates
|
||||
private void buttonRefreshRates_Click(object sender, EventArgs e)
|
||||
{
|
||||
var retVal = _apiClient.RefreshRates();
|
||||
@@ -832,9 +649,9 @@ namespace TestApiClientUI
|
||||
listBoxEventLog.Items.Clear();
|
||||
}
|
||||
|
||||
private async Task<TResult> Execute<TResult>(Func<TResult> func)
|
||||
private Task<TResult> Execute<TResult>(Func<TResult> func)
|
||||
{
|
||||
return await Task.Factory.StartNew(() =>
|
||||
return Task.Factory.StartNew(() =>
|
||||
{
|
||||
var result = default(TResult);
|
||||
try
|
||||
@@ -854,9 +671,30 @@ namespace TestApiClientUI
|
||||
});
|
||||
}
|
||||
|
||||
private Task Execute(Action action)
|
||||
{
|
||||
return Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
action();
|
||||
}
|
||||
catch (MtConnectionException ex)
|
||||
{
|
||||
PrintLog("MtExecutionException: " + ex.Message);
|
||||
}
|
||||
catch (MtExecutionException ex)
|
||||
{
|
||||
PrintLog("MtExecutionException: " + ex.Message + "; ErrorCode = " + ex.ErrorCode);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//OrderSend
|
||||
private async void button1_Click(object sender, EventArgs e)
|
||||
{
|
||||
var ticket = -1;
|
||||
|
||||
var symbol = textBoxOrderSymbol.Text;
|
||||
|
||||
var cmd = (TradeOperation) comboBoxOrderCommand.SelectedIndex;
|
||||
@@ -877,28 +715,43 @@ namespace TestApiClientUI
|
||||
|
||||
var comment = textBoxOrderComment.Text;
|
||||
|
||||
int magic;
|
||||
int.TryParse(textBoxOrderMagic.Text, out magic);
|
||||
|
||||
var expiration = DateTime.Now;
|
||||
|
||||
Color arrowColor;
|
||||
switch (comboBoxOrderColor.SelectedIndex)
|
||||
if (string.IsNullOrEmpty(comment))
|
||||
{
|
||||
case 0:
|
||||
arrowColor = Color.Green;
|
||||
break;
|
||||
case 1:
|
||||
arrowColor = Color.Blue;
|
||||
break;
|
||||
case 2:
|
||||
arrowColor = Color.Red;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
ticket = await Execute(() => _apiClient.OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit));
|
||||
}
|
||||
else
|
||||
{
|
||||
int magic;
|
||||
if (!int.TryParse(textBoxOrderMagic.Text, out magic))
|
||||
{
|
||||
ticket = await Execute(() => _apiClient.OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (comboBoxOrderColor.SelectedIndex < 0 || comboBoxOrderColor.SelectedIndex > 2)
|
||||
{
|
||||
ticket = await Execute(() => _apiClient.OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic));
|
||||
}
|
||||
else
|
||||
{
|
||||
var expiration = DateTime.Now.AddDays(1);
|
||||
Color arrowColor = Color.White;
|
||||
switch (comboBoxOrderColor.SelectedIndex)
|
||||
{
|
||||
case 0:
|
||||
arrowColor = Color.Green;
|
||||
break;
|
||||
case 1:
|
||||
arrowColor = Color.Blue;
|
||||
break;
|
||||
case 2:
|
||||
arrowColor = Color.Red;
|
||||
break;
|
||||
}
|
||||
ticket = await Execute(() => _apiClient.OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrowColor));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var ticket = await Execute(() => _apiClient.OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrowColor));
|
||||
|
||||
PrintLog($"Sended order result: ticket = {ticket}");
|
||||
}
|
||||
@@ -1286,5 +1139,365 @@ namespace TestApiClientUI
|
||||
var result = await Execute(() => _apiClient.TerminalInfoDouble(propId));
|
||||
PrintLog($"TerminalInfoDouble: result = {result}");
|
||||
}
|
||||
|
||||
//TerminalInfoString
|
||||
private async void button72_Click(object sender, EventArgs e)
|
||||
{
|
||||
ENUM_TERMINAL_INFO_STRING propId;
|
||||
Enum.TryParse(comboBox12.Text, out propId);
|
||||
|
||||
var result = await Execute(() => _apiClient.TerminalInfoString(propId));
|
||||
PrintLog($"TerminalInfoString: result = {result}");
|
||||
}
|
||||
|
||||
private void checkBox2_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
var checkbox = sender as CheckBox;
|
||||
if (checkbox == null)
|
||||
return;
|
||||
|
||||
int expertHandle = 0;
|
||||
if (checkbox.Checked)
|
||||
{
|
||||
if (listViewQuotes.SelectedItems.Count > 0)
|
||||
{
|
||||
expertHandle = int.Parse(listViewQuotes.SelectedItems[0].SubItems[3].Text);
|
||||
}
|
||||
}
|
||||
|
||||
_apiClient.ExecutorHandle = expertHandle;
|
||||
}
|
||||
|
||||
//GetLastError
|
||||
private async void button40_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.GetLastError);
|
||||
PrintLog($"GetLastError: result = {result}");
|
||||
RunOnUiThread(() => { textBoxErrorCode.Text = result.ToString(); });
|
||||
}
|
||||
|
||||
//ErrorDescription
|
||||
private async void button39_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (string.IsNullOrEmpty(textBoxErrorCode.Text))
|
||||
{
|
||||
MessageBox.Show(@"Error code is not defined!");
|
||||
textBoxErrorCode.Focus();
|
||||
return;
|
||||
}
|
||||
|
||||
int errorCode;
|
||||
if (int.TryParse(textBoxErrorCode.Text, out errorCode) == false)
|
||||
{
|
||||
MessageBox.Show(@"Failed to parse error code!");
|
||||
textBoxErrorCode.Focus();
|
||||
return;
|
||||
}
|
||||
|
||||
var result = await Execute(() => _apiClient.ErrorDescription(errorCode));
|
||||
PrintLog($"ErrorDescription: code = {errorCode}, description = {result}");
|
||||
}
|
||||
|
||||
//IsConnected
|
||||
private async void button41_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.IsConnected);
|
||||
PrintLog($"IsConnected: result = {result}");
|
||||
}
|
||||
|
||||
//IsDemo
|
||||
private async void button42_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.IsDemo);
|
||||
PrintLog($"IsDemo: result = {result}");
|
||||
}
|
||||
|
||||
//IsDllsAllowed
|
||||
private async void button43_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.IsDllsAllowed);
|
||||
PrintLog($"IsDllsAllowed: result = {result}");
|
||||
}
|
||||
|
||||
//IsExpertEnabled
|
||||
private async void button44_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.IsExpertEnabled);
|
||||
PrintLog($"IsExpertEnabled: result = {result}");
|
||||
}
|
||||
|
||||
//IsLibrariesAllowed
|
||||
private async void button45_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.IsLibrariesAllowed);
|
||||
PrintLog($"IsLibrariesAllowed: result = {result}");
|
||||
}
|
||||
|
||||
//IsOptimization
|
||||
private async void button46_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.IsOptimization);
|
||||
PrintLog($"IsOptimization: result = {result}");
|
||||
}
|
||||
|
||||
//IsStopped
|
||||
private async void button47_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.IsStopped);
|
||||
PrintLog($"IsStopped: result = {result}");
|
||||
}
|
||||
|
||||
//IsTesting
|
||||
private async void button48_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.IsTesting);
|
||||
PrintLog($"IsTesting: result = {result}");
|
||||
}
|
||||
|
||||
//IsTradeAllowed
|
||||
private async void button49_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.IsTradeAllowed);
|
||||
PrintLog($"IsTradeAllowed: result = {result}");
|
||||
}
|
||||
|
||||
//IsTradeContextBusy
|
||||
private async void button50_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.IsTradeContextBusy);
|
||||
PrintLog($"IsTradeContextBusy: result = {result}");
|
||||
}
|
||||
|
||||
//IsVisualMode
|
||||
private async void button51_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.IsVisualMode);
|
||||
PrintLog($"IsVisualMode: result = {result}");
|
||||
}
|
||||
|
||||
//UninitializeReason
|
||||
private async void button52_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.UninitializeReason);
|
||||
PrintLog($"UninitializeReason: result = {result}");
|
||||
}
|
||||
|
||||
//AccountBalance
|
||||
private async void button3_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.AccountBalance);
|
||||
PrintLog($"AccountBalance result: {result}");
|
||||
}
|
||||
|
||||
//AccountCredit
|
||||
private async void button53_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.AccountCredit);
|
||||
PrintLog($"AccountCredit result: {result}");
|
||||
}
|
||||
|
||||
//AccountCompany
|
||||
private async void button54_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.AccountCompany);
|
||||
PrintLog($"AccountCompany result: {result}");
|
||||
}
|
||||
|
||||
//AccountCurrency
|
||||
private async void button55_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.AccountCurrency);
|
||||
PrintLog($"AccountCurrency result: {result}");
|
||||
}
|
||||
|
||||
//AccountEquity
|
||||
private async void button56_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.AccountEquity);
|
||||
PrintLog($"AccountEquity result: {result}");
|
||||
}
|
||||
|
||||
//AccountFreeMargin
|
||||
private async void button57_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.AccountFreeMargin);
|
||||
PrintLog($"AccountFreeMargin result: {result}");
|
||||
}
|
||||
|
||||
//AccountFreeMarginCheck
|
||||
private async void button58_Click(object sender, EventArgs e)
|
||||
{
|
||||
var symbol = textBoxAccountInfoSymbol.Text;
|
||||
if (string.IsNullOrEmpty(symbol))
|
||||
{
|
||||
MessageBox.Show(@"Symbol is not defined!");
|
||||
textBoxAccountInfoSymbol.Focus();
|
||||
return;
|
||||
}
|
||||
|
||||
double volume;
|
||||
if (double.TryParse(textBoxAccountInfoVolume.Text, out volume) == false)
|
||||
{
|
||||
MessageBox.Show(@"Failed to parse volume value!");
|
||||
textBoxAccountInfoVolume.Focus();
|
||||
return;
|
||||
}
|
||||
|
||||
TradeOperation cmd;
|
||||
Enum.TryParse(comboBoxAccountInfoCmd.Text, out cmd);
|
||||
|
||||
var result = await Execute(() => _apiClient.AccountFreeMarginCheck(symbol, cmd, volume));
|
||||
PrintLog($"AccountFreeMarginCheck result: {result}");
|
||||
}
|
||||
|
||||
//AccountFreeMarginMode
|
||||
private async void button59_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.AccountFreeMarginMode);
|
||||
PrintLog($"AccountFreeMarginMode result: {result}");
|
||||
}
|
||||
|
||||
//AccountLeverage
|
||||
private async void button60_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.AccountLeverage);
|
||||
PrintLog($"AccountLeverage result: {result}");
|
||||
}
|
||||
|
||||
//AccountMargin
|
||||
private async void button61_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.AccountMargin);
|
||||
PrintLog($"AccountMargin result: {result}");
|
||||
}
|
||||
|
||||
//AccountName
|
||||
private async void button62_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.AccountName);
|
||||
PrintLog($"AccountName result: {result}");
|
||||
}
|
||||
|
||||
//AccountNumber
|
||||
private async void button63_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.AccountNumber);
|
||||
PrintLog($"AccountNumber result: {result}");
|
||||
}
|
||||
|
||||
//AccountProfit
|
||||
private async void button64_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.AccountProfit);
|
||||
PrintLog($"AccountProfit result: {result}");
|
||||
}
|
||||
|
||||
//AccountServer
|
||||
private async void button65_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.AccountServer);
|
||||
PrintLog($"AccountServer result: {result}");
|
||||
}
|
||||
|
||||
//AccountStopoutLevel
|
||||
private async void button66_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.AccountStopoutLevel);
|
||||
PrintLog($"AccountStopoutLevel result: {result}");
|
||||
}
|
||||
|
||||
//AccountStopoutMode
|
||||
private async void button67_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.AccountStopoutMode);
|
||||
PrintLog($"AccountStopoutMode result: {result}");
|
||||
}
|
||||
|
||||
//CharID
|
||||
private async void button37_Click(object sender, EventArgs e)
|
||||
{
|
||||
var result = await Execute(_apiClient.ChartId);
|
||||
PrintLog($"CharID: result = {result}");
|
||||
RunOnUiThread(() => textBoxChartId.Text = result.ToString());
|
||||
}
|
||||
|
||||
//ChartRedraw
|
||||
private async void button38_Click(object sender, EventArgs e)
|
||||
{
|
||||
await Execute(() => _apiClient.ChartRedraw());
|
||||
PrintLog($"ChartRedraw: called.");
|
||||
}
|
||||
|
||||
//ObjectCreate
|
||||
private async void button4_Click(object sender, EventArgs e)
|
||||
{
|
||||
const long chartId = 0;
|
||||
const string objectName = "label_object";
|
||||
EnumObject objectType;
|
||||
Enum.TryParse(comboBox11.Text, out objectType);
|
||||
|
||||
var result = await Execute(() => _apiClient.ObjectCreate(chartId, objectName, objectType, 0, null, 0));
|
||||
PrintLog($"ObjectCreate result: {result}");
|
||||
}
|
||||
|
||||
//ObjectName
|
||||
private async void button68_Click(object sender, EventArgs e)
|
||||
{
|
||||
const long chartId = 0;
|
||||
const int objectIndex = 0;
|
||||
|
||||
var result = await Execute(() => _apiClient.ObjectName(chartId, objectIndex));
|
||||
PrintLog($"ObjectName result: {result}");
|
||||
}
|
||||
|
||||
private void button69_Click(object sender, EventArgs e)
|
||||
{
|
||||
_apiClient.UnlockTicks();
|
||||
}
|
||||
|
||||
private async void button70_Click(object sender, EventArgs e)
|
||||
{
|
||||
var login = textBoxAccountLogin.Text;
|
||||
var password = textBoxAccountPassword.Text;
|
||||
var host = textBoxAccountHost.Text;
|
||||
|
||||
if (string.IsNullOrEmpty(login))
|
||||
{
|
||||
MessageBox.Show(@"Login is not defined!", @"Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||||
textBoxAccountLogin.Focus();
|
||||
return;
|
||||
}
|
||||
if (string.IsNullOrEmpty(password))
|
||||
{
|
||||
MessageBox.Show(@"Password is not defined!", @"Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||||
textBoxAccountPassword.Focus();
|
||||
return;
|
||||
}
|
||||
if (string.IsNullOrEmpty(host))
|
||||
{
|
||||
MessageBox.Show(@"Host is not defined!", @"Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||||
textBoxAccountHost.Focus();
|
||||
return;
|
||||
}
|
||||
|
||||
var result = await Execute(() => _apiClient.ChangeAccount(login, password, host));
|
||||
PrintLog($"ChangeAccount result: {result}");
|
||||
}
|
||||
|
||||
//iBarShift
|
||||
private async void button71_Click(object sender, EventArgs e)
|
||||
{
|
||||
const string symbol = "EURUSD";
|
||||
const ChartPeriod timeframe = ChartPeriod.PERIOD_D1;
|
||||
|
||||
var time1 = _apiClient.TimeCurrent();
|
||||
var time2 = _apiClient.iTime(symbol, timeframe, 5);
|
||||
|
||||
var result1 = await Execute(() => _apiClient.iBarShift(symbol, timeframe, time1, true));
|
||||
var result2 = await Execute(() => _apiClient.iBarShift(symbol, timeframe, time2, true));
|
||||
|
||||
PrintLog($"iBarShift result1 = {result1}, time = {time1}");
|
||||
PrintLog($"iBarShift result2 = {result2}, time = {time2}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client" />
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
|
||||
</startup>
|
||||
</configuration>
|
||||
</configuration>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <auto-generated>
|
||||
' This code was generated by a tool.
|
||||
' Runtime Version:4.0.30319.17929
|
||||
' Runtime Version:4.0.30319.42000
|
||||
'
|
||||
' Changes to this file may cause incorrect behavior and will be lost if
|
||||
' the code is regenerated.
|
||||
|
||||
+13
-12
@@ -1,7 +1,7 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <auto-generated>
|
||||
' This code was generated by a tool.
|
||||
' Runtime Version:4.0.30319.17929
|
||||
' Runtime Version:4.0.30319.42000
|
||||
'
|
||||
' Changes to this file may cause incorrect behavior and will be lost if
|
||||
' the code is regenerated.
|
||||
@@ -11,6 +11,7 @@
|
||||
Option Strict On
|
||||
Option Explicit On
|
||||
|
||||
Imports System
|
||||
|
||||
Namespace My.Resources
|
||||
|
||||
@@ -21,20 +22,20 @@ Namespace My.Resources
|
||||
'''<summary>
|
||||
''' A strongly-typed resource class, for looking up localized strings, etc.
|
||||
'''</summary>
|
||||
<Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0"), _
|
||||
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||
Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
|
||||
<Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0"), _
|
||||
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||
Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
|
||||
Friend Module Resources
|
||||
|
||||
|
||||
Private resourceMan As Global.System.Resources.ResourceManager
|
||||
|
||||
|
||||
Private resourceCulture As Global.System.Globalization.CultureInfo
|
||||
|
||||
|
||||
'''<summary>
|
||||
''' Returns the cached ResourceManager instance used by this class.
|
||||
'''</summary>
|
||||
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
|
||||
Get
|
||||
If Object.ReferenceEquals(resourceMan, Nothing) Then
|
||||
@@ -44,17 +45,17 @@ Namespace My.Resources
|
||||
Return resourceMan
|
||||
End Get
|
||||
End Property
|
||||
|
||||
|
||||
'''<summary>
|
||||
''' Overrides the current thread's CurrentUICulture property for all
|
||||
''' resource lookups using this strongly typed resource class.
|
||||
'''</summary>
|
||||
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Friend Property Culture() As Global.System.Globalization.CultureInfo
|
||||
Get
|
||||
Return resourceCulture
|
||||
End Get
|
||||
Set(ByVal value As Global.System.Globalization.CultureInfo)
|
||||
Set
|
||||
resourceCulture = value
|
||||
End Set
|
||||
End Property
|
||||
|
||||
+26
-26
@@ -1,7 +1,7 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <auto-generated>
|
||||
' This code was generated by a tool.
|
||||
' Runtime Version:4.0.30319.17929
|
||||
' Runtime Version:4.0.30319.42000
|
||||
'
|
||||
' Changes to this file may cause incorrect behavior and will be lost if
|
||||
' the code is regenerated.
|
||||
@@ -13,42 +13,42 @@ Option Explicit On
|
||||
|
||||
|
||||
Namespace My
|
||||
|
||||
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0"), _
|
||||
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
|
||||
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0"), _
|
||||
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Partial Friend NotInheritable Class MySettings
|
||||
Inherits Global.System.Configuration.ApplicationSettingsBase
|
||||
|
||||
Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings)
|
||||
|
||||
|
||||
Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings)
|
||||
|
||||
#Region "My.Settings Auto-Save Functionality"
|
||||
#If _MyType = "WindowsForms" Then
|
||||
Private Shared addedHandler As Boolean
|
||||
Private Shared addedHandler As Boolean
|
||||
|
||||
Private Shared addedHandlerLockObject As New Object
|
||||
Private Shared addedHandlerLockObject As New Object
|
||||
|
||||
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs)
|
||||
If My.Application.SaveMySettingsOnExit Then
|
||||
My.Settings.Save()
|
||||
End If
|
||||
End Sub
|
||||
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs)
|
||||
If My.Application.SaveMySettingsOnExit Then
|
||||
My.Settings.Save()
|
||||
End If
|
||||
End Sub
|
||||
#End If
|
||||
#End Region
|
||||
|
||||
|
||||
Public Shared ReadOnly Property [Default]() As MySettings
|
||||
Get
|
||||
|
||||
|
||||
#If _MyType = "WindowsForms" Then
|
||||
If Not addedHandler Then
|
||||
SyncLock addedHandlerLockObject
|
||||
If Not addedHandler Then
|
||||
AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
|
||||
addedHandler = True
|
||||
End If
|
||||
End SyncLock
|
||||
End If
|
||||
If Not addedHandler Then
|
||||
SyncLock addedHandlerLockObject
|
||||
If Not addedHandler Then
|
||||
AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
|
||||
addedHandler = True
|
||||
End If
|
||||
End SyncLock
|
||||
End If
|
||||
#End If
|
||||
Return defaultInstance
|
||||
End Get
|
||||
|
||||
@@ -13,8 +13,9 @@
|
||||
<AssemblyName>TestMtApi</AssemblyName>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<MyType>WindowsForms</MyType>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
|
||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||
<TargetFrameworkProfile>
|
||||
</TargetFrameworkProfile>
|
||||
<PublishUrl>publish\</PublishUrl>
|
||||
<Install>true</Install>
|
||||
<InstallFrom>Disk</InstallFrom>
|
||||
@@ -40,6 +41,7 @@
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DocumentationFile>TestMtApi.xml</DocumentationFile>
|
||||
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
@@ -50,6 +52,7 @@
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DocumentationFile>TestMtApi.xml</DocumentationFile>
|
||||
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionExplicit>On</OptionExplicit>
|
||||
@@ -67,7 +70,6 @@
|
||||
<ApplicationManifest>My Project\app.manifest</ApplicationManifest>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="MtApi, Version=1.0.7.0, Culture=neutral, processorArchitecture=MSIL" />
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Deployment" />
|
||||
@@ -126,6 +128,7 @@
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
<None Include="My Project\app.manifest" />
|
||||
<None Include="My Project\Application.myapp">
|
||||
<Generator>MyApplicationCodeGenerator</Generator>
|
||||
@@ -159,6 +162,12 @@
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\MtApi\MtApi.csproj">
|
||||
<Project>{7a76c388-a8fb-4949-8170-24d4742e934e}</Project>
|
||||
<Name>MtApi</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,163 @@
|
||||
//+----------------------------------------------------------------------------+
|
||||
//| mql4-auth.mqh |
|
||||
//+----------------------------------------------------------------------------+
|
||||
//| Built by Sergey Lukin |
|
||||
//| contact@sergeylukin.com |
|
||||
//+----------------------------------------------------------------------------+
|
||||
|
||||
#include <WinUser32.mqh>
|
||||
|
||||
#import "user32.dll"
|
||||
int GetAncestor(int,int);
|
||||
int GetLastActivePopup(int);
|
||||
int GetDlgItem(int,int);
|
||||
int GetParent(int hWnd);
|
||||
#import
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
bool loginDialogIsOpen()
|
||||
{
|
||||
int hwnd=WindowHandle(Symbol(),Period());
|
||||
int hMetaTrader,hLoginDialog=0;
|
||||
|
||||
// Retrieve Terminal Window Handler
|
||||
while(!IsStopped())
|
||||
{
|
||||
hwnd=GetParent(hwnd);
|
||||
if(hwnd==0) break;
|
||||
hMetaTrader=hwnd;
|
||||
}
|
||||
|
||||
hLoginDialog=GetLastActivePopup(hMetaTrader);
|
||||
if(hLoginDialog!=0)
|
||||
{
|
||||
return(true);
|
||||
} else {
|
||||
return(false);
|
||||
}
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
void closeLoginDialog()
|
||||
{
|
||||
int hwnd=WindowHandle(Symbol(),Period());
|
||||
int hMetaTrader,hLoginDialog=0,hCancelButton=0;
|
||||
|
||||
// Retrieve Terminal Window Handler
|
||||
while(!IsStopped())
|
||||
{
|
||||
hwnd=GetParent(hwnd);
|
||||
if(hwnd==0) break;
|
||||
hMetaTrader=hwnd;
|
||||
}
|
||||
|
||||
Sleep(60);
|
||||
|
||||
hLoginDialog=GetLastActivePopup(hMetaTrader);
|
||||
if(hLoginDialog!=0)
|
||||
{
|
||||
hCancelButton=GetDlgItem(hLoginDialog,0x2);
|
||||
if(hCancelButton!=0)
|
||||
{
|
||||
// Click "Cancel" button in Login Dialog
|
||||
PostMessageA(hCancelButton,0x00F5,0,0);
|
||||
}
|
||||
}
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
bool auth(string login,string passwd,string server)
|
||||
{
|
||||
datetime s=TimeLocal();
|
||||
int h = 0, e = 0, a = GetAncestor(WindowHandle(Symbol(), NULL), 2);
|
||||
int i = 0;
|
||||
|
||||
PostMessageA(a,WM_COMMAND,35429,0);
|
||||
|
||||
while(e==0)
|
||||
{
|
||||
// Give us up to a minute to find the Login dialog
|
||||
if(TimeLocal()-s>60)
|
||||
{
|
||||
return(false);
|
||||
}
|
||||
|
||||
h=GetLastActivePopup(a);
|
||||
|
||||
// Select login field
|
||||
e=GetDlgItem(h,0x49d);
|
||||
|
||||
Sleep(1);
|
||||
}
|
||||
|
||||
// Press DELETE key many times in login field to remove current value
|
||||
for(i=1; i<=100; i++)
|
||||
{
|
||||
PostMessageA(e,WM_KEYDOWN,0x2E,1);
|
||||
}
|
||||
// Iterate over characters in "login" string and pass them to login field one by one
|
||||
char login_chars[];
|
||||
string2CharsArray(login,login_chars);
|
||||
for(i=0; i<ArraySize(login_chars); i++)
|
||||
{
|
||||
PostMessageA(e,WM_CHAR,login_chars[i],0);
|
||||
}
|
||||
|
||||
// Select password field
|
||||
e=GetDlgItem(h,0x4c4);
|
||||
// Press DELETE key many times in password field to remove current value
|
||||
for(i=1; i<=100; i++)
|
||||
{
|
||||
PostMessageA(e,WM_KEYDOWN,0x2E,1);
|
||||
}
|
||||
// Iterate over characters in "passwd" string and pass them to password field one by one
|
||||
char password_chars[];
|
||||
string2CharsArray(passwd,password_chars);
|
||||
for(i=0; i<ArraySize(password_chars); i++)
|
||||
{
|
||||
PostMessageA(e,WM_CHAR,password_chars[i],0);
|
||||
}
|
||||
|
||||
// Select server field
|
||||
e=GetDlgItem(h,0x50d);
|
||||
// Press DELETE key many times in server field to remove current value
|
||||
for(i=1; i<=100; i++)
|
||||
{
|
||||
PostMessageA(e,WM_KEYDOWN,0x2E,1);
|
||||
}
|
||||
// Iterate over characters in "server" string and pass them to server field one by one
|
||||
char server_chars[];
|
||||
string2CharsArray(server,server_chars);
|
||||
|
||||
for(i=0; i<ArraySize(server_chars); i++)
|
||||
{
|
||||
PostMessageA(e,WM_CHAR,server_chars[i],0);
|
||||
}
|
||||
Sleep(2*1000);
|
||||
// Press submit button
|
||||
e=GetDlgItem(h,0x1);
|
||||
SendMessageA(e,0x00F5,0,0);
|
||||
|
||||
return(true);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
/*
|
||||
* Iterates over string and puts each character code in array
|
||||
*/
|
||||
void string2CharsArray(string myString,char &chars[])
|
||||
{
|
||||
int cnt=StringLen(myString);
|
||||
ArrayResize(chars,cnt);
|
||||
|
||||
for(int i=0; i<cnt; i++)
|
||||
{
|
||||
chars[i]=StringGetChar(myString,i);
|
||||
}
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
|
||||
Binary file not shown.
+5294
-1486
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user