Beispiel #1
0
        public override List <string> OnQuotesReceived(string[] names, CandleDataBidAsk[] quotes, bool isHistoryStartOff)
        {
            var events = new List <string>();
            var candle = UpdateCurrentCandle(names, quotes);

            if (candle == null)
            {
                return(events);
            }

            // проверить Каймана
            CandleData cayCandle;

            if (!caymanCandles.TryGetValue(candle.timeOpen, out cayCandle))
            {
                return(events);
            }

            // знак Каймана
            var sign = cayCandle.close >= 50 ? -1 : 1;

            caymanLastSigns.Add(sign);
            if (caymanLastSigns.Length < caymanLastSigns.MaxQueueLength)
            {
                return(events);
            }

            // последняя сделка
            List <MarketOrder> orders;

            GetMarketOrders(out orders);
            var lastOrder = orders.LastOrDefault();

            // закрыть ордер
            if (lastOrder != null && sign != lastOrder.Side)
            {
                CloseMarketOrder(lastOrder.ID);
                lastOrder = null;
            }

            // войти в рынок?
            if (lastOrder != null)
            {
                return(events);
            }
            if (caymanLastSigns.Any(s => s != sign))
            {
                return(events);
            }
            OpenDeal(candle.close, sign);

            return(events);
        }
Beispiel #2
0
        protected string BuildSeries()
        {
            var indi = chart.indicators.FirstOrDefault(i => i.GetType() == typeof(IndicatorExternSeries));

            if (indi == null)
            {
                return("Нет данных для построения (данные из файла)");
            }
            var indiData = indi.SeriesResult[0] as CandlestickSeries;

            if (indiData.DataCount == 0)
            {
                return("Индикатор пуст");
            }
            var candles = chart.chart.StockSeries.Data.Candles;
            var max     = Math.Min(candles.Count, indiData.DataCount);

            var       lines       = new List <TrendLine>();
            TrendLine trendLine   = null;
            var       dealSign    = 0;
            var       caymanSigns = new RestrictedQueue <int>(skippedCandles);

            for (var i = 0; i < max; i++)
            {
                var candle = indiData.Data[i];
                var chartCandle = candles[i];
                var extremumSign = candle.close <lowerMargin ? -1 : candle.close> upperMargin ? 1 : 0;
                caymanSigns.Add(extremumSign);

                if (dealSign != 0)
                {
                    trendLine.AddPoint(i, chartCandle.close);
                    if ((dealSign < 0 && candle.close > 50) ||
                        (dealSign > 0 && candle.close < 50))
                    {
                        trendLine = null;
                        dealSign  = 0;
                    }
                    continue;
                }

                dealSign = caymanSigns.Last;
                if (dealSign == 0)
                {
                    continue;
                }
                if (caymanSigns.Any(s => s != dealSign))
                {
                    dealSign = 0;
                    continue;
                }

                trendLine = new TrendLine
                {
                    Comment   = CommentSpecName,
                    Magic     = LineMagic,
                    LineColor = dealSign > 0 ? colorSell : ColorBuy
                };
                trendLine.AddPoint(i, chartCandle.close);
                trendLine.AddPoint(i, chartCandle.close);
                lines.Add(trendLine);
            }

            MakeChartGraph(lines);
            return("Построено " + lines.Count + " областей");
        }
        private string BuildSeries()
        {
            var indi = chart.indicators.FirstOrDefault(i => i.GetType() == typeof (IndicatorExternSeries));
            if (indi == null)
                return "Нет данных для построения (данные из файла)";
            var indiData = indi.SeriesResult[0] as CandlestickSeries;
            if (indiData.DataCount == 0) return "Индикатор пуст";
            var candles = chart.chart.StockSeries.Data.Candles;
            var max = Math.Min(candles.Count, indiData.DataCount);

            var lastSign = 0;
            var lastSigns = new RestrictedQueue<int>(skippedCandles);

            var lines = new List<TrendLine>();
            TrendLine trendLine = null;

            for (var i = 0; i < max; i++)
            {
                var candle = indiData.Data[i];
                var chartCandle = candles[i];
                var thisSign = GetCaymanSign(candle);
                lastSigns.Add(thisSign);

                // растянуть регион
                if (trendLine != null)
                {
                    trendLine.AddPoint(i, chartCandle.close);

                    if (thisSign == lastSign)
                        continue;
                }

                lastSign = thisSign;

                // завершить регион
                if (trendLine != null)
                {
                    trendLine = null;
                    continue;
                }

                if (lastSigns.Any(s => s != lastSign) || lastSigns.Length < skippedCandles) continue;
                // новая линия
                trendLine = new TrendLine
                {
                    Comment = CommentSpecName,
                    Magic = LineMagic,
                    LineColor = thisSign > 0 ? colorSell : ColorBuy
                };
                trendLine.AddPoint(i, chartCandle.close);
                lines.Add(trendLine);
            }

            MakeChartGraph(lines);
            return "Построено " + lines.Count + " областей";
        }
        private string BuildSeries()
        {
            var indi = chart.indicators.FirstOrDefault(i => i.GetType() == typeof(IndicatorExternSeries));

            if (indi == null)
            {
                return("Нет данных для построения (данные из файла)");
            }
            var indiData = indi.SeriesResult[0] as CandlestickSeries;

            if (indiData.DataCount == 0)
            {
                return("Индикатор пуст");
            }
            var candles = chart.chart.StockSeries.Data.Candles;
            var max     = Math.Min(candles.Count, indiData.DataCount);

            var lastSign  = 0;
            var lastSigns = new RestrictedQueue <int>(skippedCandles);

            var       lines     = new List <TrendLine>();
            TrendLine trendLine = null;

            for (var i = 0; i < max; i++)
            {
                var candle      = indiData.Data[i];
                var chartCandle = candles[i];
                var thisSign    = GetCaymanSign(candle);
                lastSigns.Add(thisSign);

                // растянуть регион
                if (trendLine != null)
                {
                    trendLine.AddPoint(i, chartCandle.close);

                    if (thisSign == lastSign)
                    {
                        continue;
                    }
                }

                lastSign = thisSign;

                // завершить регион
                if (trendLine != null)
                {
                    trendLine = null;
                    continue;
                }

                if (lastSigns.Any(s => s != lastSign) || lastSigns.Length < skippedCandles)
                {
                    continue;
                }
                // новая линия
                trendLine = new TrendLine
                {
                    Comment   = CommentSpecName,
                    Magic     = LineMagic,
                    LineColor = thisSign > 0 ? colorSell : ColorBuy
                };
                trendLine.AddPoint(i, chartCandle.close);
                lines.Add(trendLine);
            }

            MakeChartGraph(lines);
            return("Построено " + lines.Count + " областей");
        }