예제 #1
0
        public StrategyDecision GetDecision(IDictionary <string, IList <ICandle> > data, string name, string currentPos, Security security, DateTime CurrentDt)
        {
            StrategyDecision dec = new StrategyDecision()
            {
                Decision = null
            };

            SimpleMovingAverage short_ma = new SimpleMovingAverage(data["5"], 9);
            SimpleMovingAverage long_ma  = new SimpleMovingAverage(data["5"], 30);

            MACD        macd      = new MACD(data["5"], 12, 26, 9);
            TREND       macdTrend = new TREND(macd, 2);
            TRENDResult power     = macdTrend.GetResult();

            TRENDResult trend = new TREND(long_ma, 3).GetResult();

            AverageTrueRange atr = new AverageTrueRange(data["5"], 14);

            //dec.Profit = Math.Round(atr.Last() * 2m, 2);
            //dec.StopLoss = Math.Round(atr.Last(), 2);

            dec.Profit   = Math.Round(data["5"].Last().close * 0.006m, 2);
            dec.StopLoss = Math.Round(data["5"].Last().close * 0.002m, 2);


            decimal vollast = data["5"].Last().volume;
            decimal volprev = data["5"][data["5"].Count - 2].volume;

            bool vol = vollast > volprev * 2m;

            //if (power == TRENDResult.StrongUp && new Crossover(short_ma, long_ma).GetResult())
            //{
            //    //dec.Decision = "open long";

            //    //dec.Price = Math.Round(data["5"].Last().close * 1.005m, 2);

            //    signals.Add(new Signal() { Security = name, Action = "open long", DateTime = CurrentDt, Price= data["5"].Last().close });
            //}
            //else
            if (power == TRENDResult.StrongUp)
            {
                //dec.Decision = "open long";

                //dec.Price = Math.Round(data["5"].Last().close * 1.005m, 2);
                signals.Add(new Signal()
                {
                    Security = name, Action = "open long", DateTime = CurrentDt, Price = data["5"].Last().close
                });
            }

            if (currentPos == "free")
            {
                DateTime minDt = CurrentDt.AddMinutes(-20);
                DateTime maxDt = CurrentDt.AddMinutes(-15);

                var lastSignals = signals.Where(s => s.Security == name && s.Action == "open long" && s.DateTime < maxDt && s.DateTime >= minDt).ToList();

                Signal signal = lastSignals.FirstOrDefault();

                decimal summ = 0;

                if (signal != null)
                {
                    var candlesToCheck = data["5"].Where(c => c.begin >= signal.DateTime).ToList();

                    foreach (Candle c in candlesToCheck)
                    {
                        summ += c.close - c.open;
                    }
                }


                if (summ > atr.Last() * 2m && data["5"].Last().close > signal.Price)
                {
                    dec.Decision = "open long";

                    dec.LongPrice = Math.Round(data["5"].Last().close * 1.005m, 2);
                }
            }



            //if ((power == TRENDResult.Down || power == TRENDResult.StrongDown) && new Crossover(long_ma, short_ma).GetResult() && currentPos == "free")
            //{
            //    dec.Decision = "open short";

            //    dec.Price = Math.Round(data[5].Last().close * 0.995m, 2);
            //}


            if (security.MinStep == 1)
            {
                dec.Profit    = Math.Round(dec.Profit);
                dec.StopLoss  = Math.Round(dec.StopLoss);
                dec.LongPrice = Math.Round(dec.LongPrice);
            }

            //dec.Decision = "open long";

            return(dec);
        }
예제 #2
0
        public StrategyDecision GetDecision(IDictionary <string, IList <ICandle> > data, string name, string currentPos, Security security, DateTime CurrentDt)
        {
            StrategyDecision dec = new StrategyDecision()
            {
                Decision = null
            };

            ExponentialMovingAverage hours_ema = new ExponentialMovingAverage(data["60"], 9);

            //ExponentialMovingAverage minutes_ema = new ExponentialMovingAverage(data[5], 4);

            MACD macd = new MACD(data["5"], 12, 26, 9);

            TREND hoursTrend = new TREND(hours_ema, 3);
            //TREND minutesTrend = new TREND(minutes_ema, 3);
            TREND macdTrend    = new TREND(macd, 2);
            bool  valueConfirm = new ValueConfirm(data["5"], 5).GetResult();

            AverageTrueRange atr = new AverageTrueRange(data["5"], 14);

            Extremum extremum = new Extremum(atr, 3, 20);

            //hoursTrend.GetResult();
            //macdTrend.GetResult();

            //if ((hoursTrend.GetResult() == TRENDResult.Up && macdTrend.GetResult() == TRENDResult.Up || macdTrend.GetResult() == TRENDResult.StrongUp) && currentPos == "free")
            //{
            //    dec = "open long";
            //}

            //if ((hoursTrend.GetResult() == TRENDResult.Down && macdTrend.GetResult() == TRENDResult.Down || macdTrend.GetResult() == TRENDResult.StrongDown) && currentPos == "free")
            //{
            //    dec = "open short";
            //}

            TRENDResult trend = hoursTrend.GetResult();
            TRENDResult power = macdTrend.GetResult();


            decimal value = data["5"].Last().value;

            //*if (extremum.Count() > 0 && extremum.Last().ext == "L" && extremum.Last().val < atr.Last())
            if (atr.Last() > 10m && valueConfirm)
            {
                dec.Profit   = Math.Round(atr.Last() * 4m, 2);
                dec.StopLoss = Math.Round(atr.Last(), 2);



                if (trend == TRENDResult.Up && (power == TRENDResult.Up || power == TRENDResult.StrongUp) && currentPos == "free")
                {
                    dec.Decision = "open long";
                }

                if (trend == TRENDResult.Flat && power == TRENDResult.StrongUp && currentPos == "free")
                {
                    dec.Decision = "open long";
                }

                if (trend == TRENDResult.Down && (power == TRENDResult.Down || power == TRENDResult.StrongDown) && currentPos == "free")
                {
                    dec.Decision = "open short";
                }

                if (trend == TRENDResult.Flat && power == TRENDResult.StrongDown && currentPos == "free")
                {
                    dec.Decision = "open short";
                }
            }

            if (CurrentDt >= new DateTime(2017, 5, 15, 15, 20, 0))
            {
                //dec = null;
            }

            return(dec);
        }