예제 #1
0
        public BrokerOrder Create(BrokerOrderModel brokerOrderModel)
        {
            var brokerOrder = AutoMapper.Mapper.Map <BrokerOrder>(brokerOrderModel);

            if (brokerOrder != null)
            {
                brokerOrder.CreatedDate = DateTime.Now;
                _context.BrokerOrders.Add(brokerOrder);
                _context.SaveChanges();
            }
            return(brokerOrder);
        }
        public string PlaceOrder(BrokerOrderModel brokerOrderModel)
        {
            Dictionary <string, dynamic> response = null;

            try
            {
                if (brokerOrderModel.Variety == Constants.VARIETY_CO)
                {
                    response = this._kite.PlaceOrder(
                        Exchange: brokerOrderModel.Exchange,
                        TradingSymbol: brokerOrderModel.TradingSymbol,
                        TransactionType: brokerOrderModel.TransactionType,
                        Quantity: brokerOrderModel.Quantity,
                        Price: brokerOrderModel.Price,
                        OrderType: brokerOrderModel.OrderType,
                        Product: brokerOrderModel.Product,
                        Variety: brokerOrderModel.Variety,
                        Validity: brokerOrderModel.Validity,
                        TriggerPrice: brokerOrderModel.TriggerPrice,
                        Tag: brokerOrderModel.JobId.ToString()
                        );
                }
                else if (brokerOrderModel.Variety == Constants.VARIETY_BO)
                {
                    response = this._kite.PlaceOrder(
                        Exchange: brokerOrderModel.Exchange,
                        TradingSymbol: brokerOrderModel.TradingSymbol,
                        TransactionType: brokerOrderModel.TransactionType,
                        Quantity: brokerOrderModel.Quantity,
                        Price: GetRoundToTick(brokerOrderModel.Price.Value, brokerOrderModel.TickSize.Value),
                        Product: brokerOrderModel.Product,
                        OrderType: brokerOrderModel.OrderType,
                        Validity: brokerOrderModel.Validity,
                        Variety: brokerOrderModel.Variety,
                        TriggerPrice: GetRoundToTick(brokerOrderModel.TriggerPrice.Value, brokerOrderModel.TickSize.Value),
                        SquareOffValue: GetRoundToTick(brokerOrderModel.SquareOffValue.Value, brokerOrderModel.TickSize.Value),
                        StoplossValue: GetRoundToTick(brokerOrderModel.StoplossValue.Value, brokerOrderModel.TickSize.Value),
                        TrailingStoploss: GetRoundToTick(brokerOrderModel.TrailingStoploss.Value, brokerOrderModel.TickSize.Value)
                        );
                }
                return(Convert.ToString(response["data"]["order_id"]));
            }
            finally
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("-----------------------------------------------------------------------------------" + Environment.NewLine);
                sb.Append(brokerOrderModel.TransactionType + " Order is Placed at " + GlobalConfigurations.IndianTime.ToString() + Environment.NewLine);
                sb.Append("- Order Request " + JsonConvert.SerializeObject(brokerOrderModel) + Environment.NewLine);
                sb.Append("- Order Response " + JsonConvert.SerializeObject(response) + Environment.NewLine);
                ApplicationLogger.LogJob(brokerOrderModel.JobId, sb.ToString());
            }
        }
예제 #3
0
        public BrokerOrderModel Scan(Symbol symbol, IEnumerable <Candle> candles, bool isPlaceOrder = true)
        {
            BrokerOrderModel brokerOrderModel = null;

            try
            {
                var currentCandle    = new IndexedCandle(candles, candles.Count() - 1);
                var rsi              = candles.Rsi(9)[candles.Count() - 1];
                var buySellRiseValue = currentCandle.Close * Convert.ToDecimal(_BuySellOnRisePercentage);
                var riskValue        = currentCandle.Close * Convert.ToDecimal(_RiskPercentage);
                var rewardValue      = (currentCandle.Close * Convert.ToDecimal(_RewardPercentage));

                if (currentCandle.Prev.IsEmaBullishCross(_EmaShortPeriod, _EmaLongPeriod) &&
                    currentCandle.IsBullishExt() && currentCandle.Prev.IsBullishExt()
                    //&& currentCandle.Prev.Close <= currentCandle.Open
                    //&& currentCandle.Prev.GetBody() < currentCandle.GetBody()
                    && rsi.Tick > 50)
                {
                    brokerOrderModel = new BrokerOrderModel()
                    {
                        JobId           = _jobId,
                        SymbolId        = symbol.Id,
                        TickSize        = symbol.TickSize,
                        Exchange        = symbol.Exchange,
                        TradingSymbol   = symbol.TradingSymbol,
                        TransactionType = Constants.TRANSACTION_TYPE_BUY,
                        Quantity        = Convert.ToInt32(_MinInvestmentPerOrder / currentCandle.Close) > 0 ? Convert.ToInt32(_MinInvestmentPerOrder / currentCandle.Close) : 1,
                        //Price = currentCandle.Close - buySellRiseValue,
                        Price     = currentCandle.Close,
                        Product   = Constants.PRODUCT_MIS,
                        OrderType = Constants.ORDER_TYPE_LIMIT,
                        Validity  = Constants.VALIDITY_DAY,
                        Variety   = Constants.VARIETY_BO,
                        //TriggerPrice = (currentCandle.Close - (riskValue + buySellRiseValue)),
                        TriggerPrice     = currentCandle.Close - (riskValue),
                        SquareOffValue   = rewardValue,
                        StoplossValue    = riskValue,
                        TrailingStoploss = (riskValue) < 1 ? 1 : (riskValue)
                    };
                    if (isPlaceOrder)
                    {
                        _zeropdhaService.PlaceOrder(brokerOrderModel);
                    }
                    //Log Candle
                    ApplicationLogger.LogJob(_jobId,
                                             GlobalConfigurations.IndianTime + " Buying Current Candles [" + symbol.TradingSymbol + "]" + JsonConvert.SerializeObject(candles.ElementAt(candles.Count() - 1)) + Environment.NewLine +
                                             GlobalConfigurations.IndianTime + " Buying Previous Candles [" + symbol.TradingSymbol + "]" + JsonConvert.SerializeObject(candles.ElementAt(candles.Count() - 2)));
                }
                else if (currentCandle.Prev.IsEmaBearishCross(_EmaShortPeriod, _EmaLongPeriod) &&
                         currentCandle.IsBearishExt() && currentCandle.Prev.IsBearishExt()
                         //&& currentCandle.Prev.Close >= currentCandle.Open
                         //&& currentCandle.Prev.GetBody() < currentCandle.GetBody()
                         && rsi.Tick < 50)
                {
                    brokerOrderModel = new BrokerOrderModel()
                    {
                        JobId           = _jobId,
                        SymbolId        = symbol.Id,
                        TickSize        = symbol.TickSize,
                        Exchange        = symbol.Exchange,
                        TradingSymbol   = symbol.TradingSymbol,
                        TransactionType = Constants.TRANSACTION_TYPE_SELL,
                        Quantity        = Convert.ToInt32(_MinInvestmentPerOrder / currentCandle.Close) > 0 ? Convert.ToInt32(_MinInvestmentPerOrder / currentCandle.Close) : 1,
                        //Price = currentCandle.Close + buySellRiseValue,
                        Price     = currentCandle.Close,
                        Product   = Constants.PRODUCT_MIS,
                        OrderType = Constants.ORDER_TYPE_LIMIT,
                        Validity  = Constants.VALIDITY_DAY,
                        Variety   = Constants.VARIETY_BO,
                        //TriggerPrice = (currentCandle.Close + (riskValue + buySellRiseValue)),
                        TriggerPrice     = (currentCandle.Close + (riskValue)),
                        SquareOffValue   = rewardValue,
                        StoplossValue    = riskValue,
                        TrailingStoploss = (riskValue) < 1 ? 1 : (riskValue)
                    };
                    if (isPlaceOrder)
                    {
                        _zeropdhaService.PlaceOrder(brokerOrderModel);
                    }
                    //Log Candle
                    ApplicationLogger.LogJob(_jobId,
                                             GlobalConfigurations.IndianTime + " Selling Current Candles [" + symbol.TradingSymbol + "]" + JsonConvert.SerializeObject(candles.ElementAt(candles.Count() - 1)) + Environment.NewLine +
                                             GlobalConfigurations.IndianTime + " Selling Previous Candles [" + symbol.TradingSymbol + "]" + JsonConvert.SerializeObject(candles.ElementAt(candles.Count() - 2)));
                }
            }
            catch (Exception ex) { }
            return(brokerOrderModel);
        }
        private PositionTestModel GetProfitOfDay(Symbol symbol, IEnumerable <Candle> candles, MAStrategy mAStrategy = null)
        {
            PositionTestModel positionTestModel = null;

            if (mAStrategy == null)
            {
                mAStrategy = new MAStrategy();
            }
            BrokerOrderModel brokerOrder = null;

            if (candles != null && symbol != null)
            {
                var lastDay = candles.LastOrDefault().DateTime.Day;
                for (int candleIndex = 0; candleIndex < candles.Count(); candleIndex++)
                {
                    var currentCandle = candles.ElementAt(candleIndex);
                    if (currentCandle.DateTime.Day == lastDay && currentCandle.DateTime.TimeOfDay > mAStrategy.marketStart && currentCandle.DateTime.TimeOfDay < mAStrategy.marketEnd)
                    {
                        if (brokerOrder == null)
                        {
                            var scanResult = mAStrategy.Scan(symbol, candles.Take(candleIndex), false);
                            if (scanResult != null)
                            {
                                brokerOrder = scanResult;
                                if (positionTestModel == null)
                                {
                                    positionTestModel = new PositionTestModel()
                                    {
                                        NoOfPositions = 1, TradingSymbol = symbol.TradingSymbol
                                    }
                                }
                                ;
                                else
                                {
                                    positionTestModel.NoOfPositions += 1;
                                }
                            }
                        }
                        else if (brokerOrder.TransactionType == Constants.TRANSACTION_TYPE_BUY)
                        {
                            //Stop Loss Hit
                            if (currentCandle.Low <= brokerOrder.TriggerPrice.Value)
                            {
                                positionTestModel.Profit      -= (brokerOrder.StoplossValue.Value * brokerOrder.Quantity);
                                positionTestModel.NoOfStopHit += 1;
                                brokerOrder = null;
                            }
                            else if (currentCandle.High >= (brokerOrder.Price.Value + brokerOrder.SquareOffValue.Value))
                            {
                                positionTestModel.Profit         += (brokerOrder.SquareOffValue.Value * brokerOrder.Quantity);
                                positionTestModel.NoOfProfitable += 1;
                                brokerOrder = null;
                            }
                        }
                        else if (brokerOrder.TransactionType == Constants.TRANSACTION_TYPE_SELL)
                        {
                            //Stop Loss Hit
                            if (currentCandle.High >= brokerOrder.TriggerPrice.Value)
                            {
                                positionTestModel.Profit      -= (brokerOrder.StoplossValue.Value * brokerOrder.Quantity);
                                positionTestModel.NoOfStopHit += 1;
                                brokerOrder = null;
                            }
                            else if (currentCandle.Low <= (brokerOrder.Price.Value - brokerOrder.SquareOffValue.Value))
                            {
                                positionTestModel.Profit         += (brokerOrder.SquareOffValue.Value * brokerOrder.Quantity);
                                positionTestModel.NoOfProfitable += 1;
                                brokerOrder = null;
                            }
                        }
                    }
                }
            }
            return(positionTestModel);
        }