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; }
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); } } }
/// <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); } }
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); }
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]); }
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]); }
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()); }
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; } }
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]); }
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(); }
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); }
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); }
//, 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); }
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; } }
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); }
/// <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)); } }
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; }
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]); }
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); } }
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; } }
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); } }
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}"); } }
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; } }
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); } }
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(); }
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]); }
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); }
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]); }
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 + " областей"; }
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); }
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; }
/// <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)); }
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 + " областей"); }