Тоже про RealTimeEmulationTrader
Atom Ответить
26.05.2013


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

Код
_trader = new RealTimeEmulationTrader<QuikTrader>(new QuikTrader(Path.Text));

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

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

Код
if (order != null)
            RegisterOrder(order);

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

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

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





Спасибо:




8 Ответов
esper

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


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

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

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

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

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

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

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

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

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


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

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

Иван З.

Фотография
Курсы Автор статей Благотворитель
Дата: 28.05.2013
Ответить


esper Перейти
Иван З. Перейти

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

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

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

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

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

Код
        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 Перейти

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

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

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


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


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

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

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

Gavrus

Фотография
Курсы Благотворитель
Дата: 03.10.2013
Ответить


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

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

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

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

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

Mikhail Sukhov

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


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


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

Gavrus

Фотография
Курсы Благотворитель
Дата: 08.10.2013
Ответить


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

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

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

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 портфель передается.
Код

 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
Спасибо:

Gavrus

Фотография
Курсы Благотворитель
Дата: 15.10.2013
Ответить


up
Спасибо:

Mikhail Sukhov

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


Gavrus Перейти
up


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

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

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


Михаил Сухов Перейти
Что такое SafeConnection?


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


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

loading
clippy