Добрый день! Тренируюсь на простой стратегии но вот что-то работать код не желает. событие onrunning стреляет а дальше тишина, onprocess вообще не вызывается. старт и стоп работают
версия библиотек последняя, вот код
```csharp
public class SmaStrategy : TimeFrameStrategy { private readonly CandleManager _candleManager; //private bool _isShortLessThenLong; private DateTime _nextTime; public SmaStrategy(CandleManager _candleManager, Security _security, int P1, int P2, int P3, int P4, TimeSpan _timeFrame) : base(_timeFrame) { //конструктор this.Security = _security; this.TimeFrame = _timeFrame; }
protected override void OnRunning()
{
// заполняем массив данных первоначальными значениями
//вычисляем параметр nextTime
_nextTime = base.TimeFrame.GetCandleBounds(base.Trader).Max;
Logger.Info("start NT " + _nextTime);
return;
}
protected override StrategyProcessResults OnProcess()
{
this.Volume = this.Volume + 1;
// если наша стратегия в процессе остановки
if (base.ProcessState == StrategyProcessStates.Stopping)
{
// отменяем активные заявки
Logger.Info("stopping...");
base.CancelActiveOrders();
// так как все активные заявки гарантированно были отменены, то возвращаем StrategyProcessResults.Stop
return StrategyProcessResults.Stop;
}
// событие обработки торговой стратегии вызвалось впервый раз, что раньше, чем окончания текущей 5-минутки.
if (base.Trader.MarketTime < _nextTime)
{
// возвращаем StrategyProcessResults.Continue, так как наш алгоритм еще не закончил свою работу, а просто ожидает следующего вызова.
return StrategyProcessResults.Continue;
}
// получаем сформированную свечку
var candle = _candleManager.GetTimeFrameCandle(this.Security,this.TimeFrame, DateTime.Now);
// если свечки не существует (не было ни одной сделке в тайм-фрейме), то ждем окончания следующей свечки.
if (candle == null)
{
Logger.Info("candle=null");
// если прошло больше 10 секунд с момента окончания свечки, а она так и не появилась,
// значит сделок в прошедшей 5-минутке не было, и переходим на следующую свечку
if ((base.Trader.MarketTime - _nextTime) > TimeSpan.FromSeconds(10))
_nextTime += base.TimeFrame;
return StrategyProcessResults.Continue;
}
_nextTime = _nextTime + this.TimeFrame;
Logger.Info("NT " + _nextTime);
Logger.Info("Расчет!");
return StrategyProcessResults.Continue;
}
}
Comentarios (9)
Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario
В процессе отладки получаю такие данные Более 3 минут не ждал. По идее на 1 минуту должна срабатывать.
03:45:50 | Info | | ProcessState Runned 03:45:50 | Info | | TimeFrame 00:01:00 03:45:50 | Info | | Security SBER-9.11@FORTS 03:45:50 | Info | | Trader StockSharp.AlfaDirect.AlfaTrader 03:45:50 | Info | | Volume 1 03:45:50 | Info | | ErrorCount 0 03:45:50 | Info | | IsDisposed False 03:45:50 | Info | | Portfolio 5555 03:45:50 | Info | | Name SS 03:45:50 | Info | | ID d1b20985-f3c1-40ec-a4b0-9fd2419005b4 03:45:50 | Info | | TotalWorkingTime 00:01:17.3628305
Откуда это всё печатается?
Попробуйте поставить Interval у TimeFrameStrategy поменьше - в 1 или 5 секунд, к примеру.
Печатается по нажатию на кнопку формы (просто опрос свойств стратегии) в окно отладчика.
Так если свечки минутные, то вроде как и интервал нужно минутный в этом свойстве задавать? или эти свойства не связаны?
Покажите код по созданию стратегии и откуда это печатается. Это не связанные свойства. По умолчанию Interval = TimeFrame.
Создание стратегии в блоке FormLoad
На форме есть кнопка, жмем ее и получаем
При нажатии на 2-ю кнопку
Откуда это всё печатается?
Попробуйте поставить Interval у TimeFrameStrategy поменьше - в 1 или 5 секунд, к примеру.
Это, Саня, вероятно у меня в Альфе недоделки. А Logger это из альфа-коннетора.
Прикрепите проект, где можно воспроизвести эту проблему. Место этому топику в разделе Альфа-Директ.
Прошу прощения за кривое перемещение топика. Поправил.
Проект, к сожалению, уже переделан под событийную модель (без использования класса strategy), поэтому выложить не смогу. в принципе, основной код в начале топика