Exemple #1
0
        public ProtoMessage CreateStopLimitOrderRequest(long accountId, string accessToken, int symbolId, ProtoOATradeSide tradeSide, long volume, double stopPrice, int slippageInPoints, double takeProfitPrice, double stopLossPrice, string label = null, string clientMsgId = null)
        {
            var _msg = ProtoOANewOrderReq.CreateBuilder();;

            _msg.SetCtidTraderAccountId(accountId);
            _msg.SetSymbolId(symbolId);
            _msg.SetOrderType(ProtoOAOrderType.STOP_LIMIT);
            _msg.SetTradeSide(tradeSide);
            _msg.SetVolume(volume);
            _msg.SetSlippageInPoints(slippageInPoints);
            _msg.SetStopPrice(stopPrice);
            if (takeProfitPrice > 0)
            {
                _msg.SetTakeProfit(takeProfitPrice);
            }
            if (stopLossPrice > 0)
            {
                _msg.SetStopLoss(stopLossPrice);
            }
            _msg.SetComment("TradingApiTest.CreateStopLimitOrderRequest");
            if (!string.IsNullOrEmpty(label))
            {
                _msg.SetLabel(label);
            }
            return(CreateMessage((uint)_msg.PayloadType, _msg.Build().ToByteString(), clientMsgId));
        }
        public ProtoMessage CreateMarketOrderRequest(long accountId, string accessToken, int symbolId, ProtoOATradeSide tradeSide, long volume, string clientMsgId = null)
        {
            var _msg = ProtoOANewOrderReq.CreateBuilder();

            _msg.SetCtidTraderAccountId(accountId);
            _msg.SetSymbolId(symbolId);
            _msg.SetOrderType(ProtoOAOrderType.MARKET);
            _msg.SetTradeSide(tradeSide);
            _msg.SetVolume(volume);
            _msg.SetComment("TradingApiTest.CreateMarketOrderRequest");
            return(CreateMessage((uint)_msg.PayloadType, _msg.Build().ToByteString(), clientMsgId));
        }
        public ProtoMessage CreateLimitOrderRequest(long accountId, string accessToken, int symbolId, ProtoOATradeSide tradeSide, long volume, double limitPrice, string clientMsgId = null)
        {
            var _msg = ProtoOANewOrderReq.CreateBuilder();;

            _msg.SetCtidTraderAccountId(accountId);
            _msg.SetSymbolId(symbolId);
            _msg.SetOrderType(ProtoOAOrderType.LIMIT);
            _msg.SetTradeSide(tradeSide);
            _msg.SetVolume(volume);
            _msg.SetLimitPrice(limitPrice);
            _msg.SetComment("TradingApiTest.CreateLimitOrderRequest");
            DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

            _msg.SetExpirationTimestamp((long)(DateTime.UtcNow.AddHours(1) - epoch).TotalMilliseconds);
            return(CreateMessage((uint)_msg.PayloadType, _msg.Build().ToByteString(), clientMsgId));
        }
Exemple #4
0
        public ProtoMessage CreateMarketRangeOrderRequest(long accountId, string accessToken, int symbolId, ProtoOATradeSide tradeSide, long volume, double baseSlippagePrice, int slippageInPoints, string label = null, string clientMsgId = null)
        {
            var _msg = ProtoOANewOrderReq.CreateBuilder();;

            _msg.SetCtidTraderAccountId(accountId);
            _msg.SetSymbolId(symbolId);
            _msg.SetOrderType(ProtoOAOrderType.MARKET_RANGE);
            _msg.SetTradeSide(tradeSide);
            _msg.SetVolume(volume);
            _msg.SetBaseSlippagePrice(baseSlippagePrice);
            _msg.SetSlippageInPoints(slippageInPoints);
            _msg.SetComment("TradingApiTest.CreateMarketRangeOrderRequest");
            if (!string.IsNullOrEmpty(label))
            {
                _msg.SetLabel(label);
            }
            return(CreateMessage((uint)_msg.PayloadType, _msg.Build().ToByteString(), clientMsgId));
        }
        public void SendTrade(UserConfig config, string symbolName, string direction, long size, string clientMsgId, string orderComment, long stopPoints = 0, long takeProfitPoints = 0)
        {
            ProtoOATradeSide tradeSide = ProtoOATradeSide.BUY;

            if (direction == "SHORT")
            {
                tradeSide = ProtoOATradeSide.SELL;
            }

            int symbolId = config.Symbols.SymbolId(symbolName);

            //create the trade request message and queue it
            var _msg = ProtoOANewOrderReq.CreateBuilder();

            _msg.SetCtidTraderAccountId(config.AccountId);
            _msg.SetSymbolId(symbolId);
            _msg.SetOrderType(ProtoOAOrderType.MARKET);
            _msg.SetTradeSide(tradeSide);
            _msg.SetVolume(size);
            _msg.SetLabel("LABEL");

            if (stopPoints > 0)
            {
                _msg.SetRelativeStopLoss(stopPoints);
            }
            if (takeProfitPoints > 0)
            {
                _msg.SetRelativeTakeProfit(takeProfitPoints);
            }
            _msg.SetComment(orderComment);

            var protoMsg = ProtoMessage.CreateBuilder();

            protoMsg.PayloadType = (uint)_msg.PayloadType;
            protoMsg.SetPayload(_msg.Build().ToByteString());
            protoMsg.SetClientMsgId(clientMsgId);

            _trasmitQueue.Enqueue(protoMsg.Build());
        }
 public ProtoOANewOrderReq GetCreateOrderRequest(byte[] msg = null)
 {
     return(ProtoOANewOrderReq.CreateBuilder().MergeFrom(GetPayload(msg)).Build());
 }
        public static ProtoMessage New_Order_Req(long ctidTraderAccountId,
                                                 long symbolId,
                                                 ProtoOAOrderType orderType,
                                                 ProtoOATradeSide tradeSide,
                                                 long volume,
                                                 double limitPrice = 0,
                                                 double stopPrice  = 0,
                                                 ProtoOATimeInForce timeInForce = ProtoOATimeInForce.GoodTillCancel,
                                                 long expirationTimestamp       = 0,
                                                 double stopLoss          = 0,
                                                 double takeProfit        = 0,
                                                 string comment           = "",
                                                 double baseSlippagePrice = 0,
                                                 int slippageInPoints     = 0,
                                                 string label             = "",
                                                 long positionId          = 0,
                                                 string clientOrderId     = "",
                                                 long relativeStopLoss    = 0,
                                                 long relativeTakeProfit  = 0,
                                                 bool guaranteedStopLoss  = false,
                                                 bool trailingStopLoss    = false,
                                                 ProtoOAOrderTriggerMethod stopTriggerMethod = ProtoOAOrderTriggerMethod.Trade)
        {
            ProtoOANewOrderReq message = new ProtoOANewOrderReq
            {
                payloadType         = ProtoOAPayloadType.ProtoOaNewOrderReq,
                ctidTraderAccountId = ctidTraderAccountId,
                symbolId            = symbolId,
                orderType           = orderType,
                tradeSide           = tradeSide,
                Volume = volume
            };

            if (limitPrice > 0)
            {
                message.limitPrice = limitPrice;
            }
            if (stopPrice > 0)
            {
                message.stopPrice = stopPrice;
            }
            if (timeInForce > 0)
            {
                message.timeInForce = timeInForce;
            }
            if (expirationTimestamp > 0)
            {
                message.expirationTimestamp = expirationTimestamp;
            }
            if (stopLoss > 0)
            {
                message.stopLoss = stopLoss;
            }
            if (takeProfit > 0)
            {
                message.takeProfit = takeProfit;
            }
            if (comment != "")
            {
                message.Comment = comment;
            }
            if (baseSlippagePrice > 0)
            {
                message.baseSlippagePrice = baseSlippagePrice;
            }
            if (slippageInPoints > 0)
            {
                message.slippageInPoints = slippageInPoints;
            }
            if (label != "")
            {
                message.Label = label;
            }
            if (positionId > 0)
            {
                message.positionId = positionId;
            }
            if (clientOrderId != "")
            {
                message.clientOrderId = clientOrderId;
            }
            if (relativeStopLoss != 0)
            {
                message.relativeStopLoss = relativeStopLoss;
            }
            if (relativeTakeProfit != 0)
            {
                message.relativeTakeProfit = relativeTakeProfit;
            }
            if (guaranteedStopLoss)
            {
                message.guaranteedStopLoss = true;
            }
            if (trailingStopLoss)
            {
                message.trailingStopLoss = true;
            }
            if (stopTriggerMethod != ProtoOAOrderTriggerMethod.Trade)
            {
                message.stopTriggerMethod = stopTriggerMethod;
            }

            Log.Info("ProtoOANewOrderReq:: " +
                     $"ctidTraderAccountId: {ctidTraderAccountId}; " +
                     $"symbolId: {symbolId}; " +
                     $"orderType: {orderType}; " +
                     $"tradeSide: {tradeSide}; " +
                     $"volume: {volume}; " +
                     $"limitPrice: {limitPrice}; " +
                     $"stopPrice: {stopPrice}; " +
                     $"timeInForce: {timeInForce}; " +
                     $"expirationTimestamp: {expirationTimestamp} ({EpochToString(expirationTimestamp)}; " +
                     $"stopLoss: {stopLoss}; " +
                     $"takeProfit: {takeProfit}; " +
                     $"comment: {comment}; " +
                     $"baseSlippagePrice: {baseSlippagePrice}; " +
                     $"slippageInPoints: {slippageInPoints}; " +
                     $"label: {label}; " +
                     $"positionId: {positionId}; " +
                     $"clientOrderId: {clientOrderId}; " +
                     $"relativeStopLoss: {relativeStopLoss}; " +
                     $"relativeTakeProfit: {relativeTakeProfit}; " +
                     $"guaranteedStopLoss: {guaranteedStopLoss}; " +
                     $"trailingStopLoss: {trailingStopLoss}; " +
                     $"stopTriggerMethod: {stopTriggerMethod}");

            InnerMemoryStream.SetLength(0);
            Serializer.Serialize(InnerMemoryStream, message);

            return(Encode((uint)message.payloadType, InnerMemoryStream.ToArray()));
        }
Exemple #8
0
        public async Task CreateNewOrder(OrderModel orderModel, long accountId, bool isLive)
        {
            VerifyConnection();

            var newOrderReq = new ProtoOANewOrderReq
            {
                CtidTraderAccountId = accountId,
                SymbolId            = orderModel.Symbol.Id,
                Volume    = orderModel.Volume,
                TradeSide = orderModel.TradeSide,
            };

            if (orderModel is MarketOrderModel marketOrder)
            {
                newOrderReq.OrderType = marketOrder.IsMarketRange ? ProtoOAOrderType.MarketRange : ProtoOAOrderType.Market;

                if (marketOrder.Id != default)
                {
                    newOrderReq.PositionId = marketOrder.Id;
                }
            }
            else if (orderModel is PendingOrderModel pendingOrder)
            {
                newOrderReq.OrderType = pendingOrder.ProtoType;

                if (newOrderReq.OrderType == ProtoOAOrderType.Limit)
                {
                    newOrderReq.LimitPrice = pendingOrder.Price;
                }
                else
                {
                    newOrderReq.StopPrice = pendingOrder.Price;

                    if (newOrderReq.OrderType == ProtoOAOrderType.StopLimit)
                    {
                        var slippageinPoint = pendingOrder.Symbol.Data.GetPointsFromPips(pendingOrder.LimitRangeInPips);

                        if (slippageinPoint < int.MaxValue)
                        {
                            newOrderReq.SlippageInPoints = (int)slippageinPoint;
                        }
                    }
                }

                if (pendingOrder.IsExpiryEnabled)
                {
                    newOrderReq.ExpirationTimestamp = new DateTimeOffset(pendingOrder.ExpiryTime).ToUnixTimeMilliseconds();
                }
            }

            if (orderModel.IsStopLossEnabled)
            {
                newOrderReq.TrailingStopLoss = orderModel.IsTrailingStopLossEnabled;

                newOrderReq.RelativeStopLoss = orderModel.RelativeStopLoss;
            }

            if (orderModel.IsTakeProfitEnabled)
            {
                newOrderReq.RelativeTakeProfit = orderModel.RelativeTakeProfit;
            }

            if (string.IsNullOrWhiteSpace(orderModel.Label) is not true)
            {
                newOrderReq.Label = orderModel.Label;
            }

            if (string.IsNullOrWhiteSpace(orderModel.Comment) is not true)
            {
                newOrderReq.Comment = orderModel.Comment;
            }

            var client = GetClient(isLive);

            await client.SendMessage(newOrderReq, ProtoOAPayloadType.ProtoOaNewOrderReq);
        }