Несколько замечаний по коду.
Если оставляю #define EMULATOR сделки совершаются и событие стратегии OrderChanged срабатывает в лог попадает сообщение "состояние ордера изменилось".
Если на реальном Quik (снят комментарий с
#undef EMULATOR) то сделки совершаются но событие OrderChanged не срабатывает.
Как то сложно, да и лениво каждый раз комментить/раскомментить директивы препроцессора.
Объявите поле _trader типа ITrader.
private ITrader _trader;
Добавьте на форму ComboBox с двумя Item. Что нибудь типа:
<ComboBox Name="cmbTrader" >
<ComboBoxItem Content="Эмуляция" />
<ComboBoxItem Content="Реал" />
</ComboBox>
И потом в коде, в зависимости от того что выбранно создавать или QuikTrader или RTET
//Выбор шлюза
switch (cmbTrader.SelectedIndex)
{
case 0:
_trader= new RealTimeEmulationTrader<QuikTrader>(new QuikTrader(QuikTerminal.GetDefaultPath()));
break;
case 1:
_trader = new QuikTrader(QuikTerminal.GetDefaultPath())
break;
}
Рекомендую прочитать серию статей от FinDirector, почерпнете для себя много интересного.
_trader = new QuikTrader(QuikTerminal.GetDefaultPath()){ IsAsyncMode = true, SupportManualOrders = false };
_trader.IsAsyncMode = true;
В инициализаторе уже задано значение св-ва IsAsyncMode, нет смысла делать это еще раз.
Status.Text = "Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}." + System.Convert.ToString(trade.Id) + System.Convert.ToString(trade.Price) +
System.Convert.ToString(trade.Security.Code) + System.Convert.ToString(trade.Volume) + System.Convert.ToString(trade.Time);
Можно заменить на
Status.Text = "Сделка {Id} по цене {Price} по бумаге {Security.Code} по объему {Volume} в {Time}.".PutEx(trade)
Запуск/остановка экспорта
private void StartDde()
{
_trader.StartExport();
_isDdeStarted = true;
}
private void StopDde()
{
_trader.StopExport();
_isDdeStarted = false;
}
Если на экспорт запускаются все таблицы StartExport(), то нет смысла потом перечислять какие именно надо таблицы остановить.
//ниже две сторчки для работы на эмуляторе
_trader.UnderlyingTrader.StopExport(new[] { _trader.UnderlyingTrader.SecuritiesTable, _trader.UnderlyingTrader.MyTradesTable, _trader.UnderlyingTrader.EquityPositionsTable,
_trader.UnderlyingTrader.EquityPortfoliosTable, _trader.UnderlyingTrader.OrdersTable });
#else
_trader.StopExport(new[] { _trader.SecuritiesTable, _trader.MyTradesTable, _trader.EquityPositionsTable,
_trader.EquityPortfoliosTable, _trader.OrdersTable });
#endif
Проще вызвать StopDde() или напрямую _trader.StopExport();
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
base.OnClosing(e);
if (_trader != null)
{
//_candleManager.Stop(_series); //????????
_trader.UnRegisterMarketDepth(_strategy.Security);
_strategy.Stop();
Status.Text = "Стоп";
// останавливаем экспорт по DDE
#if EMULATOR
//ниже две сторчки для работы на эмуляторе
_trader.UnderlyingTrader.StopExport(new[] { _trader.UnderlyingTrader.SecuritiesTable, _trader.UnderlyingTrader.MyTradesTable, _trader.UnderlyingTrader.EquityPositionsTable,
_trader.UnderlyingTrader.EquityPortfoliosTable, _trader.UnderlyingTrader.OrdersTable });
#else
_trader.StopExport(new[] { _trader.SecuritiesTable, _trader.MyTradesTable, _trader.EquityPositionsTable,
_trader.EquityPortfoliosTable, _trader.OrdersTable });
#endif
if (_trader.IsConnected) _trader.Disconnect();
//_trader.Dispose();
CfgFile.WriteParam("Portfolio", Portfolios.SelectedItem.ToString());
CfgFile.WriteParam("Security", Securities1.SelectedItem.ToString());
}
base.OnClosing(e);
}
Дублируется base.OnClosing(e); Не смертельно, но все же.
//это надо для того чтобы на фьючах рабтали заявки по рынку.
this.Security.MaxPrice = 1000000;
this.Security.MinPrice = 0;
Сначала подумал что в этом причина почему не срабатывает событие NewMyTrade, т.к. не совершается сделка.
По идее не должно работать. Должно прийти сообщение об ошибке, что то типа цена ордера вне диапазона.
Чтобы были цены планок лучше добавить соответствующие колонки в квик таблице "Инструменты" и потом добавить их в коде. Экспорт доп. колонок
Потом увидел что ценник выставляется по другому
_price = Security.BestBid.Price - Security.MinStepSize;
И методы BuyAtmarket и SellAtMarket не используются.
Да и вы пишете что сделки совершаются.
Тогда не понятно в чем может быть причина.
Попробуйте максимально упростить код, чтобы проверить отрабатывает ли событие NewMyTrade. Один шлюз, минимум кода в стратегии.
Попробуйте на последней сборке с codeplex, возможно причина в S#.