Пример #1
0
 /// <summary>
 /// Create entry order with attached stop and limit orders request
 /// </summary>
 private static O2GRequest CreateELSRequest(O2GSession session, string sOfferID, string sAccountID, int iAmount, double dRate, double dRateLimit, double dRateStop, string sBuySell, string sOrderType)
 {
     O2GRequest request = null;
     O2GRequestFactory requestFactory = session.getRequestFactory();
     if (requestFactory == null)
     {
         throw new Exception("Cannot create request factory");
     }
     O2GValueMap valuemap = requestFactory.createValueMap();
     valuemap.setString(O2GRequestParamsEnum.Command, Constants.Commands.CreateOrder);
     valuemap.setString(O2GRequestParamsEnum.OrderType, sOrderType);
     valuemap.setString(O2GRequestParamsEnum.AccountID, sAccountID);
     valuemap.setString(O2GRequestParamsEnum.OfferID, sOfferID);
     valuemap.setString(O2GRequestParamsEnum.BuySell, sBuySell);
     valuemap.setInt(O2GRequestParamsEnum.Amount, iAmount);
     valuemap.setDouble(O2GRequestParamsEnum.Rate, dRate);
     valuemap.setDouble(O2GRequestParamsEnum.RateLimit, dRateLimit);
     valuemap.setDouble(O2GRequestParamsEnum.RateStop, dRateStop);
     valuemap.setString(O2GRequestParamsEnum.CustomID, "EntryOrderWithStopLimit");
     request = requestFactory.createOrderRequest(valuemap);
     if (request == null)
     {
         Console.WriteLine(requestFactory.getLastError());
     }
     return request;
 }
Пример #2
0
        public void CreateRangeCloseOrder(string sOfferID, string sAccountID, string sTradeID, int iAmount, double dRateMin, double dRateMax, string sBuySell)
        {
            O2GRequestFactory factory = m_o2gsession.getRequestFactory();

            if (factory == null)
            {
                return;
            }
            O2GValueMap valuemap = factory.createValueMap();

            valuemap.setString(O2GRequestParamsEnum.Command, Constants.Commands.CreateOrder);
            valuemap.setString(O2GRequestParamsEnum.OrderType, Constants.Orders.MarketCloseRange);
            valuemap.setString(O2GRequestParamsEnum.AccountID, sAccountID);
            valuemap.setString(O2GRequestParamsEnum.OfferID, sOfferID);              // The identifier of the instrument the order should be placed for.
            valuemap.setString(O2GRequestParamsEnum.TradeID, sTradeID);              // The identifier of the trade to be closed.
            valuemap.setString(O2GRequestParamsEnum.BuySell, sBuySell);              // The order direction (Constants.Buy for Buy, Constants.Sell for Sell). Must be opposite to the direction of the trade.
            valuemap.setInt(O2GRequestParamsEnum.Amount, iAmount);                   // The quantity of the instrument to be bought or sold. Must be <= size of the position (Lot of the trade). Must be divisible by baseUnitSize.
            valuemap.setDouble(O2GRequestParamsEnum.RateMin, dRateMin);              // The minimum dRate at which the order can be filled.
            valuemap.setDouble(O2GRequestParamsEnum.RateMax, dRateMax);              // The maximum dRate at which the order can be filled.
            valuemap.setString(O2GRequestParamsEnum.CustomID, "CloseRangeOrder");    // The custom identifier of the order.
            O2GRequest request = factory.createOrderRequest(valuemap);

            m_o2gsession.sendRequest(request);

            SaveOrders(sOfferID, sAccountID, sTradeID, iAmount, sBuySell);
        }
Пример #3
0
        /// <summary>
        /// Create OTO request
        /// </summary>
        private static O2GRequest CreateOTO_ELSRequest(O2GSession session, string sOfferID, string sAccountID, int iAmount, double dRateOTO, double dRateELS, double dRateELS_stop, double dRateELS_limit)
        {
            O2GRequest        request        = null;
            O2GRequestFactory requestFactory = session.getRequestFactory();

            if (requestFactory == null)
            {
                throw new Exception("Cannot create request factory");
            }

            // Create OTO command
            O2GValueMap valuemapMain = requestFactory.createValueMap();

            valuemapMain.setString(O2GRequestParamsEnum.Command, Constants.Commands.CreateOTO);

            // ValueMap for if-then
            O2GValueMap valuemapIf = requestFactory.createValueMap();

            valuemapIf.setString(O2GRequestParamsEnum.Command, Constants.Commands.CreateOrder);
            valuemapIf.setString(O2GRequestParamsEnum.OrderType, Constants.Orders.LimitEntry);
            valuemapIf.setString(O2GRequestParamsEnum.AccountID, sAccountID);
            valuemapIf.setString(O2GRequestParamsEnum.OfferID, sOfferID);
            valuemapIf.setString(O2GRequestParamsEnum.BuySell, Constants.Sell);
            valuemapIf.setInt(O2GRequestParamsEnum.Amount, 0);
            valuemapIf.setDouble(O2GRequestParamsEnum.Rate, dRateOTO);
            valuemapIf.setString(O2GRequestParamsEnum.CustomID, "if-then-order");
            valuemapMain.appendChild(valuemapIf);

            //valuemapELS for ELS order
            O2GValueMap valuemapELS = requestFactory.createValueMap();

            valuemapELS.setString(O2GRequestParamsEnum.Command, Constants.Commands.CreateOrder);
            valuemapELS.setString(O2GRequestParamsEnum.OrderType, "LE");
            valuemapELS.setString(O2GRequestParamsEnum.AccountID, sAccountID);
            valuemapELS.setString(O2GRequestParamsEnum.OfferID, sOfferID);
            valuemapELS.setString(O2GRequestParamsEnum.BuySell, "B");
            valuemapELS.setInt(O2GRequestParamsEnum.Amount, iAmount);
            valuemapELS.setDouble(O2GRequestParamsEnum.Rate, dRateELS);
            valuemapELS.setDouble(O2GRequestParamsEnum.RateLimit, dRateELS_limit);
            valuemapELS.setDouble(O2GRequestParamsEnum.RateStop, dRateELS_stop);
            valuemapELS.setString(O2GRequestParamsEnum.CustomID, "ELS-order");
            valuemapMain.appendChild(valuemapELS);


            request = requestFactory.createOrderRequest(valuemapMain);
            if (request == null)
            {
                Console.WriteLine(requestFactory.getLastError());
            }
            return(request);
        }
Пример #4
0
        /// <summary>
        /// Create entry order request
        /// </summary>
        private static O2GRequest CreateEntryOrderRequest(O2GSession session, string sOfferID, string sAccountID, int iAmount, double dRate, string sBuySell, string sOrderType, string sExpireDate)
        {
            O2GRequest        request        = null;
            O2GRequestFactory requestFactory = session.getRequestFactory();

            if (requestFactory == null)
            {
                throw new Exception("Cannot create request factory");
            }
            O2GValueMap valuemap = requestFactory.createValueMap();

            valuemap.setString(O2GRequestParamsEnum.Command, Constants.Commands.CreateOrder);
            valuemap.setString(O2GRequestParamsEnum.OrderType, sOrderType);
            valuemap.setString(O2GRequestParamsEnum.AccountID, sAccountID);
            valuemap.setString(O2GRequestParamsEnum.OfferID, sOfferID);
            valuemap.setString(O2GRequestParamsEnum.BuySell, sBuySell);
            valuemap.setInt(O2GRequestParamsEnum.Amount, iAmount);
            valuemap.setDouble(O2GRequestParamsEnum.Rate, dRate);
            valuemap.setString(O2GRequestParamsEnum.CustomID, "EntryOrder");

            if (!string.IsNullOrEmpty(sExpireDate))
            {
                valuemap.setString(O2GRequestParamsEnum.TimeInForce, Constants.TIF.GTD);
                valuemap.setString(O2GRequestParamsEnum.ExpireDayTime, sExpireDate); // UTCTimestamp format: "yyyyMMdd-HH:mm:ss.SSS" (milliseconds are optional)
            }

            request = requestFactory.createOrderRequest(valuemap);
            if (request == null)
            {
                Console.WriteLine(requestFactory.getLastError());
            }
            return(request);
        }
Пример #5
0
        /// <summary>
        /// Attach L or S order to existing entry order
        /// </summary>
        private static O2GRequest AddOrderForEntryRequest(O2GSession session, O2GTradeRow trade, string sOrderType, double dRate)
        {
            if (!sOrderType.Equals("L") && !sOrderType.Equals("S"))
            {
                throw new Exception("Incorrect order type");
            }
            O2GRequest        request        = null;
            O2GRequestFactory requestFactory = session.getRequestFactory();

            if (requestFactory == null)
            {
                throw new Exception("Cannot create request factory");
            }
            O2GValueMap valuemap = requestFactory.createValueMap();

            valuemap.setString(O2GRequestParamsEnum.Command, Constants.Commands.CreateOrder);
            valuemap.setString(O2GRequestParamsEnum.OrderType, sOrderType); // Must be L or S
            valuemap.setString(O2GRequestParamsEnum.AccountID, trade.AccountID);
            valuemap.setString(O2GRequestParamsEnum.OfferID, trade.OfferID);
            valuemap.setString(O2GRequestParamsEnum.TradeID, trade.TradeID); // TradeID from existing Entry order
            string sOppositeDirection = trade.BuySell == Constants.Buy ? Constants.Sell : Constants.Buy;

            valuemap.setString(O2GRequestParamsEnum.BuySell, sOppositeDirection); // The order direction must be opposite to the direction of the order which was used to create the position
            valuemap.setInt(O2GRequestParamsEnum.Amount, trade.Amount);
            valuemap.setDouble(O2GRequestParamsEnum.Rate, dRate);
            valuemap.setString(O2GRequestParamsEnum.CustomID, "AttachedEntryOrder");
            request = requestFactory.createOrderRequest(valuemap);
            if (request == null)
            {
                Console.WriteLine(requestFactory.getLastError());
            }
            return(request);
        }
Пример #6
0
        public void CreateRangeOrder(string sOfferID, string sAccountID, int iAmount, double dRateMin, double dRateMax, string sBuySell)
        {
            O2GRequestFactory factory = m_o2gsession.getRequestFactory();

            if (factory == null)
            {
                return;
            }
            O2GValueMap valuemap = factory.createValueMap();

            valuemap.setString(O2GRequestParamsEnum.Command, Constants.Commands.CreateOrder);
            valuemap.setString(O2GRequestParamsEnum.OrderType, Constants.Orders.MarketOpenRange);
            valuemap.setString(O2GRequestParamsEnum.AccountID, sAccountID);      // The identifier of the account the order should be placed for.
            valuemap.setString(O2GRequestParamsEnum.OfferID, sOfferID);          // The identifier of the instrument the order should be placed for.
            valuemap.setString(O2GRequestParamsEnum.BuySell, sBuySell);          // The order direction (Constants.Buy for buy, Constants.Sell for sell).
            valuemap.setDouble(O2GRequestParamsEnum.RateMin, dRateMin);          // The minimum dRate at which the order can be filled.
            valuemap.setDouble(O2GRequestParamsEnum.RateMax, dRateMax);          // The maximum dRate at which the order can be filled.
            valuemap.setString(O2GRequestParamsEnum.CustomID, "OpenRangeOrder"); // The custom identifier of the order.
            valuemap.setInt(O2GRequestParamsEnum.Amount, iAmount);

            O2GRequest request = factory.createOrderRequest(valuemap);

            m_o2gsession.sendRequest(request);
        }
Пример #7
0
        /* True Market Order */
        public void CreateTrueMarketLimitOrder(string sOfferID, string sAccountID, int iAmount, string sBuySell, double TakeProfit, double StopLoss)
        {
            try
            {
                O2GRequestFactory factory = m_o2gsession.getRequestFactory();
                if (factory == null)
                {
                    return;
                }
                O2GValueMap valuemap = factory.createValueMap();
                valuemap.setString(O2GRequestParamsEnum.Command, Constants.Commands.CreateOrder);
                valuemap.setString(O2GRequestParamsEnum.OrderType, Constants.Orders.TrueMarketOpen);
                valuemap.setString(O2GRequestParamsEnum.AccountID, sAccountID);          // The identifier of the account the order should be placed for.
                valuemap.setString(O2GRequestParamsEnum.OfferID, sOfferID);              // The identifier of the instrument the order should be placed for.
                valuemap.setString(O2GRequestParamsEnum.BuySell, sBuySell);              // The order direction: Constants.Sell for "Sell", Constants.Buy for "Buy".
                valuemap.setInt(O2GRequestParamsEnum.Amount, iAmount);                   // The quantity of the instrument to be bought or sold.
                valuemap.setString(O2GRequestParamsEnum.CustomID, "TrueMarketOrder");    // The custom identifier of the order.
                valuemap.setDouble(O2GRequestParamsEnum.RateLimit, TakeProfit);
                valuemap.setDouble(O2GRequestParamsEnum.RateStop, StopLoss);

                if (sBuySell == "Buy")
                {
                    valuemap.setString(O2GRequestParamsEnum.BuySell, Constants.Buy);
                }
                else
                {
                    valuemap.setString(O2GRequestParamsEnum.BuySell, Constants.Sell);
                }

                O2GRequest request = factory.createOrderRequest(valuemap);
                m_o2gsession.sendRequest(request);
            }
            catch
            {
            }
        }
Пример #8
0
        /// <summary>
        /// Create OTO request
        /// </summary>
        private static O2GRequest CreateOTORequest(O2GSession session, string sOfferID, string sAccountID, int iAmount, double dRatePrimary, double dRateSecondary)
        {
            O2GRequest        request        = null;
            O2GRequestFactory requestFactory = session.getRequestFactory();

            if (requestFactory == null)
            {
                throw new Exception("Cannot create request factory");
            }
            O2GValueMap valuemapMain = requestFactory.createValueMap();

            valuemapMain.setString(O2GRequestParamsEnum.Command, Constants.Commands.CreateOTO);

            // ValueMap for primary order
            O2GValueMap valuemapPrimary = requestFactory.createValueMap();

            valuemapPrimary.setString(O2GRequestParamsEnum.Command, Constants.Commands.CreateOrder);
            valuemapPrimary.setString(O2GRequestParamsEnum.OrderType, Constants.Orders.StopEntry);
            valuemapPrimary.setString(O2GRequestParamsEnum.AccountID, sAccountID);
            valuemapPrimary.setString(O2GRequestParamsEnum.OfferID, sOfferID);
            valuemapPrimary.setString(O2GRequestParamsEnum.BuySell, Constants.Sell);
            valuemapPrimary.setInt(O2GRequestParamsEnum.Amount, iAmount);
            valuemapPrimary.setDouble(O2GRequestParamsEnum.Rate, dRatePrimary);
            valuemapMain.appendChild(valuemapPrimary);

            // ValueMap for secondary order
            O2GValueMap valuemapSecondary = requestFactory.createValueMap();

            valuemapSecondary.setString(O2GRequestParamsEnum.Command, Constants.Commands.CreateOrder);
            valuemapSecondary.setString(O2GRequestParamsEnum.OrderType, Constants.Orders.StopEntry);
            valuemapSecondary.setString(O2GRequestParamsEnum.AccountID, sAccountID);
            valuemapSecondary.setString(O2GRequestParamsEnum.OfferID, sOfferID);
            valuemapSecondary.setString(O2GRequestParamsEnum.BuySell, Constants.Buy);
            valuemapSecondary.setInt(O2GRequestParamsEnum.Amount, iAmount);
            valuemapSecondary.setDouble(O2GRequestParamsEnum.Rate, dRateSecondary);
            valuemapMain.appendChild(valuemapSecondary);

            request = requestFactory.createOrderRequest(valuemapMain);
            if (request == null)
            {
                Console.WriteLine(requestFactory.getLastError());
            }
            return(request);
        }
Пример #9
0
        /***************************************************************************************************************/



        /***************************************************************************************************************/
        /*****                                      LIMIT ORDERS                                                   *****/
        /***************************************************************************************************************/


        /* Open Limit Order */
        public void CreateOpenLimitOrder(string sOfferID, string sAccountID, int iAmount, double dRate, string sBuySell)
        {
            O2GRequestFactory factory = m_o2gsession.getRequestFactory();

            if (factory == null)
            {
                return;
            }
            O2GValueMap valuemap = factory.createValueMap();

            valuemap.setString(O2GRequestParamsEnum.Command, Constants.Commands.CreateOrder);
            valuemap.setString(O2GRequestParamsEnum.OrderType, Constants.Orders.OpenLimit);
            valuemap.setString(O2GRequestParamsEnum.AccountID, sAccountID);              // The identifier of the account the order should be placed for.
            valuemap.setString(O2GRequestParamsEnum.OfferID, sOfferID);                  // The identifier of the instrument the order should be placed for.
            valuemap.setString(O2GRequestParamsEnum.BuySell, sBuySell);                  // The order direction (use Constants.Buy for Buy, Constants.Sell for Sell)
            valuemap.setDouble(O2GRequestParamsEnum.Rate, dRate);                        // The dRate at which the order must be filled.
            valuemap.setInt(O2GRequestParamsEnum.Amount, iAmount);                       // The quantity of the instrument to be bought or sold.
            valuemap.setString(O2GRequestParamsEnum.CustomID, "OpenLimitOrder");         // The custom identifier of the order.

            O2GRequest request = factory.createOrderRequest(valuemap);

            m_o2gsession.sendRequest(request);
        }
        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);
        }
Пример #11
0
        /// <summary>
        /// Create OTO request
        /// </summary>
        private static O2GRequest CreateOTOCORequest(O2GSession session, string sOfferID, string sAccountID, int iAmount, double dRatePrimary, double dRateOcoFirst, double dRateOcoSecond)
        {
            O2GRequest        request        = null;
            O2GRequestFactory requestFactory = session.getRequestFactory();

            if (requestFactory == null)
            {
                throw new Exception("Cannot create request factory");
            }

            // Create OTO command
            O2GValueMap valuemapMain = requestFactory.createValueMap();

            valuemapMain.setString(O2GRequestParamsEnum.Command, Constants.Commands.CreateOTO);

            // Create Entry order
            O2GValueMap valuemapPrimary = requestFactory.createValueMap();

            valuemapPrimary.setString(O2GRequestParamsEnum.Command, Constants.Commands.CreateOrder);
            valuemapPrimary.setString(O2GRequestParamsEnum.OrderType, Constants.Orders.StopEntry);
            valuemapPrimary.setString(O2GRequestParamsEnum.AccountID, sAccountID);
            valuemapPrimary.setString(O2GRequestParamsEnum.OfferID, sOfferID);
            valuemapPrimary.setString(O2GRequestParamsEnum.BuySell, Constants.Sell);
            valuemapPrimary.setInt(O2GRequestParamsEnum.Amount, iAmount);
            valuemapPrimary.setDouble(O2GRequestParamsEnum.Rate, dRatePrimary);

            // Create OCO group of orders
            O2GValueMap valuemapOCO = requestFactory.createValueMap();

            valuemapOCO.setString(O2GRequestParamsEnum.Command, Constants.Commands.CreateOCO);

            // Create Entry order to OCO
            O2GValueMap valuemapOCOFirst = requestFactory.createValueMap();

            valuemapOCOFirst.setString(O2GRequestParamsEnum.Command, Constants.Commands.CreateOrder);
            valuemapOCOFirst.setString(O2GRequestParamsEnum.OrderType, Constants.Orders.StopEntry);
            valuemapOCOFirst.setString(O2GRequestParamsEnum.AccountID, sAccountID);
            valuemapOCOFirst.setString(O2GRequestParamsEnum.OfferID, sOfferID);
            valuemapOCOFirst.setString(O2GRequestParamsEnum.BuySell, Constants.Buy);
            valuemapOCOFirst.setInt(O2GRequestParamsEnum.Amount, iAmount);
            valuemapOCOFirst.setDouble(O2GRequestParamsEnum.Rate, dRateOcoFirst);

            O2GValueMap valuemapOCOSecond = requestFactory.createValueMap();

            valuemapOCOSecond.setString(O2GRequestParamsEnum.Command, Constants.Commands.CreateOrder);
            valuemapOCOSecond.setString(O2GRequestParamsEnum.OrderType, Constants.Orders.StopEntry);
            valuemapOCOSecond.setString(O2GRequestParamsEnum.AccountID, sAccountID);
            valuemapOCOSecond.setString(O2GRequestParamsEnum.OfferID, sOfferID);
            valuemapOCOSecond.setString(O2GRequestParamsEnum.BuySell, Constants.Sell);
            valuemapOCOSecond.setInt(O2GRequestParamsEnum.Amount, iAmount);
            valuemapOCOSecond.setDouble(O2GRequestParamsEnum.Rate, dRateOcoSecond);

            // Fill the created groups. Please note, first you should add an entry order to OTO order and then OCO group of orders
            valuemapMain.appendChild(valuemapPrimary);
            valuemapOCO.appendChild(valuemapOCOFirst);
            valuemapOCO.appendChild(valuemapOCOSecond);
            valuemapMain.appendChild(valuemapOCO);

            request = requestFactory.createOrderRequest(valuemapMain);
            if (request == null)
            {
                Console.WriteLine(requestFactory.getLastError());
            }
            return(request);
        }
        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);
        }