/// <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); } } }