← Atrás

Вопросы новичка в S#

Добрый день. Очень понравилась идея использования Вашей библиотеки для реализации роботов. Подскажите, пожалуйста:

  1. Как идентифицировать заявку? //например, выставляю заявку buy RIZ0 4 контракта по цене 160500. Каким образом далее смогу ее отслеживать? Вариант с использованием таблицы сделок не подходит - необходимо реализовать контроль исполнения заявок пользуясь исключительно информацией из таблицы заявок. С языком C# только начал разбираться, возможно поэтому не нашел в представленных в дистрибутиве S# проектах примеров контроля состояния заявки по ее уникальному признаку.
  2. Верно ли я понимаю суть работы с Квиком: для реализации автономного робота необходимо организовать два потока на C#:
  • первый: выполняет функции получения данных из Квика через DDE сервер (используя библиотеку S#);
  • второй: непосредственно реализует алгоритм выставления и снятия заявок. Можно ли обойтись одним потоком?

¿Le resultó útil este tema?

Compartir tema

Comentarios (506)

Los comentarios en este tema están bloqueados

artemox
artemox
  1. При создании заявки у вас будет объект, который в дальнейшем будет отражать реальное состояние заявки. При этом изменение заявок сопровождается событиями. Как бы о таблицах КВИК заботиться не стоит.
  2. По идее робота можно написать в одном потоке, опять же ориентируясь на события S#. А уже в библиотеке потоков может быть много, но это сильно не должно волновать при разработке роботов.
sotikov
sotikov

Так как я то-же только начинаю программировать с использованием S# пишу в этой теме. Вопрос такой: Отчего в примерах (которые идут с S#) подключение классов происходит после команды namespace и обязательно ли подключать именно так?

ustas
ustas

sotikov: Так как я то-же только начинаю программировать с использованием S# пишу в этой теме. Вопрос такой: Отчего в примерах (которые идут с S#) подключение классов происходит после команды namespace и обязательно ли подключать именно так? на мой взгляд это дело вкуса, работает и так и так.

sotikov
sotikov

ustas: на мой взгляд это дело вкуса, работает и так и так. А на что тогда ругается у меня VS2010? Я понять не могу, поможите...

Посмотреть в увеличенном варианте.

ustas
ustas

в свойствах проекта какая версия .Net указана ? надо 3.5

Alexander
Alexander

ustas: в свойствах проекта какая версия .Net указана ? надо 3.5

я под 4.0 успешно пишу. там главное - чтоб было просто 4.0 а не client profile

sotikov
sotikov

Alexander: я под 4.0 успешно пишу. там главное - чтоб было просто 4.0 а не client profile Так и есть, у меня стоит обычный 4.0.

sotikov
sotikov

Был 4 Фреймворк установлен. Спасибо подправил.

a.dobryn
a.dobryn

напишу в эту тему, вопрос у меня вроде довольно тривиальный.

Что нужно для отправки заявки? сам синтаксис я посмотрела, с этим вроде все понятно. А как конкретно, по действиям?

  1. подключиться к quik
  2. включить экспорт DDE - вот тут вопрос. Какие таблицы нужно экспортировать для этого? нужны ли какие-то конкретные?
Mikhail Sukhov
Mikhail Sukhov

D_Alex: напишу в эту тему, вопрос у меня вроде довольно тривиальный.

Что нужно для отправки заявки? сам синтаксис я посмотрела, с этим вроде все понятно. А как конкретно, по действиям?

  1. подключиться к quik
  2. включить экспорт DDE - вот тут вопрос. Какие таблицы нужно экспортировать для этого? нужны ли какие-то конкретные?

Как минимум экспорт инструментов. Если нужно отслеживать состояние заявки и полученные сделки - еще и экспорт заявок + моих сделок. Ну и так далее.

a.dobryn
a.dobryn

понятно, спасибо, буду пробовать =)

a.dobryn
a.dobryn

таблица инструментов - это таблица котировок текущего инструмента?

Mikhail Sukhov
Mikhail Sukhov

D_Alex: таблица инструментов - это таблица котировок текущего инструмента?

http://stocksharp.com/doc/help/html/5c13da7b-b6e4-4fd4-958a-66c93c58b941.htm (3-ий скрин)

a.dobryn
a.dobryn

сделала все, как описано (загрузила настройки расположения окон) при попытке отправки заявки получается это

Mikhail Sukhov
Mikhail Sukhov

D_Alex: сделала все, как описано (загрузила настройки расположения окон) при попытке отправки заявки получается это

Order.Portfolio чем инициализировали?

a.dobryn
a.dobryn
order.Portfolio = this.Portfolios.SelectedPortfolio;
Mikhail Sukhov
Mikhail Sukhov

D_Alex: ...

Предполагаю, что портфель из выпадающего списка не выбрали.

a.dobryn
a.dobryn

Действительно, в этот раз при запуске появился номер счета на выбор. Заявка отправилась, спасибо =)

a.dobryn
a.dobryn

а как экспортировать одновременно и CustomPortfolio и обычные таблицы? у меня в итоге выходит, что с CustomPortfolio все в порядке, а по остальным таблицам нет данных.


      this.Trader.AddCustomTableMapping(typeof(CustomPortfolio));

                        this.Trader.ProcessCustomTables += (type, objects) =>
                        {
                            // нас интересует только CustomPortfolio
                            if (type == typeof(CustomPortfolio))
                                _portfolioWindow.Portfolios.AddRange(objects.Cast<CustomPortfolio>());                           
                            
                        };

this.Trader.NewSecurities += securities => this.GuiAsync(() => _securitiesWindow.Securities.AddRange(securities));

a.dobryn
a.dobryn

и еще вопрос - что-то я совсем запуталась. Есть данные, получаемые из Quik, как раз этот CustomPortfolio, как из примера Sample. Хранятся они в _portfolioWindow.Portfolios; Объявлено оно в классе MainWindow. Как из другого класса получить доступ к полям _portfolioWindow.Portfolios? Объявления экземпляра MainWindow я не нашла.

upd: нашла. Он называется MainWindow.Instance, shame on me.

a.dobryn
a.dobryn

Вылезает такая ошибка, как в примере, так и у меня, но заявки отправляются. Где нужно посмотреть? В настройке таблиц Quik'а или где-то у себя?

Mikhail Sukhov
Mikhail Sukhov

D_Alex: Вылезает такая ошибка, как в примере, так и у меня, но заявки отправляются. Где нужно посмотреть? В настройке таблиц Quik'а или где-то у себя?

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

a.dobryn
a.dobryn

То есть, она отсутствует в самом quik, и она не нужна?

Mikhail Sukhov
Mikhail Sukhov

D_Alex: То есть, она отсутствует в самом quik, и она не нужна?

Нужна или нет - это Вам решать. Если данный инструмент не нужен - сделайте фильтр на таблицу позиций, чтобы сообщение не выскакивало.

a.dobryn
a.dobryn

все, понятно, спасибо =)

a.dobryn
a.dobryn

А что означает "Превышен лимит по инструменту?" отправляю заявку так


       var order = new Order
            {
                Volume = volume, 
                Price = price,            
                Security = MainWindow.Instance._securitiesWindow.Securities[0],
                Direction = oper == "Buy" ? OrderDirections.Buy : OrderDirections.Sell,
            };
            MainWindow.Instance.NewOrder(order);

Mikhail Sukhov
Mikhail Sukhov

D_Alex: А что означает "Превышен лимит по инструменту?"

Это лучше на сайте Квика поискать.

a.dobryn
a.dobryn

или откуда вообще вытаскивать Security?

Mikhail Sukhov
Mikhail Sukhov

D_Alex: или откуда вообще вытаскивать Security?

ITrader.Securities, ITrader.NewSecurities. Как использовать показано в примерах.

a.dobryn
a.dobryn

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

a.dobryn
a.dobryn

все, поняла, при отправке заявки на продажу (и из примера тоже), вылезает эта ошибка. Оказывается, это возникает при недостатке ресурсов под заявку, то есть продавать нечего. А у Quik'а, как обычно, один ответ на все ошибки =)

ttt
ttt Autor

Использую S# выставляя ордер в Quik. При создании ордеров явно указываю: Comment = "мой коммент 123" В Квике в таблице "Заявки" в поле "Комментарии" пишет "S#" для любого выставляемого ордера. При проверке: MessageBox.Show("комментарий="+ord.Comment); оказывается, что поле Comment, создаваемого ордера, содержит значение "мой коммент 123". В чем дело? Как сделать так, чтобы в Квике в таблице Заявки в поле "Комментарии" отражалось значение мой коммент 123"?

Mikhail Sukhov
Mikhail Sukhov

ttt: В чем дело? Как сделать так, чтобы в Квике в таблице Заявки в поле "Комментарии" отражалось значение мой коммент 123"?

Это вопрос из топ 10... Я передаю признак кода клиента как "S#", а не комментарий. Квик пишет, что комментарий некоторые брокеры используют для своих расчетов, поэтому его не выставить из кода. Напишите вопрос или брокеру или на форуме Квика.

ttt
ttt Autor

Каким образом установить код клиента? //например, S#1

Mikhail Sukhov
Mikhail Sukhov

ttt: Каким образом установить код клиента? //например, S#1

Код клиента

a.dobryn
a.dobryn

Михаил, снова вопросы от меня =) Как определить, что начались новые торговые сутки?

Alexander
Alexander

D_Alex: Михаил, снова вопросы от меня =) Как определить, что начались новые торговые сутки?

По DateTime.Date

Valdis
Valdis

подскажите , как получить значения активная покупка/ продажа и текущие чистые позиции для фьючерсов ФОРТС ?

Alexander
Alexander

Valdis: подскажите , как получить значения активная покупка/ продажа и текущие чистые позиции для фьючерсов ФОРТС ?

что такое активная покупка\продажа? Если цена лучшей покупки\продажи в стакане, то Security.BestBid \ Security.BestAsk

Текущие чистые позиции - если по сделкам, совершённым в рамках стратегии, то берётся из PositionManager.Position Если вообще, не учитывая в\вне стратегии - то Trader.GetPosition(Portfolio, Security)

Valdis
Valdis

Alexander:

Valdis: подскажите , как получить значения активная покупка/ продажа и текущие чистые позиции для фьючерсов ФОРТС ?

что такое активная покупка\продажа? Если цена лучшей покупки\продажи в стакане, то Security.BestBid \ Security.BestAsk

Текущие чистые позиции - если по сделкам, совершённым в рамках стратегии, то берётся из PositionManager.Position Если вообще, не учитывая в\вне стратегии - то Trader.GetPosition(Portfolio, Security) нет, это данные из таблицы позиции по деривативам ( DerivativePositionsTable ) т.е. колличество денег на счёте ММВБ и состояние портфеля мне понятно как отследить, а вот по бирже РТС -ФОРТС я не нашел таких же данных активная покупка/продажа это колличество лотов по инструменту выставленных мной на биржу. я так понимаю библиотека S# впервую очередь заточена для торговли акциями, а не фьючерсами. т.е. напрямую, указанными вами способами не получить данных по счетам ФОРТС , их видимо надо как то считывать самому из экспортируемой таблицы DerivativePositionsTable , если я ошибаюсь , поправьте меня и подскажите тогда как вытащить данные из этой таблицы ?

Alexander
Alexander

Valdis: нет, это данные из таблицы позиции по деривативам ( DerivativePositionsTable ) т.е. колличество денег на счёте ММВБ и состояние портфеля мне понятно как отследить, а вот по бирже РТС -ФОРТС я не нашел таких же данных активная покупка/продажа это колличество лотов по инструменту выставленных мной на биржу. я так понимаю библиотека S# впервую очередь заточена для торговли акциями, а не фьючерсами. т.е. напрямую, указанными вами способами не получить данных по счетам ФОРТС , их видимо надо как то считывать самому из экспортируемой таблицы DerivativePositionsTable , если я ошибаюсь , поправьте меня и подскажите тогда как вытащить данные из этой таблицы ?

  1. Я торгую только на фортсе с помощью Stock# уже год. Он отлично заточен для торговли деривативами. Trader.GetPosition(Portfolio, Security) возвращает ту позицию, которая соответствует данному портфелю для заданного инструмента. А у вас он не возвращает для того же фьюча РТС позицию данным методом?

  2. Суммируете оставшийся невыполненный объём в активных своих заявках. Если заявка бай - то +n оставшихся контрактов, если селл - то -n.

Valdis
Valdis

Alexander просто я подумал , раз есть уже экспортируемая изначально таблица DerivativePositionsTable то можно как то из неё получать данные по текущим чистым позициям и активная покупка/ продажа.....но раз так нельзя будем пробовать ваш способ. Благодарю за помощь

Alexander
Alexander

Valdis: Alexander просто я подумал , раз есть уже экспортируемая изначально таблица DerivativePositionsTable то можно как то из неё получать данные по текущим чистым позициям и активная покупка/ продажа.....но раз так нельзя будем пробовать ваш способ. Благодарю за помощь

Не то чтобы нельзя - как раз любую таблицу можно получить, как уже ответили. Просто так проще как я написал, без лишних заморочек. :)

MCTuTeJ|19951995
MCTuTeJ|19951995

Насколько я понял, с помощью s# можно "выудить" любые данные из Квика. Попробуйте использовать CustomTables.

Valdis
Valdis

снимал группу заявок по фильтру таким образом : _Trader.CancelOrders(false, _portfolio, null, null, _security); всё работало, но сегодня прямо в процессе работы вырубилось, причем обычные ордера регистрируются , а снять группу заявок на фортс не получается. ошибки не возвращает, причем в квике число полученных внешних транзакций при попытке снять ордера не меняется из чего я делаю вывод что до квика вобще ни чего не доходит. подскажите , в каком направлении копать ?

сам допетрил :) я изначально _portfolio.Name = "11005"; задавал таким неверным способом . непонятно только почему это вначале работало а потом отключилось. примеры из мануала рулят. Михаилу респект за библиотеку !

a.dobryn
a.dobryn

а как лучше отслеживать заявки? например, отсылается у меня заявка на продажу n лотов с ценой A. Через некоторое время произошла продажа n-2 лотов и мне нужно снять эту заявку и поставить новую, 2 лота по цене B. Искать их по таблице заявок с параметрами n и A? Или есть риск нарваться на другую, такую же?

**upd:**точнее, даже не так. Заявок может быть несколько, самых разных, но по их исполнению (даже частичному) надо их заменять. Как это организовать?

Alexander
Alexander

D_Alex: а как лучше отслеживать заявки? например, отсылается у меня заявка на продажу n лотов с ценой A. Через некоторое время произошла продажа n-2 лотов и мне нужно снять эту заявку и поставить новую, 2 лота по цене B. Искать их по таблице заявок с параметрами n и A? Или есть риск нарваться на другую, такую же?

**upd:**точнее, даже не так. Заявок может быть несколько, самых разных, но по их исполнению (даже частичному) надо их заменять. Как это организовать?

событие NewMyTrades в данном случае как раз то что надо

a.dobryn
a.dobryn

Alexander:

D_Alex: а как лучше отслеживать заявки? например, отсылается у меня заявка на продажу n лотов с ценой A. Через некоторое время произошла продажа n-2 лотов и мне нужно снять эту заявку и поставить новую, 2 лота по цене B. Искать их по таблице заявок с параметрами n и A? Или есть риск нарваться на другую, такую же?

**upd:**точнее, даже не так. Заявок может быть несколько, самых разных, но по их исполнению (даже частичному) надо их заменять. Как это организовать?

событие NewMyTrades в данном случае как раз то что надо

спасибо! а статус заявки меняется тогда, когда она исполнена целиком (например, куплено 5 лотов), или частично (куплен хотя бы 1 лот)?

Alexander
Alexander

D_Alex:

Alexander:

D_Alex: а как лучше отслеживать заявки? например, отсылается у меня заявка на продажу n лотов с ценой A. Через некоторое время произошла продажа n-2 лотов и мне нужно снять эту заявку и поставить новую, 2 лота по цене B. Искать их по таблице заявок с параметрами n и A? Или есть риск нарваться на другую, такую же?

**upd:**точнее, даже не так. Заявок может быть несколько, самых разных, но по их исполнению (даже частичному) надо их заменять. Как это организовать?

событие NewMyTrades в данном случае как раз то что надо

спасибо! а статус заявки меняется тогда, когда она исполнена целиком (например, куплено 5 лотов), или частично (куплен хотя бы 1 лот)?

Смотрите документацию, раздел Состояния заявок:

Если заявка исполняется частично, то вызываются события ITrader...NewMyTrades о новых сделках по выставленной заявке, а так же событие ITrader...OrdersChanged, где передается уведомление об изменении баланса по заявке Order..::.Balance

Valdis
Valdis

я что то не пойму , почему событие Trader.PositionsChanged вызывается и при выставлении заявок и при исполнении их и даже просто, когда ни чего с позициями/заявками не происходит ? причем в последнем случае это событие приходит с периодичностью примерно раз в минуту . подскажите в чем может быть проблема ? читал мануал но так и нашел точного определения - КОГДА НАДО ПОДПИСЫВАТЬСЯ на события Trader.NewPositions Trader.PositionsChanged Trader.OrdersChanged Trader.NewMyTrades Trader.NewOrders

до коннекта с квиком Trader.Connect(); или после ? или вобще без разницы ?

Mikhail Sukhov
Mikhail Sukhov

Valdis: я что то не пойму , почему событие Trader.PositionsChanged вызывается и при выставлении заявок и при исполнении их и даже просто, когда ни чего с позициями/заявками не происходит ?

События вызываются всегда, когда Квик через ДДЕ посылает обновление таблицы с позициями. А происходит это не только тогда, когда происходит сделка. В этой таблице есть и поля, которые изменяются постоянно.

a.dobryn
a.dobryn

в классе Trade есть член ExtensionInfo типа IDictionary<TKey, TValue>. А как узнать, какие ключи там есть? Конкретно мне нужно узнать, по какому лимиту была выставлена сделка

Mikhail Sukhov
Mikhail Sukhov

D_Alex: в классе Trade есть член ExtensionInfo типа IDictionary<TKey, TValue>. А как узнать, какие ключи там есть? Конкретно мне нужно узнать, по какому лимиту была выставлена сделка

Значение в ExtensionInfo так просто не попадают. Необходимо заранее настраивать ДДЕ метаданные через QuikTrader.TradesTable. Здесь это рассказывается как сделать. И обращаться в последствии нужно так:

var someValue = someTrade.ExtensionInfo[DdeTradeColumns.SomeColumn];
a.dobryn
a.dobryn

Mikhail Sukhov:

D_Alex: в классе Trade есть член ExtensionInfo типа IDictionary<TKey, TValue>. А как узнать, какие ключи там есть? Конкретно мне нужно узнать, по какому лимиту была выставлена сделка

Значение в ExtensionInfo так просто не попадают. Необходимо заранее настраивать ДДЕ метаданные через QuikTrader.TradesTable. Здесь это рассказывается как сделать. И обращаться в последствии нужно так:

var someValue = someTrade.ExtensionInfo[DdeTradeColumns.SomeColumn];


понятно, спасибо =)


еще вопрос: мне нужно заменять заявку после того, как она частично исполнена. У меня есть сейчас событие NewMyTrades, но там есть данные типа Trade, а для замены заявки нужно получить тип Order. Можно ли как-то найти по сделке заявку?
gs
gs

У меня вопрос к знатокам C# и Trans2Quik.

У меня автомат работает с квиком через файловый ввод заявок и работают три разных Квика. Я решил попробовать использовать Trans2Quik. Правильно ли я понимаю, что при этом мне нужно писать разные классы-врапперы Trans2Quik для каждой TRans2Quik.dll ? Ну, например, что то вроде такого:

public interface ITrans2Quik { // члены интерфейса }

// TRANS2QUIK_1.DLL public class Trans2Quik_1 : ITrans2Quik {
private readonly string _pathToQuik;

    [DllImport("TRANS2QUIK_1.DLL", EntryPoint = "_TRANS2QUIK_CONNECT@16", CallingConvention = 					CallingConvention.StdCall)]
    public static extern long connect(string lpcstrConnectionParamsString, ref long pnExtendedErrorCode,
       byte[] lpstrErrorMessage, UInt32 dwErrorMessageSize);

// и т.д. }

// TRANS2QUIK_2.DLL public class Trans2Quik_2 : ITrans2Quik {
private readonly string _pathToQuik;

    [DllImport("TRANS2QUIK_2.DLL", EntryPoint = "_TRANS2QUIK_CONNECT@16", CallingConvention = 				CallingConvention.StdCall)]
    public static extern long connect(string lpcstrConnectionParamsString, ref long pnExtendedErrorCode,
       byte[] lpstrErrorMessage, UInt32 dwErrorMessageSize); 

// и т.д.
}

Таким образом, в данной реализации для добавления нового Квика, работающего со своей TRans2Quik.dll мне нужно создавать и новый класс Trans2Quik_N. Дело в том, что 1-ый параметр DllImport это const string.

Вопрос: Нельзя ли как то на С# динамически создавать тип Trans2Quik, но с разными значениями поля где храниться значение "TRANS2QUIK.DLL" ?

Или подскажите идею реализации добавления нового враппера при помощи создания нового экземпляра без создания нового класса.

Mikhail Sukhov
Mikhail Sukhov

gs: Или подскажите идею реализации добавления нового враппера при помощи создания нового экземпляра без создания нового класса.

http://stocksharp.com/doc/help/html/9fb00dd4-4f0a-42a9-ab0f-9946b7acf6fe.htm

Serg
Serg

В Trade есть данные о сделке и об ордере.

a.dobryn
a.dobryn
a.dobryn

Serg: В Trade есть данные о сделке и об ордере. http://stocksharp.com/doc/Default.aspx тут нет

а, все, поняла =) спасибо =)

a.dobryn
a.dobryn

как использовать trader.GuarantyCancelOrder(registeredOrder)? написано, что trader должен быть типа TraderHelper, откуда его взять?

Greene-nsk
Greene-nsk

D_Alex: как использовать trader.GuarantyCancelOrder(registeredOrder)? написано, что trader должен быть типа TraderHelper, откуда его взять?

Тоже не нашел то, что описано в документации. Может изменилось что. В S#3.0 применительно к ордеру есть order.GuarantyCancelOrder();

a.dobryn
a.dobryn

еще вопрос - как определить, что заявка была именно исполнена, а не снята? State будет Done, а что еще посмотреть? При снятии заявки Balance в Order обнуляется или остается?

upd: все, глупый вопрос, есть метод IsMatched() upd2: а у меня нет такого метода для order

Greene-nsk
Greene-nsk

D_Alex: еще вопрос - как определить, что заявка была именно исполнена, а не снята? State будет Done, а что еще посмотреть? При снятии заявки Balance в Order обнуляется или остается?

upd: все, глупый вопрос, есть метод IsMatched() upd2: а у меня нет такого метода для order

Он в TraderHelper, как и GuarantyCancelOrder(). Для этого надо включить using Ecng.Trading.Algo;

ttt
ttt Autor

Добрый день.

1) В строке:

this.Trader.Trades += trades;

получаю ошибку: "Элемент "trades" не существует в текущем контексте".

В чем может быть дело?

  1. Настроен вывод в Квике таблиц Инструменты, Ордера, Все сделки. При обращении же к Security.Name получаю все имя RIH1 (как и требуется). При обращении к числовым полям объекта Securiry нет обновления информации: Security.MaxPrice = 0 Security.LastTrade = null Пример Sample запускал - все работает как должно.

что делаю неверно?

Mikhail Sukhov
Mikhail Sukhov

ttt: что делаю неверно?

Начинаете изучать S# без предварительного изучения C#. Так ничего не выйдет.

KAX
KAX

candlemanager работает на основе данных таблицы "Все сделки". Но эта таблица содержит данные только за текущий торговый день.

Как быть если необходимы данные за более поздний период времени? Может быть добавить в candleManager добавить возможность подгрузки данных из текстовых файлов? Например в при старте программы

Mikhail Sukhov
Mikhail Sukhov

KAX: candlemanager работает на основе данных таблицы "Все сделки". Но эта таблица содержит данные только за текущий торговый день.

Как быть если необходимы данные за более поздний период времени? Может быть добавить в candleManager добавить возможность подгрузки данных из текстовых файлов? Например в при старте программы

В разделе Экспорт произвольных таблиц показано, как грузить свечки из Квика.

KAX
KAX

Mikhail Sukhov:

KAX: candlemanager работает на основе данных таблицы "Все сделки". Но эта таблица содержит данные только за текущий торговый день.

Как быть если необходимы данные за более поздний период времени? Может быть добавить в candleManager добавить возможность подгрузки данных из текстовых файлов? Например в при старте программы

В разделе Экспорт произвольных таблиц показано, как грузить свечки из Квика.

Не совсем понял, что Вы имеете в виду, либо Вы меня не поняли.

Таймфрем - 5 минут, за торговый день всего 96 свечек (ммвб)

Хотим в 10:36 получить последние 5 свечек, GetTimeFrameCandles(sec, TimeSpan.FromMinutes(5), 5) получим только одну сегодняшнюю свечу. А как получить остальные четыре за вчера?

Mikhail Sukhov
Mikhail Sukhov

KAX: Хотим в 10:36 получить последние 5 свечек, GetTimeFrameCandles(sec, TimeSpan.FromMinutes(5), 5) получим только одну сегодняшнюю свечу. А как получить остальные четыре за вчера?

В разделе Экспорт произвольных таблиц показано, как грузить свечки из Квика за вчерашний день.

KAX
KAX

Mikhail Sukhov:

KAX: Хотим в 10:36 получить последние 5 свечек, GetTimeFrameCandles(sec, TimeSpan.FromMinutes(5), 5) получим только одну сегодняшнюю свечу. А как получить остальные четыре за вчера?

В разделе Экспорт произвольных таблиц показано, как грузить свечки из Квика за вчерашний день.

О нашел, раньше просто смотрел в файле .chm в архиве с библиотекой. На сайте актуальней информация оказалась. Спасибо =)

Mikhail Sukhov
Mikhail Sukhov

KAX:

Mikhail Sukhov:

KAX: Хотим в 10:36 получить последние 5 свечек, GetTimeFrameCandles(sec, TimeSpan.FromMinutes(5), 5) получим только одну сегодняшнюю свечу. А как получить остальные четыре за вчера?

В разделе Экспорт произвольных таблиц показано, как грузить свечки из Квика за вчерашний день.

О нашел, раньше просто смотрел в файле .chm в архиве с библиотекой. На сайте актуальней информация оказалась. Спасибо =)

Версии новые выходят.

ttt
ttt Autor

первый вопрос снимается.

по второму: Настроен вывод в Квике таблиц Инструменты, Ордера, Все сделки. При обращении же к Security.Name получаю имя RIH1 (как и требуется). При обращении к числовым полям объекта Security нет обновления информации: Security.MaxPrice = 0 Security.LastTrade = null Пример Sample запускал - все работает как должно. Проверено, что экспорт из Квика таблиц Инструментов и Всех сделок настроен верно. В чем причина, что данные из таблицы Инструменты обновляются, а из таблицы Все Сделки - нет?

Mikhail Sukhov
Mikhail Sukhov

ttt: Проверено, что экспорт из Квика таблиц Инструментов и Всех сделок настроен верно. В чем причина, что данные из таблицы Инструменты обновляются, а из таблицы Все Сделки - нет?

Смотрите на ProcessDataError. Убедитесь что NewTrades не вызывается.

ttt
ttt Autor

NewTrades не вызывается.

this.Trader.Terminal.StartDde(this.Trader.SecuritiesTable, this.Trader.OrdersTable, this.Trader.TradesTable); //... далее следуют проверки, что экспорт всех трех таблиц запущен Security sec_1 = this.Trader.Securities.FirstOrDefault(sec => sec.Code == "RIH1"); AddToLog(this.textBox1, sec_1.Name.ToString()); //вывод на экран названия инструмента while (true) { if(sec_1!=null) { AddToLog(this.textBox1, sec_1.Name.ToString()); AddToLog(this.textBox2, sec_1.LastTrade.ToString()); AddToLog(this.textBox3, sec_1.MaxPrice.ToString()); } Thread.Sleep(1000); } Все сделано как написано в документации и на форуме. Возможно ли такое, что для запуска обновления полей Security.LastTrade и Security.Security.MaxPrice надо явно указать, что для Sec_1 начать обновление?

Mikhail Sukhov
Mikhail Sukhov

Sample работает? Verifier что нибудь выводит? ProcessDataError?

skuvv
skuvv

Вопрос по ситуации с [FORTS] В операции отказано: Превышен лимит операций от указанного клиента.: Асинхронный режим, отменяется ордер и отправляется новый. Приходит сообщение о флуде(в новом ордере) и потом не приходит сообщение об отмене ордера - заявка остается активной, но TraderHelper.IsCanceled считает заявку отклоненной... Посоветуйте, что можно сделать?

Mikhail Sukhov
Mikhail Sukhov

skuvv: Вопрос по ситуации с [FORTS] В операции отказано: Превышен лимит операций от указанного клиента.: Асинхронный режим, отменяется ордер и отправляется новый. Приходит сообщение о флуде(в новом ордере) и потом не приходит сообщение об отмене ордера - заявка остается активной, но TraderHelper.IsCanceled считает заявку отклоненной... Посоветуйте, что можно сделать?

Какая версия?

skuvv
skuvv

Mikhail Sukhov:

skuvv: Вопрос по ситуации с [FORTS] В операции отказано: Превышен лимит операций от указанного клиента.: Асинхронный режим, отменяется ордер и отправляется новый. Приходит сообщение о флуде(в новом ордере) и потом не приходит сообщение об отмене ордера - заявка остается активной, но TraderHelper.IsCanceled считает заявку отклоненной... Посоветуйте, что можно сделать?

Какая версия? 2.6

Mikhail Sukhov
Mikhail Sukhov

skuvv: 2.6

В 3.0 я чинил снятие заявок в асинхронном режиме. Может это та самая ошибка.

skuvv
skuvv

Mikhail Sukhov:

skuvv: 2.6

В 3.0 я чинил снятие заявок в асинхронном режиме. Может это та самая ошибка. ОК, спасибо, проверю

esper
esper

Всем добрый день. Возникла следующая ситауция, мне необходимо получить данные из талицы "Портфель по деривативам" с добавленными колонками.

Код примерно следующий:

//добавляем столбцы trader.DerivativePortfoliosTable.Columns.Insert(2, DdeDerivativePortfolioColumns.CurrentLimitPositionsPrice); trader.DerivativePortfoliosTable.Columns.Insert(5, DdeDerivativePortfolioColumns.ACI); trader.DerivativePortfoliosTable.Columns.Add(DdeDerivativePortfolioColumns.MarketCommission);

//обработчик получения новых записей trader.NewPortfolios += obj => {

};

В обработчик приходит список объектов BusinessEntities.Portfolio, но в свойстве ExtensionInfo нет данных по дополнительным полям, каким образом можно их получить?

Alexander
Alexander

esper: Всем добрый день. Возникла следующая ситауция, мне необходимо получить данные из талицы "Портфель по деривативам" с добавленными колонками.

Код примерно следующий:

//добавляем столбцы trader.DerivativePortfoliosTable.Columns.Insert(2, DdeDerivativePortfolioColumns.CurrentLimitPositionsPrice); trader.DerivativePortfoliosTable.Columns.Insert(5, DdeDerivativePortfolioColumns.ACI); trader.DerivativePortfoliosTable.Columns.Add(DdeDerivativePortfolioColumns.MarketCommission);

//обработчик получения новых записей trader.NewPortfolios += obj => {

};

В обработчик приходит список объектов BusinessEntities.Portfolio, но в свойстве ExtensionInfo нет данных по дополнительным полям, каким образом можно их получить?

Аналогичная проблема была вчера. Версия 3.0.5. Ожидание не помогло (ждал, может вначале портфели приходят из другого места, потом обновляется...).

Mikhail Sukhov
Mikhail Sukhov

Alexander: Аналогичная проблема была вчера. Версия 3.0.5. Ожидание не помогло (ждал, может вначале портфели приходят из другого места, потом обновляется...).

Да, во первых надо ждать и в NewPortolios и в PortfoliosChanged, так как ExtensionInfo может и позднее заполниться. А вот вторых подтверждаю багу с Insert. С Add у меня работает. Буду фиксить.

esper
esper

Спасибо. Попутно возник еще такой вопрос, в таблице "Портфель по деривативам" есть поле "Тип лимита" и ряд других, но в объекте BusinessEntities.Portfolio таких полей нет, их ожидать тоже в ExtensionInfo?

Mikhail Sukhov
Mikhail Sukhov

esper: Спасибо. Попутно возник еще такой вопрос, в таблице "Портфель по деривативам" есть поле "Тип лимита" и ряд других, но в объекте BusinessEntities.Portfolio таких полей нет, их ожидать тоже в ExtensionInfo?

Тип лимита нет. Смотрится только тип лимита Деньги. Другие - это какие?

esper
esper

Mikhail Sukhov: Другие - это какие?

Если я правильно понял, то поля отображаются следующим образом.

Портфель по деривативам:

Торговый счет - Name Предыд. лимит откр. поз. - BeginAmount Тек. чист. поз. - CurrentAmount Вариац. маржа - ? Тип лимита - опускаем

Позиции по деривативам:

Торговый счет - Portfolio Код инструмента - Security Вход. чист. поз. - BeginValue Тек. чист. поз. - CurrentValue Акт. покупка - ? Акт. продажа - ?

Mikhail Sukhov
Mikhail Sukhov

esper: Вариац. маржа - ?

Да, это недоделка. Было желание вычислять текущее значение денег на ФОРТС, но не потом сдался. Надо это куда-то деть. Предлагаю в Portfolio.Leverage.

esper: Акт. покупка - ? Акт. продажа - ?

Их сумма записывается в Position.BlockedValue

esper
esper

Mikhail Sukhov:

esper: Вариац. маржа - ?

Да, это недоделка. Было желание вычислять текущее значение денег на ФОРТС, но не потом сдался. Надо это куда-то деть. Предлагаю в Portfolio.Leverage.

esper: Акт. покупка - ? Акт. продажа - ?

Их сумма записывается в Position.BlockedValue

С этим можно сказать разобрались. А вот еще такой вопрос, есть портфель по деривативам, подписываюсь на новую запись в таблице и на изменение данных, событие изменения данных возникает до события новой записи, это нормальная ситуация?

Mikhail Sukhov
Mikhail Sukhov

esper: А вот еще такой вопрос, есть портфель по деривативам, подписываюсь на новую запись в таблице и на изменение данных, событие изменения данных возникает до события новой записи, это нормальная ситуация?

Не могу воспроизвести.

esper
esper

Mikhail Sukhov:

esper: А вот еще такой вопрос, есть портфель по деривативам, подписываюсь на новую запись в таблице и на изменение данных, событие изменения данных возникает до события новой записи, это нормальная ситуация?

Не могу воспроизвести.

У меня тоже не всегда удается повторить эту ситуацию, если удасться найти что приводит к ней, то отпишусь здесь.

a.dobryn
a.dobryn

а что произойдет, если пробовать снять заявку, у которой статус Done? кроме сообщения о невозможности сделать это. Как можно отловить подобное событие?

Mikhail Sukhov
Mikhail Sukhov

D_Alex: а что произойдет, если пробовать снять заявку, у которой статус Done? кроме сообщения о невозможности сделать это. Как можно отловить подобное событие?

ITrader.OrdersFailed

a.dobryn
a.dobryn

Mikhail Sukhov:

D_Alex: а что произойдет, если пробовать снять заявку, у которой статус Done? кроме сообщения о невозможности сделать это. Как можно отловить подобное событие?

ITrader.OrdersFailed

глупый вопрос, а после этого события и выдачи messagebox, функция, в которой находилась строка CancelOrder продолжает работать дальше?

написано так:

 MainWindow.Instance.CancelOrder(MainWindow.Instance._ordersWindow.Orders[orderNum]);
                                                            
if (MainWindow.Instance._ordersWindow.Orders[orderNum].IsCanceled() == false)                               
{
    .....  //в итоге в том случае, если заявка уже исполнена и возникла ошибка, сюда не приходит
}
a.dobryn
a.dobryn

D_Alex:

Mikhail Sukhov:

D_Alex: а что произойдет, если пробовать снять заявку, у которой статус Done? кроме сообщения о невозможности сделать это. Как можно отловить подобное событие?

ITrader.OrdersFailed

глупый вопрос, а после этого события и выдачи messagebox, функция, в которой находилась строка CancelOrder продолжает работать дальше?

написано так:

MainWindow.Instance.CancelOrder(MainWindow.Instance._ordersWindow.Orders[orderNum]);

if (MainWindow.Instance._ordersWindow.Orders[orderNum].IsCanceled() == false)
{ ..... //в итоге в том случае, если заявка уже исполнена и возникла ошибка, сюда не приходит }


проблема решена, надо использовать try{} catch(), так как "невозможно снять заявку" это exception
skuvv
skuvv

После вызова _trader.ReRegisterOrder при изменении заявки, TraderHelper.IsCanceled = true. Собственно вопрос как можно различить отмененный ордер от замененного? В обоих OrderStates.Done и order.Balance > 0 Можно конечно last message смотреть как вариант. PS На игровом сервере поле "снята(время)" пустое

Mikhail Sukhov
Mikhail Sukhov

skuvv: Собственно вопрос как можно различить отмененный ордер от замененного?

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

skuvv
skuvv

Опять про Replace. Попробывал пару вариантов и безуспешно. Верхний вариант с отслеживанием нового ордера (по TransactionId), нижние отслеживание старого ордера


//Ecng.Trading.BusinessEntities.Order _NewOrder = _trader.ReRegisterOrder(Order, newPrice, (int)newQty);
21.02.2011 22:16:59 [Sending New Order] GZH1 Price: 19745 Qty: 1
21.02.2011 22:17:00 [parse_order] 79897973
21.02.2011 22:17:00 [_trader_OrdersChanged] order status Active
21.02.2011 22:17:00 [_trader_OrdersChanged] Thread: EventDispatcher thread #заявки
21.02.2011 22:17:00 [_trader_OrdersChanged] order Accepted Done
21.02.2011 22:17:00 [parse_order] 79897973
21.02.2011 22:17:00 [_trader_OrdersChanged] order status Active
21.02.2011 22:17:00 [_trader_OrdersChanged] Thread: EventDispatcher thread #заявки
21.02.2011 22:17:00 [parse_order] 79897973
21.02.2011 22:17:00 [_trader_OrdersChanged] order status Active
21.02.2011 22:17:31 [Replace] 19715 x 1
21.02.2011 22:17:31 [parse_order] 79897974
21.02.2011 22:17:31 [_trader_OrdersChanged] order status NULL
21.02.2011 22:17:31 [_trader_OrdersChanged] Thread: null
21.02.2011 22:17:32 [_trader_OrdersChanged] Thread: EventDispatcher thread #заявки
21.02.2011 22:17:32 [_trader_OrdersChanged] Thread: EventDispatcher thread #заявки
21.02.2011 22:17:32 [parse_order] 79897974
21.02.2011 22:17:32 [_trader_OrdersChanged] order status NULL
->в квике новая заявка без transaction id

//_trader.ReRegisterOrder(Order,  newPrice, (int)newQty);
21.02.2011 23:29:53 [Sending New Order] GZH1 Price: 19799 Qty: 1
21.02.2011 23:29:53 [parse_order] 84292206
21.02.2011 23:29:54 [_trader_OrdersChanged] order status Active
21.02.2011 23:29:54 [_trader_OrdersChanged] order Accepted Done
21.02.2011 23:29:55 [_trader_OrdersChanged] Thread: EventDispatcher thread #заявки
21.02.2011 23:29:55 [parse_order] 84292206
21.02.2011 23:29:55 [_trader_OrdersChanged] order status Active
21.02.2011 23:29:55 [_trader_OrdersChanged] Thread: EventDispatcher thread #заявки
21.02.2011 23:29:55 [parse_order] 84292206
21.02.2011 23:29:55 [_trader_OrdersChanged] order status Active
21.02.2011 23:29:59 [Replace] 19759 x 1
21.02.2011 23:30:00 [_trader_OrdersChanged] Thread: null
21.02.2011 23:30:00 [parse_order] 84292206
21.02.2011 23:30:00 [_trader_OrdersChanged] order status Done
21.02.2011 23:30:00 [_trader_OrdersChanged] order Replaced Done
21.02.2011 23:30:01 [_trader_OrdersChanged] Thread: EventDispatcher thread #заявки
21.02.2011 23:30:01 [parse_order] 84292206
21.02.2011 23:30:01 [_trader_OrdersChanged] order status Done
21.02.2011 23:30:01 [_trader_OrdersChanged] order Replaced Done
21.02.2011 23:30:01 [_trader_OrdersChanged] Thread: EventDispatcher thread #заявки
21.02.2011 23:32:15 [Replace] 19752 x 1
->нет events//в квике новая заявка без transaction id

_trader.ReRegisterOrder(OrderList.ElementAt(index).Key, _order);
21.02.2011 23:48:30 [Sending New Order] GZH1 Price: 19809 Qty: 1
21.02.2011 23:48:31 [parse_order] 85085851
21.02.2011 23:48:31 [_trader_OrdersChanged] order status Active
21.02.2011 23:48:31 [_trader_OrdersChanged] order Accepted Done
21.02.2011 23:48:31 [_trader_OrdersChanged] Thread: EventDispatcher thread #заявки
21.02.2011 23:48:32 [parse_order] 85085851
21.02.2011 23:48:32 [_trader_OrdersChanged] order status Active
21.02.2011 23:48:32 [_trader_OrdersChanged] Thread: EventDispatcher thread #заявки
21.02.2011 23:48:32 [parse_order] 85085851
21.02.2011 23:48:32 [_trader_OrdersChanged] order status Active
21.02.2011 23:48:36 [Replace] 19803 x 1
->нет events//в квике нет новой заявки

a.dobryn
a.dobryn

и еще вопрос - можно как-то узнать, что заявка была именно снята, а не исполнена, и наоборот?

upd: ой, я подобный вопрос уже спрашивала. Надо использовать метод TraderHelper..::.IsCanceled

skuvv
skuvv

D_Alex: и еще вопрос - можно как-то узнать, что заявка была именно снята, а не исполнена, и наоборот?

upd: ой, я подобный вопрос уже спрашивала. Надо использовать метод TraderHelper..::.IsCanceled Метод подходит если не планируется делать Replace заявки, после Replace IsCanceled=true

a.dobryn
a.dobryn

skuvv:

D_Alex: и еще вопрос - можно как-то узнать, что заявка была именно снята, а не исполнена, и наоборот?

upd: ой, я подобный вопрос уже спрашивала. Надо использовать метод TraderHelper..::.IsCanceled Метод подходит если не планируется делать Replace заявки, после Replace IsCanceled=true

не планирую =) спасибо за информацию =)

freelancer
freelancer

Здравствуйте. Все цены инструмента (лучшая покупка, продажа и т.д.) у меня равны нулю почему-то (событие SecuritiesChanged). И даже в примере "Sample". Почему так ? Версия - последняя

Mikhail Sukhov
Mikhail Sukhov

freelancer: Здравствуйте. Все цены инструмента (лучшая покупка, продажа и т.д.) у меня равны нулю почему-то (событие SecuritiesChanged). И даже в примере "Sample". Почему так ? Версия - последняя

Надо запустить экспорт стаканов.

freelancer
freelancer

Trader.Terminal.StartDde(Trader.QuotesTable); (не работает) или Trader.StartExport();

Mikhail Sukhov
Mikhail Sukhov

freelancer: Trader.Terminal.StartDde(Trader.QuotesTable); (не работает) или Trader.StartExport();

В документации написано как работать со стаканом.

freelancer
freelancer

Mikhail Sukhov: В документации написано как работать со стаканом Спасибо. Вроде заработало

a.dobryn
a.dobryn

как пользоваться IsTradeTime? откуда брать exchange?

Mikhail Sukhov
Mikhail Sukhov

D_Alex: как пользоваться IsTradeTime? откуда брать exchange?

Например, из инструмента.

a.dobryn
a.dobryn

Mikhail Sukhov:

D_Alex: как пользоваться IsTradeTime? откуда брать exchange?

Например, из инструмента.

спасибо, получилось =)

skuvv
skuvv

По поводу ReRegisterOrder, при использовании такого кода:


                            Ecng.Trading.BusinessEntities.Order _order = order.Clone();
                            _order.Volume = newQty;
                            _order.Price = newPrice;
                            _trader.ReRegisterOrder(order, _order);

получаю отклоненный ордер с сообщением "Сообщение [FORTS] Ошибка в задании входных параметров.. New Order1 ID: 0, new Order2 ID:0"

Mikhail Sukhov
Mikhail Sukhov

skuvv: По поводу ReRegisterOrder, при использовании такого кода:

                        Ecng.Trading.BusinessEntities.Order _order = order.Clone();
                        _order.Volume = newQty;
                        _order.Price = newPrice;
                        _trader.ReRegisterOrder(order, _order);
> получаю отклоненный ордер с сообщением "Сообщение [FORTS] Ошибка в задании входных параметров.. New Order1 ID: 0, new Order2 ID:0"

Подозреваю, что какие то параметры неправильные. newQty и newPrice проверьте.
skuvv
skuvv

Mikhail Sukhov:

skuvv: По поводу ReRegisterOrder, при использовании такого кода:

                        Ecng.Trading.BusinessEntities.Order _order = order.Clone();
                        _order.Volume = newQty;
                        _order.Price = newPrice;
                        _trader.ReRegisterOrder(order, _order);
> > получаю отклоненный ордер с сообщением "Сообщение [FORTS] Ошибка в задании входных параметров.. New Order1 ID: 0, new Order2 ID:0"
> 
> Подозреваю, что какие то параметры неправильные. newQty и newPrice проверьте.
v3.0.13 ошибка ушла.
замененный ордер не заполняет поле OrderStatus, и всегда ==null
[![](http://i17.fastpic.ru/big/2011/0309/9f/5aa65920cb513088f288f4aabf91bb9f.png)](http://fastpic.ru/)
PS для стоп-ордеров статус корректный
skuvv
skuvv

skuvv:

Mikhail Sukhov:

skuvv: По поводу ReRegisterOrder, при использовании такого кода:

                        Ecng.Trading.BusinessEntities.Order _order = order.Clone();
                        _order.Volume = newQty;
                        _order.Price = newPrice;
                        _trader.ReRegisterOrder(order, _order);
> > > получаю отклоненный ордер с сообщением "Сообщение [FORTS] Ошибка в задании входных параметров.. New Order1 ID: 0, new Order2 ID:0"
> >
> > Подозреваю, что какие то параметры неправильные. newQty и newPrice проверьте.
> v3.0.13 ошибка ушла.
> замененный ордер не заполняет поле OrderStatus, и всегда ==null
> [![](http://i17.fastpic.ru/big/2011/0309/9f/5aa65920cb513088f288f4aabf91bb9f.png)](http://fastpic.ru/)
> PS для стоп-ордеров статус корректный
Подтверждаю в 3.0.16 ошибка исправлена,
Появилась новая, при использовании для снятия ордера команды TraderHelper, он фризит все потоки(на 20 секунд) и соответсвенно до таймаута не может получить новые события(dde вывод тоже висит) 
                    try
                    {
                        TraderHelper.GuarantyCancelOrder(order);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(Time.ToString(timefmt) + " ***Cancelling order Reject*** "+ex.ToString());
                    }
Как только срабатывает эксепшн, собятия начинают приходить
Mikhail Sukhov
Mikhail Sukhov

skuvv: Появилась новая, при использовании для снятия ордера команды TraderHelper, он фризит все потоки(на 20 секунд) и соответсвенно до таймаута не может получить новые события(dde вывод тоже висит)

А как проверялось что и другие потоки замирали? Вообще фриз происходит только на текущий поток. GuarantyCancel напрямую вызывался из кода или через котирование?

skuvv
skuvv

Mikhail Sukhov:

skuvv: Появилась новая, при использовании для снятия ордера команды TraderHelper, он фризит все потоки(на 20 секунд) и соответсвенно до таймаута не может получить новые события(dde вывод тоже висит)

А как проверялось что и другие потоки замирали? Вообще фриз происходит только на текущий поток. GuarantyCancel напрямую вызывался из кода или через котирование? Вызывался из основного потока и соответсвенно весь мой GUI замирал. По логам никаких ивентов в этот промежуток небыло, зато сразу после фриза, накопленные данные пачкой выливаются из квика(сильный пик активности)

Mikhail Sukhov
Mikhail Sukhov

skuvv:

Mikhail Sukhov:

skuvv: Появилась новая, при использовании для снятия ордера команды TraderHelper, он фризит все потоки(на 20 секунд) и соответсвенно до таймаута не может получить новые события(dde вывод тоже висит)

А как проверялось что и другие потоки замирали? Вообще фриз происходит только на текущий поток. GuarantyCancel напрямую вызывался из кода или через котирование? Вызывался из основного потока и соответсвенно весь мой GUI замирал. По логам никаких ивентов в этот промежуток небыло, зато сразу после фриза, накопленные данные пачкой выливаются из квика(сильный пик активности)

  1. Из GUI потока торговлю делать не нужно.
  2. Потому что наверняка вы из других обработчиков делаете GuiSync. А так как GUI поток заблокирован из-за неправильного пункта 1, то виснут и сами обработчики.
skuvv
skuvv

Mikhail Sukhov:

skuvv:

Mikhail Sukhov:

skuvv: Появилась новая, при использовании для снятия ордера команды TraderHelper, он фризит все потоки(на 20 секунд) и соответсвенно до таймаута не может получить новые события(dde вывод тоже висит)

А как проверялось что и другие потоки замирали? Вообще фриз происходит только на текущий поток. GuarantyCancel напрямую вызывался из кода или через котирование? Вызывался из основного потока и соответсвенно весь мой GUI замирал. По логам никаких ивентов в этот промежуток небыло, зато сразу после фриза, накопленные данные пачкой выливаются из квика(сильный пик активности)

  1. Из GUI потока торговлю делать не нужно.
  2. Потому что наверняка вы из других обработчиков делаете GuiSync. А так как GUI поток заблокирован из-за неправильного пункта 1, то виснут и сами обработчики. Проблема повторяется и не только из мейн потока. Попробовал TraderHelper в Sample примере, все ок. Видимо проблема у меня, но раньше её не было(до 3.0.13 включительно)....
dimakl
dimakl

Здравствуйте. У меня не работает пример SampleConsole, причем для разных Quik не работает по разному. Сделал все как написано в примере из мануала.

  1. QuikJunior от Quik. Verifer ругается "Таблица инструменты. В таблице "инструменты" по индексу 3 должна быть колонка "Статус" вместо колонки "Статус торговли инструментом""(В настройках я не нашел колонки Статус). Но SampleConsole в свою очередь нормально подключается, находит инструмент и портфель, только все данные по инструменту равны 0. Т.е. цена например всегда равна 0.

  2. Quik от КитФинанс. Verifier говорит что все в порядке. Но в данном случае находится инструмент, но не находится портфель. Вообще событие о появление нового портфеля не происходит. Хотя в настройках квика есть два портфеля.

StockSharp 3.0.15 Quik 5.18

Mikhail Sukhov
Mikhail Sukhov

dimakl: Здравствуйте. У меня не работает пример SampleConsole, причем для разных Quik не работает по разному. Сделал все как написано в примере из мануала.

В примере ошибка - нужно еще экспортировать стакан. Предупреждение о статусе игнорируйте.

MCTuTeJ|19951995
MCTuTeJ|19951995

Есть вопрос по MarketQuotingStrategy: Верно ли что метод OnProcess родительской стратегии не будет вызываться до тех пор, пока котирование не завершится ?

MCTuTeJ|19951995
MCTuTeJ|19951995

При использовании MarketQuotingStrategy столкнулся с такой ошибкой:

MQS 11:30:40.6451718 System.ArgumentOutOfRangeException: Десятичное число может округляться только с точностью от 0 до 28 разрядов. Имя параметра: decimals в System.Decimal.FCallRound(Decimal& d, Int32 decimals) в System.Decimal.Round(Decimal d, Int32 decimals) в Ecng.Trading.Algo.TraderHelper.ShrinkPrice(Security security, Double price, ShrinkRules rule) в Ecng.Trading.Algo.Strategies.QuotingStrategy.OnProcess() в Ecng.Trading.Algo.Strategies.Strategy.#=qiRcAHlpbxRjZjyUrS0Iw1A==() MQS 11:30:40.6500546 Стратегия останавливается. MQS 11:30:42.4820859 Котирование закончилось. MQS 11:30:42.4830625 Стратегия остановлена.

Стратегию создаю след, образом:


MarketQuotingStrategy strategy = new MarketQuotingStrategy(MarketOrder, new Unit(), new Unit());
                                    strategy.IsParallel = true;
                                    this.ChildStrategies.Add(strategy);

Пробовал создавать непустые юниты ( с единичками, торгую на инструменте с шагом цены 1 )

Mikhail Sukhov
Mikhail Sukhov

MCTuTeJ|19951995: При использовании MarketQuotingStrategy столкнулся с такой ошибкой:

MQS 11:30:40.6451718 System.ArgumentOutOfRangeException: Десятичное число может округляться только с точностью от 0 до 28 разрядов. Имя параметра: decimals в System.Decimal.FCallRound(Decimal& d, Int32 decimals) в System.Decimal.Round(Decimal d, Int32 decimals) в Ecng.Trading.Algo.TraderHelper.ShrinkPrice(Security security, Double price, ShrinkRules rule) в Ecng.Trading.Algo.Strategies.QuotingStrategy.OnProcess() в Ecng.Trading.Algo.Strategies.Strategy.#=qiRcAHlpbxRjZjyUrS0Iw1A==()

Это не поможет http://stocksharp.com/forum/1060/dielieniie-na-0-pri-kotirovanii/

MCTuTeJ|19951995
MCTuTeJ|19951995

Mikhail Sukhov:

MCTuTeJ|19951995: При использовании MarketQuotingStrategy столкнулся с такой ошибкой:

MQS 11:30:40.6451718 System.ArgumentOutOfRangeException: Десятичное число может округляться только с точностью от 0 до 28 разрядов. Имя параметра: decimals в System.Decimal.FCallRound(Decimal& d, Int32 decimals) в System.Decimal.Round(Decimal d, Int32 decimals) в Ecng.Trading.Algo.TraderHelper.ShrinkPrice(Security security, Double price, ShrinkRules rule) в Ecng.Trading.Algo.Strategies.QuotingStrategy.OnProcess() в Ecng.Trading.Algo.Strategies.Strategy.#=qiRcAHlpbxRjZjyUrS0Iw1A==()

Это не поможет http://stocksharp.com/forum/1060/dielieniie-na-0-pri-kotirovanii/

Я так понял у вопрошаюшего была проблема с таблицей инструментов - лишняя колонка.

Я из этой таблицы дополнительно беру волатильность и дату эксперации, может в этом быть проблема ? Verifierom проверял, не ругается вроде. Да, версия s# 2.6 .

Mikhail Sukhov
Mikhail Sukhov

MCTuTeJ|19951995: Я так понял у вопрошаюшего была проблема с таблицей инструментов - лишняя колонка.

Я из этой таблицы дополнительно беру волатильность и дату эксперации, может в этом быть проблема ? Verifierom проверял, не ругается вроде. Да, версия s# 2.6 .

Тогда выведите, чему равны в программе значения Security MinStepSize Decimals + цену передаваемой заявки.

MCTuTeJ|19951995
MCTuTeJ|19951995

Decimals 100 MinStepSize 1 Цена 21420

MCTuTeJ|19951995
MCTuTeJ|19951995

Видимо проблема в decimals 100 ))

Mikhail Sukhov
Mikhail Sukhov

MCTuTeJ|19951995: Видимо проблема в decimals 100 ))

Точно Verifier не ругается? Приведите скрин таблицы?

MCTuTeJ|19951995
MCTuTeJ|19951995

Scurity:

MCTuTeJ|19951995
MCTuTeJ|19951995

Mikhail Sukhov
Mikhail Sukhov

Какая версия S#?

MCTuTeJ|19951995
MCTuTeJ|19951995

S# 2.6. Только что попробовал у MQS руками поправить Security.Decimals, начала вываливаться ошибка "ССылка на объект не казывает на экземпляр" ...

Mikhail Sukhov
Mikhail Sukhov

MCTuTeJ|19951995: S# 2.6.

То, что указано в разделе Модификация стандартных таблиц сделали?

MCTuTeJ|19951995
MCTuTeJ|19951995

Если Вы имели ввиду "Экспорт дополнительных колонок" то да, сделал.

Mikhail Sukhov
Mikhail Sukhov

MCTuTeJ|19951995: Если Вы имели ввиду "Экспорт дополнительных колонок" то да, сделал.

Я имею ввиду Модификация стандартных таблиц. Прочитайте раздел Настройки Квика (там где написано про дату изменений на ФОРТС + ММВБ). И раздел Модификация стандартных таблиц, как чинить.

MCTuTeJ|19951995
MCTuTeJ|19951995

Михаил, а не могли бы Вы, если не трудно, носом ткнуть в этот раздел ? Просто я что-то не могу найти его (

MCTuTeJ|19951995
MCTuTeJ|19951995

а всё, нашел ))

MCTuTeJ|19951995
MCTuTeJ|19951995

Ну да, сделал вроде всё как описано - колонки в конец и потом


Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.Volatility);
Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.SettlementDate);
Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.ExpiryDate);

Mikhail Sukhov
Mikhail Sukhov

MCTuTeJ|19951995: Ну да, сделал вроде всё как описано - колонки в конец и потом

Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.Volatility); Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.SettlementDate); Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.ExpiryDate);


У меня в разделе Модификация стандартных таблиц версии 2.6 написано совсем другое:

// создаем шлюз к Quik-у _trader = new QuikTrader(this.Path.Text);

var columns = _trader.SecuritiesTable.Columns;

// вставляем колонку Время последнего изменения по индексу колонки Время последней сделки // последняя при это перемещается "вперед" columns.Insert(columns.IndexOf(DdeSecurityColumns.LastTradeTime), DdeSecurityColumns.LastChangeTime);

MCTuTeJ|19951995
MCTuTeJ|19951995

Mikhail Sukhov:

MCTuTeJ|19951995: Ну да, сделал вроде всё как описано - колонки в конец и потом

Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.Volatility); Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.SettlementDate); Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.ExpiryDate);

> 
> У меня в разделе Модификация стандартных таблиц версии 2.6 написано совсем другое:
> 
> ```
// создаем шлюз к Quik-у
_trader = new QuikTrader(this.Path.Text);

var columns = _trader.SecuritiesTable.Columns;

// вставляем колонку Время последнего изменения по индексу колонки Время последней сделки
// последняя при это перемещается "вперед"
columns.Insert(columns.IndexOf(DdeSecurityColumns.LastTradeTime), DdeSecurityColumns.LastChangeTime);

Там же вроде указано несколько вариантов... Использую описанный выше - волатильность и дата эксперации нормально работают.

MCTuTeJ|19951995
MCTuTeJ|19951995

А у всех в Win7 справка криво работает ? Её нужно в корень копировать (или чтобы путь был без спецальных символов и русских букв).

VsevolodG
VsevolodG

Здравствуйте!

Мне нужно сделать робота со следующим алгоритмом:

  1. При запуске выставляются две заявки на покупку и на продажу
  2. После двух подряд покупок или продаж выставлять стоп-лимиты
  3. Когда срабатывает стоп-лимит выставлять тейк-профит на обратную сделку

На основе примеров я создал подключение к Quik. Дальше сразу же затык на получении текущей цены бумаги, на основании которой выставлять первые две заявки. После выставления заявок, как я понимаю, необходимо отслеживать событие NewTrades. Я прав?

Уточните, пожалуйста, как узнать текущую цену бумаги (которая отображается на "графике цены и объема"). А также правильным ли путем я иду или надо создавать какие-то стратегии?

VsevolodG
VsevolodG

VsevolodG: Здравствуйте!

Мне нужно сделать робота со следующим алгоритмом:

  1. При запуске выставляются две заявки на покупку и на продажу
  2. После двух подряд покупок или продаж выставлять стоп-лимиты
  3. Когда срабатывает стоп-лимит выставлять тейк-профит на обратную сделку

На основе примеров я создал подключение к Quik. Дальше сразу же затык на получении текущей цены бумаги, на основании которой выставлять первые две заявки. После выставления заявок, как я понимаю, необходимо отслеживать событие NewTrades. Я прав?

Уточните, пожалуйста, как узнать текущую цену бумаги (которая отображается на "графике цены и объема"). А также правильным ли путем я иду или надо создавать какие-то стратегии?

Не оставляйте, пожалуйста, без внимания мои вопросы

Alexander
Alexander

VsevolodG:

VsevolodG: Здравствуйте!

Мне нужно сделать робота со следующим алгоритмом:

  1. При запуске выставляются две заявки на покупку и на продажу
  2. После двух подряд покупок или продаж выставлять стоп-лимиты
  3. Когда срабатывает стоп-лимит выставлять тейк-профит на обратную сделку

На основе примеров я создал подключение к Quik. Дальше сразу же затык на получении текущей цены бумаги, на основании которой выставлять первые две заявки. После выставления заявок, как я понимаю, необходимо отслеживать событие NewTrades. Я прав?

Уточните, пожалуйста, как узнать текущую цену бумаги (которая отображается на "графике цены и объема"). А также правильным ли путем я иду или надо создавать какие-то стратегии?

Не оставляйте, пожалуйста, без внимания мои вопросы

В первую очередь следует изучить документацию и посмотреть примеры более внимательно.

  1. Что значит "текущая цена бумаги"? Цена последней сделки бумаги? В данном вопросе уже содержится ответ. Security - бумага LastTrade - последняя сделка Price - цена

Получаем Security.LastTrade.Price

  1. Зачем все сделки, если интересуют только собственные сделки? NewMyTrades отслеживать

Если это всё что нужно, то можно и без стратегий.

VsevolodG
VsevolodG

Alexander:

VsevolodG:

VsevolodG: Здравствуйте!

Мне нужно сделать робота со следующим алгоритмом:

  1. При запуске выставляются две заявки на покупку и на продажу
  2. После двух подряд покупок или продаж выставлять стоп-лимиты
  3. Когда срабатывает стоп-лимит выставлять тейк-профит на обратную сделку

На основе примеров я создал подключение к Quik. Дальше сразу же затык на получении текущей цены бумаги, на основании которой выставлять первые две заявки. После выставления заявок, как я понимаю, необходимо отслеживать событие NewTrades. Я прав?

Уточните, пожалуйста, как узнать текущую цену бумаги (которая отображается на "графике цены и объема"). А также правильным ли путем я иду или надо создавать какие-то стратегии?

Не оставляйте, пожалуйста, без внимания мои вопросы

В первую очередь следует изучить документацию и посмотреть примеры более внимательно.

  1. Что значит "текущая цена бумаги"? Цена последней сделки бумаги? В данном вопросе уже содержится ответ. Security - бумага LastTrade - последняя сделка Price - цена

Получаем Security.LastTrade.Price

  1. Зачем все сделки, если интересуют только собственные сделки? NewMyTrades отслеживать

Если это всё что нужно, то можно и без стратегий.

Тогда вопрос, как получить значение Security.LastTrade.Price? В документации написано: "RegisterSecurity - Начать получать новую информацию (например, LastTrade или BestBid) по инструменту."

Соответственно, делаю так: this.Trader.RegisterSecurity(_lkoh); this.Trader.SecuritiesChanged += new Action<IEnumerable<Security>>(Trader_SecuritiesChanged);

В итоге это событие не вызывается в принципе. Хотя в Quik изменения в стакане происходят регулярно.

MCTuTeJ|19951995
MCTuTeJ|19951995

Не знаю как у других, но для меня стратегии существенно упростили работу со s#.

IlyaILH
IlyaILH

Добрый день.

Приступил к изучению S# в связи с этим у меня возник вопрос: при экспорте custom table все нормально работает, когда в таблице одна бумага, но как работать с несколькими бумагами так, например, при завпросе code инструмента выдается только код 1-го по списку инструмента.

Заранее благодарен за помощь.

Mikhail Sukhov
Mikhail Sukhov

IlyaILH: Добрый день.

Приступил к изучению S# в связи с этим у меня возник вопрос: при экспорте custom table все нормально работает, когда в таблице одна бумага, но как работать с несколькими бумагами так, например, при завпросе code инструмента выдается только код 1-го по списку инструмента.

Заранее благодарен за помощь.

Чуть подробнее и с деталями.

IlyaILH
IlyaILH

Mikhail Sukhov:

IlyaILH: Добрый день.

Приступил к изучению S# в связи с этим у меня возник вопрос: при экспорте custom table все нормально работает, когда в таблице одна бумага, но как работать с несколькими бумагами так, например, при завпросе code инструмента выдается только код 1-го по списку инструмента.

Заранее благодарен за помощь.

Чуть подробнее и с деталями.

Все с этим разобрался, Спасибо.

VsevolodG
VsevolodG

Событие SecuritiesChanged начало отрабатывать, после того как я подписался на событие: this.Trader.RegisterQuotes(_lkoh); this.Trader.QuotesChanged += new Action<IEnumerable<MarketDepth>>(Trader_QuotesChanged);

Но, цена последней сделки всегда равна нулю. "LastTrade: 0, BestBid: Бид 1998,5 2"

Mikhail Sukhov
Mikhail Sukhov

VsevolodG: Событие SecuritiesChanged начало отрабатывать, после того как я подписался на событие: this.Trader.RegisterQuotes(_lkoh); this.Trader.QuotesChanged += new Action<IEnumerable>(Trader_QuotesChanged);

Но, цена последней сделки всегда равна нулю. "LastTrade: 0, BestBid: Бид 1998,5 2"

А таблица сделок экспортируется?

Igor_B
Igor_B

Михаил. доброе время. Создали и экспортируем собственную таблицу из Квик. Данные по ДДЕ получаем (код, цена последней сделки, время посл.сделки...), сейчас пробуем экспорт стакана. Работаем в своем приложении. 1.Можно ли экспортировать данные стакана (и/или любые другие) без открытия в Квике таблиц Инструменты... 2.Пробовали создавать таблицу инструменты в Квике (пример LKOH), при выполнении lkoh = new Security(); Trader.RegisterQuotes(lkoh); - ошибка "Для инструмента не было найдено информации в таблице инструменты. Parameter name: security" В чем м.б. ошибка? Спасибо.

Alexander
Alexander

Igor_B: Михаил. доброе время. Создали и экспортируем собственную таблицу из Квик. Данные по ДДЕ получаем (код, цена последней сделки, время посл.сделки...), сейчас пробуем экспорт стакана. Работаем в своем приложении. 1.Можно ли экспортировать данные стакана (и/или любые другие) без открытия в Квике таблиц Инструменты... 2.Пробовали создавать таблицу инструменты в Квике (пример LKOH), при выполнении lkoh = new Security(); Trader.RegisterQuotes(lkoh); - ошибка "Для инструмента не было найдено информации в таблице инструменты. Parameter name: security" В чем м.б. ошибка? Спасибо.

  1. При экспорте стакана необходимо указать инструмент => нельзя, его необходимо получить.
  2. Инструмент надо не создавать, а брать - он придёт как раз при экспорте таблицы инструментов.
Igor_B
Igor_B

Alexander:

Igor_B: Михаил. доброе время. Создали и экспортируем собственную таблицу из Квик. Данные по ДДЕ получаем (код, цена последней сделки, время посл.сделки...), сейчас пробуем экспорт стакана. Работаем в своем приложении. 1.Можно ли экспортировать данные стакана (и/или любые другие) без открытия в Квике таблиц Инструменты... 2.Пробовали создавать таблицу инструменты в Квике (пример LKOH), при выполнении lkoh = new Security(); Trader.RegisterQuotes(lkoh); - ошибка "Для инструмента не было найдено информации в таблице инструменты. Parameter name: security" В чем м.б. ошибка? Спасибо.

  1. При экспорте стакана необходимо указать инструмент => нельзя, его необходимо получить.
  2. Инструмент надо не создавать, а брать - он придёт как раз при экспорте таблицы инструментов.

Александр,

Мы хотим получать инструменты не из таблицы "Инструменты", а из нашей собственной таблицы, чтобы не привязываться к встроенным таблицам. Возможно ли такое?

Mikhail Sukhov
Mikhail Sukhov

Igor_B: 2.Пробовали создавать таблицу инструменты в Квике (пример LKOH), при выполнении lkoh = new Security(); Trader.RegisterQuotes(lkoh); - ошибка "Для инструмента не было найдено информации в таблице инструменты. Parameter name: security" В чем м.б. ошибка? Спасибо.

А все основные поля у инструмента заполнили (код класс идентификатор имя)?

Igor_B
Igor_B

Mikhail Sukhov:

Igor_B: 2.Пробовали создавать таблицу инструменты в Квике (пример LKOH), при выполнении lkoh = new Security(); Trader.RegisterQuotes(lkoh); - ошибка "Для инструмента не было найдено информации в таблице инструменты. Parameter name: security" В чем м.б. ошибка? Спасибо.

А все основные поля у инструмента заполнили (код класс идентификатор имя)? Михаил, доброе время. Создали таблицу инструменты для ЛУКОЙЛа. Вывели все поля в таблицу (бумага, бумага сокращ, код бумаги.....). В приложении lkoh.ShortName = "ЛУКОЙЛ"; lkoh.Code = "LKOH"; lkoh.Class = "EQBR"; lkoh.Id = "LKOH";//ЛУКОЙЛ [А1-Акции]"; Затем

Trader.RegisterQuotes(lkoh); - выдает ошибку Для инструмента LKOH не было найдено информации в таблице инструменты. Parameter name: security Правильно ли указали Id - ? Спасибо.

Mikhail Sukhov
Mikhail Sukhov

Igor_B: lkoh.ShortName = "ЛУКОЙЛ"; lkoh.Code = "LKOH"; lkoh.Class = "EQBR"; lkoh.Id = "LKOH@EQBR";//ЛУКОЙЛ [А1-Акции]"; Затем

Trader.RegisterQuotes(lkoh); - выдает ошибку Для инструмента LKOH не было найдено информации в таблице инструменты. Parameter name: security

А версия какая?

Igor_B
Igor_B

Mikhail Sukhov:

Igor_B: lkoh.ShortName = "ЛУКОЙЛ"; lkoh.Code = "LKOH"; lkoh.Class = "EQBR"; lkoh.Id = <mark>"LKOH@EQBR"</mark>;//ЛУКОЙЛ [А1-Акции]"; Затем

Trader.RegisterQuotes(lkoh); - выдает ошибку Для инструмента LKOH не было найдено информации в таблице инструменты. Parameter name: security

А версия какая? Версия 3. Id = "LKOH@EQBR" - пробовали так - такая же ошибка. Может ли быть ошибка из-за того, что настройка столбцов таблицы отличается от настройки таблицы "инструменты" в Sample.

Mikhail Sukhov
Mikhail Sukhov

Igor_B: Версия 3. Id = "LKOH@EQBR" - пробовали так - такая же ошибка. Может ли быть ошибка из-за того, что настройка столбцов таблицы отличается от настройки таблицы "инструменты" в Sample.

А они у вас отличаются? Приведите список колонок... Кстати, а в чем эта сакраментальная идея не экспортировать инструменты?

Igor_B
Igor_B

Mikhail Sukhov:

Igor_B: Версия 3. Id = "LKOH@EQBR" - пробовали так - такая же ошибка. Может ли быть ошибка из-за того, что настройка столбцов таблицы отличается от настройки таблицы "инструменты" в Sample.

А они у вас отличаются? Приведите список колонок... Кстати, а в чем эта сакраментальная идея не экспортировать инструменты? Михаил, мы пока не хотим создавать весь набор таблиц (Сделки, Портфель, Деривативы...), создаем таблицу инструменты, хотим из нее экспортировать данные, создать стакан для какого-либо инструмента. Данные из customTable - мы успешно экспортируем, но хотели бы и задействовать стакан.

Как правильнее сделать? Спасибо.

Mikhail Sukhov
Mikhail Sukhov

Igor_B: Как правильнее сделать? Спасибо.

Правильнее будет создать таблицу Инструменты. Ее одной на первое время хватит. Думаю, 8 колонок - это не так уж много.

Igor_B
Igor_B

Mikhail Sukhov:

Igor_B: Как правильнее сделать? Спасибо.

Правильнее будет создать таблицу Инструменты. Ее одной на первое время хватит. Думаю, 8 колонок - это не так уж много. Михаил, спасибо за ответ. След.вопрос - решили сделать экспорт через метод StartExport. Все необходимые таблицы создали. Стакан создали в Квик. DDE - стартовал. далее Trader.RegisterQuotes(lkoh); - прошло+ Сделали Sleep(2000); Далее из примера foreach (var qoute in Trader.GetMarketDepth(lkoh)) { MessageBox.Show("Dir="+qoute.OrderDirection.ToString() + " V="+qoute.Volume.ToString() +" $="+ qoute.Price.ToString()); }

  • проходит минуя блок 🤨 В чем м.б. причина. Надо ли подписываться на какое-либо событие
Mikhail Sukhov
Mikhail Sukhov

Igor_B: В чем м.б. причина. Надо ли подписываться на какое-либо событие

Конечно. ITrader.QuotesChanged.

VsevolodG
VsevolodG

Подскажите, пожалуйста, по какой причине может не отрабатывать событие MyNewTrades? Сделка в Quik появляется, а код, привязанный к событию MyNewTrades не отрабатывает.

Вот мой код:

this.Trader.NewMyTrades += myTrades => { foreach (var myTrade in myTrades) { var trade = myTrade.Trade; MessageBox.Show(String.Format("Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.", trade.Id, trade.Price, trade.Security.Code, trade.Volume, trade.Time)); } };

this.Trader.Terminal.StartDde(Trader.SecuritiesTable, Trader.MyTradesTable, Trader.EquityPositionsTable);

VsevolodG
VsevolodG

VsevolodG: Подскажите, пожалуйста, по какой причине может не отрабатывать событие MyNewTrades? Сделка в Quik появляется, а код, привязанный к событию MyNewTrades не отрабатывает.

Вот мой код:

this.Trader.NewMyTrades += myTrades => { foreach (var myTrade in myTrades) { var trade = myTrade.Trade; MessageBox.Show(String.Format("Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.", trade.Id, trade.Price, trade.Security.Code, trade.Volume, trade.Time)); } };

this.Trader.Terminal.StartDde(Trader.SecuritiesTable, Trader.MyTradesTable, Trader.EquityPositionsTable);

Эксперименты показали, что в случае если происходит сделка по тейк-профиту, событие NewMyTrades не вызывается А в случае если я создаю простую заявку, событие отрабатывает.

Подскажите, пожалуйста, в чем подвох? Мне необходимо отслеживать любые новые "мои сделки"

Mikhail Sukhov
Mikhail Sukhov

VsevolodG: Эксперименты показали, что в случае если происходит сделка по тейк-профиту, событие NewMyTrades не вызывается

Как именно создаете тейк? Какие параметры указываете? Что говорит пример Sample?

VsevolodG
VsevolodG

Mikhail Sukhov:

VsevolodG: Эксперименты показали, что в случае если происходит сделка по тейк-профиту, событие NewMyTrades не вызывается

Как именно создаете тейк? Какие параметры указываете? Что говорит пример Sample?

Тейк создаю вот так:

private void RegisterTakeProfit(Security Security, OrderDirections Direction, double price) { this.GuiAsync(() => { var order = new Order { Portfolio = (Portfolio)this.cbBill.SelectedItem, Type = OrderTypes.Conditional, Volume = 1, Security = Security, Direction = Direction, StopCondition = new QuikStopCondition }; this.Trader.RegisterOrder(order); }); }

Насчет примера Sample, не совсем понял вопрос. Попытался догадаться -) Запустил пример sample вручную создал тейк, он отработал - sample ничего не сказал

Mikhail Sukhov
Mikhail Sukhov

VsevolodG: Попытался догадаться -) Запустил пример sample вручную создал тейк, он отработал - sample ничего не сказал

Заявки Sample вывел? Сделки?

VsevolodG
VsevolodG

Mikhail Sukhov:

VsevolodG: Попытался догадаться -) Запустил пример sample вручную создал тейк, он отработал - sample ничего не сказал

Заявки Sample вывел? Сделки?

Да, в Sample работает нормально. Все выводит

VsevolodG
VsevolodG

VsevolodG:

Mikhail Sukhov:

VsevolodG: Попытался догадаться -) Запустил пример sample вручную создал тейк, он отработал - sample ничего не сказал

Заявки Sample вывел? Сделки?

Да, в Sample работает нормально. Все выводит

Разница в примере и в моем коде заключается в способе запуска обмена данными:

//мой код this.Trader.Terminal.StartDde(Trader.SecuritiesTable, Trader.MyTradesTable, Trader.EquityPositionsTable);

//код в примере this.Trader.StartExport();

В случае если я использую StartExport, проблема решается. Объясните, пожалуйста, в чем разница между этими методами?

Mikhail Sukhov
Mikhail Sukhov

VsevolodG: Разница в примере и в моем коде заключается в способе запуска обмена данными:

//мой код this.Trader.Terminal.StartDde(Trader.SecuritiesTable, Trader.MyTradesTable, Trader.EquityPositionsTable);

//код в примере this.Trader.StartExport();

В случае если я использую StartExport, проблема решается. Объясните, пожалуйста, в чем разница между этими методами?

Вы забыли самое главное - экспорт заявок Trader.OrdersTable. Плюс не отслеживается состояние стоп-заявки, так как и эта таблица не экспортируется.

По стоп заявкам сделок не существует. Стоп заявки выставляют обычные и уже по ним происходит сделки. QuikTrader нужна информация о заявке, так как MyTrade (не путаем с известным блоггером🙂) - это лишь объединение заявки и тиковой сделки.

VsevolodG
VsevolodG

Mikhail Sukhov: Вы забыли самое главное - экспорт заявок Trader.OrdersTable. Плюс не отслеживается состояние стоп-заявки, так как и эта таблица не экспортируется.

По стоп заявкам сделок не существует. Стоп заявки выставляют обычные и уже по ним происходит сделки. QuikTrader нужна информация о заявке, так как MyTrade (не путаем с известным блоггером🙂) - это лишь объединение заявки и тиковой сделки.

Понял, спасибо!

VsevolodG
VsevolodG

Уточните, пожалуйста:

  1. 1951.1 + 1.5 (защ. спрэд) = 1952,6. Почему заявка выставлена по большей цене и откуда она взялась?
  2. Почему цена сделки отличается от цены заявки?

<mark>Тэйк-профит на покупку: Цена <= 1951.1 Отступ от мин min: 1.5 Защитный спрэд: 1.5

По тэйк-профиту выставлена заявка на покупку: Цена: 1953,5

По заявке появилась сделка: Цена: 1952,3</mark>

Mikhail Sukhov
Mikhail Sukhov

VsevolodG: Уточните, пожалуйста:

  1. 1951.1 + 1.5 (защ. спрэд) = 1952,6. Почему заявка выставлена по большей цене и откуда она взялась?
  2. Почему цена сделки отличается от цены заявки?

Тэйк-профит на покупку: Цена <= 1951.1 Отступ от мин min: 1.5 Защитный спрэд: 1.5

По тэйк-профиту выставлена заявка на покупку: Цена: 1953,5

По заявке появилась сделка: Цена: 1952,3

Это стоп заявки Квика? Я думаю с этим вам надо обращаться к самому Квику или брокеру. Насчет 2-го вопроса - такая специфика работы биржи.

Zachard
Zachard

Добрый день! Я только начал разбираться с библиотекой, скачал последнюю бету, запустил проект в Visual C# 2010 Express и тут же получил сообщение об ошибке: "Папки решений не поддерживаются в этой версии приложения. Папка решения "Hydra" будет отображаться как недоступная" И то же самое - для "Plugins" и "Solution Items"

Пожалуйста, подскажите, в какую сторону копать? Может быть, Экспресс-выпуск не поддерживает папки? Или проблема в другом? Более ранние версии открываются нормально.

Mikhail Sukhov
Mikhail Sukhov

Zachard: Может быть, Экспресс-выпуск не поддерживает папки?

Верно. Это ограничение бесплатной версии студии.

MCTuTeJ|19951995
MCTuTeJ|19951995

Михаил, а что нужно чтобы работал метод Trader.Terminal.OpenQuotes(Security) ? Насколько я понял этот метод должен открывать окно со стаканом по переданному инструменту, но он не делает нечего. Метод Trader.RegisterQutes(Security) окно со стаканом не открывает, но очень весело прочесывает таблицу "инструменты" (я даже испугался когда первый раз это увидел :D), после чего выдает ошибку "окно с заголовком не найдено". Мне нужно в коде открыть окно и подписаться на котировки по инструменту.

MCTuTeJ|19951995
MCTuTeJ|19951995

Версия s# 2.6

Mikhail Sukhov
Mikhail Sukhov

MCTuTeJ|19951995: Версия s# 2.6

Ошибка исправлена в 3.0

MCTuTeJ|19951995
MCTuTeJ|19951995

Михаил, а как работает Trader.Terminal.OpenQuotes(Security) ?


   this.Trader.NewSecurities += securities => 
                {
                    foreach (Security sec in securities)
                    {
                        if (sec.Id.Contains("RI")  && (sec.Class == "SPBFUT" ))
                        {
                            if(!Trader.Terminal.IsQuotesOpened(sec))
                            {
                                Trader.Terminal.OpenQuotes(sec);
                                Trader.RegisterQuotes(sec);
                            }
                        }
                    }
                  
                };

Вот он не открывает ничего ( Версия s# 3.0.19.

MCTuTeJ|19951995
MCTuTeJ|19951995

Пробовал настраивать шаблон - тоже самое, такая же ошибка - "Окно с заголовком 'RIU1-SPBFUT' не было найдено. Имя параметра: caption"

В чем может быть проблема ?

Mikhail Sukhov
Mikhail Sukhov

MCTuTeJ|19951995: Пробовал настраивать шаблон - тоже самое, такая же ошибка - "Окно с заголовком 'RIU1-SPBFUT' не было найдено. Имя параметра: caption"

В чем может быть проблема ?

Какой именно метод выбрасывает сообщение? Как настроена таблица инструментов?

MCTuTeJ|19951995
MCTuTeJ|19951995

Таблица инструментов настроена согласно пункту "настройка QUIK" документации. Сообщение выбрасывает метод Trader.RegisterQuotes(Security). Как я понял, он вызывает Trader.Terminal.OpenQuotes(security), поэтому я его убрал из предыдущего кода.

MCTuTeJ|19951995
MCTuTeJ|19951995

Только что попробовал убрать метод RegisterQuotes и оставить просто OPenQuotes - метод пролистал таблицу "инструменты", нашел RIU1, но стакан не открыл и ошибки не выдал.

Mikhail Sukhov
Mikhail Sukhov

MCTuTeJ|19951995: Только что попробовал убрать метод RegisterQuotes и оставить просто OPenQuotes - метод пролистал таблицу "инструменты", нашел RIU1, но стакан не открыл и ошибки не выдал.

Нужно все сделать наоборот - оставить RegisterQuotes. Так какие у вас колонки в таблице инструменты?

MCTuTeJ|19951995
MCTuTeJ|19951995

Mikhail Sukhov:

MCTuTeJ|19951995: Только что попробовал убрать метод RegisterQuotes и оставить просто OPenQuotes - метод пролистал таблицу "инструменты", нашел RIU1, но стакан не открыл и ошибки не выдал.

Так какие у вас колонки в таблице инструменты? 1 бумага 2 код бумаги 3 код класса 4 статус 5 размер лота 6 точность 7 минимальный шаг цены 8 волатильность опциона

Mikhail Sukhov
Mikhail Sukhov

А стакан уже не был открыт до этого?

MCTuTeJ|19951995
MCTuTeJ|19951995

В каком смысле ? Я его открывал до этого, настраивал переименовывал, когда на старой версии работал. Сейчас я его закрываю и пытаюсь из кода открыть.

Mikhail Sukhov
Mikhail Sukhov

MCTuTeJ|19951995: В каком смысле ? Я его открывал до этого, настраивал переименовывал, когда на старой версии работал. Сейчас я его закрываю и пытаюсь из кода открыть.

В момент работы метода стакан в Квике открыт?

MCTuTeJ|19951995
MCTuTeJ|19951995

нет.

Mikhail Sukhov
Mikhail Sukhov

MCTuTeJ|19951995: нет.

Ок, когда метод начинает работать выделенная строка в таблице Инструменты перемещается (надо визуально определить, смотря на сам Квик)?

MCTuTeJ|19951995
MCTuTeJ|19951995

Да, она перемещается вначале вверх до конца, потом вниз до нужного мне RIU1. Потом программа подвисает секунды на 3-4 и вылетает эксэпшн.

Mikhail Sukhov
Mikhail Sukhov

MCTuTeJ|19951995: Да, она перемещается вначале вверх до конца, потом вниз до нужного мне RIU1. Потом программа подвисает секунды на 3-4 и вылетает эксэпшн.

Это только с этим инструментом так происходит или все стаканы не открываются?

MCTuTeJ|19951995
MCTuTeJ|19951995

За все не знаю, но по еще трем точно не открываются - RIM1 GZM1 GZU1.

MCTuTeJ|19951995
MCTuTeJ|19951995

LKOH тоже не открылся.

Mikhail Sukhov
Mikhail Sukhov

MCTuTeJ|19951995: LKOH тоже не открылся.

А какая версия Квика?

MCTuTeJ|19951995
MCTuTeJ|19951995

5.17.0.159

Mikhail Sukhov
Mikhail Sukhov

MCTuTeJ|19951995: 5.17.0.159

Попробуйте на более свежей. Я просто теряюсь в догадках, почему не работает. Сам проверил - работает.

Mikhail Sukhov
Mikhail Sukhov

Mikhail Sukhov:

MCTuTeJ|19951995: 5.17.0.159

Попробуйте на более свежей. Я просто теряюсь в догадках, почему не работает. Сам проверил - работает.

  • еще посмотрите, по enter стаканы открываются?
Евгений
Евгений

Здравствуйте!

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

Mikhail Sukhov
Mikhail Sukhov

Евгений: Здравствуйте!

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

http://stocksharp.com/doc/help/html/7d73f7bf-ae8b-4d76-9895-cffb6342203f.htm

Igor_B
Igor_B

Михаил, доброе время. Вопрос по открытию стакана. Пример - LKOH. Версия - Квик 5.17 демо, Сток-3. Коннектимся к Квик. Стакан открыл в Квик. DDE - стартовал, данные получаю в обработчике Trader.QuotesChanged. " lkoh.ShortName = "ЛУКОЙЛ"; lkoh.Code = "LKOH"; lkoh.Class = "EQBR"; lkoh.Id = "LKOH@EQBR"; Trader.RegisterQuotes(lkoh); Trader.StartExport(); " Но вот вопрос, а как открыть стакан из приложения, не открывая его предварительно в Квик? В "Шаги настройки экспорта стакана" что-то не нашел как Это сделать. Спасибо.

Mikhail Sukhov
Mikhail Sukhov

Igor_B: Но вот вопрос, а как открыть стакан из приложения, не открывая его предварительно в Квик? В "Шаги настройки экспорта стакана" что-то не нашел как Это сделать. Спасибо.

RegisterQuotes это должен делать автоматически.

Cargar más comentarios