Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
ФХЪРСап 14, 2024, 05:13:43 pm
Начало Помощь Поиск Войти Регистрация
Новости:

Просмотр сообщений

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

Pages: [1] 2 3
1
Здравствуйте !
   
  Меня интересует альтернативная среда для создания торговых роботов.
Требования следующие :
1. Написание роботов на C++ или C#
2. Прямая работа с ФОРТС через PLAZAII
3. Надёжная, устойчивая круглосуточная работа
4. Возможность ручного ввода/удаления заявок

Порекомендуйте систему !

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

    Нет ли какой-нибудь документации по работе с объектами типа 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
Мне нужны те только цены, но и другие параметры ( например ГО ) и не только по текущему инструменту, но и по опционам на него с разными страйками.
А close даёт цену только по инструменту, по которому график строится.

4
Вот так вызываю :

      var OptionsPrice = getCurrentPrice( OptionName );

В другом месте

   var MyCurrentPrice = getCurrentPrice( MySecName );

5
Вот мои пожелания :

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
Подсистема ATF / Когда выйдет новая версия ATF ?
« on: РЯаХЫп 22, 2014, 10:49:53 am »
Когда выйдет новая версия ATF ?

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

  Столкнулся с очередным вредным и труднообнаружимым багом :

На ФОРТС при запросе текущей цены инструмента через следующую функцию

// Возвращает текущую цену инструмента.
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. Как правильно получить текущую цену инструмента по его коду ?

С уважением, Владимир

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

   У меня робот, который постоянно пишет кучу информации в окно вывода ATF. Пока информации немного, всё работает нормально.
Но постепенно Транзак замедляется, перестаёт отрабатывать нажатия кнопок, отрисовку окон и т.д.

   При нажатии на кнопку очистки окна вывода ATF (!) - кнопка исчезает, окно НЕ очищается, Транзак жутко тормозит.

Надо сделать чтобы не тормозил + функцию очистки этого окна из ATF скрипта.

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

   Когда ожидается новая версия Транзака и ATF ?

С уважением, Владимир

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

   Второй раз за неделю, по утрам ( у меня робот работает круглосуточно ), в 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
Можно ли помещать объекты типа statline внутрь объектов типа hash ?

Например, можно ли так записать :

   var StatlineList = new_object( "hash" );
   StatlineList[ "RIZ3" ] = new_object( "statline" );
   StatlineList[ "RIZ3" ].subscribe( "RIZ3" );
   
   или ( если последний оператор синтаксически неверный ), заменить его на
   var aStatLine = StatlineList[ "RIZ3" ];
   aStatLine.subscribe( MySecId );

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

Для получения гарантийного обеспечения по фьючерсам и опционам на 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
Спасибо !

Попробую.

Pages: [1] 2 3


Войти

Powered by MySQL Powered by PHP Powered by SMF 2.0.10 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS!