private static bool ProcessRequest(FxcmBroker fxcm, O2GRequest request) { var responseListener = new ResponseListener(fxcm.Session); fxcm.Session.subscribeResponse(responseListener); try { responseListener.SetRequestID(request.RequestID); fxcm.Session.sendRequest(request); if (responseListener.WaitEvents()) { if (!string.IsNullOrEmpty(responseListener.Error)) { Log.Error($"Unable to process request - {responseListener.Error}"); return(false); } return(true); } else { Log.Error($"Unable to process request"); return(false); } } finally { fxcm.Session.unsubscribeResponse(responseListener); } }
public RunStrategyLiveViewModel() { DependencyContainer.ComposeParts(this); RunLiveCommand = new DelegateCommand(o => RunLive()); _fxcm = (FxcmBroker)_brokersService.Brokers.First(x => x.Name == "FXCM"); _strategiesDirectory = _dataDirectoryService.MainDirectoryWithApplicationName; _logDirectory = DataDirectoryService.GetMainDirectoryWithApplicationName("FXCMTradeLog"); _brokersService.LoadBrokerAccounts(_tradeDetailsAutoCalculatorService, _logDirectory); _brokerAccount = _brokersService.AccountsLookup[_fxcm]; }
public static bool ChangeStop(this FxcmBroker fxcm, string stopOrderId, double rateStop) { if (fxcm.Status != ConnectStatus.Connected) { Log.Error("FXCM not connected"); return(false); } O2GRequestFactory requestFactory = fxcm.Session.getRequestFactory(); if (requestFactory == null) { throw new Exception("Cannot create request factory"); } var account = GetAccount(fxcm.Session); O2GValueMap valuemap = requestFactory.createValueMap(); valuemap.setString(O2GRequestParamsEnum.Command, Constants.Commands.EditOrder); valuemap.setString(O2GRequestParamsEnum.OrderType, Constants.Orders.Stop); valuemap.setString(O2GRequestParamsEnum.AccountID, account.AccountID); valuemap.setString(O2GRequestParamsEnum.OrderID, stopOrderId); valuemap.setDouble(O2GRequestParamsEnum.Rate, rateStop); var request = requestFactory.createOrderRequest(valuemap); if (request == null) { Log.Error($"Unable to process request - {requestFactory.getLastError()}"); return(false); } var ret = ProcessRequest(fxcm, request); return(ret); }
public static bool CreateMarketOrder(this FxcmBroker fxcm, string instrument, int lotsAmount, TradeDirection direction, out string orderId, double?rateStop = null, double?rateLimit = null) { orderId = string.Empty; if (fxcm.Status != ConnectStatus.Connected) { Log.Error("FXCM not connected"); return(false); } O2GOfferRow offer = GetOffer(fxcm.Session, instrument); if (offer == null) { throw new Exception(string.Format("The instrument '{0}' is not valid", instrument)); } O2GRequest request = null; O2GRequestFactory requestFactory = fxcm.Session.getRequestFactory(); if (requestFactory == null) { throw new Exception("Cannot create request factory"); } var account = GetAccount(fxcm.Session); O2GValueMap valuemap = requestFactory.createValueMap(); valuemap.setString(O2GRequestParamsEnum.Command, Constants.Commands.CreateOrder); valuemap.setString(O2GRequestParamsEnum.OrderType, Constants.Orders.TrueMarketOpen); valuemap.setString(O2GRequestParamsEnum.AccountID, account.AccountID); valuemap.setString(O2GRequestParamsEnum.OfferID, offer.OfferID); valuemap.setString(O2GRequestParamsEnum.BuySell, direction == TradeDirection.Long ? "B" : "S"); if (rateStop != null) { valuemap.setDouble(O2GRequestParamsEnum.RateStop, rateStop.Value); } if (rateLimit != null) { valuemap.setDouble(O2GRequestParamsEnum.RateLimit, rateLimit.Value); } // Get account var loginRules = fxcm.Session.getLoginRules(); var tradingSettingsProvider = loginRules.getTradingSettingsProvider(); int iBaseUnitSize = tradingSettingsProvider.getBaseUnitSize(instrument, account); int iAmount = iBaseUnitSize * lotsAmount; valuemap.setInt(O2GRequestParamsEnum.Amount, iAmount); valuemap.setString(O2GRequestParamsEnum.CustomID, "TrueMarketOrder"); request = requestFactory.createOrderRequest(valuemap); if (request == null) { Log.Error($"Unable to process request - {requestFactory.getLastError()}"); return(false); } var ret = ProcessOrderRequest(fxcm, request, out orderId); return(ret); }
public static bool CreateOrder(this FxcmBroker fxcm, string market, double rate, double?rateStop, double?rateLimit, DateTime?expiryDateUtc, decimal amount, TradeDirection direction, out string orderId) { var requestFactory = fxcm.Session.getRequestFactory(); orderId = string.Empty; // Get price var offer = GetOffer(fxcm.Session, market); if (offer == null) { Log.Error($"Unable to get offer price - {requestFactory.getLastError()}"); return(false); } // Get account var account = GetAccount(fxcm.Session); var loginRules = fxcm.Session.getLoginRules(); var tradingSettingsProvider = loginRules.getTradingSettingsProvider(); var iCondDistEntryLimit = tradingSettingsProvider.getCondDistEntryLimit(market); var iCondDistEntryStop = tradingSettingsProvider.getCondDistEntryStop(market); // Get order type var buySell = direction == TradeDirection.Long ? "B" : "S"; var sOrderType = GetEntryOrderType(offer.Bid, offer.Ask, rate, buySell, offer.PointSize, iCondDistEntryLimit, iCondDistEntryStop); var valuemap = requestFactory.createValueMap(); valuemap.setString(O2GRequestParamsEnum.Command, Constants.Commands.CreateOrder); valuemap.setString(O2GRequestParamsEnum.OrderType, sOrderType); valuemap.setString(O2GRequestParamsEnum.AccountID, account.AccountID); valuemap.setString(O2GRequestParamsEnum.OfferID, offer.OfferID); valuemap.setString(O2GRequestParamsEnum.BuySell, buySell); valuemap.setInt(O2GRequestParamsEnum.Amount, (int)amount); valuemap.setDouble(O2GRequestParamsEnum.Rate, rate); valuemap.setString(O2GRequestParamsEnum.CustomID, "EntryOrder"); if (rateStop != null) { valuemap.setDouble(O2GRequestParamsEnum.RateStop, rateStop.Value); } if (rateLimit != null) { valuemap.setDouble(O2GRequestParamsEnum.RateLimit, rateLimit.Value); } // Set expiry if (expiryDateUtc != null) { var expiryStr = expiryDateUtc.Value.ToString("yyyyMMdd-HH:mm:ss"); valuemap.setString(O2GRequestParamsEnum.TimeInForce, Constants.TIF.GTD); valuemap.setString(O2GRequestParamsEnum.ExpireDateTime, expiryStr); // UTCTimestamp format: "yyyyMMdd-HH:mm:ss.SSS" (milliseconds are optional) } // Create order var request = requestFactory.createOrderRequest(valuemap); if (request == null) { Log.Error($"Unable to create FXCM order - {requestFactory.getLastError()}"); return(false); } var ret = ProcessOrderRequest(fxcm, request, out orderId); return(ret); }
private static bool ProcessOrderRequest(FxcmBroker fxcm, O2GRequest request, out string orderId) { var ret = string.Empty; var waitOrder = new ManualResetEvent(false); var responseListener = new ResponseListener( fxcm.Session, data => { O2GResponseReaderFactory factory = fxcm.Session.getResponseReaderFactory(); if (factory != null) { O2GTablesUpdatesReader reader = factory.createTablesUpdatesReader(data); for (int ii = 0; ii < reader.Count; ii++) { if (reader.getUpdateTable(ii) == O2GTableType.Orders) { O2GOrderRow orderRow = reader.getOrderRow(ii); if (reader.getUpdateType(ii) == O2GTableUpdateType.Insert) { ret = orderRow.OrderID; waitOrder.Set(); break; } } } } }); fxcm.Session.subscribeResponse(responseListener); try { responseListener.SetRequestID(request.RequestID); fxcm.Session.sendRequest(request); if (responseListener.WaitEvents()) { if (!string.IsNullOrEmpty(responseListener.Error)) { Log.Error($"Unable to process request - {responseListener.Error}"); orderId = ret; return(false); } // Get order ID waitOrder.WaitOne(); orderId = ret; return(true); } else { Log.Error($"Unable to process request"); orderId = ret; return(false); } } finally { fxcm.Session.unsubscribeResponse(responseListener); } }