← Voltar

Не срабатывает правило WhenBestAskPriceLess

Странное дело... В 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

Comentários (26)

Entrar ou Criar conta, Faça login ou cadastre-se para deixar um comentário

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

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

Moadip
Moadip

Подтверждаю баг. Также не работают правила 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
Alexander

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

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

Moadip
Moadip

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

Alexander Mukhanchikov: какой шлюз используется? Шлюз QuikTrader

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

В чем прикол я так и не понял.🤨

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

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
pyhta4og

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

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

Еще не пофиксили, случайно)))?

Alexander
Alexander

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

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

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

Alexander
Alexander

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

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

Alexander Mukhanchikov: Положили, в транке лежит 4.1.2 Спасибо))

paveld
paveld

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

Alexander
Alexander

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

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

paveld
paveld

Alexander Mukhanchikov: Какая именно ошибка? EmulationTrader.SecurityChanged вызывается? не срабатывают WhenLastTradePriceLess и WhenLastTradePriceMore EmulationTrader.SecuritiesChanged вызывается, значения в Security.LastTrade и Security.LastChangeTime изменяются

Alexander
Alexander

paveld:

Alexander Mukhanchikov: Какая именно ошибка? EmulationTrader.SecurityChanged вызывается? не срабатывают WhenLastTradePriceLess и WhenLastTradePriceMore EmulationTrader.SecuritiesChanged вызывается, значения в Security.LastTrade и Security.LastChangeTime изменяются

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

paveld
paveld

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
Alexander

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

paveld
paveld

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

Alexander
Alexander

Это только при EmulationTrader?

paveld
paveld

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

Alexander
Alexander

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

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

Взял папку trunk\References из stocksharp-17830 В указанном выше примере все еще не срабатывает правило

Security.WhenBestAskPriceLess(_Unit) SecurityChanged вызывается, судя по LastChangeTime и LastTrade, каждую секунду

Alexander
Alexander

Взял папку trunk\References из stocksharp-17830 В указанном выше примере все еще не срабатывает правило

Security.WhenBestAskPriceLess(_Unit) SecurityChanged вызывается, судя по LastChangeTime и LastTrade, каждую секунду

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

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

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

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

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);
}
Кот Матроскин
Кот Матроскин Autor

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

Alexander
Alexander

Проблемы с правилами значит нет. Как Михаил (pyhta4og) вернётся с отдыха, посмотрит на ту проблему.