using System; namespace MTApiService { public class MtExpert { public delegate void MtQuoteHandler(MtExpert expert, MtQuote quote); #region Properties private MtQuote _quote; public MtQuote Quote { get { lock (_locker) { return _quote; } } set { lock(_locker) { _quote = value; } FireOnQuoteChanged(value); } } public int Handle { get; private set; } private bool _isEnable = true; public bool IsEnable { get { lock (_locker) { return _isEnable; } } private set { lock (_locker) { _isEnable = value; } } } public ICommandManager CommandManager { private get { lock (_locker) { return _commandManager; } } set { lock (_locker) { _commandManager = value; } } } #endregion #region Public Methods public MtExpert(int handle, MtQuote quote, IMetaTraderHandler mtHandler) { Quote = quote; Handle = handle; _mtHadler = mtHandler; } public void Deinit() { IsEnable = false; FireOnDeinited(); } public void SendResponse(MtResponse response) { _commandTask.SetResult(response); _commandTask = null; FireOnCommandExecuted(); } public int GetCommandType() { var commandManager = CommandManager; if (commandManager != null) { _commandTask = commandManager.DequeueCommandTask(); } return _commandTask != null && _commandTask.Command != null ? _commandTask.Command.CommandType : 0; } public object GetCommandParameter(int index) { if (_commandTask != null) { var command = _commandTask.Command; if (command != null && command.Parameters != null && index >= 0 && index < command.Parameters.Count) { return command.Parameters[index]; } } return null; } #endregion #region IMtCommandExecutor public void NotifyCommandReady() { SendTickToMetaTrader(); } #endregion #region Private Methods private void SendTickToMetaTrader() { if (_mtHadler != null) { _mtHadler.SendTickToMetaTrader(Handle); } } private void FireOnQuoteChanged(MtQuote quote) { var handler = QuoteChanged; if (handler != null) { handler(this, quote); } } private void FireOnDeinited() { var handler = Deinited; if (handler != null) { handler(this, EventArgs.Empty); } } private void FireOnCommandExecuted() { var handler = CommandExecuted; if (handler != null) { handler(this, EventArgs.Empty); } } #endregion #region Events public event EventHandler Deinited; public event MtQuoteHandler QuoteChanged; public event EventHandler CommandExecuted; #endregion #region Private Fields private readonly IMetaTraderHandler _mtHadler; private MtCommandTask _commandTask; private ICommandManager _commandManager; private readonly object _locker = new object(); #endregion } }