コード例 #1
0
        protected override void OnPlaceOrder(PlaceOrderRequestParameters placeOrderRequest)
        {
            // For trading logs
            placeOrderRequest.SendingSource = this.Name;

            for (int i = 0; i < this.RepeatCount; i++)
            {
                // Place order
                this.Log($"Place order #{i + 1}");

                var result = Core.Instance.PlaceOrder(placeOrderRequest);
                if (result.Status == TradingOperationResultStatus.Failure)
                {
                    throw new Exception(result.Message);
                }

                // Wait before placing next order
                this.Log($"Wait {this.DelaySeconds} seconds...");

                Task.Delay(TimeSpan.FromSeconds(this.DelaySeconds)).Wait();

                // Strategy executing was cancelled
                if (this.cancelled)
                {
                    return;
                }
            }
        }
コード例 #2
0
        public void Example()
        {
            // Get first available symbol
            Symbol symbol = Core.Instance.Symbols.FirstOrDefault();

            // Or you can find symbol by name
            symbol = Core.Instance.Symbols.FirstOrDefault(s => s.Name == "EUR/USD");

            // Get account by name
            Account account = Core.Instance.Accounts.FirstOrDefault(a => a.Name == "<account-name>");

            // Create request object
            var request = new PlaceOrderRequestParameters
            {
                Symbol      = symbol,                                               // Mandatory
                Account     = account,                                              // Mandatory
                Side        = Side.Buy,                                             // Mandatory
                OrderTypeId = OrderType.Market,                                     // Mandatory. Variants: Market, Limit, Stop, StopLimit, TrailingStop
                Quantity    = 0.5,                                                  // Mandatory

                Price        = 1.52,                                                // Optional. Required for limit and stop limit orders
                TriggerPrice = 1.52,                                                // Optional. Required for stop and stop limit orders
                TrailOffset  = 20,                                                  // Optional. Required for trailing stop order type

                TimeInForce    = TimeInForce.Day,                                   // Optional. Variants: Day, GTC, GTD, GTT, FOK, IOC
                ExpirationTime = Core.Instance.TimeUtils.DateTimeUtcNow.AddDays(1), // Optional
                StopLoss       = SlTpHolder.CreateSL(1.4),                          // Optional
                TakeProfit     = SlTpHolder.CreateTP(2.2)                           // Optional
            };

            // Send request
            var result = Core.Instance.PlaceOrder(request);


            // Or you can use simplified method

            // Place market order with quantity = 1
            result = Core.Instance.PlaceOrder(symbol, account, Side.Buy);

            // Place limit order
            result = Core.Instance.PlaceOrder(symbol, account, Side.Sell, price: 1.5);

            // Place stop order
            result = Core.Instance.PlaceOrder(symbol, account, Side.Buy, triggerPrice: 2.1);

            // Place stop limit order
            result = Core.Instance.PlaceOrder(symbol, account, Side.Sell, timeInForce: TimeInForce.GTC, quantity: 0.6, price: 2.2, triggerPrice: 2.1);
        }
コード例 #3
0
        public override TradingOperationResult PlaceOrder(PlaceOrderRequestParameters parameters)
        {
            var result = new TradingOperationResult();

            string  symbol   = parameters.Symbol.Id;
            HitSide side     = parameters.Side == Side.Buy ? HitSide.Buy : HitSide.Sell;
            decimal quantity = (decimal)parameters.Quantity;

            decimal price     = -1;
            decimal stopPrice = -1;

            if (parameters.OrderTypeId == OrderType.Limit || parameters.OrderTypeId == OrderType.StopLimit)
            {
                price = (decimal)parameters.Price;
            }

            if (parameters.OrderTypeId == OrderType.Stop || parameters.OrderTypeId == OrderType.StopLimit)
            {
                stopPrice = (decimal)parameters.TriggerPrice;
            }

            HitTimeInForce timeInForce = this.ConvertTimeInForce(parameters.TimeInForce);

            DateTime expireTime = default;

            if (timeInForce == HitTimeInForce.GTD)
            {
                expireTime = parameters.ExpirationTime;
            }

            var response = this.CheckHitResponse(this.socketApi.PlaceNewOrderAsync(symbol, side, quantity, price, stopPrice, timeInForce, expireTime, cancellationToken: parameters.CancellationToken).Result, out var error, true);

            if (response != null)
            {
                result.Status  = TradingOperationResultStatus.Success;
                result.OrderId = response.ClientOrderId;
            }
            else
            {
                result.Status  = TradingOperationResultStatus.Failure;
                result.Message = error?.ToString() ?? "Unknown error";
            }

            return(result);
        }
コード例 #4
0
 public override TradingOperationResult PlaceOrder(PlaceOrderRequestParameters parameters) => this.vendor.PlaceOrder(parameters);