Тоже про RealTimeEmulationTrader

Тоже про RealTimeEmulationTrader
Atom
5/26/2013


В пятницу стратегия в голову пришла, протестировать можно только на реале. Прошерстил студию, как понял в ней тестирование есть, но на реальных рыночных данных не возможно тестировать стратегию? Если я не прав, то напишете инструкцию маленькую.
Так вот, взял SampleSMA, поменял пару строк, для начала на проверенной стратегии, RealTimeEmulationTrader решил посмотреть.
Code
private RealTimeEmulationTrader<QuikTrader> _trader;

Code
_trader = new RealTimeEmulationTrader<QuikTrader>(new QuikTrader(Path.Text));

Да еще вывел ордера в таблицу, прочему то в SampleSMA таблица ордеров есть, а выводить в нее ни чего не выводиться.
Code
_strategy.OrderRegistered += order => this.GuiAsync(() =>
                {
                    _orders.Orders.Add(order);
                });

По идее должно работать, но нет. Ордера выставляются, отменяются, переставляются, но сделок не происходит хотя должны происходить. Заявка стоит, ее пересекает поток сделок, она просто передвигается котированием. Очень редко, так и не смог выяснить, при каких обстоятельствах все таки происходит сделка.
Поехали дальше. [biggrin]
На выходных, уже на демо квике. Удалил стратегию, написал простейшую, при появлении свечи выставлять ордер на покупку или продажу, без котирования.
Code
order = this.CreateOrder(OrderDirections.Buy, (decimal)Security.GetCurrentPrice(OrderDirections.Buy), 1);

Code
if (order != null)
            RegisterOrder(order);

Здесь, ситуация по лучше. Заявки как правило исполняются, редко когда не исполняются. Несколько раз через не исполненные ордера прогонишь поток сделок они сработают. Пол депозита на демо слил, гоняя сделки. Может это из-за демо, но я связи не вижу.
Еще одну проблему заметил,
Code
order = this.BuyAtMarket(1);
            RegisterOrder(order);
            order = this.SellAtMarket(1);
            RegisterOrder(order);

по рынку продает, а покупать не покупает. Здесь даже картинку приложу. Цена при покупке 0.
И еще, опять разница во времени, на рисунке видно время сделок и время графика 5 часов.
В тестировании на истории я в трейдере прописывал
Code
MarketEmulator = new MarketEmulator(new QuikTrader())
{
    EmulatorTimeZone = TimeZoneInfo.CreateCustomTimeZone("Moscow", TimeSpan.FromHours(4), "Moscow", "Moscow"),
},

в RealTimeEmulationTrader такой фокус не проходит. Пробовал по разному, ордера выставляет сделок нет. На форуме где то, что то писали, разобраться сил уже не хватило.
В итоге свою стратегию даже не писал.
Кто пользуется RealTimeEmulationTrader на сколько много проблем вы встречали, и были ли выше перечисленные?





Thanks:


esper

Avatar
Date: 5/28/2013
Reply


Иван З. Go to
Прошерстил студию, как понял в ней тестирование есть, но на реальных рыночных данных не возможно тестировать стратегию? Если я не прав, то напишете инструкцию маленькую.

Да, в настоящий момент такая возможность отсутствует, но есть среди задач на ближайшее время.

Иван З. Go to
Ордера выставляются, отменяются, переставляются, но сделок не происходит хотя должны происходить. Заявка стоит, ее пересекает поток сделок, она просто передвигается котированием. Очень редко, так и не смог выяснить, при каких обстоятельствах все таки происходит сделка.

Как вы смотрите, что они выставляются, отменяются и т.д.? Давайте логи, желательно Debug уровня за эти моменты, когда заявки не исполняются.

Иван З. Go to
Здесь, ситуация по лучше. Заявки как правило исполняются, редко когда не исполняются. Несколько раз через не исполненные ордера прогонишь поток сделок они сработают. Пол депозита на демо слил, гоняя сделки. Может это из-за демо, но я связи не вижу.

Каким образом это можно воспроизвести?

Иван З. Go to
И еще, опять разница во времени, на рисунке видно время сделок и время графика 5 часов.
В тестировании на истории я в трейдере прописывал
Code
MarketEmulator = new MarketEmulator(new QuikTrader())
{
    EmulatorTimeZone = TimeZoneInfo.CreateCustomTimeZone("Moscow", TimeSpan.FromHours(4), "Moscow", "Moscow"),
},

в RealTimeEmulationTrader такой фокус не проходит.

А если так попробовать:
Code
_trader.((MarketEmulator)MarketEmulator).EmulatorTimeZone = TimeZoneInfo.CreateCustomTimeZone("Moscow", TimeSpan.FromHours(4), "Moscow", "Moscow")


Иван З. Go to
Пробовал по разному, ордера выставляет сделок нет. На форуме где то, что то писали, разобраться сил уже не хватило.
В итоге свою стратегию даже не писал.
Кто пользуется RealTimeEmulationTrader на сколько много проблем вы встречали, и были ли выше перечисленные?

И снова без лога ничего сказать нельзя. Экспорт стакана запущен?
Thanks:

Иван З.

Avatar
Date: 5/28/2013
Reply


esper Go to
Иван З. Go to

Иван З. Go to
Ордера выставляются, отменяются, переставляются, но сделок не происходит хотя должны происходить. Заявка стоит, ее пересекает поток сделок, она просто передвигается котированием. Очень редко, так и не смог выяснить, при каких обстоятельствах все таки происходит сделка.

Как вы смотрите, что они выставляются, отменяются и т.д.? Давайте логи, желательно Debug уровня за эти моменты, когда заявки не исполняются.

Изначально смотрел по таблице ордеров. Действительно, по таблице ордеров понять не возможно что произошло с заявкой. Снята она, либо исполнена. Состояний таких нет, есть только активна, не активна, принята, не отправлена. Сразу появляется предложение сделать состояния "снята" и "исполнена", в квике они есть.
Все эксперименты проводил на SampleSMA, саму стратегию не менял, один в один как в примере. Добавил логирование, и вывод ордеров в таблицу. В примере этого нет, думаю стоит добавить, странно таблица ордеров есть а выводиться в нее ни чего не выводится.
Так вот, сделки происходят. Ошибка была в том, что я сделки в таблицу сделок выводил из стратегии:
Code
_strategy.NewMyTrades +=_strategy_NewMyTrades;

Code
        private void _strategy_NewMyTrades(IEnumerable<MyTrade> trade)
	    {
            this.GuiAsync(() =>
            {
                Trades.Trades.AddRange(trade);
                _chart.ProcessValues(trade.Last().Trade.Time, new Dictionary<IChartElement, object>
                    {
                        {_tradeElement, trade.Last()},
                    });
            });
	    }

Но события появлении новых сделок, если подписываться от стратегии, при котировании не приходят. Хотя при исполнении лимитных сделок или по рынку события приходят. Так и должно быть?
при выводе сделок из трэйдера, все нормально:
Code
_trader.NewMyTrades+=_trader_NewMyTrades;

Code
        private void _trader_NewMyTrades(IEnumerable<MyTrade> trade)
	    {
            this.GuiAsync(() =>
            {
                Trades.Trades.AddRange(trade);
                _chart.ProcessValues(trade.Last().Trade.Time, new Dictionary<IChartElement, object>
                    {
                        {_tradeElement, trade.Last()},
                    });
            });
	    }

esper Go to

Иван З. Go to
И еще, опять разница во времени, на рисунке видно время сделок и время графика 5 часов.
В тестировании на истории я в трейдере прописывал
Code
MarketEmulator = new MarketEmulator(new QuikTrader())
{
    EmulatorTimeZone = TimeZoneInfo.CreateCustomTimeZone("Moscow", TimeSpan.FromHours(4), "Moscow", "Moscow"),
},

в RealTimeEmulationTrader такой фокус не проходит.

А если так попробовать:
Code
_trader.((MarketEmulator)MarketEmulator).EmulatorTimeZone = TimeZoneInfo.CreateCustomTimeZone("Moscow", TimeSpan.FromHours(4), "Moscow", "Moscow")


Иван З. Go to
Пробовал по разному, ордера выставляет сделок нет. На форуме где то, что то писали, разобраться сил уже не хватило.


Думаю вы хотели написать так
Code
((MarketEmulator)_trader.MarketEmulator).EmulatorTimeZone = TimeZoneInfo.CreateCustomTimeZone("Moscow",TimeSpan.FromHours(4),"Moscow","Moscow");

Спасибо за направление, помогло. Может стоит это как то на автомате сделать? У многих эта ошибка встречается.

А про рыночные заявки баг?
Thanks:

Gavrus

Avatar
Date: 10/3/2013
Reply


Вопрос по RealTimeEmulationTrader
Раньше в старых версиях S#.API конструктор был таким:
Code
public RealTimeEmulationTrader(ITrader underlyingTrader )

Т.е. трейдера можно было определить как:
Code
_trader=new RealTimeEmulationTrader<QuikTrader>(new QuikTrader(QuikTerminal.GetDefaultPath()));

В новой версии S#.API 4.1.19.1 конструктор вызывается так:
Code

  var portfolio = new Portfolio
     {
      Name = "EmulationTrader",
      BeginValue = 1000000,                                           
     };
_trader = new RealTimeEmulationTrader<QuikTrader>(new QuikTrader(QuikTerminal.GetDefaultPath()), new[] { portfolio });

Но этот код почему то не передает портфель в _trader поэтому и нельзя выставить заявку (((
При регистрации ордера система пишет "не задан портфель".
Подскажите пожалуйста как правильно должно быть чтоб заявку выставить можно было??
Спасибо.
Thanks:

Mikhail Sukhov

Avatar
Date: 10/4/2013
Reply


Gavrus Go to
При регистрации ордера система пишет "не задан портфель".


Нужен полный текст ошибки.
Thanks:

Gavrus

Avatar
Date: 10/8/2013
Reply


Михаил Сухов Go to
Gavrus Go to
При регистрации ордера система пишет "не задан портфель".

Нужен полный текст ошибки.

Ошибки,нет просто после вызова метода _safeConnection.ConnectSafe(); в interFace.SelectedPortfolio не приезжает портфель, код такой:
Code

private ITrader QuikT;
var _portfolio = new Portfolio {Name = ""};
QuikT = new RealTimeEmulationTrader<QuikTrader>(new QuikTrader(QuikTerminal.GetDefaultPath()), new[] { portfolio });
//передаем QuikT
interFace.SafeConnection = new SafeConnection(QuikT);

Передать портфель в interFace получается если создать отдельный метод, где создается заявка и зарегистрируется в interFace.SafeConnection.Trader. После того как заявка отправлена в interFace.SelectedPortfolio портфель передается.
Code

 private void CreateOrderClick(object sender, RoutedEventArgs e)
        {
               var order = new Order
                  {       
                    // передаем ордеру все нужные свойства
                    Trader = interFace.SafeConnection.Trader,
                  Portfolio = interFace.SelectedPortfolio==null ? new Portfolio { Name = "portfel" } :                  interFace.SelectedPortfolio,                                                          
                    Security = interFace.SelectedSecurity,
                    Volume = decimal.Parse(tbVolume.Text),                
                    Direction = Convert.ToBoolean(rbBay.IsChecked) ? OrderDirections.Buy : OrderDirections.Sell,
                    Price = decimal.Parse(tbPrice.Text)
                  };
                //регистрация ордера
                interFace.SafeConnection.Trader.RegisterOrder(order);
           }

Если запустить метод CreateOrderClick 2 раза, сначала заявка будет с портфелем Name = "portfel" а вторая уже Name = "EmulationTrader" т.е. interFace.SelectedPortfolio==null а уже после отправки заявки interFace.SelectedPortfolio=="EmulationTrader"
Подскажите что нужно сделать чтобы портфель передавался в interFace.SelectedPortfolio сразу после вызова метода _safeConnection.ConnectSafe(); (Кнопка Connect)(interFace.SelectedSecurity Securities приходят сразу )
StockSharp.Algo версия 4.1.19.1
Thanks:

Gavrus

Avatar
Date: 10/15/2013
Reply


up
Thanks:

Mikhail Sukhov

Avatar
Date: 10/16/2013
Reply


Gavrus Go to
up


Можете чуть подробнее объяснить о проблеме? Что такое SafeConnection?
Thanks:

Самунджян Артем

Avatar
Date: 10/16/2013
Reply


Михаил Сухов Go to
Что такое SafeConnection?


SafeConnection это наша штукенция. Григорий, заходите в наш чат техподдержки, поможем с вопросом.
Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy