API MT5 Manager: UserSubscribe не вызывает событие OnUserLoginC#

Место общения программистов C#
Ответить
Anonymous
 API MT5 Manager: UserSubscribe не вызывает событие OnUserLogin

Сообщение Anonymous »

Я работаю с API менеджера MetaTrader 5 (MT5) для мониторинга событий входа пользователя в систему. Я успешно подписываюсь на пользовательские события, но обработчик событий OnUserLogin не запускается при входе пользователей в систему.
Вот упрощенная версия моей реализации:
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.");
}
}

}
}
Program.cs:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»