Просмотр сообщений
This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.
Messages - Владимир I
1
« on: дХТаРЫп 20, 2015, 04:23:47 pm »
Здравствуйте ! Меня интересует альтернативная среда для создания торговых роботов. Требования следующие : 1. Написание роботов на C++ или C# 2. Прямая работа с ФОРТС через PLAZAII 3. Надёжная, устойчивая круглосуточная работа 4. Возможность ручного ввода/удаления заявок
Порекомендуйте систему !
2
« on: пЭТРап 27, 2015, 05:49:17 pm »
Здравствуйте !
Нет ли какой-нибудь документации по работе с объектами типа statline ?
Конкретно вопросы -
1. объект типа statline можно подписать на несколько бумаг сразу или под каждую бумагу надо свой объект создавать ?
2. при обращении var MySecId = findSecID( MySecName, "FORTS" ); var StatLine = new_object( "statline" ); StatLine.subscribe( MySecId ); // Подписаться на информацию по инструменту. var MyPrice = StatLine.getparam( MySecId, param_highbid ); var MyPrice2 = StatLine.getparam( MySecId, param_lowoffer ); В переменные пишется значение ~-2*10E-9 ( значение не получено ), хотя если смотреть через таблицу инструментов Транзака, то там эти значения есть. Если использовать константу param_last то значения возвращаются ( если они есть конечно )
3
« on: РЯаХЫп 30, 2014, 02:37:48 pm »
Мне нужны те только цены, но и другие параметры ( например ГО ) и не только по текущему инструменту, но и по опционам на него с разными страйками. А close даёт цену только по инструменту, по которому график строится.
4
« on: РЯаХЫп 30, 2014, 10:27:47 am »
Вот так вызываю :
var OptionsPrice = getCurrentPrice( OptionName );
В другом месте
var MyCurrentPrice = getCurrentPrice( MySecName );
5
« on: РЯаХЫп 22, 2014, 10:52:38 am »
Вот мои пожелания :
1. SMS, email оповещения - программные ( signal::SMS( PhoneNumber, message ), signal::email( emailAddress, message ) ) + Multiple версии - серверные ( программа регистрирует на сервере событие завершения сессии ( в т.ч. и особенно аварийное ), signal::serverSMS( Event, PhoneNumber, message ), signal::serveremail( Event, emailAddress, message ) где Event - завершение сеанса, аварийное завершение сеанса, потеря соединения с биржей, возможно ещё какие-нибудь события, препятствующие работе Транзака и особенно роботов ( которые должны работать круглосуточно ).
2. В параметры инструмента ( выдаваемые функцией getSecInfo() ) надо добавить след. информацию : - Код базового актива ( для фьючерсов, опционов ) - Количество базового актива в инструменте ( для фьючерсов, опционов ) - Гарантийное обеспечение продавца ( для фьючерсов, опционов ) ==> Через statline - Гарантийное обеспечение покупателя ( для фьючерсов, опционов ) ==> Через statline - Дата завершения обращения ( для фьючерсов, опционов, облигаций ) - Шаг цены ==> Через getSecInfo Данная информация есть в структуре 4.18 "Информация по инструменту" из Transaq XML Connector. Лучше получить доступ к целиковой структуре, лишние параметры не помешают, а кому-то могут понадобиться.
3. Отслеживание режима торгов - Функция isTradeSession( Market ) - возвращает 1 если торговая сессия на рынке Market активна, 0 - если не активна - События onStartTrading( Market ), onStopTrading( Market ) - начало и конец торговой сессии на рынке Market. 4. Функцию trade_action::cancelAllSecAllOrders - чтобы снимала все неисполненные заявки по всем инструментам по текущему рынку и текущему клиенту. 5. Сделать окошко выбора инструментов побольше - иначе там названий опционов не видно.
6. Сделать окошко ввода параметров индикатора побольше и шрифт покрупнее.
7. Получение позиций по всем инструментам ( или идентификаторы инструментов по которым открыты позиции )
8. Нужна функция для получения текущего типа переменной ( NOT_DEFINED, number, string, date, hash, array, file, statline, ... )
9. Для объектов типа hash сделать метод .to_string()
10. Сделать функцию replace( строка, что поменять, на что поменять )
11. Сделать функции min( x,y ) и max( x,y ), in_range( x, y, z ) = min( max( x, y ), z ) in_range( x, y, z ) - ограничить значение x диапазоном [ y, z ] Если окажется что y > z, то выдавать программную ошибку.
12. В функции round сделать необязательный второй параметр - до скольких знаков после запятой огруглять. 13. События onConnect(), onDisconnect( var reason ) к серверу Транзак
14. Лучше сделать жёсткую типизацию переменных : var OptionName : string; var TraceFile : file; // Эквивалентно var TraceFile = new_object( "file" ); var PutPositionsLots : array; // Эквивалентно var PutPositionsLots = new_object( "array" ); Это значительно повысит наглядность и надёжность программ.
6
« on: РЯаХЫп 22, 2014, 10:49:53 am »
Когда выйдет новая версия ATF ?
7
« on: РЯаХЫп 22, 2014, 10:49:19 am »
Здравствуйте !
Столкнулся с очередным вредным и труднообнаружимым багом :
На ФОРТС при запросе текущей цены инструмента через следующую функцию
// Возвращает текущую цену инструмента. function getCurrentPrice( var MySecName ) { var MySecId = findSecID( MySecName, "FORTS" ); var StatLine = new_object( "statline" ); StatLine.subscribe( MySecId ); // Подписаться на информацию по инструменту. var MyCurrentPrice = StatLine.getparam( MySecId, param_last ); // Текущая цена. StatLine.unsubscribe( MySecId ); // Отписаться от информации по инструменту.
return MyCurrentPrice; }
возвращается цена 12 минутной давности ! Вот строка из лога 2014.04.22 11.24.26 RIM4 = 115030 => MyTrade - Order : CurrPrice = 114840 ; SecName = RIM4 ; client = ****** ; operation = 1 ; price = 114870 ; quantity = 5 ; secid = 2144 ;
Где RIM4 = 115030 реальная текущая цена, полученная как CurrentFuturesPrice = close; а CurrPrice = 114840 получена через приведённую выше функцию getCurrentPrice Расхождение очевидно. Посмотрел по журналу когда последний раз цена была 114840 и нашёл 2014.04.22 11.13.36 RIM4 = 114840 т.е. задержка составила 11 минут !
Вопросы :
1. Когда будет нормально работать ATF ? ( чувствую вопрос риторический ) 2. Как правильно получить текущую цену инструмента по его коду ?
С уважением, Владимир
8
« on: ЬРавР 12, 2014, 11:08:39 am »
Спасибо !
Жду с нетерпением.
9
« on: ЬРавР 05, 2014, 12:12:00 pm »
Здравствуйте !
У меня робот, который постоянно пишет кучу информации в окно вывода ATF. Пока информации немного, всё работает нормально. Но постепенно Транзак замедляется, перестаёт отрабатывать нажатия кнопок, отрисовку окон и т.д.
При нажатии на кнопку очистки окна вывода ATF (!) - кнопка исчезает, окно НЕ очищается, Транзак жутко тормозит.
Надо сделать чтобы не тормозил + функцию очистки этого окна из ATF скрипта.
10
« on: пЭТРап 29, 2014, 09:57:26 am »
Спасибо - попробую.
11
« on: ФХЪРСап 27, 2013, 02:22:15 pm »
Здравствуйте !
Когда ожидается новая версия Транзака и ATF ?
С уважением, Владимир
12
« on: ФХЪРСап 27, 2013, 11:19:43 am »
Здравствуйте !
Второй раз за неделю, по утрам ( у меня робот работает круглосуточно ), в ATF выдаётся неправильная позиция по инструментам Показываются несуществующие позиции по инструментам. Причём сам Транзак ( через Shift+F7 ) показывает позицию правильно ! После перезапуска транзака, и в ATF начинает выдаваться правильная позиция.
Фрагмент кода, получающий позицию :
// Функция извлекает текущую позицию ( в лотах ) по инструменту. function getMyPosition( var MySecName ) { var CurrentPosition = getFORTSPosition( Client, findSecID( MySecName, "FORTS" ) ); // При отсутствии позиции, hash вообще пустой. В этом случае возвращается 0. if ( CurrentPosition.isEmpty() ) { return 0; } else { return CurrentPosition[ "totalnet" ]; } }
function onEnvEvent( var EventName ) if ( EventName == "CLIENT_HOLDINGS" ) { // Получить позицию по фьючерсу. CurrentPositionLots = getMyPosition( FuturesShortName );
while ( CurrentStrike <= FinalStrike ) { // Сформировать коды опционов Call и Put PutOptionName = getPutOptionName( CurrentStrike ); CallOptionName = getCallOptionName( CurrentStrike );
PutOptionPositionLots = getMyPosition( PutOptionName ); CallOptionPositionLots = getMyPosition( CallOptionName );
if ( CallOptionPositionLots != 0 or PutOptionPositionLots != 0 ) { PriceLimit.push( CurrentStrike ); PutPositionsLots.push( PutOptionPositionLots ); CallPositionsLots.push( CallOptionPositionLots ); printOptionPosition( "PUT" , PutOptionName , PutOptionPositionLots , CurrentStrike ); printOptionPosition( "CALL", CallOptionName, CallOptionPositionLots, CurrentStrike ); } CurrentStrike += Step; }
Результат вывода : 2013.12.27 10.07.30 RIH4 = 145290 => POS : PUT : RI135000BM4 : Amount = -4 : Price = -2.14748e+009 ; InternalPrice = 0 ; TimingPrice = -2.14748e+009 ; TotalTimingPrice = -8.58993e+009 ; TotalTimingPriceRub = -5.61017e+009 2013.12.27 10.07.30 RIH4 = 145290 => POS : CALL : RI140000BA4 : Amount = -4 : Price = -2.14748e+009 ; InternalPrice = 5290 ; TimingPrice = -2.14749e+009 ; TotalTimingPrice = -8.58996e+009 ; TotalTimingPriceRub = -5.61019e+009 2013.12.27 10.07.30 RIH4 = 145290 => POS : PUT : RI145000BM4 : Amount = -4 : Price = -2.14748e+009 ; InternalPrice = 0 ; TimingPrice = -2.14748e+009 ; TotalTimingPrice = -8.58993e+009 ; TotalTimingPriceRub = -5.61017e+009 2013.12.27 10.07.30 RIH4 = 145290 => POS : CALL : RI145000BA4 : Amount = -4 : Price = -2.14748e+009 ; InternalPrice = 290 ; TimingPrice = -2.14748e+009 ; TotalTimingPrice = -8.58994e+009 ; TotalTimingPriceRub = -5.61017e+009
На самом деле, позиции по RI140000BA4 и по RI135000BM4 не были открыты, были только по RI145000BM4 и по RI145000BA4.
Параметр Price также явно кривой. Он вычисляется процедурой function getCurrentPrice( var MySecName ) { var MySecId = findSecID( MySecName, "FORTS" ); var StatLine = new_object( "statline" ); StatLine.subscribe( MySecId ); // Подписаться на информацию по инструменту. var MyCurrentPrice = StatLine.getparam( MySecId, param_last ); // Текущая цена. StatLine.unsubscribe( MySecId ); // Отписаться от информации по инструменту.
return MyCurrentPrice; }
В чём может быть проблема ?
13
« on: ФХЪРСап 06, 2013, 10:53:16 am »
Можно ли помещать объекты типа statline внутрь объектов типа hash ?
Например, можно ли так записать :
var StatlineList = new_object( "hash" ); StatlineList[ "RIZ3" ] = new_object( "statline" ); StatlineList[ "RIZ3" ].subscribe( "RIZ3" ); или ( если последний оператор синтаксически неверный ), заменить его на var aStatLine = StatlineList[ "RIZ3" ]; aStatLine.subscribe( MySecId );
14
« on: ФХЪРСап 05, 2013, 10:43:38 am »
Здравствуйте !
Для получения гарантийного обеспечения по фьючерсам и опционам на FORTS я использую следующую функцию :
function getSellCollateral( var MySecName ) { var MySecId = findSecID( MySecName, "FORTS" ); var StatLine = new_object( "statline" ); StatLine.subscribe( MySecId ); // Подписаться на информацию по инструменту. var ReportedCollateral = StatLine.getparam( MySecId, param_selldeposit ); StatLine.unsubscribe( MySecId );// Отписаться от информации по инструменту. var MyCollateral = in_range( ReportedCollateral, MinimalCollateral, MaximalCollateral ); if ( MyCollateral != ReportedCollateral ) { traceError( "getSellCollateral : ERROR : MySecName = " + MySecName + " ; ReportedCollateral = " + as_string( ReportedCollateral ) ); } return MyCollateral; }
В большинстве случаев возвращаются правильные значения, но иногда :
2013.12.05 10.08.21 RIZ3 = 137430 => getSellCollateral : ERROR : MySecName = RIZ3 ; ReportedCollateral = -2.14748e+007 2013.12.05 10.08.21 RIZ3 = 137430 => getSellCollateral : ERROR : MySecName = RI137500BX3 ; ReportedCollateral = -2.14748e+007 2013.12.05 10.08.21 RIZ3 = 137430 => getSellCollateral : ERROR : MySecName = RI137500BL3 ; ReportedCollateral = -2.14748e+007 2013.12.05 10.08.21 RIZ3 = 137430 => getSellCollateral : ERROR : MySecName = RIZ3 ; ReportedCollateral = -2.14748e+007 2013.12.05 10.08.22 RIZ3 = 137430 => getSellCollateral : ERROR : MySecName = RIZ3 ; ReportedCollateral = -2.14748e+007
Что происходит ? Это ошибка Транзака, сервера транзака или биржи ?
15
« on: ЭЮпСап 29, 2013, 10:41:30 am »
Спасибо !
Попробую.
|