Beispiel #1
0
        /// <summary>
        /// Содержит главную логику робота по анализу свечей и принятия решений о заключении сделок. Этот метод открытый, потому что он используется при
        /// тестировании робота.
        /// </summary>
        public void CandlesAnalysisAndTrade(CandleData candle, bool isHistoryStartOff)
        {
            if (virtualDeal != null)
            {
                var virtDealResult = DalSpot.Instance.GetPointsValue(ticker, virtualDeal.Side * (candle.close - virtualDeal.PriceEnter));
                virtualResults.DequeueLast();
                virtualResults.Add(virtDealResult);
            }

            var currentSign = Math.Sign(queueFast.Average() - queueSlow.Average()); // Вычисляем текущее расположение скользящих средних

            try
            {
                if (prevSign == 0 || prevSign == currentSign)
                {
                    return;
                }
                // СС пересеклись
                // Считаем средней результат виртуальных сделок
                var avgVirtualResult = virtualResults.Length == 0 ? 0 : virtualResults.Average();

                // Если следний редультат виртуальных сделок не входит в диапазон "не торговать", то высчитываем знак текущей сделки
                maDifSign = Math.Abs(avgVirtualResult) < unknownUnitProfit ? 0 : Math.Sign(avgVirtualResult);

                // "На будущее" запоминаем текущую стуацию, для расчёта виртуальных сделок на следующих итерациях
                virtualDeal = new MarketOrder
                {
                    PriceEnter = candle.close,
                    Side       = currentSign
                };
                virtualResults.Add(0); // тут будет результат новой сделки на следующей итерации

                // пересечение скользящих средних произошло не на истории
                if (!isHistoryStartOff)
                {
                    List <MarketOrder> orders;
                    robotContext.GetMarketOrders(robotContext.AccountInfo.ID, out orders);
                    var tradeSide = deriveSiteFromHistory ? currentSign * maDifSign : currentSign;
                    Trade(candle, orders, tradeSide);
                }
            }
            finally
            {
                prevSign = currentSign;

                if (debugAction != null)
                {
                    debugAction(new RobotMAInnerState
                    {
                        maDifSign   = maDifSign,
                        maValueFast = queueFast.Average(),
                        maValueSlow = queueSlow.Average(),
                        lastCandle  = candle,
                    },
                                candle.timeClose);
                }
            }
        }