Не вызывается OnProcess
Atom
28.06.2011
freewayrider


Добрый день! Тренируюсь на простой стратегии но вот что-то работать код не желает. событие 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;
	}
}

Теги:


Спасибо:


freewayrider

Фотография
Дата: 28.06.2011
Ответить


В процессе отладки получаю такие данные Более 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

Спасибо:

Alexander

Фотография
Дата: 28.06.2011
Ответить


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 секунд, к примеру.

Спасибо:

freewayrider

Фотография
Дата: 29.06.2011
Ответить


Alexander: Откуда это всё печатается?

Попробуйте поставить Interval у TimeFrameStrategy поменьше - в 1 или 5 секунд, к примеру.

Печатается по нажатию на кнопку формы (просто опрос свойств стратегии) в окно отладчика.

Так если свечки минутные, то вроде как и интервал нужно минутный в этом свойстве задавать? или эти свойства не связаны?

Спасибо:

Alexander

Фотография
Дата: 29.06.2011
Ответить


freewayrider:

Alexander: Откуда это всё печатается?

Попробуйте поставить Interval у TimeFrameStrategy поменьше - в 1 или 5 секунд, к примеру.

Печатается по нажатию на кнопку формы (просто опрос свойств стратегии) в окно отладчика.

Так если свечки минутные, то вроде как и интервал нужно минутный в этом свойстве задавать? или эти свойства не связаны?

Покажите код по созданию стратегии и откуда это печатается. Это не связанные свойства. По умолчанию Interval = TimeFrame.

Спасибо:

freewayrider

Фотография
Дата: 29.06.2011
Ответить


Alexander:

freewayrider:

Alexander: Откуда это всё печатается?

Попробуйте поставить Interval у TimeFrameStrategy поменьше - в 1 или 5 секунд, к примеру.

Печатается по нажатию на кнопку формы (просто опрос свойств стратегии) в окно отладчика.

Так если свечки минутные, то вроде как и интервал нужно минутный в этом свойстве задавать? или эти свойства не связаны?

Покажите код по созданию стратегии и откуда это печатается. Это не связанные свойства. По умолчанию Interval = TimeFrame.

Создание стратегии в блоке FormLoad

   SmaStrategy _my_strategy;
   CandleManager _candlemanager;
   _candlemanager = new CandleManager(_trader);
   _candlemanager.RegisterTimeFrameCandles(_security, TimeSpan.FromMinutes(1));
   _my_strategy = new SmaStrategy(_candlemanager, _security, 25, 5, 9, 5, TimeSpan.FromMinutes(1));
   _my_strategy.Security = _security;
   _my_strategy.Portfolio = _portfolio;
   _my_strategy.TimeFrame = new TimeSpan(0, 0, 0, 1, 0);
   _my_strategy.Trader = _trader;
   _my_strategy.Volume = 1;

На форме есть кнопка, жмем ее и получаем

   this._my_strategy.Start();

При нажатии на 2-ю кнопку

    private void button_info_Click(object sender, EventArgs e)
    {
        Logger.Info("ProcessState " + _my_strategy.ProcessState);
        Logger.Info("TimeFrame " + _my_strategy.TimeFrame);
        Logger.Info("Security " + _my_strategy.Security);
        Logger.Info("Trader " + _my_strategy.Trader);
        Logger.Info("Volume " + _my_strategy.Volume);
        Logger.Info("ErrorCount " + _my_strategy.ErrorCount);
        Logger.Info("IsDisposed " + _my_strategy.IsDisposed);
        Logger.Info("Portfolio " + _my_strategy.Portfolio);
        Logger.Info("Name " + _my_strategy.Name);
        Logger.Info("ID " + _my_strategy.Id);
        Logger.Info("TotalWorkingTime " + _my_strategy.TotalWorkingTime);
    }
Спасибо:

Sergey Masyura

Фотография
Дата: 29.06.2011
Ответить


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 секунд, к примеру.

Это, Саня, вероятно у меня в Альфе недоделки. А Logger это из альфа-коннетора.

Спасибо:

Sergey Masyura

Фотография
Дата: 29.06.2011
Ответить


freewayrider:

Alexander:

freewayrider:

Alexander: Откуда это всё печатается?

Попробуйте поставить Interval у TimeFrameStrategy поменьше - в 1 или 5 секунд, к примеру.

Печатается по нажатию на кнопку формы (просто опрос свойств стратегии) в окно отладчика.

Так если свечки минутные, то вроде как и интервал нужно минутный в этом свойстве задавать? или эти свойства не связаны?

Покажите код по созданию стратегии и откуда это печатается. Это не связанные свойства. По умолчанию Interval = TimeFrame.

Создание стратегии в блоке FormLoad

   SmaStrategy _my_strategy;
   CandleManager _candlemanager;
   _candlemanager = new CandleManager(_trader);
   _candlemanager.RegisterTimeFrameCandles(_security, TimeSpan.FromMinutes(1));
   _my_strategy = new SmaStrategy(_candlemanager, _security, 25, 5, 9, 5, TimeSpan.FromMinutes(1));
   _my_strategy.Security = _security;
   _my_strategy.Portfolio = _portfolio;
   _my_strategy.TimeFrame = new TimeSpan(0, 0, 0, 1, 0);
   _my_strategy.Trader = _trader;
   _my_strategy.Volume = 1;

На форме есть кнопка, жмем ее и получаем

   this._my_strategy.Start();

При нажатии на 2-ю кнопку

    private void button_info_Click(object sender, EventArgs e)
    {
        Logger.Info("ProcessState " + _my_strategy.ProcessState);
        Logger.Info("TimeFrame " + _my_strategy.TimeFrame);
        Logger.Info("Security " + _my_strategy.Security);
        Logger.Info("Trader " + _my_strategy.Trader);
        Logger.Info("Volume " + _my_strategy.Volume);
        Logger.Info("ErrorCount " + _my_strategy.ErrorCount);
        Logger.Info("IsDisposed " + _my_strategy.IsDisposed);
        Logger.Info("Portfolio " + _my_strategy.Portfolio);
        Logger.Info("Name " + _my_strategy.Name);
        Logger.Info("ID " + _my_strategy.Id);
        Logger.Info("TotalWorkingTime " + _my_strategy.TotalWorkingTime);
    }

Прикрепите проект, где можно воспроизвести эту проблему. Место этому топику в разделе Альфа-Директ.

Спасибо:

Alexander

Фотография
Дата: 01.07.2011
Ответить


Прошу прощения за кривое перемещение топика. Поправил.

Спасибо:

freewayrider

Фотография
Дата: 01.07.2011
Ответить


Проект, к сожалению, уже переделан под событийную модель (без использования класса strategy), поэтому выложить не смогу. в принципе, основной код в начале топика

Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy