Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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);
            }
        }
Exemple #3
0
        /// <summary>
        /// взять серию данных по имени
        /// </summary>
        private MinerCandleSeries GetCandleSeries(string name)
        {
            if (CandleSeries == null)
            {
                return(null);
            }
            MinerCandleSeries candles = null;

            for (int i = 0; i < CandleSeries.Count; i++)
            {
                if (CandleSeries[i].Security.Name == name)
                {
                    candles = CandleSeries[i];
                }
            }
            return(candles);
        }
Exemple #4
0
        /// <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();
        }
Exemple #5
0
        /// <summary>
        /// проверить выход из позиции
        /// </summary>
        private bool CheckExit(Position position, List <IPattern> patterns, List <List <Candle> > series, int index, DateTime time, decimal price, MinerCandleSeries tradeSeries)
        {
            if (CheckInter(patterns, series, index, time, WeigthToExit))
            { // если выходим по паттернам
                return(true);
            }

            // проверить стоп

            if (StopOrderIsOn)
            {
                if (position.Direction == Side.Buy &&
                    price < position.StopOrderPrice)
                {
                    return(true);
                }
                else if (position.Direction == Side.Sell &&
                         price > position.StopOrderPrice)
                {
                    return(true);
                }
            }

            if (TrailingStopIsOn)
            {
                if (position.Direction == Side.Buy &&
                    price < position.StopOrderRedLine)
                {
                    return(true);
                }
                else if (position.Direction == Side.Sell &&
                         price > position.StopOrderRedLine)
                {
                    return(true);
                }

                if (position.Direction == Side.Buy)
                {
                    decimal newTrail = position.EntryPrice - tradeSeries.Security.PriceStep * TreilingStopValue;

                    if (newTrail > position.StopOrderRedLine)
                    {
                        position.StopOrderRedLine = newTrail;
                    }
                }
                else
                {
                    decimal newTrail = position.EntryPrice + tradeSeries.Security.PriceStep * TreilingStopValue;

                    if (newTrail < position.StopOrderRedLine)
                    {
                        position.StopOrderRedLine = newTrail;
                    }
                }
            }

            // проверить профит

            if (ProfitOrderIsOn)
            {
                if (position.Direction == Side.Buy &&
                    price > position.ProfitOrderPrice)
                {
                    return(true);
                }
                else if (position.Direction == Side.Sell &&
                         price < position.ProfitOrderPrice)
                {
                    return(true);
                }
            }

            // проверить выход по времени

            if (ExitFromSomeCandlesIsOn)
            {
                if (position.OpenOrders[0].NumberUser + ExitFromSomeCandlesValue <= index)
                {
                    return(true);
                }
            }

            return(false);
        }
Exemple #6
0
        /// <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;
                }
            }
        }