예제 #1
0
        public override void Initialize(RobotContext grobotContext, CurrentProtectedContext protectedContextx)
        {
            base.Initialize(grobotContext, protectedContextx);
            if (Graphics.Count == 0)
            {
                Logger.DebugFormat("IchimokuRobot: настройки графиков не заданы");
                return;
            }
            if (Graphics.Count > 1)
            {
                Logger.DebugFormat("IchimokuRobot: настройки графиков должны описывать один тикер / один ТФ");
                return;
            }

            mainCandlePacker = new CandlePacker(MainTimeFrame);
            dayCandlePacker  = new CandlePacker(dayTimeFrame);
            hourCandlePacker = new CandlePacker(hourTimeFrame);

            // размер этой очереди именно periodL + periodM. Это связано с тем, что рассчитать "облако" надо для "сдвинутой" назад точки, а не для текущей.
            // А что бы это сделать, нужно отступить от "сдвинутой назад точки" ещё на periodL.
            shiftBackPoints = new RestrictedQueue <CandleData>(periodL + periodM);

            subQueue = new[] { new RestrictedQueue <CandleData>(periodMSub1), new RestrictedQueue <CandleData>(periodMSub2) };

            happenIntersection = new RestrictedQueue <bool>(m);
            ticker             = Graphics[0].a;
        }
예제 #2
0
        public void BuildSeries(ChartControl chart)
        {
            tooltipSeries.data.Clear();
            averageRangeList.Clear();

            var candles        = chart.StockSeries.Data.Candles;
            var minimumCandles = PointsRange > 0 ? 5 : MaPeriod + 5;

            if (candles == null || candles.Count < minimumCandles)
            {
                return;
            }

            var   lastRanges = new RestrictedQueue <float>(MaPeriod);
            float targetSize = PointsRange > 0 ? DalSpot.Instance.GetAbsValue(chart.Symbol, (float)PointsRange) : 0;

            var series = 0;

            for (var i = 0; i < candles.Count; i++)
            {
                var candle = candles[i];
                var range  = candle.high - candle.low;
                lastRanges.Add(range);
                if (lastRanges.Length < lastRanges.MaxQueueLength && PointsRange == 0)
                {
                    averageRangeList.Add(0);
                    continue;
                }
                var avgRange = lastRanges.Average();
                averageRangeList.Add(avgRange);

                var candlePercent = range * 100 / avgRange;
                var isNarrow      = PointsRange > 0 ? range < targetSize
                    : candlePercent <= NarrowPercent;

                if (!isNarrow && series > 0)
                {
                    if (series >= CandlesToSignal)
                    {
                        // отметить, сколько процентов данная свеча составила от обычной волатильности
                        AddMark($"{candlePercent:F0}%", $"{candlePercent:F0}%", i, candle.open, false);
                    }
                    series = 0;
                    continue;
                }

                if (!isNarrow)
                {
                    continue;
                }

                series++;
                if (series >= CandlesToSignal)
                {
                    AddMark($"{series}", $"{series}", i, candle.close, true);
                }
            }
        }
        private void InitLastBidLists()
        {
            foreach (var varName in formulaVariableNames)
            {
                var queueLen   = 1;
                var tickerPart = varName.ToUpper();
                if (varName.Contains('#'))
                {
                    var indexSharp = varName.IndexOf('#');
                    if (indexSharp == 0 || indexSharp == (varName.Length - 1))
                    {
                        continue;
                    }
                    var numPart = varName.Substring(indexSharp + 1).ToIntSafe();
                    if (!numPart.HasValue)
                    {
                        continue;
                    }
                    queueLen   = numPart.Value + 1;
                    tickerPart = varName.Substring(0, indexSharp).ToUpper();
                }

                if (tickerPart == "CLOSE" || tickerPart == "OPEN" ||
                    tickerPart == "HIGH" || tickerPart == "LOW")
                {
                    tickerPart = ticker;
                }
                if (!tickerNames.Contains(tickerPart))
                {
                    continue;
                }

                if (lastBidLists.ContainsKey(tickerPart))
                {
                    if (lastBidLists[tickerPart].MaxQueueLength >= queueLen)
                    {
                        continue;
                    }
                }
                var queue = new RestrictedQueue <float>(queueLen);
                if (lastBidLists.ContainsKey(tickerPart))
                {
                    lastBidLists[tickerPart] = queue;
                }
                else
                {
                    lastBidLists.Add(tickerPart, queue);
                }

                if (tickerPart == ticker && candles.MaxQueueLength < queueLen)
                {
                    candles = new RestrictedQueue <CandleData>(queueLen);
                }
            }
        }
예제 #4
0
        /// <param name="str">строка вида "eur# gbp# chf jpy cad aud# nzd# /*коментарий*/"</param>
        public CurrencyIndexInfo(string str)//, bool sewDiffParts)
        {
            // <param name="sewDiffParts">если true - границы индекса, при появлении новой пары "сшиваются"</param>
            //this.sewDiffParts = sewDiffParts;
            // убрать коментарии
            while (true)
            {
                var startIndex = str.IndexOf("/*");
                if (startIndex < 0)
                {
                    break;
                }
                var endIndex = str.IndexOf("*/", startIndex);
                if (endIndex < 0)
                {
                    break;
                }

                var firstPart = str.Substring(0, startIndex);
                firstPart = firstPart ?? "";
                var lastPart = str.Substring(endIndex + 2, str.Length - endIndex - 2);
                lastPart = lastPart ?? "";
                str      = firstPart + lastPart;
            }

            // имя - знак - вес
            var data  = new List <Cortege3 <string, int, decimal> >();
            var parts = str.Split(' ', ',', ';', (char)9);

            foreach (var part in parts)
            {
                if (string.IsNullOrEmpty(part))
                {
                    continue;
                }
                string  symbol;
                int     sign;
                decimal weight;
                SplitSymbolInfo(part, out symbol, out sign, out weight);
                data.Add(new Cortege3 <string, int, decimal> {
                    a = symbol, b = sign, c = weight
                });
            }
            pairs   = data.Select(p => p.a).ToArray();
            signs   = data.Select(p => p.b).ToArray();
            weights = data.Select(p => p.c).ToArray();

            prevVector = new RestrictedQueue <decimal> [pairs.Length];
            for (var i = 0; i < prevVector.Length; i++)
            {
                prevVector[i] = new RestrictedQueue <decimal>(momentumPeriod);
            }
        }
예제 #5
0
 public override void Initialize(BacktestServerProxy.RobotContext robotContext, CurrentProtectedContext protectedContext)
 {
     base.Initialize(robotContext, protectedContext);
     if (Graphics.Count == 0)
     {
         return;
     }
     ticker    = Graphics[0].a;
     pointCost = DalSpot.Instance.GetAbsValue(ticker, 1f);
     if (BrickSizeAuto)
     {
         lastPrices = new RestrictedQueue <CandleData>(AutosizePeriod);
     }
     packer = new CandlePacker(Graphics[0].b);
 }
예제 #6
0
        public void BuildSeries(ChartControl chart)
        {
            seriesLine.Data.Clear();
            seriesDeltas.data.Clear();

            if (chart.StockSeries.DataCount <= periodSlow)
            {
                return;
            }

            queueFast = new RestrictedQueue <float>(periodFast);
            queueSlow = new RestrictedQueue <float>(periodSlow);

            // построить индюк
            BuildIndi(SeriesSources[0]);
        }
예제 #7
0
        public void BuildSeries(ChartControl chart)
        {
            smmaPrev = null;
            series.Data.Clear();

            var candles = chart.StockSeries.Data.Candles;

            if (candles.Count < period)
            {
                return;
            }

            queue = new RestrictedQueue <float>(period);
            // построить МА-шку
            BuildMA(SeriesSources[0]);
        }
예제 #8
0
        private static double [] ReduceTrendMA(double [] data, int maPeriod)
        {
            var maData  = new RestrictedQueue <double>(maPeriod);
            var outData = new List <double>();

            for (var i = 0; i < data.Length; i++)
            {
                maData.Add(data[i]);
                if (maData.Length < maPeriod)
                {
                    continue;
                }
                var ma = maData.Average();
                outData.Add(data[i] / ma);
            }
            return(outData.ToArray());
        }
예제 #9
0
        public CurrencyIndexInfo(string[] _pairs, int[] _signs)
        {
            pairs = _pairs;
            signs = _signs;

            prevVector = new RestrictedQueue <decimal> [pairs.Length];
            for (var i = 0; i < prevVector.Length; i++)
            {
                prevVector[i] = new RestrictedQueue <decimal>(momentumPeriod);
            }
            // веса по-умолчанию
            weights = new decimal[pairs.Length];
            for (var i = 0; i < weights.Length; i++)
            {
                weights[i] = 1;
            }
        }
예제 #10
0
        public void BuildSeries(ChartControl chart)
        {
            smmaPrev = null;
            series.Data.Clear();
            seriesUp.Data.Clear();
            seriesDn.Data.Clear();

            if (chart.StockSeries.DataCount < period)
            {
                return;
            }

            queue       = new RestrictedQueue <float>(period);
            queueDisper = new RestrictedQueue <float>(period);

            // построить индюк
            BuildBollinger(SeriesSources[0]);
        }
예제 #11
0
 public override void Initialize(BacktestServerProxy.RobotContext grobotContext,
                                 Contract.Util.BL.CurrentProtectedContext protectedContextx)
 {
     base.Initialize(grobotContext, protectedContextx);
     if (Graphics.Count == 0)
     {
         Logger.DebugFormat("CaymanRobot: настройки графиков не заданы");
         return;
     }
     if (Graphics.Count > 1)
     {
         Logger.DebugFormat("CaymanRobot: настройки графиков должны описывать один тикер / один ТФ");
         return;
     }
     packer          = new CandlePacker(Graphics[0].b);
     ticker          = Graphics[0].a;
     caymanLastSigns = new RestrictedQueue <int>(SkipCandles);
     ReadCaymanHistory();
 }
예제 #12
0
        public override void Initialize(BacktestServerProxy.RobotContext grobotContext, Contract.Util.BL.CurrentProtectedContext protectedContextx)
        {
            base.Initialize(grobotContext, protectedContextx);
            if (Graphics.Count == 0)
            {
                Logger.DebugFormat("RobotMA: настройки графиков не заданы");
                return;
            }
            if (Graphics.Count > 1)
            {
                Logger.DebugFormat("RobotMA: настройки графиков должны описывать один тикер / один ТФ");
                return;
            }
            packer     = new CandlePacker(Graphics[0].b);
            ticker     = Graphics[0].a;
            stopLoss   = null;
            takeProfit = null;


            extremumRangeQueue = new RestrictedQueue <CandleData>(ExtremumRange * 2 + 1);
            extremumQueue      = new RestrictedQueue <Cortege3 <float, bool, DateTime> >(4);
        }
예제 #13
0
        private static double CalculateRsi(RestrictedQueue <PriceRsi> currentPairs)
        {
            var u = 0f;
            var d = 0f;

            for (var i = 1; i < currentPairs.MaxQueueLength; i++)
            {
                var deltaPrice = currentPairs.ElementAt(i).Price - currentPairs.ElementAt(i - 1).Price;
                if (deltaPrice < 0)
                {
                    d -= deltaPrice;
                }
                else
                {
                    u += deltaPrice;
                }
            }

            var rsi = (u == 0 && d == 0) ? 50 : 100 * u / (u + d);

            return(rsi);
        }
예제 #14
0
        //, bool sewDiffParts)
        /// <param name="str">строка вида "eur# gbp# chf jpy cad aud# nzd# /*коментарий*/"</param>        
        public CurrencyIndexInfo(string str)
        {
            // <param name="sewDiffParts">если true - границы индекса, при появлении новой пары "сшиваются"</param>
            //this.sewDiffParts = sewDiffParts;
            // убрать коментарии
            while (true)
            {
                var startIndex = str.IndexOf("/*");
                if (startIndex < 0) break;
                var endIndex = str.IndexOf("*/", startIndex);
                if (endIndex < 0) break;

                var firstPart = str.Substring(0, startIndex);
                firstPart = firstPart ?? "";
                var lastPart = str.Substring(endIndex + 2, str.Length - endIndex - 2);
                lastPart = lastPart ?? "";
                str = firstPart + lastPart;
            }

            // имя - знак - вес
            var data = new List<Cortege3<string, int, decimal>>();
            var parts = str.Split(' ', ',', ';', (char)9);
            foreach (var part in parts)
            {
                if (string.IsNullOrEmpty(part)) continue;
                string symbol;
                int sign;
                decimal weight;
                SplitSymbolInfo(part, out symbol, out sign, out weight);
                data.Add(new Cortege3<string, int, decimal> { a = symbol, b = sign, c = weight });
            }
            pairs = data.Select(p => p.a).ToArray();
            signs = data.Select(p => p.b).ToArray();
            weights = data.Select(p => p.c).ToArray();

            prevVector = new RestrictedQueue<decimal>[pairs.Length];
            for (var i = 0; i < prevVector.Length; i++)
                prevVector[i] = new RestrictedQueue<decimal>(momentumPeriod);
        }
예제 #15
0
        public override void Initialize(BacktestServerProxy.RobotContext grobotContext)
        {
            base.Initialize(grobotContext);
            // проверка настроек графиков
            if (Graphics.Count == 0)
            {
                Logger.DebugFormat("OscillatorBasedRobot: настройки графиков не заданы");
                return;
            }
            if (Graphics.Count > 1)
            {
                Logger.DebugFormat("OscillatorBasedRobot: настройки графиков должны описывать один тикер / один ТФ");
                return;
            }
            ticker = Graphics[0].a;

            try
            {
                formulaResolver      = new ExpressionResolver(indexFormula);
                formulaVariableNames = formulaResolver.GetVariableNames();
                lastBids             = new Dictionary <string, float>();
                lastIndicies         = new RestrictedQueue <float>(CandlesInIndexHistory);
                candles      = new RestrictedQueue <CandleData>(CandlesInIndexHistory);
                packer       = new CandlePacker(Graphics[0].b);
                indexPeaks   = new List <Cortege3 <float, int, float> >();
                tickerNames  = DalSpot.Instance.GetTickerNames();
                randomGener  = new Random(DateTime.Now.Millisecond);
                lastBidLists = new Dictionary <string, RestrictedQueue <float> >();
                // по каждой валютной паре найти макс. количество отсчетов (из формулы индекса)
                InitLastBidLists();
            }
            catch (Exception ex)
            {
                Logger.ErrorFormat("OscillatorBasedRobot: ошибка парсинга выражения \"{0}\": {1}",
                                   indexFormula, ex);
                formulaResolver = null;
            }
        }
예제 #16
0
        public override void Initialize(BacktestServerProxy.RobotContext grobotContext, CurrentProtectedContext protectedContextx)
        {
            base.Initialize(grobotContext, protectedContextx);
            if (Graphics.Count == 0)
            {
                Logger.DebugFormat("RobotMA: настройки графиков не заданы");
                return;
            }
            if (Graphics.Count > 1)
            {
                Logger.DebugFormat("RobotMA: настройки графиков должны описывать один тикер / один ТФ");
                return;
            }
            packer    = new CandlePacker(Graphics[0].b);
            ticker    = Graphics[0].a;
            maDifSign = 0;
            queueSlow = new RestrictedQueue <float>(RangeSlowMA);
            queueFast = new RestrictedQueue <float>(RangeFastMA);

            virtualDeal    = null;
            prevSign       = 0;
            virtualResults = new RestrictedQueue <float>(PeriodVirtualResults);
        }
예제 #17
0
        /// <summary>
        /// Проверяет, является ли средний элемент в "queue" локальным экстремумом
        /// </summary>
        private void CheckExtremum(RestrictedQueue <CandleData> queue)
        {
            bool isMax = true, isMin = true;

            // Проверяемая на экстремум свеча
            var checkingCandle = queue.ElementAt(ExtremumRange);

            for (var i = 0; i < queue.MaxQueueLength; i++)
            {
                if (i == ExtremumRange)
                {
                    continue;
                }
                var candle = queue.ElementAt(i);
                if (checkingCandle.close <= candle.close)
                {
                    isMax = false;
                }
                if (checkingCandle.close >= candle.close)
                {
                    isMin = false;
                }
                if (!isMax && !isMin)
                {
                    return;
                }
            }

            if (isMax)
            {
                extremumQueue.Add(new Cortege3 <float, bool, DateTime>(checkingCandle.close, true, checkingCandle.timeClose));
            }
            if (isMin)
            {
                extremumQueue.Add(new Cortege3 <float, bool, DateTime>(checkingCandle.close, false, checkingCandle.timeClose));
            }
        }
예제 #18
0
        public CurrencyIndexInfo(string[] _pairs, int[] _signs)
        {
            pairs = _pairs;
            signs = _signs;

            prevVector = new RestrictedQueue<decimal>[pairs.Length];
            for (var i = 0; i < prevVector.Length; i++)
                prevVector[i] = new RestrictedQueue<decimal>(momentumPeriod);
            // веса по-умолчанию
            weights = new decimal[pairs.Length];
            for (var i = 0; i < weights.Length; i++) weights[i] = 1;
        }
예제 #19
0
        public void BuildSeries(ChartControl chart)
        {
            smmaPrev = null;
            series.Data.Clear();

            var candles = chart.StockSeries.Data.Candles;
            if (candles.Count < period) return;

            queue = new RestrictedQueue<float>(period);
            // построить МА-шку
            BuildMA(SeriesSources[0]);
        }
예제 #20
0
        private void InitLastBidLists()
        {
            foreach (var varName in formulaVariableNames)
            {
                var queueLen = 1;
                var tickerPart = varName.ToUpper();
                if (varName.Contains('#'))
                {
                    var indexSharp = varName.IndexOf('#');
                    if (indexSharp == 0 || indexSharp == (varName.Length - 1)) continue;
                    var numPart = varName.Substring(indexSharp + 1).ToIntSafe();
                    if (!numPart.HasValue) continue;
                    queueLen = numPart.Value + 1;
                    tickerPart = varName.Substring(0, indexSharp).ToUpper();
                }

                if (tickerPart == "CLOSE" || tickerPart == "OPEN" ||
                    tickerPart == "HIGH" || tickerPart == "LOW")
                    tickerPart = ticker;
                if (!tickerNames.Contains(tickerPart)) continue;

                if (lastBidLists.ContainsKey(tickerPart))
                    if (lastBidLists[tickerPart].MaxQueueLength >= queueLen) continue;
                var queue = new RestrictedQueue<float>(queueLen);
                if (lastBidLists.ContainsKey(tickerPart))
                    lastBidLists[tickerPart] = queue;
                else lastBidLists.Add(tickerPart, queue);

                if (tickerPart == ticker && candles.MaxQueueLength < queueLen)
                    candles = new RestrictedQueue<CandleData>(queueLen);
            }
        }
예제 #21
0
        public override void Initialize(BacktestServerProxy.RobotContext grobotContext)
        {
            base.Initialize(grobotContext);
            // проверка настроек графиков
            if (Graphics.Count == 0)
            {
                Logger.DebugFormat("OscillatorBasedRobot: настройки графиков не заданы");
                return;
            }
            if (Graphics.Count > 1)
            {
                Logger.DebugFormat("OscillatorBasedRobot: настройки графиков должны описывать один тикер / один ТФ");
                return;
            }
            ticker = Graphics[0].a;

            try
            {
                formulaResolver = new ExpressionResolver(indexFormula);
                formulaVariableNames = formulaResolver.GetVariableNames();
                lastBids = new Dictionary<string, float>();
                lastIndicies = new RestrictedQueue<float>(CandlesInIndexHistory);
                candles = new RestrictedQueue<CandleData>(CandlesInIndexHistory);
                packer = new CandlePacker(Graphics[0].b);
                indexPeaks = new List<Cortege3<float, int, float>>();
                tickerNames = DalSpot.Instance.GetTickerNames();
                randomGener = new Random(DateTime.Now.Millisecond);
                lastBidLists = new Dictionary<string, RestrictedQueue<float>>();
                // по каждой валютной паре найти макс. количество отсчетов (из формулы индекса)
                InitLastBidLists();
            }
            catch (Exception ex)
            {
                Logger.ErrorFormat("OscillatorBasedRobot: ошибка парсинга выражения \"{0}\": {1}",
                                   indexFormula, ex);
                formulaResolver = null;
            }
        }
예제 #22
0
        public void BuildSeries(ChartControl chart)
        {
            seriesK.Data.Clear();
            seriesD.Data.Clear();
            seriesBounds.parts.Clear();

            if (SeriesSources.Count == 0) return;
            var source = SeriesSources[0];
            if (source.DataCount == 0) return;

            if (source is CandlestickSeries == false &&
                source is LineSeries == false) return;

            // границы
            if (lowerBound > 0)
                seriesBounds.parts.Add(new List<PartSeriesPoint>
                                       {
                                           new PartSeriesPoint(1, lowerBound),
                                           new PartSeriesPoint(source.DataCount, lowerBound)
                                       });
            if (upperBound > 0 && upperBound < 100)
            seriesBounds.parts.Add(new List<PartSeriesPoint>
                                       {
                                           new PartSeriesPoint(1, upperBound),
                                           new PartSeriesPoint(source.DataCount, upperBound)
                                       });

            queue = new RestrictedQueue<float>(period);
            queueMA = new RestrictedQueue<float>(periodMA);

            for (var i = 0; i < source.DataCount; i++)
            {
                var price =
                    source is CandlestickSeries
                        ? ((CandlestickSeries) source).Data.Candles[i].close
                        : ((LineSeries) source).GetPrice(i) ?? 0;
                queue.Add(price);

                if (queue.Length < period)
                {
                    seriesK.Data.Add(50);
                    seriesD.Data.Add(50);
                    continue;
                }
                var minValue = float.MaxValue;
                var maxValue = float.MinValue;
                foreach (var p in queue)
                {
                    if (p < minValue) minValue = p;
                    if (p > maxValue) maxValue = p;
                }
                var range = maxValue - minValue;
                var k = range == 0 ? 50 : 100*(price - minValue)/range;
                queueMA.Add(k);
                var d = queueMA.Length == periodMA ? queueMA.Average() : k;

                seriesK.Data.Add(k);
                seriesD.Data.Add(d);
            }
        }
예제 #23
0
        public void BuildSeries(ChartControl chart)
        {
            tooltipSeries.data.Clear();
            averageRangeList.Clear();
            seriesUp.Data.Clear();
            seriesDn.Data.Clear();

            var candles        = chart.StockSeries.Data.Candles;
            var minimumCandles = PointsRange > 0 ? 5 : MaPeriod + 5;

            if (candles == null || candles.Count < minimumCandles)
            {
                return;
            }

            var   lastRanges = new RestrictedQueue <float>(MaPeriod);
            var   lastHL     = new RestrictedQueue <float>(MaPeriod);
            float targetSize = PointsRange > 0 ? DalSpot.Instance.GetAbsValue(chart.Symbol, (float)PointsRange) : 0;

            var curFrame = candles.Take(FrameLength).ToList();

            lastRanges.Add(curFrame.Max(c => c.high) - curFrame.Min(c => c.low));

            seriesUp.Data.Add(candles[0].high);
            seriesDn.Data.Add(candles[0].low);
            for (var i = 0; i < FrameLength; i++)
            {
                averageRangeList.Add(0);
                seriesUp.Data.Add(candles[i].high);
                seriesDn.Data.Add(candles[i].low);
            }
            var breakCandleLengthPercents = new List <float>();
            var prevFrameIsNarrow         = false;

            for (var i = FrameLength; i < candles.Count; i++)
            {
                var candle = candles[i];
                curFrame.RemoveAt(0);
                curFrame.Add(candle);

                var high = curFrame[0].high;
                var low  = curFrame[0].low;
                foreach (var c in curFrame.Skip(1))
                {
                    if (c.high > high)
                    {
                        high = c.high;
                    }
                    if (c.low < low)
                    {
                        low = c.low;
                    }
                }
                var range = high - low;
                lastRanges.Add(range);
                lastHL.Add(candle.high - candle.low);

                if (lastRanges.Length < lastRanges.MaxQueueLength && PointsRange == 0)
                {
                    averageRangeList.Add(0);
                    seriesUp.Data.Add(candles[i].high);
                    seriesDn.Data.Add(candles[i].low);
                    continue;
                }
                var avgRange = lastRanges.Average();
                averageRangeList.Add(avgRange);
                seriesUp.Data.Add(candles[i].close + range);
                seriesDn.Data.Add(candles[i].close - range);

                var avgHl        = lastHL.Average();
                var rangePercent = avgRange == 0 ? 0 : range * 100 / avgRange;
                var isNarrow     = PointsRange > 0 ? range < targetSize
                    : rangePercent <= NarrowPercent;

                if (prevFrameIsNarrow) // && !isNarrow)
                {
                    // отметить, сколько процентов данная свеча составила от обычной волатильности
                    var candlePercent = avgHl == 0 ? 0 : (candle.high - candle.low) * 100 / avgHl;
                    if (candlePercent > 0)
                    {
                        breakCandleLengthPercents.Add(candlePercent);
                    }
                    AddMark($"{candlePercent:F0}%", $"{candlePercent:F0}%", i, candle.open, false);
                }
                prevFrameIsNarrow = isNarrow;
            }

            // вывести в лог среднее
            if (breakCandleLengthPercents.Count > 0)
            {
                avgBreakCandle = breakCandleLengthPercents.Average();
                minBreakCandle = breakCandleLengthPercents.Min();
                maxBreakCandle = breakCandleLengthPercents.Max();
                breaksCount    = breakCandleLengthPercents.Count;
                Logger.Info($"{breakCandleLengthPercents.Count}, от {minBreakCandle:F1} до {maxBreakCandle:F1}, среднее: {avgBreakCandle:F1}");
            }
        }
예제 #24
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 void PlaceMarkers()
        {
            var candles = chart.chart.StockSeries.Data.Candles;

            if (candles.Count <= FrameLength + MaPeriod)
            {
                return;
            }

            var lastRanges = new RestrictedQueue <float>(MaPeriod);

            var curFrame = candles.Take(FrameLength).ToList();

            lastRanges.Add(curFrame.Max(c => c.high));

            var prevFrameIsNarrow = false;

            for (var i = FrameLength; i < candles.Count; i++)
            {
                var candle = candles[i];
                curFrame.RemoveAt(0);
                curFrame.Add(candle);

                var high = curFrame[0].high;
                var low  = curFrame[0].low;
                foreach (var c in curFrame.Skip(1))
                {
                    if (c.high > high)
                    {
                        high = c.high;
                    }
                    if (c.low < low)
                    {
                        low = c.low;
                    }
                }
                var range = high - low;
                lastRanges.Add(range);

                if (lastRanges.Length < lastRanges.MaxQueueLength)
                {
                    continue;
                }
                var avgRange = lastRanges.Average();

                var rangePercent = avgRange == 0 ? 0 : range * 100 / avgRange;
                var isNarrow     = rangePercent <= NarrowPercent;

                if (prevFrameIsNarrow) // && !isNarrow)
                {
                    if (i <= MomentumPeriod)
                    {
                        continue;
                    }
                    var prevClose = candles[i - MomentumPeriod - 1].close;
                    if (prevClose <= 0)
                    {
                        continue;
                    }
                    var momentum = candles[i - 1].close * 100 / prevClose;
                    var side     = momentum > 100 ? -1 : 1;

                    AddMark(side, i, candles, $"M: {momentum:F1}");
                }
                prevFrameIsNarrow = isNarrow;
            }
        }
예제 #26
0
        public void BuildSeries(ChartControl chart)
        {
            seriesK.Data.Clear();
            seriesD.Data.Clear();
            seriesBounds.parts.Clear();

            if (SeriesSources.Count == 0)
            {
                return;
            }
            var source = SeriesSources[0];

            if (source.DataCount == 0)
            {
                return;
            }

            if (source is CandlestickSeries == false &&
                source is LineSeries == false)
            {
                return;
            }

            // границы
            if (lowerBound > 0)
            {
                seriesBounds.parts.Add(new List <PartSeriesPoint>
                {
                    new PartSeriesPoint(1, lowerBound),
                    new PartSeriesPoint(source.DataCount, lowerBound)
                });
            }
            if (upperBound > 0 && upperBound < 100)
            {
                seriesBounds.parts.Add(new List <PartSeriesPoint>
                {
                    new PartSeriesPoint(1, upperBound),
                    new PartSeriesPoint(source.DataCount, upperBound)
                });
            }

            queue   = new RestrictedQueue <float>(period);
            queueMA = new RestrictedQueue <float>(periodMA);

            for (var i = 0; i < source.DataCount; i++)
            {
                var price =
                    source is CandlestickSeries
                        ? ((CandlestickSeries)source).Data.Candles[i].close
                        : ((LineSeries)source).GetPrice(i) ?? 0;
                queue.Add(price);

                if (queue.Length < period)
                {
                    seriesK.Data.Add(50);
                    seriesD.Data.Add(50);
                    continue;
                }
                var minValue = float.MaxValue;
                var maxValue = float.MinValue;
                foreach (var p in queue)
                {
                    if (p < minValue)
                    {
                        minValue = p;
                    }
                    if (p > maxValue)
                    {
                        maxValue = p;
                    }
                }
                var range = maxValue - minValue;
                var k     = range == 0 ? 50 : 100 * (price - minValue) / range;
                queueMA.Add(k);
                var d = queueMA.Length == periodMA?queueMA.Average() : k;

                seriesK.Data.Add(k);
                seriesD.Data.Add(d);
            }
        }
예제 #27
0
 private static double[] ReduceTrendMA(double []data, int maPeriod)
 {
     var maData = new RestrictedQueue<double>(maPeriod);
     var outData = new List<double>();
     for (var i = 0; i < data.Length; i++)
     {
         maData.Add(data[i]);
         if (maData.Length < maPeriod) continue;
         var ma = maData.Average();
         outData.Add(data[i] / ma);
     }
     return outData.ToArray();
 }
예제 #28
0
        public void BuildSeries(ChartControl chart)
        {
            seriesLine.Data.Clear();
            seriesDeltas.data.Clear();

            if (chart.StockSeries.DataCount <= periodSlow) return;

            queueFast = new RestrictedQueue<float>(periodFast);
            queueSlow = new RestrictedQueue<float>(periodSlow);

            // построить индюк
            BuildIndi(SeriesSources[0]);
        }
예제 #29
0
        public override void Initialize(BacktestServerProxy.RobotContext grobotContext, CurrentProtectedContext protectedContextx)
        {
            base.Initialize(grobotContext, protectedContextx);
            if (Graphics.Count == 0)
            {
                Logger.DebugFormat("RobotMA: настройки графиков не заданы");
                return;
            }
            if (Graphics.Count > 1)
            {
                Logger.DebugFormat("RobotMA: настройки графиков должны описывать один тикер / один ТФ");
                return;
            }
            packer = new CandlePacker(Graphics[0].b);
            ticker = Graphics[0].a;
            maDifSign = 0;
            queueSlow = new RestrictedQueue<float>(RangeSlowMA);
            queueFast = new RestrictedQueue<float>(RangeFastMA);

            virtualDeal = null;
            prevSign = 0;
            virtualResults = new RestrictedQueue<float>(PeriodVirtualResults);
        }
예제 #30
0
        public void BuildSeries(ChartControl chart)
        {
            smmaPrev = null;
            series.Data.Clear();
            seriesUp.Data.Clear();
            seriesDn.Data.Clear();

            if (chart.StockSeries.DataCount < period) return;

            queue = new RestrictedQueue<float>(period);
            queueDisper = new RestrictedQueue<float>(period);

            // построить индюк
            BuildBollinger(SeriesSources[0]);
        }
예제 #31
0
        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 + " областей";
        }
예제 #32
0
        public override void Initialize(BacktestServerProxy.RobotContext grobotContext, Contract.Util.BL.CurrentProtectedContext protectedContextx)
        {
            base.Initialize(grobotContext, protectedContextx);
            if (Graphics.Count == 0)
            {
                Logger.DebugFormat("RobotMA: настройки графиков не заданы");
                return;
            }
            if (Graphics.Count > 1)
            {
                Logger.DebugFormat("RobotMA: настройки графиков должны описывать один тикер / один ТФ");
                return;
            }
            packer = new CandlePacker(Graphics[0].b);
            ticker = Graphics[0].a;
            stopLoss = null;
            takeProfit = null;

            extremumRangeQueue = new RestrictedQueue<CandleData>(ExtremumRange * 2 + 1);
            extremumQueue = new RestrictedQueue<Cortege3<float, bool, DateTime>>(4);
        }
예제 #33
0
        private static double CalculateRsi(RestrictedQueue<PriceRsi> currentPairs)
        {
            var u = 0f;
            var d = 0f;
            for (var i = 1; i < currentPairs.MaxQueueLength; i++)
            {
                var deltaPrice = currentPairs.ElementAt(i).Price - currentPairs.ElementAt(i - 1).Price;
                if (deltaPrice < 0)
                    d -= deltaPrice;
                else
                    u += deltaPrice;
            }

            var rsi = (u == 0 && d == 0) ? 50 : 100 * u / (u + d);
            return rsi;
        }
예제 #34
0
        /// <summary>
        /// Проверяет, является ли средний элемент в "queue" локальным экстремумом
        /// </summary>
        private void CheckExtremum(RestrictedQueue<CandleData> queue)
        {
            bool isMax = true, isMin = true;

            // Проверяемая на экстремум свеча
            var checkingCandle = queue.ElementAt(ExtremumRange);

            for (var i = 0; i < queue.MaxQueueLength; i++)
            {
                if (i == ExtremumRange) continue;
                var candle = queue.ElementAt(i);
                if (checkingCandle.close <= candle.close) isMax = false;
                if (checkingCandle.close >= candle.close) isMin = false;
                if (!isMax && !isMin) return;
            }

            if (isMax) extremumQueue.Add(new Cortege3<float, bool, DateTime>(checkingCandle.close, true, checkingCandle.timeClose));
            if (isMin) extremumQueue.Add(new Cortege3<float, bool, DateTime>(checkingCandle.close, false, checkingCandle.timeClose));
        }
예제 #35
0
        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 + " областей");
        }