SmartQuant Discussion

Automated Quantitative Strategy Development, SmartQuant Product Discussion and Technical Support Forums
It is currently Thu Oct 22, 2020 3:12 am

All times are UTC + 3 hours




Post new topic Reply to topic  [ 435 posts ]  Go to page Previous  1 ... 9, 10, 11, 12, 13, 14, 15 ... 29  Next
Author Message
 Post subject: DataManager.Add()
PostPosted: Thu May 05, 2011 3:35 pm 
Offline

Joined: Mon Apr 25, 2011 3:11 pm
Posts: 20
Уважаемые коллеги, доброго времени суток!

У меня в ВижуалСтудио IntelliSence для сабжа выдает такой вариант:

Image

А OQ ругается вот на этот код:

Code:
TradeSeries TSiALL;
Instrument _newALL;
...
DataManager.Add(_newALL, TSiALL[j]);

...вот так:

Code:
---------------------------
Script Error
---------------------------
System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.

   в SmartQuant.Instruments.DataManager.Add(Instrument instrument, String suffix, Trade trade)

   в SmartQuant.Instruments.DataManager.Add(Instrument instrument, Trade trade)

   в MyScript.Run() в c:\Users\Admin\Documents\OpenQuant\Scripts\data_breakdown.cs:строка 43

   в OpenQuant.Projects.ScriptRunner.Run(Object data)
---------------------------
ОК   
---------------------------

В чем собака порылась?

Спасибо!

UPD: Может быть не так _newALL создаю:

Code:
_newALL = new Instrument(InstrumentType.Futures, "SBER_01_" + DTi.Date.ToString("yyMMdd") + "_ALL");

Как правильно создавать новые инструменты?

UPD2: Вот так заработало:
Code:
new Instrument(InstrumentType.Futures, "SBER_01_" + DTi.Date.ToString("yyMMdd") + "_ALL");
_newALL = InstrumentManager.Instruments["SBER_01_" + DTi.Date.ToString("yyMMdd") + "_ALL"];


Top
 Profile  
 
PostPosted: Thu May 05, 2011 5:29 pm 
Offline

Joined: Wed Oct 08, 2003 1:06 pm
Posts: 833
Quote:
Чтобы не тратить время на договоры лучше просто добавить еще одну опцию - направление перебора - и пусть каждый ... как он хочет


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

Code:
enum CalcMethod
   {
      FIFO,
      LIFO
   }
   
   private double GetAvgEntryPrice(CalcMethod method)
   {
      // calculate total buy and sell volume
      double sellVolume = 0;
      double buyVolume = 0;
         
      foreach (Transaction transaction in Position.Transactions)
      {
         if (transaction.Side == TransactionSide.Sell)
            sellVolume += transaction.Qty;
         else
            buyVolume += transaction.Qty;
      }
      
      double x = 0;
      double cumQty = 0;
      double openVolume;
      
      if (Position.Side == PositionSide.Long)
      {   
         openVolume = buyVolume - sellVolume;
         
         if (method == CalcMethod.LIFO)
         {
            for (int i = 0; i < Position.Transactions.Count; i++)
            {
               Transaction transaction = Position.Transactions[i];
               
               if (transaction.Side == TransactionSide.Sell)
                  continue;
               
               double qty = Math.Min(transaction.Qty, openVolume);
               
               cumQty += qty;
               x += qty * transaction.Price;
               
               openVolume -= qty;
               
               if (buyVolume == 0)
                  break;
            }
         }
         
         if (method == CalcMethod.FIFO)
         {
            for (int i = Position.Transactions.Count - 1; i >= 0 ; i--)
            {
               Transaction transaction = Position.Transactions[i];
               
               if (transaction.Side == TransactionSide.Sell)
                  continue;
               
               double qty = Math.Min(transaction.Qty, openVolume);
               
               cumQty += qty;
               x += qty * transaction.Price;
               
               openVolume -= qty;
               
               if (openVolume== 0)
                  break;
            }
         }
      }      
      else
      {   
         openVolume = sellVolume - buyVolume;
         
         if (method == CalcMethod.LIFO)
         {
            for (int i = 0; i < Position.Transactions.Count; i++)
            {
               Transaction transaction = Position.Transactions[i];
               
               if (transaction.Side == TransactionSide.Buy)
                  continue;
               
               double qty = Math.Min(transaction.Qty, openVolume);
               
               cumQty += qty;
               x += qty * transaction.Price;
               
               openVolume -= qty;
               
               if (buyVolume == 0)
                  break;
            }
         }
         
         if (method == CalcMethod.FIFO)
         {
            for (int i = Position.Transactions.Count - 1; i >= 0 ; i--)
            {
               Transaction transaction = Position.Transactions[i];
               
               if (transaction.Side == TransactionSide.Buy)
                  continue;
               
               double qty = Math.Min(transaction.Qty, openVolume);
               
               cumQty += qty;
               x += qty * transaction.Price;
               
               openVolume -= qty;
               
               if (openVolume == 0)
                  break;
            }
         }
      }            
      
      return x / cumQty;
   }


Last edited by Baraz Sergey on Wed Dec 07, 2011 10:57 am, edited 1 time in total.

Top
 Profile  
 
PostPosted: Thu May 05, 2011 5:53 pm 
Offline

Joined: Thu Feb 10, 2011 8:22 am
Posts: 153
Baraz Sergey wrote:
Quote:
вот метод, который возвращает среднюю цену открытия. не уверен, что мы точно такой же метод добавим в ОК, т.к. хронология транзакций не совсем правильно в нём учитывается (когда в ЛИФО продаётся то, что ещё не куплено), но в качестве примера должен подойти.
Спасибо, на праздника по тестю.

Что-то у меня тут возникла маленькая затупка на ровном месте.
Простая индикаторо-следящая система передвигает лимитник вслед за ценой. И вот такой простенький код
Code:
_Order.Price = 0.7;
_Order.Replace();

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

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

В чем м.б. затупка ?


Top
 Profile  
 
PostPosted: Thu May 05, 2011 6:11 pm 
Offline

Joined: Tue Aug 05, 2003 3:43 pm
Posts: 6817
А где написано, что старый ордер остается?


Top
 Profile  
 
PostPosted: Thu May 05, 2011 8:00 pm 
Offline

Joined: Thu Feb 10, 2011 8:22 am
Posts: 153
Dr. Anton Fokin wrote:
А где написано, что старый ордер остается?
Гоняю систему в режиме OQ Live на бумажном счету ИБ.
Написано соответственно в ОК портфолио и в TWS Trade Log


Top
 Profile  
 
PostPosted: Thu May 05, 2011 8:57 pm 
Offline

Joined: Tue Aug 05, 2003 3:43 pm
Posts: 6817
Так покажите. Нам же не видно. Реплейс должен замечательно работать и "старой" заявки не должно оставаться.


Top
 Profile  
 
PostPosted: Thu May 05, 2011 9:28 pm 
Offline

Joined: Thu Feb 10, 2011 8:22 am
Posts: 153
Dr. Anton Fokin wrote:
Так покажите. Нам же не видно. Реплейс должен замечательно работать и "старой" заявки не должно оставаться.
Дык, и моя так думала,
но в прямоугольнике передвижка лимита реплейсом.
Image
Система простенькая трендоследящая ордера с тексом "Sell Entry" только в одном месте выставляются


Top
 Profile  
 
PostPosted: Fri May 06, 2011 11:11 am 
Offline

Joined: Thu Feb 10, 2011 8:22 am
Posts: 153
Baraz Sergey wrote:
Quote:
Чтобы не тратить время на договоры лучше просто добавить еще одну опцию - направление перебора - и пусть каждый ... как он хочет


вот метод, который возвращает среднюю цену открытия. не уверен, что мы точно такой же метод добавим в ОК, т.к. хронология транзакций не совсем правильно в нём учитывается (когда в ЛИФО продаётся то, что ещё не куплено), но в качестве примера должен подойти.
Сергей, явно трабл в вычисленииImage
Две подряд продажи по 0.08 и 0.11 по 1 лоту
Ваша функция возвращает цены этих сделок, а должна возвращать среднюю.


Top
 Profile  
 
PostPosted: Fri May 06, 2011 12:15 pm 
Offline

Joined: Wed Oct 08, 2003 1:06 pm
Posts: 833
да, там нужно в коде заменить строки

if (buyVolume == 0)
break;

на

if (openVolume == 0)
break;


Top
 Profile  
 
PostPosted: Fri May 06, 2011 3:27 pm 
Offline

Joined: Wed Oct 08, 2003 1:06 pm
Posts: 833
Quote:
Тема про менять шрифт в Output window? Поискал на форуме - вроде никакого ответа не нашел можно ли это делать и если можно, то как.


в новой версии ОК появится класс Appearance, в нём есть свойство OutputWindowFont, так что вы сможете менять шрифт окна Output прямо из кода стратегии/сценария.

например строка:
Code:
Appearance.OutputWindowFont = new System.Drawing.Font(Appearance.OutputWindowFont, System.Drawing.FontStyle.Italic);

сделает шрифт Italic


Top
 Profile  
 
PostPosted: Fri May 06, 2011 4:50 pm 
Offline

Joined: Mon Apr 25, 2011 3:11 pm
Posts: 20
Baraz Sergey wrote:
сможете менять шрифт окна Output прямо из кода стратегии/сценария


Отлично! Сергей, спасибо!


Top
 Profile  
 
PostPosted: Tue May 10, 2011 12:44 pm 
Offline

Joined: Thu Mar 10, 2011 10:09 pm
Posts: 582
привет!
Я правильно понимаю, чтобы поставить 64 бит версию OQ
надо чтобы
1. Железяка поддерживала
и
2. Операционка поддерживала. Я для Win server специальные версии видел 64 бит. Соответственно на обычный Win Server OQ 64 бита ставить смысла нет ?
Это все вообще будет иметь смысл на хостируемой VPS 2ггц и 2Гб ?


Top
 Profile  
 
PostPosted: Tue May 10, 2011 1:05 pm 
Offline
Site Admin

Joined: Thu Jul 17, 2003 10:39 am
Posts: 1478
OQ 64 бита ставится на 64-битную операционку, будь-то windows server, vista, xp, win7
Фактор разрядности операционки определяющий - остальное не важно.

_________________
SmartQuant Development Team


Top
 Profile  
 
PostPosted: Thu May 19, 2011 2:55 pm 
Offline

Joined: Thu Feb 10, 2011 8:22 am
Posts: 153
Добрый день!

Как внутри кода проекта поучить Имя_Солюшен и Имя_Проекта ?
Есть к.н. "системные_переменные" возвращающие их имена и свойства ?


Top
 Profile  
 
PostPosted: Thu May 19, 2011 3:00 pm 
Offline

Joined: Tue Aug 05, 2003 3:43 pm
Posts: 6817
Совсем нету. А зачем, если не секрет?


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 435 posts ]  Go to page Previous  1 ... 9, 10, 11, 12, 13, 14, 15 ... 29  Next

All times are UTC + 3 hours


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Group