Вопросы новичка в S# (Закрыта)
Atom
01.12.2010


ttt

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

Теги:


Спасибо: Николай_Флёров



Скидка 15% на все продукты до 5 апреля (осталось 6 дней).

506 Ответов
<< < 8 9 10 11 12  > >>
surkov66

Фотография
Дата: 25.03.2011


Mikhail Sukhov Перейти


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



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

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

MCTuTeJ|19951995

Фотография
Дата: 28.03.2011


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

Igor_B

Фотография
Дата: 28.03.2011


Михаил, о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);
}
};

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

Mikhail Sukhov

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


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


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

Mikhail Sukhov

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


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


Trader.NewSecurities
Спасибо: Igor_B

a.dobryn

Фотография
Дата: 28.03.2011


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

foreach (var myTrade in myTrades)
...

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

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

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

Mikhail Sukhov

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


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


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

a.dobryn

Фотография
Дата: 28.03.2011


Mikhail Sukhov Перейти
D_Alex Перейти
upd: хм, и первая и последняя давностью 2,5 часа Confused


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


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

Mikhail Sukhov

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


D_Alex Перейти
Mikhail Sukhov Перейти
D_Alex Перейти
upd: хм, и первая и последняя давностью 2,5 часа Confused


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


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


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

a.dobryn

Фотография
Дата: 28.03.2011


Mikhail Sukhov Перейти
D_Alex Перейти
Mikhail Sukhov Перейти
D_Alex Перейти
upd: хм, и первая и последняя давностью 2,5 часа Confused


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


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


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


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

IlyaILH

Фотография
Дата: 28.03.2011


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

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

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

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

Trader.NewSecurities += securities =>
{

foreach (Security tool in securities)
{

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

}
};

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

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

Спасибо.
Спасибо:

Mikhail Sukhov

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


IlyaILH Перейти
Trader.NewSecurities += securities =>
{

foreach (Security tool in securities)
{

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

}
};

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


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

MCTuTeJ|19951995

Фотография
Дата: 29.03.2011


Михаил,а
Код
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

Фотография
Дата: 29.03.2011


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

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

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

a.dobryn

Фотография
Дата: 29.03.2011


Код

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


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

Mikhail Sukhov

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


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

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


MCTuTeJ|19951995 Перейти

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


Отменять, дожидаться отмены, выставлять новую.
Спасибо: MCTuTeJ|19951995

Mikhail Sukhov

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


D_Alex Перейти
Код

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


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


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

MCTuTeJ|19951995

Фотография
Дата: 29.03.2011


Mikhail Sukhov Перейти
MCTuTeJ|19951995 Перейти

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


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

Но если к моменту отмены она уже будет исполнена всё равно ведь будет ошибка ?
Спасибо:

Mikhail Sukhov

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


MCTuTeJ|19951995 Перейти
Mikhail Sukhov Перейти
MCTuTeJ|19951995 Перейти

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


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

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


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

a.dobryn

Фотография
Дата: 29.03.2011


Mikhail Sukhov Перейти
D_Alex Перейти
Код

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


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


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


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

Mikhail Sukhov

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


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


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

IlyaILH

Фотография
Дата: 29.03.2011


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

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


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

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

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


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

Vyacheslav

Фотография
Дата: 29.03.2011


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

Только начал изучать 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.

Что делать?



Спасибо:
<< < 8 9 10 11 12  > >>

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

loading
clippy