Не срабатывает правило 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


Теги:


Спасибо:


1 2 3  >
Кот Матроскин

Фотография
Дата: 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 KB (334)
Спасибо:

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
Спасибо: Кот Матроскин
1 2 3  >

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

loading
clippy