Не срабатывает правило WhenBestAskPriceLess
Atom Ответить
29.05.2012


Странное дело... В 4.0.23 версии отлично срабатывали правила. Поставил последнюю версию с dev-ветки, изменил лишь с this.When(this.Security.BestAskPriceLess()) на this.Security.WhenBestAskPriceLess(). Стало примерно так:
Код
StrategyRule<Security> _opRule;
Unit _opPriceUnit = new Unit() { Type = UnitTypes.Limit };
......
_opPriceUnit.Value = this.Security.ShrinkPrice(_indicator.LastValue);
_opRule = this.Security.WhenBestAskPriceLess(_opPriceUnit).Do(() => 
{                         
    MQStrategy = new MarketQuotingStrategy(OrderDirections.Buy, this.Volume) 
                { PriceType = MarketPriceTypes.Following };
    this.ChildStrategies.Add(MQStrategy);
}).Once().Apply(this);

Теперь правила перестали срабатывать на тех же периодах: Цена срабатывания правила равна Unit = 100,98, Low опустился ниже, но покупки не произошло. Бумага Сбер обычка, сред маленький
Цитата:
MarketTime:2012.03.02 12:40:00, позиция = 0, Unit = 100,98, H = 101,45, L = 101,20
MarketTime:2012.03.02 12:50:00, позиция = 0, Unit = 100,98, H = 101,27, L = 100,83
MarketTime:2012.03.02 13:00:01, позиция = 0, Unit = 100,98, H = 100,97, L = 100,76
MarketTime:2012.03.02 13:10:03, позиция = 0, Unit = 100,98, H = 100,98, L = 100,79
MarketTime:2012.03.02 13:20:00, позиция = 0, Unit = 100,98, H = 101,03, L = 100,91
MarketTime:2012.03.02 13:30:04, позиция = 0, Unit = 100,98, H = 101,02, L = 100,93


Теги:


Спасибо:




26 Ответов
1 2  >
Кот Матроскин

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


Никто не отвечает - стало быть, и нет проблемы?
Автор топика
Спасибо:

Moadip

Фотография
Автор статей Программист
Дата: 30.05.2012
Ответить


Подтверждаю баг. Также не работают правила WhenLastTradePriceLess и WhenLastTradePriceMore.

Код

public void Method()
{
    this.AddInfoLog(string.Format("Добавка правил, последняя цена {0}", Security.LastTrade));

    var price = Security.LastTrade.Price;

    Security
        .WhenLastTradePriceLess(price - Security.MinStepSize * 2)
        .Do(() => this.AddInfoLog("Меньше"))
        .Apply(this)
        .Once();

    Security
        .WhenLastTradePriceMore(price + Security.MinStepSize * 2)
        .Do(() => this.AddInfoLog("Больше"))
        .Apply(this)
        .Once();

            
    bool flag1 = false, flag2 = false;
            
    Security
        .WhenNewTrades()
        .Do(() =>
                {
                    if (Security.LastTrade.Price < price - Security.MinStepSize * 2)
                    {
                        this.AddInfoLog(string.Format("Цена меньше {0}", price - Security.MinStepSize * 2));
                        flag1 = true;
                    }
                })
        .Apply(this)
        .Periodical(() => flag1);

    Security
        .WhenNewTrades()
        .Do(() =>
                {
                    if (Security.LastTrade.Price > price + Security.MinStepSize * 2)
                    {
                        this.AddInfoLog(string.Format("Цена больше {0}", price + Security.MinStepSize * 2));
                        flag2 = true;
                    }
                })
        .Apply(this)
        .Periodical(() => flag2);
}


В итоге


Спасибо:

Alexander

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


Проверил на свежей версии с codeplex, запустил SampleSma, на квике.
Всё срабатывает: тыц
Это фьюч ртс.

Нужна дополнительная информация - срабатывает ли событие Trader.SecuritiesChanged, изменяется ли по данному событию Security.LastTrade и Security.LastChangeTime? В конце концов - какой шлюз используется?
breakpoint.png 7,8KB (0)
Спасибо:

Moadip

Фотография
Автор статей Программист
Дата: 31.05.2012
Ответить


Alexander Mukhanchikov Перейти

срабатывает ли событие Trader.SecuritiesChanged, изменяется ли по данному событию Security.LastTrade и Security.LastChangeTime?

Событие срабатывает и св-ва меняются.

Alexander Mukhanchikov Перейти
какой шлюз используется?

Шлюз QuikTrader

Попробовал поставить 10, как на скрине, фьюч РИ - правило сработало.
Поставил - 100 - сработало.
Поставил - 1000 - не сработало.

В чем прикол я так и не понял.Confused
Спасибо:

Кот Матроскин

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


Alexander Mukhanchikov Перейти
Нужна дополнительная информация - срабатывает ли событие Trader.SecuritiesChanged, изменяется ли по данному событию Security.LastTrade и Security.LastChangeTime? В конце концов - какой шлюз используется?

Взял пример SampleHistoryTesting, вставил:
Код
_opPriceUnit.Value = Security.LastTrade.Price - 0.2m;
//this.Security.WhenBestAskPriceLess(_opPriceUnit).Do(() => 
this.Security.WhenBestAskPriceLess(0.1m).Do(() => 
{   
     MessageBox.Show("Меньше " + _opPriceUnit.Value);
}).Once().Apply(this);

Заменил бумагу на Сбер. Получилось так:
Код

class SmaStrategy : Strategy
{
	private readonly CandleSeries _series;
	private bool _isShortLessThenLong;
        Unit _opPriceUnit = new Unit() { Type = UnitTypes.Limit };

	public SmaStrategy(CandleSeries series, SimpleMovingAverage longSma, SimpleMovingAverage shortSma)
	{
		_series = series;
		LongSma = longSma;
		ShortSma = shortSma;
         _opPriceUnit = new Unit() { Type = UnitTypes.Limit };
	}

	public SimpleMovingAverage LongSma { get; private set; }
	public SimpleMovingAverage ShortSma { get; private set; }

	protected override void OnStarting()
	{
		_series
			.WhenCandlesFinished()
			.Do(ProcessCandle)
			.Apply(this);
        this.Trader.SecuritiesChanged += Securities => 
        {
                string securities = "";
                foreach (var Security in Securities)
                {
                      securities += Security.ToString() + " ";
                }
                MessageBox.Show("securities: " + securities);
        }
		_isShortLessThenLong = ShortSma.LastValue < LongSma.LastValue;
		base.OnStarting();
	}

	private void ProcessCandle(Candle candle)
	{
		if (ProcessState == ProcessStates.Stopping)
		{
			CancelActiveOrders();
			return;
		}
		LongSma.Process((DecimalIndicatorValue)candle.ClosePrice);
		ShortSma.Process((DecimalIndicatorValue)candle.ClosePrice);
		var isShortLessThenLong = ShortSma.LastValue < LongSma.LastValue;
		if (_isShortLessThenLong != isShortLessThenLong)
		{
			var direction = isShortLessThenLong ? OrderDirections.Sell : OrderDirections.Buy;
			var strategy = new MarketQuotingStrategy(direction, Volume);
			ChildStrategies.Add(strategy);
			_isShortLessThenLong = isShortLessThenLong;
		}

        //MessageBox.Show("Security.LastTrade.Price = " + Security.LastTrade.Price);
        _opPriceUnit.Value = Security.LastTrade.Price - 0.2m;
        //this.Security.WhenBestAskPriceLess(_opPriceUnit).Do(() => 
        this.Security.WhenBestAskPriceLess(0.1m).Do(() => 
        {   
             MessageBox.Show("Меньше " + _opPriceUnit.Value);
        }).Once().Apply(this);
	}
}

Правило не срабатывает
Trader.SecuritiesChanged тоже не срабатывает: ни в теле стратегии, ни в MainWindow
Автор топика
Спасибо:

pyhta4og

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


В EmulationTrader ветки 4.1 есть баг, SecurityChanged не вызывается.
Будет поправлено.
Спасибо: Кот Матроскин

Кот Матроскин

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


Еще не пофиксили, случайно)))?
Автор топика
Спасибо:

Alexander

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


Пофиксили, но пока на codeplex не положили.
Спасибо:

Кот Матроскин

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


Извиняюсь спросить, на codeplex еще не выложили?
Автор топика
Спасибо:

Alexander

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


Положили, в транке лежит 4.1.2
Спасибо: Кот Матроскин

Кот Матроскин

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


Alexander Mukhanchikov Перейти
Положили, в транке лежит 4.1.2

Спасибо))
Автор топика
Спасибо:

paveld

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


Взял dll с кодеплекс stocksharp-17807.zip из trunk, но ошибка осталась
используется EmulationTrader
Спасибо:

Alexander

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


paveld Перейти
Взял dll с кодеплекс stocksharp-17807.zip из trunk, но ошибка осталась
используется EmulationTrader


Какая именно ошибка? EmulationTrader.SecurityChanged вызывается?
Спасибо:

paveld

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


Alexander Mukhanchikov Перейти

Какая именно ошибка? EmulationTrader.SecurityChanged вызывается?

не срабатывают WhenLastTradePriceLess и WhenLastTradePriceMore
EmulationTrader.SecuritiesChanged вызывается, значения в Security.LastTrade и Security.LastChangeTime изменяются
Спасибо:

Alexander

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


paveld Перейти
Alexander Mukhanchikov Перейти

Какая именно ошибка? EmulationTrader.SecurityChanged вызывается?

не срабатывают WhenLastTradePriceLess и WhenLastTradePriceMore
EmulationTrader.SecuritiesChanged вызывается, значения в Security.LastTrade и Security.LastChangeTime изменяются


Тогда приведите лог - с изменением Security.Trader.SecuritiesChanged - с выводом LastTrade и с созданием правила.
Спасибо:

paveld

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


Alexander Mukhanchikov Перейти

Тогда приведите лог - с изменением Security.Trader.SecuritiesChanged - с выводом LastTrade и с созданием правила.


лог:
Цитата:

14:50:00.000 | | TS_RIM2@RTS_tst | Создано новое правило WhenLastTradePriceMore по цене 153215
14:50:00.000 | | TS_RIM2@RTS_tst | LastTrade=23.04.2012 14:50:00 153235.00000 2, LastChangeTime=23.04.2012 14:50:00
14:50:01.000 | | TS_RIM2@RTS_tst | LastTrade=23.04.2012 14:50:01 153205.00000 1, LastChangeTime=23.04.2012 14:50:01
14:50:02.000 | | TS_RIM2@RTS_tst | LastTrade=23.04.2012 14:50:02 153210.00000 1, LastChangeTime=23.04.2012 14:50:02
14:50:03.000 | | TS_RIM2@RTS_tst | LastTrade=23.04.2012 14:50:03 153225.00000 3, LastChangeTime=23.04.2012 14:50:03
14:50:04.000 | | TS_RIM2@RTS_tst | LastTrade=23.04.2012 14:50:04 153230.00000 1, LastChangeTime=23.04.2012 14:50:04
14:50:05.000 | | TS_RIM2@RTS_tst | LastTrade=23.04.2012 14:50:05 153215.00000 1, LastChangeTime=23.04.2012 14:50:05
14:50:06.000 | | TS_RIM2@RTS_tst | LastTrade=23.04.2012 14:50:06 153215.00000 2, LastChangeTime=23.04.2012 14:50:06
14:50:07.000 | | TS_RIM2@RTS_tst | LastTrade=23.04.2012 14:50:07 153210.00000 1, LastChangeTime=23.04.2012 14:50:07
14:50:08.000 | | TS_RIM2@RTS_tst | LastTrade=23.04.2012 14:50:08 153150.00000 1, LastChangeTime=23.04.2012 14:50:08
14:50:09.000 | | TS_RIM2@RTS_tst | LastTrade=23.04.2012 14:50:09 153155.00000 1, LastChangeTime=23.04.2012 14:50:09
14:50:10.000 | | TS_RIM2@RTS_tst | LastTrade=23.04.2012 14:50:10 153145.00000 2, LastChangeTime=23.04.2012 14:50:10
14:50:11.000 | | TS_RIM2@RTS_tst | LastTrade=23.04.2012 14:50:11 153160.00000 3, LastChangeTime=23.04.2012 14:50:11

Видно что в момент создания правила цена уже выше 153215 => правило должно исполниться было сразу после создания

подписываюсь на правило так:
Код

        exInfo.ActivateOrderRule = Security.WhenLastTradePriceMore(ActivatePrice)
          .Do(trade => ActivateOrder(trade, order)).Once().Apply(this);
Спасибо:

Alexander

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


ActivatePrice - это что?
Попробуйте передавать new Unit(153215, UnitTypes.Limit)
Спасибо:

paveld

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


Alexander Mukhanchikov Перейти
ActivatePrice - это что?
Попробуйте передавать new Unit(153215, UnitTypes.Limit)

ActivatePrice это и есть new Unit(153215, UnitTypes.Limit)
Спасибо:

Alexander

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


Это только при EmulationTrader?
Спасибо:

Alexander

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


Приложите минимальный проект, на котором воспроизводится. Не получается воспроизвести.
Спасибо:

paveld

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


Действительно в коде в одном месте для ActivatePrice присваивалось значение decimal, из-за этого и не срабатывало правило. Поправил на Unit и все заработало
Спасибо:

Кот Матроскин

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


Взял папку trunk\References из stocksharp-17830
В указанном выше примере все еще не срабатывает правило
Цитата:
Security.WhenBestAskPriceLess(_Unit)

SecurityChanged вызывается, судя по LastChangeTime и LastTrade, каждую секунду
Автор топика
Спасибо:

Кот Матроскин

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


Так будет починка правила или нет?
Автор топика
Спасибо:

Alexander

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


Кот Матроскин Перейти
Взял папку trunk\References из stocksharp-17830
В указанном выше примере все еще не срабатывает правило
Цитата:
Security.WhenBestAskPriceLess(_Unit)

SecurityChanged вызывается, судя по LastChangeTime и LastTrade, каждую секунду


Проверил с WhenLastTradePriceMore - всё работает.

Вы говорите о правиле WhenBestAskPriceLess - здесь надо смотреть не LastTrade, а BestAsk

Смотрите на событие Security.Trader.SecuritiesChanged и за изменением security.BestAsk.
Скиньте лог изменений и правила с конкретным числом как вы создаёте.
Спасибо:

Кот Матроскин

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


Alexander Mukhanchikov Перейти

Вы говорите о правиле WhenBestAskPriceLess - здесь надо смотреть не LastTrade, а BestAsk
Смотрите на событие Security.Trader.SecuritiesChanged и за изменением security.BestAsk.
Скиньте лог изменений и правила с конкретным числом как вы создаёте.

Про BestAsk и BestBid уже писал на днях, что вылетает NullReferenceException.
На счет того, как создаю. Беру SampleHistoryTesting и в ProcessCandle добавляю правило:

Код
private void ProcessCandle(Candle candle) 
{
	if (ProcessState == ProcessStates.Stopping) 
	{
		CancelActiveOrders();
		return;
	}
	LongSma.Process((DecimalIndicatorValue)candle.ClosePrice);
	ShortSma.Process((DecimalIndicatorValue)candle.ClosePrice);
	var isShortLessThenLong = ShortSma.LastValue < LongSma.LastValue;
	if (_isShortLessThenLong != isShortLessThenLong) 
	{
		var direction = isShortLessThenLong ? OrderDirections.Sell : OrderDirections.Buy;
		var strategy = new MarketQuotingStrategy(direction, Volume);
		ChildStrategies.Add(strategy);
		_isShortLessThenLong = isShortLessThenLong;
	}

	Unit _opPriceUnit = new Unit(Security.LastTrade.Price - 0.2m, UnitTypes.Limit);
	this.Security.WhenBestAskPriceLess(_opPriceUnit).Do(() => 
	{   
	MessageBox.Show("Меньше " + _opPriceUnit.Value);
	}).Once().Apply(this);
}

Автор топика
Спасибо:
1 2  >

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

loading
clippy