/// <summary> /// отрисовать осноной чарт /// </summary> public void PaintPrimeChart() { if (string.IsNullOrEmpty(SecurityToInter)) { return; } if (_chartHost == null || _rectChart == null) { return; } _chart.Clear(); _chart.StartPaint(_chartHost, _rectChart); MinerCandleSeries series = CandleSeries.Find(ser => ser.Security.Name == SecurityToInter); if (series == null) { return; } _chart.SetCandles(series.Candles); if (_volume == null) { _volume = new Volume("Volume", false); _volume = (Volume)_chart.CreateIndicator(_volume, "VolumeArea"); } _volume.Process(series.Candles); }
/// <summary> /// место работы потока майнинга /// </summary> private void MiningThreadPlace() { int curNum = 0; MinerCandleSeries mySeries = CandleSeries.Find(ser => ser.Security.Name == SecurityToInter); _testResults = new List <TestResult>(); while (true) { curNum++; _curIndex = curNum; if (_neadToStopMining) { StopMiningProcces(); return; } if (curNum >= mySeries.Candles.Count) { StopMiningProcces(); MessageBox.Show("Поиск паттернов завершён. Мы проверили все данные"); return; } decimal profit = 0; for (int i = 0; i < PositionsInTrades.Count; i++) { profit += PositionsInTrades[i].ProfitOperationPunkt; } decimal mO = 0; if (PositionsInTrades.Count != 0) { mO = profit / PositionsInTrades.Count; } if (MiningMo < Math.Abs(mO) && MiningDealsCount < PositionsInTrades.Count && MiningProfit < Math.Abs(profit)) { StopMiningProcces(); return; } GetPatternToIndex(); BackTestTempPattern(false); TestResult result = new TestResult(); result.Pattern = GetTempPattern(_curTempPatternType).GetCopy(); result.Positions = PositionsInTrades; result.ShortReport = GetShortReport(); _testResults.Add(result); } }
/// <summary> /// взять временный паттерн по интексу /// </summary> public void GetPatternToIndex() { if (_curIndex == 0) { return; } IPattern pattern = GetTempPattern(_curTempPatternType); if (string.IsNullOrEmpty(SecurityToInter)) { SendNewLogMessage("Установите бумагу для торговли", LogMessageType.Error); return; } if (WeigthToTempPattern <= 0) { SendNewLogMessage("Вес не может быть нулевым", LogMessageType.Error); return; } if (PatternsToOpen.Count == 0 && PlaceToUsePattern == UsePatternType.ClosePosition) { SendNewLogMessage("Нельзя устанавливать паттерн на закрытие позиций в тот момент когда нет ни одного паттерна на открытие!", LogMessageType.Error); return; } _chart.StartPaint(_chartHost, _rectChart); MinerCandleSeries series = CandleSeries.Find(ser => ser.Security.Name == SecurityToInter); if (series == null) { SendNewLogMessage("Не найдены исторические данные, установленные для торговли по этому инструменту!", LogMessageType.Error); return; } pattern.SetFromIndex(series.Candles, _chart.Indicators, _curIndex); PaintTempPattern(); }
/// <summary> /// оттестировать паттерны /// </summary> private void Test(List <IPattern> patternsToInter, List <IPattern> patternsToExit) { MinerCandleSeries candlesToTrade = GetCandleSeries(SecurityToInter); ColorSeries = new List <ChartColorSeries>(); PositionsInTrades = new List <Position>(); _numPatternToWatch = 0; if (candlesToTrade == null) { SendNewLogMessage("Выбранная серия для торговли отсутствует.", LogMessageType.Error); return; } if (StopOrderIsOn == false && ProfitOrderIsOn == false && TrailingStopIsOn == false && ExitFromSomeCandlesIsOn == false && PatternsToClose.Count == 0) { SendNewLogMessage("Не выбран не один способ закрытия позиции. Тестирование не возможно", LogMessageType.Error); return; } List <List <Candle> > candlesParallelPatternsToInter = new List <List <Candle> >(); for (int i = 0; i < patternsToInter.Count; i++) { MinerCandleSeries series = CandleSeries.Find(ser => ser.Security.Name == _securityToInter); if (series != null) { candlesParallelPatternsToInter.Add(series.Candles); } } if (patternsToInter.Count != candlesParallelPatternsToInter.Count) { SendNewLogMessage("К паттрнам на ОТКРЫТИЕ не удалось найти всех нужных серий данных. Перейдите в соответствующую вкладку и назначте всем паттернам серию данных.", LogMessageType.Error); return; } List <List <Candle> > candlesParallelPatternsToExit = new List <List <Candle> >(); for (int i = 0; i < patternsToExit.Count; i++) { MinerCandleSeries series = CandleSeries.Find(ser => ser.Security.Name == _securityToInter); if (series != null) { candlesParallelPatternsToExit.Add(series.Candles); } } if (patternsToExit.Count != candlesParallelPatternsToExit.Count) { SendNewLogMessage("К паттрнам на ЗАКРЫТИЕ не удалось найти всех нужных серий данных. Перейдите в соответствующую вкладку и назначте всем паттернам серию данных.", LogMessageType.Error); return; } int indexWithPosition = 0; for (int i = 0; i < candlesToTrade.Candles.Count - 1; i++) {// первый цикл ищет входы if (LotsCount == LotsCountType.One && indexWithPosition > i) { continue; } if (CheckInter(PatternsToOpen, candlesParallelPatternsToInter, i, candlesToTrade.Candles[i].TimeStart, WeigthToInter) == false) { continue; } Position position = CreatePosition(candlesToTrade.Candles[i + 1].Open, candlesToTrade.Security, i, candlesToTrade.Candles[i + 1].TimeStart); if (StopOrderIsOn) { if (position.Direction == Side.Buy) { position.StopOrderPrice = position.EntryPrice - candlesToTrade.Security.PriceStep * StopOrderValue; } else { position.StopOrderPrice = position.EntryPrice + candlesToTrade.Security.PriceStep * StopOrderValue; } } if (ProfitOrderIsOn) { if (position.Direction == Side.Buy) { position.ProfitOrderPrice = position.EntryPrice + candlesToTrade.Security.PriceStep * ProfitOrderValue; } else { position.ProfitOrderPrice = position.EntryPrice - candlesToTrade.Security.PriceStep * ProfitOrderValue; } } if (TrailingStopIsOn) { if (position.Direction == Side.Buy) { position.StopOrderRedLine = position.EntryPrice - candlesToTrade.Security.PriceStep * TreilingStopValue; } else { position.StopOrderRedLine = position.EntryPrice + candlesToTrade.Security.PriceStep * TreilingStopValue; } } for (int i2 = i; i2 < candlesToTrade.Candles.Count - 1; i2++) {// второй цикл ищет выходы if (CheckExit(position, patternsToExit, candlesParallelPatternsToExit, i2, candlesToTrade.Candles[i2].TimeStart, candlesToTrade.Candles[i2].Close, candlesToTrade) == false) { continue; } indexWithPosition = i2; ClosePosition(position, i2, candlesToTrade.Candles[i2 + 1].TimeStart, candlesToTrade.Candles[i2 + 1].Open); PositionsInTrades.Add(position); break; } } }