mirror of
https://github.com/vdemydiuk/mtapi.git
synced 2026-07-31 20:47:51 +00:00
Compare commits
74 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7f33cebce1 | |||
| 84740787d5 | |||
| ad6bad5187 | |||
| 0086b02bc8 | |||
| f7e06c1570 | |||
| c86a3a3752 | |||
| be8a17c0fd | |||
| 5c6751de9b | |||
| 83776f8b7a | |||
| f1c1df1e00 | |||
| d6640300f5 | |||
| c9c188f697 | |||
| 3a4f561836 | |||
| bdb30edee3 | |||
| 29f501b055 | |||
| 521d7ea2c0 | |||
| 0e5bb40a6f | |||
| 14079dc3c1 | |||
| 3600a86971 | |||
| 83e62fbff7 | |||
| 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 |
@@ -36,5 +36,3 @@ using namespace System::Security::Permissions;
|
|||||||
[assembly:ComVisible(false)];
|
[assembly:ComVisible(false)];
|
||||||
|
|
||||||
[assembly:CLSCompliantAttribute(true)];
|
[assembly:CLSCompliantAttribute(true)];
|
||||||
|
|
||||||
[assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)];
|
|
||||||
|
|||||||
+136
-323
@@ -6,14 +6,15 @@
|
|||||||
#include "MT5Handler.h"
|
#include "MT5Handler.h"
|
||||||
|
|
||||||
#include "Windows.h"
|
#include "Windows.h"
|
||||||
#include < vcclr.h >
|
#include <vcclr.h>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
using namespace System;
|
using namespace System;
|
||||||
using namespace MTApiService;
|
using namespace MTApiService;
|
||||||
using namespace System::Runtime::InteropServices;
|
using namespace System::Runtime::InteropServices;
|
||||||
using namespace System::Reflection;
|
using namespace System::Reflection;
|
||||||
using namespace System::Text;
|
using namespace System::Text;
|
||||||
using namespace System::Collections::Generic;
|
using namespace System::Collections::Generic;
|
||||||
using namespace System::Diagnostics;
|
using namespace System::Diagnostics;
|
||||||
using namespace System::Security::Cryptography;
|
using namespace System::Security::Cryptography;
|
||||||
using namespace System::Security;
|
using namespace System::Security;
|
||||||
@@ -50,277 +51,162 @@ public struct CMqlBookInfo
|
|||||||
|
|
||||||
void convertSystemString(wchar_t* dest, String^ src)
|
void convertSystemString(wchar_t* dest, String^ src)
|
||||||
{
|
{
|
||||||
pin_ptr<const wchar_t> wch = PtrToStringChars(src);
|
if (src != nullptr) {
|
||||||
memcpy(dest, wch, wcslen(wch) * sizeof(wchar_t));
|
pin_ptr<const wchar_t> wch = PtrToStringChars(src);
|
||||||
dest[wcslen(wch)] = '\0';
|
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)
|
#define _DLLAPI extern "C" __declspec(dllexport)
|
||||||
{
|
|
||||||
bool verifyResult = false;
|
|
||||||
|
|
||||||
|
template <typename T> T Execute(std::function<T()> func, wchar_t* err, T default_value)
|
||||||
|
{
|
||||||
|
T result = default_value;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
DSACryptoServiceProvider^ dsa = gcnew DSACryptoServiceProvider();
|
result = func();
|
||||||
dsa->FromXmlString(publicKey);
|
|
||||||
array<System::Byte>^ data = UTF8Encoding::ASCII->GetBytes(inputData);
|
|
||||||
array<System::Byte>^ signatureData = Convert::FromBase64String(signature);
|
|
||||||
verifyResult = dsa->VerifyData(data, signatureData);
|
|
||||||
}
|
|
||||||
catch(Exception^ e)
|
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:VerifySignature(): failed. " + e->Message);
|
|
||||||
verifyResult = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return verifyResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool g_IsVerified = true;
|
|
||||||
|
|
||||||
void _stdcall verify(int isDemo, wchar_t* accountName, long accountNumber)
|
|
||||||
{
|
|
||||||
if (isDemo != 0)
|
|
||||||
{
|
|
||||||
g_IsVerified = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
System::String^ signature = MtRegistryManager::ReadSignatureKey(gcnew String(accountName), accountNumber.ToString());
|
|
||||||
Resources::ResourceManager^ rm = gcnew Resources::ResourceManager(L"MT5Connector.cl", Assembly::GetExecutingAssembly());
|
|
||||||
System::String^ inputData = gcnew System::String(accountName);
|
|
||||||
inputData += accountNumber.ToString();
|
|
||||||
System::String^ publicKey = rm->GetString(L"cl");
|
|
||||||
g_IsVerified = VerifySignature(inputData, gcnew System::String(signature), publicKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
int _stdcall initExpert(int expertHandle, int port, wchar_t* symbol, double bid, double ask, wchar_t* err)
|
|
||||||
{
|
|
||||||
if (g_IsVerified == false)
|
|
||||||
{
|
|
||||||
System::String^ errorVerified = "Verification is failed!\nPlease contact with support.";
|
|
||||||
convertSystemString(err, errorVerified);
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:initExpert(): not verified");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
MT5Handler^ mtHander = gcnew MT5Handler();
|
|
||||||
MtAdapter::GetInstance()->InitExpert(expertHandle, port, gcnew String(symbol), bid, ask, mtHander);
|
|
||||||
}
|
}
|
||||||
catch (Exception^ e)
|
catch (Exception^ e)
|
||||||
{
|
{
|
||||||
convertSystemString(err, e->Message);
|
convertSystemString(err, e->Message);
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:initExpert(): " + e->Message);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
return 1;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall deinitExpert(int expertHandle, wchar_t* err)
|
_DLLAPI int _stdcall initExpert(int expertHandle, int port, wchar_t* symbol, double bid, double ask, int isTestMode, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle, &port, symbol, &bid, &ask, &isTestMode]() {
|
||||||
{
|
bool isTesting = (isTestMode != 0) ? true : false;
|
||||||
MtAdapter::GetInstance()->DeinitExpert(expertHandle);
|
auto expert = gcnew Mt5Expert(expertHandle, gcnew String(symbol), bid, ask, gcnew MT5Handler(), isTesting);
|
||||||
}
|
MtAdapter::GetInstance()->AddExpert(port, expert);
|
||||||
catch (Exception^ e)
|
return 1;
|
||||||
{
|
}, err, 0);
|
||||||
convertSystemString(err, e->Message);
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:deinitExpert(): " + e->Message);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall updateQuote(int expertHandle, wchar_t* symbol, double bid, double ask, wchar_t* err)
|
_DLLAPI int _stdcall deinitExpert(int expertHandle, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle]() {
|
||||||
{
|
MtAdapter::GetInstance()->RemoveExpert(expertHandle);
|
||||||
|
return 1;
|
||||||
|
}, err, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
_DLLAPI int _stdcall updateQuote(int expertHandle, wchar_t* symbol, double bid, double ask, wchar_t* err)
|
||||||
|
{
|
||||||
|
return Execute<int>([&expertHandle, symbol, &bid, &ask]() {
|
||||||
MtAdapter::GetInstance()->SendQuote(expertHandle, gcnew String(symbol), bid, ask);
|
MtAdapter::GetInstance()->SendQuote(expertHandle, gcnew String(symbol), bid, ask);
|
||||||
}
|
return 1;
|
||||||
catch (Exception^ e)
|
}, err, 0);
|
||||||
{
|
|
||||||
convertSystemString(err, e->Message);
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:updateQuote(): " + e->Message);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall sendIntResponse(int expertHandle, int response)
|
_DLLAPI bool _stdcall sendEvent(int expertHandle, int eventType, wchar_t* payload, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<bool>([&expertHandle, &eventType, payload]() {
|
||||||
{
|
MtAdapter::GetInstance()->SendEvent(expertHandle, eventType, gcnew String(payload));
|
||||||
|
return true;
|
||||||
|
}, err, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
_DLLAPI int _stdcall sendIntResponse(int expertHandle, int response, wchar_t* err)
|
||||||
|
{
|
||||||
|
return Execute<int>([&expertHandle, &response]() {
|
||||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseInt(response));
|
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseInt(response));
|
||||||
}
|
return 1;
|
||||||
catch (Exception^ e)
|
}, err, 0);
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:sendIntResponse(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall sendLongResponse(int expertHandle, __int64 response)
|
_DLLAPI int _stdcall sendLongResponse(int expertHandle, __int64 response, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle, &response]() {
|
||||||
{
|
|
||||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseLong(response));
|
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseLong(response));
|
||||||
}
|
return 1;
|
||||||
catch (Exception^ e)
|
}, err, 0);
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:sendLongResponse(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall sendULongResponse(int expertHandle, unsigned __int64 response)
|
_DLLAPI int _stdcall sendULongResponse(int expertHandle, unsigned __int64 response, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle, &response]() {
|
||||||
{
|
|
||||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseULong(response));
|
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseULong(response));
|
||||||
}
|
return 1;
|
||||||
catch (Exception^ e)
|
}, err, 0);
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:sendLongResponse(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall sendBooleanResponse(int expertHandle, int response)
|
_DLLAPI int _stdcall sendBooleanResponse(int expertHandle, int response, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle, &response]() {
|
||||||
{
|
|
||||||
bool value = (response != 0) ? true : false;
|
bool value = (response != 0) ? true : false;
|
||||||
|
|
||||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseBool(value));
|
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseBool(value));
|
||||||
}
|
return 1;
|
||||||
catch (Exception^ e)
|
}, err, 0);
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:sendBooleanResponse(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall sendDoubleResponse(int expertHandle, double response)
|
_DLLAPI int _stdcall sendDoubleResponse(int expertHandle, double response, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle, &response]() {
|
||||||
{
|
|
||||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseDouble(response));
|
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseDouble(response));
|
||||||
}
|
return 1;
|
||||||
catch (Exception^ e)
|
}, err, 0);
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:sendDoubleResponse(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall sendStringResponse(int expertHandle, wchar_t* response)
|
_DLLAPI int _stdcall sendStringResponse(int expertHandle, wchar_t* response, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle, response]() {
|
||||||
{
|
|
||||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseString(gcnew String(response)));
|
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseString(gcnew String(response)));
|
||||||
}
|
return 1;
|
||||||
catch (Exception^ e)
|
}, err, 0);
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:sendStringResponse(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall sendVoidResponse(int expertHandle)
|
_DLLAPI int _stdcall sendVoidResponse(int expertHandle, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle]() {
|
||||||
{
|
|
||||||
MtAdapter::GetInstance()->SendResponse(expertHandle, nullptr);
|
MtAdapter::GetInstance()->SendResponse(expertHandle, nullptr);
|
||||||
}
|
return 1;
|
||||||
catch (Exception^ e)
|
}, err, 0);
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:sendVoidResponse(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall sendDoubleArrayResponse(int expertHandle, double* values, int size)
|
_DLLAPI int _stdcall sendDoubleArrayResponse(int expertHandle, double* values, int size, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle, values, &size]() {
|
||||||
{
|
|
||||||
array<double>^ list = gcnew array<double>(size);
|
array<double>^ list = gcnew array<double>(size);
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
for(int i = 0; i < size; i++)
|
|
||||||
{
|
|
||||||
list[i] = values[i];
|
list[i] = values[i];
|
||||||
}
|
|
||||||
|
|
||||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseDoubleArray(list));
|
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseDoubleArray(list));
|
||||||
}
|
return 1;
|
||||||
catch (Exception^ e)
|
}, err, 0);
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:sendDoubleArrayResponse(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall sendIntArrayResponse(int expertHandle, int* values, int size)
|
_DLLAPI int _stdcall sendIntArrayResponse(int expertHandle, int* values, int size, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle, values, &size]() {
|
||||||
{
|
|
||||||
array<int>^ list = gcnew array<int>(size);
|
array<int>^ list = gcnew array<int>(size);
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
for(int i = 0; i < size; i++)
|
|
||||||
{
|
|
||||||
list[i] = values[i];
|
list[i] = values[i];
|
||||||
}
|
|
||||||
|
|
||||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseIntArray(list));
|
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseIntArray(list));
|
||||||
}
|
return 1;
|
||||||
catch (Exception^ e)
|
}, err, 0);
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:sendIntArrayResponse(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall sendLongArrayResponse(int expertHandle, __int64* values, int size)
|
_DLLAPI int _stdcall sendLongArrayResponse(int expertHandle, __int64* values, int size, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle, values, &size]() {
|
||||||
{
|
|
||||||
array<System::Int64>^ list = gcnew array<System::Int64>(size);
|
array<System::Int64>^ list = gcnew array<System::Int64>(size);
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
for(int i = 0; i < size; i++)
|
|
||||||
{
|
|
||||||
list[i] = values[i];
|
list[i] = values[i];
|
||||||
}
|
|
||||||
|
|
||||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseLongArray(list));
|
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseLongArray(list));
|
||||||
}
|
return 1;
|
||||||
catch (Exception^ e)
|
}, err, 0);
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:sendLongArrayResponse(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall sendMqlRatesArrayResponse(int expertHandle, CMqlRates values[], int size)
|
_DLLAPI int _stdcall sendMqlRatesArrayResponse(int expertHandle, CMqlRates values[], int size, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle, values, &size]() {
|
||||||
{
|
|
||||||
array<MtMqlRates^>^ list = gcnew array<MtMqlRates^>(size);
|
array<MtMqlRates^>^ list = gcnew array<MtMqlRates^>(size);
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
for(int i = 0; i < size; i++)
|
|
||||||
{
|
{
|
||||||
MtMqlRates^ rates = gcnew MtMqlRates();
|
MtMqlRates^ rates = gcnew MtMqlRates();
|
||||||
rates->time = values[i].time;
|
rates->time = values[i].time;
|
||||||
@@ -331,180 +217,107 @@ int _stdcall sendMqlRatesArrayResponse(int expertHandle, CMqlRates values[], int
|
|||||||
rates->tick_volume = values[i].tick_volume;
|
rates->tick_volume = values[i].tick_volume;
|
||||||
rates->spread = values[i].spread;
|
rates->spread = values[i].spread;
|
||||||
rates->real_volume = values[i].real_volume;
|
rates->real_volume = values[i].real_volume;
|
||||||
|
|
||||||
list[i] = rates;
|
list[i] = rates;
|
||||||
}
|
}
|
||||||
|
|
||||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlRatesArray(list));
|
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlRatesArray(list));
|
||||||
}
|
return 1;
|
||||||
catch (Exception^ e)
|
}, err, 0);
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:sendMqlRatesArrayResponse(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall sendMqlTickResponse(int expertHandle, CMqlTick* response, int size)
|
_DLLAPI int _stdcall sendMqlTickResponse(int expertHandle, CMqlTick* response, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle, response]() {
|
||||||
{
|
|
||||||
MtMqlTick^ mtResponse = gcnew MtMqlTick();
|
MtMqlTick^ mtResponse = gcnew MtMqlTick();
|
||||||
|
|
||||||
mtResponse->time = response->time;
|
mtResponse->time = response->time;
|
||||||
mtResponse->bid = response->bid;
|
mtResponse->bid = response->bid;
|
||||||
mtResponse->ask = response->ask;
|
mtResponse->ask = response->ask;
|
||||||
mtResponse->last = response->last;
|
mtResponse->last = response->last;
|
||||||
mtResponse->volume = response->volume;
|
mtResponse->volume = response->volume;
|
||||||
|
|
||||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlTick(mtResponse));
|
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlTick(mtResponse));
|
||||||
}
|
return 1;
|
||||||
catch (Exception^ e)
|
}, err, 0);
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:sendMqlTickResponse(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall sendMqlBookInfoArrayResponse(int expertHandle, CMqlBookInfo values[], int size)
|
_DLLAPI int _stdcall sendMqlBookInfoArrayResponse(int expertHandle, CMqlBookInfo values[], int size, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle, values, &size]() {
|
||||||
{
|
|
||||||
array<MtMqlBookInfo^>^ list = gcnew array<MtMqlBookInfo^>(size);
|
array<MtMqlBookInfo^>^ list = gcnew array<MtMqlBookInfo^>(size);
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
for(int i = 0; i < size; i++)
|
|
||||||
{
|
{
|
||||||
MtMqlBookInfo^ info = gcnew MtMqlBookInfo();
|
MtMqlBookInfo^ info = gcnew MtMqlBookInfo();
|
||||||
|
|
||||||
info->type = values[i].type;
|
info->type = values[i].type;
|
||||||
info->price = values[i].price;
|
info->price = values[i].price;
|
||||||
info->volume = values[i].volume;
|
info->volume = values[i].volume;
|
||||||
|
|
||||||
list[i] = info;
|
list[i] = info;
|
||||||
}
|
}
|
||||||
|
|
||||||
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlBookInfoArray(list));
|
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlBookInfoArray(list));
|
||||||
}
|
return 1;
|
||||||
catch (Exception^ e)
|
}, err, 0);
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:sendMqlRatesArrayResponse(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------- get values -------------------------------
|
//----------- get values -------------------------------
|
||||||
|
|
||||||
int _stdcall getCommandType(int expertHandle, int* res)
|
_DLLAPI int _stdcall getCommandType(int expertHandle, int* res, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle, res]() {
|
||||||
{
|
|
||||||
*res = MtAdapter::GetInstance()->GetCommandType(expertHandle);
|
*res = MtAdapter::GetInstance()->GetCommandType(expertHandle);
|
||||||
}
|
return 1;
|
||||||
catch (Exception^ e)
|
}, err, 0);
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:getCommandType(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall getIntValue(int expertHandle, int paramIndex, int* res)
|
_DLLAPI int _stdcall getIntValue(int expertHandle, int paramIndex, int* res, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle, ¶mIndex, res]() {
|
||||||
{
|
|
||||||
*res = (int)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
*res = (int)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||||
}
|
return 1;
|
||||||
catch (Exception^ e)
|
}, err, 0);
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:getIntValue(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall getDoubleValue(int expertHandle, int paramIndex, double* res)
|
_DLLAPI int _stdcall getDoubleValue(int expertHandle, int paramIndex, double* res, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle, ¶mIndex, res]() {
|
||||||
{
|
|
||||||
*res = (double)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
*res = (double)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||||
}
|
return 1;
|
||||||
catch (Exception^ e)
|
}, err, 0);
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:getDoubleValue(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall getStringValue(int expertHandle, int paramIndex, wchar_t* res)
|
_DLLAPI int _stdcall getStringValue(int expertHandle, int paramIndex, wchar_t* res, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle, ¶mIndex, res]() {
|
||||||
{
|
|
||||||
convertSystemString(res, (String^)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex));
|
convertSystemString(res, (String^)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex));
|
||||||
}
|
return 1;
|
||||||
catch (Exception^ e)
|
}, err, 0);
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:getStringValue(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall getULongValue(int expertHandle, int paramIndex, unsigned __int64* res)
|
_DLLAPI int _stdcall getULongValue(int expertHandle, int paramIndex, unsigned __int64* res, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle, ¶mIndex, res]() {
|
||||||
{
|
*res = (unsigned __int64)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||||
*res = (unsigned long)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
return 1;
|
||||||
}
|
}, err, 0);
|
||||||
catch (Exception^ e)
|
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:getULongValue(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall getLongValue(int expertHandle, int paramIndex, __int64* res)
|
_DLLAPI int _stdcall getLongValue(int expertHandle, int paramIndex, __int64* res, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle, ¶mIndex, res]() {
|
||||||
{
|
*res = (__int64)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||||
*res = (long)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
return 1;
|
||||||
}
|
}, err, 0);
|
||||||
catch (Exception^ e)
|
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:getLongValue(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall getBooleanValue(int expertHandle, int paramIndex, int* res)
|
_DLLAPI int _stdcall getBooleanValue(int expertHandle, int paramIndex, int* res, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle, ¶mIndex, res]() {
|
||||||
{
|
|
||||||
bool val = (bool)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
bool val = (bool)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||||
*res = val == true ? 1 : 0;
|
*res = val == true ? 1 : 0;
|
||||||
}
|
return 1;
|
||||||
catch (Exception^ e)
|
}, err, 0);
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:getBooleanValue(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _stdcall getUIntValue(int expertHandle, int paramIndex, unsigned int* res)
|
_DLLAPI int _stdcall getUIntValue(int expertHandle, int paramIndex, unsigned int* res, wchar_t* err)
|
||||||
{
|
{
|
||||||
try
|
return Execute<int>([&expertHandle, ¶mIndex, res]() {
|
||||||
{
|
|
||||||
*res = (unsigned int)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
*res = (unsigned int)MtAdapter::GetInstance()->GetCommandParameter(expertHandle, paramIndex);
|
||||||
}
|
return 1;
|
||||||
catch (Exception^ e)
|
}, err, 0);
|
||||||
{
|
|
||||||
Debug::WriteLine("[ERROR] MT5Connector:getUIntValue(): " + e->Message);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
LIBRARY MT5Connector
|
|
||||||
|
|
||||||
EXPORTS initExpert
|
|
||||||
deinitExpert
|
|
||||||
updateQuote
|
|
||||||
sendIntResponse
|
|
||||||
sendBooleanResponse
|
|
||||||
sendDoubleResponse
|
|
||||||
sendStringResponse
|
|
||||||
sendVoidResponse
|
|
||||||
sendDoubleArrayResponse
|
|
||||||
sendIntArrayResponse
|
|
||||||
sendLongArrayResponse
|
|
||||||
sendMqlRatesArrayResponse
|
|
||||||
sendLongResponse
|
|
||||||
sendULongResponse
|
|
||||||
sendMqlTickResponse
|
|
||||||
sendMqlBookInfoArrayResponse
|
|
||||||
getCommandType
|
|
||||||
getIntValue
|
|
||||||
getUIntValue
|
|
||||||
getDoubleValue
|
|
||||||
getStringValue
|
|
||||||
getLongValue
|
|
||||||
getULongValue
|
|
||||||
getBooleanValue
|
|
||||||
verify
|
|
||||||
@@ -95,7 +95,6 @@
|
|||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>user32.lib</AdditionalDependencies>
|
<AdditionalDependencies>user32.lib</AdditionalDependencies>
|
||||||
<ModuleDefinitionFile>.\MT5Connector.def</ModuleDefinitionFile>
|
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
@@ -108,7 +107,6 @@
|
|||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>user32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>user32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<ModuleDefinitionFile>.\MT5Connector.def</ModuleDefinitionFile>
|
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
@@ -120,7 +118,6 @@
|
|||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>user32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>user32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<ModuleDefinitionFile>.\MT5Connector.def</ModuleDefinitionFile>
|
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
@@ -132,7 +129,6 @@
|
|||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>user32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>user32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<ModuleDefinitionFile>.\MT5Connector.def</ModuleDefinitionFile>
|
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -157,7 +153,6 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="app.ico" />
|
<None Include="app.ico" />
|
||||||
<None Include="MT5Connector.def" />
|
|
||||||
<None Include="ReadMe.txt" />
|
<None Include="ReadMe.txt" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -44,9 +44,6 @@
|
|||||||
<None Include="app.ico">
|
<None Include="app.ico">
|
||||||
<Filter>Resource Files</Filter>
|
<Filter>Resource Files</Filter>
|
||||||
</None>
|
</None>
|
||||||
<None Include="MT5Connector.def">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</None>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="app.rc">
|
<ResourceCompile Include="app.rc">
|
||||||
|
|||||||
@@ -1,9 +1,4 @@
|
|||||||
using System;
|
namespace MTApiService
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace MTApiService
|
|
||||||
{
|
{
|
||||||
public interface IMetaTraderHandler
|
public interface IMetaTraderHandler
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,6 +8,50 @@ using log4net.Repository.Hierarchy;
|
|||||||
|
|
||||||
namespace MTApiService
|
namespace MTApiService
|
||||||
{
|
{
|
||||||
|
public class MtLog
|
||||||
|
{
|
||||||
|
#region ctor
|
||||||
|
internal MtLog(Type type)
|
||||||
|
{
|
||||||
|
_log = LogManager.GetLogger(type);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Public
|
||||||
|
|
||||||
|
public void Debug(object message)
|
||||||
|
{
|
||||||
|
_log.Debug(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Error(object message)
|
||||||
|
{
|
||||||
|
_log.Error(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Fatal(object message)
|
||||||
|
{
|
||||||
|
_log.Fatal(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Info(object message)
|
||||||
|
{
|
||||||
|
_log.Info(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Warn(object message)
|
||||||
|
{
|
||||||
|
_log.Warn(message);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Private
|
||||||
|
|
||||||
|
private readonly ILog _log;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
|
||||||
public class LogConfigurator
|
public class LogConfigurator
|
||||||
{
|
{
|
||||||
private const string LogFileNameExtension = "txt";
|
private const string LogFileNameExtension = "txt";
|
||||||
@@ -48,5 +92,13 @@ namespace MTApiService
|
|||||||
#endif
|
#endif
|
||||||
hierarchy.Configured = true;
|
hierarchy.Configured = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static MtLog GetLogger(Type type)
|
||||||
|
{
|
||||||
|
if (type == null)
|
||||||
|
throw new ArgumentNullException(nameof(type));
|
||||||
|
|
||||||
|
return new MtLog(type);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,6 +64,7 @@
|
|||||||
<Compile Include="IMetaTraderHandler.cs" />
|
<Compile Include="IMetaTraderHandler.cs" />
|
||||||
<Compile Include="ITaskExecutor.cs" />
|
<Compile Include="ITaskExecutor.cs" />
|
||||||
<Compile Include="LogConfigurator.cs" />
|
<Compile Include="LogConfigurator.cs" />
|
||||||
|
<Compile Include="Mt5Expert.cs" />
|
||||||
<Compile Include="MtCommandEventArgs.cs" />
|
<Compile Include="MtCommandEventArgs.cs" />
|
||||||
<Compile Include="IDisposableChannel.cs" />
|
<Compile Include="IDisposableChannel.cs" />
|
||||||
<Compile Include="IMtApiServer.cs" />
|
<Compile Include="IMtApiServer.cs" />
|
||||||
|
|||||||
@@ -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.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+13
-15
@@ -36,12 +36,12 @@ namespace MTApiService
|
|||||||
|
|
||||||
|
|
||||||
#region Public Methods
|
#region Public Methods
|
||||||
public void InitExpert(int expertHandle, int port, string symbol, double bid, double ask, IMetaTraderHandler mtHandler)
|
public void AddExpert(int port, MtExpert expert)
|
||||||
{
|
{
|
||||||
if (mtHandler == null)
|
if (expert == null)
|
||||||
throw new ArgumentNullException(nameof(mtHandler));
|
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;
|
MtServer server;
|
||||||
lock (_servers)
|
lock (_servers)
|
||||||
@@ -60,8 +60,6 @@ namespace MTApiService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var expert = new MtExpert(expertHandle, new MtQuote { Instrument = symbol, Bid = bid, Ask = ask, ExpertHandle = expertHandle }, mtHandler);
|
|
||||||
|
|
||||||
lock (_experts)
|
lock (_experts)
|
||||||
{
|
{
|
||||||
_experts[expert.Handle] = expert;
|
_experts[expert.Handle] = expert;
|
||||||
@@ -69,12 +67,12 @@ namespace MTApiService
|
|||||||
|
|
||||||
server.AddExpert(expert);
|
server.AddExpert(expert);
|
||||||
|
|
||||||
Log.Info("InitExpert: end");
|
Log.Info("AddExpert: end");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DeinitExpert(int expertHandle)
|
public void RemoveExpert(int expertHandle)
|
||||||
{
|
{
|
||||||
Log.InfoFormat("DeinitExpert: begin. expertHandle = {0}", expertHandle);
|
Log.InfoFormat("RemoveExpert: begin. expertHandle = {0}", expertHandle);
|
||||||
|
|
||||||
MtExpert expert = null;
|
MtExpert expert = null;
|
||||||
|
|
||||||
@@ -93,15 +91,15 @@ namespace MTApiService
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.WarnFormat("DeinitExpert: expert with id {0} has not been found.", expertHandle);
|
Log.WarnFormat("RemoveExpert: expert with id {0} has not been found.", expertHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Info("DeinitExpert: end");
|
Log.Info("RemoveExpert: end");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendQuote(int expertHandle, string symbol, double bid, double ask)
|
public void SendQuote(int expertHandle, string symbol, double bid, double ask)
|
||||||
{
|
{
|
||||||
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;
|
MtExpert expert;
|
||||||
lock (_experts)
|
lock (_experts)
|
||||||
@@ -111,14 +109,14 @@ namespace MTApiService
|
|||||||
|
|
||||||
if (expert != null)
|
if (expert != null)
|
||||||
{
|
{
|
||||||
expert.Quote = new MtQuote { Instrument = symbol, Bid = bid, Ask = ask, ExpertHandle = expertHandle };
|
expert.UpdateQuote(new MtQuote { Instrument = symbol, Bid = bid, Ask = ask, ExpertHandle = expertHandle });
|
||||||
}
|
}
|
||||||
else
|
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)
|
public void SendEvent(int expertHandle, int eventType, string payload)
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ namespace MTApiService
|
|||||||
Command = command;
|
Command = command;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MtCommand Command { get; private set; }
|
public MtCommand Command { get; }
|
||||||
|
|
||||||
public MtResponse WaitResult(int time)
|
public MtResponse WaitResult(int time)
|
||||||
{
|
{
|
||||||
|
|||||||
+15
-27
@@ -4,7 +4,7 @@ using System.Collections.Generic;
|
|||||||
|
|
||||||
namespace MTApiService
|
namespace MTApiService
|
||||||
{
|
{
|
||||||
internal class MtExpert: ITaskExecutor
|
public class MtExpert: ITaskExecutor
|
||||||
{
|
{
|
||||||
public delegate void MtQuoteHandler(MtExpert expert, MtQuote quote);
|
public delegate void MtQuoteHandler(MtExpert expert, MtQuote quote);
|
||||||
public delegate void MtEventHandler(MtExpert expert, MtEvent e);
|
public delegate void MtEventHandler(MtExpert expert, MtEvent e);
|
||||||
@@ -19,21 +19,20 @@ namespace MTApiService
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Public Methods
|
#region Public Methods
|
||||||
public MtExpert(int handle, MtQuote quote, IMetaTraderHandler mtHandler)
|
public MtExpert(int handle, string symbol, double bid, double ask, IMetaTraderHandler mtHandler)
|
||||||
{
|
{
|
||||||
if (mtHandler == null)
|
if (mtHandler == null)
|
||||||
throw new ArgumentNullException(nameof(mtHandler));
|
throw new ArgumentNullException(nameof(mtHandler));
|
||||||
|
|
||||||
Quote = quote;
|
_quote = new MtQuote { ExpertHandle = handle, Instrument = symbol, Bid = bid, Ask = ask};
|
||||||
Handle = handle;
|
Handle = handle;
|
||||||
_mtHadler = mtHandler;
|
_mtHadler = mtHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Deinit()
|
public virtual void Deinit()
|
||||||
{
|
{
|
||||||
Log.Debug("Deinit: begin.");
|
Log.Debug("Deinit: begin.");
|
||||||
|
|
||||||
IsEnable = false;
|
|
||||||
FireOnDeinited();
|
FireOnDeinited();
|
||||||
|
|
||||||
Log.Debug("Deinit: end.");
|
Log.Debug("Deinit: end.");
|
||||||
@@ -120,9 +119,18 @@ namespace MTApiService
|
|||||||
Log.Debug("SendEvent: end.");
|
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()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
return $"ExpertHandle = {Handle}";
|
return $"ExpertHandle = {Handle}, Quote = {Quote}";
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -153,7 +161,7 @@ namespace MTApiService
|
|||||||
return _quote;
|
return _quote;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
set
|
private set
|
||||||
{
|
{
|
||||||
lock (_locker)
|
lock (_locker)
|
||||||
{
|
{
|
||||||
@@ -165,26 +173,6 @@ namespace MTApiService
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int Handle { get; }
|
public int Handle { get; }
|
||||||
|
|
||||||
private bool _isEnable = true;
|
|
||||||
public bool IsEnable
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
lock (_locker)
|
|
||||||
{
|
|
||||||
return _isEnable;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private set
|
|
||||||
{
|
|
||||||
lock (_locker)
|
|
||||||
{
|
|
||||||
_isEnable = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Private Methods
|
#region Private Methods
|
||||||
|
|||||||
@@ -9,9 +9,9 @@ namespace MTApiService
|
|||||||
[DataMember]
|
[DataMember]
|
||||||
public int Action { get; set; }
|
public int Action { get; set; }
|
||||||
[DataMember]
|
[DataMember]
|
||||||
public uint Magic { get; set; }
|
public ulong Magic { get; set; }
|
||||||
[DataMember]
|
[DataMember]
|
||||||
public uint Order { get; set; }
|
public ulong Order { get; set; }
|
||||||
[DataMember]
|
[DataMember]
|
||||||
public string Symbol { get; set; }
|
public string Symbol { get; set; }
|
||||||
[DataMember]
|
[DataMember]
|
||||||
@@ -25,7 +25,7 @@ namespace MTApiService
|
|||||||
[DataMember]
|
[DataMember]
|
||||||
public double Tp { get; set; }
|
public double Tp { get; set; }
|
||||||
[DataMember]
|
[DataMember]
|
||||||
public uint Deviation { get; set; }
|
public ulong Deviation { get; set; }
|
||||||
[DataMember]
|
[DataMember]
|
||||||
public int Type { get; set; }
|
public int Type { get; set; }
|
||||||
[DataMember]
|
[DataMember]
|
||||||
@@ -36,5 +36,9 @@ namespace MTApiService
|
|||||||
public DateTime Expiration { get; set; }
|
public DateTime Expiration { get; set; }
|
||||||
[DataMember]
|
[DataMember]
|
||||||
public string Comment { get; set; }
|
public string Comment { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public ulong Position { get; set; }
|
||||||
|
[DataMember]
|
||||||
|
public ulong PositionBy { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,11 +80,6 @@ namespace MTApiService
|
|||||||
//init network hosts
|
//init network hosts
|
||||||
var dnsHostName = Dns.GetHostName();
|
var dnsHostName = Dns.GetHostName();
|
||||||
var ips = Dns.GetHostEntry(dnsHostName);
|
var ips = Dns.GetHostEntry(dnsHostName);
|
||||||
if (ips == null)
|
|
||||||
{
|
|
||||||
Log.WarnFormat("InitHosts: end. Dns.GetHostEntry has returned null for DNS Host Name {0}", dnsHostName);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var ipAddress in ips.AddressList)
|
foreach (var ipAddress in ips.AddressList)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.0.27.0")]
|
[assembly: AssemblyVersion("1.0.29.0")]
|
||||||
[assembly: AssemblyFileVersion("1.0.27.0")]
|
[assembly: AssemblyFileVersion("1.0.29.0")]
|
||||||
@@ -44,17 +44,16 @@ template <typename T> T Execute(std::function<T()> func, wchar_t* err, T default
|
|||||||
_DLLAPI bool _stdcall initExpert(int expertHandle, int port, wchar_t* symbol, double bid, double ask, wchar_t* err)
|
_DLLAPI bool _stdcall initExpert(int expertHandle, int port, wchar_t* symbol, double bid, double ask, wchar_t* err)
|
||||||
{
|
{
|
||||||
return Execute<bool>([&expertHandle, &port, symbol, &bid, &ask]() {
|
return Execute<bool>([&expertHandle, &port, symbol, &bid, &ask]() {
|
||||||
MT4Handler^ mtHandler = gcnew MT4Handler();
|
auto expert = gcnew MtExpert(expertHandle, gcnew String(symbol), bid, ask, gcnew MT4Handler());
|
||||||
MtAdapter::GetInstance()->InitExpert(expertHandle, port, gcnew String(symbol), bid, ask, mtHandler);
|
MtAdapter::GetInstance()->AddExpert(port, expert);
|
||||||
return true;
|
return true;
|
||||||
}, err, false);
|
}, err, false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_DLLAPI bool _stdcall deinitExpert(int expertHandle, wchar_t* err)
|
_DLLAPI bool _stdcall deinitExpert(int expertHandle, wchar_t* err)
|
||||||
{
|
{
|
||||||
return Execute<bool>([&expertHandle]() {
|
return Execute<bool>([&expertHandle]() {
|
||||||
MtAdapter::GetInstance()->DeinitExpert(expertHandle);
|
MtAdapter::GetInstance()->RemoveExpert(expertHandle);
|
||||||
return true;
|
return true;
|
||||||
}, err, false);
|
}, err, false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -58,8 +58,12 @@
|
|||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="ChartEventArgs.cs" />
|
||||||
<Compile Include="ChartPeriod.cs" />
|
<Compile Include="ChartPeriod.cs" />
|
||||||
<Compile Include="EnumAlignMode.cs" />
|
<Compile Include="EnumAlignMode.cs" />
|
||||||
|
<Compile Include="EnumChartPropertyDouble.cs" />
|
||||||
|
<Compile Include="EnumChartPropertyInteger.cs" />
|
||||||
|
<Compile Include="EnumChartPropertyString.cs" />
|
||||||
<Compile Include="EnumColorFormat.cs" />
|
<Compile Include="EnumColorFormat.cs" />
|
||||||
<Compile Include="EnumObject.cs" />
|
<Compile Include="EnumObject.cs" />
|
||||||
<Compile Include="EnumObjectPropertyDouble.cs" />
|
<Compile Include="EnumObjectPropertyDouble.cs" />
|
||||||
@@ -74,6 +78,7 @@
|
|||||||
<Compile Include="Monitors\AvailabilityOrdersEventArgs.cs" />
|
<Compile Include="Monitors\AvailabilityOrdersEventArgs.cs" />
|
||||||
<Compile Include="MqlRates.cs" />
|
<Compile Include="MqlRates.cs" />
|
||||||
<Compile Include="MqlTick.cs" />
|
<Compile Include="MqlTick.cs" />
|
||||||
|
<Compile Include="MtChartEvent.cs" />
|
||||||
<Compile Include="MtConnectionEventArgs.cs" />
|
<Compile Include="MtConnectionEventArgs.cs" />
|
||||||
<Compile Include="MtConnectionException.cs" />
|
<Compile Include="MtConnectionException.cs" />
|
||||||
<Compile Include="MtConnectionState.cs" />
|
<Compile Include="MtConnectionState.cs" />
|
||||||
|
|||||||
+18
-5
@@ -994,6 +994,12 @@ namespace MtApi
|
|||||||
return MtApiTimeConverter.ConvertFromMtTime(commandResponse);
|
return MtApiTimeConverter.ConvertFromMtTime(commandResponse);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DateTime TimeGMT()
|
||||||
|
{
|
||||||
|
var commandResponse = SendCommand<int>(MtCommandType.TimeGMT, null);
|
||||||
|
return MtApiTimeConverter.ConvertFromMtTime(commandResponse);
|
||||||
|
}
|
||||||
|
|
||||||
public int TimeDay(DateTime date)
|
public int TimeDay(DateTime date)
|
||||||
{
|
{
|
||||||
var commandParameters = new ArrayList { MtApiTimeConverter.ConvertToMtTime(date) };
|
var commandParameters = new ArrayList { MtApiTimeConverter.ConvertToMtTime(date) };
|
||||||
@@ -3068,18 +3074,24 @@ namespace MtApi
|
|||||||
switch(eventType)
|
switch(eventType)
|
||||||
{
|
{
|
||||||
case MtEventTypes.LastTimeBar:
|
case MtEventTypes.LastTimeBar:
|
||||||
{
|
FireOnLastTimeBar(e.ExpertHandle, JsonConvert.DeserializeObject<MtTimeBar>(e.Payload));
|
||||||
FireOnLastTimeBar(JsonConvert.DeserializeObject<MtTimeBar>(e.Payload));
|
break;
|
||||||
}
|
case MtEventTypes.ChartEvent:
|
||||||
|
FireOnChartEvent(e.ExpertHandle, JsonConvert.DeserializeObject<MtChartEvent>(e.Payload));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new ArgumentOutOfRangeException();
|
throw new ArgumentOutOfRangeException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FireOnLastTimeBar(MtTimeBar timeBar)
|
private void FireOnLastTimeBar(int expertHandler, MtTimeBar timeBar)
|
||||||
{
|
{
|
||||||
OnLastTimeBar?.Invoke(this, new TimeBarArgs(timeBar));
|
OnLastTimeBar?.Invoke(this, new TimeBarArgs(expertHandler, timeBar));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void FireOnChartEvent(int expertHandler, MtChartEvent chartEvent)
|
||||||
|
{
|
||||||
|
OnChartEvent?.Invoke(this, new ChartEventArgs(expertHandler, chartEvent));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BacktestingReady()
|
private void BacktestingReady()
|
||||||
@@ -3097,6 +3109,7 @@ namespace MtApi
|
|||||||
public event EventHandler<MtQuoteEventArgs> QuoteRemoved;
|
public event EventHandler<MtQuoteEventArgs> QuoteRemoved;
|
||||||
public event EventHandler<MtConnectionEventArgs> ConnectionStateChanged;
|
public event EventHandler<MtConnectionEventArgs> ConnectionStateChanged;
|
||||||
public event EventHandler<TimeBarArgs> OnLastTimeBar;
|
public event EventHandler<TimeBarArgs> OnLastTimeBar;
|
||||||
|
public event EventHandler<ChartEventArgs> OnChartEvent;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -111,6 +111,7 @@
|
|||||||
TimeSeconds = 86,
|
TimeSeconds = 86,
|
||||||
TimeYear = 87,
|
TimeYear = 87,
|
||||||
Year = 88,
|
Year = 88,
|
||||||
|
TimeGMT = 281,
|
||||||
|
|
||||||
//Global Variables
|
//Global Variables
|
||||||
GlobalVariableCheck = 89,
|
GlobalVariableCheck = 89,
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
{
|
{
|
||||||
public enum MtEventTypes
|
public enum MtEventTypes
|
||||||
{
|
{
|
||||||
LastTimeBar = 1
|
LastTimeBar = 1,
|
||||||
|
ChartEvent = 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-11
@@ -11,16 +11,7 @@ namespace MtApi
|
|||||||
public double Close { get; set; }
|
public double Close { get; set; }
|
||||||
public double High { get; set; }
|
public double High { get; set; }
|
||||||
public double Low { get; set; }
|
public double Low { get; set; }
|
||||||
|
public DateTime OpenTime => MtApiTimeConverter.ConvertFromMtTime(MtOpenTime);
|
||||||
public DateTime OpenTime
|
public DateTime CloseTime => MtApiTimeConverter.ConvertFromMtTime(MtCloseTime);
|
||||||
{
|
|
||||||
get { return MtApiTimeConverter.ConvertFromMtTime(MtOpenTime); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public DateTime CloseTime
|
|
||||||
{
|
|
||||||
get { return MtApiTimeConverter.ConvertFromMtTime(MtCloseTime); }
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-1
@@ -1,4 +1,6 @@
|
|||||||
namespace MtApi
|
// ReSharper disable InconsistentNaming
|
||||||
|
|
||||||
|
namespace MtApi
|
||||||
{
|
{
|
||||||
public enum ENUM_TERMINAL_INFO_STRING
|
public enum ENUM_TERMINAL_INFO_STRING
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.0.37.0")]
|
[assembly: AssemblyVersion("1.0.40.0")]
|
||||||
[assembly: AssemblyFileVersion("1.0.37.0")]
|
[assembly: AssemblyFileVersion("1.0.40.0")]
|
||||||
@@ -4,11 +4,18 @@ namespace MtApi
|
|||||||
{
|
{
|
||||||
public class TimeBarArgs: EventArgs
|
public class TimeBarArgs: EventArgs
|
||||||
{
|
{
|
||||||
|
internal TimeBarArgs(int expertHandle, MtTimeBar timeBar)
|
||||||
|
: this(timeBar)
|
||||||
|
{
|
||||||
|
ExpertHandle = expertHandle;
|
||||||
|
}
|
||||||
|
|
||||||
public TimeBarArgs(MtTimeBar timeBar)
|
public TimeBarArgs(MtTimeBar timeBar)
|
||||||
{
|
{
|
||||||
TimeBar = timeBar;
|
TimeBar = timeBar;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MtTimeBar TimeBar { get; private set; }
|
public int ExpertHandle { get; }
|
||||||
|
public MtTimeBar TimeBar { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
namespace MtApi5.Events
|
||||||
|
{
|
||||||
|
internal enum Mt5EventTypes
|
||||||
|
{
|
||||||
|
OnTradeTransaction = 1,
|
||||||
|
OnBookEvent = 2
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
namespace MtApi5.Events
|
||||||
|
{
|
||||||
|
internal class OnBookEvent
|
||||||
|
{
|
||||||
|
public string Symbol { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
namespace MtApi5.Events
|
||||||
|
{
|
||||||
|
internal class OnTradeTransactionEvent
|
||||||
|
{
|
||||||
|
public MqlTradeTransaction Trans { get; set; }
|
||||||
|
public MqlTradeRequest Request { get; set; }
|
||||||
|
public MqlTradeResult Result { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,4 @@
|
|||||||
using System;
|
// ReSharper disable InconsistentNaming
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace MtApi5
|
namespace MtApi5
|
||||||
{
|
{
|
||||||
public class MqlBookInfo
|
public class MqlBookInfo
|
||||||
@@ -14,8 +10,13 @@ namespace MtApi5
|
|||||||
this.volume = volume;
|
this.volume = volume;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ENUM_BOOK_TYPE type { get; private set; } // Order type from ENUM_BOOK_TYPE enumeration
|
public ENUM_BOOK_TYPE type { get; } // Order type from ENUM_BOOK_TYPE enumeration
|
||||||
public double price { get; private set; } // Price
|
public double price { get; } // Price
|
||||||
public long volume { get; private set; } // Volume
|
public long volume { get; } // Volume
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return $"{type}|{price}|{volume}";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
namespace MtApi5
|
||||||
|
{
|
||||||
|
public class MqlParam
|
||||||
|
{
|
||||||
|
public ENUM_DATATYPE DataType { get; set; }
|
||||||
|
public long? IntegerValue { get; set; }
|
||||||
|
public double? DoubleValue { get; set; }
|
||||||
|
public string StringValue { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-1
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
// ReSharper disable InconsistentNaming
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace MtApi5
|
namespace MtApi5
|
||||||
{
|
{
|
||||||
|
|||||||
+2
-1
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
// ReSharper disable InconsistentNaming
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace MtApi5
|
namespace MtApi5
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,20 +1,17 @@
|
|||||||
using System;
|
// ReSharper disable InconsistentNaming
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace MtApi5
|
namespace MtApi5
|
||||||
{
|
{
|
||||||
public class MqlTradeCheckResult
|
public class MqlTradeCheckResult
|
||||||
{
|
{
|
||||||
public uint Retcode { get; private set; } // Reply code
|
public uint Retcode { get; } // Reply code
|
||||||
public double Balance { get; private set; } // Balance after the execution of the deal
|
public double Balance { get; } // Balance after the execution of the deal
|
||||||
public double Equity { get; private set; } // Equity after the execution of the deal
|
public double Equity { get; } // Equity after the execution of the deal
|
||||||
public double Profit { get; private set; } // Floating profit
|
public double Profit { get; } // Floating profit
|
||||||
public double Margin { get; private set; } // Margin requirements
|
public double Margin { get; } // Margin requirements
|
||||||
public double Margin_free { get; private set; } // Free margin
|
public double Margin_free { get; } // Free margin
|
||||||
public double Margin_level { get; private set; } // Margin level
|
public double Margin_level { get; } // Margin level
|
||||||
public string Comment { get; private set; } // Comment to the reply code (description of the error)
|
public string Comment { get; } // Comment to the reply code (description of the error)
|
||||||
|
|
||||||
public MqlTradeCheckResult(uint retcode
|
public MqlTradeCheckResult(uint retcode
|
||||||
, double balance
|
, double balance
|
||||||
@@ -34,5 +31,10 @@ namespace MtApi5
|
|||||||
Margin_level = margin_level;
|
Margin_level = margin_level;
|
||||||
Comment = comment;
|
Comment = comment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return $"Retcode={Retcode}; Comment={Comment}; Balance={Balance}; Equity={Equity}; Profit={Profit}; Margin={Margin}; Margin_free={Margin_free}; Margin_level={Margin_level}";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
using System;
|
// ReSharper disable InconsistentNaming
|
||||||
|
using System;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace MtApi5
|
namespace MtApi5
|
||||||
{
|
{
|
||||||
public class MqlTradeRequest
|
public class MqlTradeRequest
|
||||||
{
|
{
|
||||||
public ENUM_TRADE_REQUEST_ACTIONS Action { get; set; } // Trade operation type
|
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 ulong Order { get; set; } // Order ticket
|
||||||
public string Symbol { get; set; } // Trade symbol
|
public string Symbol { get; set; } // Trade symbol
|
||||||
public double Volume { get; set; } // Requested volume for a deal in lots
|
public double Volume { get; set; } // Requested volume for a deal in lots
|
||||||
@@ -13,11 +15,27 @@ namespace MtApi5
|
|||||||
public double Stoplimit { get; set; } // StopLimit level of the order
|
public double Stoplimit { get; set; } // StopLimit level of the order
|
||||||
public double Sl { get; set; } // Stop Loss 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 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 Type { get; set; } // Order type
|
||||||
public ENUM_ORDER_TYPE_FILLING Type_filling { get; set; } // Order execution 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 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)
|
|
||||||
|
[JsonIgnore]
|
||||||
|
public DateTime Expiration // Order expiration time (for the orders of ORDER_TIME_SPECIFIED type)
|
||||||
|
{
|
||||||
|
get { return Mt5TimeConverter.ConvertFromMtTime(MtExpiration); }
|
||||||
|
set { MtExpiration = Mt5TimeConverter.ConvertToMtTime(value); }
|
||||||
|
}
|
||||||
|
|
||||||
public string Comment { get; set; } // Order comment
|
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
|
||||||
|
|
||||||
|
public int MtExpiration { get; private set; }
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return $"Action={Action}; Magic={Magic}; Order={Order}; Symbol={Symbol}; Volume={Volume}; Price={Price}; Stoplimit={Stoplimit}; Sl={Sl}; Tp={Tp}; Deviation={Deviation}; Type={Type}; Type_filling={Type_filling}; Type_time={Type_time}; Expiration={Expiration}; Comment={Comment}; Position={Position}; PositionBy={PositionBy}";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+28
-12
@@ -1,6 +1,4 @@
|
|||||||
using System;
|
// ReSharper disable InconsistentNaming
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace MtApi5
|
namespace MtApi5
|
||||||
{
|
{
|
||||||
@@ -19,14 +17,32 @@ namespace MtApi5
|
|||||||
Request_id = request_id;
|
Request_id = request_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public uint Retcode { get; private set; } // Operation return code
|
internal MqlTradeResult(MqlTradeResult o)
|
||||||
public ulong Deal { get; private set; } // Deal ticket, if it is performed
|
{
|
||||||
public ulong Order { get; private set; } // Order ticket, if it is placed
|
Retcode = o.Retcode;
|
||||||
public double Volume { get; private set; } // Deal volume, confirmed by broker
|
Deal = o.Deal;
|
||||||
public double Price { get; private set; } // Deal price, confirmed by broker
|
Order = o.Order;
|
||||||
public double Bid { get; private set; } // Current Bid price
|
Volume = o.Volume;
|
||||||
public double Ask { get; private set; } // Current Ask price
|
Price = o.Price;
|
||||||
public string Comment { get; private set; } // Broker comment to operation (by default it is filled by the operation description)
|
Bid = o.Bid;
|
||||||
public uint Request_id { get; private set; } // Request ID set by the terminal during the dispatch
|
Ask = o.Ask;
|
||||||
|
Comment = o.Comment;
|
||||||
|
Request_id = o.Request_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint Retcode { get; } // Operation return code
|
||||||
|
public ulong Deal { get; } // Deal ticket, if it is performed
|
||||||
|
public ulong Order { get; } // Order ticket, if it is placed
|
||||||
|
public double Volume { get; } // Deal volume, confirmed by broker
|
||||||
|
public double Price { get; } // Deal price, confirmed by broker
|
||||||
|
public double Bid { get; } // Current Bid price
|
||||||
|
public double Ask { get; } // Current Ask price
|
||||||
|
public string Comment { get; } // Broker comment to operation (by default it is filled by the operation description)
|
||||||
|
public uint Request_id { get; } // Request ID set by the terminal during the dispatch
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return $"Retcode={Retcode}; Comment={Comment}; Deal={Deal}; Order={Order}; Volume={Volume}; Price={Price}; Bid={Bid}; Ask={Ask}; Request_id={Request_id}";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
using System;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace MtApi5
|
||||||
|
{
|
||||||
|
public class MqlTradeTransaction
|
||||||
|
{
|
||||||
|
public ulong Deal { get; set; } // Deal ticket
|
||||||
|
public ulong Order { get; set; } // Order ticket
|
||||||
|
public string Symbol { get; set; } // Trade symbol name
|
||||||
|
public ENUM_TRADE_TRANSACTION_TYPE Type { get; set; } // Trade transaction type
|
||||||
|
public ENUM_ORDER_TYPE OrderType { get; set; } // Order type
|
||||||
|
public ENUM_ORDER_STATE OrderState { get; set; } // Order state
|
||||||
|
public ENUM_DEAL_TYPE DealType { get; set; } // Deal type
|
||||||
|
public ENUM_ORDER_TYPE_TIME TimeType { get; set; } // Order type by action period
|
||||||
|
|
||||||
|
[JsonIgnore]
|
||||||
|
public DateTime TimeExpiration // Order expiration time
|
||||||
|
{
|
||||||
|
get { return Mt5TimeConverter.ConvertFromMtTime(MtTimeExpiration); }
|
||||||
|
set { MtTimeExpiration = Mt5TimeConverter.ConvertToMtTime(value); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public double Price { get; set; } // Price
|
||||||
|
public double PriceTrigger { get; set; } // Stop limit order activation price
|
||||||
|
public double PriceSl { get; set; } // Stop Loss level
|
||||||
|
public double PriceTp { get; set; } // Take Profit level
|
||||||
|
public double Volume { get; set; } // Volume in lots
|
||||||
|
public ulong Position { get; set; } // Position ticket
|
||||||
|
public ulong PositionBy { get; set; } // Ticket of an opposite position
|
||||||
|
|
||||||
|
public int MtTimeExpiration { get; private set; }
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return $"Deal={Deal}; Order={Order}; Symbol={Symbol}; Type={Type}; OrderType={OrderType}; OrderState={OrderState}; DealType={DealType}; TimeType={TimeType}; TimeExpiration={TimeExpiration}; Price={Price}; PriceTrigger{PriceTrigger}; PriceSl={PriceSl}; PriceTp={PriceTp}; Volume={Volume}; Position={Position}; PositionBy={PositionBy}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace MtApi5
|
||||||
|
{
|
||||||
|
public class Mt5BookEventArgs : EventArgs
|
||||||
|
{
|
||||||
|
public int ExpertHandle { get; set; }
|
||||||
|
public string Symbol { get; set; } //Symbol of OnBookEvent event.
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,4 @@
|
|||||||
using System;
|
// ReSharper disable InconsistentNaming
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace MtApi5
|
namespace MtApi5
|
||||||
{
|
{
|
||||||
internal enum Mt5CommandType
|
internal enum Mt5CommandType
|
||||||
@@ -10,10 +6,10 @@ namespace MtApi5
|
|||||||
//NoCommand = 0
|
//NoCommand = 0
|
||||||
|
|
||||||
//trade operations
|
//trade operations
|
||||||
OrderSend = 1,
|
//OrderSend = 1,
|
||||||
OrderCalcMargin = 2,
|
OrderCalcMargin = 2,
|
||||||
OrderCalcProfit = 3,
|
OrderCalcProfit = 3,
|
||||||
OrderCheck = 4,
|
//OrderCheck = 4,
|
||||||
//OrderSendAsync = 5,
|
//OrderSendAsync = 5,
|
||||||
PositionsTotal = 6,
|
PositionsTotal = 6,
|
||||||
PositionGetSymbol = 7,
|
PositionGetSymbol = 7,
|
||||||
@@ -99,12 +95,13 @@ namespace MtApi5
|
|||||||
SymbolInfoSessionTrade = 59,
|
SymbolInfoSessionTrade = 59,
|
||||||
MarketBookAdd = 60,
|
MarketBookAdd = 60,
|
||||||
MarketBookRelease = 61,
|
MarketBookRelease = 61,
|
||||||
MarketBookGet = 62,
|
//MarketBookGet = 62,
|
||||||
OrderCloseAll = 63,
|
OrderCloseAll = 63,
|
||||||
|
|
||||||
//CTrade
|
//CTrade
|
||||||
PositionClose = 64,
|
PositionClose = 64,
|
||||||
PositionOpen = 65,
|
PositionOpen = 65,
|
||||||
|
//PositionOpenWithResult = 1065,
|
||||||
|
|
||||||
//Backtesting
|
//Backtesting
|
||||||
BacktestingReady = 66,
|
BacktestingReady = 66,
|
||||||
@@ -114,5 +111,74 @@ namespace MtApi5
|
|||||||
|
|
||||||
//Requests
|
//Requests
|
||||||
MtRequest = 155,
|
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,
|
||||||
|
|
||||||
|
//Date and Time
|
||||||
|
TimeCurrent = 127,
|
||||||
|
TimeTradeServer = 128,
|
||||||
|
TimeLocal = 129,
|
||||||
|
TimeGMT = 130,
|
||||||
|
|
||||||
|
IndicatorRelease = 131
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ namespace MtApi5
|
|||||||
{
|
{
|
||||||
public class Mt5ConnectionEventArgs: EventArgs
|
public class Mt5ConnectionEventArgs: EventArgs
|
||||||
{
|
{
|
||||||
public Mt5ConnectionState Status { get; private set; }
|
public Mt5ConnectionState Status { get; }
|
||||||
public string ConnectionMessage { get; private set; }
|
public string ConnectionMessage { get; }
|
||||||
|
|
||||||
public Mt5ConnectionEventArgs(Mt5ConnectionState status, string message)
|
public Mt5ConnectionEventArgs(Mt5ConnectionState status, string message)
|
||||||
{
|
{
|
||||||
|
|||||||
+729
-211
File diff suppressed because it is too large
Load Diff
+4
-9
@@ -1,15 +1,10 @@
|
|||||||
using System;
|
namespace MtApi5
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace MtApi5
|
|
||||||
{
|
{
|
||||||
public class Mt5Quote
|
public class Mt5Quote
|
||||||
{
|
{
|
||||||
public string Instrument { get; private set; }
|
public string Instrument { get; }
|
||||||
public double Bid { get; private set; }
|
public double Bid { get; }
|
||||||
public double Ask { get; private set; }
|
public double Ask { get; }
|
||||||
|
|
||||||
public Mt5Quote(string instrument, double bid, double ask)
|
public Mt5Quote(string instrument, double bid, double ask)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,13 +1,10 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace MtApi5
|
namespace MtApi5
|
||||||
{
|
{
|
||||||
public class Mt5QuoteEventArgs: EventArgs
|
public class Mt5QuoteEventArgs: EventArgs
|
||||||
{
|
{
|
||||||
public Mt5Quote Quote { get; private set; }
|
public Mt5Quote Quote { get; }
|
||||||
|
|
||||||
public Mt5QuoteEventArgs(Mt5Quote quote)
|
public Mt5QuoteEventArgs(Mt5Quote quote)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,32 +1,27 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace MtApi5
|
namespace MtApi5
|
||||||
{
|
{
|
||||||
class Mt5TimeConverter
|
internal class Mt5TimeConverter
|
||||||
{
|
{
|
||||||
public static DateTime ConvertFromMtTime(int time)
|
public static DateTime ConvertFromMtTime(int time)
|
||||||
{
|
{
|
||||||
DateTime tmpTime = new DateTime(1970, 1, 1);
|
var tmpTime = new DateTime(1970, 1, 1);
|
||||||
return new DateTime(tmpTime.Ticks + (time * 0x989680L));
|
return new DateTime(tmpTime.Ticks + (time * 0x989680L));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static DateTime ConvertFromMtTime(long time)
|
public static DateTime ConvertFromMtTime(long time)
|
||||||
{
|
{
|
||||||
DateTime tmpTime = new DateTime(1970, 1, 1);
|
var tmpTime = new DateTime(1970, 1, 1);
|
||||||
return new DateTime(tmpTime.Ticks + (time * 0x989680L));
|
return new DateTime(tmpTime.Ticks + (time * 0x989680L));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int ConvertToMtTime(DateTime time)
|
public static int ConvertToMtTime(DateTime time)
|
||||||
{
|
{
|
||||||
int result = 0;
|
var result = 0;
|
||||||
if (time != DateTime.MinValue)
|
if (time == DateTime.MinValue) return result;
|
||||||
{
|
var tmpTime = new DateTime(1970, 1, 1);
|
||||||
DateTime tmpTime = new DateTime(1970, 1, 1);
|
result = (int)((time.Ticks - tmpTime.Ticks) / 0x989680L);
|
||||||
result = (int)((time.Ticks - tmpTime.Ticks) / 0x989680L);
|
|
||||||
}
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace MtApi5
|
||||||
|
{
|
||||||
|
public class Mt5TradeTransactionEventArgs : EventArgs
|
||||||
|
{
|
||||||
|
public int ExpertHandle { get; set; }
|
||||||
|
public MqlTradeTransaction Trans { get; set; } // trade transaction structure
|
||||||
|
public MqlTradeRequest Request { get; set; } // request structure
|
||||||
|
public MqlTradeResult Result { get; set; } // result structure
|
||||||
|
}
|
||||||
|
}
|
||||||
+17
-2
@@ -48,10 +48,15 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="CopyTicksFlag.cs" />
|
<Compile Include="CopyTicksFlag.cs" />
|
||||||
|
<Compile Include="Events\OnBookEvent.cs" />
|
||||||
|
<Compile Include="Events\OnTradeTransactionEvent.cs" />
|
||||||
<Compile Include="MqlBookInfo.cs" />
|
<Compile Include="MqlBookInfo.cs" />
|
||||||
|
<Compile Include="MqlParam.cs" />
|
||||||
<Compile Include="MqlRates.cs" />
|
<Compile Include="MqlRates.cs" />
|
||||||
<Compile Include="MqlTick.cs" />
|
<Compile Include="MqlTick.cs" />
|
||||||
<Compile Include="MqlTradeCheckResult.cs" />
|
<Compile Include="MqlTradeCheckResult.cs" />
|
||||||
|
<Compile Include="MqlTradeTransaction.cs" />
|
||||||
|
<Compile Include="Mt5BookEventArgs.cs" />
|
||||||
<Compile Include="Mt5TimeConverter.cs" />
|
<Compile Include="Mt5TimeConverter.cs" />
|
||||||
<Compile Include="Mt5Enums.cs" />
|
<Compile Include="Mt5Enums.cs" />
|
||||||
<Compile Include="Mt5ConnectionEventArgs.cs" />
|
<Compile Include="Mt5ConnectionEventArgs.cs" />
|
||||||
@@ -59,18 +64,27 @@
|
|||||||
<Compile Include="MqlTradeRequest.cs" />
|
<Compile Include="MqlTradeRequest.cs" />
|
||||||
<Compile Include="MqlTradeResult.cs" />
|
<Compile Include="MqlTradeResult.cs" />
|
||||||
<Compile Include="Mt5QuoteEventArgs.cs" />
|
<Compile Include="Mt5QuoteEventArgs.cs" />
|
||||||
|
<Compile Include="Mt5TradeTransactionEventArgs.cs" />
|
||||||
<Compile Include="MtApi5Client.cs" />
|
<Compile Include="MtApi5Client.cs" />
|
||||||
<Compile Include="Mt5CommandType.cs" />
|
<Compile Include="Mt5CommandType.cs" />
|
||||||
<Compile Include="MtConverters.cs" />
|
<Compile Include="MtConverters.cs" />
|
||||||
<Compile Include="ErrorCode.cs" />
|
<Compile Include="ErrorCode.cs" />
|
||||||
<Compile Include="ExecutionException.cs" />
|
<Compile Include="ExecutionException.cs" />
|
||||||
|
<Compile Include="Events\Mt5EventTypes.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="Mt5Quote.cs" />
|
<Compile Include="Mt5Quote.cs" />
|
||||||
<Compile Include="Requests\CopyTicksRequest.cs" />
|
<Compile Include="Requests\CopyTicksRequest.cs" />
|
||||||
|
<Compile Include="Requests\ICustomRequest.cs" />
|
||||||
|
<Compile Include="Requests\IndicatorCreateRequest.cs" />
|
||||||
|
<Compile Include="Requests\MarketBookGetRequest.cs" />
|
||||||
|
<Compile Include="Requests\OrderCheckRequest.cs" />
|
||||||
|
<Compile Include="Requests\OrderCheckResult.cs" />
|
||||||
|
<Compile Include="Requests\OrderSendRequest.cs" />
|
||||||
|
<Compile Include="Requests\PositionOpenRequest.cs" />
|
||||||
<Compile Include="Requests\RequestBase.cs" />
|
<Compile Include="Requests\RequestBase.cs" />
|
||||||
<Compile Include="Requests\RequestType.cs" />
|
<Compile Include="Requests\RequestType.cs" />
|
||||||
<Compile Include="Responses\CopyTicksResponse.cs" />
|
<Compile Include="Requests\OrderSendResult.cs" />
|
||||||
<Compile Include="Responses\ResponseBase.cs" />
|
<Compile Include="Requests\Response.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\MTApiService\MTApiService.csproj">
|
<ProjectReference Include="..\MTApiService\MTApiService.csproj">
|
||||||
@@ -81,6 +95,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup />
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- 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.
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
|||||||
+1029
-49
File diff suppressed because it is too large
Load Diff
+21
-75
@@ -6,84 +6,18 @@ namespace MtApi5
|
|||||||
{
|
{
|
||||||
internal static class MtConverters
|
internal static class MtConverters
|
||||||
{
|
{
|
||||||
|
private static readonly MtLog Log = LogConfigurator.GetLogger(typeof(MtConverters));
|
||||||
|
|
||||||
#region Values Converters
|
#region Values Converters
|
||||||
public static Mt5Quote Parse(this MtQuote quote)
|
public static Mt5Quote Convert(this MtQuote quote)
|
||||||
{
|
{
|
||||||
return (quote != null) ? new Mt5Quote(quote.Instrument, quote.Bid, quote.Ask) : null;
|
return quote != null ? new Mt5Quote(quote.Instrument, quote.Bid, quote.Ask) : null;
|
||||||
}
|
|
||||||
|
|
||||||
public static bool ParseResult(this string inputString, char separator, out MqlTradeResult result)
|
|
||||||
{
|
|
||||||
var retVal = false;
|
|
||||||
result = null;
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(inputString) == false)
|
|
||||||
{
|
|
||||||
var values = inputString.Split(separator);
|
|
||||||
if (values.Length == 10)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
retVal = int.Parse(values[0]) != 0;
|
|
||||||
|
|
||||||
var retcode = uint.Parse(values[1]);
|
|
||||||
var deal = ulong.Parse(values[2]);
|
|
||||||
var order = ulong.Parse(values[3]);
|
|
||||||
var volume = double.Parse(values[4]);
|
|
||||||
var price = double.Parse(values[5]);
|
|
||||||
var bid = double.Parse(values[6]);
|
|
||||||
var ask = double.Parse(values[7]);
|
|
||||||
var comment = values[8];
|
|
||||||
var requestId = uint.Parse(values[9]);
|
|
||||||
|
|
||||||
result = new MqlTradeResult(retcode, deal, order, volume, price, bid, ask, comment, requestId);
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static bool ParseResult(this string inputString, char separator, out MqlTradeCheckResult result)
|
|
||||||
{
|
|
||||||
var retVal = false;
|
|
||||||
result = null;
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(inputString) == false)
|
|
||||||
{
|
|
||||||
var values = inputString.Split(separator);
|
|
||||||
if (values.Length == 10)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
retVal = int.Parse(values[0]) != 0;
|
|
||||||
|
|
||||||
var retcode = uint.Parse(values[1]);
|
|
||||||
var balance = double.Parse(values[2]);
|
|
||||||
var equity = double.Parse(values[3]);
|
|
||||||
var profit = double.Parse(values[4]);
|
|
||||||
var margin = double.Parse(values[5]);
|
|
||||||
var marginFree = double.Parse(values[6]);
|
|
||||||
var marginLevel = double.Parse(values[7]);
|
|
||||||
var comment = values[8];
|
|
||||||
|
|
||||||
result = new MqlTradeCheckResult(retcode, balance, equity, profit, margin, marginFree, marginLevel, comment);
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
retVal = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool ParseResult(this string inputString, char separator, out double result)
|
public static bool ParseResult(this string inputString, char separator, out double result)
|
||||||
{
|
{
|
||||||
|
Log.Debug($"ParseResult: inputString = {inputString}, separator = {separator}");
|
||||||
|
|
||||||
var retVal = false;
|
var retVal = false;
|
||||||
result = 0;
|
result = 0;
|
||||||
|
|
||||||
@@ -98,18 +32,25 @@ namespace MtApi5
|
|||||||
|
|
||||||
result = double.Parse(values[1]);
|
result = double.Parse(values[1]);
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
retVal = false;
|
retVal = false;
|
||||||
|
Log.Error($"ParseResult: {ex.Message}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log.Warn("ParseResult: input srting is null or empty!");
|
||||||
|
}
|
||||||
|
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool ParseResult(this string inputString, char separator, out DateTime from, out DateTime to)
|
public static bool ParseResult(this string inputString, char separator, out DateTime from, out DateTime to)
|
||||||
{
|
{
|
||||||
|
Log.Debug($"ParseResult: inputString = {inputString}, separator = {separator}");
|
||||||
|
|
||||||
var retVal = false;
|
var retVal = false;
|
||||||
|
|
||||||
from = new DateTime();
|
from = new DateTime();
|
||||||
@@ -130,12 +71,17 @@ namespace MtApi5
|
|||||||
var iTo= int.Parse(values[2]);
|
var iTo= int.Parse(values[2]);
|
||||||
to = Mt5TimeConverter.ConvertFromMtTime(iTo);
|
to = Mt5TimeConverter.ConvertFromMtTime(iTo);
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
retVal = false;
|
retVal = false;
|
||||||
|
Log.Error($"ParseResult: {ex.Message}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log.Warn("ParseResult: input srting is null or empty!");
|
||||||
|
}
|
||||||
|
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
@@ -149,7 +95,7 @@ namespace MtApi5
|
|||||||
|
|
||||||
return new ArrayList { (int)request.Action, request.Magic, request.Order, request.Symbol, request.Volume
|
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
|
, 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
|
#endregion
|
||||||
|
|||||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.0.12")]
|
[assembly: AssemblyVersion("1.0.17")]
|
||||||
[assembly: AssemblyFileVersion("1.0.12")]
|
[assembly: AssemblyFileVersion("1.0.17")]
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace MtApi5.Requests
|
||||||
|
{
|
||||||
|
internal class IndicatorCreateRequest: RequestBase
|
||||||
|
{
|
||||||
|
public override RequestType RequestType => RequestType.IndicatorCreate;
|
||||||
|
|
||||||
|
public string Symbol { get; set; }
|
||||||
|
public ENUM_TIMEFRAMES Period { get; set; }
|
||||||
|
public ENUM_INDICATOR IndicatorType { get; set; }
|
||||||
|
public List<MqlParam> Parameters { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
namespace MtApi5.Requests
|
||||||
|
{
|
||||||
|
internal class MarketBookGetRequest: RequestBase
|
||||||
|
{
|
||||||
|
public override RequestType RequestType => RequestType.MarketBookGet;
|
||||||
|
|
||||||
|
public string Symbol { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
namespace MtApi5.Requests
|
||||||
|
{
|
||||||
|
internal class OrderCheckRequest: RequestBase
|
||||||
|
{
|
||||||
|
public override RequestType RequestType => RequestType.OrderCheck;
|
||||||
|
|
||||||
|
public MqlTradeRequest TradeRequest { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
namespace MtApi5.Requests
|
||||||
|
{
|
||||||
|
public class OrderCheckResult
|
||||||
|
{
|
||||||
|
public bool RetVal { get; set; }
|
||||||
|
public MqlTradeCheckResult TradeCheckResult { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
namespace MtApi5.Requests
|
||||||
|
{
|
||||||
|
internal class OrderSendRequest: RequestBase
|
||||||
|
{
|
||||||
|
public override RequestType RequestType => RequestType.OrderSend;
|
||||||
|
|
||||||
|
public MqlTradeRequest TradeRequest { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
namespace MtApi5.Requests
|
||||||
|
{
|
||||||
|
internal class OrderSendResult
|
||||||
|
{
|
||||||
|
public bool RetVal { get; set; }
|
||||||
|
public MqlTradeResult TradeResult { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
namespace MtApi5.Requests
|
||||||
|
{
|
||||||
|
internal class PositionOpenRequest: RequestBase
|
||||||
|
{
|
||||||
|
public override RequestType RequestType => RequestType.PositionOpen;
|
||||||
|
|
||||||
|
public string Symbol { get; set; }
|
||||||
|
public ENUM_ORDER_TYPE OrderType { get; set; }
|
||||||
|
public double Volume { get; set; }
|
||||||
|
public double Price { get; set; }
|
||||||
|
public double Sl { get; set; }
|
||||||
|
public double Tp { get; set; }
|
||||||
|
public string Comment { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,16 @@
|
|||||||
namespace MtApi5.Requests
|
// ReSharper disable InconsistentNaming
|
||||||
|
|
||||||
|
namespace MtApi5.Requests
|
||||||
{
|
{
|
||||||
internal enum RequestType
|
internal enum RequestType
|
||||||
{
|
{
|
||||||
Unknown = 0,
|
Unknown = 0,
|
||||||
CopyTicks = 1
|
CopyTicks = 1,
|
||||||
|
iCustom = 2,
|
||||||
|
OrderSend = 3,
|
||||||
|
PositionOpen = 4,
|
||||||
|
OrderCheck = 5,
|
||||||
|
MarketBookGet = 6,
|
||||||
|
IndicatorCreate = 7
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Executable → Regular
+4
-2
@@ -1,8 +1,10 @@
|
|||||||
namespace MtApi5.Responses
|
namespace MtApi5.Requests
|
||||||
{
|
{
|
||||||
internal class ResponseBase
|
internal class Response<T>
|
||||||
{
|
{
|
||||||
public int ErrorCode { get; set; }
|
public int ErrorCode { get; set; }
|
||||||
public string ErrorMessage { get; set; }
|
public string ErrorMessage { get; set; }
|
||||||
|
|
||||||
|
public T Value { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace MtApi5.Responses
|
|
||||||
{
|
|
||||||
internal class CopyTicksResponse: ResponseBase
|
|
||||||
{
|
|
||||||
public List<MqlTick> Ticks { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -10,6 +10,7 @@
|
|||||||
<OutputType>Package</OutputType>
|
<OutputType>Package</OutputType>
|
||||||
<WixTargetsPath Condition=" '$(WixTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
|
<WixTargetsPath Condition=" '$(WixTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
|
||||||
<WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
|
<WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
|
||||||
|
<RunWixToolsOutOfProc>true</RunWixToolsOutOfProc>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||||
<OutputPath>..\build\installers\$(Configuration)\</OutputPath>
|
<OutputPath>..\build\installers\$(Configuration)\</OutputPath>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
xmlns:mtapi5="clr-namespace:MtApi5;assembly=MtApi5"
|
xmlns:mtapi5="clr-namespace:MtApi5;assembly=MtApi5"
|
||||||
xmlns:sys="clr-namespace:System;assembly=mscorlib"
|
xmlns:sys="clr-namespace:System;assembly=mscorlib"
|
||||||
xmlns:mtApi5TestClient="clr-namespace:MtApi5TestClient"
|
xmlns:mtApi5TestClient="clr-namespace:MtApi5TestClient"
|
||||||
Title="MainWindow" Height="700" Width="650"
|
Title="MainWindow" Height="700" Width="700"
|
||||||
Closing="Window_Closing">
|
Closing="Window_Closing">
|
||||||
<Window.Resources>
|
<Window.Resources>
|
||||||
<DataTemplate x:Key="ConnectionTextBlockTemplate" DataType="{x:Type mtapi5:Mt5ConnectionState}">
|
<DataTemplate x:Key="ConnectionTextBlockTemplate" DataType="{x:Type mtapi5:Mt5ConnectionState}">
|
||||||
@@ -84,6 +84,13 @@
|
|||||||
<x:Type TypeName="mtapi5:ENUM_TIMEFRAMES"/>
|
<x:Type TypeName="mtapi5:ENUM_TIMEFRAMES"/>
|
||||||
</ObjectDataProvider.MethodParameters>
|
</ObjectDataProvider.MethodParameters>
|
||||||
</ObjectDataProvider>
|
</ObjectDataProvider>
|
||||||
|
|
||||||
|
<ObjectDataProvider x:Key="ENUM_INDICATOR_Key" MethodName="GetValues"
|
||||||
|
ObjectType="{x:Type sys:Enum}">
|
||||||
|
<ObjectDataProvider.MethodParameters>
|
||||||
|
<x:Type TypeName="mtapi5:ENUM_INDICATOR"/>
|
||||||
|
</ObjectDataProvider.MethodParameters>
|
||||||
|
</ObjectDataProvider>
|
||||||
</Window.Resources>
|
</Window.Resources>
|
||||||
|
|
||||||
<Grid x:Name="_MainLayout">
|
<Grid x:Name="_MainLayout">
|
||||||
@@ -100,58 +107,33 @@
|
|||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="*"/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<Expander ExpandDirection="Right" IsExpanded="True"
|
<Grid Margin="10">
|
||||||
Grid.Row="0" Grid.Column="0" Margin="5">
|
<Grid.RowDefinitions>
|
||||||
<Expander.Header>
|
<RowDefinition Height="Auto"/>
|
||||||
<TextBlock Text="Connection" RenderTransformOrigin="0.5,0.5" Margin="0,0,0,0" Width="Auto">
|
<RowDefinition Height="Auto"/>
|
||||||
<TextBlock.LayoutTransform>
|
<RowDefinition Height="Auto"/>
|
||||||
<TransformGroup>
|
</Grid.RowDefinitions>
|
||||||
<ScaleTransform ScaleX="1" ScaleY="1"/>
|
|
||||||
<SkewTransform AngleX="0" AngleY="0"/>
|
|
||||||
<RotateTransform Angle="-90"/>
|
|
||||||
<TranslateTransform X="0" Y="0"/>
|
|
||||||
</TransformGroup>
|
|
||||||
</TextBlock.LayoutTransform>
|
|
||||||
<TextBlock.RenderTransform>
|
|
||||||
<TransformGroup>
|
|
||||||
<ScaleTransform ScaleX="1" ScaleY="1"/>
|
|
||||||
<SkewTransform AngleX="0" AngleY="0"/>
|
|
||||||
<RotateTransform Angle="0"/>
|
|
||||||
<TranslateTransform X="0" Y="0"/>
|
|
||||||
</TransformGroup>
|
|
||||||
</TextBlock.RenderTransform>
|
|
||||||
</TextBlock>
|
|
||||||
</Expander.Header>
|
|
||||||
<Expander.Content>
|
|
||||||
<Grid Margin="10">
|
|
||||||
<Grid.RowDefinitions>
|
|
||||||
<RowDefinition Height="Auto"/>
|
|
||||||
<RowDefinition Height="Auto"/>
|
|
||||||
<RowDefinition Height="Auto"/>
|
|
||||||
</Grid.RowDefinitions>
|
|
||||||
|
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="Auto"/>
|
<ColumnDefinition Width="Auto"/>
|
||||||
<ColumnDefinition Width="150"/>
|
<ColumnDefinition Width="150"/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<TextBlock Grid.Row="0" Grid.Column="0" Text="Host"/>
|
<TextBlock Grid.Row="0" Grid.Column="0" Text="Host"/>
|
||||||
<TextBox Grid.Row="0" Grid.Column="1"
|
<TextBox Grid.Row="0" Grid.Column="1"
|
||||||
Margin="5,0,0,0"
|
Margin="5,0,0,0"
|
||||||
Text="{Binding Host, UpdateSourceTrigger=PropertyChanged}"/>
|
Text="{Binding Host, UpdateSourceTrigger=PropertyChanged}"/>
|
||||||
|
|
||||||
<TextBlock Grid.Row="1" Grid.Column="0" Text="Port"/>
|
<TextBlock Grid.Row="1" Grid.Column="0" Text="Port"/>
|
||||||
<TextBox Grid.Row="1" Grid.Column="1"
|
<TextBox Grid.Row="1" Grid.Column="1"
|
||||||
Margin="5,0,0,0"
|
Margin="5,0,0,0"
|
||||||
Text="{Binding Port, UpdateSourceTrigger=PropertyChanged}"/>
|
Text="{Binding Port, UpdateSourceTrigger=PropertyChanged}"/>
|
||||||
|
|
||||||
<StackPanel Grid.Row="2" Grid.ColumnSpan="2" Margin="5" Orientation="Horizontal">
|
<StackPanel Grid.Row="2" Grid.ColumnSpan="2" Margin="5" Orientation="Horizontal">
|
||||||
<Button Content="Connect" Width="70" Command="{Binding ConnectCommand}" />
|
<Button Content="Connect" Width="70" Command="{Binding ConnectCommand}" />
|
||||||
<Button Margin="5,0,0,0" Width="70" Content="Disconnect" Command="{Binding DisconnectCommand}" />
|
<Button Margin="5,0,0,0" Width="70" Content="Disconnect" Command="{Binding DisconnectCommand}" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Expander.Content>
|
|
||||||
</Expander>
|
|
||||||
|
|
||||||
<ListView Grid.Row="0" Grid.Column="1"
|
<ListView Grid.Row="0" Grid.Column="1"
|
||||||
ItemsSource="{Binding Quotes}"
|
ItemsSource="{Binding Quotes}"
|
||||||
@@ -247,15 +229,26 @@
|
|||||||
SelectedItem="{Binding TradeRequest.Type_time}" Margin="5,0,0,0"/>
|
SelectedItem="{Binding TradeRequest.Type_time}" Margin="5,0,0,0"/>
|
||||||
|
|
||||||
<TextBlock Grid.Column="2" Grid.Row="6" Text="Expiration" Margin="10,0,0,0"/>
|
<TextBlock Grid.Column="2" Grid.Row="6" Text="Expiration" Margin="10,0,0,0"/>
|
||||||
<TextBox Grid.Column="3" Grid.Row="6" Text="{Binding TradeRequest}" Margin="5,0,0,0"/>
|
<TextBox Grid.Column="3" Grid.Row="6" Text="{Binding TradeRequest.Expiration}" Margin="5,0,0,0"/>
|
||||||
|
|
||||||
<TextBlock Grid.Column="0" Grid.Row="7" Text="Comment"/>
|
<TextBlock Grid.Column="0" Grid.Row="7" Text="Comment"/>
|
||||||
<TextBox Grid.Column="1" Grid.Row="7" Grid.ColumnSpan="3" Text="{Binding TradeRequest}" Margin="5,0,0,0"/>
|
<TextBox Grid.Column="1" Grid.Row="7" Grid.ColumnSpan="3" Text="{Binding TradeRequest.Comment}" Margin="5,0,0,0"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Expander>
|
</Expander>
|
||||||
|
|
||||||
<StackPanel Grid.Row="1" Orientation="Horizontal">
|
<StackPanel Grid.Row="1" Orientation="Vertical">
|
||||||
<Button Content="OrderSend" Command="{Binding OrderSendCommand}" Width="100" Height="25"/>
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<Button Content="OrderSend" Command="{Binding OrderSendCommand}" Width="100" Height="25" HorizontalAlignment="Left" Margin="4"/>
|
||||||
|
<Button Content="OrderCheck" Command="{Binding OrderCheckCommand}" Width="100" Height="25" HorizontalAlignment="Left" Margin="4"/>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<WrapPanel>
|
||||||
|
<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"/>
|
||||||
|
</WrapPanel>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
</Grid>
|
</Grid>
|
||||||
@@ -319,32 +312,37 @@
|
|||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="*"/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<Grid Grid.Column="1">
|
<Grid Grid.Column="1" Margin="2">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto"/>
|
<RowDefinition Height="Auto"/>
|
||||||
<RowDefinition Height="Auto"/>
|
<RowDefinition Height="Auto"/>
|
||||||
<RowDefinition Height="Auto"/>
|
<RowDefinition Height="Auto"/>
|
||||||
<RowDefinition Height="Auto"/>
|
|
||||||
<RowDefinition Height="Auto"/>
|
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
<Grid.ColumnDefinitions>
|
<Grid Grid.Row="0">
|
||||||
<ColumnDefinition Width="Auto"/>
|
<Grid.RowDefinitions>
|
||||||
<ColumnDefinition Width="*"/>
|
<RowDefinition Height="Auto"/>
|
||||||
</Grid.ColumnDefinitions>
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
<ColumnDefinition Width="*"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<TextBlock Grid.Row="0" Text="Symbol Name" Margin="1"/>
|
||||||
|
<TextBlock Grid.Row="1" Grid.Column="0" Text="TimeFrame" Margin="1" HorizontalAlignment="Right"/>
|
||||||
|
<TextBlock Grid.Row="2" Grid.Column="0" Text="StartPos" Margin="1" HorizontalAlignment="Right"/>
|
||||||
|
<TextBlock Grid.Row="3" Grid.Column="0" Text="Count" Margin="1" HorizontalAlignment="Right"/>
|
||||||
|
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding TimeSeriesValues.SymbolValue}" Margin="1"/>
|
||||||
|
<ComboBox Grid.Row="1" Grid.Column="1" Margin="1"
|
||||||
|
ItemsSource="{Binding Source={StaticResource ENUM_TIMEFRAMES_Key}}"
|
||||||
|
SelectedItem="{Binding TimeSeriesValues.TimeFrame}"/>
|
||||||
|
<TextBox Grid.Row="2" Grid.Column="1" Text="{Binding TimeSeriesValues.StartPos}" Margin="1"/>
|
||||||
|
<TextBox Grid.Row="3" Grid.Column="1" Text="{Binding TimeSeriesValues.Count}" Margin="1"/>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
<TextBox Grid.Row="0" Text="symbolName"/>
|
<WrapPanel Grid.Row="1" Grid.Column="0" Margin="5">
|
||||||
<TextBox Grid.Row="1" Grid.Column="0" Text="timeframe"/>
|
|
||||||
<TextBox Grid.Row="2" Grid.Column="0" Text="startPos"/>
|
|
||||||
<TextBox Grid.Row="3" Grid.Column="0" Text="count"/>
|
|
||||||
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding TimeSeriesValues.SymbolValue}"/>
|
|
||||||
<ComboBox Grid.Row="1" Grid.Column="1"
|
|
||||||
ItemsSource="{Binding Source={StaticResource ENUM_TIMEFRAMES_Key}}"
|
|
||||||
SelectedItem="{Binding TimeSeriesValues.TimeFrame}"/>
|
|
||||||
<TextBox Grid.Row="2" Grid.Column="1" Text="{Binding TimeSeriesValues.StartPos}"/>
|
|
||||||
<TextBox Grid.Row="3" Grid.Column="1" Text="{Binding TimeSeriesValues.Count}"/>
|
|
||||||
|
|
||||||
<WrapPanel Grid.Row="4" Grid.ColumnSpan="2" Grid.Column="0" Margin="10">
|
|
||||||
<Button Command="{Binding CopyRatesCommand}" Margin="1"
|
<Button Command="{Binding CopyRatesCommand}" Margin="1"
|
||||||
Content="CopyRates" HorizontalAlignment="Left" />
|
Content="CopyRates" HorizontalAlignment="Left" />
|
||||||
<Button Command="{Binding CopyTimesCommand}" Margin="1"
|
<Button Command="{Binding CopyTimesCommand}" Margin="1"
|
||||||
@@ -365,11 +363,33 @@
|
|||||||
Content="CopySpread" HorizontalAlignment="Left" />
|
Content="CopySpread" HorizontalAlignment="Left" />
|
||||||
<Button Command="{Binding CopyTicksCommand}" Margin="1"
|
<Button Command="{Binding CopyTicksCommand}" Margin="1"
|
||||||
Content="CopyTicks" HorizontalAlignment="Left" />
|
Content="CopyTicks" HorizontalAlignment="Left" />
|
||||||
|
|
||||||
</WrapPanel>
|
</WrapPanel>
|
||||||
|
|
||||||
|
<Grid Grid.Row="2">
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="*"/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
|
<ComboBox Grid.Row="0" Grid.Column="0"
|
||||||
|
ItemsSource="{Binding Source={StaticResource ENUM_INDICATOR_Key}}"
|
||||||
|
SelectedItem="{Binding TimeSeriesValues.IndicatorType}"/>
|
||||||
|
<Button Grid.Row="0" Grid.Column="1" Command="{Binding IndicatorCreateCommand}" Margin="2"
|
||||||
|
Content="IndicatorCreate" HorizontalAlignment="Left" />
|
||||||
|
<Label Grid.Row="1" Grid.Column="0" Content="Indicator handle:" Margin="2"/>
|
||||||
|
<TextBox Grid.Row="1" Grid.Column="0" Margin="2" Width="30" PreviewTextInput="NumberValidationTextBox" Text="{Binding TimeSeriesValues.IndicatorHandle}"></TextBox>
|
||||||
|
<Button Grid.Row="1" Grid.Column="1" Command="{Binding IndicatorReleaseCommand}" Margin="2"
|
||||||
|
Content="IndicatorRelease" HorizontalAlignment="Left" />
|
||||||
|
</Grid>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<ListBox ItemsSource="{Binding TimeSeriesResults}" />
|
<ListBox Grid.Column="0" ItemsSource="{Binding TimeSeriesResults}" />
|
||||||
|
|
||||||
</Grid>
|
</Grid>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
@@ -397,10 +417,25 @@
|
|||||||
<Button Command="{Binding PositionOpenCommand}" Content="PositionOpen" Margin="2"/>
|
<Button Command="{Binding PositionOpenCommand}" Content="PositionOpen" Margin="2"/>
|
||||||
</WrapPanel>
|
</WrapPanel>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|
||||||
|
<TabItem Header="Indicators">
|
||||||
|
<WrapPanel VerticalAlignment="Top" Margin="5">
|
||||||
|
<Button Command="{Binding iCustomCommand}" Content="iCustom" Margin="2"/>
|
||||||
|
</WrapPanel>
|
||||||
|
</TabItem>
|
||||||
|
|
||||||
|
<TabItem Header="Time and Date">
|
||||||
|
<WrapPanel VerticalAlignment="Top" Margin="5">
|
||||||
|
<Button Command="{Binding TimeCurrentCommand}" Content="TimeCurrent" Margin="2"/>
|
||||||
|
<Button Command="{Binding TimeTradeServerCommand}" Content="TimeTradeServer" Margin="2"/>
|
||||||
|
<Button Command="{Binding TimeLocalCommand}" Content="TimeLocal" Margin="2"/>
|
||||||
|
<Button Command="{Binding TimeGMTCommand}" Content="TimeGMT" Margin="2"/>
|
||||||
|
</WrapPanel>
|
||||||
|
</TabItem>
|
||||||
</TabControl>
|
</TabControl>
|
||||||
|
|
||||||
<Expander Grid.Row="2" Header="History" IsExpanded="True">
|
<Expander Grid.Row="2" Header="Console" IsExpanded="True">
|
||||||
<ListBox mtApi5TestClient:ListBoxBehavior.ScrollOnNewItem="true" Height="200" ItemsSource="{Binding History}"/>
|
<ListBox mtApi5TestClient:ListBoxBehavior.ScrollOnNewItem="true" Height="180" ItemsSource="{Binding History}"/>
|
||||||
</Expander>
|
</Expander>
|
||||||
|
|
||||||
<StatusBar Grid.Row="3">
|
<StatusBar Grid.Row="3">
|
||||||
|
|||||||
@@ -1,37 +1,32 @@
|
|||||||
using System;
|
using System.Text.RegularExpressions;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Windows;
|
|
||||||
using System.Windows.Controls;
|
|
||||||
using System.Windows.Data;
|
|
||||||
using System.Windows.Documents;
|
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using System.Windows.Media;
|
|
||||||
using System.Windows.Media.Imaging;
|
|
||||||
using System.Windows.Navigation;
|
|
||||||
using System.Windows.Shapes;
|
|
||||||
|
|
||||||
namespace MtApi5TestClient
|
namespace MtApi5TestClient
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interaction logic for MainWindow.xaml
|
/// Interaction logic for MainWindow.xaml
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public partial class MainWindow : Window
|
public partial class MainWindow
|
||||||
{
|
{
|
||||||
ViewModel _vm { get; set; }
|
private ViewModel Vm { get; }
|
||||||
|
|
||||||
public MainWindow()
|
public MainWindow()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
_vm = new ViewModel();
|
Vm = new ViewModel();
|
||||||
_MainLayout.DataContext = _vm;
|
_MainLayout.DataContext = Vm;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
|
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
|
||||||
{
|
{
|
||||||
_vm.Close();
|
Vm.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void NumberValidationTextBox(object sender, TextCompositionEventArgs e)
|
||||||
|
{
|
||||||
|
var regex = new Regex("[^0-9]+");
|
||||||
|
e.Handled = regex.IsMatch(e.Text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using MtApi5;
|
using MtApi5;
|
||||||
|
|
||||||
@@ -29,7 +26,7 @@ namespace MtApi5TestClient
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public uint Magic
|
public ulong Magic
|
||||||
{
|
{
|
||||||
get { return TradeRequest.Magic; }
|
get { return TradeRequest.Magic; }
|
||||||
set
|
set
|
||||||
@@ -109,7 +106,7 @@ namespace MtApi5TestClient
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public uint Deviation
|
public ulong Deviation
|
||||||
{
|
{
|
||||||
get { return TradeRequest.Deviation; }
|
get { return TradeRequest.Deviation; }
|
||||||
set
|
set
|
||||||
|
|||||||
@@ -1,21 +1,17 @@
|
|||||||
using System;
|
using MtApi5;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using MtApi5;
|
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
|
|
||||||
namespace MtApi5TestClient
|
namespace MtApi5TestClient
|
||||||
{
|
{
|
||||||
public class TimeSeriesValueViewModel : INotifyPropertyChanged
|
public class TimeSeriesValueViewModel : INotifyPropertyChanged
|
||||||
{
|
{
|
||||||
private string _SymbolValue;
|
private string _symbolValue;
|
||||||
public string SymbolValue
|
public string SymbolValue
|
||||||
{
|
{
|
||||||
get { return _SymbolValue; }
|
get { return _symbolValue; }
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
_SymbolValue = value;
|
_symbolValue = value;
|
||||||
OnPropertyChanged("SymbolValue");
|
OnPropertyChanged("SymbolValue");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -24,13 +20,36 @@ namespace MtApi5TestClient
|
|||||||
public int StartPos { get; set; }
|
public int StartPos { get; set; }
|
||||||
public int Count { get; set; }
|
public int Count { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
private int _indicatorHandle;
|
||||||
|
public int IndicatorHandle
|
||||||
|
{
|
||||||
|
get { return _indicatorHandle; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_indicatorHandle = value;
|
||||||
|
OnPropertyChanged("IndicatorHandle");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ENUM_INDICATOR _indicatorType = ENUM_INDICATOR.IND_MACD;
|
||||||
|
public ENUM_INDICATOR IndicatorType
|
||||||
|
{
|
||||||
|
get { return _indicatorType; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_indicatorType = value;
|
||||||
|
OnPropertyChanged("IndicatorType");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#region INotifyPropertyChanged
|
#region INotifyPropertyChanged
|
||||||
public event PropertyChangedEventHandler PropertyChanged;
|
public event PropertyChangedEventHandler PropertyChanged;
|
||||||
|
|
||||||
protected virtual void OnPropertyChanged(string propertyName)
|
protected virtual void OnPropertyChanged(string propertyName)
|
||||||
{
|
{
|
||||||
PropertyChangedEventHandler handler = PropertyChanged;
|
var handler = PropertyChanged;
|
||||||
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
|
handler?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
// ReSharper disable InconsistentNaming
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
@@ -16,6 +17,13 @@ namespace MtApi5TestClient
|
|||||||
public DelegateCommand DisconnectCommand { get; private set; }
|
public DelegateCommand DisconnectCommand { get; private set; }
|
||||||
|
|
||||||
public DelegateCommand OrderSendCommand { get; private set; }
|
public DelegateCommand OrderSendCommand { get; private set; }
|
||||||
|
public DelegateCommand OrderCheckCommand { 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 AccountInfoDoubleCommand { get; private set; }
|
||||||
public DelegateCommand AccountInfoIntegerCommand { get; private set; }
|
public DelegateCommand AccountInfoIntegerCommand { get; private set; }
|
||||||
@@ -27,6 +35,8 @@ namespace MtApi5TestClient
|
|||||||
public DelegateCommand CopyHighCommand { get; private set; }
|
public DelegateCommand CopyHighCommand { get; private set; }
|
||||||
public DelegateCommand CopyLowCommand { get; private set; }
|
public DelegateCommand CopyLowCommand { get; private set; }
|
||||||
public DelegateCommand CopyCloseCommand { get; private set; }
|
public DelegateCommand CopyCloseCommand { get; private set; }
|
||||||
|
public DelegateCommand IndicatorCreateCommand { get; private set; }
|
||||||
|
public DelegateCommand IndicatorReleaseCommand { get; private set; }
|
||||||
|
|
||||||
public DelegateCommand CopyTickVolumeCommand { get; private set; }
|
public DelegateCommand CopyTickVolumeCommand { get; private set; }
|
||||||
public DelegateCommand CopyRealVolumeCommand { get; private set; }
|
public DelegateCommand CopyRealVolumeCommand { get; private set; }
|
||||||
@@ -50,6 +60,13 @@ namespace MtApi5TestClient
|
|||||||
public DelegateCommand PositionOpenCommand { get; private set; }
|
public DelegateCommand PositionOpenCommand { get; private set; }
|
||||||
|
|
||||||
public DelegateCommand PrintCommand { get; private set; }
|
public DelegateCommand PrintCommand { get; private set; }
|
||||||
|
|
||||||
|
public DelegateCommand iCustomCommand { get; private set; }
|
||||||
|
|
||||||
|
public DelegateCommand TimeCurrentCommand { get; private set; }
|
||||||
|
public DelegateCommand TimeTradeServerCommand { get; private set; }
|
||||||
|
public DelegateCommand TimeLocalCommand { get; private set; }
|
||||||
|
public DelegateCommand TimeGMTCommand { get; private set; }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Properties
|
#region Properties
|
||||||
@@ -157,6 +174,8 @@ namespace MtApi5TestClient
|
|||||||
_mtApiClient.QuoteAdded += mMtApiClient_QuoteAdded;
|
_mtApiClient.QuoteAdded += mMtApiClient_QuoteAdded;
|
||||||
_mtApiClient.QuoteRemoved += mMtApiClient_QuoteRemoved;
|
_mtApiClient.QuoteRemoved += mMtApiClient_QuoteRemoved;
|
||||||
_mtApiClient.QuoteUpdated += mMtApiClient_QuoteUpdated;
|
_mtApiClient.QuoteUpdated += mMtApiClient_QuoteUpdated;
|
||||||
|
_mtApiClient.OnTradeTransaction += mMtApiClient_OnTradeTransaction;
|
||||||
|
_mtApiClient.OnBookEvent += _mtApiClient_OnBookEvent;
|
||||||
|
|
||||||
_quotesMap = new Dictionary<string, QuoteViewModel>();
|
_quotesMap = new Dictionary<string, QuoteViewModel>();
|
||||||
|
|
||||||
@@ -193,6 +212,13 @@ namespace MtApi5TestClient
|
|||||||
DisconnectCommand = new DelegateCommand(ExecuteDisconnect, CanExecuteDisconnect);
|
DisconnectCommand = new DelegateCommand(ExecuteDisconnect, CanExecuteDisconnect);
|
||||||
|
|
||||||
OrderSendCommand = new DelegateCommand(ExecuteOrderSend);
|
OrderSendCommand = new DelegateCommand(ExecuteOrderSend);
|
||||||
|
OrderCheckCommand = new DelegateCommand(ExecuteOrderCheck);
|
||||||
|
|
||||||
|
HistoryOrderGetIntegerCommand = new DelegateCommand(ExecuteHistoryOrderGetInteger);
|
||||||
|
HistoryDealGetDoubleCommand = new DelegateCommand(ExecuteHistoryDealGetDouble);
|
||||||
|
HistoryDealGetIntegerCommand = new DelegateCommand(ExecuteHistoryDealGetInteger);
|
||||||
|
HistoryDealGetStringCommand = new DelegateCommand(ExecuteHistoryDealGetString);
|
||||||
|
HistoryDealMethodsCommand = new DelegateCommand(ExecuteHistoryDealMethods);
|
||||||
|
|
||||||
AccountInfoDoubleCommand = new DelegateCommand(ExecuteAccountInfoDouble);
|
AccountInfoDoubleCommand = new DelegateCommand(ExecuteAccountInfoDouble);
|
||||||
AccountInfoIntegerCommand = new DelegateCommand(ExecuteAccountInfoInteger);
|
AccountInfoIntegerCommand = new DelegateCommand(ExecuteAccountInfoInteger);
|
||||||
@@ -204,6 +230,8 @@ namespace MtApi5TestClient
|
|||||||
CopyHighCommand = new DelegateCommand(ExecuteCopyHigh);
|
CopyHighCommand = new DelegateCommand(ExecuteCopyHigh);
|
||||||
CopyLowCommand = new DelegateCommand(ExecuteCopyLow);
|
CopyLowCommand = new DelegateCommand(ExecuteCopyLow);
|
||||||
CopyCloseCommand = new DelegateCommand(ExecuteCopyClose);
|
CopyCloseCommand = new DelegateCommand(ExecuteCopyClose);
|
||||||
|
IndicatorCreateCommand = new DelegateCommand(ExecuteIndicatorCreate);
|
||||||
|
IndicatorReleaseCommand = new DelegateCommand(ExecuteIndicatorRelease);
|
||||||
|
|
||||||
CopyTickVolumeCommand = new DelegateCommand(ExecuteCopyTickVolume);
|
CopyTickVolumeCommand = new DelegateCommand(ExecuteCopyTickVolume);
|
||||||
CopyRealVolumeCommand = new DelegateCommand(ExecuteCopyRealVolume);
|
CopyRealVolumeCommand = new DelegateCommand(ExecuteCopyRealVolume);
|
||||||
@@ -227,6 +255,13 @@ namespace MtApi5TestClient
|
|||||||
PositionOpenCommand = new DelegateCommand(ExecutePositionOpen);
|
PositionOpenCommand = new DelegateCommand(ExecutePositionOpen);
|
||||||
|
|
||||||
PrintCommand = new DelegateCommand(ExecutePrint);
|
PrintCommand = new DelegateCommand(ExecutePrint);
|
||||||
|
|
||||||
|
iCustomCommand = new DelegateCommand(ExecuteICustom);
|
||||||
|
|
||||||
|
TimeCurrentCommand = new DelegateCommand(ExecuteTimeCurrent);
|
||||||
|
TimeTradeServerCommand = new DelegateCommand(ExecuteTimeTradeServer);
|
||||||
|
TimeLocalCommand = new DelegateCommand(ExecuteTimeLocal);
|
||||||
|
TimeGMTCommand = new DelegateCommand(ExecuteTimeGMT);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool CanExecuteConnect(object o)
|
private bool CanExecuteConnect(object o)
|
||||||
@@ -259,18 +294,91 @@ namespace MtApi5TestClient
|
|||||||
private async void ExecuteOrderSend(object o)
|
private async void ExecuteOrderSend(object o)
|
||||||
{
|
{
|
||||||
var request = TradeRequest.GetMqlTradeRequest();
|
var request = TradeRequest.GetMqlTradeRequest();
|
||||||
|
MqlTradeResult result = null;
|
||||||
var retVal = await Execute(() =>
|
var retVal = await Execute(() =>
|
||||||
{
|
{
|
||||||
MqlTradeResult result;
|
|
||||||
var ok = _mtApiClient.OrderSend(request, out result);
|
var ok = _mtApiClient.OrderSend(request, out result);
|
||||||
return ok ? result : null;
|
return ok;
|
||||||
});
|
});
|
||||||
|
|
||||||
var message = retVal != null ? $"OrderSend successed. {MqlTradeResultToString(retVal)}" : "OrderSend failed.";
|
var message = retVal ? $"OrderSend: success. {result}" : $"OrderSend: fail. {result}";
|
||||||
AddLog(message);
|
AddLog(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private async void ExecuteOrderCheck(object obj)
|
||||||
|
{
|
||||||
|
var request = TradeRequest.GetMqlTradeRequest();
|
||||||
|
MqlTradeCheckResult result = null;
|
||||||
|
var retVal = await Execute(() =>
|
||||||
|
{
|
||||||
|
var ok = _mtApiClient.OrderCheck(request, out result);
|
||||||
|
return ok;
|
||||||
|
});
|
||||||
|
|
||||||
|
var message = retVal ? $"OrderCheck: success. {result}" : $"OrderCheck: fail. {result}";
|
||||||
|
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));
|
||||||
|
var history = await Execute(() => _mtApiClient.HistorySelectByPosition(posId));
|
||||||
|
var historyDealsTotal = await Execute(() => _mtApiClient.HistoryDealsTotal());
|
||||||
|
var histDealTicket = await Execute(() => _mtApiClient.HistoryDealGetTicket(0));
|
||||||
|
var histDealPrice = await Execute(() => _mtApiClient.HistoryDealGetDouble(histDealTicket, ENUM_DEAL_PROPERTY_DOUBLE.DEAL_PRICE));
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
AddLog(ex.Message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddLog("ExecuteHistoryDealMethods: success.");
|
||||||
|
}
|
||||||
|
|
||||||
private async void ExecuteAccountInfoDouble(object o)
|
private async void ExecuteAccountInfoDouble(object o)
|
||||||
{
|
{
|
||||||
var result = await Execute(() => _mtApiClient.AccountInfoDouble(AccountInfoDoublePropertyId));
|
var result = await Execute(() => _mtApiClient.AccountInfoDouble(AccountInfoDoublePropertyId));
|
||||||
@@ -446,6 +554,48 @@ namespace MtApi5TestClient
|
|||||||
AddLog("CopyClose: success");
|
AddLog("CopyClose: success");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async void ExecuteIndicatorCreate(object o)
|
||||||
|
{
|
||||||
|
var parameters = new List<MqlParam>
|
||||||
|
{
|
||||||
|
new MqlParam
|
||||||
|
{
|
||||||
|
DataType = ENUM_DATATYPE.TYPE_INT,
|
||||||
|
IntegerValue = 12
|
||||||
|
},
|
||||||
|
new MqlParam
|
||||||
|
{
|
||||||
|
DataType = ENUM_DATATYPE.TYPE_INT,
|
||||||
|
IntegerValue = 26
|
||||||
|
},
|
||||||
|
new MqlParam
|
||||||
|
{
|
||||||
|
DataType = ENUM_DATATYPE.TYPE_INT,
|
||||||
|
IntegerValue = 9
|
||||||
|
},
|
||||||
|
new MqlParam
|
||||||
|
{
|
||||||
|
DataType = ENUM_DATATYPE.TYPE_INT,
|
||||||
|
IntegerValue = (int)ENUM_APPLIED_PRICE.PRICE_CLOSE
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var retVal = await Execute(() =>
|
||||||
|
_mtApiClient.IndicatorCreate(TimeSeriesValues.SymbolValue,
|
||||||
|
TimeSeriesValues.TimeFrame, TimeSeriesValues.IndicatorType, parameters));
|
||||||
|
|
||||||
|
TimeSeriesValues.IndicatorHandle = retVal;
|
||||||
|
AddLog($"IndicatorCreate [IND_MA]: result - {retVal}");
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void ExecuteIndicatorRelease(object o)
|
||||||
|
{
|
||||||
|
var indicatorHandle = TimeSeriesValues.IndicatorHandle;
|
||||||
|
|
||||||
|
var retVal = await Execute(() => _mtApiClient.IndicatorRelease(indicatorHandle));
|
||||||
|
AddLog($"IndicatorRelease [{indicatorHandle}]: result - {retVal}");
|
||||||
|
}
|
||||||
|
|
||||||
private async void ExecuteCopyRates(object o)
|
private async void ExecuteCopyRates(object o)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(TimeSeriesValues?.SymbolValue)) return;
|
if (string.IsNullOrEmpty(TimeSeriesValues?.SymbolValue)) return;
|
||||||
@@ -705,14 +855,14 @@ namespace MtApi5TestClient
|
|||||||
|
|
||||||
private async void ExecuteMarketBookAdd(object o)
|
private async void ExecuteMarketBookAdd(object o)
|
||||||
{
|
{
|
||||||
var retVal = await Execute(() => _mtApiClient.MarketBookAdd("CHFJPY"));
|
var retVal = await Execute(() => _mtApiClient.MarketBookAdd("EURUSD"));
|
||||||
AddLog($"MarketBookAdd(CHFJPY): result = {retVal}");
|
AddLog($"MarketBookAdd(EURUSD): result = {retVal}");
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void ExecuteMarketBookRelease(object o)
|
private async void ExecuteMarketBookRelease(object o)
|
||||||
{
|
{
|
||||||
var retVal = await Execute(() => _mtApiClient.MarketBookRelease("CHFJPY"));
|
var retVal = await Execute(() => _mtApiClient.MarketBookRelease("EURUSD"));
|
||||||
AddLog($"MarketBookRelease(CHFJPY): result = {retVal}");
|
AddLog($"MarketBookRelease(EURUSD): result = {retVal}");
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void ExecuteMarketBookGet(object o)
|
private async void ExecuteMarketBookGet(object o)
|
||||||
@@ -730,13 +880,11 @@ namespace MtApi5TestClient
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
AddLog("MarketBookGet(EURUSD): success");
|
AddLog($"MarketBookGet(EURUSD): success. Count = {result.Length}");
|
||||||
|
|
||||||
for (var i = 0; i < result.Length; i++)
|
for (var i = 0; i < result.Length; i++)
|
||||||
{
|
{
|
||||||
AddLog($"MarketBookGet: book[{i}].price = {result[i].price}");
|
AddLog($"MarketBookGet: [{i}] - {result[i].price} | {result[i].volume} | {result[i].type}");
|
||||||
AddLog($"MarketBookGet: book[{i}].price = {result[i].volume}");
|
|
||||||
AddLog($"MarketBookGet: book[{i}].price = {result[i].type}");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -745,13 +893,14 @@ namespace MtApi5TestClient
|
|||||||
const string symbol = "EURUSD";
|
const string symbol = "EURUSD";
|
||||||
const ENUM_ORDER_TYPE orderType = ENUM_ORDER_TYPE.ORDER_TYPE_BUY;
|
const ENUM_ORDER_TYPE orderType = ENUM_ORDER_TYPE.ORDER_TYPE_BUY;
|
||||||
const double volume = 0.1;
|
const double volume = 0.1;
|
||||||
const double price = 1.013;
|
const double price = 1.18129;
|
||||||
const double sl = 1.00;
|
const double sl = 1.1811;
|
||||||
const double tp = 1.020;
|
const double tp = 1.1814;
|
||||||
const string comment = "Test PositionOpen";
|
const string comment = "Test PositionOpen";
|
||||||
|
MqlTradeResult tradeResult = null;
|
||||||
|
|
||||||
var retVal = await Execute (() => _mtApiClient.PositionOpen(symbol, orderType, volume, price, sl, tp, comment));
|
var retVal = await Execute (() => _mtApiClient.PositionOpen(symbol, orderType, volume, price, sl, tp, comment, out tradeResult));
|
||||||
AddLog($"PositionOpen: symbol EURUSD result = {retVal}");
|
AddLog($"PositionOpen: symbol EURUSD retVal = {retVal}, result = {tradeResult}");
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void ExecutePrint(object obj)
|
private async void ExecutePrint(object obj)
|
||||||
@@ -762,6 +911,41 @@ namespace MtApi5TestClient
|
|||||||
AddLog($"Print: message print in MetaTrader - {retVal}");
|
AddLog($"Print: message print in MetaTrader - {retVal}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async void ExecuteICustom(object o)
|
||||||
|
{
|
||||||
|
const string symbol = "EURUSD";
|
||||||
|
const ENUM_TIMEFRAMES timeframe = ENUM_TIMEFRAMES.PERIOD_H1;
|
||||||
|
const string name = @"Examples\Custom Moving Average";
|
||||||
|
int[] parameters = { 0, 21, (int)ENUM_APPLIED_PRICE.PRICE_CLOSE };
|
||||||
|
|
||||||
|
var retVal = await Execute(() => _mtApiClient.iCustom(symbol, timeframe, name, parameters));
|
||||||
|
AddLog($"Custom Moving Average: result - {retVal}");
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void ExecuteTimeCurrent(object o)
|
||||||
|
{
|
||||||
|
var retVal = await Execute(() => _mtApiClient.TimeCurrent());
|
||||||
|
AddLog($"TimeCurrent: {retVal}");
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void ExecuteTimeTradeServer(object o)
|
||||||
|
{
|
||||||
|
var retVal = await Execute(() => _mtApiClient.TimeTradeServer());
|
||||||
|
AddLog($"TimeTradeServer: {retVal}");
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void ExecuteTimeLocal(object o)
|
||||||
|
{
|
||||||
|
var retVal = await Execute(() => _mtApiClient.TimeLocal());
|
||||||
|
AddLog($"TimeLocal: {retVal}");
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void ExecuteTimeGMT(object o)
|
||||||
|
{
|
||||||
|
var retVal = await Execute(() => _mtApiClient.TimeGMT());
|
||||||
|
AddLog($"TimeGMT: {retVal}");
|
||||||
|
}
|
||||||
|
|
||||||
private static void RunOnUiThread(Action action)
|
private static void RunOnUiThread(Action action)
|
||||||
{
|
{
|
||||||
Application.Current?.Dispatcher.Invoke(action);
|
Application.Current?.Dispatcher.Invoke(action);
|
||||||
@@ -826,6 +1010,16 @@ namespace MtApi5TestClient
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void mMtApiClient_OnTradeTransaction(object sender, Mt5TradeTransactionEventArgs e)
|
||||||
|
{
|
||||||
|
AddLog($"OnTradeTransaction: ExpertHandle = {e.ExpertHandle}.{Environment.NewLine}Transaction = {e.Trans}.{Environment.NewLine}Request = {e.Request}.{Environment.NewLine}Result = {e.Result}.");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void _mtApiClient_OnBookEvent(object sender, Mt5BookEventArgs e)
|
||||||
|
{
|
||||||
|
AddLog($"OnBookEvent: ExpertHandle = {e.ExpertHandle}, Symbol = {e.Symbol}");
|
||||||
|
}
|
||||||
|
|
||||||
private void AddQuote(Mt5Quote quote)
|
private void AddQuote(Mt5Quote quote)
|
||||||
{
|
{
|
||||||
if (quote == null)
|
if (quote == null)
|
||||||
@@ -884,20 +1078,6 @@ namespace MtApi5TestClient
|
|||||||
Quotes.Clear();
|
Quotes.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string MqlTradeResultToString(MqlTradeResult result)
|
|
||||||
{
|
|
||||||
return result != null ?
|
|
||||||
"Retcode = " + result.Retcode + ";"
|
|
||||||
+ " Comment = " + result.Comment + ";"
|
|
||||||
+ " Order = " + result.Order + ";"
|
|
||||||
+ " Volume = " + result.Volume + ";"
|
|
||||||
+ " Price = " + result.Price + ";"
|
|
||||||
+ " Deal = " + result.Deal + ";"
|
|
||||||
+ " Request_id = " + result.Request_id + ";"
|
|
||||||
+ " Bid = " + result.Bid + ";"
|
|
||||||
+ " Ask = " + result.Ask + ";" : string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnSelectedQuoteChanged()
|
private void OnSelectedQuoteChanged()
|
||||||
{
|
{
|
||||||
if (SelectedQuote == null) return;
|
if (SelectedQuote == null) return;
|
||||||
@@ -915,6 +1095,10 @@ namespace MtApi5TestClient
|
|||||||
{
|
{
|
||||||
result = func();
|
result = func();
|
||||||
}
|
}
|
||||||
|
catch (ExecutionException ex)
|
||||||
|
{
|
||||||
|
AddLog($"Exception: {ex.ErrorCode} - {ex.Message}");
|
||||||
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
AddLog($"Exception: {ex.Message}");
|
AddLog($"Exception: {ex.Message}");
|
||||||
|
|||||||
+116
-65
@@ -113,6 +113,13 @@
|
|||||||
this.label22 = new System.Windows.Forms.Label();
|
this.label22 = new System.Windows.Forms.Label();
|
||||||
this.textBoxErrorCode = new System.Windows.Forms.TextBox();
|
this.textBoxErrorCode = new System.Windows.Forms.TextBox();
|
||||||
this.tabPage3 = new System.Windows.Forms.TabPage();
|
this.tabPage3 = new System.Windows.Forms.TabPage();
|
||||||
|
this.button70 = new System.Windows.Forms.Button();
|
||||||
|
this.label33 = new System.Windows.Forms.Label();
|
||||||
|
this.label32 = new System.Windows.Forms.Label();
|
||||||
|
this.label31 = new System.Windows.Forms.Label();
|
||||||
|
this.textBoxAccountHost = new System.Windows.Forms.TextBox();
|
||||||
|
this.textBoxAccountPassword = new System.Windows.Forms.TextBox();
|
||||||
|
this.textBoxAccountLogin = new System.Windows.Forms.TextBox();
|
||||||
this.button67 = new System.Windows.Forms.Button();
|
this.button67 = new System.Windows.Forms.Button();
|
||||||
this.button66 = new System.Windows.Forms.Button();
|
this.button66 = new System.Windows.Forms.Button();
|
||||||
this.button65 = new System.Windows.Forms.Button();
|
this.button65 = new System.Windows.Forms.Button();
|
||||||
@@ -136,6 +143,8 @@
|
|||||||
this.label23 = new System.Windows.Forms.Label();
|
this.label23 = new System.Windows.Forms.Label();
|
||||||
this.textBoxAccountInfoSymbol = new System.Windows.Forms.TextBox();
|
this.textBoxAccountInfoSymbol = new System.Windows.Forms.TextBox();
|
||||||
this.tabPage4 = new System.Windows.Forms.TabPage();
|
this.tabPage4 = new System.Windows.Forms.TabPage();
|
||||||
|
this.comboBox12 = new System.Windows.Forms.ComboBox();
|
||||||
|
this.button72 = new System.Windows.Forms.Button();
|
||||||
this.button36 = new System.Windows.Forms.Button();
|
this.button36 = new System.Windows.Forms.Button();
|
||||||
this.comboBox10 = new System.Windows.Forms.ComboBox();
|
this.comboBox10 = new System.Windows.Forms.ComboBox();
|
||||||
this.comboBox9 = new System.Windows.Forms.ComboBox();
|
this.comboBox9 = new System.Windows.Forms.ComboBox();
|
||||||
@@ -182,6 +191,7 @@
|
|||||||
this.button14 = new System.Windows.Forms.Button();
|
this.button14 = new System.Windows.Forms.Button();
|
||||||
this.button13 = new System.Windows.Forms.Button();
|
this.button13 = new System.Windows.Forms.Button();
|
||||||
this.tabPage7 = new System.Windows.Forms.TabPage();
|
this.tabPage7 = new System.Windows.Forms.TabPage();
|
||||||
|
this.button71 = new System.Windows.Forms.Button();
|
||||||
this.button23 = new System.Windows.Forms.Button();
|
this.button23 = new System.Windows.Forms.Button();
|
||||||
this.iCustomBtn = new System.Windows.Forms.Button();
|
this.iCustomBtn = new System.Windows.Forms.Button();
|
||||||
this.tabPage8 = new System.Windows.Forms.TabPage();
|
this.tabPage8 = new System.Windows.Forms.TabPage();
|
||||||
@@ -202,13 +212,7 @@
|
|||||||
this.button4 = new System.Windows.Forms.Button();
|
this.button4 = new System.Windows.Forms.Button();
|
||||||
this.tabPage11 = new System.Windows.Forms.TabPage();
|
this.tabPage11 = new System.Windows.Forms.TabPage();
|
||||||
this.button69 = new System.Windows.Forms.Button();
|
this.button69 = new System.Windows.Forms.Button();
|
||||||
this.textBoxAccountLogin = new System.Windows.Forms.TextBox();
|
this.button73 = new System.Windows.Forms.Button();
|
||||||
this.textBoxAccountPassword = new System.Windows.Forms.TextBox();
|
|
||||||
this.label31 = new System.Windows.Forms.Label();
|
|
||||||
this.label32 = new System.Windows.Forms.Label();
|
|
||||||
this.textBoxAccountHost = new System.Windows.Forms.TextBox();
|
|
||||||
this.label33 = new System.Windows.Forms.Label();
|
|
||||||
this.button70 = new System.Windows.Forms.Button();
|
|
||||||
this.groupBox1.SuspendLayout();
|
this.groupBox1.SuspendLayout();
|
||||||
this.statusStrip1.SuspendLayout();
|
this.statusStrip1.SuspendLayout();
|
||||||
this.groupBox2.SuspendLayout();
|
this.groupBox2.SuspendLayout();
|
||||||
@@ -1154,6 +1158,64 @@
|
|||||||
this.tabPage3.Text = "Account Information";
|
this.tabPage3.Text = "Account Information";
|
||||||
this.tabPage3.UseVisualStyleBackColor = true;
|
this.tabPage3.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
|
// button70
|
||||||
|
//
|
||||||
|
this.button70.Location = new System.Drawing.Point(371, 292);
|
||||||
|
this.button70.Name = "button70";
|
||||||
|
this.button70.Size = new System.Drawing.Size(97, 23);
|
||||||
|
this.button70.TabIndex = 18;
|
||||||
|
this.button70.Text = "ChangeAccount";
|
||||||
|
this.button70.UseVisualStyleBackColor = true;
|
||||||
|
this.button70.Click += new System.EventHandler(this.button70_Click);
|
||||||
|
//
|
||||||
|
// label33
|
||||||
|
//
|
||||||
|
this.label33.AutoSize = true;
|
||||||
|
this.label33.Location = new System.Drawing.Point(168, 269);
|
||||||
|
this.label33.Name = "label33";
|
||||||
|
this.label33.Size = new System.Drawing.Size(66, 13);
|
||||||
|
this.label33.TabIndex = 17;
|
||||||
|
this.label33.Text = "MT4 Server:";
|
||||||
|
//
|
||||||
|
// label32
|
||||||
|
//
|
||||||
|
this.label32.AutoSize = true;
|
||||||
|
this.label32.Location = new System.Drawing.Point(168, 241);
|
||||||
|
this.label32.Name = "label32";
|
||||||
|
this.label32.Size = new System.Drawing.Size(56, 13);
|
||||||
|
this.label32.TabIndex = 17;
|
||||||
|
this.label32.Text = "Password:";
|
||||||
|
//
|
||||||
|
// label31
|
||||||
|
//
|
||||||
|
this.label31.AutoSize = true;
|
||||||
|
this.label31.Location = new System.Drawing.Point(168, 214);
|
||||||
|
this.label31.Name = "label31";
|
||||||
|
this.label31.Size = new System.Drawing.Size(36, 13);
|
||||||
|
this.label31.TabIndex = 17;
|
||||||
|
this.label31.Text = "Login:";
|
||||||
|
//
|
||||||
|
// textBoxAccountHost
|
||||||
|
//
|
||||||
|
this.textBoxAccountHost.Location = new System.Drawing.Point(234, 266);
|
||||||
|
this.textBoxAccountHost.Name = "textBoxAccountHost";
|
||||||
|
this.textBoxAccountHost.Size = new System.Drawing.Size(238, 20);
|
||||||
|
this.textBoxAccountHost.TabIndex = 17;
|
||||||
|
//
|
||||||
|
// textBoxAccountPassword
|
||||||
|
//
|
||||||
|
this.textBoxAccountPassword.Location = new System.Drawing.Point(234, 238);
|
||||||
|
this.textBoxAccountPassword.Name = "textBoxAccountPassword";
|
||||||
|
this.textBoxAccountPassword.Size = new System.Drawing.Size(238, 20);
|
||||||
|
this.textBoxAccountPassword.TabIndex = 16;
|
||||||
|
//
|
||||||
|
// textBoxAccountLogin
|
||||||
|
//
|
||||||
|
this.textBoxAccountLogin.Location = new System.Drawing.Point(232, 212);
|
||||||
|
this.textBoxAccountLogin.Name = "textBoxAccountLogin";
|
||||||
|
this.textBoxAccountLogin.Size = new System.Drawing.Size(238, 20);
|
||||||
|
this.textBoxAccountLogin.TabIndex = 15;
|
||||||
|
//
|
||||||
// button67
|
// button67
|
||||||
//
|
//
|
||||||
this.button67.Location = new System.Drawing.Point(157, 33);
|
this.button67.Location = new System.Drawing.Point(157, 33);
|
||||||
@@ -1368,6 +1430,8 @@
|
|||||||
//
|
//
|
||||||
// tabPage4
|
// tabPage4
|
||||||
//
|
//
|
||||||
|
this.tabPage4.Controls.Add(this.comboBox12);
|
||||||
|
this.tabPage4.Controls.Add(this.button72);
|
||||||
this.tabPage4.Controls.Add(this.button36);
|
this.tabPage4.Controls.Add(this.button36);
|
||||||
this.tabPage4.Controls.Add(this.comboBox10);
|
this.tabPage4.Controls.Add(this.comboBox10);
|
||||||
this.tabPage4.Controls.Add(this.comboBox9);
|
this.tabPage4.Controls.Add(this.comboBox9);
|
||||||
@@ -1391,6 +1455,25 @@
|
|||||||
this.tabPage4.Text = "MarketInfo";
|
this.tabPage4.Text = "MarketInfo";
|
||||||
this.tabPage4.UseVisualStyleBackColor = true;
|
this.tabPage4.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
|
// comboBox12
|
||||||
|
//
|
||||||
|
this.comboBox12.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
|
this.comboBox12.FormattingEnabled = true;
|
||||||
|
this.comboBox12.Location = new System.Drawing.Point(13, 188);
|
||||||
|
this.comboBox12.Name = "comboBox12";
|
||||||
|
this.comboBox12.Size = new System.Drawing.Size(186, 21);
|
||||||
|
this.comboBox12.TabIndex = 38;
|
||||||
|
//
|
||||||
|
// button72
|
||||||
|
//
|
||||||
|
this.button72.Location = new System.Drawing.Point(208, 186);
|
||||||
|
this.button72.Name = "button72";
|
||||||
|
this.button72.Size = new System.Drawing.Size(111, 23);
|
||||||
|
this.button72.TabIndex = 37;
|
||||||
|
this.button72.Text = "TerminalInfoString";
|
||||||
|
this.button72.UseVisualStyleBackColor = true;
|
||||||
|
this.button72.Click += new System.EventHandler(this.button72_Click);
|
||||||
|
//
|
||||||
// button36
|
// button36
|
||||||
//
|
//
|
||||||
this.button36.Location = new System.Drawing.Point(208, 157);
|
this.button36.Location = new System.Drawing.Point(208, 157);
|
||||||
@@ -1785,6 +1868,7 @@
|
|||||||
//
|
//
|
||||||
// tabPage6
|
// tabPage6
|
||||||
//
|
//
|
||||||
|
this.tabPage6.Controls.Add(this.button73);
|
||||||
this.tabPage6.Controls.Add(this.textBoxPrint);
|
this.tabPage6.Controls.Add(this.textBoxPrint);
|
||||||
this.tabPage6.Controls.Add(this.button27);
|
this.tabPage6.Controls.Add(this.button27);
|
||||||
this.tabPage6.Controls.Add(this.button14);
|
this.tabPage6.Controls.Add(this.button14);
|
||||||
@@ -1799,14 +1883,14 @@
|
|||||||
//
|
//
|
||||||
// textBoxPrint
|
// textBoxPrint
|
||||||
//
|
//
|
||||||
this.textBoxPrint.Location = new System.Drawing.Point(13, 86);
|
this.textBoxPrint.Location = new System.Drawing.Point(13, 108);
|
||||||
this.textBoxPrint.Name = "textBoxPrint";
|
this.textBoxPrint.Name = "textBoxPrint";
|
||||||
this.textBoxPrint.Size = new System.Drawing.Size(386, 20);
|
this.textBoxPrint.Size = new System.Drawing.Size(386, 20);
|
||||||
this.textBoxPrint.TabIndex = 3;
|
this.textBoxPrint.TabIndex = 3;
|
||||||
//
|
//
|
||||||
// button27
|
// button27
|
||||||
//
|
//
|
||||||
this.button27.Location = new System.Drawing.Point(405, 84);
|
this.button27.Location = new System.Drawing.Point(405, 106);
|
||||||
this.button27.Name = "button27";
|
this.button27.Name = "button27";
|
||||||
this.button27.Size = new System.Drawing.Size(75, 23);
|
this.button27.Size = new System.Drawing.Size(75, 23);
|
||||||
this.button27.TabIndex = 2;
|
this.button27.TabIndex = 2;
|
||||||
@@ -1836,6 +1920,7 @@
|
|||||||
//
|
//
|
||||||
// tabPage7
|
// tabPage7
|
||||||
//
|
//
|
||||||
|
this.tabPage7.Controls.Add(this.button71);
|
||||||
this.tabPage7.Controls.Add(this.button23);
|
this.tabPage7.Controls.Add(this.button23);
|
||||||
this.tabPage7.Controls.Add(this.iCustomBtn);
|
this.tabPage7.Controls.Add(this.iCustomBtn);
|
||||||
this.tabPage7.Location = new System.Drawing.Point(4, 40);
|
this.tabPage7.Location = new System.Drawing.Point(4, 40);
|
||||||
@@ -1846,6 +1931,16 @@
|
|||||||
this.tabPage7.Text = "Technical Indicators";
|
this.tabPage7.Text = "Technical Indicators";
|
||||||
this.tabPage7.UseVisualStyleBackColor = true;
|
this.tabPage7.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
|
// button71
|
||||||
|
//
|
||||||
|
this.button71.Location = new System.Drawing.Point(6, 64);
|
||||||
|
this.button71.Name = "button71";
|
||||||
|
this.button71.Size = new System.Drawing.Size(107, 23);
|
||||||
|
this.button71.TabIndex = 17;
|
||||||
|
this.button71.Text = "iBarShift";
|
||||||
|
this.button71.UseVisualStyleBackColor = true;
|
||||||
|
this.button71.Click += new System.EventHandler(this.button71_Click);
|
||||||
|
//
|
||||||
// button23
|
// button23
|
||||||
//
|
//
|
||||||
this.button23.Location = new System.Drawing.Point(6, 35);
|
this.button23.Location = new System.Drawing.Point(6, 35);
|
||||||
@@ -2076,63 +2171,15 @@
|
|||||||
this.button69.UseVisualStyleBackColor = true;
|
this.button69.UseVisualStyleBackColor = true;
|
||||||
this.button69.Click += new System.EventHandler(this.button69_Click);
|
this.button69.Click += new System.EventHandler(this.button69_Click);
|
||||||
//
|
//
|
||||||
// textBoxAccountLogin
|
// button73
|
||||||
//
|
//
|
||||||
this.textBoxAccountLogin.Location = new System.Drawing.Point(232, 212);
|
this.button73.Location = new System.Drawing.Point(13, 74);
|
||||||
this.textBoxAccountLogin.Name = "textBoxAccountLogin";
|
this.button73.Name = "button73";
|
||||||
this.textBoxAccountLogin.Size = new System.Drawing.Size(238, 20);
|
this.button73.Size = new System.Drawing.Size(75, 23);
|
||||||
this.textBoxAccountLogin.TabIndex = 15;
|
this.button73.TabIndex = 4;
|
||||||
//
|
this.button73.Text = "TimeGMT";
|
||||||
// textBoxAccountPassword
|
this.button73.UseVisualStyleBackColor = true;
|
||||||
//
|
this.button73.Click += new System.EventHandler(this.button73_Click);
|
||||||
this.textBoxAccountPassword.Location = new System.Drawing.Point(234, 238);
|
|
||||||
this.textBoxAccountPassword.Name = "textBoxAccountPassword";
|
|
||||||
this.textBoxAccountPassword.Size = new System.Drawing.Size(238, 20);
|
|
||||||
this.textBoxAccountPassword.TabIndex = 16;
|
|
||||||
//
|
|
||||||
// label31
|
|
||||||
//
|
|
||||||
this.label31.AutoSize = true;
|
|
||||||
this.label31.Location = new System.Drawing.Point(168, 214);
|
|
||||||
this.label31.Name = "label31";
|
|
||||||
this.label31.Size = new System.Drawing.Size(36, 13);
|
|
||||||
this.label31.TabIndex = 17;
|
|
||||||
this.label31.Text = "Login:";
|
|
||||||
//
|
|
||||||
// label32
|
|
||||||
//
|
|
||||||
this.label32.AutoSize = true;
|
|
||||||
this.label32.Location = new System.Drawing.Point(168, 241);
|
|
||||||
this.label32.Name = "label32";
|
|
||||||
this.label32.Size = new System.Drawing.Size(56, 13);
|
|
||||||
this.label32.TabIndex = 17;
|
|
||||||
this.label32.Text = "Password:";
|
|
||||||
//
|
|
||||||
// textBoxAccountHost
|
|
||||||
//
|
|
||||||
this.textBoxAccountHost.Location = new System.Drawing.Point(234, 266);
|
|
||||||
this.textBoxAccountHost.Name = "textBoxAccountHost";
|
|
||||||
this.textBoxAccountHost.Size = new System.Drawing.Size(238, 20);
|
|
||||||
this.textBoxAccountHost.TabIndex = 17;
|
|
||||||
//
|
|
||||||
// label33
|
|
||||||
//
|
|
||||||
this.label33.AutoSize = true;
|
|
||||||
this.label33.Location = new System.Drawing.Point(168, 269);
|
|
||||||
this.label33.Name = "label33";
|
|
||||||
this.label33.Size = new System.Drawing.Size(66, 13);
|
|
||||||
this.label33.TabIndex = 17;
|
|
||||||
this.label33.Text = "MT4 Server:";
|
|
||||||
//
|
|
||||||
// button70
|
|
||||||
//
|
|
||||||
this.button70.Location = new System.Drawing.Point(371, 292);
|
|
||||||
this.button70.Name = "button70";
|
|
||||||
this.button70.Size = new System.Drawing.Size(97, 23);
|
|
||||||
this.button70.TabIndex = 18;
|
|
||||||
this.button70.Text = "ChangeAccount";
|
|
||||||
this.button70.UseVisualStyleBackColor = true;
|
|
||||||
this.button70.Click += new System.EventHandler(this.button70_Click);
|
|
||||||
//
|
//
|
||||||
// Form1
|
// Form1
|
||||||
//
|
//
|
||||||
@@ -2366,6 +2413,10 @@
|
|||||||
private System.Windows.Forms.TextBox textBoxAccountPassword;
|
private System.Windows.Forms.TextBox textBoxAccountPassword;
|
||||||
private System.Windows.Forms.TextBox textBoxAccountLogin;
|
private System.Windows.Forms.TextBox textBoxAccountLogin;
|
||||||
private System.Windows.Forms.Button button70;
|
private System.Windows.Forms.Button button70;
|
||||||
|
private System.Windows.Forms.Button button71;
|
||||||
|
private System.Windows.Forms.ComboBox comboBox12;
|
||||||
|
private System.Windows.Forms.Button button72;
|
||||||
|
private System.Windows.Forms.Button button73;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ namespace TestApiClientUI
|
|||||||
comboBox9.DataSource = Enum.GetNames(typeof(EnumTerminalInfoInteger));
|
comboBox9.DataSource = Enum.GetNames(typeof(EnumTerminalInfoInteger));
|
||||||
comboBox10.DataSource = Enum.GetNames(typeof(EnumTerminalInfoDouble));
|
comboBox10.DataSource = Enum.GetNames(typeof(EnumTerminalInfoDouble));
|
||||||
comboBox11.DataSource = Enum.GetNames(typeof(EnumObject));
|
comboBox11.DataSource = Enum.GetNames(typeof(EnumObject));
|
||||||
|
comboBox12.DataSource = Enum.GetNames(typeof(ENUM_TERMINAL_INFO_STRING));
|
||||||
comboBoxAccountInfoCmd.DataSource = Enum.GetNames(typeof(TradeOperation));
|
comboBoxAccountInfoCmd.DataSource = Enum.GetNames(typeof(TradeOperation));
|
||||||
|
|
||||||
_apiClient.QuoteUpdated += apiClient_QuoteUpdated;
|
_apiClient.QuoteUpdated += apiClient_QuoteUpdated;
|
||||||
@@ -42,6 +43,7 @@ namespace TestApiClientUI
|
|||||||
_apiClient.QuoteRemoved += apiClient_QuoteRemoved;
|
_apiClient.QuoteRemoved += apiClient_QuoteRemoved;
|
||||||
_apiClient.ConnectionStateChanged += apiClient_ConnectionStateChanged;
|
_apiClient.ConnectionStateChanged += apiClient_ConnectionStateChanged;
|
||||||
_apiClient.OnLastTimeBar += _apiClient_OnLastTimeBar;
|
_apiClient.OnLastTimeBar += _apiClient_OnLastTimeBar;
|
||||||
|
_apiClient.OnChartEvent += _apiClient_OnChartEvent;
|
||||||
|
|
||||||
InitOrderCommandsGroup();
|
InitOrderCommandsGroup();
|
||||||
|
|
||||||
@@ -134,7 +136,15 @@ namespace TestApiClientUI
|
|||||||
private void _apiClient_OnLastTimeBar(object sender, TimeBarArgs e)
|
private void _apiClient_OnLastTimeBar(object sender, TimeBarArgs e)
|
||||||
{
|
{
|
||||||
var msg =
|
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);
|
Console.WriteLine(msg);
|
||||||
PrintLog(msg);
|
PrintLog(msg);
|
||||||
}
|
}
|
||||||
@@ -606,18 +616,28 @@ namespace TestApiClientUI
|
|||||||
listBoxProceHistory.DataSource = items;
|
listBoxProceHistory.DataSource = items;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TimeCurrent
|
||||||
private void button13_Click(object sender, EventArgs e)
|
private void button13_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
var retVal = _apiClient.TimeCurrent();
|
var retVal = _apiClient.TimeCurrent();
|
||||||
PrintLog($"TimeCurrent result: {retVal}");
|
PrintLog($"TimeCurrent result: {retVal}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TimeLocal
|
||||||
private void button14_Click(object sender, EventArgs e)
|
private void button14_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
var retVal = _apiClient.TimeLocal();
|
var retVal = _apiClient.TimeLocal();
|
||||||
PrintLog($"TimeLocal result: {retVal}");
|
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)
|
private void buttonRefreshRates_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
var retVal = _apiClient.RefreshRates();
|
var retVal = _apiClient.RefreshRates();
|
||||||
@@ -1120,6 +1140,16 @@ namespace TestApiClientUI
|
|||||||
PrintLog($"TerminalInfoDouble: result = {result}");
|
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)
|
private void checkBox2_CheckedChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
var checkbox = sender as CheckBox;
|
var checkbox = sender as CheckBox;
|
||||||
@@ -1453,5 +1483,21 @@ namespace TestApiClientUI
|
|||||||
var result = await Execute(() => _apiClient.ChangeAccount(login, password, host));
|
var result = await Execute(() => _apiClient.ChangeAccount(login, password, host));
|
||||||
PrintLog($"ChangeAccount result: {result}");
|
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}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
+5759
-1433
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -257,7 +257,7 @@ public:
|
|||||||
{
|
{
|
||||||
return (string)_long;
|
return (string)_long;
|
||||||
} else {
|
} else {
|
||||||
return (string)_dbl;
|
return (_dbl!=0) ? (string)_dbl : "0";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user