/// <summary> /// Demonstration of new order opening process using regular and pumping connection simultaneously /// </summary> /// <returns></returns> public static ResultCode OpenTrade() { ResultCode result; var prices = new Dictionary <string, SymbolInfo>(); var mgr = new Manager(Constants.Server, Constants.Login, Constants.Password, (ctx, type, message, exception) => { if (exception != null) { Log.Error(exception); } else { Log.Info($"[{type}] {message}"); } }); Log.Trace("Connect..."); result = mgr.Connect(); Log.Trace($"Connect result: {result}"); if (result != ResultCode.Ok) { return(result); } // create instance var pump = new ManagerPumpEx(Constants.Server, Constants.Login, Constants.Password, (ctx, type, message, exception) => { if (exception != null) { Log.Error(exception); } else { Log.Info($"[{type}] {message}"); } }) { }; pump.Start += sender => { Log.Info("Pumping started"); }; pump.Stop += sender => { Log.Info("Pumping stopped"); }; pump.BidAsk += sender => { lock (prices) { // get last received quotes foreach (var pi in sender.SymbolInfoUpdated()) { // Debug.Print($"{DateTime.Now} - {pi.Key}, {pi.Value.Bid}"); prices[pi.Key] = pi.Value; } } }; Log.Trace("Connect..."); result = pump.Connect(); Log.Trace($"Connect result: {result}"); if (result != ResultCode.Ok) { return(result); } try { // await for prices do { Thread.Sleep(100); lock (prices) { SymbolInfo si; if (!prices.TryGetValue("EURUSD", out si)) { continue; } break; } } while (true); var tti = new TradeTransInfo() { Price = prices["EURUSD"].Ask, Comment = "opened by demo app", OrderBy = 1000, // put there client account number Symbol = "EURUSD", Volume = 10, // 0.1 lots TradeCommand = TradeCommand.Buy, TradeTransactionType = TradeTransactionType.BrOpen }; Log.Trace("TradeTransaction..."); result = mgr.TradeTransaction(ref tti); Log.Trace($"TradeTransaction result: {result}"); if (result != ResultCode.Ok) { return(result); } } finally { Log.Trace("Disconnect..."); result = pump.Disconnect(); Log.Trace($"Disconnect result: {result}"); Log.Trace("Disconnect..."); result = mgr.Disconnect(); Log.Trace($"Disconnect result: {result}"); } return(result); }
/// <summary> /// Simple demonstration of connection process /// </summary> /// <returns></returns> public static ResultCode Connect() { ResultCode result; // create instance var mgr = new ManagerPumpEx(Constants.Server, Constants.Login, Constants.Password, (ctx, type, message, exception) => { if (exception != null) { Log.Error(exception); } else { Log.Info($"[{type}] {message}"); } }) { PumpingFlags = PumpingFlags.HideNews | PumpingFlags.HideMail, }; mgr.Start += sender => { Log.Info("Pumping started"); }; mgr.Stop += sender => { Log.Info("Pumping stopped"); }; Log.Trace("Connect..."); result = mgr.Connect(); Log.Trace($"Connect result: {result}"); if (result != ResultCode.Ok) { return(result); } // (optional) wait until pumping connection is up to step forward with 'Get*' functions if (mgr.Await(PumpingCode.StartPumping, TimeSpan.FromSeconds(5)) == null) { Log.Error($"There is not connection to MT4"); return(ResultCode.NoConnect); } // be sure pumping mode activated and all data get synchronized ebfore call any functions if ((result = mgr.SymbolGet("EURUSD", out var cs)) != ResultCode.Ok) { Log.Error($"Error gettings symnbol info: {result}"); } // simulate long running Thread.Sleep(5000); Log.Trace("Disconnect..."); result = mgr.Disconnect(); Log.Trace($"Disconnect result: {result}"); return(result); }