public void Stop() { //--- if manager interface was created if (m_manager != null) { //--- unsubscribe from notifications m_manager.Unsubscribe(this); //--- unsubscribe from requests m_manager.DealUnsubscribe(_dealSink); } //--- wait for dealing thread exit if (m_thread_dealer != null) { //--- set thread stop flag Interlocked.Exchange(ref m_stop_flag, 1); //--- set answer event m_event_answer.Set(); //--- release dealer thread from waiting state if (!m_event_request.WaitOne(0)) { m_event_request.Set(); } //--- wait for thread exit m_thread_dealer.Join(Timeout.Infinite); m_thread_dealer = null; } m_manager.Disconnect(); }
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ public void Logout() { //--- disconnect manager if (m_manager != null) { m_manager.Disconnect(); } }
//+------------------------------------------------------------------+ //| Dealing thread function | //+------------------------------------------------------------------+ void DealerFunc() { //--- deal while (Interlocked.Add(ref m_stop_flag, 0) == 0) { //--- connect to the server if (Interlocked.Add(ref m_connected, 0) == 0) { //--- connect manager to the server MTRetCode res = m_manager.Connect(m_server, m_login, m_password, null, CIMTManagerAPI.EnPumpModes.PUMP_MODE_SYMBOLS | CIMTManagerAPI.EnPumpModes.PUMP_MODE_GROUPS | CIMTManagerAPI.EnPumpModes.PUMP_MODE_USERS | CIMTManagerAPI.EnPumpModes.PUMP_MODE_ORDERS, MT5_CONNECT_TIMEOUT); if (res != MTRetCode.MT_RET_OK) { Thread.Sleep(100); continue; } //--- start dealer if (m_manager.DealerStart() != MTRetCode.MT_RET_OK) { Thread.Sleep(100); continue; } Interlocked.Exchange(ref m_connected, 1); //--- reset answer event m_event_answer.Reset(); } //--- wait for request m_event_request.WaitOne(Timeout.Infinite); //--- check stop flag if (Interlocked.Add(ref m_stop_flag, 0) != 0) { break; } //--- get next request if (m_manager.DealerGet(m_request) == MTRetCode.MT_RET_OK) { MTTickShort tick; string str = ""; //--- clear confirmation m_confirm.Clear(); //--- print request str = m_request.Print(); //--- get last tick for request symbol if (m_manager.TickLast(m_request.Symbol(), m_request.Group(), out tick) != MTRetCode.MT_RET_OK) { //--- ticks not found //--- select symbol m_manager.SelectedAdd(m_request.Symbol()); //--- request id m_confirm.ID(m_request.ID()); //--- return request m_confirm.Retcode(MTRetCode.MT_RET_REQUEST_RETURN); if (m_manager.DealerAnswer(m_confirm) == MTRetCode.MT_RET_OK) { m_manager.LoggerOut(EnMTLogCode.MTLogOK, "'{0}': return {1} for '{2}'", m_login, str, m_request.Login()); } continue; } //--- set order price if (m_request.PriceOrder() == 0) { switch (m_request.Type()) { case CIMTOrder.EnOrderType.OP_BUY: m_request.PriceOrder(tick.ask); break; case CIMTOrder.EnOrderType.OP_SELL: m_request.PriceOrder(tick.bid); break; } } //--- request ready m_parent.FireAPIRequest(); //--- wait for answer m_event_answer.WaitOne(Timeout.Infinite); //--- check stop flag if (Interlocked.Add(ref m_stop_flag, 0) != 0) { break; } //--- send confirm if (m_manager.DealerAnswer(m_confirm) == MTRetCode.MT_RET_OK) { m_manager.LoggerOut(EnMTLogCode.MTLogOK, "'{0}': confirm {1} for '{2}'", m_login, str, m_request.Login()); } } else { Thread.Sleep(100); } } //--- stop dealer m_manager.DealerStop(); //--- disconnect manager m_manager.Disconnect(); }