Не вызывается OnProcess
Atom Ответить
28.06.2011


Добрый день!
Тренируюсь на простой стратегии но вот что-то работать код не желает.
событие onrunning стреляет а дальше тишина, onprocess вообще не вызывается.
старт и стоп работают

версия библиотек последняя, вот код

Код
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;
		}
	}

Теги:


Спасибо:



Скидка 15% на все обучение до 5 апреля (осталось 2 дней).

9 Ответов
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

Фотография
Дата: 28.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
Ответить


Alexander Перейти
Цитата:
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