Вот упрощенная версия моей реализации:
CManager.cs:
Код: Выделить всё
using MetaQuotes.MT5CommonAPI;
using MetaQuotes.MT5ManagerAPI;
using System;
namespace SimpleLoginApp
{
public class CManager : IDisposable
{
uint MT5_CONNECT_TIMEOUT = 30000;
CIMTManagerAPI m_manager = null;
UserSink m_userSink = null;
public CManager()
{
m_userSink = new UserSink();
}
public void Dispose()
{
Shutdown();
}
public bool Initialize()
{
string message = string.Empty;
MTRetCode res = MTRetCode.MT_RET_OK_NONE;
if ((res = SMTManagerAPIFactory.Initialize(null)) != MTRetCode.MT_RET_OK)
{
message = string.Format("Loading manager API failed ({0})", res);
Console.WriteLine(message);
return false;
}
m_manager = SMTManagerAPIFactory.CreateManager(SMTManagerAPIFactory.ManagerAPIVersion, out res);
if ((res != MTRetCode.MT_RET_OK) || (m_manager == null))
{
SMTManagerAPIFactory.Shutdown();
message = string.Format("Creating manager interface failed ({0})", (res == MTRetCode.MT_RET_OK ? "Managed API is null" : res.ToString()));
Console.WriteLine(message);
return false;
}
return true;
}
public bool Login(string server, UInt64 login, string password)
{
MTRetCode res = m_manager.Connect(server, login, password, null, CIMTManagerAPI.EnPumpModes.PUMP_MODE_USERS, MT5_CONNECT_TIMEOUT);
if (res != MTRetCode.MT_RET_OK)
{
m_manager.LoggerOut(EnMTLogCode.MTLogErr, "Connection failed ({0})", res);
Console.WriteLine($"Connection failed ({res})");
return false;
}
return true;
}
public void Logout()
{
if (m_manager != null)
m_manager.Disconnect();
}
public void Shutdown()
{
if (m_manager != null)
{
m_manager.Dispose();
m_manager = null;
}
SMTManagerAPIFactory.Shutdown();
}
public bool SubscribeToUserEvents()
{
Console.WriteLine("subscribing");
Console.WriteLine("m_manager: " + m_manager);
Console.WriteLine("m_userSink: " + m_userSink);
if (m_manager != null && m_userSink != null)
{
MTRetCode res = m_manager.UserSubscribe(m_userSink);
if (res != MTRetCode.MT_RET_OK)
{
Console.WriteLine($"Failed to subscribe to user events: {res}");
}
return res == MTRetCode.MT_RET_OK;
}
return false;
}
}
public class UserSink : CIMTUserSink
{
public UserSink()
{
RegisterSink();
}
public override void OnUserLogin(string ip, CIMTUser user, CIMTUser.EnUsersConnectionTypes type)
{
Console.WriteLine("OnUserLogin event triggered.");
if (user != null)
{
Console.WriteLine($"User Login - IP: {ip}, User: {user.Name()}, Login: {user.Login()}, Type: {type}");
}
else
{
Console.WriteLine("OnUserLogin event triggered, but user is null.");
}
}
}
}
Код: Выделить всё
using MetaQuotes.MT5CommonAPI;
using MetaQuotes.MT5ManagerAPI;
using System;
using System.IO;
using System.Threading.Tasks;
namespace SimpleLoginApp
{
class Program
{
public static CManager manager = new CManager();
static async Task Main(string[] args)
{
var server = server_;
var login = login_;
var password = pass_;
try
{
using (manager)
{
if (!manager.Initialize())
{
Console.WriteLine("Initialization failed.");
return;
}
if (!manager.Login(server, login, password))
{
Console.WriteLine("Login failed.");
return;
}
Console.WriteLine("Successfully logged in to the manager API.");
if (manager.SubscribeToUserEvents())
{
Console.WriteLine("Successfully subscribed to user events.");
}
else
{
Console.WriteLine("Failed to subscribe to user events.");
}
// Keep the application running to receive events
Console.WriteLine("Waiting for user login events...");
await Task.Delay(-1);
}
}
catch (Exception ex)
{
using (StreamWriter writer = new StreamWriter("log.txt", true))
{
writer.WriteLine($"Exception: {ex.ToString()}");
writer.WriteLine("-----------");
}
}
}
}
}
Приложение печатает сообщение «Успешно подписано на пользовательские события», что указывает на то, что подписка прошла успешно.
Однако событие OnUserLogin обработчик никогда не срабатывает при входе пользователя в систему.
Это распечатка приложения:
Код: Выделить всё
Successfully logged in to the manager API.
subscribing
m_manager: MetaQuotes.MT5ManagerAPI.CIMTManagerAPI
m_userSink: SimpleLoginApp.UserSink
Successfully subscribed to user events.
Проверил, что метод SubscribeToUserEvents возвращает MT_RET_OK.
Убедился, что приложение работает непрерывно, чтобы перехватывать события входа в систему.
Добавлены операторы отладки для подтверждения настройки подписки и обработки событий.
Вопросы:
Необходимы ли какие-либо дополнительные настройки или действия для обеспечения срабатывает событие OnUserLogin?
Есть ли способ вручную протестировать или вызвать события входа пользователя в целях отладки?
Может ли возникнуть проблема с конфигурацией сервера MetaTrader или способом обработки событий?
Будем очень признательны за любые идеи и предложения! Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/786 ... ogin-event
Мобильная версия