← Назад

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

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

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

Комментарии (506)

Комментарии к этой теме заблокированы

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 Автор

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

Mikhail Sukhov
Mikhail Sukhov

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

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

ttt
ttt Автор

Каким образом установить код клиента? //например, 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 Автор

Добрый день.

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 Автор

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

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

Mikhail Sukhov
Mikhail Sukhov

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

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

ttt
ttt Автор

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 стаканы открываются?
MCTuTeJ|19951995
MCTuTeJ|19951995

Mikhail Sukhov:

  • еще посмотрите, по enter стаканы открываются? Нет, не открываются.
Mikhail Sukhov
Mikhail Sukhov

MCTuTeJ|19951995:

Mikhail Sukhov:

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

Ок, у вас тогда понятно. Можете настроить чтобы по 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 это должен делать автоматически.

Igor_B
Igor_B

Mikhail Sukhov:

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

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

lkoh = new Security(); this.Trader.IsAsyncMode = true; lkoh.ShortName = "ЛУКОЙЛ"; lkoh.Code = "LKOH"; lkoh.Class = "EQBR"; lkoh.Id = "LKOH@EQBR"; Trader.RegisterQuotes(lkoh);
Trader.StartExport();

Trader.RegisterQuotes(lkoh);- даёт исключение

"Окно с заголовком 'LKOH-EQBR' не было найдено. Parameter name: caption"

Mikhail Sukhov
Mikhail Sukhov

Igor_B: "Окно с заголовком 'LKOH-EQBR' не было найдено. Parameter name: caption"

В этом топике писали про это... У вас по Enter (нажать в таблице Инструменты) открывает окно со стаканом?

Igor_B
Igor_B

Mikhail Sukhov:

Igor_B: "Окно с заголовком 'LKOH-EQBR' не было найдено. Parameter name: caption"

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

Судя по всему, неправильно у нас считывается таблица "Инструменты". Создали её в Квик Поля (Бумага, Код бумаги, Код класса, Статус, Лот, Точность, Шаг цены) - в чем м.б. ошибка? Спасибо.

Mikhail Sukhov
Mikhail Sukhov

Igor_B:

Mikhail Sukhov:

Igor_B: "Окно с заголовком 'LKOH-EQBR' не было найдено. Parameter name: caption"

В этом топике писали про это... У вас по Enter (нажать в таблице Инструменты) открывает окно со стаканом? Михаил, читал. По Enter - открывается, но разумеемся с другим именем (ЛУКОЙЛ [А1-Акции] Котировки). в коде

Не важно - смотрится новая появившаяся таблица... А стакан с котировками через RegisterQuotes открывает сам стакан в Квике?

Greene-nsk
Greene-nsk

Что-то я утомился ждать, пока пройдет StartExport() StopExport(). Можно его один раз стартовать и потом ни старт ни стоп не звать при повторном запуске? Или еще как-нибудь ускорить ..

Mikhail Sukhov
Mikhail Sukhov

Greene-nsk: Что-то я утомился ждать, пока пройдет StartExport() StopExport(). Можно его один раз стартовать и потом ни старт ни стоп не звать при повторном запуске? Или еще как-нибудь ускорить ..

Вообще я сам экспорт запускаю только 1 раз - при старте робота.

MCTuTeJ|19951995
MCTuTeJ|19951995

А Вы не подскажете как это сделать ? Сейчас открываю двойным кликом мыши.

Mikhail Sukhov
Mikhail Sukhov

MCTuTeJ|19951995: А Вы не подскажете как это сделать ? Сейчас открываю двойным кликом мыши.

Я думал Вы это как то принудительно выключили, потому что у меня это всегда работало. А сам я не в курсе. Может у Арки спросить?

IlyaILH
IlyaILH

Mikhail Sukhov:

MCTuTeJ|19951995: А Вы не подскажете как это сделать ? Сейчас открываю двойным кликом мыши.

Я думал Вы это как то принудительно выключили, потому что у меня это всегда работало. А сам я не в курсе. Может у Арки спросить?

Проблема таже, проверил Квики нескольких брокеров, везде открывается стакан 2-ным щелочком мышки. Никогда даже не знал, что можно использовать enter.

Правильно понимаю, что в этом может быть причина что RegisterQuotes не открывает стакан?

Mikhail Sukhov
Mikhail Sukhov

IlyaILH: Правильно понимаю, что в этом может быть причина что RegisterQuotes не открывает стакан?

Да в этом. Двойной клик сложнее эмулировать.

MCTuTeJ|19951995
MCTuTeJ|19951995

Только что все настройки прошерстил - нет ничего похожего ( Сейчас погуглю...

MCTuTeJ|19951995
MCTuTeJ|19951995

На QUIK'овском форуме сказали что нужно обновиться до 18 версии. На 17 никак это не сделать.

Igor_B
MCTuTeJ|19951995
MCTuTeJ|19951995

На версии 5.20.0.76 работает, даже версия s# 2.6.

Igor_B
Igor_B

Доброе время. Подключились к Квик. Стаканы открываются. Данные стакана экспортируем через Trader.GetMarketDepth. А как получить данные таблицы инструменты? Интересуют значения кода и класса. Спасибо.

Mikhail Sukhov
Mikhail Sukhov

Igor_B: Доброе время. Подключились к Квик. Стаканы открываются. Данные стакана экспортируем через Trader.GetMarketDepth. А как получить данные таблицы инструменты? Интересуют значения кода и класса. Спасибо.

Надо получить сами инструменты у них посмотреть через свойства код и класс.

Igor_B
Igor_B

Mikhail Sukhov:

Igor_B: Доброе время. Подключились к Квик. Стаканы открываются. Данные стакана экспортируем через Trader.GetMarketDepth. А как получить данные таблицы инструменты? Интересуют значения кода и класса. Спасибо.

Надо получить сами инструменты у них посмотреть через свойства код и класс. Михаил, спасибо за ответ. Вопрос вот в чем: К примеру настроили в Квике таблицу "инструменты" с инструментами, и хотим по каждой строчке таблицы (по каждому инструменту) получить данные - код,класс,спрос, предложение,время посл.сделки. Из custom - таблицы пробовали все ОК. А как получить securityTable из Квика? Надо также как и с customTable?

Mikhail Sukhov
Mikhail Sukhov

Igor_B: Михаил, спасибо за ответ. Вопрос вот в чем: К примеру настроили в Квике таблицу "инструменты" с инструментами, и хотим по каждой строчке таблицы (по каждому инструменту) получить данные - код,класс,спрос, предложение,время посл.сделки. Из custom - таблицы пробовали все ОК. А как получить securityTable из Квика? Надо также как и с customTable?

Зачем кастом? Чем стандартная таблица не угодила?

Igor_B
Igor_B

Mikhail Sukhov:

Igor_B: Михаил, спасибо за ответ. Вопрос вот в чем: К примеру настроили в Квике таблицу "инструменты" с инструментами, и хотим по каждой строчке таблицы (по каждому инструменту) получить данные - код,класс,спрос, предложение,время посл.сделки. Из custom - таблицы пробовали все ОК. А как получить securityTable из Квика? Надо также как и с customTable?

Зачем кастом? Чем стандартная таблица не угодила? Михаил, стандартная "Инструменты" - подходит, как получить данные из нее? Trader.SecuritiesTable - посмотрел, но там нет коллекции строк... Еще вопрос - можно ли из собств.приложения загрузить в Квик настройки из файла (wnd)? Спасибо.

Mikhail Sukhov
Mikhail Sukhov

Igor_B: Михаил, стандартная "Инструменты" - подходит, как получить данные из нее? Trader.SecuritiesTable - посмотрел, но там нет коллекции строк... Еще вопрос - можно ли из собств.приложения загрузить в Квик настройки из файла (wnd)? Спасибо.

Посмотрите примеры, как идет работа с Security.

surkov66
surkov66

Добрый день. Установил S# последней версии. Планирую создавать роботов в виде консольных приложений. Начал с примера SampleConsole. Портфель,бумаги, сделки выводятся.

Далее пытаюсь воспользоваться функцией trader.GetPosition Функция возвращает Null

Смотрю в портфель и вижу.

В квике

Что сделал не так?

Mikhail Sukhov
Mikhail Sukhov

surkov66: Начал с примера SampleConsole. Портфель,бумаги, сделки выводятся.

Запускали экспорт через ITrader.StartExport?

surkov66
surkov66

Mikhail Sukhov:

surkov66: Начал с примера SampleConsole. Портфель,бумаги, сделки выводятся.

Запускали экспорт через ITrader.StartExport?

Сначала дублировал пример

trader.Terminal.StartDde(trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPortfoliosTable,trader.EquityPositionsTable);

Потом trader.StartExport();

Mikhail Sukhov
Mikhail Sukhov

surkov66: Сначала дублировал пример

trader.Terminal.StartDde(trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPortfoliosTable,trader.EquityPositionsTable);

Потом trader.StartExport();

Sample так же не отображает? ITrader.ProcessDataError что нибудь выводит?

surkov66
surkov66

Mikhail Sukhov: Sample так же не отображает? ITrader.ProcessDataError что нибудь выводит?

Выводит "Инструмент с кодом VTBR для бумажной позиции не найден."

Спасибо за наводку. Добавил в таблицу с инструментами , все ок!

MCTuTeJ|19951995
MCTuTeJ|19951995

Оффтоп: Михаил, а документация на сайте сейчас соответствует последней версии s# ?

Mikhail Sukhov
Mikhail Sukhov

MCTuTeJ|19951995: Оффтоп: Михаил, а документация на сайте сейчас соответствует последней версии s# ?

Это уже не вспомнить (давно обновлял). Нашли несоответствие?

Igor_B
Igor_B

Михаил, о5 вопрос по таблице "инструменты".Таблицу настроили в Квик предварительно на 2 инструмента ( к примеру LKOH,SBER03). Надо узнать какие инструменты в этой таблице (для открытия стаканов). Использовал событие PreProcessData

this.Trader.PreProcessDdeData += (str, preData) => { if (str.Contains("инструменты")) { MessageBox.Show("= " + str + " , " + preData[0][1] + " - " + preData[0][2]+ " Value="+ preData[0][3]);
} };
Но, наверное, это неэффективно, т.к. событие срабатывает на приход любых данных по DDE? А вот в по событию Trader.NewSecurities данные берутся не из нашей настроенной в квик "инструменты", а из "Все сделки".Так?

Trader.NewSecurities += securities => { foreach (Security sec in securities) { MessageBox.Show("id=" + sec.Id); } }; Как корректно тогда прочитать содержимое нашей таблицы "инструменты"?🤨 Спасибо.

Mikhail Sukhov
Mikhail Sukhov

Igor_B: Как корректно тогда прочитать содержимое нашей таблицы "инструменты"?🤨 Спасибо.

Trader.NewSecurities

a.dobryn
a.dobryn

а как корректно обрабатывать новые сделки? в обработчике своих сделок было


foreach (var myTrade in myTrades)
            ...

и в итоге обрабатывалась одна сделка, все в порядке =)

а если таким же образом обрабатывать все сделки, их в IEnumerable<Trade> trades целая куча. Как нужно делать, брать просто последнюю? Или, наоборот, первую? Какая самая "свежая" из них? =)

**upd:**хм, и первая и последняя давностью 2,5 часа 🤨

Mikhail Sukhov
Mikhail Sukhov

D_Alex: **upd:**хм, и первая и последняя давностью 2,5 часа 🤨

Потому что при старте экспорта все сделки передаются всем скопом.

a.dobryn
a.dobryn

Mikhail Sukhov:

D_Alex: **upd:**хм, и первая и последняя давностью 2,5 часа 🤨

Потому что при старте экспорта все сделки передаются всем скопом.

то есть надо дождаться, пока свежие будут? и если да, то как?

Mikhail Sukhov
Mikhail Sukhov

D_Alex:

Mikhail Sukhov:

D_Alex: **upd:**хм, и первая и последняя давностью 2,5 часа 🤨

Потому что при старте экспорта все сделки передаются всем скопом.

то есть надо дождаться, пока свежие будут? и если да, то как?

Запоминаем время начала экспорта. Ждем когда появятся сделки с таким временем. Только понятие свежее тут сильно сказано. Все сделки - это устаревшие данные. Другое дело - насколько. И мне кажется, что это лучше делать через логику работы с программой, чем закладывать в код.

a.dobryn
a.dobryn

Mikhail Sukhov:

D_Alex:

Mikhail Sukhov:

D_Alex: **upd:**хм, и первая и последняя давностью 2,5 часа 🤨

Потому что при старте экспорта все сделки передаются всем скопом.

то есть надо дождаться, пока свежие будут? и если да, то как?

Запоминаем время начала экспорта. Ждем когда появятся сделки с таким временем. Только понятие свежее тут сильно сказано. Все сделки - это устаревшие данные. Другое дело - насколько. И мне кажется, что это лучше делать через логику работы с программой, чем закладывать в код.

свежие - те, которые после старта программы появились =) точно, что-то не подумала я по времени смотреть

IlyaILH
IlyaILH

Михаил, подскажите, что я делаю не так.

Я реализовал следующее:

Подписался на событие NewSecurities

Trader.ProcessDataError - идет без ошибок.

Trader.NewSecurities += securities => {

                foreach (Security tool in securities)
                {
                    
                    MessageBox.Show(tool.Id +" "+ tool.State.ToString());
                                           
                }
            }; 

На этот код, мне выводится не понятно что, но предположительно данные из таблицы Все сделки.

Помогите разобраться с таблицей Инструменты.

Спасибо.

Mikhail Sukhov
Mikhail Sukhov

IlyaILH: Trader.NewSecurities += securities => {

                foreach (Security tool in securities)
                {

                    MessageBox.Show(tool.Id +" "+ tool.State.ToString());

                }
            };

На этот код, мне выводится не понятно что, но предположительно данные из таблицы Все сделки.

Выделенное можете как-то подробнее описать? Код выводит идентификатор инструмента и его состояние. Причем здесь сделки?

IlyaILH
IlyaILH

Mikhail Sukhov:

IlyaILH: Trader.NewSecurities += securities => {

                foreach (Security tool in securities)
                {

                    MessageBox.Show(tool.Id +" "+ tool.State.ToString());

                }
            };

На этот код, мне выводится не понятно что, но предположительно данные из таблицы Все сделки.

Выделенное можете как-то подробнее описать? Код выводит идентификатор инструмента и его состояние. Причем здесь сделки?

Я получаю следующие сообщения по вышестоящему коду:

VDSB@EQNE Trading LK20000BF1@RTS Trading и т.д.

По видимому, это действительно код и состояние, но у меня в таблице инструменты таких бумаг нет (у меня только сбер и лукойл). И я заметил что, как только у меня появляется сообщение, сразу же эта VDSB проходит в таблице всех сделок, т.е я и подумал, что информация оттуда идет.

Mikhail Sukhov
Mikhail Sukhov

IlyaILH: Я получаю следующие сообщения по вышестоящему коду:

VDSB@EQNE Trading LK20000BF1@RTS Trading и т.д.

По видимому, это действительно код и состояние, но у меня в таблице инструменты таких бумаг нет (у меня только сбер и лукойл). И я заметил что, как только у меня появляется сообщение, сразу же эта VDSB проходит в таблице всех сделок, т.е я и подумал, что информация оттуда идет.

Понял. Информация об инструментах идет отовсюду. В том числе и из таблицы сделок.

IlyaILH
IlyaILH

Mikhail Sukhov:

IlyaILH: Я получаю следующие сообщения по вышестоящему коду:

VDSB@EQNE Trading LK20000BF1@RTS Trading и т.д.

По видимому, это действительно код и состояние, но у меня в таблице инструменты таких бумаг нет (у меня только сбер и лукойл). И я заметил что, как только у меня появляется сообщение, сразу же эта VDSB проходит в таблице всех сделок, т.е я и подумал, что информация оттуда идет.

Понял. Информация об инструментах идет отовсюду. В том числе и из таблицы сделок.

Ясно, а как тогда мне получить инфрмацию только из таблицы инструменты, т.е есть у меня 2 инструмента (лукойл и сбер) и я хочу получить по ним код, статус и еще пару полей, но мне не нужны другие инструменты.

Просто в документации код для работы с инструментами написан примерно как у меня.

Заранее благодарен за ответ.

Mikhail Sukhov
Mikhail Sukhov

IlyaILH: Ясно, а как тогда мне получить инфрмацию только из таблицы инструменты, т.е есть у меня 2 инструмента (лукойл и сбер) и я хочу получить по ним код, статус и еще пару полей, но мне не нужны другие инструменты.

Не используйте в своей программе другие инструменты. Вы знаете как писать на C# фильтр?

MCTuTeJ|19951995
MCTuTeJ|19951995

Михаил,а

 ReRegisterOrder(order,()=>newPrice,()=>newVolume,true)

это тоже самое, что и


Trader.CancelOrder(order);
Order newOrder = new Order();
newOrder.Portfolio=order.Portfolio;
newOrder.Security = order.Security;
newOrder.Price = newPrice;
newOrder.Direction= order.Direction;
newOrder.Volume= newVolume;
Trader.RegisterOrder;

?

Mikhail Sukhov
Mikhail Sukhov

MCTuTeJ|19951995: Михаил,а

ReRegisterOrder(order,()=>newPrice,()=>newVolume,true)

>  это тоже самое, что и
> ```

Trader.CancelOrder(order);
Order newOrder = new Order();
newOrder.Portfolio=order.Portfolio;
newOrder.Security = order.Security;
newOrder.Price = newPrice;
newOrder.Direction= order.Direction;
newOrder.Volume= newVolume;
Trader.RegisterOrder;

?

Для ФОРТС нет. Для всего остального да.

MCTuTeJ|19951995
MCTuTeJ|19951995

Есть такая проблема: В стратегии мониторятся различные параметры и исходя из них переставляется заявка:


     // если заявка ещё активна (не отменена), то перерегистрировать заявку
                        if (!(order.State==OrderStates.Done))
                        {
                            newOrder=  this.ReRegisterOrder(order,()=>TheorOptPrice,()=>newOrder.Volume,true);
                            orderIdList.Add(newOrder.Id);
                        }

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

Mikhail Sukhov
Mikhail Sukhov

MCTuTeJ|19951995: Проблема в том, что иногда заявка исполняется после проверки на исполнение, в результате чего происходит ошибка - программа пытается передвинуть исполненную заявку. Не подскажете как это лечится ?

Отменять, дожидаться отмены, выставлять новую.

MCTuTeJ|19951995
MCTuTeJ|19951995

Mikhail Sukhov:

MCTuTeJ|19951995: Проблема в том, что иногда заявка исполняется после проверки на исполнение, в результате чего происходит ошибка - программа пытается передвинуть исполненную заявку. Не подскажете как это лечится ?

Отменять, дожидаться отмены, выставлять новую. Но если к моменту отмены она уже будет исполнена всё равно ведь будет ошибка ?

Mikhail Sukhov
Mikhail Sukhov

MCTuTeJ|19951995:

Mikhail Sukhov:

MCTuTeJ|19951995: Проблема в том, что иногда заявка исполняется после проверки на исполнение, в результате чего происходит ошибка - программа пытается передвинуть исполненную заявку. Не подскажете как это лечится ?

Отменять, дожидаться отмены, выставлять новую. Но если к моменту отмены она уже будет исполнена всё равно ведь будет ошибка ?

Конечно. И этот случай следовательно нужно обрабатывать.

a.dobryn
a.dobryn

this.Trader.NewMyTrades += trades => this.GuiAsync(() => _myTradesWindow.Trades.AddRange(trades));
this.Trader.NewTrades += trades => this.GuiAsync(() => _tradesWindow.Trades.AddRange(trades));

в таком случае обработка этих событий идет как-то в 2 потока, или по очереди?

Mikhail Sukhov
Mikhail Sukhov

D_Alex: ...

в таком случае обработка этих событий идет как-то в 2 потока, или по очереди?

Сами потоки ITrader в двух работают, так как синхронизация с ГУИ сделана асинхронно (GuiAsync).

a.dobryn
a.dobryn

Mikhail Sukhov:

D_Alex: ...

в таком случае обработка этих событий идет как-то в 2 потока, или по очереди?

Сами потоки ITrader в двух работают, так как синхронизация с ГУИ сделана асинхронно (GuiAsync).

просто в программе по NewTrades происходит куча действий, в том числе и проверка, есть ли новые сделки (по _myTradesWindow.Trades, а они не всегда обновляются). Может быть такое, что при постоянной обработке NewTrades обработка NewMyTrades просто не успевает выполниться?

Mikhail Sukhov
Mikhail Sukhov

D_Alex: просто в программе по NewTrades происходит куча действий, в том числе и проверка, есть ли новые сделки (по _myTradesWindow.Trades, а они не всегда обновляются). Может быть такое, что при постоянной обработке NewTrades обработка NewMyTrades просто не успевает выполниться?

Сами они между собой не синхронизируются внутри QuikTrader. А вот в обработчиках у вас вполне может. Отключайте что-то, смотрите.

Vyacheslav
Vyacheslav

Михаил, спасибо за Ваш огромный труд!

Только начал изучать S#. Сразу вопрос: запускаю sampleconsole.exe, однако возникают ошибки:

:[Введите номер счета, через который будет выставлена заявка: NL0011100043 Производим подключение... Подключение было произведено успешно. Дожидаемся появления в программе инструмента Лукойл и портфеля NL0011100043... Инструмент Лукойл появился. Портфель NL0011100043 появился. Первоначальное значение середины спреда 0 System.ArgumentException: Транзакции 'ACCOUNT=NL0011100043; CLIENT_CODE=S#; TRAN S_ID=83785079; CLASSCODE=QJSIM; SECCODE=LKOH; QUANTITY=1; OPERATION=B; TYPE=L; A CTION=NEW_ORDER; PRICE=0; EXECUTION_CONDITION=PUT_IN_QUEUE;' не была зарегистрир ована. Причина 'Цена заявки должна быть положительна'. Parameter name: transactionTxt at #=qoXwOPiKu6rKxfqRbyQH_8kmNOB382r_Z62UoStG__20=.#=qqqjfNu5FDvUnmIHLI7eIpqU LYCdQ6s45iJpvRMufTTo=(String #=qMyxjjZn7gcLlgrKmKE6fdw==, OrderStatus& #=qfMzUMV woA9vTKeRIC2yVBg==, UInt32& #=qx89Qmj8$YdXkVw2g47iBHA==, Int64& #=qru3jL$hLUeCws hCq6a0lcA==, String& #=qJTAyuLuvPwQ9HQzhdHWM2g==) at Ecng.Trading.Quik.QuikTrader.#=q54MTj4O0HyGlsuBk4LMgvyLClWnXw07g5l8N_CZjZX o=(Order #=qfB2F85tURLB4YdJcjKMYgg==, TransactionBuilder #=qk_SbqcrTyofJ_NTgcHp8 Fg==) at Ecng.Trading.Quik.QuikTrader.OnRegisterOrder(Order order) at Ecng.Trading.Algo.BaseTrader.RegisterOrder(Order order) at SampleConsole.Program.Main() in E:\StockSharpReleases\StockSharp_3.0.19\So urces\SampleConsole\Program.cs:line 143

C:\StockSharp_3.0.19\Exe\SampleConsole>]

QUIK также выбрасывает сообщение: DDE сервер 'wrapper'.Документ 'стакан [LKOH-QJSIM]'. Таблица 'LKOH-QJSIM'. Произошла ошибка: Ошибка при передаче таблицы, вывод приостановлен. Неверные параметры.

Использую Ваш info.wnd Verifier показывает отсутствие ошибок. S# 3.0.19, QUIK-JUNIOR 5.21 Однако, такое чувство, что нет экспорта стакана по DDE.

Что делать?

Mikhail Sukhov
Mikhail Sukhov

Vyacheslav: Однако, такое чувство, что нет экспорта стакана по DDE.

Что делать?

Чувство не подводит. Пример устарел, надо править... Нужно дождаться еще появления стакана по инструменту. Раньше необходимая информация приходила в самом инструменте.

Vyacheslav
Vyacheslav

Mikhail Sukhov:

Vyacheslav: Однако, такое чувство, что нет экспорта стакана по DDE.

Что делать?

Чувство не подводит. Пример устарел, надо править... Нужно дождаться еще появления стакана по инструменту. Раньше необходимая информация приходила в самом инструменте.

Михаил, разместите обновленный пример sampleconsole на box.net, пожалуйста. Или напишите, что надо поправить в коде.

Mikhail Sukhov
Mikhail Sukhov

Vyacheslav: Михаил, разместите обновленный пример sampleconsole на box.net, пожалуйста. Или напишите, что надо поправить в коде.

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

Vyacheslav
Vyacheslav

Mikhail Sukhov:

Vyacheslav: Михаил, разместите обновленный пример sampleconsole на box.net, пожалуйста. Или напишите, что надо поправить в коде.

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

Смысл для новичка - в простоте. Начинать изучение легче с простого примера, чем сразу с sample, например.

Mikhail Sukhov
Mikhail Sukhov

Vyacheslav: Смысл для новичка - в простоте. Начинать изучение легче с простого примера, чем сразу с sample, например.

  1. Подпишитесь на обновление по стакану через ITrader.QuotesChanged.
  2. Дождитесь своего стакана (проверять по MarketDepth.Security).
  3. Просигнальте, если есть три составляющие - стакан, инструмент, порфтель.
  4. На всякий случай еще выведите в лог ITrader.ProcessDataError.
VsevolodG
VsevolodG

Добрый день.

Уточните, пожалуйста, как получать текущую рыночную цену по инструменту? Сейчас я использую

this.Security.ShrinkPrice(this.Security.BestBid.Price, ShrinkRules.Auto)

Проблема в том, что в графике цены и объема по инструменту красным отображается текущая цена, которая зачастую не равна BestBid.Price

Mikhail Sukhov
Mikhail Sukhov

VsevolodG: Проблема в том, что в графике цены и объема по инструменту красным отображается текущая цена, которая зачастую не равна BestBid.Price

В графике цены и объема указывается цена сделки, а BestBid - цена заявки.

VsevolodG
VsevolodG

Mikhail Sukhov:

VsevolodG: Проблема в том, что в графике цены и объема по инструменту красным отображается текущая цена, которая зачастую не равна BestBid.Price

В графике цены и объема указывается цена сделки, а BestBid - цена заявки.

А в S# есть возможность получить эту цену сделки?

Mikhail Sukhov
Mikhail Sukhov

VsevolodG:

Mikhail Sukhov:

VsevolodG: Проблема в том, что в графике цены и объема по инструменту красным отображается текущая цена, которая зачастую не равна BestBid.Price

В графике цены и объема указывается цена сделки, а BestBid - цена заявки.

А в S# есть возможность получить эту цену сделки?

Security.LastTrade + экспорт всех сделок.

Igor_B
Igor_B

Михаил, доброе время. Вопрос по методу Trader.Connеct(). Из приложения запустили Квик [terminal.Launch()], залогинились. Trader.Connect() - явно не вызывал. Запускаю startDDE - данные из CustomTable идут. Подписался на событие Trader.Disconnected, пробую отключить внешние транзакции в Квик - данные все равно экспортируются, прекращаю работу Квика - событие Trader.Disconnected
не срабатывает. Срабатывает это событие,если вызываю Trader.Connеct(), затем в коде вызываю Trader.Disconnect(). Проясните, как работает Connect. Спасибо.

Alexander
Alexander

Igor_B: Михаил, доброе время. Вопрос по методу Trader.Connеct(). Из приложения запустили Квик [terminal.Launch()], залогинились. Trader.Connect() - явно не вызывал. Запускаю startDDE - данные из CustomTable идут. Подписался на событие Trader.Disconnected, пробую отключить внешние транзакции в Квик - данные все равно экспортируются, прекращаю работу Квика - событие Trader.Disconnected не срабатывает. Срабатывает это событие,если вызываю Trader.Connеct(), затем в коде вызываю Trader.Disconnect(). Проясните, как работает Connect. Спасибо.

Disconnected не может сработать если до этого не было коннекта с квиком. метод Connect как раз и подключается к квику.

Евгений
Евгений

Подскажите, добавил на главной форме логирование ``` // каждая стратегия будет иметь свое собственное окно this.GuiAsync(() => guiLogger.Strategies.Add(_strategy));

и теперь при попытке добавить дочернюю стратегию в классе стратегии  появляется ошибка

Вызывающим потоком должен быть STA, поскольку этого требуют большинство компонентов UI.

Alexander
Alexander

Евгений: Подскажите, добавил на главной форме логирование ``` // каждая стратегия будет иметь свое собственное окно this.GuiAsync(() => guiLogger.Strategies.Add(_strategy));

> и теперь при попытке добавить дочернюю стратегию в классе стратегии  появляется ошибка
> ```
Вызывающим потоком должен быть STA, поскольку этого требуют большинство компонентов UI.

WPF работает в STA режиме MSDN - вот полезная ссылка на подробности

Евгений
Евгений

Alexander:

Евгений: Подскажите, добавил на главной форме логирование ``` // каждая стратегия будет иметь свое собственное окно this.GuiAsync(() => guiLogger.Strategies.Add(_strategy));

> > и теперь при попытке добавить дочернюю стратегию в классе стратегии  появляется ошибка
> > ```
Вызывающим потоком должен быть STA, поскольку этого требуют большинство компонентов UI.

WPF работает в STA режиме MSDN - вот полезная ссылка на подробности

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

З.Ы. Не судите строго я только учусь

Евгений
Евгений

Михаил, заметил, что в объекте RealTimeTestTrader нет SecuritiesTable, для тестирования в реальном времени нельзя добавить дополнительные колонки?

Mikhail Sukhov
Mikhail Sukhov

Евгений: Михаил, заметил, что в объекте RealTimeTestTrader нет SecuritiesTable, для тестирования в реальном времени нельзя добавить дополнительные колонки?

RealTimeTestTrader - это обертка над реальным трейдером.

Евгений
Евгений

Mikhail Sukhov:

Евгений: Михаил, заметил, что в объекте RealTimeTestTrader нет SecuritiesTable, для тестирования в реальном времени нельзя добавить дополнительные колонки?

RealTimeTestTrader - это обертка над реальным трейдером.

Это значит что нельзя добавить дополнительные колонки?

Alexander
Alexander

Евгений:

Mikhail Sukhov:

Евгений: Михаил, заметил, что в объекте RealTimeTestTrader нет SecuritiesTable, для тестирования в реальном времени нельзя добавить дополнительные колонки?

RealTimeTestTrader - это обертка над реальным трейдером.

Это значит что нельзя добавить дополнительные колонки?

Добавлять надо у RealTimeTestTrader.Trader

Евгений
Евгений

Alexander:

Евгений:

Mikhail Sukhov:

Евгений: Михаил, заметил, что в объекте RealTimeTestTrader нет SecuritiesTable, для тестирования в реальном времени нельзя добавить дополнительные колонки?

RealTimeTestTrader - это обертка над реальным трейдером.

Это значит что нельзя добавить дополнительные колонки?

Добавлять надо у RealTimeTestTrader.Trader

🤔 Спасибо, снимаю ручник....

Евгений
Евгений

Скажите, пожалуйста, есть ли какие-то особенности/преимущества/недостатки использования TimeFrameStrategy и ActionStrategy по мимо того, что > Код, с использованием событий, получается компактнее, чем обычное использование Strategy:.

Евгений
Евгений

Скажите, пожалуйста, есть ли какие-то особенности/преимущества/недостатки использования TimeFrameStrategy и ActionStrategy по мимо того, что > Код, с использованием событий, получается компактнее, чем обычное использование Strategy:.

Михаил, что вы посоветуете использовать? Или принципиально нет никакой разницы?

Mikhail Sukhov
Mikhail Sukhov

Евгений: Михаил, что вы посоветуете использовать? Или принципиально нет никакой разницы?

Абсолютно никакой. Я использую события вперемешку с императивным стилем. Зависит от ситуаций.

a.dobryn
a.dobryn

Что-то я запуталась Смотрю в отладчике в эту строчку


this.Trader.NewMyTrades += trades => this.GuiAsync(() => _myTradesWindow.Trades.AddRange(trades));

в trades все нормально - там новые сделки. В gui (_myTradesWindow) они появляются. А свойство _myTradesWindow.Trades не меняется - в нем как хранятся старые сделки (которые были до запуска программы), так и хранятся, новых там нет. Так и должно быть? с _ordersWindow.Orders вроде все в порядке - и поступают новые, и обновляется :-?

Mikhail Sukhov
Mikhail Sukhov

D_Alex: В gui (_myTradesWindow) они появляются. А свойство _myTradesWindow.Trades не меняется

Чудес не бывает.

a.dobryn
a.dobryn

Mikhail Sukhov:

D_Alex: В gui (_myTradesWindow) они появляются. А свойство _myTradesWindow.Trades не меняется

Чудес не бывает.

хм, а сейчас все нормально изменилось. Ничего не понимаю О_о

upd: а сейчас снова то же самое. То есть при запуске на "свежий" профиль, когда при старте DDE сделок не было, новая сделка добавилась нормально upd2: хотя, если выводить Count в файл, там все нормально..значит, у меня где-то глюк

хотя как-то странно, сделки происходят по одной, а получается

TradesCount = 0 TradesCount = 13 TradesCount = 15

(13 было до запуска)

Евгений
Евгений

Как мониторить стоп-лосс стратегии? У меня получается, что они запускаются, а вот лога остановки нет, даже когда уже следующая заявка исполнится, по идее стоп-лосы по предыдущей заявке должны завершиться? Или я чего не понимаю... Защитные стратегии создаю как в примере в OnNewMyTrades.

IS_01:00:01 20:27:48.3924267 Стратегия запущена.
IS_01:00:01 20:48:01.3268026 Регистрация заявки - цена 201245, направление Buy, объем 55
IS_01:00:01 20:48:02.6478781 Прошла сделка по цене 200690, объём 5, направление Buy.
IS_01:00:01 20:48:02.6488782 Прошла сделка по цене 200705, объём 2, направление Buy.
IS_01:00:01 20:48:02.6488782 Прошла сделка по цене 200710, объём 8, направление Buy.
IS_01:00:01 20:48:02.6488782 Прошла сделка по цене 200715, объём 40, направление Buy.
IS_01:00:01 20:48:02.6568787 Регистрация стоп-лосс по цене 200060
IS_01:00:01 20:48:02.6568787 Регистрация тейк-профит по цене 201165
IS_01:00:01 20:48:02.6568787 Регистрация стоп-лосс по цене 200060
IS_01:00:01 20:48:02.6568787 Регистрация тейк-профит по цене 201165
IS_01:00:01 20:48:02.6568787 Регистрация стоп-лосс по цене 200060
IS_01:00:01 20:48:02.6568787 Регистрация тейк-профит по цене 201165
IS_01:00:01 20:48:02.6568787 Регистрация стоп-лосс по цене 200060
IS_01:00:01 20:48:02.6568787 Регистрация тейк-профит по цене 201165
BS 20:48:02.6578787 Стратегия запущена.
BS 20:48:02.6578787 Стратегия запущена.
TPS 20:48:02.6578787 Стратегия запущена.
SLS 20:48:02.6578787 Стратегия запущена.
BS 20:48:02.6578787 Стратегия запущена.
TPS 20:48:02.6578787 Стратегия запущена.
SLS 20:48:02.6578787 Стратегия запущена.
BS 20:48:02.6578787 Стратегия запущена.
TPS 20:48:02.6578787 Стратегия запущена.
SLS 20:48:02.6578787 Стратегия запущена.
BS 20:48:02.6578787 Стратегия запущена.
TPS 20:48:02.6578787 Стратегия запущена.
SLS 20:48:02.6578787 Стратегия запущена.
IS_01:00:01 21:09:03.0279678 Регистрация заявки - цена 200110, направление Sell, объем 55
IS_01:00:01 21:09:04.0530264 Прошла сделка по цене 200655, объём 1, направление Sell.
IS_01:00:01 21:09:04.0530264 Прошла сделка по цене 200645, объём 14, направление Sell.
IS_01:00:01 21:09:04.0530264 Прошла сделка по цене 200640, объём 9, направление Sell.
IS_01:00:01 21:09:04.0540265 Прошла сделка по цене 200635, объём 7, направление Sell.
IS_01:00:01 21:09:04.0540265 Прошла сделка по цене 200630, объём 14, направление Sell.
IS_01:00:01 21:09:04.0540265 Прошла сделка по цене 200625, объём 9, направление Sell.
IS_01:00:01 21:09:04.0540265 Прошла сделка по цене 200620, объём 1, направление Sell.
IS_01:00:01 21:09:04.0540265 Регистрация стоп-лосс по цене 200225
IS_01:00:01 21:09:04.0540265 Регистрация тейк-профит по цене 201270
IS_01:00:01 21:09:04.0540265 Регистрация стоп-лосс по цене 200225
IS_01:00:01 21:09:04.0540265 Регистрация тейк-профит по цене 201270
IS_01:00:01 21:09:04.0550265 Регистрация стоп-лосс по цене 200225
IS_01:00:01 21:09:04.0550265 Регистрация тейк-профит по цене 201270
IS_01:00:01 21:09:04.0550265 Регистрация стоп-лосс по цене 200225
IS_01:00:01 21:09:04.0550265 Регистрация тейк-профит по цене 201270
IS_01:00:01 21:09:04.0550265 Регистрация стоп-лосс по цене 200225
IS_01:00:01 21:09:04.0550265 Регистрация тейк-профит по цене 201270
IS_01:00:01 21:09:04.0560266 Регистрация стоп-лосс по цене 200225
IS_01:00:01 21:09:04.0560266 Регистрация тейк-профит по цене 201270
IS_01:00:01 21:09:04.0560266 Регистрация стоп-лосс по цене 200225
IS_01:00:01 21:09:04.0560266 Регистрация тейк-профит по цене 201270

Mikhail Sukhov
Mikhail Sukhov

Евгений: Как мониторить стоп-лосс стратегии? У меня получается, что они запускаются, а вот лога остановки нет, даже когда уже следующая заявка исполнится, по идее стоп-лосы по предыдущей заявке должны завершиться? Или я чего не понимаю... Защитные стратегии создаю как в примере в OnNewMyTrades.

Защитные стратегии мониторят стакан.

Евгений
Евгений

Mikhail Sukhov:

Евгений: Как мониторить стоп-лосс стратегии? У меня получается, что они запускаются, а вот лога остановки нет, даже когда уже следующая заявка исполнится, по идее стоп-лосы по предыдущей заявке должны завершиться? Или я чего не понимаю... Защитные стратегии создаю как в примере в OnNewMyTrades.

Защитные стратегии мониторят стакан.

А как защитные стратегии отслеживать, и вот в данном случае, что я описал, их нужно останавливать вручную? И есть какой-то признак по которому можно узнать, что заявка выставлена по защитной стратегии?

Mikhail Sukhov
Mikhail Sukhov

Евгений: А как защитные стратегии отслеживать, и вот в данном случае, что я описал, их нужно останавливать вручную? И есть какой-то признак по которому можно узнать, что заявка выставлена по защитной стратегии?

Переопределить виртуальный метод ProtectiveStrategy.CreateProtectionOrder

Евгений
Евгений

Mikhail Sukhov:

Евгений: А как защитные стратегии отслеживать, и вот в данном случае, что я описал, их нужно останавливать вручную? И есть какой-то признак по которому можно узнать, что заявка выставлена по защитной стратегии?

Переопределить виртуальный метод ProtectiveStrategy.CreateProtectionOrder

Михаил, я не совсем понял про CreateProtectionOrder, в методе я узнаю что заявка создалась, а как остановить стратегию и отловить момент выставления по ней заявки? А еще не разберусь как переопределить😊, я же работаю с TimeFrameStrategy?

Mikhail Sukhov
Mikhail Sukhov

Евгений:

Mikhail Sukhov:

Евгений: А как защитные стратегии отслеживать, и вот в данном случае, что я описал, их нужно останавливать вручную? И есть какой-то признак по которому можно узнать, что заявка выставлена по защитной стратегии?

Переопределить виртуальный метод ProtectiveStrategy.CreateProtectionOrder

Михаил, я не совсем понял про CreateProtectionOrder, в методе я узнаю что заявка создалась, а как остановить стратегию и отловить момент выставления по ней заявки? А еще не разберусь как переопределить😊, я же работаю с TimeFrameStrategy?

Нужно отнаследоваться от защитной стратегии и переопределить виртуальный метод.

freelancer
freelancer

Здравствуйте. У меня в событии NewSecurities у нужного мне инструмента проставлен только Id. Как это исправить ?

Mikhail Sukhov
Mikhail Sukhov

freelancer: Здравствуйте. У меня в событии NewSecurities у нужного мне инструмента проставлен только Id. Как это исправить ?

Подождать, когда в SecuritiesChanged он придет до конца сформированный.

freelancer
freelancer

Mikhail Sukhov:

freelancer: Здравствуйте. У меня в событии NewSecurities у нужного мне инструмента проставлен только Id. Как это исправить ?

Подождать, когда в SecuritiesChanged он придет до конца сформированный. Спасибо. С этим разобрался. Осталась проблема со свечами. Они просто не грузятся. Запускаю примеры (SampleCandles и SampleSMA) - а там просто пустое окно и никаких свечей. Ждать бесполезно. Ошибки не вылетают (ProcessDataError).

Из-за чего это может быть ?

Mikhail Sukhov
Mikhail Sukhov

freelancer:

Mikhail Sukhov:

freelancer: Здравствуйте. У меня в событии NewSecurities у нужного мне инструмента проставлен только Id. Как это исправить ?

Подождать, когда в SecuritiesChanged он придет до конца сформированный. Спасибо. С этим разобрался. Осталась проблема со свечами. Они просто не грузятся. Запускаю примеры (SampleCandles и SampleSMA) - а там просто пустое окно и никаких свечей. Ждать бесполезно. Ошибки не вылетают (ProcessDataError).

Из-за чего это может быть ?

Запустите пример Sample. Видны ли там тиковые сделки?

freelancer
freelancer

Mikhail Sukhov: Запустите пример Sample. Видны ли там тиковые сделки? Глючил демо-сервер Финама. Подключился к демо-серверу с quik.ru и всё увидел. Странно...

Stanislav121
Stanislav121

Добрый день. С чего начать использование Stock#? Вот открыта у меня VS Express, и что писать? Хотелось бы почитать что-то вроде этого http://finlabportal.ru/2010/09/1133/

Alexander
Alexander

Stanislav121: Добрый день. С чего начать использование Stock#? Вот открыта у меня VS Express, и что писать? Хотелось бы почитать что-то вроде этого http://finlabportal.ru/2010/09/1133/

Добрый. Для начала изучите примеры что есть в поставке, посмотрите как и какие библиотеки - reference добавляются к проекту. Затем необходимо понять что вы хотите и как это следует реализовывать с имеющимися сущностями Stock#. Также можно изучить документацию в поставке, она очень полная.

Stanislav121
Stanislav121

Alexander, спасибо, посмотрел первый пример. Я так понял, что для связи с quik используется Trans2QuikAPI. Но я не увидел его подключения. Значит отправка транзакций происходит по другому? И где взять DDE сервер?

Maxim
Maxim

Stanislav121: Alexander, спасибо, посмотрел первый пример. Я так понял, что для связи с quik используется Trans2QuikAPI. Но я не увидел его подключения. Значит отправка транзакций происходит по другому? И где взять DDE сервер?

S# использует Trans2QuikAPI и DDE для связи с Квиком внутри себя. Для пользователя S# вся эта «кухня» скрыта.

Yura
Yura

Как из всех сделок получить цену последней сделки передав код бумаги?=(

Alexander
Alexander

Yura: Как из всех сделок получить цену последней сделки передав код бумаги?=(

Enumerable.Last

Yura
Yura

Alexander:

Yura: Как из всех сделок получить цену последней сделки передав код бумаги?=(

Enumerable.Last

А можно по подробнее. Мне нужно из таблицы Все сделки выбрать последнюю сделку по заданной бумаге. Можно примерчик небольшой?

Maxim
Maxim

Yura:

Alexander:

Yura: Как из всех сделок получить цену последней сделки передав код бумаги?=(

Enumerable.Last

А можно по подробнее. Мне нужно из таблицы Все сделки выбрать последнюю сделку по заданной бумаге. Можно примерчик небольшой?

QuikTrader.Securities.First(sec => sec.Code == "LKOH").LastTrade

Stanislav121
Stanislav121

Какова может быть максимальная скорость работы робота(выставление заявок) ? От чего это зависит?

Mikhail Sukhov
Mikhail Sukhov

Stanislav121: Какова может быть максимальная скорость работы робота(выставление заявок) ? От чего это зависит?

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

Alexander
Alexander

Stanislav121: Какова может быть максимальная скорость работы робота(выставление заявок) ? От чего это зависит?

Тысячи в минуту.

Stanislav121
Stanislav121

Mikhail Sukhov:

Stanislav121: Какова может быть максимальная скорость работы робота(выставление заявок) ? От чего это зависит?

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

Mikhail Sukhov
Mikhail Sukhov

Stanislav121:

Mikhail Sukhov:

Stanislav121: Какова может быть максимальная скорость работы робота(выставление заявок) ? От чего это зависит?

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

Если вы задаете подобные вопросы, значит у вас стратегия зависит от скорости выставления заявок. Квик - это не тот терминал, который бы подобное мог обеспечить. Он конечно может выставить хоть 10000 заявок в минуту (главное чтобы брокер не зарубил), но задержка в получении маркет данных (ситуация в стакане меняется намного чаще, чем это транслирует Квик) и проскальзывание на бирже сведет на нет всю быстроту (или вы будете лепить заявки по невыгодным ценам).

Stanislav121
Stanislav121

Mikhail Sukhov:

Stanislav121:

Mikhail Sukhov:

Stanislav121: Какова может быть максимальная скорость работы робота(выставление заявок) ? От чего это зависит?

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

Если вы задаете подобные вопросы, значит у вас стратегия зависит от скорости выставления заявок. Квик - это не тот терминал, который бы подобное мог обеспечить. Он конечно может выставить хоть 10000 заявок в минуту (главное чтобы брокер не зарубил), но задержка в получении маркет данных (ситуация в стакане меняется намного чаще, чем это транслирует Квик) и проскальзывание на бирже сведет на нет всю быстроту (или вы будете лепить заявки по невыгодным ценам).

Да, стратегия зависит от скорости выставления заявок. Не очень Вас понимаю. Задержка получения данных характерна для quik или для других серверов тоже(TSLab там или TRANSAQ Connector)? Ну и 10k заявок в минуту не нужно.

Mikhail Sukhov
Mikhail Sukhov

Stanislav121: Задержка получения данных характерна для quik или для других серверов тоже(TSLab там или TRANSAQ Connector)?

Задержка есть везде. У всех она примерно одинаковая. Если скорости Квика не хватает, переходите на прямое подключение.

Stanislav121
Stanislav121

Mikhail Sukhov:

Stanislav121: Задержка получения данных характерна для quik или для других серверов тоже(TSLab там или TRANSAQ Connector)?

Задержка есть везде. У всех она примерно одинаковая. Если скорости Квика не хватает, переходите на прямое подключение.

Прямое подключение - это через Plaza 2? А Stock# работает с Plaza 2?

crapulent
crapulent

приветсвую спасибо огромное за удобную библиотеку

возник вопрос: использую квик. регистрирую заявку через trader.registerOrder возможно ли отследить неудачу при посылке транзакции на биржу (например если интернет падал, но квик еще не прислал Disconnected)?

Alexander
Alexander

crapulent: приветсвую спасибо огромное за удобную библиотеку

возник вопрос: использую квик. регистрирую заявку через trader.registerOrder возможно ли отследить неудачу при посылке транзакции на биржу (например если интернет падал, но квик еще не прислал Disconnected)?

OrdersFailed

crapulent
crapulent

пробовал. не работае. кусок кода:

...
                    trader.OrdersFailed += fails =>
                        {
                            foreach (var fail in fails)
                            {
                                Console.WriteLine("E: " + fail.Error);
                            }
                        };
                    Security sec = trader.Securities.First(s => s.Code == "LKOH");
                    trader.IsAsyncMode = true;
                    Order order = new Order()
                    {
                        Security = sec,
                        Volume = 1,
                        Direction = OrderDirections.Buy,
                        Price = price,
                        Portfolio = port,
                    };

                    Console.Write(">");
                    Console.ReadKey();
                    trader.RegisterOrder(order);

дожидаюсь ">", отключаю интернет, жмакаю. ордерзфэйлд не приходит.

crapulent
crapulent

в догонку еще вопрос.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Ecng.Trading.Quik;
using System.IO;

namespace MultiQuikTest
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                foreach (var t in QuikTerminal.Terminals)
                {
                    File.AppendAllText("output", t.DirectoryName + "\r\n");
                }
            }
            catch (Exception ex)
            {
                File.AppendAllText("output", ex.ToString());
            }
            Console.ReadKey();
        }
    }
}

если запущено больше одного квика получаю эксепшн, если 1, то все ок. windows 7

System.InvalidCastException: Заданное приведение является недопустимым. в System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo) в System.Runtime.InteropServices.Marshal.ThrowExceptionForHR(Int32 errorCode) в System.Management.ManagementScope.InitializeGuts(Object o) в System.Management.ManagementScope.Initialize() в System.Management.ManagementObjectSearcher.Initialize() в System.Management.ManagementObjectSearcher.Get() в Ecng.Interop.WinApi.GetOwner(Process process) в Ecng.Trading.Quik.QuikTerminal.#=qMfrcg9BqoX_SrZ_PniRSkM_HjG66XqOI62YKPEESM$8=.#=q2Ey9GcWR9id72injkpK63zAr0R9wXuqBWricx3tkazE=(Process #=qkq4$1ICccTWVLKEFpo7ccw==, Process #=qzKCUSHcFINff4MoQJ2AUZA==) в Ecng.Collections.CollectionHelper.Comparer1.Compare(T x, T y) в System.Linq.EnumerableSorter2.CompareKeys(Int32 index1, Int32 index2) в System.Linq.EnumerableSorter1.QuickSort(Int32[] map, Int32 left, Int32 right) в System.Linq.EnumerableSorter1.Sort(TElement[] elements, Int32 count) в System.Linq.OrderedEnumerable1.<GetEnumerator>d__0.MoveNext() в System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() в System.Linq.Enumerable.WhereEnumerableIterator1.MoveNext() в System.Linq.Buffer1..ctor(IEnumerable1 source) в System.Linq.Enumerable.ToArray[TSource](IEnumerable1 source) в Ecng.Trading.Quik.QuikTerminal.get_Terminals() в MultiQuikTest.Program.Main(String[] args) в D:\root\workspace\rts\csharpsolutions\revision_3_2011_05_10\MultiQuikTest\MultiQuikTest\Program.cs:строка 17

не подскажете, с чем может быть связано?

Alexander
Alexander

в догонку еще вопрос.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Ecng.Trading.Quik;
using System.IO;

namespace MultiQuikTest
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                foreach (var t in QuikTerminal.Terminals)
                {
                    File.AppendAllText("output", t.DirectoryName + "\r\n");
                }
            }
            catch (Exception ex)
            {
                File.AppendAllText("output", ex.ToString());
            }
            Console.ReadKey();
        }
    }
}

если запущено больше одного квика получаю эксепшн, если 1, то все ок. windows 7

System.InvalidCastException: Заданное приведение является недопустимым. в System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo) в System.Runtime.InteropServices.Marshal.ThrowExceptionForHR(Int32 errorCode) в System.Management.ManagementScope.InitializeGuts(Object o) в System.Management.ManagementScope.Initialize() в System.Management.ManagementObjectSearcher.Initialize() в System.Management.ManagementObjectSearcher.Get() в Ecng.Interop.WinApi.GetOwner(Process process) в Ecng.Trading.Quik.QuikTerminal.#=qMfrcg9BqoX_SrZ_PniRSkM_HjG66XqOI62YKPEESM$8=.#=q2Ey9GcWR9id72injkpK63zAr0R9wXuqBWricx3tkazE=(Process #=qkq4$1ICccTWVLKEFpo7ccw==, Process #=qzKCUSHcFINff4MoQJ2AUZA==) в Ecng.Collections.CollectionHelper.Comparer1.Compare(T x, T y) в System.Linq.EnumerableSorter2.CompareKeys(Int32 index1, Int32 index2) в System.Linq.EnumerableSorter1.QuickSort(Int32[] map, Int32 left, Int32 right) в System.Linq.EnumerableSorter1.Sort(TElement[] elements, Int32 count) в System.Linq.OrderedEnumerable1.<GetEnumerator>d__0.MoveNext() в System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() в System.Linq.Enumerable.WhereEnumerableIterator1.MoveNext() в System.Linq.Buffer1..ctor(IEnumerable1 source) в System.Linq.Enumerable.ToArray[TSource](IEnumerable1 source) в Ecng.Trading.Quik.QuikTerminal.get_Terminals() в MultiQuikTest.Program.Main(String[] args) в D:\root\workspace\rts\csharpsolutions\revision_3_2011_05_10\MultiQuikTest\MultiQuikTest\Program.cs:строка 17

не подскажете, с чем может быть связано?

Потестировал у себя - всё работает, с несколькими квиками в том числе. Все квики запускаются с локального диска, не с сетевого \ flash? Какие права установлены для текущего пользователя?

Версия Windows и версия установленного .Net Framework?

crapulent
crapulent

Alexander: Потестировал у себя - всё работает, с несколькими квиками в том числе. Все квики запускаются с локального диска, не с сетевого \ flash? Какие права установлены для текущего пользователя?

Версия Windows и версия установленного .Net Framework? окей, спасибо, буду искать проблему у себя да, с локального. из соседних папок админские права, UAC выключен windows 7 ultimate .Net 4.0

Stanislav121
Stanislav121

"Потому как на Купели HFT делать можно, но не так эффективно" Что такое Купель?

vfreeman
vfreeman

Stanislav121: "Потому как на Купели HFT делать можно, но не так эффективно" Что такое Купель?

вероятно QPILE - встроенный язык QUIK

Yura
Yura

Какая проблема в 5-й строке? =(

trader.SecuritiesChanged += trades =>
{
  if (_depth == null && _lkoh != null)
  {
    _depth = trades.FirstOrDefault(d => d.Code == "LKOH").LastTrade;
    if (_depth != null)
     {
// если портфель уже появился, то извещаем об этом основной поток для выставления заявки
      if (_portfolio != null)
       waitHandle.Set();
     }
   }
};
Alexander
Alexander

Yura: Какая проблема в 5-й строке? =(

trader.SecuritiesChanged += trades => { if (_depth == null && _lkoh != null) { _depth = trades.FirstOrDefault(d => d.Code == "LKOH").LastTrade; if (_depth != null) { // если портфель уже появился, то извещаем об этом основной поток для выставления заявки if (_portfolio != null) waitHandle.Set(); } } };



depth это что, какой тип? Стакан? Тогда неправильное приведение типов.

А Visual Studio что говорит? Или это викторина для форумчан? :)
Yura
Yura

Alexander:

Yura: Какая проблема в 5-й строке? =(

trader.SecuritiesChanged += trades => { if (_depth == null && _lkoh != null) { _depth = trades.FirstOrDefault(d => d.Code == "LKOH").LastTrade; if (_depth != null) { // если портфель уже появился, то извещаем об этом основной поток для выставления заявки if (_portfolio != null) waitHandle.Set(); } } };

> 
> 
> depth это что, какой тип? Стакан? Тогда неправильное приведение типов.
> 
> А Visual Studio что говорит? Или это викторина для форумчан? :)
В общем мне нужно получить информацию о последней сделке по указанной бумаге..как мне это сделать? =( 
Yura
Yura

Yura:

Alexander:

Yura: Какая проблема в 5-й строке? =(

trader.SecuritiesChanged += trades => { if (_depth == null && _lkoh != null) { _depth = trades.FirstOrDefault(d => d.Code == "LKOH").LastTrade; if (_depth != null) { // если портфель уже появился, то извещаем об этом основной поток для выставления заявки if (_portfolio != null) waitHandle.Set(); } } };

> >
> >
> > depth это что, какой тип? Стакан? Тогда неправильное приведение типов.
> >
> > А Visual Studio что говорит? Или это викторина для форумчан? :)
> В общем мне нужно получить информацию о последней сделке по указанной бумаге..как мне это сделать? =( Плиз если можно пример рабочий((
Yura
Yura

Yura:

Yura:

Alexander:

Yura: Какая проблема в 5-й строке? =(

trader.SecuritiesChanged += trades => { if (_depth == null && _lkoh != null) { _depth = trades.FirstOrDefault(d => d.Code == "LKOH").LastTrade; if (_depth != null) { // если портфель уже появился, то извещаем об этом основной поток для выставления заявки if (_portfolio != null) waitHandle.Set(); } } };

> > >
> > >
> > > depth это что, какой тип? Стакан? Тогда неправильное приведение типов.
> > >
> > > А Visual Studio что говорит? Или это викторина для форумчан? :)
> > В общем мне нужно получить информацию о последней сделке по указанной бумаге..как мне это сделать? =( Плиз если можно пример рабочий((я в си шарпе новичок и в стокшарпе трудно разобраться
Yura
Yura

Yura:

Yura:

Yura: Какая проблема в 5-й строке? =(

trader.SecuritiesChanged += trades => { if (_depth == null && _lkoh != null) { _depth = trades.FirstOrDefault(d => d.Code == "LKOH").LastTrade; if (_depth != null) { // если портфель уже появился, то извещаем об этом основной поток для выставления заявки if (_portfolio != null) waitHandle.Set(); } } };

> >
> >
> > depth это что, какой тип? Стакан? Тогда неправильное приведение типов.
> >
> > А Visual Studio что говорит? Или это викторина для форумчан? :)
> В общем мне нужно получить информацию о последней сделке по указанной бумаге..как мне это сделать? =( Плиз если можно пример рабочий((я в си шарпе новичок и в стокшарпе трудно разобраться. А у _depth тип Security
Yura
Yura

Yura:

Yura:

Yura:

Yura: Какая проблема в 5-й строке? =(

trader.SecuritiesChanged += trades => { if (_depth == null && _lkoh != null) { _depth = trades.FirstOrDefault(d => d.Code == "LKOH").LastTrade; if (_depth != null) { // если портфель уже появился, то извещаем об этом основной поток для выставления заявки if (_portfolio != null) waitHandle.Set(); } } };

> > >
> > >
> > > depth это что, какой тип? Стакан? Тогда неправильное приведение типов.
> > >
> > > А Visual Studio что говорит? Или это викторина для форумчан? :)
> > "Ошибка	7	Неявное преобразование типа "Ecng.Trading.BusinessEntities.Trade" в "Ecng.Trading.BusinessEntities.Security" невозможно
> > "В общем мне нужно получить информацию о последней сделке по указанной бумаге..как мне это сделать? =( Плиз если можно пример рабочий((я в си шарпе новичок и в стокшарпе трудно разобраться. А у _depth тип Security
Alexander
Alexander

Yura:

Yura:

Yura:

Yura:

Yura: Какая проблема в 5-й строке? =(

trader.SecuritiesChanged += trades => { if (_depth == null && _lkoh != null) { _depth = trades.FirstOrDefault(d => d.Code == "LKOH").LastTrade; if (_depth != null) { // если портфель уже появился, то извещаем об этом основной поток для выставления заявки if (_portfolio != null) waitHandle.Set(); } } };

> > > >
> > > >
> > > > depth это что, какой тип? Стакан? Тогда неправильное приведение типов.
> > > >
> > > > А Visual Studio что говорит? Или это викторина для форумчан? :)
> > > "Ошибка	7	Неявное преобразование типа "Ecng.Trading.BusinessEntities.Trade" в "Ecng.Trading.BusinessEntities.Security" невозможно
> > > "В общем мне нужно получить информацию о последней сделке по указанной бумаге..как мне это сделать? =( Плиз если можно пример рабочий((я в си шарпе новичок и в стокшарпе трудно разобраться. А у _depth тип Security


Последняя сделка - это Trade, а вы пытаетесь привести её к Security.
собственно об этом Visual Studio и сообщает.
Yura
Yura

Alexander:

Yura:

Yura:

Yura:

Yura:

Yura: Какая проблема в 5-й строке? =(

trader.SecuritiesChanged += trades => { if (_depth == null && _lkoh != null) { _depth = trades.FirstOrDefault(d => d.Code == "LKOH").LastTrade; if (_depth != null) { // если портфель уже появился, то извещаем об этом основной поток для выставления заявки if (_portfolio != null) waitHandle.Set(); } } };

> > > > >
> > > > >
> > > > > depth это что, какой тип? Стакан? Тогда неправильное приведение типов.
> > > > >
> > > > > А Visual Studio что говорит? Или это викторина для форумчан? :)
> > > > "Ошибка	7	Неявное преобразование типа "Ecng.Trading.BusinessEntities.Trade" в "Ecng.Trading.BusinessEntities.Security" невозможно
> > > > "В общем мне нужно получить информацию о последней сделке по указанной бумаге..как мне это сделать? =( Плиз если можно пример рабочий((я в си шарпе новичок и в стокшарпе трудно разобраться. А у _depth тип Security
> 
> 
> Последняя сделка - это Trade, а вы пытаетесь привести её к Security.
> собственно об этом Visual Studio и сообщает.
О господи, ДА ДЕТКА, пашет!! спс огромное! какое же это счастье...
Yura
Yura

Yura:

Alexander:

Yura:

Yura:

Yura:

Yura:

Yura: Какая проблема в 5-й строке? =(

trader.SecuritiesChanged += trades => { if (_depth == null && _lkoh != null) { _depth = trades.FirstOrDefault(d => d.Code == "LKOH").LastTrade; if (_depth != null) { // если портфель уже появился, то извещаем об этом основной поток для выставления заявки if (_portfolio != null) waitHandle.Set(); } } };

> > > > > >
> > > > > >
> > > > > > depth это что, какой тип? Стакан? Тогда неправильное приведение типов.
> > > > > >
> > > > > > А Visual Studio что говорит? Или это викторина для форумчан? :)
> > > > > "Ошибка	7	Неявное преобразование типа "Ecng.Trading.BusinessEntities.Trade" в "Ecng.Trading.BusinessEntities.Security" невозможно
> > > > > "В общем мне нужно получить информацию о последней сделке по указанной бумаге..как мне это сделать? =( Плиз если можно пример рабочий((я в си шарпе новичок и в стокшарпе трудно разобраться. А у _depth тип Security
> >
> >
> > Последняя сделка - это Trade, а вы пытаетесь привести её к Security.
> > собственно об этом Visual Studio и сообщает.
> О господи, ДА ДЕТКА, пашет!! спс огромное! какое же это счастье...
А ещё такой вопрос. я пишу такое ```
trader.SecuritiesChanged += trades =>
                        {
                            if (_depth == null && _lkoh != null)
                            {
                                _depth = trades.FirstOrDefault(d => d.Code == "MSICH").LastTrade.Price;
                                
                                if (_depth != null)
                                {
                                    // если портфель уже появился, то извещаем об этом основной поток для выставления заявки
                                    if (_portfolio != null)
                                        waitHandle.Set();
                                }
                            }
                        };

Ошибка 1 Неявное преобразование типа "decimal" в "Ecng.Trading.BusinessEntities.Trade" невозможно. пытаюсь взять цену _depth = trades.FirstOrDefault(d => d.Code == "MSICH").LastTrade.Price;

Alexander
Alexander

Yura:

Yura:

Alexander:

Yura:

Yura:

Yura:

Yura:

Yura: Какая проблема в 5-й строке? =(

trader.SecuritiesChanged += trades => { if (_depth == null && _lkoh != null) { _depth = trades.FirstOrDefault(d => d.Code == "LKOH").LastTrade; if (_depth != null) { // если портфель уже появился, то извещаем об этом основной поток для выставления заявки if (_portfolio != null) waitHandle.Set(); } } };

> > > > > > >
> > > > > > >
> > > > > > > depth это что, какой тип? Стакан? Тогда неправильное приведение типов.
> > > > > > >
> > > > > > > А Visual Studio что говорит? Или это викторина для форумчан? :)
> > > > > > "Ошибка	7	Неявное преобразование типа "Ecng.Trading.BusinessEntities.Trade" в "Ecng.Trading.BusinessEntities.Security" невозможно
> > > > > > "В общем мне нужно получить информацию о последней сделке по указанной бумаге..как мне это сделать? =( Плиз если можно пример рабочий((я в си шарпе новичок и в стокшарпе трудно разобраться. А у _depth тип Security
> > >
> > >
> > > Последняя сделка - это Trade, а вы пытаетесь привести её к Security.
> > > собственно об этом Visual Studio и сообщает.
> > О господи, ДА ДЕТКА, пашет!! спс огромное! какое же это счастье...
> А ещё такой вопрос. я пишу такое ```
trader.SecuritiesChanged += trades =>
                        {
                            if (_depth == null && _lkoh != null)
                            {
                                _depth = trades.FirstOrDefault(d => d.Code == "MSICH").LastTrade.Price;
                                
                                if (_depth != null)
                                {
                                    // если портфель уже появился, то извещаем об этом основной поток для выставления заявки
                                    if (_portfolio != null)
                                        waitHandle.Set();
                                }
                            }
                        };

Ошибка 1 Неявное преобразование типа "decimal" в "Ecng.Trading.BusinessEntities.Trade" невозможно. пытаюсь взять цену _depth = trades.FirstOrDefault(d => d.Code == "MSICH").LastTrade.Price;

Таже самая ошибка. Пытаетесь привести decimal к Security. 2 разных сущности, 2 разных типа. В инете есть много учебников по C#, стоит хотя бы про типы прочитать и про приведение :)

А то ошибки ну уж совсем начальные.

Yura
Yura

Alexander:

Yura:

Yura:

Alexander:

Yura:

Yura:

Yura:

Yura:

Yura: Какая проблема в 5-й строке? =(

trader.SecuritiesChanged += trades => { if (_depth == null && _lkoh != null) { _depth = trades.FirstOrDefault(d => d.Code == "LKOH").LastTrade; if (_depth != null) { // если портфель уже появился, то извещаем об этом основной поток для выставления заявки if (_portfolio != null) waitHandle.Set(); } } };

> > > > > > > >
> > > > > > > >
> > > > > > > > depth это что, какой тип? Стакан? Тогда неправильное приведение типов.
> > > > > > > >
> > > > > > > > А Visual Studio что говорит? Или это викторина для форумчан? :)
> > > > > > > "Ошибка	7	Неявное преобразование типа "Ecng.Trading.BusinessEntities.Trade" в "Ecng.Trading.BusinessEntities.Security" невозможно
> > > > > > > "В общем мне нужно получить информацию о последней сделке по указанной бумаге..как мне это сделать? =( Плиз если можно пример рабочий((я в си шарпе новичок и в стокшарпе трудно разобраться. А у _depth тип Security
> > > >
> > > >
> > > > Последняя сделка - это Trade, а вы пытаетесь привести её к Security.
> > > > собственно об этом Visual Studio и сообщает.
> > > О господи, ДА ДЕТКА, пашет!! спс огромное! какое же это счастье...
> > А ещё такой вопрос. я пишу такое ```
trader.SecuritiesChanged += trades =>
                        {
                            if (_depth == null && _lkoh != null)
                            {
                                _depth = trades.FirstOrDefault(d => d.Code == "MSICH").LastTrade.Price;
                                
                                if (_depth != null)
                                {
                                    // если портфель уже появился, то извещаем об этом основной поток для выставления заявки
                                    if (_portfolio != null)
                                        waitHandle.Set();
                                }
                            }
                        };

Ошибка 1 Неявное преобразование типа "decimal" в "Ecng.Trading.BusinessEntities.Trade" невозможно. пытаюсь взять цену _depth = trades.FirstOrDefault(d => d.Code == "MSICH").LastTrade.Price;

Таже самая ошибка. Пытаетесь привести decimal к Security. 2 разных сущности, 2 разных типа. В инете есть много учебников по C#, стоит хотя бы про типы прочитать и про приведение :)

А то ошибки ну уж совсем начальные. На счет типов я понял что не совпадают. Но как так сделать чтоб вывелась цена=(

Yura
Yura

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

Alexander
Alexander

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

Посмотрите на работу Hydra и на работу SampleHistoryTesting. Все исходники идут со Stock#

Roman0
Roman0

Пожалуйста, подскажите как надежно определить, что все сделки из таблицы всех сделок получены и пошли актуальные данные, если подключиться через какое-то время после начала торгов. Наверное можно получить Security.LastTrade.Time и потом сравнивать с СandleManager.Source.Trades.Last().Time в CandlesChanged и т.д., но может быть есть какие-то еще способы? Спасибо!

Yura
Yura

Здравствуйте. Я не могу разобраться с SampleHistoryTesting. Запускаю, указываю путь к папке RIU9@RTS, нажимаю старт, пошла загрузка, нажимаю на отчет, выводится сообщение от Microsoft Excel мол неизвестный формат файла и кучу непонятных символов. В чем проблема? спасибо!

Mikhail Sukhov
Mikhail Sukhov

Yura: Здравствуйте. Я не могу разобраться с SampleHistoryTesting. Запускаю, указываю путь к папке RIU9@RTS, нажимаю старт, пошла загрузка, нажимаю на отчет, выводится сообщение от Microsoft Excel мол неизвестный формат файла и кучу непонятных символов. В чем проблема? спасибо!

Версия последняя?

Yura
Yura

Mikhail Sukhov:

Yura: Здравствуйте. Я не могу разобраться с SampleHistoryTesting. Запускаю, указываю путь к папке RIU9@RTS, нажимаю старт, пошла загрузка, нажимаю на отчет, выводится сообщение от Microsoft Excel мол неизвестный формат файла и кучу непонятных символов. В чем проблема? спасибо!

Версия последняя? скачал 3.1.9 и все заработало, Excel файл открывается.спасибо 😀 буду разбираться теперь с S# форматом.

Yura
Yura

😢 Запустил SQL Server Menegement Studio Express скрипт trading вижу но запустить не могу, имя сервера нужно использовать 127.0.0.1 ? или как? 😭

Yura
Yura

Yura: 😢 Запустил SQL Server Menegement Studio Express скрипт trading вижу но запустить не могу, имя сервера нужно использовать 127.0.0.1 ? или как? 😭 к локал хосту конектится или как подскажите

aspirant
aspirant

Yura:

Yura: 😢 Запустил SQL Server Menegement Studio Express скрипт trading вижу но запустить не могу, имя сервера нужно использовать 127.0.0.1 ? или как? 😭 к локал хосту конектится или как подскажите

вбейте localhost или (local) или . (просто точку).

aspirant
aspirant

aspirant:

Yura:

Yura: 😢 Запустил SQL Server Menegement Studio Express скрипт trading вижу но запустить не могу, имя сервера нужно использовать 127.0.0.1 ? или как? 😭 к локал хосту конектится или как подскажите

вбейте localhost или (local) или . (просто точку).

Поспешил, если у вас стоит sqlexpress, нужно набирать localhost\sqlexpress.

Yura
Yura

aspirant:

Yura:

Yura: 😢 Запустил SQL Server Menegement Studio Express скрипт trading вижу но запустить не могу, имя сервера нужно использовать 127.0.0.1 ? или как? 😭 к локал хосту конектится или как подскажите

вбейте localhost или (local) или . (просто точку). писал по всякому..не конектится=( пишет что "не удается открыть соединение с SQL Server".

esper
esper

Версия SQL Server-а какая? Может быть <имя компьютера>\SQLEXPRESS2008

aspirant
aspirant

В сервисах (Administrative Tools / Services) найдите SQL Server (ХХХ) и посмотрите, запущен ли он. Статус должен быть Started. Какое название указано в скобках?

Daenur
Daenur

Какой-то медленный старт/стоп вывода по DDE... Сделал простенький GUI на основе примеров, правлю потихоньку код. Каждый раз для проверки необходимо соединяться с КВИКом (происходит быстро) и начинать вывод по DDE (происходит очень медленно). Потом при закрытии программы происходит остановка вывода по DDE, тоже медленно. На все это бОльшая часть времени тратится. Можно как-то ускорить или это фича?

l-way
l-way

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

Помогите разобраться. Использую следующий код в обработчике стратегии OnProcess:

var candlesEnum = TraderHelper.GetTimeFrameCandles(p_candleManager, Security, timeFrame, new Range<DateTime>(startCandleTime, endCandleTime));

List<TimeFrameCandle> candles = candlesEnum.ToList<TimeFrameCandle>();

На второй строке при выполнении ToList периодически вылетает ошибка "Collection was modified during an enumeration."

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

Как можно побороть проблему, т.е. синхронизировать коллекцию?

Mikhail Sukhov
Mikhail Sukhov

l-way: var candlesEnum = TraderHelper.GetTimeFrameCandles(p_candleManager, Security, timeFrame, new Range(startCandleTime, endCandleTime));

List candles = candlesEnum.ToList();

На второй строке при выполнении ToList периодически вылетает ошибка "Collection was modified during an enumeration."

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

l-way
l-way

Mikhail Sukhov: Есть такая проблема, сами напоролись. Фикс будет уже в 3.2, надеюсь на следующей неделе.

Спасибо за ответ. Буду ждать

Stanislav121
Stanislav121

Как совершить сделку Short? В примере SampleConsole поменял Direction = OrderDirections.Buy на Direction = OrderDirections.Sell, Но это лишь привело к завершению работы робота. Пока что у меня получлось продать, лишь, когда что-нибудь куплено.

Jeta
Jeta

Разбираюсь со своим видоизмененным примером под SimpleConsol. Фьючерсы. Получаю :


 var order = new Order
                             {
                                 Portfolio = _portfolio,
                                 Price = _srm1.ShrinkPrice(_srm1.BestAsk.Price - delta, ShrinkRules.Auto),
                                 Security = _srm1,
                                 Volume = 1,
                                 Direction = OrderDirections.Sell,
                             };
                             trader.RegisterOrder(order); /// Это строка 197
                             Console.WriteLine("Заявка {0} зарегистрирована.", order.Id);


Что я сделал не так?

esper
esper

Где получаете _portfolio?

Jeta
Jeta

все как в примере SimpleConsole

esper
esper

Jeta: все как в примере SimpleConsole у вас на консоли есть сообщение, что найден инструмент и стакан, а то, что найден портфель - нет, может в этом дело?

Jeta
Jeta

Да, действительно сообщения нет, буду разбираться

Jeta
Jeta

Спасибо, разобрался. Причина была в том что вывод по Dde портфеля был неправильно настроен. Прочитал доку на сайте, разобрался.... Есть еще вопрос: Отчего зависит то, что программа то работает (подключается, запускается вывод по Dde и выставляются заявки), то не работает (последнее сообщение, которое выводится, что портфель "такой-то" появился...??? (программа на основе SimpleConsole)

esper
esper

Jeta: Есть еще вопрос: Отчего зависит то, что программа то работает (подключается, запускается вывод по Dde и выставляются заявки), то не работает (последнее сообщение, которое выводится, что портфель "такой-то" появился...??? (программа на основе SimpleConsole) Возможно, проблема как раз с экспортом. У меня в процессе отладки бывает такая ситуация: запускаю робота из под студии, он получает данные, что-то делает, нахожу ошибку и завершаю отладку в студии, экспорт в квике при этом не останавливается, если сразу же перезапустить робота, то велик шанс получить не все данные из квика.

Stanislav121
Stanislav121

Открыл пример SampleSMA, версия 3.1.10 Выдает ошибку при сборке в классе SmaStrategy , метод StrategyProcessResults. ни одна из перегрузок метода GetMarketPrice не принимает 1 аргумет. Почитал докуметацию , сделал вызов этого метода GetMarketPrice метод (Security, OrderDirections, Unit, MarketPriceTypes) Ошибка - ни одна из перегрузок метода GetMarketPrice не принимает 4 аргумета.

Roman0
Roman0

Заметил такую штуку: в версии 3.2.1 при получении свечей не с начала дня (подключился вечером) событие CandlesFinished вызывается как минимум 2 раза для свечи с одними и тем же временем (TimeFrameCandle). В версии 3.1.10 такого вроде бы не наблюдалось.

Alexander
Alexander

Roman0: Заметил такую штуку: в версии 3.2.1 при получении свечей не с начала дня (подключился вечером) событие CandlesFinished вызывается как минимум 2 раза для свечи с одними и тем же временем (TimeFrameCandle). В версии 3.1.10 такого вроде бы не наблюдалось.

В версии 3.2.2 уже исправлено. Сегодня-завтра выложим

Stanislav121
Stanislav121

Здравствуйте. такой код почему-то делает на одну покупку больше чем надо


while (true)
			{
				curLotBuyNow = (MainWindow.Instance.Trader.GetPosition(_portfolio, _security).CurrentValue - _valueOnStart);
				MessageBox.Show("curLotBuyNow= "+curLotBuyNow+"nLot= "+nLot);
				if (curLotBuyNow == nLot){break;}
								
				var order = new Order
				{
					Portfolio = _portfolio,
					Volume = (int) vol, 
					Price = this.PriceOfOrder.Text.To<decimal>(),
					Security = _security,
					Direction =  this.IsBuy.IsChecked == true ? OrderDirections.Buy : OrderDirections.Sell,
				};
				
				MainWindow.Instance.Trader.RegisterOrder(order);
				
				while(order.State != OrderStates.Done)
				{}
				
			}

nLot - объем который нужно купить Для того чтобы покупал точное количество пршлось вставить Thread.Sleep(500); в конец цикла. Видимо, иначе не успеваем получить информацию о сделке Почему? мы же получаем OrderStates.Done Если работать без Thread.Sleep(500) то, curLotBuyNow после первой покупки равно 0 и в течение всего цикла это значение отстает от истинного на 1. Подскажите, пожалуйста, что с этим можно сделать.

vader
vader

Я начал разбиратся в вашей библиотеке, и тестирую работоспособность в Quik-Junior и у меня почему-то проблемы с получением информации по портфелю. Размер денежных средств на счету и Размер денежных средств на начало торговой сессии равны нулю, а на запрос информации о бирже (_portfolio.Exchange) он ничего не выводит. Это происходит из-за того, что счет виртуальный? или по какой-то другой причине?

Alexander
Alexander

vader: Я начал разбиратся в вашей библиотеке, и тестирую работоспособность в Quik-Junior и у меня почему-то проблемы с получением информации по портфелю. Размер денежных средств на счету и Размер денежных средств на начало торговой сессии равны нулю, а на запрос информации о бирже (_portfolio.Exchange) он ничего не выводит. Это происходит из-за того, что счет виртуальный? или по какой-то другой причине?

Если ММВБ - проблема известна, сейчас как раз ей занимаюсь, надеюсь что в 3.2.3 будет фикс.

vader
vader

Alexander:

vader: Я начал разбиратся в вашей библиотеке, и тестирую работоспособность в Quik-Junior и у меня почему-то проблемы с получением информации по портфелю. Размер денежных средств на счету и Размер денежных средств на начало торговой сессии равны нулю, а на запрос информации о бирже (_portfolio.Exchange) он ничего не выводит. Это происходит из-за того, что счет виртуальный? или по какой-то другой причине?

Если ММВБ - проблема известна, сейчас как раз ей занимаюсь, надеюсь что в 3.2.3 будет фикс. Да, работаю на ММВБ

Stanislav121
Stanislav121

Не очень понятно, что дает использование класса Strategy/ разве нельзя написать нормальню логику без него?

Alexander
Alexander

Stanislav121: Не очень понятно, что дает использование класса Strategy/ разве нельзя написать нормальню логику без него?

Как будете описывать логику 10 стратегий без класса Strategy? Цикличность стратегии будете ручками делать? :)

vader
vader

есть ли возможность отличить исполненную завяку от снятой? Потому что status == done может означать как исполнение так и снятие заявки.

Alexander
Alexander

vader: есть ли возможность отличить исполненную завяку от снятой? Потому что status == done может означать как исполнение так и снятие заявки.

IsMatched \ IsCanceled

vader
vader

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

esper
esper

vader: Как получить все свои заявки? Посмотрел в QuikTrader , Portfolio не нашел ничего, что пригодилсь бы для этого.

QuikTrader.Orders🤨

Maxim K.
Maxim K.

Нужно еще вроде StockSharp.Algo подцепить чтобы видно было.

vader
vader

esper, извините, не туда посмотрел. QuikTrader.Orders - я думал там сделки всех пользователей.

vader
vader

такую вещь заметил. Если сделать RegisterOrder(order) и сразу вывести MessageBox.Show(order.Time.ToString()); то время регистрации заявки на бирже будет нулевой датой. С чем это связано и как это можно обойти?

Alexander
Alexander

vader: такую вещь заметил. Если сделать RegisterOrder(order) и сразу вывести MessageBox.Show(order.Time.ToString()); то время регистрации заявки на бирже будет нулевой датой. С чем это связано и как это можно обойти?

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

vader
vader

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

vader
vader

Как получить лимит на РТС ,а то по запросу _portfolio.CurrentAmount.Value выдает Тек. чист. поз.

Alexander
Alexander

vader: Как получить лимит на РТС ,а то по запросу _portfolio.CurrentAmount.Value выдает Тек. чист. поз.

BeginAmount

vader
vader

Alexander:

vader: Как получить лимит на РТС ,а то по запросу _portfolio.CurrentAmount.Value выдает Тек. чист. поз.

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

Alexander
Alexander

vader:

Alexander:

vader: Как получить лимит на РТС ,а то по запросу _portfolio.CurrentAmount.Value выдает Тек. чист. поз.

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

Он выдаёт не предыд. лимит откр. поз. а лимит откр. поз. Я это изменял в версии 3.2.2 Это как раз то о чём вы спрашивали в первом сообщении.

Если всё же надо план. чист. поз. - выводите как дополнительный столбец и получайте через ExtensionInfo

vader
vader

Где можно посмотреть, какие исключения могут кидать методы StockSharp?

Yura
Yura

Можно ли изменить источник маркет-данных для гидры?чтоб из базы данных например брала значения и преобразовывала в стокшарп формат

Yura
Yura

либо как мне использовать исторические данные с 2006 года например? =(Ответьте прошу я в тупике((

Yura
Yura

Yura: либо как мне использовать исторические данные с 2006 года например? если они в txt формате с сайта биржи скачаны =(

Mikhail Sukhov
Mikhail Sukhov

Yura: либо как мне использовать исторические данные с 2006 года например? =(Ответьте прошу я в тупике((

Гидра качает с 2003-го

Yura
Yura

Mikhail Sukhov:

Yura: либо как мне использовать исторические данные с 2006 года например? =(Ответьте прошу я в тупике((

Гидра качает с 2003-гобуду разбираться

Yura
Yura

у меня есть текстовый документ с историей торгов на украинской бирже..как мне сделать так чтоб гидра обращалась к этому файлу? нужно создать свой источник, мне немного не понятен пример с созданием источника РТС..помогите, либо направьте на путь истинный😭

Yura
Yura

Yura: у меня есть текстовый документ с историей торгов на украинской бирже..как мне сделать так чтоб гидра обращалась к этому файлу? нужно создать свой источник, мне немного не понятен пример с созданием источника РТС..помогите, либо направьте на путь истинный😭 я правильно понимаю? чтоб тестировать на истории нужно создать свой источник? У вас есть пример как создать источник для ртс..но мне не понятно, где в примере путь к файлу с историей? в каком формате должен быть этот файл? прошу направьте на путь..

Yura
Yura

хэлп, я в тупике...

Mikhail Sukhov
Mikhail Sukhov

Yura: хэлп, я в тупике...

Вся Гидра в исходниках. Чем еще помочь - ума не приложу.

Yura
Yura

Путь к файлу нашел.. это public string FolderPath { get; set; } 😀 буду разбираться дальше

Maxim K.
Maxim K.

Столкнулся с непонятной проблемой: при запуске проекта в режиме отладки (Visual Studio 2010 Ultimate), всё работает нормально. При запуске без отладке в коде trader.connect() вылетает исключение - "главное окно QUIK не было найдено Имя параметра wnd". В чем может быть проблема ?

upd: Если в свойства->отладка снять галочку "Включить ведущий процесс Visual Studio", то при отладке тоже вылетает ...

Mikhail Sukhov
Mikhail Sukhov

Maxim K.: Столкнулся с непонятной проблемой: при запуске проекта в режиме отладки (Visual Studio 2010 Ultimate), всё работает нормально. При запуске без отладке в коде trader.connect() вылетает исключение - "главное окно QUIK не было найдено Имя параметра wnd". В чем может быть проблема ?

upd: Если в свойства->отладка снять галочку "Включить ведущий процесс Visual Studio", то при отладке тоже вылетает ...

Студия наверное из под администраторских привилегий запускается?

Maxim K.
Maxim K.

Всё запускается из-под администраторских привилегий, на компьютере только один пользователь, он же администратор... Такое ощущение, что по каким-то непонятным причинам всё, что есть в stocksharp.Quik не работает, ни QuikTerminal не находит ничего, ни Trader не конектится ... Хотя при присоединенном ведущем процессе программа спойкойно находит и работает с тем же самым QUIK'ом...

Mikhail Sukhov
Mikhail Sukhov

Maxim K.: Всё запускается из-под администраторских привилегий, на компьютере только один пользователь, он же администратор...

То, что один пользователь еще не значит, что запуск идет под одинаковыми правами.

Maxim K.
Maxim K.

Только что попробовал запустить всё с администраторскими правами - Quik, Visual Studio. Всё равно то же самое. Пробовал запускать exe-файл из bin\Debug и из bin\Release с администраторскими правами - всё равно та же ошибка - "главное окно QUIK не было найдено Имя параметра - wnd "...

Mikhail Sukhov
Mikhail Sukhov

Maxim K.: Только что попробовал запустить всё с администраторскими правами - Quik, Visual Studio. Всё равно то же самое. Пробовал запускать exe-файл из bin\Debug и из bin\Release с администраторскими правами - всё равно та же ошибка - "главное окно QUIK не было найдено Имя параметра - wnd "...

Уточню. Под отладкой работает. Если просто запускать из студии без отладки - не работает?

Maxim K.
Maxim K.

Не просто под отладкой, а именно если включен ведущий процесс Visual Studio в настройках проекта->отладка, всё работает на отлично. Если запускать в студии без отладки или просто exe-файл, то вылетает ошибка, QUIK не находится ...

Mikhail Sukhov
Mikhail Sukhov

Maxim K.: Не просто под отладкой, а именно если включен ведущий процесс Visual Studio в настройках проекта->отладка, всё работает на отлично. Если запускать в студии без отладки или просто exe-файл, то вылетает ошибка, QUIK не находится ...

Я не знаю что такое ведуший процесс. Поиск окна Квик происходит через Process.GetProcesses(). Если из этой программы обратиться к этому методу, то будет ли найден процесс Квика среди возвращенных? Если нет, то какая-то неправильная настройка с привилегиями.

Maxim K.
Maxim K.

Mikhail Sukhov: Я не знаю что такое ведуший процесс. Поиск окна Квик происходит через Process.GetProcesses(). Если из этой программы обратиться к этому методу, то будет ли найден процесс Квика среди возвращенных? Если нет, то какая-то неправильная настройка с привилегиями. Да, процесс QUIK находится.


            Process[] p = Process.GetProcesses();
            if (p.FirstOrDefault(pp => pp.Id == 3920) != null)
            {
                MessageBox.Show(p.FirstOrDefault(pp => pp.Id == 3920).MainModule.FileName);
            }


При запуске с отладкой и без вылетает месажбокс с путем к info.exe.

Mikhail Sukhov
Mikhail Sukhov

Maxim K.: При запуске с отладкой и без вылетает месажбокс с путем к info.exe.

QuikTerminal.QuikProcesses выводит что-нибудь или ошибка?

Maxim K.
Maxim K.

Mikhail Sukhov:

Maxim K.: При запуске с отладкой и без вылетает месажбокс с путем к info.exe.

QuikTerminal.QuikProcesses выводит что-нибудь или ошибка? У меня такого нет. В документации тоже не нашел ничего про > QuikTerminal.QuikProcesses

VsevolodG
VsevolodG

Добрый день.

Столкнулся с проблемой отмены заявок. Использую код:

this.Trader.CancelOrders(null, null, null, null, _security);

Получаю ошибку:

Транзакции 'CLASSCODE=SPBFUT; SECCODE=RIU1; TRANS_ID=46506221; ACTION=KILL_STOP_ORDER; STOP_ORDER_KEY=14050471;' не была зарегистрирована. Причина 'Не удается снять стоп-заявку N 14050471'

Дело в том, что заявка с номером 14050471 уже давно имеет статус в Quik "Снята". В результате ошибки программа не снимает никакие заявки.

Версия Stock#: 3.2

Alexander
Alexander

Добрый день.

Столкнулся с проблемой отмены заявок. Использую код:

this.Trader.CancelOrders(null, null, null, null, _security);

Получаю ошибку:

Транзакции 'CLASSCODE=SPBFUT; SECCODE=RIU1; TRANS_ID=46506221; ACTION=KILL_STOP_ORDER; STOP_ORDER_KEY=14050471;' не была зарегистрирована. Причина 'Не удается снять стоп-заявку N 14050471'

Дело в том, что заявка с номером 14050471 уже давно имеет статус в Quik "Снята". В результате ошибки программа не снимает никакие заявки.

Версия Stock#: 3.2

Если версия библиотеки отлична от 3.2.5 - пробуйте 3.2.5 Вносилось много изменений на протяжении каждой версии, точнее указывайте версию.

Maxim K.
Maxim K.

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

Версия s# 3.2.4 Версия QUIK 5.20.0.76

Maxim K.
Maxim K.

Разобрался с проблемой - всё было из-за того, что мой проект носил название Info, соответственно исполняемый файл назывался info.exe, как у QUIK. При запуске с отладкой исполняемый файл назывался info.vshost.exe, QUIK находился нормально. Если переименовать исполняемый файл в, например, info1.exe, то всё работает.

Pavel-NS
Pavel-NS

Подскажите, какую функциональность выполняет метод Ecng.Collections.CollectionHelper.SyncGet ? В частности, он присутствует в приведённом вами примере событийной стратегии, однако, в хелпе про это пространство имён нет ни слова. Где можно посмотреть описание?

Alexander
Alexander

Pavel-NS: Подскажите, какую функциональность выполняет метод Ecng.Collections.CollectionHelper.SyncGet ? В частности, он присутствует в приведённом вами примере событийной стратегии, однако, в хелпе про это пространство имён нет ни слова. Где можно посмотреть описание?

Блокирует коллекцию для изменения и запускает передаваемую функцию над коллекцией.

Pavel-NS
Pavel-NS

Alexander: Блокирует коллекцию для изменения и запускает передаваемую функцию над коллекцией.

Спасибо за ответ. А есть ли где более полная документация, чем chm-файл?? Не нашёл какой-либо информации по "ecng" пространству имён ни в доках, а также при просмотре из студии нет никаких комментариев.

Alexander
Alexander

Pavel-NS:

Alexander: Блокирует коллекцию для изменения и запускает передаваемую функцию над коллекцией.

Спасибо за ответ. А есть ли где более полная документация, чем chm-файл?? Не нашёл какой-либо информации по "ecng" пространству имён ни в доках, а также при просмотре из студии нет никаких комментариев.

Ecng никак не комментирован пока, да. Полнее чем в chm в любом случае нет - это полная дока которая строится по комментариям.

vader
vader

Подскажите ,пожалуйста. Пытаюсь создать событийную стратегию и почему-то не происходит действия, активизирующееся при наступлении условия. Условие добавляется в список правил. Пробовал разные условия, результат нулевой. Результат проверки Verifir – все в порядке. версия библиотеки - 3.2.5


public class ConservativeRegime : Strategy
	{
		public ConservativeRegime(bool bBuy, decimal priceOfOrder, decimal dPrice, int division)
			: base()
		{
			_bBuy = bBuy;
			_priceOfOrder = priceOfOrder;
			_dPrice = dPrice;
			_division = division;
			
			_order = new Order
			{
				Portfolio = this.Portfolio,
				Volume =  this.Volume,
				Price = _priceOfOrder,
				Security = this.Security,
				Direction =  OrderDirections.Buy,
			};
			
			
		}
		
				
		protected override void OnRunning()
		{
			StrategyRule strR =  this
				.When(this.Security.BestAskPriceLess(_priceOfOrder))
				.Do(SimpleRegOrd);
			
			base.OnRunning();
			
			foreach(StrategyRule r in this.Rules){
				MessageBox.Show(r.ToString());
			}
		}
		
		private void SimpleRegOrd()
		{
			MessageBox.Show("SimpleRegOrd");
			this.RegisterOrder(_order);
		}


		private bool _bBuy;
		private decimal _priceOfOrder;
		private decimal _dPrice;
		private int _division;
		
		private Order _order;
	}

Alexander
Alexander

vader: Подскажите ,пожалуйста. Пытаюсь создать событийную стратегию и почему-то не происходит действия, активизирующееся при наступлении условия. Условие добавляется в список правил. Пробовал разные условия, результат нулевой. Результат проверки Verifir – все в порядке. версия библиотеки - 3.2.5

public class ConservativeRegime : Strategy { public ConservativeRegime(bool bBuy, decimal priceOfOrder, decimal dPrice, int division) : base() { _bBuy = bBuy; _priceOfOrder = priceOfOrder; _dPrice = dPrice; _division = division;

		_order = new Order
		{
			Portfolio = this.Portfolio,
			Volume =  this.Volume,
			Price = _priceOfOrder,
			Security = this.Security,
			Direction =  OrderDirections.Buy,
		};
		
		
	}
	
			
	protected override void OnRunning()
	{
		StrategyRule strR =  this
			.When(this.Security.BestAskPriceLess(_priceOfOrder))
			.Do(SimpleRegOrd);
		
		base.OnRunning();
		
		foreach(StrategyRule r in this.Rules){
			MessageBox.Show(r.ToString());
		}
	}
	
	private void SimpleRegOrd()
	{
		MessageBox.Show("SimpleRegOrd");
		this.RegisterOrder(_order);
	}


	private bool _bBuy;
	private decimal _priceOfOrder;
	private decimal _dPrice;
	private int _division;
	
	private Order _order;
}

Запускаете экспорт стакана?
vader
vader

Да, запускаю. Я вставил такой код, чтобы убедится что стратегия получает данные.


protected override void OnRunning()
		{
			...			
			base.OnRunning();
			
			MessageBox.Show(Security.BestAsk.Price.ToString());
			...

	         }

Alexander
Alexander

vader: Да, запускаю. Я вставил такой код, чтобы убедится что стратегия получает данные.

protected override void OnRunning() { ... base.OnRunning();

		MessageBox.Show(Security.BestAsk.Price.ToString());
		...

         }

Поля Security, Portfolio в конструкторе не проинициализированны.
Вы их должны устанавливать уже после вызова конструктора. Значит у заявки в конструкторе этих данных нет - можете проверить в OnRunning и заодно переместить создание заявки туда.
vader
vader

я инициалезирую эти поля так


_consStrategy = new ConservativeRegime( _bBuy, _priceOfOrder, _dPrice, _division)
					{
						Volume = _nLot,
						Security = _security,
						Portfolio = _portfolio,
					};

Я сделал проверку, все на месте


protected override void OnRunning()
		{
			StrategyRule strR =  this
				.When(this.Security.BestAskPriceLess(_priceOfOrder))
				.Do(SimpleRegOrd);
			
			base.OnRunning();
			
			MessageBox.Show("Security= " + this.Security.ToString());
			MessageBox.Show("Portfolio= " + this.Portfolio.ToString());
			
			foreach(StrategyRule r in this.Rules){
				MessageBox.Show(r.ToString());
			}
		}

Ведь вопрос не в том ,что он заявку не создает,а в том, что он нужный метод (SimpleRegOrd) не вызывает.

Alexander
Alexander

vader: я инициалезирую эти поля так

_consStrategy = new ConservativeRegime( _bBuy, _priceOfOrder, _dPrice, _division) ;

> Я сделал проверку, все на месте
> ```csharp

protected override void OnRunning()
		{
			StrategyRule strR =  this
				.When(this.Security.BestAskPriceLess(_priceOfOrder))
				.Do(SimpleRegOrd);
			
			base.OnRunning();
			
			MessageBox.Show("Security= " + this.Security.ToString());
			MessageBox.Show("Portfolio= " + this.Portfolio.ToString());
			
			foreach(StrategyRule r in this.Rules){
				MessageBox.Show(r.ToString());
			}
		}

Ведь вопрос не в том ,что он заявку не создает,а в том, что он нужный метод (SimpleRegOrd) не вызывает.

Вначале вызывается конструктор, потом происходит инициализация полей. Когда вы создаёте заявку - у вас там используется:

Portfolio = this.Portfolio,
Security = this.Security,

Оба этих поля = null.

Не верите - распечатайте

			MessageBox.Show("Security= " + _order.Security.ToString());
			MessageBox.Show("Portfolio= " + _order.Portfolio.ToString());

:)

Необходимо вначале это исправить.

vader
vader

перенес создание заявки в OnRunning Все равно ничего не происходит.


protected override void OnRunning()
		{
			_order = new Order
			{
				Portfolio = this.Portfolio,
				Volume =  this.Volume,
				Price = _priceOfOrder,
				Security = this.Security,
				Direction =  OrderDirections.Buy,
			};
			
			StrategyRule strR =  this
				.When(this.Security.BestAskPriceLess(_priceOfOrder))
				.Do(SimpleRegOrd);
			
			base.OnRunning();
			
			MessageBox.Show("Security= " + this.Security.ToString());
			MessageBox.Show("Portfolio= " + this.Portfolio.ToString());
			
			foreach(StrategyRule r in this.Rules){
				MessageBox.Show(r.ToString());
			}
		}

Alexander
Alexander

Чему равно _priceOfOrder, как изменяется Security.BestAsk.Price?

vader
vader

_priceOfOrder - ввожу вручную, сталю такой, чтобы скорее испольнилось условие. Как пример. Если лучшая продажа 198645, то ставлю 198630.

Security.BestAsk.Price не использую сейчас. Я выводил это ,чтобы убедится, что стратегия получает данные.

Alexander
Alexander

vader: _priceOfOrder - ввожу вручную, сталю такой, чтобы скорее испольнилось условие. Как пример. Если лучшая продажа 198645, то ставлю 198630.

Security.BestAsk.Price не использую сейчас. Я выводил это ,чтобы убедится, что стратегия получает данные.

Вроде нашёл багу. Вообще надо передавать не цену, а сдвиг цены - в % или в пунктах.

Поправлю документацию и код.

vader
vader

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

Alexander
Alexander

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

напишите, к примеру, When(Security.SecurityNewTrades()).Do(blabla)

То что выше - я уже написал - была ошибка, исправляю.

vader
vader

попробовал вот так - не работает


StrategyRule strR =  this
				.When(StrategyRuleConditionHelper.BestAskPriceLess(this.Security, new Unit(5)))
				.Do(SimpleRegOrd);
			
			base.OnRunning();

И ещё. Мне удалось вызвать метод, в котором должна происходить регистрация заявки ,но заявка в квике не появилась.


private void SimpleRegOrd()
		{
			MessageBox.Show("SimpleRegOrd");
			this.RegisterOrder(_order);
		}

И так тоже не работает


StrategyRule strR =  this
				.When(Security.SecurityNewTrades())
				.Do(SimpleRegOrd);
			
			base.OnRunning();

Alexander
Alexander

vader: попробовал вот так - не работает

StrategyRule strR = this .When(StrategyRuleConditionHelper.BestAskPriceLess(this.Security, new Unit(5))) .Do(SimpleRegOrd);

		base.OnRunning();
> И ещё. Мне удалось вызвать метод, в котором должна происходить регистрация заявки ,но заявка в квике не появилась.
> ```csharp

private void SimpleRegOrd()
		{
			MessageBox.Show("SimpleRegOrd");
			this.RegisterOrder(_order);
		}

И так тоже не работает

StrategyRule strR = this .When(Security.SecurityNewTrades()) .Do(SimpleRegOrd);

		base.OnRunning();


Первое не работает я уже написал почему - бага найдена, исправил, будет в 3.2.6
Второе - выведите все поля заявки перед регистрацией чтоб было понятно где проблема. Заявки у остальных регистрируется нормально.
Третье - что значит тоже не работает? SimpleRegOrd вызывается? Новые сделки по инструменту приходят?

ProcessDataError что-нибудь выдаёт?
vader
vader

спасибо за советы. Проблема была в том, что я не инициалезировал Trader, ни у стратегии ни у заявки. ProcessDataError ничего не выдавал.

Заметил такую проблему, что часто если при работе стратегии произошла проограмная ошибка, то простостртегия останавливается и никак не сигналезирует об ошибке. Что очень не удобно. Можно ли как-то сделать ,чтобы визуально были видны ошибки?

Alexander
Alexander

vader: спасибо за советы. Проблема была в том, что я не инициалезировал Trader, ни у стратегии ни у заявки. ProcessDataError ничего не выдавал.

Заметил такую проблему, что часто если при работе стратегии произошла проограмная ошибка, то простостртегия останавливается и никак не сигналезирует об ошибке. Что очень не удобно. Можно ли как-то сделать ,чтобы визуально были видны ошибки?

Перехватывайте ProcessDataError и исключения.

vader
vader

ProcessDataError молчит. В каких местах перехватывать исключения?

Alexander
Alexander

vader: ProcessDataError молчит. В каких местах перехватывать исключения?

При вызове методов Stock#

vader
vader

При тестировании на учебном счете Quik-Junior, на площадке ММВБ, не выполняется условие на появление новых сделок (StrategyNewMyTrades), когда происходит сделка. При этом если работать на игровой секции FORTS, все условия выполняются. ProcessDataError ничего не выдает. Как это можно поправить? S# 3.2.5

Roman0
Roman0

Подскажите, пожалуйста, можно ли динамически задавать название таблицы в [DdeCustomTable("вот это название")] (пример)? Вроде бы нельзя, т.к. по поводу атрибутов много ограничений, но может быть все-таки как-то можно? Смысл в том, чтобы брать исторические данные из соответствующей таблицы, название которой состоит из инструмента и таймфрейма и таким образом контролировать то, что получает программа. Наверное можно это все выводить в саму таблицу, но в таком случае как-то не очень рационально получается. Спасибо.

Alex Ander
Alex Ander

Roman0: Подскажите, пожалуйста, можно ли динамически задавать название таблицы в [DdeCustomTable("вот это название")] (пример)? Вроде бы нельзя, т.к. по поводу атрибутов много ограничений, но может быть все-таки как-то можно? Смысл в том, чтобы брать исторические данные из соответствующей таблицы, название которой состоит из инструмента и таймфрейма и таким образом контролировать то, что получает программа. Наверное можно это все выводить в саму таблицу, но в таком случае как-то не очень рационально получается. Спасибо.

Я убрал этот атрибут и задаю название таблицы в конструкторе.

                
DdeCustomTable _tableRI = new DdeCustomTable(typeof(QuikCandle), "RIU1 1H");
DdeCustomTable _tableGZ = new DdeCustomTable(typeof(QuikCandle), "GZU1 1H");

В таблицу и класс QuikCandle добавил еще одну колонку с названием инструмента.

Roman0
Roman0

Alex Ander:

Roman0: Подскажите, пожалуйста, можно ли динамически задавать название таблицы в [DdeCustomTable("вот это название")] (пример)? Вроде бы нельзя, т.к. по поводу атрибутов много ограничений, но может быть все-таки как-то можно? Смысл в том, чтобы брать исторические данные из соответствующей таблицы, название которой состоит из инструмента и таймфрейма и таким образом контролировать то, что получает программа. Наверное можно это все выводить в саму таблицу, но в таком случае как-то не очень рационально получается. Спасибо.

Я убрал этот атрибут и задаю название таблицы в конструкторе.

DdeCustomTable _tableRI = new DdeCustomTable(typeof(QuikCandle), "RIU1 1H"); DdeCustomTable _tableGZ = new DdeCustomTable(typeof(QuikCandle), "GZU1 1H");

> 
> В таблицу и класс QuikCandle добавил еще одну колонку с названием инструмента.
Большое спасибо! На конструкторы даже не посмотрел... 🙂 
Maxim K.
Maxim K.

Теоретически вроде можно с помощью рефлекции что-нибудь такое замутить, но на практике - я думаю врядли стоит тратить на это время - придется MSIL курить, а он не так бодр как c#. Хотя если набор колонок у вас всегда постоянный, а меняется только название таблицы, то наверное будет проще намного.

Roman0
freelancer
freelancer

А как узнать текущую сумму на ФОРТС ? С учетом вариационной маржи ?

SelectedPortfolio.ExtensionInfo[DdeDerivativePortfolioColumns.CurrentLimitPositionsPrice] вызывает исключение (ключ не найден)

Mikhail Sukhov
Mikhail Sukhov

freelancer: А как узнать текущую сумму на ФОРТС ? С учетом вариационной маржи ?

SelectedPortfolio.ExtensionInfo[DdeDerivativePortfolioColumns.CurrentLimitPositionsPrice] вызывает исключение (ключ не найден)

http://stocksharp.com/doc/html/4261879e-9bb3-482c-9fc5-27ecb07bdf5e.htm

Teddy
Teddy

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

namespace SampleDdeCustomTable
{
    using System;
    using System.ComponentModel;
    using Ecng.Common;
    using Ecng.Serialization;

    using StockSharp.Quik;

    [DdeCustomTable("BOT2")]
    public class BOT2 : INotifyPropertyChanged
    {
        public BOT2() { }
        private string _instrument;
        [DdeCustomColumn("Инструмент", Order = 0)]       
        public string instrument
        {
            get { return _instrument; }
            set { _instrument = value; NotifyPropertyChanged("Инструмент"); }
        }
        private decimal _High;
        [DdeCustomColumn("High", Order = 1)]
        [Identity]
        public decimal High 
        {
            get { return _High; }
            set{_High=value;NotifyPropertyChanged("High");}
        }
        private decimal _Low;
        [DdeCustomColumn("Low", Order = 2)]        
        public decimal Low
        {
            get { return _Low; }
            set { _Low = value; NotifyPropertyChanged("Low"); }
        }
        private decimal _SMA;
        [DdeCustomColumn("SMA", Order = 3)]        
        public decimal SMA 
        {
            get { return _SMA; }
            set { _SMA = value; NotifyPropertyChanged("SMA"); }
        }


        private PropertyChangedEventHandler _propertyChanged;

        event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged
        {
            add { _propertyChanged += value; }
            remove { _propertyChanged -= value; }
        }

        private void NotifyPropertyChanged(string info)
        {
            if (_propertyChanged != null)
                _propertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
}
Mikhail Sukhov
Mikhail Sukhov

Teddy: вопрос по выводу данных через произвольную таблицу quik/ делал как в примере данные выходят. но нужно чтобы строка просто обновлялась а не добавлялась новая. написано что нужно добавить IdentityAttribute. добавлял но всё так же.

Судя по структуре данных там вряд ли можно выделить что-то уникальное.

Teddy: и как собственно обратиться к выводимым столбцам таблицы из кода своей стратегии. примеров на форуме не нашёл,если можно примеры кода.

Как к обычным свойствам.

freelancer
freelancer

У меня сейчас так:

_trader.DerivativePortfoliosTable.Columns.Add(DdeDerivativePortfolioColumns.CurrentLimitPositionsPrice); Не добавляется, говорит что уже есть.

portfoliosComboBox.SelectedPortfolio.ExtensionInfo[DdeDerivativePortfolioColumns.CurrentLimitPositionsPrice] Нет такого ключа.

Как правильно получить лимит отк. поз. ?

Mikhail Sukhov
Mikhail Sukhov

freelancer: У меня сейчас так:

_trader.DerivativePortfoliosTable.Columns.Add(DdeDerivativePortfolioColumns.CurrentLimitPositionsPrice); Не добавляется, говорит что уже есть.

portfoliosComboBox.SelectedPortfolio.ExtensionInfo[DdeDerivativePortfolioColumns.CurrentLimitPositionsPrice] Нет такого ключа.

Как правильно получить лимит отк. поз. ?

Portfolio.BeginAmount

vader
vader

Событие стратегии NewMyTrades происходит один раз. Почему?


this.NewMyTrades += mytrades => {
				MessageBox.Show("Event");
				MyTrades.PushRange(mytrades.ToArray());
			};

Mikhail Sukhov
Mikhail Sukhov

vader: Событие стратегии NewMyTrades происходит один раз. Почему?

this.NewMyTrades += mytrades => { MessageBox.Show("Event"); MyTrades.PushRange(mytrades.ToArray()); };


Запустил пример Sample. Событие вызывается всегда, когда происходит сделка.
vader
vader

Mikhail Sukhov:

vader: Событие стратегии NewMyTrades происходит один раз. Почему?

this.NewMyTrades += mytrades => { MessageBox.Show("Event"); MyTrades.PushRange(mytrades.ToArray()); };

> 
> Запустил пример Sample. Событие вызывается всегда, когда происходит сделка.
Какие средства диагностироания посоветуете?
Mikhail Sukhov
Mikhail Sukhov

vader:

Mikhail Sukhov: Запустил пример Sample. Событие вызывается всегда, когда происходит сделка. Какие средства диагностироания посоветуете?

Пример Sample работает?

freelancer
freelancer

OK. Спасибо. Желательно, что бы подсказка свойства была как название колонки

Mikhail Sukhov
Mikhail Sukhov

freelancer: OK. Спасибо. Желательно, что бы подсказка свойства была как название колонки

Это невозможно, потому что Portfolio не зависящий от Квика тип данных. Он и в Смарте используется и в Плазе.

vader
vader

Да, работает.

Mikhail Sukhov
Mikhail Sukhov

vader: Да, работает.

Ну значит ошибка в вашем боте. Попробуйте ProcessDataError послушать.

vader
vader

ProcessDataError молчит. что ещё можно сделать?

Mikhail Sukhov
Mikhail Sukhov

vader: ProcessDataError молчит. что ещё можно сделать?

Искать через Visual Studio Debugger. Ошибка не системная судя по всему, а в логике.

vader
vader

как логика может влиять на то, происходит событие NewMyTrades или нет? тем более ,что список заявок нормально заплняется.

l-way
l-way

Добрый день

Помогите разобраться со следующими вопросами:

  1. Что вернет Security.GetMarketPrice(OrderDirection.Sell, new Unit(1000), MarketPriceTypes.Opposite); в случае, если а) достигли нижнего лимита цены и в стакане нет бидов; б) до достижения нижнего лимита остается < 1000 пунктов.

  2. Чему равно Security.BestBid в случае а) из первого вопроса.

Спасибо.

Mikhail Sukhov
Mikhail Sukhov

l-way: Добрый день

Помогите разобраться со следующими вопросами:

  1. Что вернет Security.GetMarketPrice(OrderDirection.Sell, new Unit(1000), MarketPriceTypes.Opposite); в случае, если а) достигли нижнего лимита цены и в стакане нет бидов; б) до достижения нижнего лимита остается < 1000 пунктов.

а) 0 б) все котировки в стакане не учитываются, только лучшая пара.

Teddy
Teddy

подскажите как нужно задавать время работы стратегии.

hobo
hobo

Teddy: подскажите как нужно задавать время работы стратегии. Попробуйте if-ом🙄

Teddy
Teddy

hobo:

Teddy: подскажите как нужно задавать время работы стратегии. Попробуйте if-ом🙄 что им это понятно. а что с чем сранивать ? кусочек кода для понимая можно?

hobo
hobo

Teddy: кусочек кода для понимая можно? В стратегии не выставлять ордера раньше 14.00

if (base.Trader.MarketTime.Hour > 13)
{
  var order = CreateOrder(...);
  ...
}

Если нужно время в немосковском часовом поясе, то гляньте тут

  • TraderHelper.IsTradeTime(Security.Exchange.WorkingTime, Trader.MarketTime) для проверки является ли текущее время торгуемым (началась ли сессия, не закончилась ли, нет ти клиринга).
freelancer
freelancer

У меня 15-ти минутки. Событийная модель:

this.
When(StrategyRuleConditionHelper.NewCandles(_candleManager.Tokens.ElementAt(0))).
Do(new Action(action));

Но:

_candleManager.GetTimeFrameCandle(Security, _timeFrame, _сandleBounds.Max - _timeFrame).Time + _timeFrame - Trader.MarketTime = 14.59

Хотя должно быть = 0 где-то.

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

Mikhail Sukhov
Mikhail Sukhov

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

Я не понял вопроса.

freelancer
freelancer

Mikhail Sukhov:

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

Я не понял вопроса.

При наступлении события NewCandles выражение _candleManager.GetTimeFrameCandle(Security, _timeFrame, _сandleBounds.Max - _timeFrame) должно получать сформированную свечку (прошлую то есть), но иногда (!) получает текущую незакрытую. То есть иногда _candleManager.GetTimeFrameCandle(Security, _timeFrame, _сandleBounds.Max - _timeFrame).Time ≈ Trader.MarketTime

Mikhail Sukhov
Mikhail Sukhov

freelancer: При наступлении события NewCandles выражение _candleManager.GetTimeFrameCandle(Security, _timeFrame, _сandleBounds.Max - _timeFrame) должно получать сформированную свечку (прошлую то есть), но иногда (!) получает текущую незакрытую. То есть иногда _candleManager.GetTimeFrameCandle(Security, _timeFrame, _сandleBounds.Max - _timeFrame).Time ≈ Trader.MarketTime

Свечки строятся по сделкам, которые текут с запозданием. Так что может и не закрывшую выдать. Смотрите на событие CandlesFinished.

Church
Church

Подскажите, поддерживает ли EmulationTrader стоп-ордера? При попытке зарегистрировать ордер получаю NotImplementedException в StockSharp.BusinessEntities.dll!StockSharp.BusinessEntities.StopCondition.TryActivate(StockSharp.BusinessEntities.MarketDepth depth) + 0x37 bytes

Создаю ордер так:

private Order CreateStopLimit(OrderDirections Direct, decimal stopPrice, decimal ProtectiveSpread, int Vol)
        {
            return new Order
            {
                Type = OrderTypes.Conditional,
                Volume = Vol,
                Security = this.Security,
                Portfolio = this.Portfolio,
                Direction = Direct,
                StopCondition = new QuikStopCondition
                {
                    Type = QuikStopConditionTypes.StopLimit,
                    StopPrice = stopPrice,
                    Spread = ProtectiveSpread,
                },
            };
        }

Регистрировать пытался обоими методами из сэмплов. И так:

// регистрируем заявку (обычным способом - лимитированной заявкой)
this.RegisterOrder(_shortOrder);

И так:

// регистрируем заявку (через котирование)
var strategy = new MarketQuotingStrategy(_shortOrder, new Unit(), new Unit());
base.ChildStrategies.Add(strategy);

Оба выдают этот exception.

Mikhail Sukhov
Mikhail Sukhov

Church: Подскажите, поддерживает ли EmulationTrader стоп-ордера?

Нет

freelancer
freelancer

в 3.2.7 _strategy.PnLManager.PnL внезапно стало равно сумме цен сделок входа в позицию. Раньше было нормально

Alexander
Alexander

freelancer: в 3.2.7 _strategy.PnLManager.PnL внезапно стало равно сумме цен сделок входа в позицию. Раньше было нормально

А в 3.2.9?

Alexander
Alexander

Может стакан не запущен? => не может получить рыночную котировку => считает её равной 0 => получаем сумму цен сделок входа.

freelancer
freelancer

Alexander: Может стакан не запущен? => не может получить рыночную котировку => считает её равной 0 => получаем сумму цен сделок входа. Так и есть, не запущен

Alexander
Alexander

freelancer:

Alexander: Может стакан не запущен? => не может получить рыночную котировку => считает её равной 0 => получаем сумму цен сделок входа. Так и есть, не запущен

Запустите :)

Church
Church

Проблемка с PositionManager. Прочел все темы на этот счет, но вопрос остался.

A$ 22.08.2011 16:27:38.447 Стратегия запущена. A$ 22.08.2011 16:27:38.457 Processing history... (this might take some time). A$ 22.08.2011 16:27:50.163 History is processed. A$ 22.08.2011 16:27:50.165 Beginning core cycle. A$ 22.08.2011 16:30:59.424 [>>>TRADE<<<] ENTER LONG... A$ 22.08.2011 16:30:59.437 [MQS] Стратегия запущена. A$ 22.08.2011 16:31:00.884 [MQS] Регистрация новой заявки на Buy с ценой 157250 и объемом 1. A$ 22.08.2011 16:31:01.506 [MQS] Заявка 59245330 на Buy отправлена с ценой 157250 объемом 1. A$ 22.08.2011 16:31:01.509 [MQS] Новая Limit заявка 59245330 на Buy с номером 4762410563. A$ 22.08.2011 16:31:01.512 Новая Limit заявка 59245330 на Buy с номером 4762410563. A$ 22.08.2011 16:31:01.979 [MQS] Позиция изменилась на 1. A$ 22.08.2011 16:31:01.980 [MQS] Заканчиваем котирование с неисполненным объемом равный 0. A$ 22.08.2011 16:31:01.983 [MQS] Заканчиваем котирование с неисполненным объемом равный 0. A$ 22.08.2011 16:31:01.986 [MQS] Стратегия останавливается. A$ 22.08.2011 16:31:01.987 [MQS] Заканчиваем котирование с неисполненным объемом равный 0. A$ 22.08.2011 16:31:01.988 [MQS] Заканчиваем котирование с неисполненным объемом равный 0. A$ 22.08.2011 16:31:01.990 [MQS] Стратегия остановлена. A$ 22.08.2011 16:31:02.003 Новая Buy сделка 379805505 на 1 заявки 59245330. A$ 22.08.2011 16:33:54.420 –––––––– [Status report] ––––––––– A$ 22.08.2011 16:33:54.433 | Current P/L = -210 A$ 22.08.2011 16:33:54.434 | Position = 0 // 0 A$ 22.08.2011 16:33:54.438 –––––––––– [End report] –––––––––– A$ 22.08.2011 16:34:14.382 Стратегия останавливается. A$ 22.08.2011 16:34:14.383 Стратегия остановлена.

В строку Position командой с консоли (через 3 секунды после остановки котировщика!) выводится позиция через this.PositionManager.Position // base.PositionManager.Position.

Результат: примерно 1 из 10 раз позиция не изменяется. В логе явно видно что QuotingStrategy сумела провести 1 бай, но позиция стратегии не изменилась.

Mikhail Sukhov
Mikhail Sukhov

Church: Результат: примерно 1 из 10 раз позиция не изменяется. В логе явно видно что QuotingStrategy сумела провести 1 бай, но позиция стратегии не изменилась.

Можете прислать минимальный код?

Church
Church

Mikhail Sukhov:

Church: Результат: примерно 1 из 10 раз позиция не изменяется. В логе явно видно что QuotingStrategy сумела провести 1 бай, но позиция стратегии не изменилась.

Можете прислать минимальный код?

Вот такие методы:

public void EnterViaQuoting(OrderDirections Direct)
{
    var strategy = new MarketQuotingStrategy(Direct, this.Volume)
    {
        PriceType = MarketPriceTypes.Opposite,
        PriceOffset = -_entrySlip,
    };
    base.ChildStrategies.Add(strategy);
}

Котирование используется для того, чтобы перестать пытаться зайти по рынку после определенного времени (с TimeOut - пока не получилось его подключить).

Mikhail Sukhov
Mikhail Sukhov

Church: Вот такие методы:

Здесь ни проверки позы, ни родительской стратегии, куда добавляется котирование. Как на таком проверять?

Пришлите минимально работающий код. Не функцию, не отрывок из функции. А именно работающий код, на котором можно это проверить.

Church
Church

Mikhail Sukhov:

Church: Вот такие методы:

Здесь ни проверки позы, ни родительской стратегии, куда добавляется котирование. Как на таком проверять?

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

Mikhail Sukhov
Mikhail Sukhov

Church: Хорошо, послал вам в личку весь проект.

Получил.

Church
Church

А еще, практически при каждом запуске котировщика получаются ошибки:


A$ 22.08.2011 16:47:45.809 [MQS] Стратегия запущена.
A$ 22.08.2011 16:47:45.883 [MQS] Регистрация новой заявки на Sell с ценой 156550 и объемом 1.
A$ 22.08.2011 16:47:46.807 [MQS] Заявка 60121828 на Sell отправлена с ценой 156550 объемом 1.
A$ 22.08.2011 16:47:46.809 [MQS] Заявка 60121828 не имеет состояния.
A$ 22.08.2011 16:47:46.810 [MQS] Заявка 60121828 не имеет состояния.
A$ 22.08.2011 16:47:46.812 [MQS] Заявка 60121828 не имеет состояния.
A$ 22.08.2011 16:47:46.815 [MQS] Заявка 60121828 не имеет состояния.
A$ 22.08.2011 16:47:46.817 [MQS] Заявка 60121828 не имеет состояния.
A$ 22.08.2011 16:47:47.199 [MQS] Котируемая заявка 60121828 исполнилась.
A$ 22.08.2011 16:47:47.200 [MQS] Регистрация новой заявки на Sell с ценой 156520 и объемом 1.
A$ 22.08.2011 16:47:48.898 [MQS] Заявка 60121829 на Sell отправлена с ценой 156520 объемом 1.
A$ 22.08.2011 16:47:48.899 [MQS] Новая Limit заявка 60121829 на Sell с номером 4762883422.
A$ 22.08.2011 16:47:48.899 Новая Limit заявка 60121829 на Sell с номером 4762883422.
A$ 22.08.2011 16:47:48.901 [MQS] Цена текущей 156520 и лучшей 156510.
A$ 22.08.2011 16:47:48.903 [MQS] Котирование заявки 60121829 на Sell с ценой 156520 объемом 1.
A$ 22.08.2011 16:47:51.522 [MQS] Заканчиваем котирование с неисполненным объемом равный 0.
A$ 22.08.2011 16:47:51.542 [MQS] System.ArgumentException: Транзакции 'ACTION=MOVE_ORDERS; TRANS_ID=60121830; CLASSCODE=SPBFUT; SECCODE=RIU1; MODE=0; FIRST_ORDER_NUMBER=4762883422; FIRST_ORDER_NEW_PRICE=156510; FIRST_ORDER_NEW_QUANTITY=1;' не была зарегистрирована. Причина 'Ошибка перестановки заявок. [FORTS] "Не найдена заявка для перестановки.".'.
Parameter name: transactionTxt
   at #=qRiY$QPJW_GcWl4TovRarJkPbf4ppv9xIchkEcMEHBzU=.#=qSxEA$emnAx3QyIPn2yCM91ypPYsC6KBskKUgxXvP1CQ=(String #=qNO1ermIfWrG6dI$oUYZimA==, OrderStatus& #=qE4jat_vDrzVPYl_Ppu6iiA==, UInt32& #=qi1CY7KZZg6ecB_rpBWuxRA==, Int64& #=qb$zRH_BdRoces20Fe447gA==, String& #=qtPEuDeVoYvRIkZG49QCeGg==)
   at StockSharp.Quik.QuikTrader.#=qWKihWhgMRklXQGRkeiBNtuVEwdQ4YPI12ZvT_jwFds8=(Order #=q3cpq7Usn3d1hLaOfCrw$Mg==, TransactionBuilder #=qWW3PytxIiGdL7NnSRqFd9Q==)
   at StockSharp.Quik.QuikTrader.OnReRegisterOrder(Order oldOrder, Order newOrder)
   at StockSharp.Algo.BaseTrader.ReRegisterOrder(Order oldOrder, Order newOrder)
   at StockSharp.Algo.Strategies.Strategy.ReRegisterOrder(Order oldOrder, Order newOrder)
   at StockSharp.Algo.Strategies.QuotingStrategy.#=qD1NOWCmddcJt7Z5o5DR0kg==()
   at StockSharp.Algo.Strategies.QuotingStrategy.#=qfTGDFZOzAQuz$oJ_UNB6fYa5baalVV3ic2Nfn_iclFU=.#=qy1SJPrtEmVhxEZHX5EDH4g==()
   at StockSharp.Algo.Strategies.StrategyRule.#=qOBi5CSZHig$JePmO_KI21CEQhj5ziVDpCSOsiQQ0sAI=.#=qpmhFPc0P9P8ObITuI86Kiw==(Object #=qPoMym7IqESgMzUnHZKR7gA==)
   at StockSharp.Algo.Strategies.Strategy.#=qD2Mhf_hnXHZkwgV7Ff93Pw==(StrategyRule #=qQyTM14c0wS9VjpZF_0j2Jg==, Object #=q7h_FwN0QN8CxzI3D_M4Hsg==)
A$ 22.08.2011 16:47:51.544 [MQS] Стратегия останавливается.
A$ 22.08.2011 16:47:51.546 [MQS] Заканчиваем котирование с неисполненным объемом равный 0.
A$ 22.08.2011 16:47:51.561 [MQS] Заявка 60121830 не была принята по причине System.ArgumentException: Транзакции 'ACTION=MOVE_ORDERS; TRANS_ID=60121830; CLASSCODE=SPBFUT; SECCODE=RIU1; MODE=0; FIRST_ORDER_NUMBER=4762883422; FIRST_ORDER_NEW_PRICE=156510; FIRST_ORDER_NEW_QUANTITY=1;' не была зарегистрирована. Причина 'Ошибка перестановки заявок. [FORTS] "Не найдена заявка для перестановки.".'.
Parameter name: transactionTxt
   at #=qRiY$QPJW_GcWl4TovRarJkPbf4ppv9xIchkEcMEHBzU=.#=qSxEA$emnAx3QyIPn2yCM91ypPYsC6KBskKUgxXvP1CQ=(String #=qNO1ermIfWrG6dI$oUYZimA==, OrderStatus& #=qE4jat_vDrzVPYl_Ppu6iiA==, UInt32& #=qi1CY7KZZg6ecB_rpBWuxRA==, Int64& #=qb$zRH_BdRoces20Fe447gA==, String& #=qtPEuDeVoYvRIkZG49QCeGg==)
   at StockSharp.Quik.QuikTrader.#=qWKihWhgMRklXQGRkeiBNtuVEwdQ4YPI12ZvT_jwFds8=(Order #=q3cpq7Usn3d1hLaOfCrw$Mg==, TransactionBuilder #=qWW3PytxIiGdL7NnSRqFd9Q==)
   at StockSharp.Quik.QuikTrader.OnReRegisterOrder(Order oldOrder, Order newOrder)
   at StockSharp.Algo.BaseTrader.ReRegisterOrder(Order oldOrder, Order newOrder)
   at StockSharp.Algo.Strategies.Strategy.ReRegisterOrder(Order oldOrder, Order newOrder)
   at StockSharp.Algo.Strategies.QuotingStrategy.#=qD1NOWCmddcJt7Z5o5DR0kg==()
   at StockSharp.Algo.Strategies.QuotingStrategy.#=qfTGDFZOzAQuz$oJ_UNB6fYa5baalVV3ic2Nfn_iclFU=.#=qy1SJPrtEmVhxEZHX5EDH4g==()
   at StockSharp.Algo.Strategies.StrategyRule.#=qOBi5CSZHig$JePmO_KI21CEQhj5ziVDpCSOsiQQ0sAI=.#=qpmhFPc0P9P8ObITuI86Kiw==(Object #=qPoMym7IqESgMzUnHZKR7gA==)
   at StockSharp.Algo.Strategies.Strategy.#=qD2Mhf_hnXHZkwgV7Ff93Pw==(StrategyRule #=qQyTM14c0wS9VjpZF_0j2Jg==, Object #=q7h_FwN0QN8CxzI3D_M4Hsg==).
A$ 22.08.2011 16:47:51.564 [MQS] Заканчиваем котирование с неисполненным объемом равный 0.
A$ 22.08.2011 16:47:51.565 [MQS] Стратегия остановлена.
A$ 22.08.2011 16:47:51.567 Новая Sell сделка 379837286 на 1 заявки 60121829.

Часто в этом случае он проводит двойной объем, а позицию изменяет только на 1.

Alexander
Alexander

Church: А еще, практически при каждом запуске котировщика получаются ошибки:

A$ 22.08.2011 16:47:45.809 [MQS] Стратегия запущена. A$ 22.08.2011 16:47:45.883 [MQS] Регистрация новой заявки на Sell с ценой 156550 и объемом 1. A$ 22.08.2011 16:47:46.807 [MQS] Заявка 60121828 на Sell отправлена с ценой 156550 объемом 1. A$ 22.08.2011 16:47:46.809 [MQS] Заявка 60121828 не имеет состояния. A$ 22.08.2011 16:47:46.810 [MQS] Заявка 60121828 не имеет состояния. A$ 22.08.2011 16:47:46.812 [MQS] Заявка 60121828 не имеет состояния. A$ 22.08.2011 16:47:46.815 [MQS] Заявка 60121828 не имеет состояния. A$ 22.08.2011 16:47:46.817 [MQS] Заявка 60121828 не имеет состояния. A$ 22.08.2011 16:47:47.199 [MQS] Котируемая заявка 60121828 исполнилась. A$ 22.08.2011 16:47:47.200 [MQS] Регистрация новой заявки на Sell с ценой 156520 и объемом 1. A$ 22.08.2011 16:47:48.898 [MQS] Заявка 60121829 на Sell отправлена с ценой 156520 объемом 1. A$ 22.08.2011 16:47:48.899 [MQS] Новая Limit заявка 60121829 на Sell с номером 4762883422. A$ 22.08.2011 16:47:48.899 Новая Limit заявка 60121829 на Sell с номером 4762883422. A$ 22.08.2011 16:47:48.901 [MQS] Цена текущей 156520 и лучшей 156510. A$ 22.08.2011 16:47:48.903 [MQS] Котирование заявки 60121829 на Sell с ценой 156520 объемом 1. A$ 22.08.2011 16:47:51.522 [MQS] Заканчиваем котирование с неисполненным объемом равный 0. A$ 22.08.2011 16:47:51.542 [MQS] System.ArgumentException: Транзакции 'ACTION=MOVE_ORDERS; TRANS_ID=60121830; CLASSCODE=SPBFUT; SECCODE=RIU1; MODE=0; FIRST_ORDER_NUMBER=4762883422; FIRST_ORDER_NEW_PRICE=156510; FIRST_ORDER_NEW_QUANTITY=1;' не была зарегистрирована. Причина 'Ошибка перестановки заявок. [FORTS] "Не найдена заявка для перестановки.".'. Parameter name: transactionTxt at #=qRiY$QPJW_GcWl4TovRarJkPbf4ppv9xIchkEcMEHBzU=.#=qSxEA$emnAx3QyIPn2yCM91ypPYsC6KBskKUgxXvP1CQ=(String #=qNO1ermIfWrG6dI$oUYZimA==, OrderStatus& #=qE4jat_vDrzVPYl_Ppu6iiA==, UInt32& #=qi1CY7KZZg6ecB_rpBWuxRA==, Int64& #=qb$zRH_BdRoces20Fe447gA==, String& #=qtPEuDeVoYvRIkZG49QCeGg==) at StockSharp.Quik.QuikTrader.#=qWKihWhgMRklXQGRkeiBNtuVEwdQ4YPI12ZvT_jwFds8=(Order #=q3cpq7Usn3d1hLaOfCrw$Mg==, TransactionBuilder #=qWW3PytxIiGdL7NnSRqFd9Q==) at StockSharp.Quik.QuikTrader.OnReRegisterOrder(Order oldOrder, Order newOrder) at StockSharp.Algo.BaseTrader.ReRegisterOrder(Order oldOrder, Order newOrder) at StockSharp.Algo.Strategies.Strategy.ReRegisterOrder(Order oldOrder, Order newOrder) at StockSharp.Algo.Strategies.QuotingStrategy.#=qD1NOWCmddcJt7Z5o5DR0kg==() at StockSharp.Algo.Strategies.QuotingStrategy.#=qfTGDFZOzAQuz$oJ_UNB6fYa5baalVV3ic2Nfn_iclFU=.#=qy1SJPrtEmVhxEZHX5EDH4g==() at StockSharp.Algo.Strategies.StrategyRule.#=qOBi5CSZHig$JePmO_KI21CEQhj5ziVDpCSOsiQQ0sAI=.#=qpmhFPc0P9P8ObITuI86Kiw==(Object #=qPoMym7IqESgMzUnHZKR7gA==) at StockSharp.Algo.Strategies.Strategy.#=qD2Mhf_hnXHZkwgV7Ff93Pw==(StrategyRule #=qQyTM14c0wS9VjpZF_0j2Jg==, Object #=q7h_FwN0QN8CxzI3D_M4Hsg==) A$ 22.08.2011 16:47:51.544 [MQS] Стратегия останавливается. A$ 22.08.2011 16:47:51.546 [MQS] Заканчиваем котирование с неисполненным объемом равный 0. A$ 22.08.2011 16:47:51.561 [MQS] Заявка 60121830 не была принята по причине System.ArgumentException: Транзакции 'ACTION=MOVE_ORDERS; TRANS_ID=60121830; CLASSCODE=SPBFUT; SECCODE=RIU1; MODE=0; FIRST_ORDER_NUMBER=4762883422; FIRST_ORDER_NEW_PRICE=156510; FIRST_ORDER_NEW_QUANTITY=1;' не была зарегистрирована. Причина 'Ошибка перестановки заявок. [FORTS] "Не найдена заявка для перестановки.".'. Parameter name: transactionTxt at #=qRiY$QPJW_GcWl4TovRarJkPbf4ppv9xIchkEcMEHBzU=.#=qSxEA$emnAx3QyIPn2yCM91ypPYsC6KBskKUgxXvP1CQ=(String #=qNO1ermIfWrG6dI$oUYZimA==, OrderStatus& #=qE4jat_vDrzVPYl_Ppu6iiA==, UInt32& #=qi1CY7KZZg6ecB_rpBWuxRA==, Int64& #=qb$zRH_BdRoces20Fe447gA==, String& #=qtPEuDeVoYvRIkZG49QCeGg==) at StockSharp.Quik.QuikTrader.#=qWKihWhgMRklXQGRkeiBNtuVEwdQ4YPI12ZvT_jwFds8=(Order #=q3cpq7Usn3d1hLaOfCrw$Mg==, TransactionBuilder #=qWW3PytxIiGdL7NnSRqFd9Q==) at StockSharp.Quik.QuikTrader.OnReRegisterOrder(Order oldOrder, Order newOrder) at StockSharp.Algo.BaseTrader.ReRegisterOrder(Order oldOrder, Order newOrder) at StockSharp.Algo.Strategies.Strategy.ReRegisterOrder(Order oldOrder, Order newOrder) at StockSharp.Algo.Strategies.QuotingStrategy.#=qD1NOWCmddcJt7Z5o5DR0kg==() at StockSharp.Algo.Strategies.QuotingStrategy.#=qfTGDFZOzAQuz$oJ_UNB6fYa5baalVV3ic2Nfn_iclFU=.#=qy1SJPrtEmVhxEZHX5EDH4g==() at StockSharp.Algo.Strategies.StrategyRule.#=qOBi5CSZHig$JePmO_KI21CEQhj5ziVDpCSOsiQQ0sAI=.#=qpmhFPc0P9P8ObITuI86Kiw==(Object #=qPoMym7IqESgMzUnHZKR7gA==) at StockSharp.Algo.Strategies.Strategy.#=qD2Mhf_hnXHZkwgV7Ff93Pw==(StrategyRule #=qQyTM14c0wS9VjpZF_0j2Jg==, Object #=q7h_FwN0QN8CxzI3D_M4Hsg==). A$ 22.08.2011 16:47:51.564 [MQS] Заканчиваем котирование с неисполненным объемом равный 0. A$ 22.08.2011 16:47:51.565 [MQS] Стратегия остановлена. A$ 22.08.2011 16:47:51.567 Новая Sell сделка 379837286 на 1 заявки 60121829.

> 
> Часто в этом случае он проводит двойной объем, а позицию изменяет только на 1.



Какая версия S#? Как создаётся котирование, сколько раз?
Как ни пытался, так и не смог понять пока как такой лог выходит 🤔 
Church
Church

Ордер генерируется максимум 2 раза (вход-выход) за 1 свечку (минутки). Выход не активируется до тех пор, пока не изменится позиция по входу. Котирование создается вроде бы так же как и в примерах...

Maxim K.
Maxim K.

Возник такой вопрос: поддерживает ли библиотека транзакции,связанные с внебиржевыми заявками (NEW_NEG_DEAL и подобные) ? Если нет, то вопрос такой - на каком этапе происходит подключение TRANS2QUIK.DLL ?

Mikhail Sukhov
Mikhail Sukhov

Maxim K.: Возник такой вопрос: поддерживает ли библиотека транзакции,связанные с внебиржевыми заявками (NEW_NEG_DEAL и подобные) ? Если нет, то вопрос такой - на каком этапе происходит подключение TRANS2QUIK.DLL ?

http://stocksharp.com/doc/html/0b0bd6e0-7ddf-407d-9e03-a218796163af.htm

Maxim K.
Maxim K.

Mikhail Sukhov:

Maxim K.: Возник такой вопрос: поддерживает ли библиотека транзакции,связанные с внебиржевыми заявками (NEW_NEG_DEAL и подобные) ? Если нет, то вопрос такой - на каком этапе происходит подключение TRANS2QUIK.DLL ?

http://stocksharp.com/doc/html/0b0bd6e0-7ddf-407d-9e03-a218796163af.htm То есть нужно, например, регистрировать заявку как обычную, но потом в FormatTransaction переставлять Action, ClassCode, и т.д. на нужное ? Или я не так понял ?

Mikhail Sukhov
Mikhail Sukhov

Maxim K.: То есть нужно, например, регистрировать заявку как обычную, но потом в FormatTransaction переставлять Action, ClassCode, и т.д. на нужное ? Или я не так понял ?

Да.

l-way
l-way

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

Есть ли ограничение на число экспортируемых стаканов? У меня больше 7 не работает

Alexander
Alexander

l-way: Здравствуйте

Есть ли ограничение на число экспортируемых стаканов? У меня больше 7 не работает

ProcessDataError что говорит? В Квике стаканы открываются после 7го?

l-way
l-way

Alexander:

l-way: Здравствуйте

Есть ли ограничение на число экспортируемых стаканов? У меня больше 7 не работает

ProcessDataError что говорит? В Квике стаканы открываются после 7го?

Вылетает ArgumentException на методе QuikTrader.RegisterQuotes(security). Текст ошибки: Окно с заголовком "RSU1@RTS" не было найдено. При этом стакан в квик открывается. Запускал несколько раз. Из них пару раз ошибка сработала не после 7, а на 3 и 4 стакане. То есть дело не в ограничение.

Я RegisterQuotes запускаю в OnNewSecurities. Может быть в этом дело?

l-way
l-way

В квике при этом в окне сообщений появляется следующие сообщения:

"DDE сервер wrapper. Документ 'стакан[SRU1@RTS]'.Таблица 'SRU1@RTS'. Произошла ошибка: Ошибка при передаче таблицы, вывод приостановлен. Исчерпано время для обмена данными: сервер слишком перегружен."

"DDE сервер 'wrapper'.Документ 'все сделки[]'. Таблица 'Все сделки'. Произошла ошибка: Ошибка при передаче таблицы, неверные параметры."

Verifier пишет -все нормально.

RomSunZ
RomSunZ

Здраствуйте. Помогите разобраться с AmCharts. Я в примере SampleCandles поменял xaml код графика, взяв его из примера SampleAlfaCandles. Далее добавил функцию в окне графика:


        public void DrawCandles(IEnumerable<Candle> candles)
        {
            _candles.AddRange(candles);
            stockChart1.DataSets[0].ItemsSource = _candles;
        }

В обработчике событий NewCandles и CandlesChanged в главном окне прописал


		private void DrawCandles1(CandleToken token, IEnumerable<Candle> candles)
		{
			this.GuiAsync(() =>
			{
				var wnd = _chartWindows.TryGetValue(token);
                                if (wnd != null)
                                wnd.DrawCandles(candles);
			});
		}

Все остальное оставил как было. После запуска экспорта и открытия графика у меня сразу отрисовывется несколько свечек (видимо которые приходят по DDE от момента вызова _chartWindows.Show() до первого вызова DrawCandles), а потом добавление новых на график не идет. События обрабатываются нормально, количество элементов в _candles увеличивается, но новые свечки на графике не появляются. Подскажите, что нужно добавить, чтобы график обновлялся с приходом новых данных?

Нашел ответ на форуме amCharts: You can manually call DataSet.ProcessDataBoundItems() method to force processing of bound data items.

Maxim K.
Maxim K.

Можно ли как-нибудь средствами библиотеки получать информацию об отправленной транзакции ? Какой-нибудь аналог TRANS2QUIK_TRANSACTIONS_REPLY_CALLBACK ?

Mikhail Sukhov
Mikhail Sukhov

Maxim K.: Можно ли как-нибудь средствами библиотеки получать информацию об отправленной транзакции ? Какой-нибудь аналог TRANS2QUIK_TRANSACTIONS_REPLY_CALLBACK ?

Вы думаете в терминал Квика, где сделано процедурно. А нужно думать в терминал ООП. ITrader.OrdersChaged ITrader.OrdersFailed.

Maxim K.
Maxim K.

Mikhail Sukhov:

Maxim K.: Можно ли как-нибудь средствами библиотеки получать информацию об отправленной транзакции ? Какой-нибудь аналог TRANS2QUIK_TRANSACTIONS_REPLY_CALLBACK ?

Вы думаете в терминал Квика, где сделано процедурно. А нужно думать в терминал ООП. ITrader.OrdersChaged ITrader.OrdersFailed. Просто s#, на сколько я понимаю, на данный момент не предоставляет функционала для работы с РПС. Сейчас, чтобы поставить заявку РПС, я отправляю их как обычные, в FormatTransaction отслеживаю их и меняю Action на нужное. Но дело в том, что я не знаю как получить результат транзакции - была она принята, исполнена, отвергнута или что-нибудь еще с ней случилось, а мне нужно получать эту информацию.

upd: правильно ли я понимаю, что OrdersChanged следит за таблицей "Заявки", а OrdersFailed делает как раз то что мне нужно - анализирует результат транзакции ?

Mikhail Sukhov
Mikhail Sukhov

Maxim K.: Просто s#, на сколько я понимаю, на данный момент не предоставляет функционала для работы с РПС. Сейчас, чтобы поставить заявку РПС, я отправляю их как обычные, в FormatTransaction отслеживаю их и меняю Action на нужное. Но дело в том, что я не знаю как получить результат транзакции - была она принята, исполнена, отвергнута или что-нибудь еще с ней случилось, а мне нужно получать эту информацию.

Все как с обычными заявками.

Maxim K.
Maxim K.

Mikhail Sukhov: Все как с обычными заявками.

Да, и правда, почти все как с обычными. Спасибо.

Mikhail Sukhov
Mikhail Sukhov

Maxim K.:

Mikhail Sukhov: Все как с обычными заявками.

Да, и правда, почти все как с обычными. Спасибо.

Если расширите самостоятельно оставшиеся команды, можно вставить в S# в следующей версии.

Maxim K.
Maxim K.

Mikhail Sukhov: Если расширите самостоятельно оставшиеся команды, можно вставить в S# в следующей версии.

Михаил, а не могли бы вы по подробнее объяснить, что вы подразумеваете под "расширить команды" ? Просто сейчас по сути ничего не расширено - всё работает посредством корявых костылей в FormatTransaction. Плюс еще приходится менять класс инструментов там же - с SPBFUT и SPBOPT на PSFUT и PSOPT, так как я не до конца понял как s# работает с инструментами с одинаковым кодом, но с разным классом.

Mikhail Sukhov
Mikhail Sukhov

Maxim K.: Михаил, а не могли бы вы по подробнее объяснить, что вы подразумеваете под "расширить команды" ? Просто сейчас по сути ничего не расширено - всё работает посредством корявых костылей в FormatTransaction.

Конечно нет, вы же код еще не прислали. Не будем же мы ради одного вас делать поддержку экзотики. Мы вам код TransactionBuilder, вы нам его дополненного всеми оставшимися командами, которые могут быть в Квик. После этого с места и сдвинется. Ок?

Maxim K.: Плюс еще приходится менять класс инструментов там же - с SPBFUT и SPBOPT на PSFUT и PSOPT, так как я не до конца понял как s# работает с инструментами с одинаковым кодом, но с разным классом.

Я про это в первый раз слышу. Приведите ссылку, где вы про это писали.

Правило простое. Есть проблема - есть сообщение на форуме. Если сообщения нет, значит нет и проблемы.

Maxim K.
Maxim K.

Просто я до конца еще не разобрался и сформулировать проблему пока не могу четко. Как разберусь так сразу отпишусь. Насчет TransactionBuilder - я за, присылайте, постараюсь сделать.

Mikhail Sukhov
Mikhail Sukhov

Maxim K.: Просто я до конца еще не разобрался и сформулировать проблему пока не могу четко. Как разберусь так сразу отпишусь. Насчет TransactionBuilder - я за, присылайте, постараюсь сделать.

Как будете готовы и уверены, отошлю файл.

bgood
bgood

Подскажите, есть ли возможность выставлять РЕПО заявки? Пока что вижу для себя два решения:

  1. Мучить QuikTrader.FormatTransaction()
  2. Отправлять через TRANS2QUIK.DLL минуя S#, ибо позволяет отправлять как раз в таком виде, который в *.tri файле, но это какой-то геморрой как мне кажется

Пример из *.tri файла:

ACTION=NEW_EXT_REPO_NEG_DEAL; TRANS_ID=5911; CLASSCODE=RPDD; SECCODE=SU25065RMFS2; ACCOUNT=; CLIENT_CODE=MMkb; PARTNER=; OPERATION=S; QUANTITY=200000; SETTLE_CODE=T0; REPORATE=3.9; REPOTERM=1; START_DISCOUNT=2; MATCHREF=БУНФА1;

Mikhail Sukhov
Mikhail Sukhov

avidad: Подскажите, есть ли возможность выставлять РЕПО заявки?

Буквально пару сообщений выше писал что да можно и как именно. Спросите у Maxim.K, надеюсь, он поделится опытом. Хотя там дело на пару часов.

Maxim K.
Maxim K.

Я мучаю FormatTransaction. Еще такой вопрос: Часто возникает ситуация, когда при переходе с дневной сессии на вечернюю и обратно остается висеть активная заявка. Биржа меняет там код с, например, SPBFUT на FUTEVN, снимая старую заявку и ставя новую. При этом, у этих двух заявок получается одинаковый номер. При DDE экспорте в таком случае возникает ошибка - Дублированный пакет, имя параметра - item, экспортируются только те заявки, которые расположены выше этих двух с одинаковым номером. Сейчас лечу это поиском заявок с одинаковым номером и удалением снятой в PreProcessDdeData. У кого-нибудь еще возникает подобная проблема ? Или надо с брокером говорить ?

P.S. Михаил, с инструментами разобрался, проблем вроде нет. За TransactionBuilder готов приняться.

bgood
bgood

Maxim K., отписал вам в личку

Alexander
Alexander

avidad: Maxim K., отписал вам в личку

а сюда отписать? :)

Church
Church

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

Mikhail Sukhov
Mikhail Sukhov

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

http://stocksharp.com/doc/html/P_StockSharp_Algo_Candles_CandleManager_IsSyncRegister.htm

Maxim K.
Maxim K.

Повторю вопрос: Часто возникает ситуация, когда при переходе с дневной сессии на вечернюю и обратно остается висеть активная заявка. Биржа меняет там код с, например, SPBFUT на FUTEVN, снимая старую заявку и ставя новую. При этом, у этих двух заявок получается одинаковый номер. При DDE экспорте в таком случае возникает ошибка - Дублированный пакет, имя параметра - item, экспортируются только те заявки, которые расположены выше этих двух с одинаковым номером. Сейчас лечу это поиском заявок с одинаковым номером и удалением снятой в PreProcessDdeData. У кого-нибудь еще возникает подобная проблема ? Или надо с брокером говорить ?

Собственно интересует один ли я такой или нет, бывает у кого-то такое или нет.

Alexander
Alexander

Maxim K.: Повторю вопрос: Часто возникает ситуация, когда при переходе с дневной сессии на вечернюю и обратно остается висеть активная заявка. Биржа меняет там код с, например, SPBFUT на FUTEVN, снимая старую заявку и ставя новую. При этом, у этих двух заявок получается одинаковый номер. При DDE экспорте в таком случае возникает ошибка - Дублированный пакет, имя параметра - item, экспортируются только те заявки, которые расположены выше этих двух с одинаковым номером. Сейчас лечу это поиском заявок с одинаковым номером и удалением снятой в PreProcessDdeData. У кого-нибудь еще возникает подобная проблема ? Или надо с брокером говорить ?

Собственно интересует один ли я такой или нет, бывает у кого-то такое или нет.

Что за брокер? Что настроено в Связь -> Списки?

P.S. У меня в Открытии с таким ни разу не сталкивался, в Связь -> Списки установлены только "Forts" (а не фьючерсы фортс: дополнительная сессия).

P.P.S. и avidad вам не по этому поводу отписался? :)

Maxim K.
Maxim K.

Alexander:

Maxim K.: Повторю вопрос: Часто возникает ситуация, когда при переходе с дневной сессии на вечернюю и обратно остается висеть активная заявка. Биржа меняет там код с, например, SPBFUT на FUTEVN, снимая старую заявку и ставя новую. При этом, у этих двух заявок получается одинаковый номер. При DDE экспорте в таком случае возникает ошибка - Дублированный пакет, имя параметра - item, экспортируются только те заявки, которые расположены выше этих двух с одинаковым номером. Сейчас лечу это поиском заявок с одинаковым номером и удалением снятой в PreProcessDdeData. У кого-нибудь еще возникает подобная проблема ? Или надо с брокером говорить ?

Собственно интересует один ли я такой или нет, бывает у кого-то такое или нет.

Что за брокер? Что настроено в Связь -> Списки?

P.S. У меня в Открытии с таким ни разу не сталкивался, в Связь -> Списки установлены только "Forts" (а не фьючерсы фортс: дополнительная сессия).

P.P.S. и avidad вам не по этому поводу отписался? :)

Брокер - Церих В связь->списки установлено почти все, так как всё это нужно. avidad не по этому поводу отписывался )

Mikhail Sukhov
Mikhail Sukhov

Maxim K.: Собственно интересует один ли я такой или нет, бывает у кого-то такое или нет.

Может фильтр на таблицу заявок?

freelancer
freelancer

А можно ли с помощью правил реализовать вход в сделку за 5-10 секунд до окончания свечи ? И второй вопрос: после переподключения правила в стратегии не выполняются. Странно

Maxim K.
Maxim K.

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

Mikhail Sukhov
Mikhail Sukhov

Maxim K.: Вы имеете ввиду обычный фильтр в QUIK ? Собственно изначально так и делал, но тогда теряется и некоторая полезная информация, что не есть хорошо.

А что именно теряется?

Maxim K.
Maxim K.

Ну если, например, как я делал, в фильтре поставить только активные и исполненные, то не будет информации по снятым заявкам.

Николай_Флёров
Mikhail Sukhov
Mikhail Sukhov

Maxim K.: Ну если, например, как я делал, в фильтре поставить только активные и исполненные, то не будет информации по снятым заявкам.

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

Maxim K.
Maxim K.

Можно, но тогда потеряются сделки с вечерки, которые нужно иногда учитывать.

Николай_Флёров
Mikhail Sukhov
Mikhail Sukhov

Maxim K.: Можно, но тогда потеряются сделки с вечерки, которые нужно иногда учитывать.

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

Alexander
Alexander

Maxim K.: Можно, но тогда потеряются сделки с вечерки, которые нужно иногда учитывать.

Дайте скриншот квика, где видна проблема. Я уже тоже не совсем понимаю в чём она состоит.

Alexander
Alexander

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

<u>Что осталось по этой теме:</u>

  1. Church: проблема с PositionManager. Состояние: жалобы получены, исследование проводим, проблему ищем.

2)MaximK: SPBFUT, SPBOPT, PSFUT, PSOPT Состояние: ждём подробного описания проблемы со скриншотами в новой теме.

Если что или кого забыл - создавайте новую тему.

Николай_Флёров