Compare commits

...

898 Commits
15089 ... 16632

Author SHA1 Message Date
Martin-Molinero
6351773a01 Option universe resolution improvements (#8324)
* Option universe improvements

- Improvement for resolution handling of option universes, affecting
  performance in live mode. Adding regression algorithm

* Minor fix for research test
2024-09-16 10:22:58 -03:00
Jhonathan Abreu
bf4b08e202 Fix: adjust option expiry reference date (#8322)
* Fix: adjust option expiry reference date

* Add universe files

* Update data and other minor changes

* Minor changes

* Add regression algorithm summary
2024-09-13 18:22:26 -04:00
Jhonathan Abreu
fa9ff399cc Euro Stoxx 50 Index and Index Futures support (#8278)
* EUREX data

EUREX data model and sample data

* Add EUREX futures expiry function and sample algorithms

* Add EuroStoxx50 futures map and factor files

* Reduce eurex data for repo

* Map eurex market to primary exchange

* Update Euro Stoxx 50 (FESX) map and factol files

* Update Euro Stoxx 50 (FESX) minute data

* Added EURSD data

* Added 2 basic FESX futures algorithms in CSharp and Python (#2)

* Add regression algorithms

* Update regression algorithms and data

* Minor change

* Cleanup

---------

Co-authored-by: paulius-an <118921953+paulius-an@users.noreply.github.com>
2024-09-12 10:00:16 -04:00
Jhonathan Abreu
16c4259342 Add QCAlgorithm.OptionChain() method to fetch option chains (#8316)
* Add new QCAlgorithm.OptionChain method to get full data option chain

* Add extension method to get canonical symbol

* Support future options in new OptionChain method

* Replace option chain provider with OptionChain method in some regression algorithms

* Add new regression algorithms for OptionChain method

* Replace option chain provider with OptionChain method in some regression algorithms

* Minor

* Cleanup

* Minor changes in regression algorithms

* Minor adjustments
2024-09-11 15:15:51 -04:00
Ricardo Andrés Marino Rojas
724d0b06a5 Add extra argument in QuantBook.UniverseHistory() for using an IDateRule (#8301)
* First draft of the solution

* Handle end date better

* Improve unit tests

* Add extra argument in missing method

* Nit change

* Nit change

* Nit change

* Undo changes to C# generic UniverseHistory()

* Address suggestions

* Improve unit test

* Add null checks

* Minor adjustment

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-09-11 13:41:57 -03:00
Ricardo Andrés Marino Rojas
ba7fe05574 Add BeforeMarketOpen() and AfterMarketClose() date rules (#8311)
* First draft of the solution

* Add unit tests

* Improve unit tests

* Nit changes
2024-09-10 15:56:31 -03:00
Ricardo Andrés Marino Rojas
50437946e2 Add missing end_date in python regression algorithm (#8315) 2024-09-10 14:33:44 -03:00
Ricardo Andrés Marino Rojas
418970bb48 Add TravisExclude category to failing CI unit test (#8313) 2024-09-10 13:25:41 -03:00
Roman Yavnikov
bef045a360 Fix: Get GroupOrders ByBrokerageId (#8310)
* fix: Get GroupOrders ByBrokerageId

* test:feat: return all combo orders with the same brokerageId
2024-09-10 13:25:22 -03:00
Jhonathan Abreu
49bf436aa2 Remove Lean path info from runtime exceptions (#8309)
* Strip lean path info from runtime exceptions

* Minor fix
2024-09-09 17:54:29 -04:00
Jhonathan Abreu
e29bb2c5e0 File-based options universe (#8212)
* Initial options universe with greeks implementation

* Options universe improvements

* Address peer review

* File based options universe fixes and improvements.

- Adjust OptionUniverse start-end times and period.
- Adapt unit tests and some algorithms to pass with new options universe selection.

* Updated options regression algorithms stats for new universe data

* Updated options regression algorithms stats for new universe data

* Updated options regression algorithms stats for new universe data

* Updated options regression algorithms stats for new universe data

* Updated options regression algorithms stats for new universe data

* Option chain provider with new options universe

* Allow canonical option history requests

* Address peer review

* Address peer review

* Fix symbols parsing in OptionUniverse

* Fix universe selection subscriptions start time to not include extended market hours

* Minor changes

* Minor changes

* Peer recommended changes and fixes

* Update regression algorithm stats

* Update regression algorithms stats and minor fixes

* Fix option chain provider history request

* Round option indicators values

* Added option universe csv header property

* Update regression algorithms stats

* Update regression algorithms stats

* Data fixes and regression algos stats update

* Unit test fixes

* Minor changes

* Option chain handling in live trading data feed

* Minor changes

* Added processed data provider

* Fix thread-safety violation in Slice class

* Minor change

* Update options filter universe API to use OptionUniverse data

Add new filter methods for greeks, IV and open interest

* Option filter universe api updates

* Add OptionUniverse history regression algorithms

* Add regression algorithms for new options filter universe api methods

* Added options greeks data and updated regression algorithms

* Address peer review

* Address peer review

* Add more assertions to new options filter api regression algorithms

* Minor performance improvement.

Reduce greeks binomial model steps to 140

* Minor tests updates

* Greeks numerical models performance improvements

* Greeks numerical models performance improvements

* Revert array pool change for option pricing numerical models

* Update default dividend yield provider depending on option type

* [TEST]

* Add helper method con calculate time till expiration

* Use double in price option numerical models

* Implied volatility calculation improvements

- Adjust root finding method accuracy as a factor of the option price
- Use BSM to get a first guess

* Cleanup

* Some regression algorithms and unit tests cleanup

* Regression tests updates after rebasing from master

* Add universe files

* Self review and cleanup

* Minor regression tests updates after rebase

* Fix: set data time zone to same as exchange tz for options universes

* Minor change

* Minor change

* Fix for live trading options universe selection

* Keep underlying when aggregating collections in BaseDataCollectionAggregatorEnumerator

* Update index options regression algorithms stats

* Minor change

* Address peer review

* Memory usage improvements

* Minor build fix

* Minor changes and test fixes

* Cache symbols in OptionUniverse

* Cleanup

* Fix index option creation in OptionUniverse

* Use cached underlying SID when parsing from string

* Abstract symbols cache to BaseDataCollection

* Return actual underlying symbol when mapping decomposing ICO ticker

* Address peer review

* Minor performance improvements reduce garbage

* Limit Symbols and SIDs cache size to help with memory usage

* Minor fix in symbols and sid cache cleanup

* Build fix

* Lazily parse greeks on individual access

* Cleanup and tests

* Address peer review

* Minor greeks fix

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-09-09 12:39:31 -03:00
Dennis Yemelyanov
8fcc9f7d4e fix some comments for option security types (#8304) 2024-09-09 11:37:26 -03:00
Andy Geach
5209332074 Update readme.md to remove references to Visual Studio for Mac, which has been discontinued (#8298) 2024-09-06 11:59:28 -03:00
Roman Yavnikov
adfad475cc Feature:TradeStationBrokerage: support ComboMarket && ComboLimit (#8290)
* refactor: adding OrderId in GroupOrderManger

* feat: new support of OrderTypes in TradeStationBrokerageModel
feat: unSupported OrderTypes in CanUpdateOrder's TradeStationBrokerageModel

* feat: AllOrNone property in TradeStationOrderProperties

* feat: unsupported SubmitCrossZero of Combo Order in TSBrokerageModel

* test:feat: submit / update CrossZero Combo Orders

* feat: new Message Brokerage error message
refactor: use new Message in TradeStationBrokerageModel

* feat: setter of Id in GroupOrderManager

* feat: new constructor of GroupOrderManager

* feat: develop GroupOrderCacheManager service

* fix: groupOrderManger.Id in OrderProvider

* fix: incrementOrderGroupOrderManagerID in BrokerageTransactionHandler
feat: add _groupOrderManagerId in OrderProvider

* remove: extra semicolon

* refactor: prevent increment GroupOrderID

* feat: add new Exchanges

* feat: Try Get Group Combo Orders extension

* refactor: ComboORderType in TSBrokerageModel

* remove: implementing of prop ID in GroupOrderManager

* refactor: UnsupportedCrossZeroByOrderType message

* fix: warning of UnsupportedCrossZeroByOrderType

* fix: several exchanges code based on tradier docs
https://documentation.tradier.com/brokerage-api/reference/exchanges

* feat: add missed Exchange in Global class

* refactor: possible update LimitPrice in TSBrokerageModel
test:feat: validate upddate LimitPrice of ComboLimit Order

* refactor: GroupOrderCacheManager
remove: TryGetGroupCachedOrders from extension

* refactor: exchange SPHR to MIAX_SAPPHIRE

* remove: Exchange BYX cuz It is BATS_Y

* refactor: change position of Exchange C2

* refactor: change constructor's access modifier in class Exchange
2024-09-06 10:31:14 -03:00
Martin-Molinero
21fcadf0f8 Ignore failing live future option unit test (#8300) 2024-09-05 16:42:42 -03:00
Ricardo Andrés Marino Rojas
e893e67e9b Throw exception when base currency not found (#8289)
* First draft of the solution

* The same check for crytpo is done before

* Fix failing unit tests

* Remove non perpetual crypto futures from SPDB

* Address requests

* Fix failing unit tests
2024-09-04 12:14:53 -03:00
Alexandre Catarino
3b588d04fb Adds Overload to AddIndexOption (#8291)
* Adds Overload to AddIndexOption

Simplify usage. We don't need to create/add the underlying explicitly, see AddIndexOption(string, Resolution, string, bool) overload.

* Addresses Peer-Review

- Default market is `null` instead of `Market.USA` allowing for `BrokerageModel` setup.
- `AddIndexOption` and `AddIndexOptionContract` methods now return `indexOption` objects.

* Fixes Logic Bug
2024-09-04 10:30:05 -03:00
Ricardo Andrés Marino Rojas
e81bcbb987 Improve PythonIndicator.IsReady implementation (#8287)
* First draft of the solution

* nit change

* Add improvements

* Fix failing unit tests

* Add improvements
2024-09-04 10:07:13 -03:00
Roman Yavnikov
96e91b446d Fix: #8226, update spdb binance/binanceus (#8293)
* feature: update binance spdb data

* feature: update binanceus spdb data

* test:fix: EURUSDC stable coins conversation
2024-09-04 10:05:07 -03:00
Ricardo Andrés Marino Rojas
403f0348bd Update Bybit SPDB (#8294)
* Update Bybit SPDB

* Remove trailing comma
2024-09-03 17:55:12 -03:00
Ricardo Andrés Marino Rojas
eeeb310438 Update minimum price variation of some entries of CME futures in SPDB (#8288)
* Update some entries of CME futures in SPDB

* Adjust 6B minimum price variation
2024-08-28 19:59:40 -03:00
oussamanahdi
271f0bb08e Update readme.md (#8286) 2024-08-26 19:11:04 -03:00
Ricardo Andrés Marino Rojas
3a09c70851 Fix warm up indicator bugs (#8279)
* Potential solution

* Try a different approach

* Improve unit tests

* Nit change

* Improve implementation

* Fix another bug and improve unit tests
2024-08-26 10:20:40 -03:00
Roman Yavnikov
f31251732e Fix: Coinbase MinimumOrderSize tests based on new SPDB data (#8276)
* test:fix: minimValue based on new SPDB data

* fix: Estimated Strategy Capacity in FractionalQuantityRegressionAlgorithm
2024-08-23 11:47:45 -03:00
Roman Yavnikov
9baacdbdd6 feat: Coinbase SPDB update (#8273) 2024-08-22 17:42:58 -03:00
Martin-Molinero
363d469d6a Minor indicator history fix (#8270)
* Minor indicator history fix

- Take into account warmup period when used, the last bar of the warmup
  period is counted as a data point.
- Fix bug where in some cases the last data point could of been missed
  and the indicator not updated with it

* Minor tweak
2024-08-22 16:48:26 -03:00
Ricardo Andrés Marino Rojas
c186addf94 Add missing price magnifier in SPDB (#8271) 2024-08-22 16:44:26 -03:00
Ricardo Andrés Marino Rojas
17049dcd56 Fix null exception thrown in SubscriptionManager.ScanPastConsolidators (#8267)
* Initial draft of the solution

* Improve implemetation

* Nit change

* Address requests

* Switch from LinkedList ot List

* Fix bug
2024-08-22 09:55:41 -03:00
Jhonathan Abreu
d88387ac67 Extend Python wrappers error messages (#8257)
* Implement runtime checks for python wrappers

* Implement runtime checks for python wrappers

* Add more python wrappers runtime checks

* Add dictionary conversion unit tests

* Add python wrappers runtime checks for properties

* CLeanup base python wrapper messages
2024-08-19 14:27:32 -04:00
Ricardo Andrés Marino Rojas
74c3501ed3 Fix bug for history requests with custom symbols (#8262)
* Potential solution to the bug

* Add test file

* Fix bugs

* Address requested changes
2024-08-19 15:26:42 -03:00
Ricardo Andrés Marino Rojas
a543af71dc Solve bug (#8256) 2024-08-19 11:57:21 -03:00
Jhonathan Abreu
9b332c2149 Dividend yield calculation fix (#8264)
* Fix dividend yield calculation

* Get security price as input for dividend yield provider

* Account for splits in dividend yield provider

* Fix split adjustment for dividend yield calculation

* Use right dividend yield in options indicators
2024-08-19 09:30:05 -04:00
keshavdalmia10
1e620e54fe Feature 8132 implement vortex indicator (#8242)
* Implemented the vortex indicator.

* changed the vortex.cs calculations

* chore: Refactor VortexTests.cs and QCAlgorithm.Indicators.cs

* Refactor VortexTests.cs

* made changes according to the comments

* used indicator exxtension methods

* made changes in the naming convention and added condition for division by zero.

* Using composite indicators to clean up

---------

Co-authored-by: Jhonathan Abreu <jdabreu25@gmail.com>
2024-08-14 15:43:21 -03:00
Martin-Molinero
7879795207 Enable daily precise end time by default (#8254)
* Default daily precise end times

- Enable by default daily precise end times. Updating stats
- Minor fix for algorithm manager consolidator updates, adding new regression test
  asserting behavior and updating others
- Minor fix for SubscriptionData creator avoid round down on warmup if
  not appropiate
- Adjust consolidators to emit on daily strict end times if requested
  daily resolution and setting enabled
- Updating regression algorithms

* Skip daily data on extended market hours

* Some cleanup and self review

* Revert unrequired change
2024-08-14 12:49:56 -03:00
Noah Misch
d2d366e3f9 Fix sign of order quantity in example algorithm OnMarginCall(). (#8251)
Despite the comments about avoiding margin calls and about padding, this
turned a proposed sale of 100 shares into a *buy* of 110 shares.
2024-08-12 17:40:51 -03:00
Ricardo Andrés Marino Rojas
5226b7a468 Add more options to Field class (#8228)
* First draft of the solution

* Reduce duplication and add more properties

* Add regression tests

* Add xml docs

* Add unit tests

* Improve regression and unit tests

* Address requested changes

* Address request and improve unit tests

* Add unit test and fix bug

* Improve unit tests and implementation

* Nit change

* Address reviews

* Improve regression tests

* Address requests

* Fix bug

* Address requests
2024-08-07 19:08:34 -03:00
FemtoTrader
1947a58541 Implements new indicator - CKS - ChandeKrollStop (#8198)
* Implements ChandeKrollStop

* readonly

* Move IsReady/WarmUpPeriod above the constructors

* remove private _period

* minor

* rename Stops to Short/Long

* using Maximum/Minimum

* fix tests

* rename some variables and use movingAverageType for ATR

* movingAverageType
2024-08-07 14:51:39 -03:00
Roman Yavnikov
1bca3f6081 feat: missed reference on DownloaderDataProvider in Lean.Launcher (#8247) 2024-08-07 14:51:05 -03:00
Noah Misch
2b1136e446 Fix algorithms using OnData(TradeBars) w/o using arg or other OnData(). (#8245)
Commit d24f665ee4 removed the
Engine/AlgorithmManager.cs support for OnData(TradeBars), making these
methods dead code.  Hence, some of these algorithms no longer placed
orders.  Fix by changing OnData(TradeBars) to OnData(Slice).  Files that
use the TradeBars argument or use OnData(Dividends) have the same
trouble; leave them for future work.
2024-08-06 10:15:56 -03:00
Roman Yavnikov
86fcc40c3e Feature: Generic brokerage downloader wrapper (#8235)
* feat: new constructor of AlgorithmNodePacket

* refactor: extract JobQueue configuration

* remove: not used `using` in IDataDownloader

* feat: create BrokerageDataDownloader

* Revert "refactor: extract JobQueue configuration"

This reverts commit 5778936b71.

* Revert "feat: new constructor of AlgorithmNodePacket"

This reverts commit d7a565ff76.

* feat: new config `data-download-brokerage` in DataDownloadProvider

* refactor: initialize in BrokerageDataDownloader

* remove: not used `using` in Program's DataDownloadProvider

* remove: not used ref on QuantConnect.Queue proj

* refactor: use default market based on SecurityType

* refactor: MarketName in DataDownloadConfig struct
test:feat: validate MarketName

* feat: support Canonical Symbols in BrokerageDataDownloader

* remove: not used command arguments

* feat: init CacheProvider of IOptionChainProvider in Downloader

* feat: add brokerage message event in BrokerageDataDownloader
2024-07-31 19:02:13 -03:00
Jhonathan Abreu
9eb484625d Default option pricing models for options indicators (#8229)
* Set best recommended model based on option style.

The best option model will be used in options indicators based on option style if not specified

* Reduced Greeks/IV numerical models steps to 100

* Minor fixes

* Minor changes and improvements

* Changed default pricing model for IV

* Minor performance improvements

* Minor performance improvements and fixes

* Minor change

* Minor regression algorithm fix

* Update greek indicators internal IV indicator only when not user provided

* Revert unnecessary changes

* Minor changes

* Cleanup
2024-07-30 10:15:21 -04:00
FemtoTrader
85ca5be258 Implements new indicator - RSV - Rogers-Satchell volatility (#8183)
* implement Rogers-Satchell volatility

* naming RSVolat to avoid confusion between volume and volatility

* fix InitializeIndicator call

* fix AcceptsRenkoBarsAsInput test

* add symbol parameter to InitializeIndicator

* Update RogersSatchellVolatility.cs

* some fixes after review

* Return 0 when Open High Low or Close is 0

* IBaseDataBar
2024-07-29 14:47:16 -03:00
Martin-Molinero
9a84a6bd17 Minor test brokerage security provider improvement (#8231) 2024-07-29 13:41:37 -03:00
Martin-Molinero
a46acef9f8 Minor improvements (#8223)
- Liquidate takes into account invested flag
- Minor tweaks for symbol representation parsing
2024-07-23 12:18:26 -03:00
keshavdalmia10
69fa2fd689 Made changes in the ParseOptionTickerOSI function. Now it can handle … (#8219)
* Made changes in the ParseOptionTickerOSI function. Now it can handle both with and without space

* added new function GenerateOptionTickerOSICompact and added the test cases for it, expanded test cases for ParseOptionTickerOSI

* added assertions for strikePrice and date, corrected the indentation
2024-07-23 11:23:11 -03:00
Martin-Molinero
2df58bbca3 Accept live UniverseProvider returning null (#8222)
- Similar to HistoryProviders and Live DataQueueHandler calls, adjust
  live Universe provider manager to handle null returned values
2024-07-23 10:30:19 -03:00
Martin-Molinero
050030bca8 Minor improvement to Invested holdings flag (#8221) 2024-07-23 10:27:40 -03:00
FemtoTrader
7e40b4f1ab Implements new indicator - SOBV - Smoothed On Balance Volume (#8180)
* fix conflict

* fix all SmoothedOnBalanceVolumeTests tests except AcceptsRenkoBarsAsInput

* fix InitializeIndicator call

* fix AcceptsRenkoBarsAsInput test

* add symbol parameter to InitializeIndicator

* shorter
2024-07-22 18:27:52 -03:00
FemtoTrader
229d636628 implements generate_reference_data_from_talib.py (#8196) 2024-07-22 14:50:24 -03:00
FemtoTrader
034bf3d8ae add script using tulipy (#8194) 2024-07-22 14:43:33 -03:00
Martin-Molinero
31b32442c8 Fix Alpaca option order types (#8220) 2024-07-22 14:24:47 -03:00
Ricardo Andrés Marino Rojas
9a92933397 ARIMA indicator error handling (#8218)
* First draft of the solution

* Add comments

* Address requests

* Nit change

* Fix bug
2024-07-22 14:24:12 -03:00
Ricardo Andrés Marino Rojas
97959d560a Add liquidate method overloads (#8210)
* First draft of the solution

* First draft of the tests

* Nit changes

* Nit change

* Add improvements

* Improve unit tests

* Regression algos

* Nit change

* Nit changes

* Improve unit tests

* Improve unit test

* Nit change

* Address reviews
2024-07-22 12:48:53 -03:00
Martin-Molinero
0352a0b07c Fix Alpaca Order Fees (#8217)
- Fix alpaca order fees. Expanding unit tests
- Improve base brokerage test framework
2024-07-22 12:48:34 -03:00
FemtoTrader
bd87ba6f14 Implements new indicator CHOP - Choppiness Index (#8178)
* WIP

* Implement CHOP

* 0m instead of 0

* readonly

* doc - param

* fix InitializeIndicator call

* return 100 when max_high = min_low

* remove unused imports

* remove unused imports

* add symbol parameter to InitializeIndicator

* Update ChoppinessIndex.cs

* Update ChoppinessIndex.cs

* decimal

* fix testing IsReady

* move WarmUpPeriod
2024-07-22 12:14:53 -03:00
Martin-Molinero
ab601cbb08 Minor fix for cross order id (#8213) 2024-07-19 15:20:31 -03:00
FemtoTrader
72a1bd4c48 Implements new indicator StochRSI - Stochastic Relative Strength Index (#8163)
* tests passing except ResetProperly and WarmsUpProperly

* doc

* minor fixes

* doc - return

* fix InitializeIndicator call

* workaround ResetsProperly

* fix WarmsUpProperly test

* remove WriteLine

* remove WriteLine

* cr

* fix data

* open high low defaults to close when these columns don't exist into data

* simplify using ternary operator

* better fix for ResetsProperly

* fix some code conventions issues

* fix some review issues

* Update StochasticRelativeStrengthIndex.cs
2024-07-19 09:26:39 -03:00
Martin-Molinero
3bdde74096 Minor brokerage testing improvements (#8209) 2024-07-18 14:34:29 -03:00
Roman Yavnikov
ba626f18d2 Feature: Implementation Alpaca Brokerage (#8203)
* feat: Alpace models implementation

* Address reviews

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-07-16 12:26:26 -03:00
FemtoTrader
12f6263d8b Implements new indicator VWMA - Volume Weighted Moving Average (#8161)
* WIP

* private fields are camelCased

* private fields starts with underscore

* remove unused imports

* fix WarmsUpProperly test

* fix InitializeIndicator call

* IndicatorValueIsNotZeroAfterReceiveRenkoBars

* add constructor

* return close price if _sumV=0

* no Renko bars

* some fixes after review
2024-07-16 11:14:39 -03:00
FemtoTrader
14db9caf90 Implements new indicator ForceIndex (#8155)
* WIP

* All tests are passing except AcceptsRenkoBarsAsInput

* Update QuantConnect.Tests.csproj

* comment formating and use input.EndTime

* fix AcceptsRenkoBarsAsInput test

* fix InitializeIndicator call

* add symbol parameter to InitializeIndicator

* FI above FISH
2024-07-16 11:14:14 -03:00
Martin-Molinero
dda950b6e4 Test 2024-07-15 16:05:31 -03:00
Martin-Molinero
9b3400e9d1 Delete google9161359af9633398.html 2024-07-12 16:50:37 -03:00
Martin-Molinero
162d3cbca2 Add files via upload 2024-07-12 16:43:24 -03:00
Martin-Molinero
53c2a214a1 Improve indicator warmup (#8192)
* Improve indicator warmup

- Allow indicator warmup to handle multiple symbols, used for option
  greeks. Adding regression test
- Improve indicator history to handle specific T types. Adding unit test
- Remove period, and historical underlying volatility, from IV so
  simplify warmup behavior

* Address review, fix minor issues
2024-07-11 16:16:49 -03:00
FemtoTrader
8136a73801 Implements new indicator IBS - Internal Bar Strength (#8151)
* Implement new indicator IBS

* remove using System

* typo

* doc fix

* Implement new indicator IBS

* remove using System

* typo

* doc fix

* inherit TradeBarIndicator and return 1m when High=Low

* duplicate spy_with_ibs

* returns 0.5 when High=Low
2024-07-11 16:13:31 -03:00
Ricardo Andrés Marino Rojas
554a82527f Fix minor warnings (#8190)
* Fix CA1847 warnings and some CA1307 warnings

* Fix CA1823 and CS0169

* Fix CA1820 warnings

* Address requested changes
2024-07-10 14:17:27 -03:00
Ricardo Andrés Marino Rojas
8b312efd0c Fix CA1829 warning (#8188)
* Fix CA1829 warning

* Fix failing test
2024-07-10 14:08:28 -03:00
FemtoTrader
fcb33d8ba3 implements McGinleyDynamic (#8189) 2024-07-10 11:41:56 -03:00
Ricardo Andrés Marino Rojas
a7efcfe9d5 Fix CS1570 and CS1572 warnings (#8187)
* Fix CS1570 and CS1572 warnings

* Address requested changes
2024-07-10 11:16:16 -03:00
Ricardo Andrés Marino Rojas
5a7a162d34 Fix warnings CA1574 (#8186) 2024-07-09 17:52:07 -03:00
Martin-Molinero
268285e2b3 Minor fix for Mis-Aligned Timestamps from IndicatorHistory (#8185)
* Minor fix for Mis-Aligned Timestamps from IndicatorHistory

- Minor fir for mis-Aligned Timestamps from IndicatorHistory. Adjusting
  unit test to reproduce issue.

* Add another assert to indicator history tests
2024-07-09 17:09:12 -03:00
FemtoTrader
db1f63bae7 Add ZLEMA to MovingAverageTypeExtensions.cs and MovingAverageType.cs (#8177)
* add ZLEMA to Indicators/MovingAverageTypeExtensions.cs and Indicators/MovingAverageType.cs

* add new MA (ZLEMA) to test suite
2024-07-09 17:07:59 -03:00
Ricardo Andrés Marino Rojas
99a949586c Fix warnings part 12 (#8182)
* First part of the warnings

* Second half of the changes
2024-07-09 11:08:42 -03:00
Jhonathan Abreu
e0c90e8c04 Minor changes in option chain fetching algorithms (#8175) 2024-07-09 10:55:45 -03:00
Martin-Molinero
12644f8b2a Minor fixes for IndicatorHistory and IV (#8174)
* Minor fixes for IndicatorHistory and IV

- Minor fix for IndicatorHistory, use ScaledRaw data normalization mode
  for option indicators. Adding unit test
- Expand the IV expected upper range to 400%, given values can be higher
  than previous value of 200%
- Adjust IV to use smoothing function only when both option calculations
  succeed

* Updating regression algorithm expected greeks, minor change
2024-07-09 10:54:55 -03:00
FemtoTrader
28f9db194e fix naming (#8168) 2024-07-08 12:32:40 -03:00
Martin-Molinero
6c30157fab Remove universe selection on extended market dates (#8160)
- Remove universe selection on dates with extended market hours only
- Updating regression algorithms
- Expand date & time rules API to support specifying whether extended
  market hours only dates are desired or not
2024-07-08 11:58:50 -03:00
FemtoTrader
014ec7f626 Implement new indicator - ZLEMA - Zero Lag Exponential Moving Average (#8148)
* Implement new indicator ZLEMA

* Add script to generate reference data from talipp

* Some review fixes

* description

* use isReady

* use Delay(...)

* simplify ComputeNextValue

* Minor tweaks addressing review

* replace DateTime.UtcNow for specific date time instances

* remove unused imports

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-07-08 11:58:05 -03:00
Roman Yavnikov
2941210d20 fix: lock of place first part of cross zero order (#8157) 2024-07-05 16:52:31 -03:00
Louis Szeto
6185a4c6a4 Option Strategy Filters for Jelly Roll and Ladder (#8150)
* add option filter strategy

* unit test

* regression test
2024-07-05 16:31:38 -03:00
Ricardo Andrés Marino Rojas
16a737ee26 Fix most of CA1725 warnings (#8154)
* Fix CA1725 warning

* Address requested changes
2024-07-05 16:19:56 -03:00
Martin-Molinero
ee35c75e62 Minor indicator test suite improvements (#8153)
* Minor indicator test suite improvements

- Simplify and improve indicator test suite assertions
- Reduce indicator suite run time

* Fix DividendYieldProviderTests dependency
2024-07-05 15:10:12 -03:00
Ricardo Andrés Marino Rojas
0a0c012ae9 Fix second half of the CA1051 warnings (#8140)
* Fix second half of the CA1051 warnings

* Address requested changes
2024-07-05 13:54:03 -03:00
Ricardo Andrés Marino Rojas
574eafd00d Add missing endpoint in C# API Client (#8143)
* Add C# API ReadBacktestInsights()

* Address reviews

* Address requested changes
2024-07-05 13:53:27 -03:00
Martin-Molinero
eff8b6f2fb Improve indicator history data update (#8141)
- Do not lose data symbol on indicator update during IndicatorHistory
  call. Adding unit test reproducing issue
2024-07-03 17:59:41 -03:00
Ricardo Andrés Marino Rojas
5fd021996a Fix half of the CA1051 warnings (#8137)
* Fix half of the CA1051 warnings

This warning is about not declaring visible instance fields. There are
something about 500 warnings in the solution, mostly in the QuantConnect and QuantConnect.Algorithm.CSharp projects. I aim to fix one of them in this PR and the other half of them in a second one. To fix it, I'm changing the visible instancce fields for properties.

* fix bugs

* Addressing minor reviews

* More minor fixes

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-07-03 15:43:17 -03:00
Martin-Molinero
ee1a6ef87b Add missing terminal link brokerage name (#8135) 2024-07-02 14:11:21 -03:00
Martin-Molinero
3d17e0e122 Minor thread safety interest rate provider fix (#8119)
- Fix race condition in interest rate provider, we were updating the
  private static variable instance before it was ready, causing
  explosions
2024-07-02 13:19:04 -03:00
Martin-Molinero
9229ddbef0 Fix micro gold expirations (#8117)
- Minor fix for micro gold expected expirations. Updating unit tests
2024-07-01 14:12:20 -03:00
Louis Szeto
409f93a3aa Option Strategy Filter Universe (#8088)
* add 1-2 contracts universes

* Add unit tests for 1-2 contract strategies

* refactor

* Call/Put Butterfly

* Iron Butterfly/Condor & Box Spread

* Refactor and bug fixes

* Add regression algorithms

* use AllSymbols

* refactor on peer review, update unit tests

* update regression tests

* update assertion

* update

* remaining assertion

* order hash update

* use helper method on assertion

* fix bug

* Address reviews. Some cleanup and refactor

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-07-01 13:58:30 -03:00
Martin-Molinero
25c635d846 Add indicator helper methods for base Algorithm (#8076)
* Add indicator helper methods for base Algorithm

- Add indicator helper methods for base algorithm. Adding new unit tests

* Expand indicators helper methods

- Expand indicators helper methods, adding support for C# and custom
  indicators too. Adding unit tests
- Expand indicators helper methods to support multiple symbols as input.
  Adding unit tests
- Improve conversion of symbol enumerable from python to C# adding unit
  tests

* Address reviews

- Keep old QB.Indicator methods for backwards compatibility
- Rename new API to IndicatorHistory, matching
  FutureHistory/OptionHistory
- Add new regression algorithms
- Minor improvement to DynamicData so it supports snake name access
2024-07-01 13:27:47 -03:00
Roman Yavnikov
1911cda7b1 Refactor: Handle OrderStatus with Cross Zero Order Collection (#8114)
* empty

* refactor: orderType for SecondCrossZeroOrder

* refactor: handle some specfic orderStatus in CrossZeroOrder process

* refactor: Handle specific OrderStatus in SecondPartCrossZeroOrder

* refactor: handle order status
revert: convertOrderType of CrossZeroSecondPart

* fix: use right collection when removing cross zero order class
2024-06-28 12:05:19 -03:00
Ricardo Andrés Marino Rojas
a2b420cb0a Fix warnings part 8 (#8113)
* Fix CA1819 and CA1002 warnings

Changed the type of Languages statistic in regression tests from
Language[] to List<Language>. By doing that, the warning CA1819 was
removed but then the warning CA1002 was raised. However, this warning
was expected to be excluded from QuantConnect.Algorithm.CSharp.

* Improve implementation

* Simplify code

* Fix bugs
2024-06-28 10:10:30 -03:00
Louis Szeto
cd1aad657d OptionStrategies for Iron Butterfly (#8072)
* Define Iron Butterfly and its buying power model

* Add unit tests

* Add regression test

* Address peer review

* Add short iron butterfly and short iron condor

* Add unit tests on short strategies

* add regression algorithms

* Invert direction of iron butterfly
2024-06-28 10:07:39 -03:00
Louis Szeto
aae6d617fb Option Strategy: Jelly Roll & Ladder (#8092)
* Define Jelly Roll

* Margin Model

* Add universe filter

* unit tests

* add regression tests

* add definitions

* universe filter

* margin model

* unit tests

* bug fix

* unit tests

* regression tests

* typo

* peer review

* peer review 2

* bug fix, address peer review

* minor fix

* Fixes `middleStrike` Parameter Description

The "middle strike" instead of "with higher/lower" to match the parameter description with name.

---------

Co-authored-by: Alexandre Catarino <AlexCatarino@users.noreply.github.com>
2024-06-27 15:58:06 -03:00
Ricardo Andrés Marino Rojas
621d1252b9 Fix label bug in QCAlgorihtm.Python.History() when requesting data for BaseCollection Datasets (#8093)
* First draft of the solution

* Fix bugs

* Fix bugs

* Fix another overloaded method

* Add new unit test

* Address requested changes

* Address requested changes

* Minor tweaks

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-06-27 15:57:25 -03:00
Jhonathan Abreu
6392b5eed0 Minor changes in BaseSetupHandler. (#8112)
Making it able to update currency conversions for specific currencies.
2024-06-26 18:06:26 -03:00
Ricardo Andrés Marino Rojas
ba2d519910 Remove warnings from csproj files (#8108)
* Remove warnings from csproj files

* Leave just 2 warnings

* Nit change

* Leave just 2 warnings
2024-06-26 17:07:51 -03:00
Martin-Molinero
c8446ae26e Refactor AutomaticIndicatorWarmUp settings (#8111)
- Move EnableAutomaticIndicatorWarmUp as an algorithm setting named AutomaticIndicatorWarmUp
2024-06-26 17:02:48 -03:00
Roman Yavnikov
8a34d4a7a3 Refactor: Cross Zero Order event (#8110)
* refactor: reuse OrderEvent
test:refactor: CrossZeroOrder proccess Status update

* clean: extra paddings
2024-06-26 15:06:04 -03:00
Ricardo Andrés Marino Rojas
57f89620a1 Fix warnings part 6 (#8107)
* Fix half of the XML docs missing warnings

* Remove warnings from csproj files
2024-06-26 13:21:53 -03:00
Martin Molinero
47acbd66a2 Revert test breaking change 2024-06-26 10:18:35 -03:00
Ricardo Andrés Marino Rojas
56d36b97d5 Fix warnings part 5 (#8105)
* Add algorithm unit tests

* Add Brokerage unit tests

* Add Common unit tests

* Fix unit test bugs

* Add remaining unit tests

* Address requested changes

* Address requested changes

* Fix failing unit test

* Address requested changes
2024-06-26 10:11:36 -03:00
Roman Yavnikov
a8b106ae3e Feat: Brokerage Cross Position Order (#8051)
* feat: TryCrossPositionOrder
feat: helper methods to CrossPosition

* refactor: get rid CrossOrder +UTests

* feat: test simulator of cross zero orders request

* remove: callback from TryCrossPositionOrder
rename: TryCrossPositionOrder -> TryCrossZeroPositionOrder
feat: handle event of CrossZeroOrder
feat: new prop in CrossZeroOrderRequest
test:feat: write working test imitate of CrossZeroOrdering and assert different params

* feat: temp collection to keep CrossZeroOrder with Lean

* refactor: flag which indicate should we place crossZero order with LeanEvent or not

* refactor: change access modifier

* fix: CrossZero tests

* refactor: property collection instead of variable

* feat: lock context of CrossZeroOrder
feat: helper method for CrossZeroCollection

* refactor: test of cross brokerage ordering

* refactor: CrossZero Brokerage

* fix: lock area

* feat: Update CrossZero Ordering
refactor: CrossZeroOrders tests

* feat: additional test case for CrossZeroOrdering

* feat: Invalid OrderStatus when FirstPart of CrossZero ordering try to place
feat: message property in CrossZeroOrderResponse
refactor: CrossBrokerageTest a little bit

* feat: PossibleUpdateCrossZeroOrder

* refactor: UpdateCrossZeroOrder

* refactor: TimeOut for resetEvent

* refactor: crossZeroOrder change DateTime UtcNow on specific time
refactor: change action scenario for Filled FirstPart of CrossZeroOrder

* refactor: change firstPartQuantityproperty to link of FirstPartOfCrossZero order completely
fix: crossZeroOrder test put orderStatus internally

* feat: additional orderType in CrossZeroOrder tests

* test:remove: not use GetOrderCrossesZero()

* refactor: extra paddings

* rename: TryGetUpdateCrossZeroOrderQuantity instead of IsPossibleUpdateCrossZeroOrder

* refactor: CrossZeroOrder process and models

* remove: interface ICrossZeroOrderRequest

* feat: TradeStation NotSupportUpdate of CrossZeroOrder quantity

* feat: add license
remove: extra validation of variable

* refactor: add validation of quantity update in TradeStationBrokerageModel

* test:feat: canUpdate of TradeStationOrder

* refactor: reuse OrderEvent when we handle FirstPartCrossZeroOrder

* remove: assignment of filled quantity of FirstPartCrossZeroOrder
2024-06-26 10:06:25 -03:00
Jhonathan Abreu
8bd046a6b8 Add support for FTP notifications (#8097)
* Add support for FTP notifications

* Add optional parameters for SFTP notifications with private key

* Add optional "secure" parameter for FTP notifications.

Improve FTP notifications constructor and input checks.

* FTP notification improvements.

Add public key property.
Add multiple constructors and methods for FTP and SFTP notifications with either password or SSH keys.
Encode file contents.

* Address peer review

Add support for FTP notification with string contents

* Minor changes

* Minor changes

* Remove public key argument

* Fixes and minor changes
2024-06-26 10:03:35 -03:00
Alexandre Catarino
9e2b697792 Fixes AwesomeOscillator Helper Order Of Parameters (#8099)
The second and third parameter are `fastPeriod` and `slowPeriod`, but we had `slowPeriod` and `fastPeriod`, which is inconsistent with the class contructor and other indicators with `fastPeriod` and `slowPeriod` parameters.
2024-06-25 17:33:19 -03:00
Ricardo Andrés Marino Rojas
5699fa48fd Fix 4/4 of CA2201 warnings (#8103)
* Fix 4/4 of CA2201

* Remove warnings
2024-06-25 11:13:32 -03:00
Ricardo Andrés Marino Rojas
aa5ab68b47 Fix 3/4 of CA2201 warnings (#8102)
* Fix 2/4 of CA2201 Warnings

* Fix 3/4 of CA2201 warnings
2024-06-24 19:31:23 -03:00
Ricardo Andrés Marino Rojas
f8b169aa51 Fix 2/4 of CA2201 Warnings (#8101) 2024-06-24 17:00:38 -03:00
Ricardo Andrés Marino Rojas
b41df5b0f2 1/4 of the changes of RegressionTestException (#8100) 2024-06-24 15:23:33 -03:00
Jhonathan Abreu
5432c7c6d8 Fix dynamic SPDB unit tests taking too long (#8094)
* Fix dynamic SPDB unit tests taking too long

* Minor improvements in unit tests

* Minor improvements in unit tests

* Cleanup
2024-06-24 14:36:04 -03:00
Ricardo Andrés Marino Rojas
8c33536498 Add algorithm status statistic (#8095)
* First draft of the solution

* Fix bugs

* Fix bugs
2024-06-24 14:19:32 -03:00
Jhonathan Abreu
f0d02feb13 Rename AlgorithmSettings.DailyStrictEndTimeEnabled (#8098)
* Rename AlgorithmSettings.DailyStrictEndTimeEnabled  to DailyPreciseEndTime

* Minor fix
2024-06-24 14:10:11 -03:00
Ricardo Andrés Marino Rojas
0e0e6bd142 Add Tests for MaximumDrawdownPercentPortfolio (#8096)
* First draft of the solution

* Add more unit tests
2024-06-24 13:14:21 -03:00
Jhonathan Abreu
8424e85ade Reduce test files size (#8084) 2024-06-24 13:03:43 -03:00
Jhonathan Abreu
a159950117 Fix: refresh symbol properties using right type for security. (#8087)
Fix for live trading SPDB refresh
2024-06-11 13:50:33 -04:00
Ricardo Andrés Marino Rojas
4ca5cbca7e Add Yearly Date Rule (#8075)
* First draft of the solution

* Add improvements

* Nit changes

* Address requested changes
2024-06-07 15:48:53 -03:00
Jhonathan Abreu
6b963c735c Make SPDB dynamic with periodic updates (#8083)
* Dynamic spdb

* Minor changes and unit test

* Get MHDB and SPDB refresh period from config

* Add databases refresh period to algorithm settings

* Address peer review and add unit test
2024-06-07 15:48:27 -03:00
Ricardo Andrés Marino Rojas
62373ede5b Duplicate Futures.Energies (#8082)
* Duplicate Futures.Energies

* Nit change

* Add unit test
2024-06-06 19:39:05 -03:00
Martin-Molinero
7975a44d1c Revert "Duplicate "Energies" Futures Ticker Shortcut to Energy (#8067)" (#8081)
This reverts commit 23057f24c8.
2024-06-06 15:02:03 -03:00
Ricardo Andrés Marino Rojas
2823155311 Partial fix for bug (#8079) 2024-06-06 13:06:39 -03:00
Martin-Molinero
5f58254839 Minor improvement for python custom default brokerage message handlers (#8078) 2024-06-05 13:22:34 -03:00
Martin-Molinero
e78150aced Fix for custom streaming data live trading (#8077)
- Minor fix for custom streaming data in live trading. Adding unit test
  reproducing issue
2024-06-05 11:51:43 -03:00
Martin-Molinero
9ace77fb87 Fix consolidator scan determinism (#8074)
- Make sure we can scan consolidators deterministically. Adding
  regression algorithm reproduce reported issue
2024-06-04 11:59:09 -03:00
Martin-Molinero
1a3fedb36d Foundation library update (#8069)
* Foundation update

* Minor fixes
2024-06-04 11:57:04 -03:00
Ricardo Andrés Marino Rojas
23057f24c8 Duplicate "Energies" Futures Ticker Shortcut to Energy (#8067)
* First draft of the solution

* Add backwards compatibility

* Address requested changes
2024-06-04 11:52:58 -03:00
Martin-Molinero
529b24ed1b Live Collection unfolding data will skip old data (#8070)
- Minor tweak for live collection unfolding data will skip old data.
  Adding unit test
2024-06-04 11:52:33 -03:00
Louis Szeto
39bfbccd44 Add Protective Collar to Option Strategies (#8025)
* Add Protective Collar Option Strategy

* Add buying power model for Protective Collar

* Add unit test for Protective Collar

* Add regression test for Protective Collar

* Add unit test on position group buying power

* allow same strike for later abstraction

* minor bug fix

* Set up conversion option strategy

* add margin requirement

* add unit tests

* Add regression test

* add reverse conversion definition

* add reverse conversion and refactor conversion/collar margin model

* added/modified unit tests for conversion/reverse conversion

* minor bug fix on unit test, add regression test

* Address peer review

* update new set of IB testing data
2024-06-03 12:38:52 -03:00
Martin-Molinero
ab24ac4ac8 By default reject brokerage side created orders (#8066) 2024-05-31 14:36:17 -03:00
Martin-Molinero
250ba842ba Minor tweak for split (#8068) 2024-05-31 14:35:50 -03:00
Louis Szeto
79a8c66b39 Box Spread Option Strategy (#8041)
* Add box spread definition

* Add box spread margin model

* Add unit tests

* Add regression tests

* minor nit peer review
2024-05-30 11:41:20 -03:00
Ricardo Andrés Marino Rojas
d76c2bfc7d Add FuncTimeRule and FuncDateRule constructors for PyObject (#8061)
* Initial draft of the solution

* Add more unit tests
2024-05-28 17:35:02 -03:00
Martin-Molinero
158df4434c Update readme.md 2024-05-28 15:57:25 -03:00
Martin-Molinero
88d7380a53 Use SPY as default dividend yield for Index/Future greeks (#8056)
- Index and FOPs will use SPY as the default dividend providers, adding regression algorithms for them
2024-05-28 15:48:21 -03:00
Ricardo Andrés Marino Rojas
0f785372f6 Add unit test (#8060) 2024-05-28 15:39:35 -03:00
Martin-Molinero
0acfdbb9e5 Update readme.md 2024-05-28 10:10:15 -03:00
Jhonathan Abreu
40cfcfc336 Fix: Insight constructors not setting correct values (#8058) 2024-05-24 19:02:59 -03:00
Martin-Molinero
9c1824cccf Enhance GetFilePath subdirectory handling (#8057)
- GetFilePath will create subdirectories assuming the last piece of the
  requested path is a leaf. Expanding unit tests
2024-05-24 18:27:57 -03:00
Jhonathan Abreu
f0286c936d Fix: allow non-standard header values in Api.Download API (#8055) 2024-05-24 18:07:23 -03:00
Martin-Molinero
c87693d883 Update readme.md 2024-05-24 15:44:37 -03:00
Jhonathan Abreu
b6e35468db Update pythonnet to 2.0.38 (#8052) 2024-05-24 14:38:53 -04:00
Martin-Molinero
bb675bdddb Improve DQH handling of exceptions (#8054)
- Improve DataQueueHandlerManager handling of exceptions in the used
  data queue handlers. Adding unit tests
2024-05-24 15:29:14 -03:00
Martin-Molinero
d3b5bbaa1b Avoid duplicate data on FF resolution change (#8053) 2024-05-24 11:58:27 -03:00
Martin-Molinero
3a99e0b47c Fix fill forward resolution adjustment on removal (#8049)
* Fix fill forward resolution adjustment on removal

- Fix fill forward resolution adjustment on subscription removal. Adding
  regression algorithm reproducing issue

* Minor fix for undeterminism behavior on security removals and FF res change

* Further improvements and determinism

- Improve regression algorithm add, remove and readd future, asserting
  FF resolution changes
- Adjust universe selection to be deterministic and avoid unnecessary
  FF resolution changes
2024-05-24 10:15:26 -03:00
Martin-Molinero
5f3cd203d3 Fix for live FF enumerator (#8047)
- Adjust live FF enumerator to rely on the base FF enumerator logic and
  just filter out results based on the frontier. Adding unit tests
2024-05-22 13:39:52 -03:00
Martin-Molinero
2c6074bfdb Limit 'forward only indicator' error log (#8046) 2024-05-21 19:15:53 -03:00
Ricardo Andrés Marino Rojas
ad663ded2c Fix bug in FrontMonth() option filter (#8044)
* First draft of the solution

* Nit changes

* Fix bugs

* Nit changes

* More nit changes
2024-05-20 20:04:31 -03:00
Roman Yavnikov
fe2110de96 Feature: Implementation Trade Station Brokerage (#8031)
* refactor: make public futuresMonth Collection

* feat: TradeStation brokerage

* feat: PositionSide for Option in TradeStationOrderProperties

* feat: missed market TradeStation name

* feat: missed config TradeStation

* remove: extra TradeStation code

* remove: pragrma warning

* feat: implement TradeStationFeeModel
2024-05-20 17:58:44 -03:00
Martin-Molinero
549979f84b Update readme.md 2024-05-20 17:32:58 -03:00
Martin-Molinero
d4e7f584f6 Daily data time adjustment (#8001)
* Daily data Time & EndTime Improvement

- Adjust daily data Time & EndTime to actually reflect the time of the
  data used, for example US Equity from 9.30 to 4PM. Adding new unit and
  regression tests

* Refactor solution to use enumerator

- Refactor daily strict end times solution to be through enumerator
  usage, so it applies for history providers too

* Minor fixes

* Revert fill forward enumerator change

- Revert FillForward enumerator causing stats changing, enhancing unit
  tests

* Some cleanup

* Improve handling of live trading FF enumerator

- Improve handling of live trading FF enumerator, by adding support for
  bars to arrive with a delay so we can handle auction close/option
  prices or data providers which might have some delay making the data
  available. Adding new unit tests asserting the behavior
2024-05-20 17:28:03 -03:00
Ricardo Andrés Marino Rojas
c30ea9d293 Handle order types with unsupported security types in IB Brokerage Model (#8029)
* HandleUnsupportedOrderTypesForSecuritiesInIB

* Nit changes

* Nit changes
2024-05-15 22:56:05 +01:00
Jhonathan Abreu
56cfc51f10 Round combo order prices (#8024)
* Round combo order prices

* Combo limit order round fix: use smallest security min price variation

* Minor unit test change

* Improvements and unit tests

* Minor change

* Cleanup
2024-05-15 14:57:30 -04:00
Ricardo Andrés Marino Rojas
cc3c97a814 Improve exception message when generating Annual Performance Statistic (#8022)
* Improve exception message

* Nit changes
2024-05-15 11:45:12 -03:00
Jhonathan Abreu
c82573a2bc Update Pythonnet version (#8021)
* Update regression algorithm to reproduce GH issue #8011

* Update pythonnet version to 2.0.37
2024-05-15 09:11:52 -04:00
Ricardo Andrés Marino Rojas
b147c7ccfd Api Clean up, Documentation and Standarization part five (#8016)
* Update endpoints and add tests

* Remove JsonProperty tags

* Enhance unit tests

* Add live/insights/read/response

* Add missing class

* Remove old insights property

* Improve read live insights unit test

* Nit change

* Fix failing unit tests

* Revert "Fix failing unit tests"

This reverts commit a2b7c1d34e.

* Add Insights.Ticker back

* Nit change

* Address requested changes
2024-05-13 18:14:40 -03:00
Alexandre Catarino
ddea4ec380 Fix Summary for CancelPending (#8020) 2024-05-13 18:09:55 -03:00
Martin-Molinero
1c32144963 Some refactor and cleanup (#8014)
* Some refactor and cleanup

- Some refactor and cleanups
- Improve live trading CI tests speed

* Minor tweak for live trading data feed log
2024-05-10 12:27:00 -03:00
Martin-Molinero
061d5a9971 Update SPX MHDB to match Options (#8013)
- Update the SPX index MHDB entry to match the spx index options, for
  daily resolution selection support
2024-05-10 11:46:29 -03:00
Jhonathan Abreu
7e7fd4d791 Skip security initializer for benchmark security (#8012) 2024-05-09 18:09:34 -04:00
Jhonathan Abreu
b079d32522 Bug python type comparison (#8008)
* Reapply "Python consolidator removal directly from Python (#7995)" (#8006)

This reverts commit f5f2da3f96.

* Reapply "Fix: interface property implementation in python models (#7987)" (#8007)

This reverts commit 356b51f150.

* Fix: PyObject.TryConvert compares c# and py type by reference
2024-05-09 13:20:44 -04:00
Jhonathan Abreu
28baf03250 Improve PythonException stack trace parser (#8002)
* Improve PythonException stack trace parser

* Minor fix

* Minor improvements
2024-05-09 13:20:20 -04:00
Martin-Molinero
356b51f150 Revert "Fix: interface property implementation in python models (#7987)" (#8007)
This reverts commit ab40b5c0b6.
2024-05-09 10:06:07 -03:00
Martin-Molinero
f5f2da3f96 Revert "Python consolidator removal directly from Python (#7995)" (#8006)
This reverts commit bac3ec09b6.
2024-05-09 10:05:37 -03:00
Martin-Molinero
53fb9942d2 Minor optimization parameter json fix (#8005) 2024-05-08 20:05:47 -03:00
Martin-Molinero
e96e2d26a7 Update readme.md 2024-05-08 19:03:59 -03:00
Martin-Molinero
c13643f3ac Minor camelcase tweaks (#8004) 2024-05-08 18:08:57 -03:00
Martin-Molinero
6915a65900 Further camel case cleanup (#8003) 2024-05-08 17:28:47 -03:00
Martin-Molinero
d40ec77379 Refactor to use camel case (#7981)
* Camel case results

- Camel case lean results and streamed packets

* Update packets to camel case
2024-05-08 12:58:33 -03:00
Louis Szeto
bb7a7f26a7 Bug fix on Option Indicator calculation (#7999)
* Handle expired options

* unit test

* Move Zero Checks to Single Location

---------

Co-authored-by: Alexandre Catarino <AlexCatarino@users.noreply.github.com>
2024-05-07 14:03:29 -03:00
Jhonathan Abreu
520e6046ac Update vsdbg version to be supported in the base ubuntu (#8000) 2024-05-07 09:31:51 -04:00
Ricardo Andrés Marino Rojas
a1b6277492 Api Clean up, Documentation and Standarization part four (#7989)
* Update C# response classes for optimization endpoints

* fix bugs

* Fix bugs

* Fix bug

* More tests, API response classes and updates

* Partially revert wrong changes

* Missing file

* Improve unit tests and solve bugs

* Improve implementation

* Minor tweak

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-05-06 20:33:31 -03:00
Jhonathan Abreu
bac3ec09b6 Python consolidator removal directly from Python (#7995)
* Fix: python consolidator reference lost when wrapped

* Make BasePythonWrapper equatable depending on the PyObject underlying reference

* Fix: TryConvert PyObject instances for generic C# types

* Minor unit tests fixes

* Address peer review and add unit tests
2024-05-06 14:44:04 -04:00
Derek Melchin
d6ff16f9da Add new crisis events (#7991)
* Add new crisis events

* Add new enum values
2024-05-06 14:44:07 -03:00
Roman Yavnikov
9fad556903 Remove: log ETA calculation (#7994)
* remove: ETA in data download provider

* remove: log of ETA calculation

* remove: test with ETA downloader
2024-05-03 14:25:10 -03:00
Jhonathan Abreu
021e507ef0 Holdings price adjustment after split (#7985)
* Fix: properly adjust prices after a split

* Minor fixes

* Minor: Adjust cached data on split

* Minor change

* Expand regression algorithms assertions
2024-05-01 17:42:43 -04:00
Jhonathan Abreu
ab40b5c0b6 Fix: interface property implementation in python models (#7987) 2024-05-01 13:58:02 -03:00
Roman Yavnikov
ef23d7b6fe Add Group Symbol and Total Time Execution Logging for Downloading Canonical Data (#7984)
* refactor: modifier static to parse enum and ignore warning

* feat: group symbol when download cannonicial data
feat: log total time execution of download provider
test: right keeping of cannonicial data

* feat: parameter ctor in DataDownloadConfig

* test:feat: additional assertion of wrote data in file

* feat: static FilterGroupDownloadDataBySymbol

* refactor: extract downloader folder path

* try: map file false

* feat: get rid of dataCacheProvider in DownloaderDataProvider

* refactor: get rid mapFile flag

* CI test fix

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-05-01 13:39:34 -03:00
Ricardo Andrés Marino Rojas
17ba9f8b5d Api Clean up, Documentation and Standarization part three (#7982)
* Updates to data/prices C# response

* Update data, account and organization API responses

* remove unnecessary changes
2024-04-29 20:35:51 -03:00
Martin-Molinero
b527a3dd86 Minor fixes (#7980)
- Minor test improvement
- Adjust DownloaderDataProvider to follow the pattern
2024-04-26 14:37:47 -03:00
Ricardo Andrés Marino Rojas
cce8945fe8 Api Clean up, Documentation and Standarization part two (#7964)
* Add improvements

* Add improvments and unit tests

* Add XML comments

* Nit changes

* Add unit tests for OrderJsonConverter

* Improve unit tests

* Address requested changes

* Fix bugs

* Fix bugs

* Fix bugs and self-review

* Fix bugs

* Address requested changes

* Fix unit test bug

* Fix bugs

* Improve unit tests

* Solve bugs
2024-04-26 13:17:34 -03:00
Jhonathan Abreu
9755f8c916 Sourcing remote zipped custom data (#7976)
* Fix: source custom data from remote CSV zipped file

* Fix: Custom data sourcing zip entry names from remote locations

* Address peer review

* Add unit tests

* Minor fix

* Address peer review

* Minor fixes

* Return byte array in IApi.DownloadBytes

* Allow sourcing custom data from specific csv entry in a zipped remote file

* Minor change
2024-04-26 12:15:01 -04:00
Martin-Molinero
2ac435b117 Minor Config.Write Improvement (#7978) 2024-04-25 19:54:11 -03:00
Roman Yavnikov
74d95f1611 Implement Download Project in Lean (#7975)
* feat: init Download proj

* feat: update docker file to copy download proj

* feat: parsing in cmd arguments

* feat: DataDownloadConfig model
feat: add config file
refactor: logic of parsing config

* feat: overrid ToString in DataDownloaderGetParameters

* remove: not used argument command

* feat: calculate downloading % (without ETA time)

* fix: dockfile copy path for DownloaderDataProvider proj

* feat: additional Property in .csproj

* remove: DataProviderFullName prop from DataDownloadConfig

* remove: extra package (ref from Configuration proj)

* feat: ETA calculation of downloading data

* Minor tweak

* rename: namespace of downloaderDataProvider to generic style format

* test: ETA from DownloaderDataProvider

* fix: calculate ETA like real downloading process

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-04-25 19:53:58 -03:00
Jhonathan Abreu
55b056588d Fix option assignment not processed because of existing open order (#7974)
* Fix: option assignment not processed because of existing open order

* Minor change

* Fix unit test
2024-04-24 10:42:41 -04:00
Martin-Molinero
6d9609799a Calling CSharp releases the GIL (#7970)
- Make sure calling CSharp methods, fields, properties releases the GIL,
  this was not hapenning for fiels & properties, adding unit test
  reproducing the issue
2024-04-23 12:46:50 -03:00
Martin-Molinero
8d2ced945b Minor fundamental properties typos (#7971) 2024-04-23 11:48:20 -03:00
Jhonathan Abreu
b8e49a94ad Python models conversion to PEP8 (#7969)
* Python models conversion to PEP8

* Python models conversion to PEP8

* Minor fix
2024-04-23 10:45:36 -04:00
Martin-Molinero
efd90f7ed9 Fundamental pep8 typos ValuationRatios (#7967) 2024-04-22 16:49:07 -03:00
Martin-Molinero
bec6faef9a CashFlowFromInvestingGrowth & CashFlowFromFinancingGrowth Typos (#7966) 2024-04-22 14:18:22 -03:00
Jhonathan Abreu
6bfe45dbcf PEP8 algorithms conversion (#7962)
* PEP8 algorithms conversion

* PEP8 unit tests algorithms conversion

* Minor fixes
2024-04-22 13:59:50 -03:00
Martin-Molinero
8fa824b19e Rename DebttoAssets to DebtToAssets (#7961) 2024-04-22 12:14:44 -03:00
Martin-Molinero
3e4ad661e2 Update readme.md 2024-04-19 19:41:29 -03:00
Louis Szeto
fa886eba79 pep8 conversion of python algos #12 (#7954)
* pep8 conversion

* PEP8 updates/fixes

* Update pythonnet version to 2.0.35

---------

Co-authored-by: Jhonathan Abreu <jdabreu25@gmail.com>
2024-04-19 16:55:48 -04:00
Ashutosh
b64ad5f68a pep8 conversion of python algos (#7957) 2024-04-19 17:24:37 -03:00
Louis Szeto
08a3de9e2d pep8 conversion of python algos #13 (#7955)
* t status
pep8 conversion

* Minor tweaks and rebase

* Various minor fixes

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-04-19 16:14:12 -03:00
Louis Szeto
d2669fb0c2 pep8 conversion of python alphas and benchmark algos (#7956)
* pep8 conversion of alphas

* pep8 conversion of benchmarks

* Various fixes and rebase

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-04-19 14:50:59 -03:00
Louis Szeto
279a7ef235 pep8 conversion on python algos #10 (#7951)
* pep8 conversion

* PEP8 updates/fixes

---------

Co-authored-by: Jhonathan Abreu <jdabreu25@gmail.com>
2024-04-19 12:59:02 -03:00
Louis Szeto
979bd9baef pep8 conversion of python algos #11 (#7952)
* pep8 conversion

* Minor tweak

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-04-19 12:54:50 -03:00
Ashutosh
3c30e255fe pep8 conversion of python algos (#7948)
* pep8 conversion of python algos

* adding 10 more pep8 converted algos

* PEP8 updates/fixes

---------

Co-authored-by: Jhonathan Abreu <jdabreu25@gmail.com>
2024-04-19 10:06:48 -04:00
Jhonathan Abreu
77591f90c7 PEP8 python algorithms conversion (#7950)
* PEP8 python algorithms conversion

* Fix: Get python or c# methods in PythonData as python wrapper

* Convert portfolio models to PEP8
2024-04-18 19:43:48 -03:00
Alexandre Catarino
d1796bd77e Copies RiskParityPortfolioOptimizer to Output Directory (#7949) 2024-04-18 19:19:19 -03:00
Louis Szeto
4a1f30bd96 pep8 conversion of python #7 (#7945)
* pep8 conversion

* PEP8 updates/fixes

---------

Co-authored-by: Jhonathan Abreu <jdabreu25@gmail.com>
2024-04-18 16:12:36 -03:00
Louis Szeto
7e5b8d6243 pep8 conversion of python algo #8 (#7946)
* pep8 conversion

* Minor tweaks

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-04-18 16:08:34 -03:00
Louis Szeto
e8362c12a3 pep8 conversion (#7947) 2024-04-18 16:04:22 -03:00
Louis Szeto
c2ad893f32 pep8 conversion of python algos #5 (#7943)
* pep8 conversion

* Fix: detect python object of python classes derived from c# classes

* Minor PEP8 updates/fixes

---------

Co-authored-by: Jhonathan Abreu <jdabreu25@gmail.com>
2024-04-18 15:53:32 -03:00
Louis Szeto
5eb236834f pep8 conversions of python algos, #6 (#7944)
* pep8 conversions

* Address review. Fix PythonIndicator

* Minor CSharp algo fix

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-04-18 15:15:18 -03:00
Ashutosh
1cae47ab25 pep8 conversion of python algos (#7942)
* pep8 conversion of python algos

* adding 10 more pep8 converted algos
2024-04-18 15:14:56 -03:00
Louis Szeto
ed351c8726 pep8 conversion of python algorithms #3 (#7934)
* raw pep8 conversion

* Minor fixes

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-04-17 19:28:04 -03:00
Louis Szeto
6d5f5dce58 pep8 conversion of python algorithms #4 (#7935)
* pep8 conversion

* PEP8 updates/fixes

* Minor update

---------

Co-authored-by: Jhonathan Abreu <jdabreu25@gmail.com>
2024-04-17 19:27:00 -03:00
Ashutosh
c97c7a3317 pep8 conversion of python algos (#7938)
* pep8 conversion of python algos

* Minor tweak

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-04-17 19:23:54 -03:00
Louis Szeto
ed7f3ebbbf pep8 conversion of python algos #1-25 (#7926)
* pep8 conversion of python algos

* address peer-review

* PEP8 updates/fixes

* More fixes

---------

Co-authored-by: Jhonathan Abreu <jdabreu25@gmail.com>
2024-04-17 17:02:32 -04:00
Louis Szeto
784e497691 pep8 conversion on python algorithms #2 (#7933)
* pep8 conversion

* more

* Minor fix

* Fix related regression algorithm

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-04-17 17:36:53 -03:00
Kristiyan Michaylov
c2bea3c173 Feature 1076 implementing an indicator derivative oscillator (#7884)
* Initial boilerplate code

* Fix build failure

* Initial iteration for the code for Derivative Oscillator code

* Add foundation for unit tests

* Add reset method for test

* Add test case

* fixed test cases, all tests pass

* Put placeholder for IsReady change

Not implemented, as test cases fail when change is uncommented

* Update documentation and change class name

* Change names for Derivative Oscillator to more meaningful

* Add DO extension to create the indicator

* Provide variable definitions with var, replace old test file with new

* Use chaining for indicators creation

* Add test based on external data

* Change test file

* Fix WarmUp test + alphabetical order + rename indicator class

* Make all tests run except for external data tests

* Fixed warmup period and fixed the ResetsProperly test case

* Removed unused directives

* Add output directory for Derivative Oscillator test

* Minor tweaks

---------

Co-authored-by: HaentjeGH <l.m.j.haenen@student.tue.nl>
Co-authored-by: ivkozlov <ivkozlov@ozon.ru>
Co-authored-by: DanielVanRijswijk <d.j.v.Rijswijk@student.tue.nl>
Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-04-17 16:34:57 -03:00
Martin-Molinero
b1a2f8f06c Bybit SPDB update (#7940)
- Bybit SPDB update
2024-04-17 16:06:31 -03:00
oussamanahdi
a83809c122 Update readme.md (#7939)
Fixed logo link
2024-04-17 15:21:05 -03:00
Jhonathan Abreu
17ba1088bd Pythonnet PEP8 fixes (#7931)
* Improve python exception message for cases when derived class uses member names already defined in base C# classes

* Update pythonnet version to 2.0.33

* Update error message

* Pythonnet version bump to 2.0.34. Minor unit test fix

* Enhance pythonnet overload tests

---------

Co-authored-by: Jared <jaredbroad@gmail.com>
Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-04-17 14:25:25 -03:00
oussamanahdi
3da1afb2fe Update readme.md (#7937)
dark/light mode algoseek logo / link to https://www.algoseek.com/lean.html
2024-04-17 14:23:06 -03:00
Martin-Molinero
dfbe85ca85 PythonData Pep8 Support (#7936)
- Improve PythonData to support pep8 method names if available. Adding
  unit tests
2024-04-17 13:29:14 -03:00
Martin-Molinero
38c90d5a98 Fix CurrentSlice python wrapper (#7932)
- Fix algorithm current slice, to be a python slice wrapper. Updating
  regression algorithmst status
2024-04-16 18:38:53 -03:00
Jared
318701964c Update readme.md (#7927) 2024-04-16 17:34:49 -03:00
Jhonathan Abreu
93bc7a9dc1 Update pythonnet version to 2.0.32 (#7923) 2024-04-15 19:48:54 -03:00
Martin-Molinero
4e39100fa9 Pep8 Python Base Selection Models Update (#7920)
* Pep8 Python Selection Models Update

- Update python selection models to pep 8, keeping backwards
  compatibility support

* Address reviews, further pep8 renames
2024-04-15 19:22:20 -03:00
Martin-Molinero
0e58c4c694 Adjust GoodTilDate Pep8 (#7921)
- Pep8 adjustment for GoodTilDate, so it behaves like `Expiry` static
  readonly funcs which will be binded to both snake case and upper
  constant format, `good_til_date` & `GOOD_TIL_DATE`
2024-04-15 19:02:59 -03:00
Martin-Molinero
2ff13ea8fc Remove unrequired, unused universe DQH call (#7914)
- Remove unrequired, unused DQH subscription call to universe
  subscription
2024-04-15 13:50:30 -03:00
Martin-Molinero
dc1748f4ae Fix composer deadlock (#7917)
- Fix deadlock in composer creating a type like IBDownloader which gets
  the map file provider instance using the composer
2024-04-15 12:32:53 -03:00
Martin-Molinero
e06931c423 Make MorningStart codes readonly (#7919) 2024-04-15 12:32:41 -03:00
Martin-Molinero
f25029b0fe Update readme.md 2024-04-12 17:30:46 -03:00
Jhonathan Abreu
2ddf40b8e9 PEP8 style algorithm API (#7909)
* feat: support snake-case style Python QCAlgorithm implementations

* feat: add unit tests and minor fixes

* feat: implement new BasePythonWrapper class for python wrappers.

Used to cache methods and contains invoke functionality

* feat: make python wrappers implement the new base class for pep8 style support

* feat: keep overriden methods in Algorithm Python Wrapper

* feat: add unit tests for custom models algorithms with PEP8 style

* Bump pythonnet version to 2.0.30

* fix bugs and address peer review

* Address peer review

* Minor revert

* feat: StubsIgnoreAttribute for ignoring members or classes by the stubs generator

* Minor fixes

* Minor fix

* Minor fix

* Bump pythonnet version to 2.0.31

* Added Greeks.Lambda_ alias of Lambda for python compatibility.

Remove unused method
2024-04-12 17:29:15 -03:00
Martin-Molinero
90f09a1d60 Add TerminalLink Execution Instruction (#7916)
- Add optional TerminalLink execution instruction order properties
2024-04-12 15:10:12 -03:00
Ashutosh
94d33a50c4 Correction: Mapping tickSize to minimum_price_variation (#7910)
* Update symbol-properties-database.csv

* Update symbol-properties-database.csv
2024-04-11 12:37:25 -03:00
Martin-Molinero
bf741a155f Minor tweak for Live Synchronizer (#7912) 2024-04-11 10:43:41 -03:00
Martin-Molinero
c42cc841b2 Adjust API project file to accept a nullable id (#7911) 2024-04-10 15:19:38 -03:00
Martin-Molinero
fa9f10bebf Add support for auxiliary data history request (#7906)
* Add support for auxiliary data history request

- Add support for split/dividends/margin interest history requests.
  Adding regression algorithms

* Expand auxiliary history regression tests
2024-04-10 12:59:32 -03:00
Ricardo Andrés Marino Rojas
dc02ac7c84 API Clean Up, Documentation, Standardization (#7893)
* First draft of the update

* Add improvements

* Nit changes

* Add improvements

* Add improvements

* Remove unnecessary files

* Improve unit tests

* Add missing file

* Add new unit tests to CI

* Fix bug

* Fix unit tests

* Address changes

* Nit changes

* Nit changes

* Add fix for list backtest response

* Nit change

* Add changes in ListBacktest

* Fix failing unit test

* Improve API.GetObjectStore method

* Improve Api.GetObjectStore()

* Add C# models for object/get and object/properties

* Improve API methods and tests for object store

* Nit changes

* Nit change
2024-04-10 10:53:05 -03:00
Martin-Molinero
d238a8132e Python fundamental history request fix (#7905)
- Fix python fundamental pandas history request, where properties
  wouldn't change due to cache. Expanding regression test to assert
  issue
2024-04-09 09:55:20 -03:00
Martin-Molinero
7f7011edc0 Minor TZ fix for Scheduled Universe (#7903)
- By default Time rules yield times in UTC TZ, already correctly handled
  by 'ScheduledUniverseSelectionModel' but this wasn't fixed in ScheduledUniverse
2024-04-08 19:03:55 -03:00
Martin-Molinero
bb5c0eb54e Minor api improvements (#7901)
* Minor api improvements

- Adding Universe.Selected to hold the current set of selected symbols.
  Adding regression tests
- Adjusting TimeRules and DateRules to fallback to the MHDB if the
  security hasn't been added. Updating existing regression tests

* Expand regression test assertion
2024-04-05 17:43:25 -03:00
Jhonathan Abreu
314673534c Options/Index Options hour/daily resolution required data only download (#7898)
* fix: download year file data only for hour and daily resolutions for options and index options

* minor fix: index options regression tests expected status

* Minor change

* minor: update regression algorithms stats
2024-04-04 18:18:33 -03:00
Martin-Molinero
d24f665ee4 Adding new algorithm data handling options (#7897)
* Adding new algorithm data handling options

- Adding new QCAlgorithm data handling method options to override.
  Adding Py/C# regression tests
- Removing old OnData Type specific invoker methods

* Address reviews. Remove old OnData C# only methods
2024-04-04 15:38:50 -03:00
Martin-Molinero
3eec4a0090 Add example of scheduled universe selection with custom data (#7896)
- Add example of scheduled universe selection with custom data.
 See https://github.com/QuantConnect/Lean/pull/7895
2024-04-04 13:21:35 -03:00
Martin-Molinero
3aff0ce958 Add Scheduled Universe Selection (#7895)
* Add Scheduled Universe Selection

- Adding `UniverseSettings.Schedule` that will allow users to
specify a custom selection schedule which is independent of the
underlying data frequency
- Adding unit and regression tests

* Add live trading schedule time shift
2024-04-04 12:21:51 -03:00
Martin-Molinero
b65f253d42 Api read order and events handling (#7877)
- Adjust SerializedOrderEvent json format. Adding unit tests
- Removing unused SerializedOrder and it's converter
2024-04-02 18:56:05 -03:00
Martin-Molinero
529841ea77 Add labels to docker foundation files (#7890) 2024-04-02 16:36:08 -03:00
Jhonathan Abreu
6965dc9842 Option style parameter for parsing OSI option tickers (#7889)
* Get option style in OSI option ticker parsing method

* Keep previous SymbolRepresentation.ParseOptionTickerOSI overload

* Minor fix
2024-04-02 15:04:43 -03:00
Roman Yavnikov
0d430e2718 Revert: destination-dir param in Toolbox (#7885)
* revert: destination-dir param in Toolbox

* feat: test case on destination-dir param
2024-04-01 10:50:35 -03:00
Martin-Molinero
8bcd491fc3 Update readme.md 2024-03-28 16:33:13 -03:00
Ashutosh
f5cd9262b5 Added Forex CFD for IB (#7878) 2024-03-28 10:36:24 -03:00
Alexandre Catarino
f5db8788a0 Fixes Typo In Porfolio.Invested (#7876) 2024-03-27 15:44:53 -03:00
Martin-Molinero
0fa7f53539 Update blacklisted-tickers.txt (#7872) 2024-03-27 11:39:28 -03:00
Martin-Molinero
95000c5c29 Fix TF cuda support (#7874) 2024-03-26 17:51:57 -03:00
Martin Molinero
1120d7f050 Fix research CI expected output 2024-03-26 15:02:45 -03:00
Martin-Molinero
1cb262476d Minor python update related CI test fixes (#7873) 2024-03-26 14:42:07 -03:00
Martin Molinero
abadc543a4 Free space in GH CI 2024-03-26 14:06:37 -03:00
Martin-Molinero
9e04371f0b Update gh-actions.yml 2024-03-26 13:58:52 -03:00
Martin-Molinero
4eb16f3456 Update gh-actions.yml 2024-03-26 13:57:27 -03:00
Martin-Molinero
fe2420b9d4 Update readme.md 2024-03-26 13:09:04 -03:00
Martin-Molinero
78647d3a1d Update libraries and python 3.11 (#7856)
* Update python 3.11

* Update ARM foundation image and minor improvements
2024-03-26 12:57:56 -03:00
Jhonathan Abreu
78b49a1d11 Update InteractiveBrokers market symbols in SPDB (#7870)
* Update InteractiveBrokers market symbols in SPDB

* Update IB cfds in MHDB in SPDB

* Update IB index CFDs lot size
2024-03-26 10:44:16 -04:00
Roman Yavnikov
14f94923e1 Remove: old / not used part in ToolBox (#7871)
* remove: ref #6383

* remove: fxcm, ref #5505

* remove: not used pckg in ToolBox

* remove: fxcm downloader mention, ref #5505
2024-03-26 10:10:47 -03:00
Jhonathan Abreu
01eb907f98 Add CFD support for IB brokerage model (#7861)
* Support CFDs in IB

* Add new currency pair util method

* Minor changes to IB fee model and tests

* Add CFD USA market hours

* Add new Market interactivebrokers for cfds

* Add sample algorithm illustrating manually adding market hours to MHDB

* Update MHDB and SPDB
2024-03-25 16:58:17 -04:00
Roman Yavnikov
22dafee9c6 remove: IVolatilityEquity Converter (#7866) 2024-03-25 17:17:03 -03:00
Ricardo Andrés Marino Rojas
6259ee1d91 Remove BaseLiveAlgorithmSettings (#7862)
* Remove BaseLiveAlgorithmSettings

* Fix IB unit test

* Add Python unit test

* Add more unit tests
2024-03-25 15:54:06 -03:00
Ricardo Andrés Marino Rojas
ead2efe6b9 Add Starting and Ending KPI's (#7811)
* First draft of the solution

* Add missing changes

* Remove the new KPI's from report

* Fix bugs

* nit change

* Add improvements

* Fix regression tests

* Solve bugs in the regression algos

* Fix regression tests bugs

* Expand unit tests and add minor changes
2024-03-25 15:40:38 -03:00
Roman Yavnikov
ca99f329dd remove: Dukascopy Downloader (#7865) 2024-03-25 15:39:46 -03:00
Roman Yavnikov
3338c9a332 remove: CryptoIQ Downloader (#7867) 2024-03-25 11:10:10 -03:00
Roman Yavnikov
229caf485c remove: NseMarketDataConverter (#7863) 2024-03-25 11:08:19 -03:00
Roman Yavnikov
82b327b2b9 remove: Kraken Data Downloader from ToolBox (#7860) 2024-03-19 19:17:17 -03:00
Roman Yavnikov
aca30a896c Remove: Yahoo Data Downloader (#7859)
* remove: missed of QBDL PR:#6110

* remove: Yahoo(YDL) mention in proj
2024-03-19 11:40:46 -03:00
Martin-Molinero
3eedde9b6e Normalize ETF constituents universe (#7858)
- Normalize ETF constituents universe data. Adding new tests and
  assertions
2024-03-19 11:28:17 -03:00
Roman Yavnikov
c0d909c72c TryParsePath ignores DateTime (#7857)
* feat: logic of create Symbol with parsed Date

* fix: additional validation that date has value
2024-03-19 11:27:40 -03:00
Roman Yavnikov
7e568bf4ac Feature: find different Ticker data download parameters (#7845)
* refactor: map files in lean/data folder

* feat: Indexers in MapFile

* feat: extension for mapFile and downloader param

* refactor: getAllTickers from MapFiles

* feat: addition out variable in TryParsePath
fix: tests with new variable

* refactor: DownloadDataProvider with getting all ticker with different DateTime Ranges
feat: test

* revert: "refactor: map files in lean/data folder"

This reverts commit 41fa26eb8627446028d4f2d4c536511ea82a9a48.

* revert: "feat: addition out variable in TryParsePath"
refactor: some actual changing

This reverts commit 9de482bd6490eecd1eeee83e035dfc1ece8d6415.

* revert: "feat: Indexers in MapFile"
fix: actual changes

This reverts commit 393181c6316a354a8cdcbfb093707cb545383a8a.

* remove: high performance Any validation
feat: validation on ticker start with specific sign
fix: option test

* feat: validation on mapping
refactor: when resolution less hour
test: new test cases + validation of SecurityType

* refactor: add additional day when return date range from MapFile
fix: FirstTicker instead of Permtick when generate new Equity
feat: validation of request Date in DownloaderDataProvider
refactor: by style proj DownloaderDataProvider
test:fix: starting Date in TestCases

* remove: duplicate code

* fix: check of income data.Time with requested Start/End-Date

* test:fix: download test cuz we can not get/write future data

* remove:  extra Symbol Create mthd

* test:feat: validate of TryParse returns correct symbol

* remove: excess if condition

* test:remove: extra chaning
connected # 3a62adf54c

* refactor: split big method to small ones (add readability)

* fix: typo in xml description

* refactor: get the correct symbol value

* refactor: use local time instead of Utc in download Param extension
refactor: use struct instead of class

* test:fix: convert time to Utc from local time
2024-03-18 14:43:11 -03:00
Ashutosh
ee52ce4676 Update blacklisted-tickers.txt (#7854) 2024-03-18 11:52:07 -03:00
Martin-Molinero
a8280e1452 Minor fix for universe history (#7852)
- Do not cache universe collection data. Adding unit test
2024-03-14 16:20:28 -03:00
Ricardo Andrés Marino Rojas
934a8e0a61 Handle Windows reserved filenames (#7784)
* Add ToValidPathMethod

* Nit change

* Add more unit tests

* Improve implementation

* Enhance implementation

* Add more unit tests

* Enhance implementation

* Improve unit tests

* Improve implementation

* Nit changes

* Adjust reading/writing methods

* Fix bugs

* Add Windows OS flag

* Fix unit tests

* Fix unit tests

* Fix unit tests

* Change FileStream() to SafeFileStream()

* Fix bugs

* Fix bugs

* Nit changes

* Nit changes

* Add improvements

* Missing file

* Address requested changes

* Address requested changes

* Add missing test
2024-03-13 19:05:57 -03:00
Alexandre Catarino
44c7dbd698 Adds Rebate and Fee Rates to Shortable Provider (#7840)
* Adds Rebate and Fee Rates to Shortable Provider

If the provider does have this information, the rates are zero.

* Adds Helper Methods to QCAlgorithm

- Improve summaries.
- Express values as rates instead of percentages.
- Adds headers to files to emulate real data

* Clarify the Data Format

* Removes Helper Methods from QCAlgorithm

* Removes `Shortable` and `ShortableQuantity` from Example

Algorithms should prefer getting the information from the `Security.ShortableProvider`.
2024-03-13 16:04:33 -03:00
Jhonathan Abreu
b89d7d65b2 Fix live trading MHDB update (#7848)
* Add schedule manager unit tests

* Add schedule manager unit tests

* Fix overriding security exchange hours

* Minor comments changes

* Minor change

* Add SecurityExchangeHours.Update method to set without changing the reference

* Minor change
2024-03-13 12:09:15 -04:00
Ricardo Andrés Marino Rojas
09a3b61df8 Fix bug for NQX index options (#7824)
* First draft of the solution

* Add Improvements

* Update python version of the algo

* Update other classes

* Add regression algo

* Add missing data

* Fix bug

* Fix bug

* Nit change

* Clean implementation

* Nit change

* Nit change

* Improve implementation

* Nit change

* Nit change

* Solve bugs

* Improvements

* Address required changes

* Nit change

* Address changes

* Nit changes

* Nit changes

* Rename regression test
2024-03-13 11:42:55 -03:00
Martin-Molinero
516befe0b5 Backwards compatibility research universe history (#7849)
- Add backwards compatibility for research universe history api, adding
  unit tests
2024-03-13 11:20:02 -03:00
Martin-Molinero
17ca8a743f Refactor universe historical data source (#7837)
* Refactor universe historical data source

- Add new universe history API methods
- Refactor QuantBook UniverseHistory to use the universe selection
  itself instead of a given func
- Refactor and rename fundamental types
- Refactor AddUniverse API to handle universe collection data which
  holds another type internally, like fundamental

* Fix minor bug causing ApiDataProvider not to serve Bitfinex universe data

* Further improvements to add universe API

* Handle no selection function
2024-03-12 13:41:49 -03:00
Roman Yavnikov
a98a50237b Helper: Method for Retrieving Historical Ticker Symbols (#7826)
* feat: helper to return old name of symbols
feat: test
refactor: test a little bit neat

* feat: SplitHistoryRequest() with different mapped symbol
feat: test
refactor: RetrieveSymbolHistoricalDefinitions

* refactor: split historyRequest by historical symbol name
refactor: change location of extension
refactor: change location of test extension

* revert: extra changes

* fix: validation on RequiresMapping in SplitHistoryRequest
feat: add Future Symbol tests

* move: extension method to another file

* fix: wrong extension call param position

* fix: wrong extension call param position in test

* refactor: IEnumerable foreach to more simple form
feat: add TickerDateRange struct instead of Tuple
fix: test

* refactor: map extension alway returns empty result

* refactor: SplitHistory extension returns original HistoryRequest

* feature: new extension for RequiresMapping except Futures

* fix: validation of symbol map file to contains something

* refactor: extension test cases

* feat: assert of right ticker in tests

* fix: split historical request with using Local Time instead of UTC
fix: test description

* feat: test helper IEnumerable of TimeZones

* test: validate right EndDate with different TimeZones

* remove: validation of end of date
test: several new test cases

* feat: additional test with specific dateTime

* remove: extra Extension method validation on future and mapping
2024-03-11 11:53:40 -03:00
Martin-Molinero
51b018c616 Update Kraken Symbol Properties (#7844)
* Update symbol-properties-database.csv

Added additional pair
Corrected the config for the SOLUSD pair

* Update Kraken SPDB

---------

Co-authored-by: t984375 <162788827+t984375@users.noreply.github.com>
2024-03-11 10:43:11 -03:00
Louis Szeto
c049a35121 Add Option Gamma, Vega, Theta, Rho Indicator (#7830)
* Add gamma indicator

* add helper method

* add unit tests

* add in regression tests

* Address peer review

* add vega indicator

* add theta and rho indicators

* Address peer review, refactor
2024-03-11 10:32:36 -03:00
Martin-Molinero
8c66e2e715 Update InsufficientBuyingPowerForAutomaticExerciseRegressionAlgorithm.cs 2024-03-07 12:22:08 -03:00
Martin-Molinero
bb3931d911 Update readme.md 2024-03-06 14:58:50 -03:00
Martin-Molinero
feff802479 Standardize trade count statistic (#7827)
* Standarize trade count statistic

* Rename 'Total Trades' to 'Total Orders'
2024-03-06 14:52:34 -03:00
Martin-Molinero
dcbb2d3cf8 Skip failing yahoo data downloader test (#7833) 2024-03-06 11:37:06 -03:00
Jhonathan Abreu
f298f6e21a Handle insufficient margin for option exercise (#7828)
* Handle insufficient margin for option exercise

* Minor change

* Minor changes
2024-03-05 15:39:30 -04:00
Jhonathan Abreu
ce197afe44 Populate order properties for option exercise orders (#7829)
* Populate order properties for option exercise orders

* Minor change

* Not setting broker id for options exercises

* Minor change
2024-03-05 14:19:06 -04:00
Jhonathan Abreu
637fe75b25 Update pythonnet version to 2.0.28 (#7821)
* Bumped pythonnet version to 2.0.27

* Update pythonnet version to 2.0.28
2024-03-05 11:30:40 -04:00
Louis Szeto
6bf2acd0da Allow smoothing in Implied Volatility and add forward tree model (#7820)
* Allow mirror contract and smoothing IV

* Python wrapper on smoothing IV

* helper method update

* Add forward tree model

* modify and add unit tests and data

* address peer review

* address peer review
2024-03-04 11:00:04 -03:00
Jhonathan Abreu
5e2957cbf0 Refactor config file enviroments to match brokerages namespaces (#7823)
* Refactor config file enviroments to match brokerages namespaces

* Use class name only for brokerages and DQH in config file
2024-02-29 14:36:06 -04:00
Martin-Molinero
78c3f81b96 Research configuration initialization improvement (#7825)
- Minor research configuration handling improvement on initialization,
  making sure we reload configs
2024-02-29 15:13:59 -03:00
Martin-Molinero
e500a6b466 QuantBook Initialization Order (#7822)
- QuantBook should first initialize the system handlers and later the
  algorithm handlers, like done by the engine
2024-02-28 17:07:11 -03:00
Martin-Molinero
b9ec218870 Update readme.md 2024-02-28 11:27:47 -03:00
Louis Szeto
e39cec40f5 Implement dividend yield model (#7758)
* dividend yield plug-in model interface

* dividend yield model python wrapper

* Implement symbol dividend yield models

* unit tests on dividend yield provider

* Update IV indicator

* IV indicator unit tests

* update Delta indicator

* Delta indicator unit tests

* update helper method

* Nit

* Address peer review

* Address 2nd peer review

* readability

* Regression tests

* dividend yield model

* Address review

* Fix unit tests

* Minor fix

* Fix tests

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-02-27 12:39:46 -03:00
Ashutosh
ea5e4ac8d0 Update symbol-properties-database.csv (#7795)
* Update symbol-properties-database.csv

Updating Symbol properties database to reflect kraken API information.

#### Description
Updated the market_ticker column of Symbol properties database to reflect information as per Kraken API.

#### Related Issue
Close #7794

#### Motivation and Context
We updated symbol mapping for the Kraken market.

#### Requires Documentation Change
No

#### How Has This Been Tested?
<!--- Please describe in detail how you tested your changes. -->
<!--- Include details of your testing environment, and the tests you ran to -->
<!--- see how your change affects other areas of the code, etc. -->

#### Types of changes
<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] Refactor (non-breaking change which improves implementation)
- [ ] Performance (non-breaking change which improves performance. Please add associated performance test and results)
- [X] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to change)
- [ ] Non-functional change (xml comments/documentation/etc)

#### Checklist:
<!--- The following is a checklist of items that MUST be completed before a PR is accepted -->
<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
- [X] My code follows the code style of this project.
- [X] I have read the **CONTRIBUTING** [document](https://github.com/QuantConnect/Lean/blob/master/CONTRIBUTING.md).
- [X] I have added tests to cover my changes. <!--- If not applicable, please explain why -->
- [X] All new and existing tests passed.
- [X] My branch follows the naming convention `bug-<issue#>-<description>` or `feature-<issue#>-<description>`

<!--- Template inspired by https://www.talater.com/open-source-templates/#/page/99 -->

* Update symbol-properties-database.csv

- Update as per peer review

* Correction
2024-02-27 10:45:34 -04:00
Martin-Molinero
1f975332c3 Update readme.md 2024-02-27 10:59:26 -03:00
Martin-Molinero
aa6b909a93 Update readme.md 2024-02-27 10:29:38 -03:00
Will Tindall
9cfd8b7403 Implement Risk Metrics: Value At Risk (#7757)
* Implement VaR in PortfolioStatistics

* Added ValueAtRisk indicator

* Refactored ValueAtRiskTests

* Added returns column to test data

* Change indicator helper method name

* Addressed comments
2024-02-26 11:02:20 -03:00
Pronoy Chowdhury
fec27a56ce Chande Variable Index Dynamic Average (VIDYA) Indicator (#7797)
* Chande Variable Index Dynamic Average (VIDYA) Indicator

* Improvements

* Improvements

* Final Changes

* Editted, Retested

* Comments

* Minor Corrections

* Updated Datetime Format of test data to US Standards

---------

Co-authored-by: Pronoy Chowdhury <rokstarr.dbz@outlook.com>
2024-02-26 10:55:01 -03:00
Roman Yavnikov
e96c08e208 feat: downloader data provider returning null (#7812) 2024-02-23 15:45:47 -03:00
Jhonathan Abreu
d942d58717 Add null check for history in lean data writer (#7814) 2024-02-23 15:45:35 -03:00
Martin-Molinero
387eae9e73 Update readme.md 2024-02-21 18:16:53 -03:00
Martin-Molinero
7e61483ad7 Adjust API tests to fetch creds from globals (#7806) 2024-02-21 17:53:46 -03:00
Martin-Molinero
8595aff670 Handle history provider returning null (#7804) 2024-02-21 15:44:22 -03:00
Martin-Molinero
e375afbe20 Dynamically setup brokerage history provider wrapper (#7802) 2024-02-21 12:03:31 -03:00
Martin-Molinero
1a1f64e7a6 Update readme.md 2024-02-21 10:09:16 -03:00
Martin-Molinero
2e9c7ade2c Initialize report correctly (#7803)
- Fix report initialization, adding CI tests
2024-02-21 10:02:43 -03:00
Jhonathan Abreu
d3928fba6b Manual option contract addition for delisted underlyings error (#7799)
* Throw when trying to add option contracts for delisted underlyings

* Minor change
2024-02-21 09:02:07 -04:00
Jhonathan Abreu
09db45c91d Universes immediate selection (#7785)
* Make sure continuous futures universe selection is performed right away on the start of the algorithm.

This ensures the Future.Mapped is not null

* Minor changes

* Minor fixes

* Update regression algorithms stats

* Add DC futures map file

* Update DC futures map file

* Update regression algorithms stats

* Include ETFs for immediate universe selection

* Include Coarse Fundamentals for immediate universe selection

* Include Futures Chain Universe for immediate selection

* Add Option Chain Universe test

* Include custom universes for immediate selection

* Minor updates

* Include constituents universes for immediate selection

* Minor update

* Minor changes, docs and stats updates

* Minor changes

* Minor changes and clean up

* Minor regression algorithm stat update
2024-02-21 08:59:58 -04:00
Ricardo Andrés Marino Rojas
64fe4ba13b Update LinearWeightedMovingAverage (#7798)
* Add improvements and unit tests

* Add Improvements
2024-02-20 16:51:06 -03:00
Martin-Molinero
2a82c6f9bb Consolidate Configuration.Get usages (#7796) 2024-02-20 13:37:22 -03:00
Ricardo Andrés Marino Rojas
6f6fbee6ee Handle DivisionByZero exception in indicators (#7788)
* Solve bug and add indicator unit test

* Nit change

* Add more checks

* Improve solution

* Nit change

* Solve bugs

* Improve implementation

* Nit change
2024-02-19 16:02:51 -03:00
Martin-Molinero
67b9ecf391 Minor config tweaks (#7792) 2024-02-19 12:05:00 -03:00
Ricardo Andrés Marino Rojas
0e81589efa Bug add future option ozn (#7791)
* Models OZN: 10-Year US Treasury Future Options

<!--- Provide a general summary of your changes in the Title above -->

#### Description
We added future option for OZN

#### Related Issue
Close #7783
<!--- This project only accepts pull requests related to open issues -->
<!--- If suggesting a new feature or change, please discuss it in an issue first -->
<!--- If fixing a bug, there should be an issue describing it with steps to reproduce -->
<!--- Please link to the issue here: -->

#### Motivation and Context
 We added future option supported by CME
https://www.cmegroup.com/markets/interest-rates/us-treasury/10-year-us-treasury-note.contractSpecs.options.html#optionProductId=317

#### Requires Documentation Change
No

#### How Has This Been Tested?
I tested the change using fake files to check if mapping is correct.

#### Types of changes
<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] Refactor (non-breaking change which improves implementation)
- [ ] Performance (non-breaking change which improves performance. Please add associated performance test and results)
- [X] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to change)
- [ ] Non-functional change (xml comments/documentation/etc)

#### Checklist:
<!--- The following is a checklist of items that MUST be completed before a PR is accepted -->
<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
- [X] My code follows the code style of this project.
- [X] I have read the **CONTRIBUTING** [document](https://github.com/QuantConnect/Lean/blob/master/CONTRIBUTING.md).
- [X] I have added tests to cover my changes. <!--- If not applicable, please explain why -->
- [X] All new and existing tests passed.
- [X] My branch follows the naming convention `bug-<issue#>-<description>` or `feature-<issue#>-<description>`

<!--- Template inspired by https://www.talater.com/open-source-templates/#/page/99 -->

* Add unit tests

---------

Co-authored-by: Ashutosh <ashutoshrana171@gmail.com>
2024-02-16 19:13:04 -03:00
Martin-Molinero
07dbfc42a5 Improve consolidator scan (#7789)
* Improve consolidator scan

- Improve consolidator scan to be triggered even if no data is present.
  Adding new regression test, updating existing

* Adding more tests & minor tweaks
2024-02-16 17:22:49 -03:00
Martin-Molinero
ea15e014e2 Live delisting handled (#7774)
- Adjust live equity delisting to be map files based like splits and
  dividends. Adding unit test
- Expand existing unit tests asserting delistings in live mode, set
  securities to not tradable
2024-02-16 16:56:42 -03:00
Martin-Molinero
d602e260b4 Update readme.md 2024-02-13 12:28:20 -03:00
Martin-Molinero
e31a898269 Update readme.md 2024-02-13 11:16:48 -03:00
Roman Yavnikov
1dd186acb4 CoinApi Extraction: Removing from Lean.ToolBox (#7777)
* feat: remove CoinApi realization from ToolBox

* fix: ComposeDataQueueHandlerInstances
we have removed all IDataQueueHandler from ToolBox
2024-02-13 10:40:30 -03:00
Ricardo Andrés Marino Rojas
330946785f Add improvement (#7778) 2024-02-13 10:40:15 -03:00
Jhonathan Abreu
48ce5ef88d Refactor API projects test to avoid leaving created projects in account (#7773) 2024-02-08 17:24:49 -03:00
Martin-Molinero
76a0bdd769 Fix scatter chart point serialization (#7772)
- Fix scatter chart point sometimes being serialized as an array. Adding
  unit test
2024-02-08 15:36:38 -03:00
Ricardo Andrés Marino Rojas
b7740edd15 Solve bug and add unit tests (#7767) 2024-02-07 17:51:28 -03:00
Ricardo Andrés Marino Rojas
0264d346e6 Add obsolete flag (#7768) 2024-02-07 17:50:03 -03:00
Ricardo Andrés Marino Rojas
f59a6be589 Add Python version of AllShortableSymbolsCoarseSelectionRegressionAlgorithm.cs (#7766)
* Add Python version

* Improve implementation

* Improve implementation
2024-02-07 11:46:48 -03:00
Ricardo Andrés Marino Rojas
a5b309ae23 Add CSharp version of BasicTemplateOptionsConsolidationAlgorithm (#7756)
* Add CSharp version

* Nit change
2024-02-07 11:46:41 -03:00
Martin-Molinero
3d673d6de1 RefreshEnumerator retry on stale file exception (#7764)
- The refresh enumerator will retry on stale file handle exception.
  Adding unit test
2024-02-06 19:26:59 -03:00
Martin-Molinero
fdb8c20a1a Update readme.md 2024-02-06 18:02:51 -03:00
Martin-Molinero
6fe368106a Obsolete VAR for V instead (#7763) 2024-02-06 17:50:20 -03:00
Martin-Molinero
379e2d3405 Add optional PositionSide for TerminalLink (#7762)
* Add optional PositionSide for TerminalLink

* Minor rename
2024-02-06 16:08:24 -03:00
Ricardo Andrés Marino Rojas
711a7b42d4 Add missing constructor in OptionChainedUniverseSelectionModel (#7741)
* Solve bug and add regression tests

* Add regression stats

* Improve regression algo

* Improve regression algos
2024-02-05 15:56:29 -03:00
Martin-Molinero
3fef33fbf4 Rename Daily Performance Index Name (#7752) 2024-02-05 15:42:35 -03:00
Ricardo Andrés Marino Rojas
32d39622c0 Solve division by zero bug in AccelerationBands Indicator (#7743)
* Solve bug and add unit test

* Nit change

* Nit change
2024-02-05 15:14:45 -03:00
Roman Yavnikov
d3877c8ea9 remove: AlphaVantage from ToolBox (#7751) 2024-02-05 15:13:38 -03:00
Martin-Molinero
2097a3f392 Handle a DQH failure (#7750)
- Handle IDQH failure as a runtime error. Added unit tests
2024-02-05 15:13:08 -03:00
Jhonathan Abreu
98a3fd4306 Delayed Settlement Cash Not Freed for Removed Assets (#7727)
* Delay security removal when there are pending settlements

* Add unit test

* Minor fixes

* Minor fix

* Replace HasUnsettledFunds method with UnsettledCash in ISettlementModel

* Minor fix

* Minor fix

* Address peer review

Replace ISettlementModel UnsettledCash property with GetUnsettledCash method that returns a CashAmount instead of a decimal to include the currency

* Minor fix

* Address peer review
2024-02-05 15:12:51 -03:00
Martin-Molinero
ef728bc91f Update readme.md 2024-02-02 20:37:39 -03:00
Martin-Molinero
1c973d12a5 Minor chart improvements (#7744)
* Minor chart improvements

- Add base series tooltip template. Adding unit tests
- Reduce null chart points to a single addition

* Add null values always

* Fixes & minor tweaks

* Serialize ChartPoint as array
2024-02-02 17:27:37 -03:00
Jhonathan Abreu
8b804c4eca Add new EnablePositionSide terminal link order property (#7747) 2024-02-02 16:20:59 -04:00
Jhonathan Abreu
701a4672c5 Make sure universe selection methods can return symbol Ids (#7745) 2024-02-02 15:47:52 -04:00
Martin-Molinero
63cff706e4 Update readme.md 2024-02-01 19:14:54 -03:00
Martin-Molinero
6828e164e0 Update readme.md 2024-02-01 18:38:22 -03:00
Martin-Molinero
7705895cc6 Portfolio margin chart (#7719)
* Portfolio state chart

- Cleanup and renames
- Add series.IndexName. Uodating unit tests
- Add Chart.LegendDisabled. Adding new unit tests
- Add ChartPoint.Tooltip. Updating unit tests
- Minor compression tweak. Adding unit test
- Add ChartJsonConverter. Adding unit tests

* Minor chart serialization order tweak

* Refactor portfolio state sampling and storing

* Move PortfolioMargin into a lean side chart
2024-02-01 12:43:08 -03:00
Jhonathan Abreu
4262bb9152 Refactor API project tests (#7738)
Avoiding leaving undeleted projects in the account used for testing
2024-01-31 19:12:18 -03:00
Martin-Molinero
645aa73e8e Fix tags deserialization (#7736)
- Fix tags deserialization, adding unit test
2024-01-30 19:50:11 -03:00
Jhonathan Abreu
d4ba8ccead Backtest self-categorization (#7683)
* Implement backtest self-naming and self-tagging

* Minor unit test fix

* Minor api changes

* Minor changes

* Send packet messages when algorithm's name or tags are updated

* Minor fixes

* Address peer review

* Backtest name and tags API calls

Plus, first version of CI for API tests

* Add endpoint to update a backtest set of tags

* Minor GH actions change

* Address peer review

* Add algorithm naming and tagging unit tests

* Minor backtest API changes
2024-01-30 14:59:08 -03:00
Ricardo Andrés Marino Rojas
6f29130221 Add headers to http client (#7735) 2024-01-30 13:31:08 -03:00
Roman Yavnikov
4c88e3184c IEX Extraction: Removing from Lean.ToolBox (#7734)
* remove: ToolBox\IEX

* revert: IEX config in config.json
remove: IEX downloader param in toolboxParse
2024-01-30 09:50:36 -03:00
Ashutosh
3f6a907485 Models All Index Futures Listed in CME (#7722)
* Models All Index Futures Listed in CME

We added:
NIY, ENY, FT1, FT5, E3G, FTU, TPD, TPY

* Models All Index Futures Listed in CME

We added international index futures:
NIY, ENY, FT5, FT1, E3G, FTU, TPD and TPY

* Remove unused imports

* Address peer review:
- Corrected serial contract logic
- Corrected minimum price fluctuation
- Corrected “Yen” to “JPY”

Added equity index futures:
RX, ESG, RS1 and SDA
2024-01-29 13:29:12 -03:00
Jhonathan Abreu
ec530d8e37 Introduce new OrderPosition enum (#7730) 2024-01-29 11:56:10 -04:00
Louis Szeto
3a10afeac5 Option Delta Indicator (#7704)
* Add base indicator for greeks

* Add option delta indicator

* Add helper method

* Add unit tests

* Address peer review

* Fix minor bugs

* Change OptionDelta into Delta

* rename helper method
2024-01-29 12:54:57 -03:00
Ricardo Andrés Marino Rojas
00e1cae16b Stop support of MOC orders for Options in IB Brokerage Model (#7725)
* Fix bug and add unit tests

* Improve implementation

* Improve implementation
2024-01-29 12:53:23 -03:00
Jhonathan Abreu
07ded61fe9 Fix currency formatting (#7723)
* Replace currency string formatting with Lean currency symbols.

Also clean up orders tags from having redundant information.

* Setting default order tag only after price currency is properly set

* Minor fixes and new unit tests

* Minor fixes
2024-01-25 12:20:05 -03:00
Ricardo Andrés Marino Rojas
0cd979f3bd Solve bug in ETFConstituentsUniverseSelectionModel (#7724)
* Fix bug in ETFConstituentUniverseSelectionModel()

The bug was raised after calling an overload constructor using just the
ticker as parameter. Since the universeFilterFunc was null, the method
Extensions.TryConvertToDelegate<T> returned true and thus, the filter
func assigned was the one returned by the method
`ConvertToUniverseSelectionSymbolDelegate()` which used the null
filterfunc.

* Handle potential future bugs
2024-01-25 11:32:04 -03:00
Ricardo Andrés Marino Rojas
3a9059ae4f Add into MHDB missing CME Futures early closes and late opens (#7718)
* Update MHDB

* Improve changes
2024-01-25 10:41:44 -03:00
Ricardo Andrés Marino Rojas
518ab562ec Fix bug in LiveTradingRealTimeHandler (#7696)
* Initial draft of the solution

* Add improvments

* nit changes

* Improve implementation

* Enhance unit tests

* Add one more unit test

* Fix failing tests and update MHDB

* Add requested changes

* Nit change

* Add tweaks to MarketHoursDatabase class

* Solve bug and add unit tests

* Update unit tests

* Address requested changes

* Handle potential bug

* Nit change

* Minor review

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2024-01-24 11:59:09 -03:00
Roman Yavnikov
20a5f690f8 Update IQFeed Configuration and Remove Deprecated Parameter (#7717)
* fix: change wrong IQFeed config to new one

* remove: iqfeed param in leanArgumentParser
2024-01-24 10:24:26 -03:00
Nikolay Baraboshkin
17902e2f7d Update Binance currency pairs (#7693)
* Update Binance currency pairs

* list FDUSD as a stablecoin, fix tests
2024-01-23 17:56:00 -03:00
Jhonathan Abreu
9df4a397d5 Update Bybit symbols in SPDB (#7715) 2024-01-23 13:36:15 -03:00
Martin-Molinero
3a8a3dd27f Add support to unzip stream (#7713)
- Add support to unzip a stream. Adding unit test
2024-01-23 13:35:45 -03:00
Jhonathan Abreu
3dab2e42eb Handle/filter new brokerage-side orders (#7706)
* Handle/filter brokerage side orders

* Add unit tests

* Minor fix

* Add unrequested security for new brokerage-side orders

* Add unit test for algorithms overriding the brokerage message handler

* Add unit test for python algorithm overriding the brokerage message handler

* Minor change

* Address peer review
2024-01-23 12:01:03 -04:00
Jhonathan Abreu
1c93df8156 Merge early closes and late opens properly in MHDB. (#7712)
A more specific entry might contain some of the same early close/late open dates as the common entry but with different times. This makes sure this is handle and the more specific ones take precedence.
2024-01-22 14:45:43 -04:00
Ricardo Andrés Marino Rojas
580a043baf Add early closes for U.S. Indices in MHDB (#7707)
* Add Unit tests and early closes to MHDB

* Nit change

* Add missing early closes
2024-01-19 19:21:22 -03:00
Roman Yavnikov
6cb9164c7a remove: IQFeed mentions (#7705) 2024-01-19 12:17:46 -03:00
Will Tindall
ed9fb4a194 Add Unit Tests for IPortfolioOptimizer Classes (#7691)
* MaximumSharpeRatioPortfolioOptimizerTests

* MinimumVariancePortfolioOptimizerTests

* UnconstrainedMeanVariancePortfolioOptimizerTests

* Addressed comments

* Address comments v2

* Refactored tests with base test class. Added Python wrapper tests

Base test class and python wrapper tests
2024-01-19 12:14:05 -03:00
Louis Szeto
0b833b065e Implied Volatility Indicator for Options (#7680)
* Add IV indicator

* Fix bug

* Add QCAlgorithm helper method

* Add unit tests

* Add OptionPricingModelType, as option for greeks & IV estimation

* Nit, and fix bug

* Address peer review

* Fix bug

* Fix bug on CRR

* Ensure test indicator initiate correctly

* Address 2nd review

* Check for FOPs and index options as well

* Add comparison with QuantLib

* CRR not follow BSM

* minor bug fix
2024-01-18 13:50:49 -03:00
Martin-Molinero
8ec2c4beeb Update readme.md 2024-01-18 12:59:36 -03:00
Martin-Molinero
fa329a9d51 Minor brokerage setup handler message improvement (#7700) 2024-01-17 17:55:56 -03:00
Martin-Molinero
adfb594d93 Asset plot improvement (#7699)
* Asset plot improvement

- Add optional symbol for chart instance, to create an asset plot
- Fix Order PriceAdjustmentModel deserialization. Updating unit test

* Add series ZIndex. Adding unit test

* Fix clone, adding more tests
2024-01-17 14:46:45 -03:00
Roman Yavnikov
1eaf4d6ae0 Flexible trading days per year property (#7690)
* feat: new `TradingDaysPerYear` prop in IAlgorithmSettings

* feat: getTradingDayPerYear by BrokerageModel
feat: init algo tradingDaysPerYear in brokerage|BacktestingSetupHandler
refactor: nullable `TradingDayPerYear`

* remove: hardcoded value:252 in statistics

* test: `algorithm.Settings.TradingDaysPerYear` for different brokerage
fix: tests calculation of `AnnualPerformance()`

* fix: Report generator by tradingDayPerYear

* fix: hardcoded value in PortfolioStatisticsTests

* fix: tradingDayPerYear in AnnualPerformanceTest
remove: extra spacing

* feat: backwards compatibility for TradingDaysPerYear

* feat: several UTest for AlgoSetting's TradingDaysPerYear prop

* fix: existed algo + test

* feat: regression algo with checking of tradingDayPerYear in OnEndOfAlgorithm()

* refactor: GetBrokerageTradingDayPerYear -> SetBrokerage... in BaseSetupHandler
refactor: carry out tradingDayPerYear at the top level and pass variable

* remove: default valuine in test param
remove: extra comment.

* fix: missed init TradingDaysPerYear in report.portfolioAlgo
fix: hardcoded value to tradingDaysPerYear

* fix: nullable TradingDaysPerYear in AlgorithmConfiguration
feat: UTest for PortfolioLooperAlgo
feat: add advanced description

* feat: test PortfolioStatistics with different tradingDaysPerYear

* revert: PortfolioLooper with TradingDaysPerYear implementation

* revert: nullable TradingDaysPerYear in AlgoConfiguration
remove: SetBrokerageTradingDayPerYear in BaseResultHandler

* style: remove empty row
2024-01-17 14:45:57 -03:00
Martin-Molinero
bf2f310cae Future SymbolRepresentation Future Parsing (#7695)
- Improve future symbol representation future parsing. Adding more unit
  tests
2024-01-15 20:54:10 -03:00
Roman Yavnikov
cc8caa9635 Future Stop Market Order in Out Market Hours (#7678)
* feat: stopMarketFill in FutureFillModel + test

* feat: futureStopMarket RegressionAlgo on PY|C#

* feature: add validation of market time in utest

* feature: validate exchange hours when order filled in regression algos

* feat: validation of StopMarket Type
fix: styling format in PY

* fix: validation on ExtendedMarketHours in FutureFillMode
feature: validate that all stop orders was completed in algos

* fix: validation: asset.Subscription -> ConfigProvider.GetSubscriptionData
fix:style: missed braces

* fix: asset.IsInternalFeed() -> general includeInternalConfigs flag
remove: extra login in algo

* feat: write comment why we use includeInternalConfigs in true
remove: extra log in PY version of algo
2024-01-11 18:43:08 -03:00
Ricardo Andrés Marino Rojas
41a6fb721a Add potential fix to overflow bug in FractalAdaptiveMovingAverage.cs (#7689)
* Add potential fix

* Handle NaN and Infinity cases
2024-01-11 17:20:46 -03:00
Martin-Molinero
27356512b8 Clean up pythonnet runtime exception build paths (#7687)
- Clean up pythonnet runtime exception build paths
2024-01-11 10:56:09 -03:00
Martin-Molinero
abd092ac63 Update readme.md 2024-01-09 19:44:48 -03:00
Ricardo Andrés Marino Rojas
6a8edc1f34 Add SetSettlementModel() method (#7684)
* Rebase - Add Support

* nit changes
2024-01-09 19:38:17 -03:00
Roman Yavnikov
4913a59f28 remove: deprecated PriceProvider (#7682) 2024-01-09 19:37:28 -03:00
alex
4c79d91635 fix some grammar in Data/readme.md (#7679) 2024-01-09 19:34:55 -03:00
Roman Yavnikov
0a1e481883 refactor: Globals.DataFolder -> Globals.GetDataFolderPath() (#7685) 2024-01-09 19:34:13 -03:00
Martin-Molinero
6879e93d79 Update readme.md 2024-01-08 18:56:23 -03:00
Martin-Molinero
1f4eee88dd CoinApi GDAX to Coinbase rename (#7677) 2024-01-08 18:11:59 -03:00
Ricardo Andrés Marino Rojas
c6ca0eeea5 Improve brokerage model python wrapper (#7672)
* Improve GetFillModel()

* Add support for other methods

* Add regresion algos and improvements

* Make Python algorithms regression tests

* Improve unit tests

* Minor changes
2024-01-08 18:11:18 -03:00
Martin-Molinero
3f3d13a1df Update readme.md 2024-01-05 18:02:58 -03:00
Jared
f497a0206c Update BacktestingResultHandler.cs (#7675) 2024-01-05 18:00:02 -03:00
Martin-Molinero
0ba796c4cf Add project owner to API project read (#7674) 2024-01-05 16:58:03 -03:00
Roman Yavnikov
50ccec9a01 feat: gdax -> coinbase (#7633)
* feat: gdax -> coinbase

* feat: defaultBrokerageModel gdax -> coinbase

* refactor: coinbaseBrokerageModel
fix: gdax test

* feat: add coinbase market hours

* feat: symbolPropDB gdax -> coinbase

* fix: gdax to coinbase tests

* fix: coinbase Fees data

* remove: gdax market-hours

* revert: stopMarket order Type by date + test

* fix: coinbase test (fee was changed)
revert: old test with stopMarket gdax
fix: pandas padding

* refactor: gdaxLiveTrading -> CoinbaseLiveTrading
remove: gdax configs

* remove: old gdax testdata files

* refactor: gdax route -> coinbase route
feat: add deprecated gdax info
feat: some string "gdax" -> "coinbase"

* fix: style brackets

* fix: config coinbase data-queue-handler

* revert: public StablePairsGDAX collection

* rename: GdaxBrokerageModel to CoinbaseBrokerageModel in tests
rename: gdax -> coinbase in DefaultMarketMap
rename: gdaxBrokerageModelTest to Coinbase...

* revert: coinbase changes in toolbox (deprecated)

* remove: override Clone() in GDAX\Coinbase-OrderProperties

* typo: ops missing brackets

* rename: Market.Gdax -> Coinbase in Test
remove: ref on gdax

* test: compatibility of GDAXOrderProperties

* fix: coinbase brokerageName enum number

* feat: readonly to stablePairs Gdax/Coinbase
remove: GetFeeModel() in GDAXBrokerageModel {}

* test: gdax market name compatible with coinbase

* rename: config to old ones

* feat: coinbase CanUpdateOrder()

* rename: plus to commit 4135c91

* feat: coinbase fee model + test

* fix: stable fees data

* update: coinbase symbol-properties-database.csv

* fix:  validation of MinimumOrderSize in SubmitOrder()

* feat: gdax -> coinbase

* feat: defaultBrokerageModel gdax -> coinbase

* refactor: coinbaseBrokerageModel
fix: gdax test

* feat: add coinbase market hours

* feat: symbolPropDB gdax -> coinbase

* fix: gdax to coinbase tests

* fix: coinbase Fees data

* remove: gdax market-hours

* revert: stopMarket order Type by date + test

* fix: coinbase test (fee was changed)
revert: old test with stopMarket gdax
fix: pandas padding

* refactor: gdaxLiveTrading -> CoinbaseLiveTrading
remove: gdax configs

* remove: old gdax testdata files

* refactor: gdax route -> coinbase route
feat: add deprecated gdax info
feat: some string "gdax" -> "coinbase"

* fix: style brackets

* fix: config coinbase data-queue-handler

* revert: public StablePairsGDAX collection

* rename: GdaxBrokerageModel to CoinbaseBrokerageModel in tests
rename: gdax -> coinbase in DefaultMarketMap
rename: gdaxBrokerageModelTest to Coinbase...

* revert: coinbase changes in toolbox (deprecated)

* remove: override Clone() in GDAX\Coinbase-OrderProperties

* typo: ops missing brackets

* rename: Market.Gdax -> Coinbase in Test
remove: ref on gdax

* test: compatibility of GDAXOrderProperties

* fix: coinbase brokerageName enum number

* feat: readonly to stablePairs Gdax/Coinbase
remove: GetFeeModel() in GDAXBrokerageModel {}

* test: gdax market name compatible with coinbase

* rename: config to old ones

* feat: coinbase CanUpdateOrder()

* rename: plus to commit 4135c91

* feat: coinbase fee model + test

* fix: stable fees data

* update: coinbase symbol-properties-database.csv

* fix:  validation of MinimumOrderSize in SubmitOrder()

* fix: skipped gdax name to coinbase

* feature: visible Symbol prop in DefaultOrderBook
2024-01-05 16:57:19 -03:00
Martin-Molinero
1d52e5b14a Update readme.md 2024-01-04 16:41:41 -03:00
Daniel Suh
50ab04e30d Implement Time Series Forecast Indicator (#7654)
* initialize TimeSeriesForecast

* tests pass

* spy_tsf.csv added

* added csv to tests

* comment

* fix requested changes

* remove commented out code

* remove ds_store and sln

---------

Co-authored-by: Daniel Suh <daniel.suh@duke.edu>
2024-01-04 16:20:29 -03:00
Ronit Jain
ff83d72487 add required options for local reuslt service (#7660) 2024-01-04 16:18:56 -03:00
Martin-Molinero
3db813c9ae Minor git ignore addition (#7658) 2024-01-04 11:48:26 -03:00
Ricardo Andrés Marino Rojas
eeb44d841a Add partial support for live algorithm redeployment with custom data (#7655)
* First Draft of the solution

Handle the case where the security has already been added in the
algorithm

* Improve implementation

* Improve changes

* Add unit test

* Improve unit tests

* Fix bugs in unit tests

* Nit changes

* Nit changes

* Improve implementation

* Solve bugs in unit tests

* Add more unit tests
2024-01-04 11:13:52 -03:00
Martin-Molinero
e0fdbb2618 Plotting Limits Handling Improvements (#7657)
* Plotting Limits Handling Improvements

- Improve the handling and enforcement of plotting limits
- Increase local default limits

* Minor plotting test fix
2024-01-03 14:21:13 -03:00
Jhonathan Abreu
b75ed58411 Fix combo order quantity update (#7651)
* Fix combo order quantity update

* Minor changes

* Fix unit tests

* Cleanup
2024-01-03 11:11:23 -04:00
Martin-Molinero
aaab65fd7f Fix disabled subsampling (#7656)
- Fix disable subsampling which was adjusting series point times,
  updating unit tests to reproduce issue
2024-01-02 20:54:19 -03:00
Martin-Molinero
65f8590d94 Clean up unused toolbox classes (#7652)
- Remove QuantQuoteConverter program
- Remove QC Visualizer
2024-01-02 18:55:32 -03:00
Martin-Molinero
2525824390 ConsolidateChartPoints method override type (#7650) 2023-12-29 13:24:29 -03:00
Ricardo Andrés Marino Rojas
1b8f396f1a Fix bug in GetLastKnownPrices() method (#7649)
* First draft

* Update regression algos and add unit tests
2023-12-29 13:24:18 -03:00
Ricardo Andrés Marino Rojas
2020f12825 Fix bug in UniverseSelection.Top() method (#7647)
* Solve bug and fix regression test

* Add regression tests

* Improve implementation

* Nit change
2023-12-28 14:49:30 -03:00
Martin-Molinero
3e00abb2e4 Fix Live trading OrderEvents Serialization format (#7646)
- Live trading result handler was storing order events with a different
  format since it wasn't using the expected json converter
2023-12-27 19:19:01 -03:00
Ricardo Andrés Marino Rojas
0f47ba657d Solve race condition bug in LocalObjectStore (#7645)
* Solve bug and add unit tests

The bug was raised due to a race condition when writing a file and
deleting it. In order to stop it, a check condition was added at the end
of the PersistData() method to remove files that have just been deleted.

* Nit changes

* Add a different constructor for the test
2023-12-27 19:18:02 -03:00
Jhonathan Abreu
8cdb2d4c10 Add options and future chain providers to composer (#7644) 2023-12-27 14:42:21 -04:00
Ricardo Andrés Marino Rojas
d8a68afc3f Add Support to Run Algos Without Specifying the Algorithm Language (#7643)
* First draft  of the feature

* Improve implementation

* Add more unit tests
2023-12-26 19:18:54 -03:00
Martin-Molinero
a76fad952d Allow disabling subsampling (#7642)
- Optionally allow disabling subsampling, adding unit tests
2023-12-26 11:06:34 -03:00
Martin-Molinero
939b14a6e8 ApiConnection Improvements (#7640)
- Add support for async API calls
- Reuse HttpAuthenticator when possible
2023-12-22 13:30:02 -03:00
Jhonathan Abreu
9601155e28 Remove Polygon from Toolbox (#7638)
* Remove Polygon from Toolbox

* Minor changes
2023-12-21 13:08:53 -03:00
Martin-Molinero
51c70f6c46 Adjust for high/low sampling values (#7639) 2023-12-20 18:05:10 -03:00
Martin-Molinero
dbad754a93 Reduce latency of initial results (#7634)
- Reduce latency of initial Lean results, from 30 to 5 seconds
2023-12-19 20:02:12 -03:00
Martin-Molinero
cd2e4edeb1 Update readme.md 2023-12-15 17:01:17 -03:00
Derek Melchin
3eb9dbb55c Update Alpha.cs (#7630)
The old description is incorrect. A stock can have positive Alpha but have negative Beta. In this case, if the benchmark increases, the performance of the stock may be dominated by its negative Beta, causing it to underperform the benchmark.
2023-12-15 15:59:23 -03:00
Ricardo Andrés Marino Rojas
9bd69a5032 Fix bugs related with Culture Format (#7626)
* Fix bugs related with Culture Format

* Change .Parse method to .TryParse

* Change NumberStyles.Currency to NumberStyles.Any
2023-12-15 15:58:21 -03:00
Alexandre Catarino
d30357db5f Fixes Parse Future Symbol (#7624)
* Adds Unit Tests for ParseFutureSymbol

Tests:
- Ambiguous year with missing decade
- Non-ambiguous known year
- Expiring before 2000

* Fixes Missing Decade Tests

If the ticket doesn't provide a decade, VXZ2, we assume the current decade. So VXZ2 expires on Dec 2022.

* Fixes SymbolRepresentation.ParseFutureSymbol

Use the value of `futureYear` to handle contracts that expire before 2000. (E.g.: NQZ99).
Tickers from live trading may not provide futureYear. Use the current decade (2020).
2023-12-14 20:25:26 -03:00
Ricardo Andrés Marino Rojas
bc313a999b Add PyObject Constructor Overload for FuncRiskFreeRateInterestRateModel (#7625)
* Add overload and regression tests

* Nit changes

* Nit change

* Nit change
2023-12-14 11:04:42 -03:00
Jhonathan Abreu
442dd771a3 Remove dynamic options filter behavior (#7620)
* Make options filter non-dynamic by default and explicitly set

* Deprecate ContractSecurityFilterUniverse.OnlyApplyFilterAtMarketOpen

* Add regression algorithm

* Remove dynamic option chain filter behavior
2023-12-14 10:56:52 -03:00
Martin-Molinero
59b9e571a1 Minor series sampling improvements (#7627)
- Fix bug where there might not be any data to sample. Adding unit test
- Fix bug where candlestick sampling might add point which shouldn't be
  there. Adding unit tests
- Adjust series json converter to serialize any base series type. Adding
  unit test
2023-12-14 09:57:20 -03:00
Derek Melchin
eefa74baaa Add Sortino ratio to statistics and report (#6698)
* Add Sortino ratio to statistics and report

* Adds Sortino Ratio to Report Key Statistics

* Addresses Peer-Review

Reuse `SharpeRatioReportElement` and change the template.

* Reuse Calculations Across Statistics and PortfolioStatistics

* Adds Sortino Ratio to Regression Algorithms

* Removes Sortino Ratio from Optimization Result Table

---------

Co-authored-by: Alexandre Catarino <AlexCatarino@users.noreply.github.com>
2023-12-12 21:06:13 -03:00
Martin-Molinero
fd2a8f84b9 Add support for null chart points (#7622)
* Add support for null chart points

- Add support for null value chart points, updating existing and adding
  new unit tests

* Minor selfreview tweaks

* Address review & fix deserialization bug

* Ignore null values when using NullResultValueTypeJsonConverter

* Narrow NullResultValueTypeJsonConverter conversion support

* Allow inherit of series sampler
2023-12-12 20:26:58 -03:00
Alexandre Catarino
bf30c7d437 Remove Empty Line After Class Summary (#7621)
The empty line causes a problem parsing the summary as the class description.
Removes `&` from S&P.
2023-12-12 20:23:23 -03:00
Ricardo Andrés Marino Rojas
882dcd44b5 Fix Ultimate Oscillator divide by zero exception (#7618)
* Solve bug and add unit test

The bug was raised when the sum of the True Range values was zero. Since
the Ultimate Oscillator provides a more reliable indicator of momentum,
if the prices don't change, its value should be zero, as there is no
acceleration of a security's price.

* enhance implementation
2023-12-08 15:21:07 -03:00
Jhonathan Abreu
b53d76ff3a Bump pythonnet version to 2.0.26 (#7616) 2023-12-08 13:38:39 -04:00
Martin-Molinero
93e63a6250 Add stockplot series type (#7615) 2023-12-07 19:50:17 -03:00
Alexandre Catarino
b84774388c Index.IsTradable Can Be Set (#7610)
* Index.IsTradable Can Be Set

Indices are not tradable. LEAN will not set it to `true`, but the users can for backtesting.

* Adds Regression Tests

* Revert Changes to ProcessSecurityChanges
2023-12-06 21:02:10 -03:00
Ricardo Andrés Marino Rojas
a6580b33fe Update SPDB and add unit test (#7613) 2023-12-06 20:39:40 -03:00
Ricardo Andrés Marino Rojas
09530be51a Solve Invariant of Culture bugs (#7608)
After running the regression tests in my local pc, I found some of them
were failing in the stats. Then, after debugging them I realized it was
because some of the strings were being casted without using
InvariantCulture parameter.
2023-12-05 15:32:03 -03:00
Ricardo Andrés Marino Rojas
dcb5f8ee4e Merge branches 7501 and 7506 (#7605)
* Update Future-cme-[*] and Future-cme-ES

Acoording to `pandas_market_calendars` there were some dates in
Future-cme-[*] who wasn't early_closes, so they needed to be removed
from there. On the other hand, the early closes list of Future-cme-ES were
shifted by 1 hour according to CME webpage. Besides, there were some
missing dates.

* Update CME Future entries in MHDB

* Rebase

* nit change

* Fix unit tests

* Resume after early close/halts

* Add missing dates in MHDB and fix bugs in it

* Fix bug, add more unit tests and add docs

* fix regression algos

* address required changes

* Update failing regression test stats

After debugging the tests it was found they were failing due to the last
change on SecurityExchangeHours.IsOpen(). That method wasn't taking into
account that even if there is a late open after an early close if the
timespan is after the early close but before the late open, the market
is still close.

* enhance solution

* Update and fix bugs in MHDB

* Address required changes and update stats

* Update stats after rebase

* Nit change

* Missing update to regression test

* Use MHDB instead of USHoliday for Expiration Dates

VIX expiry function now relies completely on MHDB. However, it had to be
created an entry in MHDB for VIX since there wasn't one for it. CBOE
webpage only provided 2023 holidays so only those dates were considered
in the Holidays entry in MHDB. Therefore, some unit tests failed so it
was necessary to change also the VIX entry in FuturesExpiryFunctionsTestData.xml.

* Remove Global.cs/USHolidays class

* Use a lazy implementation

* First draft of the solution

* Use MHDB in FuturesExpiryFunctions.cs

* Remove unused class and fix indentation errors

* Fix indentation errors

* Nit changes

* Merge branches 7501 and 7506

* Merge changes in 7501 and 7506

In order to check compatibility between those branches, a new branch
was created out of branch 7501 and then it was merged with branch 7506.
2 regression tests and 8 unit tests failed, the regression tests failed on
the DataPoint stats. On the other hand, the unit tests failed since the
default parameter UseEquityHoliday was removed from
FuturesExpirtyUtilityFunctions.AddBusinessDays() and from other methods in
the same class too.

* Add missing changes

* Remove repeated good fridays

* Address minor review

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2023-12-04 18:09:57 -03:00
Martin-Molinero
e5ab96a306 Update readme.md 2023-12-04 12:40:11 -03:00
Martin-Molinero
67472b62c6 Future daily settlement model fix (#7607)
- Future daily settlement model fix. Adding unit test reproducing issue
2023-12-04 12:10:18 -03:00
Roman Yavnikov
639ae479a8 feat: ETFConstituentsModel overloading constructor (#7598)
* feat: ETFConstituentsModel overloading constructor
* test

* feat: new constructor of ETFConstituentsUniverse
test: support all constructor on c#

* feat: cached symbol in ETFConstituentsUniverse.py
test: validate getting symbol from cahed collection

* remove: extra ctor in ETFConstituentsUniverseSelectionModel

* refactor: add miss condition secType in py
refactor: rename out existTicker -> Symbol
refacotr: rewrite test

* feat: new ETFConstituentsFrameworkAlgos

* refactor: more neat ETFConstituentsAlgos

* fix: CompositeUniverse to SetUniverse
2023-12-01 17:20:52 -03:00
Martin-Molinero
cdedac9eda Update readme.md 2023-11-29 15:04:12 -03:00
Martin-Molinero
e85ccb3e36 Minor SerializedOrderEvent Tweak (#7603) 2023-11-29 11:19:56 -03:00
Martin-Molinero
f1627a9c96 Minor foundation update (#7602)
* Minor foundation update

* Add Xtransformers test
2023-11-28 18:23:43 -03:00
Jhonathan Abreu
82ee9f3599 Ensure crypto futures case is considered in time-in-force-checks (#7601)
Also ensure crypto futures ticks can be read from a line
2023-11-27 19:44:16 -03:00
Adrian Tkacz
f4b41c5793 Alpha Indicator #6985 (#7566)
* Alpha Indicator #6985

* Switched to RateOfChange and Beta

* Added RiskFreeRate param

* Added overload method (without name)

* Changed how Return is calculated
Code refactoring

* Use interest rate provider to automatically get the risk free rate

* Removed InterestRateProvider

* Applied Risk-Free Interest Rate Model

---------

Co-authored-by: Adrian Tkacz <adrian.tkacz@creatdy.com>
2023-11-24 11:31:15 -03:00
Martin-Molinero
c67dcfcc69 Order PriceAdjustmentMode & LeanManager tweaks (#7595)
- Relax PriceAdjustmentMode set property restriction to facilitate
  testing
- Set LocalLeanManager protected
2023-11-22 17:20:22 -03:00
Jhonathan Abreu
f8ca85cb5d Risk-Free Interest Rate Model (#7594)
* Implement risk free interest rate as an algorithm model

* Use risk free insterest rate model in Sharpe Ratio indicator

* Address peer review

Also added python wrapper

* Take pyobject as interest rate model in Sharpe Ratio indicator

* Minor fix

* Minor fix

* Address peer review
2023-11-22 16:17:34 -04:00
Roman Yavnikov
4c034bd40f Brokerage.Eze, launcher config (#7593)
* feature: eze config in launcher

* feat: add support IndexOption
2023-11-22 10:23:35 -03:00
Jhonathan Abreu
4b1f751adb Update Pythonnet version to 2.0.25 (#7591) 2023-11-21 17:25:36 -04:00
Martin-Molinero
7498d2e6e2 QuantBook Universe Selection (#7587)
* QuantBook Universe Selection

- QuantBook universe selection helper method. Adding new unit tests.
- Universe selection data sets improvements

* QuantBook API renames
2023-11-21 17:05:02 -03:00
Martin-Molinero
adaa2f5862 Cleanup data cache provider in tests (#7588) 2023-11-21 16:48:36 -03:00
Jhonathan Abreu
a761c769be Fix brokerage transaction handler null object access bug (#7586)
* Fix using brokerage transaction handler algo befor set

Brokerage open orders are being set before algorithm is set to the transaction handler, so SetPriceAdjustmentMode needs to get the algo to use

* Update unit tests
2023-11-20 11:00:55 -03:00
Gustavo Aviles
6cc2bc64c0 Update enum docs to match others (#7583) 2023-11-20 10:49:02 -03:00
Jhonathan Abreu
314a334e88 Price adjustment mode Order property (#7582)
* Add new Order.PriceAdjustmentMode property

* Minor fix and unit test

* Minor fix and regression algorithms' stats update

* Unit test fixes

* Minor fix

* Set order price adjustment mode to raw always for live trading
2023-11-17 16:09:03 -04:00
Martin-Molinero
830df29f73 Avoid termination on empty live cash balance (#7581)
- Avoid algorithm termination on empty live cash balance if there was no
  error
2023-11-17 11:16:00 -03:00
Martin-Molinero
5e9901c667 Shortable modeling improvements (#7579)
* Shortable modeling improvements

- Do not limit live trading because of shortable model, will send
  algorithm warning
- Add Interactive brokers shortable provider
- Minor LocalDiskShortableProvider API changes

* Fix shorted order update

- Fix shorted order update. Updating regression algorithm

* Minor improvement

* Address reviews
2023-11-16 16:25:56 -03:00
Alexandre Catarino
1a66846f9e Improves Error Handling in OptionPriceModelResult.Evaluate (#7575)
* Improves Error Handling in OptionPriceModelResult.Evaluate

Use the maturity calculation to calculate dividend and risk free discount to prevent the `negative time` error.

Adds Exception Message and StackTrade to `DebuggingEnabled` messages.

* Set Evaluation Date Before Every Calculation

Adds loggings to record the reference date which is set by the `Settings.setEvaluationDate` method.
2023-11-16 16:05:47 -03:00
Martin-Molinero
408ffc0067 Add null slippage model (#7580)
- Add null single instance slippage model
2023-11-16 16:03:37 -03:00
Martin-Molinero
e983383e0e Revert "Store traded securities' subscriptions in results (#7567)" (#7578)
This reverts commit 145ead7cec.
2023-11-15 21:01:15 -03:00
Martin-Molinero
428d620203 Revert "Disable traded securities configs storage for live trading (#7574)" (#7577)
This reverts commit 9029c70a99.
2023-11-15 21:00:36 -03:00
Martin-Molinero
de10a1d669 Remove securities from algorithm collection (#7573)
- Once a security has been delisted or no longer selected by any
  universe it will be remove from the main algorithm securities
  collection but kept in the new Complete collection, this improves
  performance in long running backtests where security collection can
  get enumerated in different cases
- Minor refactor for security exchange local time to avoid having to set
  it explicitly
2023-11-15 17:09:43 -03:00
Jhonathan Abreu
9029c70a99 Disable traded securities configs storage for live trading (#7574)
* Disable storing trades securities configs for live trading

* Minor change

* Minor change
2023-11-15 11:25:47 -04:00
Grzegorz Wodnicki
3f818dc878 correlation as lean indicator #6983 (#7543)
* correlation as lean indicator #6983

* correlation as lean indicator #6983, added SPY QQQ test and Spearman test

* correlation as lean indicator #6983

* correlation as lean indicator #6983, fixes after review

* correlation as lean indicator #6983, fixes after review

* correlation as lean indicator #6983, fixes after review

* correlation as lean indicator #6983, added AcceptsQuoteBarsAsInput Test

* Minor review changes

---------

Co-authored-by: Grzegorz Wodnicki <info@funchips.co.uk>
Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2023-11-13 20:40:14 -03:00
Jhonathan Abreu
145ead7cec Store traded securities' subscriptions in results (#7567)
* Store traded securities subscription data configs to disk

* Delegate traded subscriptions storage to the data monitor

* Add unit tests

* Address peer review

* Minor changes
2023-11-13 20:39:57 -03:00
Ricardo Andrés Marino Rojas
5c226319b0 Use MHDB in VIX FutureExpiryFunction (#7564) 2023-11-10 20:31:34 -03:00
Jhonathan Abreu
81723ddf46 Get ZipDataCacheProvider timer from config (#7563) 2023-11-10 14:07:00 -03:00
Roman Yavnikov
dd27a65960 Eze: remove extra internal accessors (#7561)
* feat: init eze-brokerage

* remove: eze from market collection

* remove: extra comma

* feat: add missing Security support

* feat: add Eze Order Properties

* feat: description, less code, remove extra configs

* Minor changes

* remove: internal accessor from EzeOrderProperties

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2023-11-10 13:55:00 -03:00
Martin-Molinero
978494c12c Update readme.md 2023-11-06 19:13:57 -03:00
Martin Molinero
1f22299036 Cleanup 2023-11-06 18:57:05 -03:00
Martin-Molinero
e78d3083c5 Async universe selection (#7556)
* Async universe selection

- Add support for async universe selection, which will happen ahead of
  time in the data stack for a performance improvement

* Thrown if using Coarse+Fine Asynchronous Universe selectioon
2023-11-06 18:46:20 -03:00
Roman Yavnikov
e0251bdb23 Feature/eze support (#7526)
* feat: init eze-brokerage

* remove: eze from market collection

* remove: extra comma

* feat: add missing Security support

* feat: add Eze Order Properties

* feat: description, less code, remove extra configs

* Minor changes

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
2023-11-06 12:35:38 -03:00
Martin-Molinero
c5eaf34b4e Update readme.md 2023-11-02 18:27:02 -03:00
Jhonathan Abreu
a9d26084f9 Options algorithm performance enhancement (#7555)
* Ignore non-market universe data for security cache storage

This is a performance enhancement

* Minor refactor
2023-11-02 17:20:54 -04:00
Martin-Molinero
2f75c68312 Minor test brokerages fixes (#7552)
* AlgorithmStub Lazy Pandas Converter Set

* Fix brokerages tests adding orders twice
2023-11-01 18:23:30 -03:00
Jhonathan Abreu
d2f8c73d31 Invalidate option orders during a stock split (#7550)
* Invalidate option orders during a stock split

* Add unit test

* Minor changes

* Minor comments

* Options orders on split one time warning
2023-11-01 17:07:04 -03:00
Martin-Molinero
7c176910d7 Make sure algorithmstubs initializes python (#7551)
- Make sure the test algorithm stubs class initializes python before
  trying to set the pandas data converter which requires python
2023-11-01 15:09:00 -03:00
Martin-Molinero
4237d40173 Minor fix for python history tests (#7549)
* Minor fix for python history tests

* Add comment explaning why

* Handle enumerator throwing exception
2023-10-31 18:49:57 -03:00
Martin-Molinero
9f79016975 Fix new fundamental python deadlock 2 (#7548)
Fix new fundamnental python history usecase deadlock
2023-10-31 15:44:52 -03:00
Jhonathan Abreu
c0801afdbe Fix using custom data with Bybit brokerage model (#7547)
* Fix using custom data with Bybit brokerage model

* Add unit tests
2023-10-31 14:19:17 -03:00
Martin-Molinero
b21b6b9859 Fix deadlock on python new fundamentals (#7546) 2023-10-31 10:27:19 -03:00
Martin-Molinero
43585ac194 Add missing local OOS optimization config (#7545) 2023-10-30 19:12:52 -03:00
Martin-Molinero
4b06ca9147 Out of sample support tweaks (#7542)
* Add backtest job end date handling

* Fixes & rebases

* Refactor out of sample configuration handling

* Minor datetime format tweak
2023-10-27 18:23:21 -03:00
Louis Szeto
7d3733ccb7 Slippage model by market impact factors (#7513)
* Add Market Impact Slippage Model

* Add unit tests

* Add regression tests and random seeds

* Address peer review 1

* Add non-negative logic choice

* address peer review 2

* timezone setting adjustment

* Address peer review 2

* address second review

* minor updates

* minor updates

* Nit

* fix regression tests

* fix CI

* Rebase and fix CI

* regression test
2023-10-27 17:43:44 -03:00
Alexandre Catarino
f5d4bc4f7b Beta Indicator Supports QuoteBar (#7540)
* Adds Unit Test to Assert Beta Accepts QuoteBar

Beta must support QuoteBar for Forex/CDF and QuoteBarConsolidators

* Beta Indicator Supports QuoteBar
2023-10-27 13:12:39 -04:00
Martin-Molinero
265fbf7e60 Minor tweak for fundamental datetime type (#7541) 2023-10-27 11:51:26 -03:00
Jhonathan Abreu
2963936695 Bump Pythonnet version to 2.0.24 (#7539) 2023-10-27 10:02:08 -04:00
Jhonathan Abreu
d81f57b7a6 Bybit futures backtesting support (#7530)
* Add Bybit brokerage model regression algorithm

* Add BibytFutures brokerage model name and Bybit backtesting regression algorithms

* Add Bybit margin calculations unit tests

* Minor changes in data

* Unify Bybit Spot and Futures brokerage model into one class

* Add new Bybit configurations

* Revert config change
2023-10-26 20:03:10 -03:00
Martin-Molinero
88c7f7ff3b Fix QuantBook fundamental unit test (#7537) 2023-10-26 18:37:45 -03:00
Martin-Molinero
2e2136f7b8 Add missing multiperiod fields fundamental properties (#7536) 2023-10-26 13:15:05 -03:00
Martin-Molinero
f8b258d329 New Fundamental Data (#7490)
* New Fundamental Data

* Minor CIK lookup fix

* Handle live mode & delete unexisting properties

* Minor coarse fundamental adjustment

* Add fundamental history support

* Fix unit tests

* Performance improvements

* Fixes

* Minor regression algorithm fix

* Improvements. Add FundamentalUniverseSelectionModel

* Change default values

* Fix unit test

* Minor tweaks

* Fix unit test

* Minor error handling improvement

* Fix rebase
2023-10-25 15:47:42 -03:00
Martin-Molinero
4411d4a8fc Add missing Shimmy dependency (#7532)
- Add missing shimmy dependency
- Update, to normalize arm libraries with amd
2023-10-24 20:21:21 -03:00
Alexandre Catarino
99affdebef Updates Beta Indicator (#7533)
Adds a new constructor overload that matches the pattern in Lean: Symbol, Symbol, other types.
Adds a new constructor that infers the indicator name: "B(period)".
2023-10-24 19:57:47 -03:00
Martin-Molinero
8fa1f3659c Reduce foundation size (#7527)
- Reduce foundation size and minor library update
2023-10-23 13:14:46 -03:00
Martin-Molinero
005bebe224 Add new libraries and updates (#7522)
* Add new libraries and updates

* ARM foundation update

- Deleting creme library which has been merged into already included river, because it causes copulae build to fail
- Deleting Riskfolio-Lib which would try to install old numpy and fail
2023-10-20 19:19:32 -03:00
Jhonathan Abreu
1df11c0c64 Add Pythonnet's ClrBubbledException interpreter (#7523)
* Add ClrBubbleExceptionInterpreter

* Add ClrBubbledExceptionInterpreter tests

* Bump pythonnet version to 2.0.23

* Minor changes

* Minor change

* Minor fix

* Fix failing unit tests
2023-10-20 11:26:47 -03:00
Martin-Molinero
fff037b9c9 Bybit coinapi support (#7519) 2023-10-18 10:36:35 -03:00
Martin-Molinero
2959581d19 Update to pythonnet 2-0-22 (#7515) 2023-10-13 10:23:05 -03:00
Jhonathan Abreu
2232861c64 Modify AggregationManager implementation to improve reutilization (#7514) 2023-10-12 11:44:49 -03:00
Ricardo Andrés Marino Rojas
33eb9dec9b Solve missing bug with TimeZones (#7511) 2023-10-11 15:44:39 -03:00
Jhonathan Abreu
07fbbe65bb Default market hours to Always Open for base securities without subscription (#7509)
* Set default always open market hours entry for base security without subscription

Also return proper matching subscription for custom data symbols wihtout subscription.

* Minor changes

* Minor change
2023-10-11 15:36:38 -03:00
Alexandre Catarino
6e854550aa Adds Logging to OptionPriceModelResult.Evaluate (#7510)
To investigate zero Implied Volatility and Greeks.
2023-10-11 11:00:00 -03:00
Alexandre Catarino
93086b06db Improves Expiration/SetFilter Documentation (#7508)
The minimum and maximum expiration description was not correct.
2023-10-10 21:01:06 -03:00
Ricardo Andrés Marino Rojas
b86f001f8a Remove wrong Holiday from MHDB (#7503)
* Fix bug and add unit tests

* Update regression test
2023-10-09 20:49:37 -03:00
Ricardo Andrés Marino Rojas
844602c04a Fix bug with custom data subscription with the same symbol from multiple exchanges (#7500)
* Fix bug and add regression algo

* nit changes

* nit changes
2023-10-04 18:27:25 -03:00
Jhonathan Abreu
1a5a08175b New Terminal Link order properties (#7499)
* Add Account, Broker and Strategy TerminalLink order properties

* Minor changes
2023-10-04 18:16:39 -03:00
Alexandre Catarino
cbccb6e5cf Adds SimpleCustomFillModel to CustomModelsAlgorithm (#7498)
* Adds `SimpleCustomFillModel` to `CustomModelsAlgorithm`

The simple fill model shows how to implement a simpler version of the most popular order fills: Market, Stop Market and Limit.

This model was tested on QuantConnect Cloud, and will serve as additonal example, since we don't have an example that does not reuse the method of the base class.

* Handles Tick Resolution Case

Tick-resolution data doesn't have TradeBar. We can use the security price, since it represents a trade (`TickTrade`).
2023-10-04 18:07:32 -03:00
Martin-Molinero
78a9b80bbf Minor live result handler sampling fix (#7497)
- Make sure in live trading the result handler will correctly update the
  algorithm equity
2023-10-03 14:41:55 -04:00
Ricardo Andrés Marino Rojas
a0914e2ab1 Copy Data folder (#7496) 2023-10-03 09:48:56 -03:00
Jhonathan Abreu
fb3409d8a2 Custom data sourced from the object store (#7493)
* Support sourcing custom data from ObjectStore

* Add Python regression algorithm

* Wire engine to pass ObjectStore down to the stream readers

* Minor changes

* Minor unit tests fixes

* Remove unused SetupHandlerParameters.ObjectStore

* Minor changes

* Minor changes

* Support single-file zipped data to be sourced from object store

* Assert object store custom data history requests in regression algorithms

* Add custom object store data live data feed unit test

* Add multi-file object store custom data regression algorithms

* Minor fix
2023-10-02 15:54:57 -03:00
Ricardo Andrés Marino Rojas
b4bad69772 Dynamically Adjust Risk Free Rate of Return (#7489)
* First attempt to solve the bug

* Enhance implementation

* Enhance implementation

* Simplify implementation

* Rebase regression stats

* Solve unit test bugs

* Review

* Update Rolling.Sharpe() method

* Update regression stats

* Update unit tests

* Update missing regression algos

* Update Rolling.cs

---------

Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
Co-authored-by: Martin-Molinero <martin@quantconnect.com>
2023-10-02 13:42:28 -03:00
Ricardo Andrés Marino Rojas
b29e009d4d Remove unused methods (#7494)
All of the methods removed were used in the Statistics.Generate()
method, which is used no more in LEAN (See commit fac6f46)
2023-09-29 20:13:56 -03:00
Jhonathan Abreu
28eb1a4da4 Wire ROC for updates in risk parity PCM (#7485) 2023-09-26 11:28:12 -03:00
Ricardo Andrés Marino Rojas
2a1539cce6 Add Notes field in FixOrderProperties (#7491) 2023-09-26 11:27:03 -03:00
Martin-Molinero
b08fc979cf Update readme.md 2023-09-26 09:24:30 -03:00
Martin-Molinero
2128630389 Add Terminal Link Custom Order Notes (#7488) 2023-09-25 13:13:05 -03:00
Sebastian Karasek
6d35bfd3bc Ignore duplicate brokerage data (#7487) 2023-09-25 13:09:43 -03:00
Jhonathan Abreu
d12772d8eb Fix race condition in OptionModelsConsistency algorithms regarding log handler (#7482) 2023-09-22 12:01:33 -04:00
Louis Szeto
3db538d690 Add missing documentation attributes (#7481)
* Add missing documentation attributes

* Address peer review
2023-09-22 11:10:07 -03:00
Jhonathan Abreu
1c85ab164f Updated UniverseDefinitions.ETF|Index overloads for Python compatibility. (#7480)
Calling UniverseDefinition.ETF("TICKER",...) in Python was resolving the UserDefinition.ETF(Symbol...) overload due to Symbol's implicit string operator, causing the symbol to be wrongly created.
2023-09-21 18:12:27 -03:00
Ricardo Andrés Marino Rojas
d9923929b9 Solve bug in Tick Consolidator for Quote and Trade Tick types (#7475)
* Changes up to the date

* Revert "Changes up to the date"

This reverts commit 45dc9756bc.

* First attempt to solve bug

* Improve solution

* Add unit tests

* Fix bugs and add regression tests

* Solve bugs
2023-09-21 11:31:16 -03:00
Jhonathan Abreu
39f5f55b17 Avoid adding extra index subscriptions in AddOptionContract (#7479)
* Check for existing subscription before adding underlying in AddOptionContract

* Minor change
2023-09-21 11:30:05 -03:00
Martin-Molinero
a6c5448bb2 Add Bybit stable currencies & fix test log (#7474) 2023-09-20 13:56:59 -03:00
Martin-Molinero
0e182ae75f Add terminal link order properties (#7471) 2023-09-18 19:03:34 -03:00
Martin-Molinero
621d16eea8 Adjust order processor set location (#7468) 2023-09-18 12:17:55 -03:00
Martin-Molinero
fbad58161b Update readme.md 2023-09-18 11:47:33 -03:00
Sebastian Karasek
8a243059b0 Add Bybit integration (#7442)
* Add Bybit integration (#5898)

* Bybit order property update

XML docs

* Revert changes to Exchange.cs

* Cleanup

* Add bybit to config.json

* Fix default markets

* Update symbol properties

* Add file headers

* Fix possible order status for updating

* Update spdb

* Fix spdb

* Fix spdb
Remove orderbook depth settings

* Throws exception when spot brokerage is created with margin account
Fix tests

* Remove USDC contracts
2023-09-18 11:08:40 -03:00
Martin-Molinero
d276d6382d Update Binance SPDB (#7466)
* Update Binance SPDB

- Update Binance & BinanceUS SPDB

* Fix unit tests
2023-09-15 20:05:42 -03:00
Martin-Molinero
489fc5bd5f Fix chart api fetching and deserialization (#7467) 2023-09-15 20:04:46 -03:00
Ricardo Andrés Marino Rojas
fb489daa3e Feature trading technologies order properties (#7465)
* Create TradingTechnologiesOrderProperties

* Add XML docs

* Nit change

* Abstract FIX order properties
2023-09-15 12:50:47 -03:00
Alexandre Catarino
7e27ab74bb Deprecates IAlgorithmSettings.DataSubscriptionLimit (#7457)
* Deprecates IAlgorithmSettings.DataSubscriptionLimit

We will let the brokerage check and notify users that they have subscribed to datafeeds beyond their quota.

* Removes Unit Test

Also remove usage in `EmptyEquityAndOptions400Benchmark`.
2023-09-08 19:41:52 -03:00
Martin-Molinero
f93c9edfcb Update readme.md 2023-09-08 18:22:35 -03:00
Jhonathan Abreu
60a69cbf1d Fix brokerage tests race condition (#7458)
* Fix brokerage tests filled order modification race condition

* Listen to fill event in test setup in brokerage tests

* Minor changes

* Address peer review

* Minor changes
2023-09-07 19:35:29 -03:00
Henrik Strand
eccd1e7931 Fix typo (#7460) 2023-09-07 19:27:34 -03:00
Jhonathan Abreu
90a6d2f68f Insight and PortfolioTarget tag (#7456)
* Add Tag property to Insight

* Add PortfolioTarget Tag property

* Minor change

* Minor unit test fix
2023-09-07 16:59:01 -04:00
Jhonathan Abreu
372c197890 One-time warning for mismatching canonical/contracts security models (#7452)
* Send one-time warning about mismatching canonicals/contracts models

* Add regression algorithms
2023-09-06 10:57:16 -04:00
Martin-Molinero
f0c253c50b Update readme.md 2023-08-30 17:23:15 -03:00
Martin-Molinero
76c0ab01ee Update readme.md 2023-08-30 13:56:24 -03:00
Ricardo Andrés Marino Rojas
e47b4e63ab Collective2 module modernization and finalization (#7448)
* Removed platformId support from C2.
Modernized C2 API calls to APIv4.
Added C2 rate limiters (RateGate).
Added response logging so users can easily debug their code.
Added a few symbols for the demo.

* Address requested changes

* Address requested changes

---------

Co-authored-by: Francis Gingras <francis@collective2.com>
2023-08-30 13:48:10 -03:00
Landon Wilkins
f70cf97dee [typo] Update readme.md (#7449) 2023-08-30 12:59:29 -03:00
Ricardo Andrés Marino Rojas
b9f3b1a4a4 Add support for Fill models with COMBO orders in Python (#7446)
* Add support for Combo Orders with Fill Model

- Override ComboMarketFill, ComboLimitFill, ComboLegLimitFill in
  FillModelPythonWrapper.cs
- Modify FillModel.Fill() to use Python Fill model if it exists when the
  order is COMBO
- Add regression algorithm ComboOrdersFillModelAlgorithm.py

* Add regression algorithm

* Add regression algos

* Fix bug
2023-08-29 10:06:32 -03:00
Martin-Molinero
1645f9877e Minor serialization tweak (#7447) 2023-08-28 10:30:34 -03:00
Martin-Molinero
52c6d43d2e Update readme.md 2023-08-25 15:56:05 -03:00
Martin-Molinero
04fc0d5093 Update readme.md 2023-08-25 15:36:49 -03:00
Martin-Molinero
56164f636a Fix for continuous contract mapping (#7445)
- Remove mapping mode from map file since it can be reused and make it
  an argument when mapping. Adding unit test
2023-08-25 14:19:51 -03:00
Martin-Molinero
dc64a340ba Minor live performance improvements (#7441) 2023-08-23 19:20:46 -03:00
Ricardo Andrés Marino Rojas
8e0e823f66 Add Lumber Futures LBR (#7440)
* Update SB, MHDB and ExpirationFunctions

* Add unit tests

* Address required changes

* Nit change

* Nit change
2023-08-23 19:19:16 -03:00
Ricardo Andrés Marino Rojas
18e848853d Approximate order price for options when using IB Fee model (#7436)
* Modify IB Fee model to work without order.Price

* Fix bugs and add unit tests

* Update regression tests

* Solve bug and address changes

* Nit change

* Fix stats
2023-08-23 09:56:23 -03:00
Martin-Molinero
038d7a26b2 Update readme.md 2023-08-21 11:56:59 -03:00
Martin-Molinero
4ca5526461 Refactor object store file handling (#7438)
- Add FileHandler for local object store file operations
2023-08-21 10:11:07 -03:00
Louis Szeto
d9e4dba687 Change default American Option Pricing model to Binomial CRR model (#7426)
* Add unit test and test data

* Add unit test for model greeks accuracy and comparison

* Add regression test

* Correction on previous unit test to use realtime official IB Greeks

* Switch default American option price model to CRR model

* Address peer review
2023-08-18 14:34:46 -03:00
Martin-Molinero
5f2bae1de5 COrrectly handle subt generation failure (#7434) 2023-08-17 13:06:54 -03:00
Ricardo Andrés Marino Rojas
e065c752cc Fix bugs in InteractiveBrokersFeeModel.cs for Combo Market Order fees (#7432)
* Draft of unit test to reproduce error

* Fix bug and regression tests

* Remove draft unit test

* Check fees in ComboMarketOrderAlgorithm.cs

* Fix bug in fees for combo orders

- Update regression tests
- Solve bug in fees when combo orders had legs with different quantity
- Solve bug in fees when combo orders had legs with different security
  types
- Update IB comission rate for options where the price is higher than 0.1 USD

* Add explaining comments

* Use leg security fee model
2023-08-14 19:18:53 -03:00
Martin-Molinero
bc34c33c77 Update readme.md 2023-08-10 14:49:09 -03:00
Martin-Molinero
8f1dc76c7f Fix optimization candlestick handling (#7430)
* Fix optimization candlestick handling

- Fixes for optimization candlestick handling
- Centralize deserialization of ChartPoint into new
  ChartPointJsonConverter

* Minor fixes

- Update failing tests
- Update CI to fail if anything fails
2023-08-10 13:34:19 -03:00
Martin-Molinero
505ea3bd72 Update readme.md 2023-08-10 10:16:50 -03:00
Martin-Molinero
eecafbea09 Update readme.md 2023-08-10 09:48:29 -03:00
Martin-Molinero
0b47c84b8a Update readme.md 2023-08-09 15:10:30 -03:00
Ricardo Andrés Marino Rojas
4c3658f9d4 Fix bug in Momentum indicator (#7424)
* First attempt to fix bug

* Address requested changes

* Do not hide WarmUpPeriod property
2023-08-09 14:56:24 -03:00
Martin-Molinero
d8c58fb9e2 Minor candlestick json converter backwards compatility fix (#7428)
- Minor bug fix for candlestick json converter backwards compatibility,
  detected running the new report generator on an old lean backtest
  result json
2023-08-09 14:53:00 -03:00
Ricardo Andrés Marino Rojas
1fd0dd3566 Do not embellish parameters key names (#7427) 2023-08-09 14:27:10 -03:00
Jhonathan Abreu
6109ac8f1b Candlestick charts (#7425)
* Candlestick charts base implementation

* Series and Candlestick series json serialization

* Some cleanup

* Add AddPlot method for candlestick series to QCAlgorithm

* Remove Values property from ISeriesPoint

* Add candlestick QCAlgorithm.Plot trade bar methods

* Implement candlestick series re-sampling

* Add more SeriesSampler unit tests

* Add examples of candlestick charts usage to exisiting charting algorithm

* Address peer review

* Address peer review

* Derive Candlestick from Bar

* Sampler changes

* Add new series types from the cloud

* Add more candlestick series sampler tests

* Minor cleanup

* Minor changes
2023-08-08 17:52:46 -03:00
Ricardo Andrés Marino Rojas
aae4771b7e Fix Overflow bug in RandomDataGenerator (#7423)
* First attempt to fix the bug

* Allow the splitFactor to change over time

- Add unit test

* Nit change

* Address required changes

* Address required changes

* Adjust upper bound
2023-08-08 16:40:01 -03:00
Jhonathan Abreu
76b19161cb Fix updating StopLimitOrder.StopTriggered flag globally (#7407) 2023-08-08 16:37:47 -03:00
Henrik Strand
6e9df75d32 Replace chat badge (Slack -> Discord) (#7420) 2023-08-08 12:07:42 -03:00
Arthur Asenheimer
aae3f8b4d9 Fix minimum price variation for LE future (#7421)
* Adds IndicatorBatchUpdate

* Revert "Adds IndicatorBatchUpdate" (#3)

* Update symbol-properties-database.csv (#4)

Minimum price fluctuation for LE is supposed to be 0.00025 according to CME. (See also: https://www.cmegroup.com/markets/agriculture/livestock/live-cattle.contractSpecs.html)
2023-08-08 12:07:23 -03:00
Martin-Molinero
04bb2b503f Update readme.md 2023-08-04 15:54:57 -03:00
Martin-Molinero
df13e34e9e Update readme.md 2023-08-03 11:04:32 -03:00
Martin-Molinero
4976fc9a99 Revert breaking plotly update (#7415) 2023-08-03 10:57:22 -03:00
Ricardo Andrés Marino Rojas
aa1ebd0e65 Bug parameters in report bug (#7413)
* Solve bug in the parameters of the Report

Before, when the number of keys were odd a part of the raw template was
shown in the report generated. Additionally, the user couldn't define
the number of columns of the parameters table

* Add unit tests

* Enhance unit tests

* Nit change
2023-08-02 15:28:48 -03:00
Martin-Molinero
d1b8c13318 Dependency update and cleanup (#7411)
- Update Math.Numerics & QLNet to latest
- Remove unused old FSharp core causing issues
2023-08-01 19:26:20 -03:00
Martin-Molinero
a139aac522 Update readme.md 2023-08-01 14:46:37 -03:00
Ricardo Andrés Marino Rojas
3338486b52 Enable Report generator to use custom HTML template (#7410)
* Add support for custom HTML file in Report

* Add support for custom crisis HTML template

* Revert "Add support for custom crisis HTML template"

After considering this option carefully, the QC team has decided to
add this functionality in a different way.

This reverts commit aead1ff850.

* Get parameters and crisis HTML custom templates

* Move parameters html template to a file

* Nit change

* Remove template.crisis.html and add unit tests

* Nit change

* Nit change

* Add unit tests for the fail cases
2023-08-01 12:55:14 -03:00
Martin-Molinero
0c0eedf547 Update readme.md 2023-07-28 20:19:05 -03:00
Martin-Molinero
e8c1b0df48 Fix for CI python stubs (#7405) 2023-07-28 20:13:03 -03:00
Martin-Molinero
ed1362c8b0 Update readme.md 2023-07-28 18:56:46 -03:00
Jhonathan Abreu
906ab20bee Trailing stop orders (#7402)
* Add trailing stop orders base implementation

* Handle trailing stop order prices rounding

* Implement trailing stop orders fill logic

* Minor fill model changes

* Add ApplySplit to fill model interface for models that might need to be aware of splits.

Filling trailing stop orders require keeping track of min/max prices, which need to be split adjusted.

* Add brokerage order updated event for communicating certain order types prices changes

* Add order update event args class for brokerage side order updates

* Revert IFillModel.ApplySplit

* Add trailing stop orders regression algorithm

* Updated order ticket demo algorithm to include trailing stop orders

* Some cleanup

* Support trailing stop orders in IB brokerage model

* Some cleanup

* Fix failing tests

* Fix failing regression algorithm

* Address peer review

* Add trailing stop price calculation unit tests

* Minor changes

* Minor change
2023-07-28 17:49:58 -04:00
Jhonathan Abreu
10a9f31d65 Return valid default value for indicator Previous property (#7404) 2023-07-28 18:36:13 -03:00
Ricardo Andrés Marino Rojas
0817101bcd Include AlgorithmConfiguration.Parameters in the report generated and allow to override stylesheet (#7401)
* Add algorithm configurations to Report

* Add just Parameters section in the Report

* Revert "Add just Parameters section in the Report"

This reverts commit 775255127a212db81fc1cc1e23a35b7c60214eac.

* Include just AlgorithmConfiguration.Parameters

* Create ParametersReportElement

* Generate parameters into HTML dynamically

* Enable the user to modify CSS content throu

* Enable CSS override file to be passed through cmdline

* Check CSS Override file exists

* Fix bugs

* Address required changes

* Address required changes

* Address required changes
2023-07-28 18:33:24 -03:00
Ricardo Andrés Marino Rojas
3e9fc57bb0 Implement RangeConsolidator (#7385)
* Implement RangeConsolidator

It turned out that the behavior of RangeConsolidator was similar to
ClassicRenkoConsolidator. Then, some of the ClassicRenkoConsolidator
methods, were abstracted to new class called BaseTimelessConsolidator.cs,
from which both RangeConsolidator and ClassicRenkoConsolidator could
inherit, therefore resusing code. The following tasks were done:

- Create RangeConsolidator.cs
- Create RangeBar.cs
- Create BaseTimelessConsolidator.cs
- Create RangeConsolidatorTests.cs
- Modify ClassicRenkoConsolidator.cs

* Allow intermediate/Phantom RangeBar's

- Enhance unit tests
- Nit changes
- Allow intermediate/Phantom RangeBar's on RangeConsolidator

* Nit changes

* Create ClassicRangeConsolidator and more changes

- Add regression tests
- Enhance unit tests

* Address required changes

* Address requested changes

* Address requested changes

* Add regression tests with Tick Resolution

* Address required changes

* Increase Range for RangeConsolidatorWithTickAlgo

* Add more unit tests and solve bugs

* Nit change
2023-07-27 10:02:02 -03:00
Martin-Molinero
e442586a0d Test CI workaround (#7399)
- Replace default container gh ci support for custom action to enable
  cleaning up host
2023-07-24 19:23:16 -03:00
Arthur Asenheimer
adca9ea5b3 Fixed minimum price variation for Futures LE and HE (#7394)
* Adds IndicatorBatchUpdate

* Revert "Adds IndicatorBatchUpdate" (#3)

* Fixed minimum price variation for Futures ZL and HE
2023-07-24 11:15:23 -03:00
Martin-Molinero
947a3fc93b Delete mounted tools (#7396) 2023-07-21 13:40:39 -03:00
Jhonathan Abreu
b1b9680880 Handle API backtest charts read null requests (#7395) 2023-07-21 13:40:26 -03:00
Martin-Molinero
7aabea102b Update readme.md 2023-07-20 20:29:36 -03:00
Jhonathan Abreu
2522a14050 Fix naked index option margin requirement percentage (#7391) 2023-07-20 19:29:02 -03:00
Jhonathan Abreu
69eea5419c Make symbol-count optional and dependent on tickers in random data generator (#7390) 2023-07-20 19:23:50 -03:00
Martin-Molinero
a6283b0ab7 Fix unsupported configuration warnings filter (#7386) 2023-07-19 12:10:10 -03:00
Martin-Molinero
2a941e73e2 Add warning for unsupported live configurations (#7383)
- Add warning for unsupported live configurations
2023-07-18 16:18:56 -03:00
Martin-Molinero
1c3180b681 Do not transition from canceled to invalid order (#7382)
- Minor adjustment not to transition from canceled to invalid order
  status, which can happen in some cases in live trading as a race
  condition. Adding unit test
- Make sure open order status is set to submitted if none provided,
  adjusting existing test
2023-07-18 16:16:08 -03:00
Martin-Molinero
ffcfb4eeb2 Adjust debugger version for pycharm 2023.1.4 (#7381) 2023-07-18 16:15:58 -03:00
Martin-Molinero
e2ee42a0e2 Respect minimum time in universe always (#7379)
- Always respect the minimum time in universe even if we haven't gotten
  any data point yet. This is specially useful for live trading options
  which are illiquid
2023-07-17 14:57:29 -03:00
Lehonti Ramos
026ba6ed5b Modernization of syntax used in argument check exceptions (#7380)
* Changed argument exceptions so that they used the nameof() operator for parameter names

* Update IQSocket.cs

---------

Co-authored-by: John Doe <john@doe>
Co-authored-by: Martin-Molinero <martin@quantconnect.com>
2023-07-17 14:53:17 -03:00
Martin-Molinero
3a3dbe29ea Bug chain selection improvements (#7376)
* Contract chain selection improvements

- Adjust contract chain selection behavior for futures and options so we
  are sure to use the correct local time when filtering expirations.
  Adding unit test reproducing issue

* Update futures regression algorithms

* Address reviews
2023-07-13 20:34:45 -03:00
Martin-Molinero
663d0ff094 Remove expire check for live universe subscriptions (#7377)
- Remove expiration check for live universe subscription causing errors
2023-07-13 20:33:24 -03:00
Ricardo Andrés Marino Rojas
bfca56c4a8 Improve Tradier Brokerage Model (#7373)
* Check the TimeInForce in Tradier orders is not GTD

* Add unit tests

* Nit changes
2023-07-13 13:00:26 -03:00
Martin-Molinero
28fe8a1e7c Fix contract security filter universe (#7374)
* Fix contract security filter universe

- Fix for contract security filter universe which would would use .Time
  to filter expirations which could be yesterdays time at midnight
  localtime. Adding unit tests reproducing issue

* Update regression algorithms
2023-07-12 20:46:17 -03:00
Martin-Molinero
492490e2c5 Fix download CI unit test (#7372) 2023-07-12 19:59:18 -03:00
Ricardo Andrés Marino Rojas
bfb820c617 Update MHDB CME Group Futures on Good Friday (#7368)
* Update MHDB CBOT Futures on Good Friday

* Update MHDB CME Futures on Good Friday

* Update MHDB CBOT Futures on Good Friday

* Update MHDB CME Futures on Good Friday

* Update MHDB comex and nymex futures on good friday

* Revert "Update MHDB comex and nymex futures on good friday"

Since all nymex and comex futures had a holiday on Good Friday, it's
better to add the holiday on `Future-nymex-[*]` and `Future-comex-[*]`

This reverts commit e111c8e461.

* Remove Good Friday holiday for cme and cbot futures

- Remove Good Friday holiday from `Future-cme-[*]` and `Future-cbot-[*]`
- Add Good Friday holiday for specific cme and cbot futures

* Add unit tests and update MHDB

- Add unit tests asserting LEAN reads correctly Good Friday holidays and
  early closes for CME Group Futures
- Update the holidays for other CME group Futures on MHDB

* Fix bugs

* Enhance unit tests
2023-07-12 16:04:22 -03:00
Martin Molinero
bdfe9399da IB gateway Typo 2023-07-12 13:50:10 -03:00
Martin-Molinero
240e84dd3d Revert to IB 10.19.2a (#7371) 2023-07-12 13:43:42 -03:00
Martin-Molinero
62fb61929f Update readme.md 2023-07-11 20:49:03 -03:00
Jhonathan Abreu
72e7dca7af Bump Pythonnet version to 2.0.21 (#7367)
* Add security dynamic properties unit and regression tests.

These assert that dynamic properties that are instances of python classes that inherit c# classes keep their python object references.

* Minor change

* Bump pythonnet version to 2.0.21

* Fix security dynamic properties cast from PyObject

* Minor change
2023-07-11 20:43:49 -03:00
Martin-Molinero
1ea0cd9d82 Check continuous future mapped symbol is not expired in live (#7364)
- In Live trading check the continuous future mapped symbol is not expired
  before subscribing to the data queue handler. Adding unit tests
2023-07-11 20:43:36 -03:00
Martin-Molinero
a099b9fb71 Minor tweaks to avoid CI tests random failures (#7370)
* Minor tweaks to avoid CI tests random failures

- Increate timeout of research start test, using default value
- Minor tweaks for rate gate to improve performance

* Clean up rategate tests
2023-07-11 20:43:22 -03:00
Martin-Molinero
54413e99b4 Live Option Chain Source Fix (#7369)
- Fix live option chain sources handling
2023-07-11 20:43:11 -03:00
Ricardo Andrés Marino Rojas
03df6c5ccb Update MHDB with 3rd/4th July Holiday hours (#7366)
* Update MHDB with NYSE and ICE holiday hours

- Update holidays and early closes for ´Equity-usa-[*]´
- Update holidays for certain products from Ice Futures US

* Add missing holiday hours in MHDB for CME-G Futures

- The missing holiday hours were from 3 July 2023

* Remove duplicates
2023-07-11 15:21:51 -03:00
Martin-Molinero
329ce54ca9 Update readme.md 2023-07-11 12:12:45 -03:00
Martin-Molinero
2f21a27023 Revert trade builder api change (#7365)
- Revert trade builder api change, add SecurityManager setter, to be
  called by the algorithm
2023-07-11 10:54:29 -04:00
Jhonathan Abreu
e562b8c99c Fix IsExchangeIpen bar check in FillModel and EquityFillModel (#7363)
* Fix market-open bar checks for non-daily resolutions in fill models

* Address peer review

* Minor change
2023-07-10 18:41:17 -03:00
Ricardo Andrés Marino Rojas
f8b79b8d6b Make indicators work with RenkoBars and VolumeRenkoBars (#7360)
* Address JB comment

* Remove repeated fields in BaseRenkoBar

- Add new unit test to all indicators that inherit from
  IndicatorBase<TradeBar>. This test asserts the indicators can receive
  RenkoBar's as input

* Add Regression test and improve unit tests

- Change `Volume` property from `RenkoBar.cs` since RenkoBar's don't
  have Volume. Now it throws an error when accessed

* Address required changes

* Add Python regression test and enhance unit tests

* Enhance unit and regression tests

* Assert indicator current value at the end

* Allow more indicators to use Renko/VolumeRenkoBar
2023-07-10 11:27:03 -03:00
Martin-Molinero
9dbeb3255d Update python debuggers (#7361)
- Update python debuggers
2023-07-10 10:55:50 -03:00
Martin-Molinero
7e81693d3c Add UnrealizedPnLPercent to holdings (#7358) 2023-07-10 10:55:00 -03:00
Jhonathan Abreu
bc05aa03f9 Fix win/loss count statistics for options assignments (#7354)
* Add ITM option assignment trade as win in trade statistics

* Add TradeStatistics unit tests

* Add unit tests

* Add OptionTrade class to abstract IsWin method

* Keep track of winning/losing trades

* Add more unit tests

* Change Trade.IsWin to a property calculated by the trade builder

* Improve regression algorithm

* Handle ITM option sell win/loss statistics

* Update regression algorithms statistics

* Revert accidental unwanted changes

* Address peer review

* Keep track of winning and losing transactions for portfolio statistics

* Add more SecurityPortfolioModel unit tests

* Fix failing unit tests

* Minor changes

* Address peer review

* Minor fix
2023-07-10 10:20:29 -03:00
Martin-Molinero
c75d0d8a6d Update readme.md 2023-07-07 12:12:19 -03:00
Martin Molinero
4c9a455a08 Delete data folder before generating stubs in CI 2023-07-06 19:51:41 -03:00
Martin-Molinero
f17a8e4d92 Update readme.md 2023-07-06 15:19:52 -03:00
Martin-Molinero
6ccafe9640 Minor fix for invalid update events (#7357)
- Handler brokerage invalid update order event once the order has
  already been filled by the brokerage. Adding unit test reproducing the
  issue
2023-07-06 15:13:03 -03:00
Martin-Molinero
ddbc654d53 Update readme.md 2023-07-05 19:21:27 -03:00
Martin-Molinero
c86b005564 Add exchange post fix for wolverine order properties (#7355) 2023-07-05 19:17:43 -03:00
Martin-Molinero
0303cf079f Remove Capacity from Runtime Statistics (#7353) 2023-07-05 11:23:59 -03:00
Martin-Molinero
626f64e37d Update IB gateway to 1023 (#7351) 2023-07-04 14:05:35 -03:00
Martin-Molinero
1ca007faa3 Update readme.md 2023-07-03 14:49:46 -03:00
Jhonathan Abreu
d39a9420d5 Fix Security.IsMarketOpen for cases outside regular MH and last bar (#7343)
* Fix Security.IsMarketOpen for cases outside regular MH and last bar

* Minor changes

* Move bar check of IsMarketOpen into FillModel

* Minor changes

* Minor changes

* Minor changes
2023-07-03 14:40:31 -03:00
Martin-Molinero
240d7db8e2 Update readme.md 2023-07-03 11:00:34 -03:00
Martin-Molinero
49b6c56fe8 Fix for stack tracer code cleaner null reference (#7346) 2023-07-03 10:56:38 -03:00
Jhonathan Abreu
af0de8d2e9 Deployment target and running mode algorithm properties (#7337)
* Add algorithm's mode and deployment target properties source from job packet

* Address peer review

* Add Python regression algorithm
2023-07-03 09:55:21 -04:00
Ricardo Andrés Marino Rojas
b47619e7b9 Remove EnableAutomaticWarmUp and IIndicatorWarmUpPeriodProvider impl from RVA (#7344)
* Remove EnableAutomaticWarmUp for RVA indicator

* Remove `IIndicatorWarmUpPeriodProvider` impl
2023-06-30 16:15:27 -03:00
Martin-Molinero
092dcda143 Adding new packet types (#7341) 2023-06-30 16:14:03 -03:00
Ricardo Andrés Marino Rojas
e029b96229 Fix bug in VolumeWeightedAveragePriceIndicator (#7336)
* Fix bug

- Add `ResetHandler()` and `IsReset` field in `CompositeIndicator.cs`
- Modify `CompositeIndicator.Reset()` to invoke the IsReset event
- Modify `VolumeWeightedAveragePriceIndicator.Reset()` method to reset
  its composite indicator
- Modify `IndicatorExtensions.WeightedBy()` to register an event to the
  returned composite indicator `IsReset` field

* Enhance implementation

* Address Requested changes

* Nit changes

* Nit change

* Nit change

* Address chages

- Make ResetCompositeIndicator inherit from CompositeIndicator and
  override `Reset()` method
- Add ResetCompositeIndicator unit tests
- Modifiy IndicatorExtensions to keep returning the same type in
  `WeightedBy()` method

* Avoid modify other IndicatorExtensions methods

* Nit changes

* Reset inner indicators and add more unit tests
2023-06-30 13:36:44 -03:00
Martin-Molinero
25d664e349 Update readme.md 2023-06-30 11:23:01 -03:00
Martin-Molinero
7952db992b Revert IB gateway update (#7345) 2023-06-30 11:18:27 -03:00
Martin-Molinero
936350cf45 Feature update foundation (#7342)
* Update foundation image

* Update python packages tests

- Fix bug in python initializer path priority for virtual envs

* ARM foundation update
2023-06-29 18:06:28 -03:00
Martin-Molinero
d173c5d65e Update DockerfileLeanFoundation 2023-06-28 10:03:24 -03:00
Jhonathan Abreu
a02309f2c6 Fix indicator name generation method (#7335)
* Fix indicator name generation method

* Minor change

* Add period to Beta indicator name
2023-06-27 16:03:43 -03:00
Jhonathan Abreu
956428b7bf Security cache dynamic collection for custom properties (#7327)
* Dynamic security properties for quick objects storage

* Documentation and other minor changes

* Add Security indexer to access custom properties

* Address peer review

* Minor changes

* Improve regression algorithms

* Bumped pythonnet to version 2.0.19

* Bumped pythonnet to version 2.0.20

* Address peer review
2023-06-27 10:39:20 -04:00
Martin-Molinero
df935aa608 Avoid research CI timeouts (#7334) 2023-06-23 11:17:18 -03:00
Ricardo Andrés Marino Rojas
4fd58ce180 Fix bug in Insight Weighted PCM (#7333)
* Fix bug and add unit tests

- Modify `InsightWeightingPortfolioConstructionModel.cs/py` to take the
  absolute value in its `GetValue()` method
- Modifiy `InsightsReturnsTargetsConsistentWithDirection()` unit test to
  consider also the case where the direction is Down and the weight is
  negative

* Nit changes
2023-06-23 10:08:45 -03:00
Martin-Molinero
96b56f06d5 Minor Packet type addition (#7332) 2023-06-22 13:42:32 -03:00
Martin-Molinero
05ab723b63 Update readme.md 2023-06-21 15:42:32 -03:00
Ricardo Andrés Marino Rojas
14b256846d Handle potential Error Code returned by CrunchDAO (#7330)
When a user tries to get its last submission ID with an empty API key,
CrunchDAO returns an Error Code, therefore we need to handle that case
2023-06-21 15:27:17 -03:00
Derek Melchin
c4c66c2aba Update crunchdao demo algorithm (#7292) 2023-06-21 15:27:06 -03:00
Ricardo Andrés Marino Rojas
1996498af5 Modify DonchianChannel.cs and spy_with_don50.csv (#7329) 2023-06-21 15:26:58 -03:00
Martin-Molinero
e22565c849 C# stacktrace exception normalization (#7328)
- Following the Py pattern of exception handling we will normalize stack
  traces for C# too, adding unit test
2023-06-21 10:51:17 -03:00
Jhonathan Abreu
177531651c QCAlgorithm.BrokerageName property (#7325)
* Add QCAlgorithm.BrokerageName property

* Add QCAlgorithm.BrokerageName property in python algorithm

* Address peer review

* Address peer review

* Address peer review
2023-06-20 11:24:27 -04:00
Ricardo Andrés Marino Rojas
a309322ae5 Fix CustomPartialFillModelAlgorithmFails.cs/py (#7321)
* Fix bug

The algorithm `CustomPartialFillModelAlgorithm.cs` was not working as
expected with short orders because in its Fill model, the variable
`absoluteRemaining` instead of decrease was being increased since
the `FillQuantity` in each call to this method was negative. Therefore
when this amount was substracted to `absoluteRemaining`, instead of
substract, it was added. Hence the method created more partial orders
than expected, specifically: 580 short orders for SPY with Quantity -10.

* Fix `CustomPartialFillModelAlgorithm.py`

* Address required changes

* Nit change

* Address required changes
2023-06-20 09:46:11 -04:00
Jhonathan Abreu
5ddc8c3766 Add unit tests to assert pandas dataframe multiindex slicing support (#7324) 2023-06-19 17:52:25 -03:00
Jhonathan Abreu
5d6110f38c Make summary statistics available to algorithms at runtime (#7320)
* Make statistics available at runtime to algorithms

* Re-calculate statistics on every call

* Housekeeping

* Add regression algorithms

* Address peer review

* Support for custom summary statistics at runtime

* Minor changes

* Address peer review

* Address peer review

* Minor changes

* Minor changes
2023-06-19 17:34:59 -03:00
Ricardo Andrés Marino Rojas
eeb512fac6 Fix RenkoConsolidator (#7317)
* Fix bug and add unit tests

The bug was raised because rounding the first point inserted in the
RenkoConsolidator didn't get the closest y-multiple of the given number
x, where y is the bar-size. In order to compute the first y-multiple of
the given number x, we need to first compute x mod y := x - y*Floor(x/y),
once we get this number we divide it by y to know if we should round x
to minimum y-multiple greater than x, or should round x to the maximum
y-multiple smaller than x. If (x mod y)/y < 0.5 we round down, otherwise we round up (the amount (x mod y)/y is always less than one and higher than 0). See the Art of Computer Programming, Vol I. Donald E. Knuth.

- Add `GetClosestMultiple()` method in `RenkoConsolidator.cs`
- Add more unit tests

* Nit change

* Add XML docs

* Address required changes and add more unit tests
2023-06-16 18:36:56 -03:00
Martin-Molinero
2547af1ccc Update readme.md 2023-06-15 12:42:27 -03:00
Martin-Molinero
b21fcc98be Add language model packet types (#7318) 2023-06-15 12:38:39 -03:00
Jhonathan Abreu
60aba9efa4 Make order ticket available from order event (#7316)
* Make order ticket available from order event

* Add regression algorithms

* Address peer review

* Address peer review
2023-06-15 11:11:06 -04:00
Jhonathan Abreu
94572f571c Fix Equity MOO and MOC orders fill for tick subscriptions (#7315)
Properly selecting the official open/close and opening/closing prints
trade condition flags from trade ticks.
2023-06-15 11:02:55 -04:00
Jhonathan Abreu
501dc01399 Indicators history rolling window (#7314)
* Implement indicator history through a rolling window

* Minor changes and extend unit tests

* Add regression algorithms

* Minor changes

* Update regression algorithms examples

* Move resizing logic from IndicatorBase to RollingWindow

* Add unit tests and other minor changes

* Minor fix

* Add unit tests and other minor changes

* Add unit test
2023-06-13 15:07:09 -03:00
Martin-Molinero
d1171500e3 Update readme.md 2023-06-13 10:51:47 -03:00
Jhonathan Abreu
d32bf13b4d Option strategy position group buying power calculation for single securities (#7308)
* Fix position group BP calculation

* Fix position group BP calculation

* Extend option startegy buying power unit tests

* Fix option strategy buying power calculation to account for order direction
2023-06-13 10:34:08 -03:00
Martin-Molinero
4d55493000 Future and option universe selection improvements (#7313)
* Normalize universe selection future and option creation

- Normalize universe selection future and option creation to include
  canonical securities enabling continuous future support

* Update existing regression algorithms

* Self review

* Address review

* Extra regression test check
2023-06-13 10:32:26 -03:00
Martin-Molinero
24820fe92c Minor future margin model improvements (#7306)
- Refresh margin requirements daily
- Refactor margin requirements so they are fetch once per future symbol
2023-06-12 10:46:41 -03:00
Martin-Molinero
73c71c6913 Add missing GC future auxiliary data (#7312)
* Add missing GC future auxiliary data

- For improved testing add missing GC comex future auxiliary data.
  Updating regression tests

* Update regression algorithm expected data points
2023-06-09 19:43:34 -03:00
Ricardo Andrés Marino Rojas
3c9f9aae20 Fix bug in MarketProfile indicator (#7310)
* Fix bug, add unit tests and nit changes

The bug was raised because if two inputs points with repeated close values were inserted,
and the second one had 0 volume, when the first one is removed from
_oldDataPoints, as the reamaining value of it in _volumePerPrice is
zero, that entry is removed from _volumePerPrice. Therefore, when
the second input point is removed from _oldDataPoints, this entry
is not found in _volumePerPrice. Then the changes made were:

- Modify MarketProfile.Add() method to check every removed data point is
  still in _volumePerPrice
- Add unit tests to covert this change
- Nit changes in VolumeProfileTests.cs

* Fix bugs and add more unit tests

- The Fill Forward bars shouldn't be considered in the calculations as
it's not real data.

- If bar inserted is not FF but has zero volume, it could remove a price
  value from VolumePerPrice and leave this sorted list empty, then each
  time we access that list we need to first check it's not empty

* Enhance ComputeNextValue() and add more unit tests
2023-06-09 19:14:45 -03:00
Martin-Molinero
ff47ede36c Minor fix for automatically added option underlying (#7311)
- Lean engine will automatically add an options underlying if not
  present, but in most cases the option chain will select the underlying
  too, so let's make sure the configurations match. Previous to this
  change 'fill forward' setting could be different causing the
  underlying to be duplicated in the data stack
2023-06-09 19:03:35 -03:00
Martin-Molinero
1a3138d0cd Update readme.md 2023-06-08 17:57:37 -03:00
Jhonathan Abreu
756a61b8e0 ShortCallCalendarSpread and ShortPutCalendarSpread strategies helper factory methods (#7304)
* Add ShortCallCalendarSpread and ShortCalendarPutSpread strategies helper factory methods

* Housekeeping
2023-06-08 15:22:45 -04:00
Jhonathan Abreu
b479300587 Add IronCondor strategy helper factory methods (#7305) 2023-06-08 14:48:24 -04:00
Martin-Molinero
d2d3cdcc0f Update readme.md 2023-06-08 13:37:11 -03:00
Martin-Molinero
bae69aaa0a Add ARM foundation image (#7299)
- Readding ARM foundation image without Interactive brokers support
2023-06-08 13:29:42 -03:00
Martin-Molinero
ee3cea805e FactorFiles bases live auxiliary events (#7293)
- Adjusting live stack to emit live auxiliary events based on factor files.
    Updating existing tests
  - Minor improvements for map & factor file provider daily refresh time.
    Adding unit tests
2023-06-08 13:27:55 -03:00
Jhonathan Abreu
ad6046fea5 ShortButterflyCall and ShortButterflyPut strategies helper factory methods (#7302)
* Add ShortButterflyCall and ShortButterflyPut strategies helper factory methods

* Reduce duplication by adding the base OptionStrategyFactoryMethodsBaseAlgorithm algorithm class

* Housekeeping
2023-06-08 11:55:48 -03:00
Martin-Molinero
cc9a061cb1 Fix python Interpret unit test (#7301) 2023-06-07 18:05:16 -03:00
Jhonathan Abreu
90a2c06a4c Add ShortStaddle and ShortStrangle strategies helper factory methods (#7300) 2023-06-07 16:55:47 -03:00
Jhonathan Abreu
615827f259 NakedCall and NakedPut strategies helper factory methods (#7298)
* Add NakedCall and NakedPut strategies helper factory methods

* Housekeeping
2023-06-07 10:43:01 -04:00
Ricardo Andrés Marino Rojas
b64169fd20 Fix Beta chart in Report (#7295)
* Fix bug in Beta statistics

- Beta in Report was calculated using equity points and not daily
  performance points, as it's done in Backtest
- Performance points were not being divided by 100, as it's done in
  StatisticsBuilder
- Benchmark points were not being converted into a percentage daily
  performance of the benchmark, as it's done in StatisticsBuilder

* Improve implementation and add unit tests

* Enhance implementation and add more unit tests

* Enhance implementation

* Nit change

* Nit changes
2023-06-07 11:10:10 -03:00
Jhonathan Abreu
cb0661c79e Add CoveredPut and ProtectivePut strategies helper factory methods (#7297) 2023-06-07 10:01:49 -04:00
Jhonathan Abreu
5d148683b7 CoveredCall and ProtectiveCall strategies helper factory methods (#7296)
* Add CoveredCall strategy helper factory method

* Add ProtectiveCall strategy helper factory method

* Housekeeping
2023-06-06 18:22:30 -03:00
Jhonathan Abreu
0df6366301 Options premium in margin calculations (#7294)
* Make maintenance margin zero for long options

* Use OptionIntialMargin in OptionMarginModel

* Add naked call and put strategies unit tests

* Minor fix
2023-06-06 13:07:32 -03:00
Jhonathan Abreu
bdcb6d9474 Account for premium in options strategies margin (#7290)
* Account for premium in option strategies margin

* Minor fixes

* Add OptionInitialMargin class to separate strategies margin and premium

* Minor fix

* Minor fix

* Cleanup, docs and other minor changes

* Minor changes

* Minor changes

* Minor changes

* Address peer review
2023-06-05 12:58:48 -03:00
Ricardo Andrés Marino Rojas
b14bda2dc0 Add SetAccountCurrency() override (#7284)
* Add SetAccountCurrency overload

- Add SetAccountCurrencyOverload to allow the user to set also account
  currency quantity
- Add regression and unit tests to cover the changes

* Add regression algos

* Simplifiy SetAccountCurrency implementation

* Minor changes

* Minor changes
2023-06-01 17:44:45 -03:00
Martin-Molinero
1283f52de1 Add multi symbols tick history warning (#7289)
- Add warning message when using the multi symbol tick type history
  algorithm api
2023-06-01 17:42:40 -03:00
Martin-Molinero
64d0eaefab Update readme.md 2023-05-31 20:07:56 -03:00
Martin-Molinero
e42d84319d Support overriding position group margin requirements (#7286)
* Add support for Null SecurityPositionGroupModel

- Add support for algorithms to set the null security position group
  model which will not group securities together but rather return the
  single group buying power model. Adding regression algorithms

* Add Null Margin python regression & cleanup

- Add python regression algorithm & minor regression algorithms clean up
2023-05-31 19:53:50 -03:00
Martin-Molinero
cc73f5bca8 Add missing MHDB 'holidays' entry for backwards compatibility (#7287) 2023-05-31 17:58:26 -04:00
Jhonathan Abreu
0ff3622d1e Fix position group HasSufficientBuyingPowerForOrder (#7285)
* Fix position group HasSufficientBuyingPowerForOrder

Comparing computed delta BP -- which already considers every impacted
group -- with the right available buying power (the remaining margin)

* Minor changes
2023-05-31 13:14:14 -03:00
Martin-Molinero
ef01980b07 Python history improvements (#7283)
* Pandas frame include all ticks

- Pandas data framde history response will include all ticks. Updating
  existing and adding new tests

* Python pandas converter performance improvement
2023-05-31 10:22:21 -03:00
Jhonathan Abreu
82b3468ab7 Add naked single-option strategies (#7231)
* Handle liquidating option position with an option strategy

* Handle liquidating option position with an option strategy

* Minor changes

* Minor fix in default margin model margin call order generation
2023-05-30 15:59:28 -03:00
Martin-Molinero
bce3fb41bb Update readme.md 2023-05-30 13:51:08 -03:00
Ricardo Andrés Marino Rojas
7f6da62e5d Add TriggerPrice field when applying a split (#7279)
* Add TriggerPrice field when applying a split

If one stock is split in k parts, the new TriggerPrice in an order for that stock should be also scaled by a factor of k/10. It was made:
- Modify `DefaultBrokerageModel.ApplySplit()` to adjust `TriggerPrice` field
- Regression and unit test was added

* Check Limit Price for LimitIfTouched

* Nit change
2023-05-30 13:36:49 -03:00
Martin-Molinero
9aa9f715ec Minor MHDB Concurrent Usage Fix (#7281)
- Fix race condition with multiple threads creating the MHDB
2023-05-30 13:35:29 -03:00
Martin-Molinero
c33ce2f8c3 MHDB Merge Common Holidays, LateOpens & EarlyCloses (#7278)
* MHDB will merge common entry

- The MHDB will merge the market and security common entry holidays,
  early closes and late opens

* Normalize & reuse future US holidays

- Normalize & reuse future US holidays

* Update existing unit tests expected stats
2023-05-30 11:54:28 -03:00
Martin-Molinero
383acc06d2 Update readme.md 2023-05-26 18:58:49 -03:00
Jhonathan Abreu
5c5201944a Fix position group order quantity calculation for delta/target buying power (#7230)
* Fix PositionGroupBuyingPowerModel quantity for delta calculation

The model was calculation the order size that required a margin equal to
the given delta. This fix makes it so that it calculates the position
group order quantity required to get the given buying power delta,
taking into account the holdings for the existing position group in the portfolio.

* Fix PositionGroupBuyingPowerModel quantity for delta calculation

* Add unit tests

* Add unit tests

* Add unit tests

* Housekeeping

* Housekeeping

* Adapt unit tests and move messages to Messages class

* Improve quantity calculation for target BP loop

- PositionGroup.Quantity is now always positive.
- Added PositionGroupExtensions.Closes method and use it to check if reducing a position in PositionGroupBuyingPowerModel.GetPositionGroupBuyingPower. This is necessary since now a PositionGroup side is always "long" (see first bullet point).

* Improvements

* Improvements and new PositionGroup unit tests

* Unit tests improvements

- HasSufficientBuyingPowerForOrder test cases were completely updated to
  make it accurate in terms of Lean's margin calculation.
- BuyingPowerForPositionGroupCalculation test was fixed in order to get
  the correct expected result.

* Fixes for failing tests

* Added additional check to OptionStrategyMarginCallEventsAlgorithm

* Improve documentation comments

* Fix option strategies BuyingPowerForPositionGroupCalculation unit test

* Fix PositionGroupBuyingPowerModel.GetPositionGroupBuyingPower

Also address peer review

* Minor changes

* Update unit tests for new inverse strategies

Also fixed PositionGroupExtensions.WithQuantity to resolve inverse
strategy

* Minor fix

* Allow target/delta to go to the opposite direction of the position group

* Housekeeping

* Handle quantity for target/delta BP request for different reference position group

* Revert removal of PositionGroupBuyingPowerParameters.Direction

* Minor changes

* Peer review

* Minor tweaks on the position group buying power model

* Minor fix
2023-05-26 17:22:58 -04:00
Martin-Molinero
410956bf9f FreePortfolioValuePercentage Trailing Behavior (#7272)
* Implement Trailing FreePortfolioValue

- Implement Trailing FreePortfolioValue by default, users will be able
  to set it to a fixed number if desired. Adding regression algorithm
- Setting the default 'MinimumOrderMarginPortfolioPercentage' from 0 to
  0.1% of the TPV to avoud tiny trades by default

* Update existing regression algorithms

* Address reviews

- Send warning message to the user if a trade does not happen due to the
  default setting of the minimum order margin percentage value

* Address reivews

* Rename TotalPortfolioValueLessFreeBuffer

* Update new regression algorithm
2023-05-25 18:48:04 -03:00
Martin-Molinero
2147d868d8 Minor fix CrunchDAO Symbology (#7276)
* Minor fix CrunchDao Symbology

- Minor fix for CrunchDao Symbology. Updating existing tests

* Add missing symbol mapping

- Add IAlgorithm.Ticker(Symbol) functionality which will return the
  latest ticker for the requested symbol at the current algorithm time
- SignalExporters will use Ticker to get the current symbol ticker

* Rename SecId GetTicker to Ticker
2023-05-25 17:51:40 -03:00
Martin-Molinero
1e70673e00 Replace QC500 for SPY ETF (#7277)
- Replace manual QC500 universe for SPY ETF universe
2023-05-25 17:44:45 -03:00
Martin-Molinero
4823cca7ef Multiple Symbol Selection Universe (#7273)
- Add support and example algorithms for multiple symbol selection universe
 including custom data types.
2023-05-25 15:23:18 -03:00
Martin-Molinero
46d5d46aca Remove Alpha Licence References (#7275) 2023-05-25 12:51:33 -03:00
Ricardo Andrés Marino Rojas
3712786301 Enable custom Python optimizer in C# MeanVarianceOptimizationPortfolioConstructionModel (#7274)
* Solve bug and add regression test

The bug was raised because, when trying to use C#
MeanVarianceOptimizationPortfolioConstructionModel from a Python
algorithm, there wasn't a constructor that accepted a portfolio optimizer
as a PyObject. Additionally, there wasn't also a Python Wrapper to wrapp
that portfolio optimizer.

- Add PortfolioOptimizerPythonWrapper.cs
- Add constructor in
  MeanVarianceOptimizationPortfolioConstructionModel.cs that accepts
  portfolio optimizer as a PyObject
- Add regression algorithms to cover the changes

* Improve constructor overload implementation

* Change implementation to follow API pattern

* Enhance implementation and add unit tests

* Enhance implementation and add more unit tests

* Enhance implementation
2023-05-25 10:15:56 -03:00
Martin-Molinero
97489dfc57 Implement UnregisterIndicator helper method (#7271)
* Implement Unregister helper method

- Implement Unregister helper method, each indicator which hold a
  reference to the consolidators updating it. Adding regression
  algorithms

* Fix for QuantBook indicators

* Address reviews
2023-05-24 17:35:02 -03:00
Martin-Molinero
278401cfcf Custom data universe selection market hours (#7270)
- Custom data universe selection market hours. Adding regression test
  asserting the behavior. Updating existing tests due to market hours
  change, triggering selection always, even the 4th of July 2018
2023-05-24 13:50:43 -03:00
Jhonathan Abreu
6e7b69da44 Short call/put calendar spreads (#7269)
* Add short call calendar spread strategy and review margin calculation

* Add short Put calendar spread strategy and fixed naked short options margin calculation

* Minor changes

* Minor changes

* Minor changes
2023-05-24 13:09:31 -03:00
Martin-Molinero
b5ced1635e Chain Providers will filter expired (#7267)
- Future and option chain providers will always filter expired contracts
  from their result. Update existing tests
2023-05-23 18:33:07 -03:00
Martin-Molinero
f01ac9be3a Fix NDX index data timezone (#7268)
- Fix for NDX index data timezone
2023-05-23 17:24:21 -03:00
Jhonathan Abreu
2b045bfd35 Short straddle and strangle strategies (#7264)
* Add short straddle and strangle strategies

* Minor unit tests fixes
2023-05-23 13:39:41 -03:00
Jhonathan Abreu
96f8a89c0d Butterfly call/put spreads margin unit test review (#7266) 2023-05-23 13:35:28 -03:00
Martin-Molinero
da706dbd8e Add QuantBook memory recycle (#7263)
- Add QuantBook memory recycle timer to avoid managed memory creep
2023-05-23 10:02:54 -03:00
Martin-Molinero
c5790f3e20 Fix Collective2 future & option symbology (#7262)
* Fix Collective2 future & option symbology

- Fix collective2 future & option symbology. Adding unit tests &
  updating existing

* Minor fixes after live test
2023-05-22 19:11:45 -03:00
Jhonathan Abreu
794835772a Minor bear/bull call spreads unit tests fixes (#7260) 2023-05-22 16:03:51 -03:00
Ricardo Andrés Marino Rojas
a043313004 Change misleading error message while registering an indicator in Python (#7257)
* Solve the bug and add unit test

- The bug was raised because if something went wrong trying to register an indicator with a C# or a custom consolidator the exception raised was lost, because the catch sentence didn't return it with another exception

- A unit test was added asserting a exception with a related message was raised each time something went wrong with the consolidator

* Fix bugs and enhance unit tests

* Fix bug
2023-05-22 15:07:04 -03:00
Ricardo Andrés Marino Rojas
c9dde8a0df Improve Tradier Brokerage Model (#7256)
* Handle unsupported orders and add unit tests

- Capture more Tradier Brokerage order limitations
- Add unit tests to cover this changes

* Enhance implementation and add more unit tests

* Enhance implementation and add unit test

* Remove IsMarketOrderGTC condition

* Remove error message MarketOrderIsGtc
2023-05-22 14:59:44 -03:00
Martin-Molinero
5eb6026180 Covered and protective call put (#7258)
* Covered and Protective Call and Put

- Improve covered call and put margin requirements based on IB
- Add missing protective call and puts strategies (inversion of a
  covered call). Adding unit tests

* Fixes

* Add missing tests
2023-05-22 11:21:12 -03:00
Martin-Molinero
bbe2e31cb8 Revert "Improve Tradier Brokerage Model (#7249)" (#7254)
This reverts commit 014ec3453d.
2023-05-18 18:59:01 -03:00
Alexandre Catarino
fd76171604 Expire Instead of Clear Insights In Base PCM In OnSecuritiesChanged (#7251)
* Expire Instead of Clear Insights In Base PCM In OnSecuritiesChanged

* Fixes Regression Test

The regression was incorrect because `_removedSymbols` didn't retain the removed symbols from previous `OnSecuritiesChanged` calls, and the algorithm relances once per month. E.g. On day 1, SPY and FB were removed, on day 3 AAPL and IBM were removed and `removedSymbols` would only include AAPL and IBM.

We should hve fixed this problem before with:

```csharp
if (_removedSymbols == null) _removedSymbols = new List<Symbol>();
_removedSymbols.AddRange(changes.RemovedSecurities.Select(x => x.Symbol));
```

However the change to use Expire fixes the issue.

* Removes Unused List of Removed Symbols
2023-05-18 11:20:17 -03:00
Ricardo Andrés Marino Rojas
a1d5b1bd31 Change misleading message when order is not large enough for Binance brokerage (#7252)
* First attempt to fix the bug

* Enhance Message returned and unit tests

* Enhance implementation and unit tests

* Nit change
2023-05-18 10:38:28 -03:00
Martin-Molinero
dba6a04196 Improve handling of invalid order update & cancel (#7247)
- Avoid exceptions when updating or cancelling an invalid order. Adding
  unit tests reproducing the issue
2023-05-18 10:37:03 -03:00
Ricardo Andrés Marino Rojas
014ec3453d Improve Tradier Brokerage Model (#7249)
* Handle unsupported orders and add unit tests

- Capture more Tradier Brokerage order limitations
- Add unit tests to cover this changes

* Enhance implementation and add more unit tests

* Enhance implementation and add unit test
2023-05-18 10:21:54 -03:00
Ricardo Andrés Marino Rojas
0db0f10ee9 Fix potential bug in KrakenOrderProperties (#7248)
* Fix potential bug and add more docs

As FeeInBase and FeeInQuote are mutually exclusive, if one was set to true, the other one should be set to false. It was added information about where it's used and how fee currency selection works in Kraken.

* Nit change

* Simplify XML docs
2023-05-15 19:19:31 -03:00
Martin-Molinero
1a22f20340 Avoid expiring insights twice (#7243)
- Avoid expiring insights twice. Adding unit test
2023-05-15 10:01:07 -03:00
Martin-Molinero
5c078cd2a9 Remove 'data-directory' usage (#7241) 2023-05-12 18:24:12 -03:00
Martin-Molinero
08e1f31271 Minor live logging improvements (#7240) 2023-05-12 18:13:37 -03:00
Ricardo Andrés Marino Rojas
7f15202dfc Fix bug in LeastSquaresMovingAverage (#7238)
* Fix bug and fix unit test

* Enhance unit test

* Simplify LSMA.ComputeNextValue()
2023-05-11 14:55:27 -03:00
Ricardo Andrés Marino Rojas
4e56af487c Fix bug in RandomDataGenerator for Option data at Minute resolution (#7237)
* Fix the bug and add unit tests
- The bug was raised by different conditions.

First, the tick created in tick generator for Open Interest was not of type Open Interest.

Second, TickAggregator.cs was made to use daily resolution for OpenInterest always.

Third, the RandomValueGenerator, generated a random friday as expiration date for the option created but this one needed first two underlying data points, so if the expiration date was before the start date plus 3 days, RandomDataGenerator just generated OpenInterest data for the option.

* Add docs
2023-05-11 12:54:45 -03:00
Vinh Hung Nguyen
3bb390779b Add Missing Python Version of TickDataFilteringAlgorithm (#7219) (#7222)
* Add Missing Python Version of TickDataFilteringAlgorithm (#7219)

* Change to SecurityDataFilter

* Modify PR #7222

* Address reviews

* Minor improvement

---------

Co-authored-by: Ricardo Andrés Marino Rojas <47573394+Marinovsky@users.noreply.github.com>
Co-authored-by: hungv <hungv@compatibl.com>
Co-authored-by: Martin-Molinero <martin@quantconnect.com>
2023-05-10 19:48:54 -03:00
Jhonathan Abreu
f12bcb39a6 Unit tests for OptionStrategyPositionGroupBuyingPowerModelTests (#7234)
* Add option strategy position group BPM tests

Tests added for calculating order quantity for a delta buying power

* Add option strategy position group BPM margin calculation tests

* Add option strategy position group BPM margin calculation tests

* Add option strategy position group BPM margin calculation tests

* Add option strategy position group available BPM calculation tests

* Add option strategy position group impact buying power calculation

* Housekeeping

* Unit tests improvements

* Unit tests improvements

* Add more unit tests

* Address peer review
2023-05-10 19:47:26 -03:00
Derek Melchin
17639c399d Update Numerai Demo Algorithms (#7233)
* Update Numerai Demo Algorithm

* Remove Numerai demo algorithms that use portfolio state

* Address review
2023-05-03 20:16:34 -03:00
Martin-Molinero
fbca273807 Add forward data only fill model example (#7232)
* Add forward data only fill model example

- Add forward data only custom fill model C# & PY example.
- Minor adjustment for 'MarketOrderFillTimeout' to be zero always in
  backtesting

* Address reviews
2023-05-03 16:16:03 -03:00
Martin-Molinero
e838319a56 Update readme.md 2023-05-02 16:24:22 -03:00
Martin-Molinero
884bfe4482 Add support for brokerage side new orders (#7228)
* Add support for brokerage side new orders

- Add support for brokerage side new order events for liquidation cases

* Minor cash delta fix

* Improve account cash logging

* Fix null reference exception for open orders
2023-05-02 16:21:19 -03:00
Ricardo Andrés Marino Rojas
416d38271b Solve bugs in BrokerageModelPythonWrapper.cs (#7229)
* Implement ShortableProviderPythonWrapper.cs

- Modify AllShortableSymbolsCoarseSelectionRegressionAlgorithm.cs and ShortableProviderOrdersRejectedRegressionAlgorithm.cs to use ShortableProvider from Security and not from the Brokerage model
- Add SetShortableProvider() overload method in Security.cs to set a custom shortable provider from Python
- Remove AllShortableSymbols() method from LocalDiskShortableProvider.cs
- Remove DefaultShortableProvider class
- Add regresion algorithms in C# to cover the changes done

* Revert "Merge process"

This reverts commit 775a4b8ec1, reversing
changes made to bcc3e790f6.

* Revert "Revert "Merge process""

This reverts commit aa18fb40ee.

* Solve bugs

- Solve bugs in DefaultMarkets, CanUpdateOrder() and CanSubmitOrder() methods from BrokerageModelPythonWrapper.cs
- Add regression algos in both Python and C# to cover the changes

* Catch potential errors and add unit tests

* Add more unit tests

* Nit change

* Enhance implementation, add more unit tests
2023-05-02 15:09:16 -03:00
Martin-Molinero
b657365da7 Add IndexOptionPriceVariationModel (#7227)
* Add IndexOptionPriceVariationModel

- Add IndexOption price variation model to handle price based minimum
  price variation. Adding unit tests

* Minor improvements for VIX & VIXW
2023-05-02 11:23:20 -03:00
Louis Szeto
991ac4595f Improves Export Signal Algorithms (#7210)
* Update Collective2PortfolioSignalExportDemonstrationAlgorithm

* Update Collective2SignalExportDemonstrationAlgorithm

* Update CrunchDAOPortfolioSignalExportDemonstrationAlgorithm

* Update CrunchDAOSignalExportDemonstrationAlgorithm

* Update NumeraiPortfolioSignalExportDemonstrationAlgorithm

* Update NumeraiSignalExportDemonstrationAlgorithm

* Address peer review

* Add logic to handle warm up

* Update unit test statistics
2023-05-01 12:14:54 -03:00
Martin-Molinero
a7516b80ea Daily future cash settlement (#7226)
* Refactor settlement mode api

- Add new Scan method on ISettlementModel API. To be used by
  futures settlement model mark to market handling
- Use 'Parameters' classes for 'ISettlementModel'

* Address reviews

* Daily future settlement

- Implement daily future settlement. Adding unit & regression tests

* Address reviews

* Assert cash balance every day
2023-05-01 11:25:37 -03:00
Martin-Molinero
8b2eb5bd68 Refactor Settlement Model API (#7225)
* Refactor settlement mode api

- Add new Scan method on ISettlementModel API. To be used by
  futures settlement model mark to market handling
- Use 'Parameters' classes for 'ISettlementModel'

* Address reviews
2023-05-01 11:23:31 -03:00
yuriyarabskyyPro
6ce418ca5c Add missing side multiplier in returns per trade chart (#7224)
* Add missing side multiplier

* Minor build fix

---------

Co-authored-by: Yuriy Arabskyy <yuriy.arabskyy@gmail.com>
Co-authored-by: Martin-Molinero <martin@quantconnect.com>
2023-05-01 11:16:41 -03:00
Jhonathan Abreu
c61b8da167 Add contractDepthOffset parameter to History methods (#7213)
* Add contractDepthOffset parameter to every history api method overload

* Address peer review
2023-04-27 14:31:42 -03:00
Jhonathan Abreu
c8890c3da9 Multiple option position groups liquidation (#7221)
* Fix multiple option strategies liquidation

When holding multiple position groups of the same underlying, reverting
one of the groups was not possible because of the presence of the other
position groups, which caused no matching groups to be formed for the
order.

* Make OptionStrategyPositionGroupResolver not group single position

* Revert make OptionStrategyPositionGroupResolver not group single position
2023-04-27 14:29:30 -03:00
Louis Szeto
baf2dbcefa Add example algorithm on brokerage activities (#7214)
* Add example algorithm on brokerage activities

* Add brokerage activities event handlers on live feature algorithm

* add boolean flag
2023-04-27 14:17:58 -03:00
Ricardo Andrés Marino Rojas
4d5e0fb73a Modify OpenInterestFutureUniverseSelectionModel to work with Python (#7220)
* Implement ShortableProviderPythonWrapper.cs

- Modify AllShortableSymbolsCoarseSelectionRegressionAlgorithm.cs and ShortableProviderOrdersRejectedRegressionAlgorithm.cs to use ShortableProvider from Security and not from the Brokerage model
- Add SetShortableProvider() overload method in Security.cs to set a custom shortable provider from Python
- Remove AllShortableSymbols() method from LocalDiskShortableProvider.cs
- Remove DefaultShortableProvider class
- Add regresion algorithms in C# to cover the changes done

* Revert "Merge process"

This reverts commit 775a4b8ec1, reversing
changes made to bcc3e790f6.

* Revert "Revert "Merge process""

This reverts commit aa18fb40ee.

* Solve bug

- Add new constructor overload in OpenInterestFutureUniverseSelectionModel.cs that accepts future chain symbol selector as PyObject
- Add a private static method in OpenInterestFutureUniverseSelectionModel that converts Python lambda function to Func<DateTime, IEnumerable<Symbol>>
- Add a regression algorithm in Python to cover changes. In these case, add Python version of OpenInterestFuturesRegressionAlgorithm.cs

* Nit changes

* Nit change

* Minor docs tweak

---------

Co-authored-by: Martin-Molinero <martin@quantconnect.com>
2023-04-27 10:04:10 -03:00
Oleksii Rychko
3122edcaf9 RBI brokerage setup (#7216)
* Added RBIBrokerageModel, RBIFeeModel

* added RBIOrderProperties, added RBI to BrokerageName, config.json

* feature: changed config.json

* fix: changed config.json and UnsupportedOrderType message

---------

Co-authored-by: m00nler <91968598+m00nler@users.noreply.github.com>
Co-authored-by: raideNNdev <raideNNdev@proton.me>
2023-04-27 10:03:04 -03:00
Martin-Molinero
1965a2868d Update readme.md 2023-04-26 10:03:31 -03:00
Ricardo Andrés Marino Rojas
3e86712c1a Implement ShortableProviderPythonWrapper.cs (#7209)
* Implement ShortableProviderPythonWrapper.cs

- Modify AllShortableSymbolsCoarseSelectionRegressionAlgorithm.cs and ShortableProviderOrdersRejectedRegressionAlgorithm.cs to use ShortableProvider from Security and not from the Brokerage model
- Add SetShortableProvider() overload method in Security.cs to set a custom shortable provider from Python
- Remove AllShortableSymbols() method from LocalDiskShortableProvider.cs
- Remove DefaultShortableProvider class
- Add regresion algorithms in C# to cover the changes done

* Implement ShortableProviderPythonWrapper.cs

- Modify AllShortableSymbolsCoarseSelectionRegressionAlgorithm.cs and ShortableProviderOrdersRejectedRegressionAlgorithm.cs to use ShortableProvider from Security and not from the Brokerage model
- Add SetShortableProvider() overload method in Security.cs to set a custom shortable provider from Python
- Remove AllShortableSymbols() method from LocalDiskShortableProvider.cs
- Remove DefaultShortableProvider class
- Add regresion algorithms in C# to cover the changes done

* Solve bugs and nit change

* Address review

---------

Co-authored-by: Martin-Molinero <martin@quantconnect.com>
2023-04-25 19:55:44 -03:00
Jhonathan Abreu
8943dc6535 Add dataNormalizationMode parameter to every history api method overload (#7208) 2023-04-25 17:19:39 -03:00
Vinh Hung Nguyen
c8a646c0f0 Feature 7182 missing python version crypto future algorithms (#7206)
* Solve Report Generation Conversion Rate Error bug (#7183)

* Solve bug

Remove if sentence that checked if Portfolio contained securities that
needed a conversion, like Forex, Crypto or Cfd. It didn't take into
account CryptoFutures so when the backtest result used that kind of
security types it never found a conversion for them. Making a git blame
for Report.PortfolioLooper constructor it was found the if sentence was
not needed so it was removed and then different reports were made for
algorithms that used security types different than Forex,Crypto,Cfd and
CryptoFutures to check everything was still working as expected.

* Solve bug

Remove if sentence that checked if Portfolio contained securities that
needed a conversion, like Forex, Crypto or Cfd. It didn't take into
account CryptoFutures so when the backtest result used that kind of
security types it never found a conversion for them. Making a git blame
for Report.PortfolioLooper constructor it was found the if sentence was
not needed so it was removed and then different reports were made for
algorithms that used security types different than Forex,Crypto,Cfd and
CryptoFutures to check everything was still working as expected.

* Missing Python Version of Crypto Future Algorithms - Issue 7128

* Address reviews

---------

Co-authored-by: hungv <hungv@compatibl.com>
Co-authored-by: Martin-Molinero <martin@quantconnect.com>
2023-04-24 11:27:38 -03:00
Jhonathan Abreu
0b81cf0218 Add dataMappingMode parameter to History methods (#7204)
* Add dataMappingMode parameter to every history api method overload

* Minor unit tests fixes

* Update regression algorithm stats

* Minor changes

* Minor changes
2023-04-21 17:24:14 -03:00
Louis Szeto
6b1f859f5a Fixes bug in Hilbert Transform indicator (#7203)
* Fix bug on calculation, renew test data from correct TV script

* Add comment to explain changes
2023-04-21 12:01:52 -03:00
Martin-Molinero
6fb9cf8521 Cache folder usage improvements (#7200)
- Validate cache folder exists before using it
- Avoid duplication fetching factor & map files path
- Adding helper method to check if directory is empty. Adding unit tests
2023-04-20 11:24:19 -03:00
Ronit Jain
0d6abf5dde Add optimization-id for optimization backtests (#7202)
* add organizatin-id in backtests

* self review
2023-04-20 10:49:04 -03:00
Ricardo Andrés Marino Rojas
6b7be767f5 Implement SecurityDataFilterPythonWrapper.cs (#7201)
- Create `SecurityDataFilterPythonWrapper.cs`
- Modifiy `Security.cs` to set a data filter, whether is a C#, Python derivative or custom data filter custom
- Add Python and C# regression algorithms to assert the changes
2023-04-20 10:45:59 -03:00
Jhonathan Abreu
3888896ed4 Add extendedMarket parameter to History methods (#7191)
* Add extendedMarket parameter to every history api method overload

* Rename extendedMarketHours parameter

New name is extendedHours as in the History API to standarize parameters naming

* Update generic history overloads to use every matching subscription

* Update regression algorithms stats

* Centralize period-based history error for tick resolution

* Rename extended market hours parameter to extendedMarketHours

* Minor changes

* Minor changes

* Minor unit tests changes

* Minor unit tests changes

* Minor changes

* Minor unit tests changes

* Minor unit tests changes
2023-04-20 10:41:32 -03:00
Martin-Molinero
fb383dc73c Minor foundation update (#7196)
* Added PyStan Library in DockerfileLeanFoundation

* Add new libraries and unit tests

---------

Co-authored-by: Ivan Radigales Creus <ivanrdgc@gmail.com>
2023-04-19 15:19:07 -03:00
Louis Szeto
5891f44312 Implement Hilbert Tranform indicator (#7197)
* Implement Hilbert Transform Indicator

* Assign proper names to variables

fixes
https://github.com/QuantConnect/Lean/pull/7148#discussion_r1152325967
https://github.com/QuantConnect/Lean/pull/7148#discussion_r1152328259

* Add license

fixes https://github.com/QuantConnect/Lean/pull/7148#discussion_r1152336946

* Change `_v1` computation to operation instead of `FunctionalIndicator`

and more related changes
fixes https://github.com/QuantConnect/Lean/pull/7148#discussion_r1152332642

* Replace `updatesCount` with `Samples` field

* Implement `inPhase3` and `_quadrature2` as `Delay` indicators

* Minor fix to `WarmUpPeriod`

* Add descriptive names to indicators

* Reset all indicators

https://github.com/QuantConnect/Lean/pull/7148#discussion_r1152338785

* Minor fix

* Rename rest of parameters

* Implement helper method

* Renaming for LEAN's pattern

* Update 3rd party data source

* Refactor and fix bug on HT calculation

* Fix unit test's logic

---------

Co-authored-by: Alexander Myltsev <alexander.myltsev@gmail.com>
2023-04-19 14:41:05 -03:00
Martin-Molinero
841e6f12c2 Update readme.md 2023-04-18 19:14:27 -03:00
Martin-Molinero
afabedbfda Update readme.md 2023-04-18 18:30:59 -03:00
Ricardo Andrés Marino Rojas
02e54d0242 Implement OptionExerciseModelPythonWrapper.cs (#7193)
* Implement `OptionExerciseModelPythonWrapper.cs`
- Modifiy `Option.cs` to set the automatic exercise model, even if it's a python custom option model exercise model
- Add `QuantConnect.Orders.OptionExercise` in `AlgorithmImports.py`
- Add regression algorithms in C# and Python showing how to specify a custom option exercise model

* Address required changes

- Remove unnecessary constructor in
´CustomOptionExerciseModelRegressionAlgorithm.cs´
- Change `.Dispose()` in `OptionExerciseModelPythonWrapper.OptionExercise(9` to ´using´ keyword
- Change `Option.SetOptionExerciseModel()` XML docs

* Minor tweaks

* Update CustomOptionExerciseModelRegressionAlgorithm.cs

---------

Co-authored-by: Martin-Molinero <martin@quantconnect.com>
2023-04-18 16:54:53 -03:00
Martin-Molinero
430b30b2ac Update readme.md 2023-04-18 15:09:23 -03:00
Martin-Molinero
c3cdeea0ee Update readme.md 2023-04-18 14:11:25 -03:00
prasom
a4f2c03015 Python ConstantAlphaModel Constructor is Missing an Argument (#7189)
* Python ConstantAlphaModel Constructor is Missing an Argument #7185

* Minor tweak

---------

Co-authored-by: Martin-Molinero <martin@quantconnect.com>
2023-04-17 20:03:49 -03:00
Martin-Molinero
d1a2b95ddc Update reserved chart names (#7190) 2023-04-17 20:02:27 -03:00
Jhonathan Abreu
f1076020af Add fillForward parameter to History methods (#7180)
* Add fillForward parameters to every History method

* Remove conflicting Python history method

* Undo removing conflicting Python history method

* Minor changes

* Minor changes

* Minor changes

* Add fillForward and extendedMarket parameters to history request factory

* Minor changes

* Minor changes

* Minor changes

* Minor changes

* Minor unit tests changes

* Rename fillForward parameter in History API

New name if fillDataForward as in the Add*Security API to standarize
parameters naming

* Rename fillForward parameter

Using the shorter fillForward in every API
2023-04-17 16:42:13 -03:00
prasom
cd88806e93 Start research returns permission denied when run inside a devcontainer in VS Code (#7139) (#7188) 2023-04-17 10:45:55 -03:00
Ricardo Andrés Marino Rojas
b5087bf42a Solve Report Generation Conversion Rate Error bug (#7183)
* Solve bug

Remove if sentence that checked if Portfolio contained securities that
needed a conversion, like Forex, Crypto or Cfd. It didn't take into
account CryptoFutures so when the backtest result used that kind of
security types it never found a conversion for them. Making a git blame
for Report.PortfolioLooper constructor it was found the if sentence was
not needed so it was removed and then different reports were made for
algorithms that used security types different than Forex,Crypto,Cfd and
CryptoFutures to check everything was still working as expected.

* Solve bug

Remove if sentence that checked if Portfolio contained securities that
needed a conversion, like Forex, Crypto or Cfd. It didn't take into
account CryptoFutures so when the backtest result used that kind of
security types it never found a conversion for them. Making a git blame
for Report.PortfolioLooper constructor it was found the if sentence was
not needed so it was removed and then different reports were made for
algorithms that used security types different than Forex,Crypto,Cfd and
CryptoFutures to check everything was still working as expected.
2023-04-13 14:43:56 -03:00
Martin-Molinero
4ad0288110 Add missing optimizer launcher reference (#7181) 2023-04-12 19:35:02 -03:00
Martin-Molinero
35469154c4 Update readme.md 2023-04-12 15:39:32 -03:00
Martin-Molinero
9c893e83a2 Minor optimizer improvement (#7179)
- Handle optimization backtest name
- Allow configurable optimizer for Optimizer.Launcher project
2023-04-12 15:35:54 -03:00
Jhonathan Abreu
8134b099fa Updated EMA indicator description (#7178) 2023-04-11 18:58:35 -03:00
Jhonathan Abreu
8d54438eac Add support for iterating FutureHistory and OptionHistory (#7176)
This adds support for accessing the history slices in research
environment
2023-04-11 18:54:58 -03:00
Martin-Molinero
b23bc870e2 Minor regression test update after EMA merge (#7177)
- Minor regression test update after EMA merge
2023-04-11 18:26:48 -03:00
Ricardo Andrés Marino Rojas
9e51f10b77 Add Feature Signal Exports feature (#7145)
* Add Collective2SignalExportClass
Add SignalExportTarget interface

* Collective2SignalExport test working

Add SignalExportManager
Add draft of CrunchDAOSignalExport

* Modify SignalExportManager

Instantiate SignalExportManager in QCAlgorithm constructor
Draft of CrunchDAOSignalExport

* Improve SignalExportManager

- Add regression tests SignalExportDemonstrationAlgorithm in C# and
  Python

* Improve SignalExportDemonstrationAlgorithm

Address requested changes in Collective2SignalExport, SignalExportManger and SignalExportTargetTests.cs

* Add CrunchDAOSignalExport.cs

Add CrunchDAOSignalExport unit tests in SignalExportTargetTests.cs

* Add NumeraiSignalExport.cs

Modify SignalExportDemonstrationAlgorithm.cs to test NumeraiSignalExport
Add unit test in SignalExportTargetTests to test NumeraiSignalExport

* Address required changes

- Add BaseSignalExport.cs
- Add SignalExportParameters.cs
- Add PortfolioSignalExportDemonstrationAlgorithm.cs/py
- Improve Error handling in SignalExport provider classes
- Collective2SignalExport now gets the correct number of shares for each holding
- SignalExportManager now computes the correct holding percentage of each portfolio target
- SignalExportManager now takes into account if the algorithm is in live mode
- Demonstration algorithms now are more simple

* Address last required changes

- PortfolioSignalExportDemonstrationAlgorithm.cs/py now inherits from SignalExportDemonstrationAlgorithm.cs/py
- Add more unit tests to assert SignalExportManager gets the correct percentage quantity for each holding
- Change Collective2SignalExport, CrunchDAOSignalExport and NumeraiSignalExport Send() method to return true if there was no error while sending the signals and false otherwise
- Nit changes

* Remove exceptions thrown

- Add more unit tests and more test cases
- Enhance BaseSignalExport.Dispose() method

* Add Collective2SignalExportClass
Add SignalExportTarget interface

* Collective2SignalExport test working

Add SignalExportManager
Add draft of CrunchDAOSignalExport

* Modify SignalExportManager

Instantiate SignalExportManager in QCAlgorithm constructor
Draft of CrunchDAOSignalExport

* Improve SignalExportManager

- Add regression tests SignalExportDemonstrationAlgorithm in C# and
  Python

* Improve SignalExportDemonstrationAlgorithm

Address requested changes in Collective2SignalExport, SignalExportManger and SignalExportTargetTests.cs

* Add CrunchDAOSignalExport.cs

Add CrunchDAOSignalExport unit tests in SignalExportTargetTests.cs

* Add NumeraiSignalExport.cs

Modify SignalExportDemonstrationAlgorithm.cs to test NumeraiSignalExport
Add unit test in SignalExportTargetTests to test NumeraiSignalExport

* Address required changes

- Add BaseSignalExport.cs
- Add SignalExportParameters.cs
- Add PortfolioSignalExportDemonstrationAlgorithm.cs/py
- Improve Error handling in SignalExport provider classes
- Collective2SignalExport now gets the correct number of shares for each holding
- SignalExportManager now computes the correct holding percentage of each portfolio target
- SignalExportManager now takes into account if the algorithm is in live mode
- Demonstration algorithms now are more simple

* Address last required changes

- PortfolioSignalExportDemonstrationAlgorithm.cs/py now inherits from SignalExportDemonstrationAlgorithm.cs/py
- Add more unit tests to assert SignalExportManager gets the correct percentage quantity for each holding
- Change Collective2SignalExport, CrunchDAOSignalExport and NumeraiSignalExport Send() method to return true if there was no error while sending the signals and false otherwise
- Nit changes

* Remove exceptions thrown

- Add more unit tests and more test cases
- Enhance BaseSignalExport.Dispose() method

* Fix failing regression tests

* Fix failing unit tests

* Nit changes

* Nit change

* Nit change

* Fix failing unit tests

* Changes required

- Break regression algos `SignalExportDemonstrationAlgorithm.cs/py` nad `PortfolioSignalExportDemonstrationAlgorithm.cs/`y` into three ones, one for each signal export provider
- Change SignalExportManager constructor to receive current algorithm as a parameter
- Fix bug in `SignalExportManager.GetPortfolioTargets()`, now it computes the correct percentage for each holding
- Make `BaseSignalExport.DefaultAllowedSecurityTypes` overrdible
- Handle case were `Collective2SignalExport.ConvertPercentageToQuantity()` returns null
- Clean unnecessary code in `Collective2SignalExport()`, `CrunchDAOSignalExport()` and `NumeraiSignalExport()`

* Nit change

* Nit change

* Minor tweaks after review

* Remove indexes from signal exports

* Required changes
- Change EMA indicators period from 200, 300 to 10,100 in regression algorithms
- Remove Indices from regression algorithms
- Add more XML documentation to regression algorithms
- Change `Log.Error` to `_algorithm.Error` in Signal export providers. Besides, fix error message format
- Change default value for `platformId` parameter in `Collective2SignalExport.cs` constructor
- Solve small bugs in SignalExportProvider when verificating the amount of porfolio targets is greater than zero and each portfolio target is allowed
- Handle case when `PortfolioTarget.Percent()` returns null in `Collective2SignalExport.ConvertPercentageToQuantity()`
- Handle error format message from Collective2 API
- Check every ticker signal is between 0 and 1 (inclusive) in `CrunchDAOSignalExport.cs`
- Modifiy `NumeraiSignalExport.cs` constructor to take into account filename given in the arguments
- Fix small bug with the return value of `ConvertTargetsToNumerai()` method in `NumeraiSignalExport.cs`
- Modify `SignalExportManager.cs` to return true when the algorithm being ran is not in live mode
- Remove indices from CrunchDAO unit tests

* Enhance ´CrunchDAOSignalExport.cs´ implementation

---------

Co-authored-by: Martin-Molinero <martin@quantconnect.com>
2023-04-11 17:45:07 -03:00
Jhonathan Abreu
ed92e6653b Fix EMA first value calculation (#7173)
* Fix EMA indicator first value calculation

As done by TALib and TradingView, the first EMA value after warmup is
the SMA of the first period.

* Update TSI indicator test data

Data was exported from TradingView

* Update TRIX indicator test data from TradingView

* Update AccumulationDistributionOscillator indicator test data from TradingView

* Update Double EMA indicator test data from TradingView

* Update McClellanSummationIndex indicator test data

* Update SchaffTrendCycle indicator test data

* Update TripleExponentialMovingAverage indicator test data from TradingView

* Update stats for algorithms using EMA

* Update failing unit tests
2023-04-11 17:43:25 -03:00
Martin-Molinero
08a1f84f91 Fix continuous futures back month contracts (#7175)
- Fix continuous futures back month contracts setting which was ignored.
  Updating regression algorithms
2023-04-11 17:42:46 -03:00
Jhonathan Abreu
8e54918378 Account for time zone on MOC orders time buffer check (#7174)
* Use UTC times when checking if MOC order is not past the allowed buffer

* Add unit test
2023-04-11 17:42:34 -03:00
Martin-Molinero
fcab09effb Update LiveTradingDataFeedTests.cs
See https://github.com/QuantConnect/Lean/pull/7169/files
2023-04-10 17:31:10 -03:00
Jhonathan Abreu
5436c72fad Handle margin call orders for position groups (#7137)
* Handle position group margin calls

* Minor changes

* Update regression algorithms

* Minor changes

* Minor changes

* Added regression algorithm

* Peer review

* Peer review

* Peer review

* Peer review

* Minor changes

* Minor changes

* Add unit test

* Allow sufficient buying power when closing position group

* Add unit test

* Improve regression algorithms
2023-04-10 12:42:08 -03:00
Martin-Molinero
f152652f5b Fix api account deserialization (#7172)
- Fix API account deserialization. Adding unit test
2023-04-10 12:38:38 -03:00
Martin-Molinero
f9bbec1e16 Remove internal subscriptions from future chain (#7169)
- Remove internal subscription from slive future chain collection.
  Adding regression algorithm reproducing the bug
2023-04-05 18:23:04 -03:00
Ricardo Andrés Marino Rojas
20c92b0350 Fix bug: Report Color Map Does Not Include Crypto Futures (#7168)
* Fix ReportCharts color_map bug

- Add ´CryptoFuture´ entry in `color_map` dict using color #E55812
- Make ´ReportCharts.py´ color_map a class attribute
- Change ´ReportChartsTests.cs´ to use color_map dict from ´ReportCharts.py´
- Add unit test that fails every time a new SecurityType is added

* Improve unit test

* Nit change

* Nit change
2023-04-05 17:51:16 -03:00
Jhonathan Abreu
375af2ebd2 Updated MHDB and CME currencies futures expiry functions (#7166)
* Updated MHDB and CME currencies futures expiry functions

Some expiry functions needed to take into consideration the security
holidays

* Add more holidays to CME securities in MHDB
2023-04-05 14:49:42 -03:00
Jhonathan Abreu
daae49cc4f Updat AlphaVantageDataDownloaderTests to make it time independent (#7167) 2023-04-05 13:00:54 -03:00
Martin-Molinero
227ade63ed Refactor automatic option assignment (#7165)
- Refactor automatic option assignment to allow overriding behavior.
  Adding & updating existing tests
2023-04-04 17:40:31 -03:00
Jhonathan Abreu
9524f48a33 Fix maximum lots calculation methods in SecurityPositionGroupBuyingPowerModel (#7163)
One of the methods was multiplying the resulting quantity times the lot
size, which is not accurate.
2023-04-04 17:29:22 -03:00
Louis Szeto
d977eb2181 Refactor MACD Alpha Model (#7140)
* Update regression test to check number of insights

* Update model to have insight manager ref and cancel insight when signal goes flat

* Update unit tests and regression tests

* Address peer review: using Insights.Clear
2023-04-04 17:22:15 -03:00
Martin-Molinero
e15614a18f Add live log limit to controls (#7162) 2023-04-04 13:57:38 -03:00
Jhonathan Abreu
2e20b4803d Accounting for the position quantity in margin requirements (#7161)
* Invalidate option strategies orders when short selling over margin

When shorting an option strategy with margin requirements that cannot be
met, the order should be invalidated. The buying power model is now able
to detect said situation and result in unssuficient buying power.

The OptionsMarginModel now uses the parameters instance values instead
of the security holdings to compute margin requirements. This fixes the
situation when calculation buying power for a first time position with
no holdings.

* Add and fix unit tests

* Update regression algorithms

* Peer review
2023-04-03 18:51:05 -03:00
Martin-Molinero
cb0c7b0814 Update KeyStringSynchronizerTests.cs 2023-04-03 14:24:41 -03:00
Martin-Molinero
645e1ca88c Downloader Data Provider Improvements (#7159)
* Downloader data provider fixes

- Fix stored data time zone, which is expected in data time zone
- Minor logging improvements
- LeanData Parse handles etf universes path. Adding unit test
- LeanDataWrite will only map if there's something to map to

* Fix download data provider synchronization

* Synchronization improvements after more testing

- KeyStringSynchronizer will handle reentrancy. Adding unit tests
- Define a unique Synchronizare for downloading data, since not related
  to disk reading & writting
2023-03-31 18:29:55 -03:00
Martin-Molinero
84bb72fddb Remove unrequired csharp debugger (#7156)
- Remove unused & outdated csharp debugger netcoredbg
2023-03-30 19:05:31 -03:00
Martin-Molinero
4d32119576 Unzip to folder from byte[] (#7152)
- Unzip data to folder from a given byte[]. Adding unit tests
2023-03-29 16:06:42 -03:00
Martin-Molinero
c836c62945 LeanDataWriter can handle mapping (#7150)
* LeanDataWriter can handle mapping

- Adjust LeanDataWrite so that it can handle symbol mapping if required.
  Adding unit tests

* Fix Lean Data path parsing
2023-03-29 16:04:23 -03:00
Alexandre Catarino
2069833361 Updates HistoricalReturnsAlphaModel to Cancel Insights Not Emit Flat (#7151)
* Updates Regression Algorithm to Assert the Number of Insights

* Updates HistoricalReturnsAlphaModel to Cancel Insights Not Emit Flat

We expect fewer insights after this change, but no changes to any regression algorithm.

* Updates Regression Algorithm

Assert the new expected number of generated insights.

* Use InsightCollection Clear Method
2023-03-29 16:03:27 -03:00
Alexandre Catarino
b46b50fa50 Adds HistoricalReturnsAlphaModelFrameworkRegressionAlgorithm (#7149) 2023-03-28 16:08:47 -03:00
Derek Melchin
4d77431ae1 Refactor RsiAlphaModel (#7125)
* Update regression tests to check consolidators are removed

* Update model

* Address review
2023-03-28 16:07:08 -03:00
Alexandre Catarino
1bce9bcb71 Improves Validates_SetEndTime Test (#7147)
Uses the "Now" in algorithm default timezone, since that's how `EndDate` is initialized in QCAlgorithm.
2023-03-28 11:01:04 -03:00
Martin-Molinero
2dc40f0477 Update readme.md 2023-03-27 19:34:09 -03:00
Martin-Molinero
403814d64f Handle error sending notification (#7146) 2023-03-27 15:31:53 -07:00
Martin-Molinero
384ec3dbad Update readme.md 2023-03-27 17:10:30 -03:00
Martin-Molinero
708d38d4e5 Update readme.md 2023-03-27 16:49:52 -03:00
Martin-Molinero
03bc23ed8c Add project id for api notification (#7144) 2023-03-27 15:59:51 -03:00
Shukri
73c26ee7ec Fix some typos (#7138)
* Fix typo

who often -> how often

Signed-off-by: hsm207 <hsm207@users.noreply.github.com>

* Fix typo

sometimes bug -> sometimes be buggy

Signed-off-by: hsm207 <hsm207@users.noreply.github.com>

* Correct number of options to run research nbs

Signed-off-by: hsm207 <hsm207@users.noreply.github.com>

---------

Signed-off-by: hsm207 <hsm207@users.noreply.github.com>
2023-03-27 10:29:52 -03:00
Martin-Molinero
ce33c393e6 Update Extensions.cs 2023-03-24 09:40:50 -03:00
Louis Szeto
279a306758 Update TrailingStopRiskManagementModel model to cancel insights (#7131)
* Update risk model to cancel insight

* Updates Regression Tests

---------

Co-authored-by: Alexandre Catarino <AlexCatarino@users.noreply.github.com>
2023-03-23 15:29:04 -03:00
Alexandre Catarino
0247b95edd Adds TrailingStopRiskFrameworkRegressionAlgorithm (#7132)
Replaces old `TrailingStopRiskFrameworkAlgorithm` for `TrailingStopRiskFrameworkRegressionAlgorithm` that inherits from `BaseFrameworkRegressionAlgorithm` as a member of the framework regression tests.
2023-03-23 13:43:09 -03:00
Jhonathan Abreu
d47e073d90 Use data end time to timestamp fundalmental data dictionaries (#7126)
* Use data end time to timestamp fundalmental data dictionaries

* Peer review
2023-03-23 13:41:03 -03:00
Louis Szeto
6d75aee0ce Add regression test for MaximumSectorExposureRiskManagementModel (#7123) 2023-03-23 12:37:30 -03:00
Martin-Molinero
bbbf6f3a74 Minor downloader data provider improvements (#7130)
- Improve start time request for daily/hour files
- Skip custom data since it's not supported by the LeanDataWriter
2023-03-23 12:27:34 -03:00
Louis Szeto
3362a976fa Avoid Invalid historical data piping in StandardDeviationExecutionModel (#7086)
* Remove invalid historical warm up in STD Execution

* refactor

* peer review

* Use `Consolidator.InputType`

* Update regression test
2023-03-23 12:24:42 -03:00
Louis Szeto
f684940a7c Update MaximumUnrealizedProfitPercentPerSecurity model to cancel insights (#7121)
* Update regression test

* Update model to expire insights

* Avoid remove insights

* Update regression test

* Use InsightManager Cancel to Expire All Insights

* Update CompositeRiskManagementModelFrameworkAlgorithm

This regression also depends on `MaximumUnrealizedProfitPercentPerSecurity` and `MaximumDrawdownPercentPerSecurity` but `MaximumDrawdownPercentPerSecurity` doesn't close positions.

---------

Co-authored-by: Alexandre Catarino <AlexCatarino@users.noreply.github.com>
2023-03-23 12:23:42 -03:00
Derek Melchin
9c92a67510 Update MaximumDrawdownPercentPortfolio model to cancel insights (#7105)
* Remove OnEndOfAlgorithm and update expected trades

* Update models to cancel insights

* Update expected results

There are 3 trades instead of 2 because the PCM does a rebalance

* Remove `Remove` method call

* Update to use the new `Cancel` method
2023-03-23 12:02:04 -03:00
Derek Melchin
b401fde07e Update MaximumDrawdownPercentPerSecurity model to cancel insights (#7103)
* Remove OnEndOfAlgorithm and update expected trade count

* Update models to cancel insights

* Update expected results

* Remove `Remove` method call

* Update to use the new `Cancel` method
2023-03-23 11:11:27 -03:00
Martin-Molinero
7db8df3f8d Add Insight expiration helper methods (#7127)
- Add InsightManager expiration helper methods. Adding unit tests
2023-03-22 19:15:47 -03:00
Alexandre Catarino
7feb46fec5 Fixes time zone (#7128)
If we use `.astimezone(dt.tzinfo)`, the new time was convering the timezone from local (e.g. PST) to GMT (dt.tzinfo). In this case, we only want to remove the timezone to enable the operation.
2023-03-22 19:02:11 -03:00
Martin-Molinero
1c81f5d028 Update readme.md 2023-03-22 17:43:50 -03:00
Alexandre Catarino
3b2e165254 Adds BaseFrameworkRegressionAlgorithm and New Regression Algorithms (#7116)
* Renames and Updates BaseAlphaModelFrameworkRegressionAlgorithm

The `BaseFrameworkRegressionAlgorithm ` will be used for multiple framework regression tests

* Updates and Renames EmaCrossAlphaModelFrameworkAlgorithm

Adds "Regression" to inform that it's a regression algorithm.

* Updates and Renames MaximumPortfolioDrawdownFrameworkAlgorithm

Adds "Regression" to inform that it's a regression algorithm, and use the model name: `MaximumDrawdownPercentPortfolio`

* Adds New Regression Algorithms
2023-03-22 11:21:30 -03:00
Martin-Molinero
44d1454ed7 Handle downloader data provider no MHDB entry (#7115)
* Handle downloader data provider no MHDB entry

* Address review: log once
2023-03-21 17:26:09 -03:00
Martin-Molinero
a58f6b679d Minor fake data queue handler fixes (#7114)
- Minor fake data queue handler fixes. Adding unit tests
2023-03-21 15:10:03 -03:00
Alexandre Catarino
761ea2571a Adds BaseAlphaModelFrameworkRegressionAlgorithm (#7107)
* Adds BaseAlphaModelFrameworkRegressionAlgorithm

`BaseAlphaModelFrameworkRegressionAlgorithm` will be used to validate Alpha Model regression algorithm with the same universe.

- HistoricalReturnsAlphaModelFrameworkAlgorithm
- EmaCrossAlphaModelFrameworkAlgorithm
- MacdAlphaModelFrameworkAlgorithm
- RsiAlphaModelFrameworkAlgorithm
- BasePairsTradingAlphaModelFrameworkAlgorithm

* Addresses Peer-Review
2023-03-21 13:22:34 -03:00
Jhonathan Abreu
0b661e70c1 Fix combo order direction determination (#7066)
* Fix fill quantity using group order quantity for combo orders

* Add Order's ComboQuantity property

* Add Order's ComboDirection property

* Minor changes and regression algorithms update

* Minor changes

* Update algorithms stats

* Minor changes and regression algorithms update

* Store the full quantity for each combo order leg in Quantity property instead of the ratio

* Minor changes and regression algorithms update

* A few fixes after pair programming

* Handle grouping position reduction

---------

Co-authored-by: Martin-Molinero <martin@quantconnect.com>
2023-03-21 12:26:50 -03:00
Alexandre Catarino
f1d55c3b0b Improves MinimumVariancePortfolioOptimizer Values Handling (#7106)
* Improves MinimumVariancePortfolioOptimizer Values Handling

The C# version of the `MinimumVariancePortfolioOptimizer` generated NaN resulting in unit tests failing.
If the solver returns NaN for an item, we set it to zero. if all items are NaN or Zero, we return the initial guess, since the sum cannot be zero.

* Fixes `RiskParityPortfolioConstructionModelTests`

We need to add insights to insight manager before we call `CreateTargets`.
2023-03-21 11:24:58 -03:00
Alexandre Catarino
497ac8497a Fixes Consolidator Removal from Subscription Manager in Python Algorithms (#7102)
* Adds Unit Test

Asserts that we can remove a consolidator that was previously added.

* AddConsolidator Method Only Wraps Non-C# Consolidators

This behavior was implemented in `QCAlgorithm.RegisterIndicator` to avoid wrapping an object unnecessarily.
2023-03-21 11:08:49 -03:00
Martin-Molinero
1877d59daa Improve aggregation helper methods (#7100)
- Improve LeanData aggregation helper methods to use shared consolidator based implementation
- Adding Tick to tradeBar aggregation
- Adding more unit tests
2023-03-20 16:08:25 -03:00
Martin-Molinero
56881e64fe Expand result state attributes (#7097)
- Add order, insight & log count into result algorithm state
2023-03-20 15:00:57 -03:00
Martin-Molinero
52de357b27 Terminal Link Minor Fixes (#7093)
- Fix data-queue-handler configuration initialization using paper brokerage
- Fix for downloader data provider request times
- Fix null reference exception in live result handler if algorithm is
  null
2023-03-20 12:24:16 -03:00
Derek Melchin
70acb30546 Test EmaCrossAlphaModel (#7081) 2023-03-17 18:08:43 -03:00
Alexandre Catarino
7c68e3f37a Refactor Portfolio Construction Models to Use Insight Manager (#7077)
* Asserts Number of Insights In One PCM Regression Test

If the `EqualWeightingPortfolioConstructionModel` interacts with the `QCAlgorithm.Insights`, the number of elements in the collection should not the sum of emitted insights.

* Refactor Portfolio Construction Models to Use Insight Manager

`PortfolioConstructionModel` will use `QCAlgorithm.Insights" instead of class property `InsightCollection` to manage the insights. It no longer adds insights to the collection, but it removes them if they expire or the securities are removed from the universe.

Updates PCMs that were affected by the change.

* Updates Unit Tests

We need to add the insights to the insight manager before we call `PortfolioConstruction.CreateTargets`
2023-03-17 18:00:43 -03:00
Louis Szeto
8a087f2166 Change python optimizer to Newton, added unit tests and regression test (#7085) 2023-03-17 15:23:31 -03:00
Martin-Molinero
a9c88ad25c ResultHandler state file improvements (#7078)
- Adjust start/end time string format
- In live trading will store the status file at the start, every 10 min
  and at the end
2023-03-16 18:24:49 -03:00
Martin-Molinero
bc6ac5470b Minor IndexOption underlying TZ fix (#7072)
* Minor IndexOption underlying TZ fix

- Fix for option universe chain underlying TZ which might not match the
  options one, bug affected IndexOption specifically.

* Update affected regression tests
2023-03-15 18:41:52 -03:00
Martin-Molinero
06bec5fb8e Add more logs for regression tests (#7073)
- Add holdings & cashbook logs from regression result handler, useful
  for debugging & developing
2023-03-15 18:25:26 -03:00
Martin-Molinero
d6f894eb3b Fix fill forward unit tests (#7070)
- Fix for some fill forward unit tests that were failing when run
  individually due to cache state in the
  TextSubscriptionDataSourceReader.
2023-03-15 12:45:04 -03:00
Martin-Molinero
8ed5f69ea6 Minor fill forward enumerator fix (#7068)
- Make sure the fill forward enumerator does not fill forward beyond the
  subscription end time. Adding tests
2023-03-15 10:18:43 -03:00
Alexandre Catarino
1c6be6438d Removes Cash Account Restriction for Framework Algorithms (#7067)
The user will be responsible for chosing/using models that fit the brokerage account type.
2023-03-14 19:25:20 -03:00
Martin-Molinero
2f03c92e30 Fill forward runtime adjustment (#7065)
- Fix for fill forward adjustment at runtime since the data stack runs
  async, we will remove and readd afected subscriptions.
2023-03-14 18:00:22 -03:00
Martin-Molinero
069246dda5 Performance Improvements (#7064)
* Performance Improvements

- Remove Immutable collection from position groups to improve
  performance. Adding more tests
- Remove ConcurrentDictionary from PortfolioTargetCollection &
  DataManager. Adding more tests
- Add Securities enumerator keys & values cache

* Add test for PortfolioTargetCollection remove by reference
2023-03-14 12:00:42 -03:00
Jhonathan Abreu
fbf8ffd924 Handle price discontinuity on volatility models (#7058)
* Apply splits and dividends to volatility models

* Apply splits and dividends to volatility models using history requests

* Add new ScaleRaw data normalization mode

Handling the new mode in the price scale enumerator.

* DataNormalizationMode.ScaledRaw history requests

* Minor changes

* Minor changes

* Disable new normalization mode in AddSecurity methods and other minor changes

* Peer review

* Minor changes

* Peer review

* Minor changes

* Peer review

* Peer review

* Peer review

* Add scaled raw history regression algorithm

* Add more regression algorithms

* Add more regression algorithms

* Add Slice.TryGet unit tests

* Peer review

* Peer review

* Peer review

* Peer review

* Peer review

* Update algorithms stats

* Peer review

* Peer review
2023-03-13 13:11:30 -03:00
Martin-Molinero
c6322956d9 Live trading holdings key (#7043)
* Fix live trading holdings uniqueness

- Fix live trading holdings key uniqueness

* Fix existing & add new test
2023-03-13 09:51:00 -03:00
Alexandre Catarino
aab5391d80 Fixes Limit Price Above/Below Open Case (#7060)
* Adds Unit Test For Limit Price Above/Below Open

See `LimitOrderFillsAtOpenWithFavorableGap`

* Fixes Limit Price Above/Below Open

If we place a buy/sell limit order below/above the current market price in TWS it fills immediately, so we model this behavior by filling with the opening price of the first trade bar.

* Updates Regression Tests

The number of trades did not change as expected. The fills are better because orders are filling with the open price when the new condition is met.
2023-03-10 14:23:45 -03:00
Martin-Molinero
bbbab6d9a8 Refactor alpha statistics phase I (#7055)
* Refactor alpha statistics

- Refactor alpha statistics, cleaning up and simplifying no longer required calculations and scoring
- Adding new InsightEvaluator abstraction, adding C# & PY regression
  algorithms

* Optimization backtest result json converter update

* Address reviews

- Remove IAlphaHandler, move insight storage responsability to IResultHandler
  and centralizing insight collection on the QCAlgorithm.Insights to be
  reused by the framework models
- Fix portfolio turnover single day backtests and duplicate time
  sampling handling. Updating regression algorithms

* Add InsightCollection tests and minor fixes

* Adding more & improved tests
2023-03-10 13:12:23 -03:00
Alexandre Catarino
4c909f33b9 Reuse Code To Find Best Effort TradeBar (#7057)
The `LimitFill`, `LimitIfTouchedFill` and `StopMaketFill` methods require `TradeBar` data to test price levels. We create a method to serve these methods as well other methods that will require this information.

Removes `Price > 0` check for `TradeType.Trade` data. Unecessary check, since a tick price cannot be less or equal to zero.
2023-03-09 11:06:26 -03:00
Martin-Molinero
e07c6265df Run TensorflowProbability Test Alone (#7056)
- For stability run TensorflowProbability test by itself
2023-03-08 17:18:58 -03:00
Alexandre Catarino
9069246519 Fixes EquityFillModel.StopMarketFill (#7042)
* Adds Unit Tests for Stop Market Fill

These unit tests covers new scenarios:
- Cannot trigger on quote data (QuoteBar or TickRype.Quote);
- Adds missing test for tick data (TickType.Trade)
- Unfavorable gap (see QuantConnect#4545)

* Fixes EquityFillModel StopMarketFill

Use the entire tick history to find the trigger price
Fill price is the stop price, unless there is an unfavorable gap (see #4545).

* Update Regression Tests

All regression tests keep the total trades. The difference are due to the time that the stop market orders are triggered and the prices that are filled. The `StopLossOnOrderEventRegressionAlgorithm` and the `UpdateOrderRegressionAlgorithm` observe the unfavorable gap case.

* Addresses Peer-Review

* Updates Regression Test

New `OrderListHash` because of the change in the fill on open case message.
2023-03-08 16:49:34 -03:00
Louis Szeto
0ed6d7e8b0 Remove annualization in MeanVarianceOptimizationPCM (#7053)
* remove annualization

* Update python optimizer to best fit in convex problem

* rerun test

* test metric

* Add comment to explain using simple return

* Add unit test on PR
2023-03-08 14:13:38 -03:00
Louis Szeto
11c182ed16 Add McClellanOscillator & McClellanSummationIndex Indicator (#7038)
* Add `McClellanOscillator` Indicator

* Add helper class in QCAlgorithm.Indicator

* Add `McClellanSummationIndex` indicator

* typo

* Fix MSI implementation

* Address peer review

* free `MOSC` in `MSI`

* fix bug

* Minor tweaks. Addressing review

---------

Co-authored-by: Martin-Molinero <martin@quantconnect.com>
2023-03-07 16:19:24 -03:00
Martin-Molinero
a5586ba562 Enqueable Enumerator Performance Improvement (#7049)
- Refactor enqueable enumerator not to require read lock most of the
  time
2023-03-06 15:40:55 -03:00
Martin-Molinero
1393ce4c5d Performance Securities & CashBook Collections (#7050)
- Improve performance of Securities & CashBook collections
2023-03-06 15:39:32 -03:00
Alexandre Catarino
694ffbbb80 Removes PythonTools from Solution (#7044)
* Removes PythonTools from Solution

Missing removal from #6967.
It results in a runtime error if we use dotnet to list the packages:
`dotnet list ../Lean/QuantConnect.Lean.sln package`

* Update QuantConnect.Lean.sln

---------

Co-authored-by: Martin-Molinero <martin@quantconnect.com>
2023-03-06 12:44:02 -03:00
Martin-Molinero
642fe96fde Update Binance Symbol Properties DB (#7040)
- Update Binance SPDB
- Minot fix for ExchangeInfoUpdater
2023-03-03 19:41:53 -03:00
Martin-Molinero
c4433098c3 Refactor Framework Statistics (#7041)
* Refactor framework statistics

* Further insight chart cleanup
2023-03-03 19:40:29 -03:00
Martin-Molinero
38f5a9c60c Bump to pythonNet 2.0.18 (#7036) 2023-03-03 13:11:03 -03:00
Louis Szeto
f4827f2f22 Modify advance decline indicators (#7032) 2023-03-02 15:48:20 -03:00
Jhonathan Abreu
81d1bb5095 Sample exposure for non invested portfolio (#7030) 2023-03-02 15:23:10 -03:00
Jhonathan Abreu
cdcd8fdacd Apply splits to TradeBuilder (#7020)
* Apply splits to TradeBuilder

* Minor tests changes

* Minor changes

* Add regression algorithm
2023-03-02 15:15:40 -03:00
Martin-Molinero
eebe0425d8 Rollback base image to focal (#7033)
* Rollback base image to focal

* Python env blame hang & crash
2023-03-02 12:43:23 -03:00
Martin-Molinero
caadaf62b2 Update readme.md 2023-03-01 20:12:05 -03:00
Louis Szeto
19df3e1e48 Normalization of Minimum Variance Optimizer's output weight (#6999)
* Update Optimizers to use absolute total weight for budgeting

* Update regression test

* address peer review

* added remarks
2023-03-01 17:20:58 -03:00
Martin-Molinero
66c016b284 Feature foundation update (#7028)
* Foundation Update

* Adding more foundation packages

* Update existing libraries

* Further package updates

* Image cleanup

- Update base image to ubuntu 22.04
- Some clean up on dockerfile
- Remove ARM base image

* Test updates

- Minor docker file tweaks
- Update existing python environment tests

* Add more tests & fix Julia

* Remove jupyter-dash

* Remove R from foundation

* Remove Julia

* Remove Tensorforce
2023-03-01 16:30:46 -03:00
Jhonathan Abreu
0c77be0ba8 Allow closed orders tag update (#7016)
* Allow closed orders tag update

* Minor changes
2023-02-27 18:42:24 -03:00
Wayne Adams
47bfdae372 docs: updates python version in vs instructions (#7014) 2023-02-27 10:19:02 -03:00
Jhonathan Abreu
3a2cae037f Fix UniverseDefinitions.ETF|Index overloads (#7006)
* Fix UniverseDefinitions.ETF|Index methods call ambiguity

* Minor changes
2023-02-24 16:35:35 -03:00
Martin-Molinero
b9e6781c96 Add missing exchanges (#7011)
* Add missing exchanges

- Add missing exchange definitions

* Fix and add more tests
2023-02-24 16:31:51 -03:00
Alexandre Catarino
2a6771c1c0 Fixes Liquidate Existing Holdings Behavior for SetHoldings for Multiple Targets (#7009)
* Adds Regression Test

The new regression test asserts that the total trades is 2.

* Fixes Liquidate Existing Holdings Bug

Liquidate existing holdings before open new postions.

* Addresses Peer-Review
2023-02-24 14:46:12 -03:00
Martin-Molinero
56270464cc IsOption Use Underlying Holidays and Early Closes if Empty (#7007)
* IsOption uses underlyings holidays

- Option assets will use underlyings holidays, early closes and late
  opens if their own are not defined

* Update regression algorithms
2023-02-24 12:49:51 -03:00
Alexandre Catarino
8bcd588602 Fixes EquityFillModel.FillModel (#7005)
* Adds Unit Tests

The `LimitFill` method should not fill using `QuoteBar` or `Tick` with `TickType.Quote` type.
Adds missing test for tick data (`TickType.Trade`).

* Fixes EquityFillModel.FillModel

Use `Tick` with `TickType.Trade` or `TradeBar` information to fill limit orders.

* Update Regression Test Expected Statistics

The regression tests changed because of different fills.
The `ExtendedMarketTradingRegressionAlgorithm` has different number of trades because of an extra fill on the 4th order generated by TradeBar with a Low lower than than the QuoteBar.Ask Low:

> 20230222 13:56:24.251 TRACE:: Log: Time: 10/10/2013 12:01:00 OrderID: 4 EventID: 2 Symbol: SPY Status: Filled Quantity: 10 FillQuantity: 10 FillPrice: 143.8998 USD

> asset.Cache.GetData<QuoteBar>().ToString()
"SPY: Bid: O: 144.2457 Bid: H: 144.2629 Bid: **L: 144.2457** Bid: C: 144.2629 Ask: O: 144.2543 Ask: H: 144.2889 Ask: **L: 144.2543** Ask: C: 144.2889 "

> asset.Cache.GetData<TradeBar>().ToString()
"SPY: O: 144.2543 H: 144.4532 **L: 143.4156** C: 144.2716 V: 75423"

* Improves Tick Resolution Unit Test

* Fixes Tick Resolution Case Handling

`master` only considers the latest trade, missing possible fills in the batch of trades.

* Adds Unit Test for Gap

See https://github.com/QuantConnect/Lean/issues/963

* Addresses Fill Optimistic Assumption

If we have a bar that gaps in our favor, we accept the limit price to avoid optimitic fills.

* Fixes Regression Tests

All regression tests with limit orders have worst performance after we remove the optimitic assumption, and use the limit price instead.
2023-02-24 10:35:34 -03:00
Alexandre Catarino
9cd05e9f1f Fixes BasePairsTradingAlphaModel (#7003)
* Updates the PearsonCorrelationPairsTradingAlphaModelFrameworkAlgorithm

Change the `PearsonCorrelationPairsTradingAlphaModelFrameworkAlgorithm` logic to show that it doesn't remove the consolidators used in the Alpha Model's indicators.

* Fixes `BasePairsTradingAlphaModel`

The `BasePairsTradingAlphaModel` will create indicators with class constructors and register them to consolidators that will be removed when the security is removed from the universe.

* Addresses Peer-Review
2023-02-24 10:20:01 -03:00
Jhonathan Abreu
40bff6efb7 Oanda trading hours update (#6998)
* Update Oanda's Forex and Metals CFDs trading hours in the MHDB

* Fix failing unit tests

* Update regression algorithm statistics

* Fix failing unit tests

* Minor changes
2023-02-24 10:14:55 -03:00
Jhonathan Abreu
f5e8966eea Uset GoodTilDate TIF for MOO and MOC orders (#7001)
* Uset GoodTilDate TIF for MOO orders

* Uset GoodTilDate TIF for MOC orders

* Add one-time warning for TIF validation
2023-02-23 17:38:44 -03:00
Ronit Jain
1596ed9846 remove force breakpoint (#7004) 2023-02-23 12:41:52 -03:00
Martin-Molinero
c1c4114dca Newtonsoft & Protobuf & RecyclableMemoryStream Updates (#7002)
* Dependency updates

- Update Newtonsoft to 13.0.2, protobuf to 3.2.0, RecyclableMemoryStream
  to 2.3.1

* Downgrade protobuf to 3.1.33
2023-02-23 12:11:01 -03:00
abhi-kr-2100
6acbcf0832 Brokerage Models Order Supported Types Check (#6989)
* Fix Issue #6937

Some brokerage models don't check the order type in `CanSubmitOrder`.
As a result, unimplemented order types don't cause `CanSubmitOrder`
to return false as it should.

This commit fixes these issues for:
* `FTXBrokerageModel.cs`
* `InteractiveBrokersBrokerageModel.cs`
* `SamcoBrokerageModel.cs`
* `TradierBrokerageModel.cs`
* `ZerodhaBrokerageModel.cs`

Brokerage implementations can be found at
https://github.com/orgs/QuantConnect/repositories. For example, the
Zerodha Brokerage implementation is available at
https://github.com/QuantConnect/Lean.Brokerages.Zerodha.

Signed-off-by: Abhishek Kumar <abhi.kr.2100@gmail.com>

* Use HashSet instead of an array

Checking if an object is contained within a HashSet is faster than
checking the same in an array.

Signed-off-by: Abhishek Kumar <abhi.kr.2100@gmail.com>

* Minor adjustments and normalization

* Add missing OptionExercise for IB

---------

Signed-off-by: Abhishek Kumar <abhi.kr.2100@gmail.com>
Co-authored-by: Martin-Molinero <martin@quantconnect.com>
2023-02-21 13:11:04 -03:00
Jhonathan Abreu
5675e71a32 Handle prices getting stuck on data generation (#6995)
* Handle prices getting stuck on data generation

* Add more unit tests
2023-02-21 13:09:31 -03:00
Martin-Molinero
48914b08db Chart Series Settings Lost (#6997)
* Fix live trading chart series index

- Fix Series loosing their index when handled by the
  LiveTradingResultHandler
- Some clean up for Series.cs

* Fix SeriesSampler loosing Series settings
2023-02-21 13:07:56 -03:00
Martin-Molinero
852c963bbf Remove unsupported HKFE from MHDB (#6990)
* Remove HKFE from MHDB

- Remove unsupported HKFE from MHDB

* Update tests
2023-02-20 20:19:42 -03:00
Alexandre Catarino
99848a1221 Adds NullBuyingPowerModel (#6977)
* Adds NullBuyingPowerModel

The `NullBuyingPowerModel` considers that we have sufficient buying power for all orders.

Adds example using a bull call spread since a equity buy and hold would not show the impact of this model in the position group buing power model.

* Define NullBuyingPowerModel.GetMaintenanceMargin

The `NullBuyingPowerModel.GetMaintenanceMargin` returns a `MaintenanceMargin` of zero. It means the total margin used is always zero and margin calls will not be triggered.

This feature is inspired on the  `ConstantBuyingPowerModel`. We don't inherit from that class, because `ConstantBuyingPowerModel.GetInitialMarginRequirement` gives us very small initial margin that leads to a very large quantity if we use `SetHoldings` or `CalculateOrderQuantity`
2023-02-20 19:50:24 -03:00
Martin-Molinero
7178be4f55 Remove Yahoo auxiliary data generator (#6993)
- Remove yahoo auxiliary data generator and failing tests
2023-02-20 19:23:31 -03:00
Martin-Molinero
017837c5a5 Remove Oanda cash account support (#6994)
- Oanda only supports margin account types
2023-02-20 19:21:50 -03:00
Martin-Molinero
c7294adfe4 Fix OrderQuantityLessThanLotSize typo (#6991) 2023-02-20 19:21:25 -03:00
Martin-Molinero
61fb997f07 Delete unsupported AlgoSeek Option Converter (#6992)
- Delete unsupported algoseek option converter
2023-02-20 19:21:15 -03:00
Alexandre Catarino
7cc6e31c43 Fixes Insight Period Calculation (#6978)
The calculations of `CloseTimeUtc` are correct and consistent: if the exchange is closed when the insight expires, `CloseTimeUtc` is the next open.

However, the definition of the `Period` was not consistent. Normally, it is defined by the different between `CloseTimeUtc` and `GeneratedTimeUtc`, but when we create an Insight with the Resolution and bar count overload, the period was defined by them:

```csharp
insight.Period = Resolution.ToTimeSpan().Multiply(BarCount);
```

which is incorrect, since it doesn't take the days the exchange is closed into account. The `ComputePeriod` method enforced consistency between the Resolution and bar Count overload and the `DateTime` overload, so the period for this overload was also incorrect.
2023-02-20 16:23:13 -03:00
Alexandre Catarino
b5ca1ac461 Removes UncorrelatedUniverseSelectionModel (#6976)
Framework models must have a C#, and Python implementation and algorithms that use them.
2023-02-20 16:21:53 -03:00
Jhonathan Abreu
2a54da9e2c Custom data type history API usage in Python (#6971)
* Custom data type history request in python

* Potential solutions

* Minor changes

* Use Slice.Get(Type) for getting python custom data history

* Minor changes

* Add unit tests

* Add unit tests

* Udpdate regression algorithms

* Peer review

* Peer review

* Add research regression tests

* Minor changes

* Minor changes

* Minor tweaks

---------

Co-authored-by: Martin-Molinero <martin@quantconnect.com>
2023-02-20 16:21:37 -03:00
Martin-Molinero
6fd1a002fe Adjust index option data timezone (#6970)
* Fix index option data timezone

- Fix index option data timezone which was 1 hour late than expected

* Update existing index option tests

- Update existing index option tests.
- Disable index option daily resolution support
2023-02-16 17:35:10 -03:00
Martin-Molinero
ace1a1f20d Define MaximumContractDepthOffset (#6969) 2023-02-16 17:23:56 -03:00
Martin-Molinero
75f86f555e Delete unused PythonToolbox (#6967) 2023-02-16 17:23:38 -03:00
Martin-Molinero
20655b334b Update readme.md 2023-02-15 15:16:55 -03:00
Martin-Molinero
3507c91640 Fix future daily price scale factor update (#6963)
* Fix future daily price scale factor update

- Fix future daily price scale factor update which was happening 1 day
  late due to data and exchange time zone differences.
  Adding regression algorithm reproducing and asserting it.

* Address review
2023-02-14 20:09:59 -03:00
Jhonathan Abreu
ebb31d0fb4 Unsettled cash conversion rate update (#6961)
* Update unsettled cashbook cash conversion rates

Also moved conversion rate holding from Cash to the CurrencyConversion
instance

* Minor fixes

* Peer review

* Minor fixes

* Minor fixes

* Minor fixes
2023-02-14 18:19:25 -03:00
Ronit Jain
dcd60d0551 Add support for HTML reports conversion to PDF (#6960)
* add wkhtmltopdf to lean image

* convert html to pdf

* avoid black stripts at bottom of each page

* address reviews

* address review

* address reviews

* self review

* address review
2023-02-14 15:50:19 -03:00
Martin-Molinero
dc2c68c754 Fix security cache reset (#6959)
* Fix security cache reset

- Fix security cache reset so it only happens when no universe has it as
  a member. Adding regression algorithm reproducing issue

* Avoid non deterministic FillForward behavior
2023-02-14 12:09:27 -03:00
Jhonathan Abreu
2791765c94 Make Consolidate Calendar overload with tick type public (#6957) 2023-02-13 16:01:30 -03:00
Martin-Molinero
f270f25eca Fix default future chain universe selection (#6958)
* Fix default future chain universe selection

- Fix default future chain universe selection that should always return
  empty, no selection. In some cases it would allos some contracts
  though. Adding regression algorithm reproducing issue.

* Address review
2023-02-13 15:56:48 -03:00
Martin-Molinero
8235de42a0 Minor debugging improvements (#6954)
* Minor debugging improvements

- Improve exception message if user provides empty/null ticker
- Log margin information on algorithn initialization
- Add unit test asserting option strategy position groups resolve
  correctly for existing holdings

* Symbol Lazy SecurityDefinitionSymbolResolver

- Symbol will have a lazy SecurityDefinitionSymbolResolver instance
  resolution
2023-02-13 10:49:10 -03:00
Martin-Molinero
c2e21df18b Fix combo order prechecks (#6953)
- Apply combo order prechecks before submitting orders. Adding unit test
2023-02-10 19:11:45 -03:00
Jhonathan Abreu
35dfcd73ab Index options MHDB review (#6890)
* Index options MHDB review

* Update MHDB

* Update regression algorithms stats

* Update regression algorithms stats

* Add index and index options holidays

* Peer review

* Update algorithms stats
2023-02-10 14:37:44 -03:00
Jhonathan Abreu
3783900eef Move Brokerages namespace's messages to Messages folder (#6915) 2023-02-10 13:49:15 -03:00
Jhonathan Abreu
9fea859323 Symbol to industry-standard security identifier conversion (#6893)
* Implement SecurityDefinitionSymbolResolver backwards conversion (symbol -> standard id)

* Peer review

* Peer review

* Peer review
2023-02-10 13:12:13 -03:00
Jhonathan Abreu
6e2744af7c Move Securities namespace's messages to Messages folder (#6922)
* Move Securities namespace's messages to Messages folder

* Rebase related fixes

---------

Co-authored-by: Martin-Molinero <martin@quantconnect.com>
2023-02-10 11:31:11 -03:00
Martin-Molinero
962b91fc12 Fix Messages namespace collision 2023-02-10 10:50:03 -03:00
Louis Szeto
cf00d3c9f3 OptionStrategies for put calendar spread index weeklies example (#6951) 2023-02-10 10:44:47 -03:00
Louis Szeto
8af5c8b6f2 OptionStrategies for put butterfly index weeklies example (#6950) 2023-02-10 10:42:40 -03:00
Louis Szeto
1fcef8c024 OptionStrategies for Index Option Call Butterfly (#6949)
* OptionStrategies for call butterfly index weeklies example

* fix typo
2023-02-10 10:42:07 -03:00
Jhonathan Abreu
a912638496 Move QuantConnect namespace's messages to Messages folder (#6924) 2023-02-10 10:41:05 -03:00
Jhonathan Abreu
5611b5508a Binance crypto futures fee models (#6874)
* Add Binance Futures and Binance Coin Futures fee models

* Add unit tests

* Add unit tests

* Minor changes

* Peer review

* Peer review
2023-02-09 19:25:27 -03:00
Jhonathan Abreu
b3bd15d3c2 Move Notifications, Optimizer and Python namespaces' messages to Messages folder (#6931) 2023-02-09 19:23:39 -03:00
Jhonathan Abreu
25ab8bdacc Move small namespaces' messages to 'Messages' folder (#6930)
* Move Benchmarks, Exceptions and Indicators namespaces' messages to Messages folder

* Move Command namespace's messages to Messages folder
2023-02-09 19:17:40 -03:00
Jhonathan Abreu
38c5ef3e2b Add CME Ether futures to symbols database (#6884)
* Add Ether futures to symbols database

* Change ETH futures exchange time zone to US/Central

* Add new contracts FuturesExpiryFuntions

* Remove BTIC Micro BTC and BTIC Micro Ether securities

* Add Ether futures IB fees and price multiplier entry

* Update Ethereum price multiplier
2023-02-09 18:42:19 -03:00
Jhonathan Abreu
194f01e621 Move Algorithm namespace's messages to Messages folder (#6916) 2023-02-09 18:35:29 -03:00
Martin-Molinero
61b5231c50 Research GetOptionHistory Weekly Index Improvement (#6946)
- Improve research GetOptionHistory weekly index option support. Adding
  unit test
2023-02-09 18:35:20 -03:00
Louis Szeto
4a06fcdda0 OptionStrategies for Index Option Bull Put Spread (#6945) 2023-02-09 16:10:14 -03:00
Louis Szeto
8325fd18ca OptionStrategies for Index Option Bull Call Spread (#6944) 2023-02-09 16:07:43 -03:00
Louis Szeto
2bc8783082 OptionStrategies for Index Option Bear Put Spread (#6943) 2023-02-09 16:07:00 -03:00
Louis Szeto
0d9f011758 OptionStrategies for Index Option Bear Call Spread (#6942) 2023-02-09 16:06:12 -03:00
Jhonathan Abreu
6dfc6c710c Add algorithm parameters to result (#6878)
* Add algorithm parameters to result's AlgorithmConfiguration

* Peer review
2023-02-09 12:55:30 -03:00
Jhonathan Abreu
e30232e21b Portfolio.UnsettledCashBook update when quote currency is not the account currency (#6871)
* Tracking unsettled cash for non-USD account currency

* Add unit tests

* Peer review

* Move and rename CashBook.UpdateType to Globals
2023-02-09 12:53:52 -03:00
Louis Szeto
8730eeb8a9 Volume Renko Consolidator & Bar (#6888)
* Volume Renko Consolidator & Bar

* address peer review

* Minor fix on tests

---------

Co-authored-by: LouisSzeto <hke0073@hotmail.com>
2023-02-09 10:46:02 -03:00
3732 changed files with 455888 additions and 150312 deletions

View File

@@ -24,7 +24,7 @@
// "forwardPorts": [],
// Uncomment the next line to run commands after the container is created - for example installing curl.
"postCreateCommand": "dotnet nuget add source /Lean/LocalPackages; dos2unix /Lean/.vscode/launch_research.sh",
"postCreateCommand": "dotnet nuget add source /Lean/LocalPackages;chmod u+x /Lean/.vscode/launch_research.sh;dos2unix /Lean/.vscode/launch_research.sh",
// Add mounts to docker container
"mounts": [

30
.github/workflows/api-tests.yml vendored Normal file
View File

@@ -0,0 +1,30 @@
name: API Tests
on:
push:
branches: ['*']
tags: ['*']
pull_request:
branches: [master]
jobs:
build:
runs-on: ubuntu-20.04
# Only run on push events (not on pull_request) for security reasons in order to be able to use secrets
if: ${{ github.event_name == 'push' }}
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Free space
run: df -h && rm -rf /usr/share/dotnet && sudo rm -rf /usr/local/lib/android && sudo rm -rf /opt/ghc && rm -rf /opt/hostedtoolcache* && df -h
- name: Run API Tests
uses: addnab/docker-run-action@v3
with:
image: quantconnect/lean:foundation
options: --workdir /__w/Lean/Lean -v /home/runner/work:/__w -e GITHUB_REF=${{ github.ref }} -e QC_JOB_USER_ID=${{ secrets.QC_JOB_USER_ID }} -e QC_API_ACCESS_TOKEN=${{ secrets.QC_API_ACCESS_TOKEN }} -e QC_JOB_ORGANIZATION_ID=${{ secrets.QC_JOB_ORGANIZATION_ID }}
shell: bash
run: |
# Build
dotnet build /p:Configuration=Release /v:quiet /p:WarningLevel=1 QuantConnect.Lean.sln
# Run Projects tests
dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --blame-hang-timeout 300seconds --blame-crash --filter "FullyQualifiedName=QuantConnect.Tests.API.ProjectTests|ObjectStoreTests" -- TestRunParameters.Parameter\(name=\"log-handler\", value=\"ConsoleErrorLogHandler\"\)

View File

@@ -10,23 +10,21 @@ on:
jobs:
build:
runs-on: ubuntu-20.04
container:
image: quantconnect/lean:foundation
steps:
- uses: actions/checkout@v2
- name: Checkout
uses: actions/checkout@v2
- name: Free space
run: df -h && rm -rf /usr/share/dotnet && sudo rm -rf /usr/local/lib/android && sudo rm -rf /opt/ghc && rm -rf /opt/hostedtoolcache* && df -h
- name: Build
run: dotnet build /p:Configuration=Release /v:quiet /p:WarningLevel=1 QuantConnect.Lean.sln
- name: Run Tests
run: dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --blame-hang-timeout 300seconds --blame-crash --filter "TestCategory!=TravisExclude&TestCategory!=ResearchRegressionTests" -- TestRunParameters.Parameter\(name=\"log-handler\", value=\"ConsoleErrorLogHandler\"\)
- name: Generate & Publish python stubs
if: startsWith(github.ref, 'refs/tags/')
run: |
chmod +x ci_build_stubs.sh
./ci_build_stubs.sh -t -g -p
env:
PYPI_API_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
ADDITIONAL_STUBS_REPOS: ${{ secrets.ADDITIONAL_STUBS_REPOS }}
QC_GIT_TOKEN: ${{ secrets.QC_GIT_TOKEN }}
- uses: addnab/docker-run-action@v3
with:
image: quantconnect/lean:foundation
options: --workdir /__w/Lean/Lean -v /home/runner/work:/__w -e GITHUB_REF=${{ github.ref }} -e PYPI_API_TOKEN=${{ secrets.PYPI_API_TOKEN }} -e ADDITIONAL_STUBS_REPOS=${{ secrets.ADDITIONAL_STUBS_REPOS }} -e QC_GIT_TOKEN=${{ secrets.QC_GIT_TOKEN }}
shell: bash
run: |
# Build
dotnet build /p:Configuration=Release /v:quiet /p:WarningLevel=1 QuantConnect.Lean.sln && \
# Run Tests
dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --blame-hang-timeout 300seconds --blame-crash --filter "TestCategory!=TravisExclude&TestCategory!=ResearchRegressionTests" -- TestRunParameters.Parameter\(name=\"log-handler\", value=\"ConsoleErrorLogHandler\"\) && \
# Generate & Publish python stubs
echo "GITHUB_REF $GITHUB_REF" && if [[ $GITHUB_REF = refs/tags/* ]]; then (chmod +x ci_build_stubs.sh && ./ci_build_stubs.sh -t -g -p); else echo "Skipping stub generation"; fi

View File

@@ -10,13 +10,19 @@ on:
jobs:
build:
runs-on: ubuntu-20.04
container:
image: quantconnect/lean:foundation
steps:
- uses: actions/checkout@v2
- name: Checkout
uses: actions/checkout@v2
- name: Free space
run: df -h && rm -rf /usr/share/dotnet && sudo rm -rf /usr/local/lib/android && sudo rm -rf /opt/ghc && rm -rf /opt/hostedtoolcache* && df -h
- name: Build
run: dotnet build /p:Configuration=Release /v:quiet /p:WarningLevel=1 QuantConnect.Lean.sln
- name: Run Tests
run: dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter TestCategory=RegressionTests -- TestRunParameters.Parameter\(name=\"log-handler\", value=\"ConsoleErrorLogHandler\"\) TestRunParameters.Parameter\(name=\"reduced-disk-size\", value=\"true\"\)
- uses: addnab/docker-run-action@v3
with:
image: quantconnect/lean:foundation
options: --workdir /__w/Lean/Lean -v /home/runner/work:/__w
shell: bash
run: |
# Build
dotnet build /p:Configuration=Release /v:quiet /p:WarningLevel=1 QuantConnect.Lean.sln
# Run Tests
dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter TestCategory=RegressionTests -- TestRunParameters.Parameter\(name=\"log-handler\", value=\"ConsoleErrorLogHandler\"\) TestRunParameters.Parameter\(name=\"reduced-disk-size\", value=\"true\"\)

30
.github/workflows/report-generator.yml vendored Normal file
View File

@@ -0,0 +1,30 @@
name: Report Generator Tests
on:
push:
branches: ['*']
tags: ['*']
pull_request:
branches: [master]
jobs:
build:
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Free space
run: df -h && rm -rf /usr/share/dotnet && sudo rm -rf /usr/local/lib/android && sudo rm -rf /opt/ghc && rm -rf /opt/hostedtoolcache* && df -h
- uses: addnab/docker-run-action@v3
with:
image: quantconnect/lean:foundation
options: --workdir /__w/Lean/Lean -v /home/runner/work:/__w
shell: bash
run: |
# Build
dotnet build /p:Configuration=Release /v:quiet /p:WarningLevel=1 QuantConnect.Lean.sln
# Run Backtest
cd ./Launcher/bin/Release && dotnet QuantConnect.Lean.Launcher.dll && cd ../../../
# Run Report
cd ./Report/bin/Release && dotnet ./QuantConnect.Report.dll --backtest-data-source-file ../../../Launcher/bin/Release/BasicTemplateFrameworkAlgorithm.json --close-automatically true

View File

@@ -10,26 +10,27 @@ on:
jobs:
build:
runs-on: ubuntu-20.04
container:
image: quantconnect/lean:foundation
steps:
- uses: actions/checkout@v2
- name: Checkout
uses: actions/checkout@v2
- name: Free space
run: df -h && rm -rf /usr/share/dotnet && sudo rm -rf /usr/local/lib/android && sudo rm -rf /opt/ghc && rm -rf /opt/hostedtoolcache* && df -h
- name: install dependencies
run: |
pip3 install papermill==2.4.0 clr-loader==0.1.6
- name: install kernel
run: dotnet tool install --global Microsoft.dotnet-interactive --version 1.0.340501
- name: Add dotnet tools to Path
run: echo "$HOME/.dotnet/tools" >> $GITHUB_PATH
- name: activate kernel for jupyter
run: dotnet interactive jupyter install
- name: Build
run: dotnet build /p:Configuration=Release /v:quiet /p:WarningLevel=1 QuantConnect.Lean.sln
- name: Run Tests
run: dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter TestCategory=ResearchRegressionTests -- TestRunParameters.Parameter\(name=\"log-handler\", value=\"ConsoleErrorLogHandler\"\) TestRunParameters.Parameter\(name=\"reduced-disk-size\", value=\"true\"\)
- uses: addnab/docker-run-action@v3
with:
image: quantconnect/lean:foundation
options: --workdir /__w/Lean/Lean -v /home/runner/work:/__w
shell: bash
run: |
# install dependencies
pip3 install papermill==2.4.0 clr-loader==0.1.6
# install kernel
dotnet tool install --global Microsoft.dotnet-interactive --version 1.0.340501
# Add dotnet tools to Path
export PATH="$HOME/.dotnet/tools:$PATH"
# activate kernel for jupyter
dotnet interactive jupyter install
# Build
dotnet build /p:Configuration=Release /v:quiet /p:WarningLevel=1 QuantConnect.Lean.sln
# Run Tests
dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter TestCategory=ResearchRegressionTests -- TestRunParameters.Parameter\(name=\"log-handler\", value=\"ConsoleErrorLogHandler\"\) TestRunParameters.Parameter\(name=\"reduced-disk-size\", value=\"true\"\)

View File

@@ -10,52 +10,48 @@ on:
jobs:
build:
runs-on: ubuntu-20.04
container:
image: quantconnect/lean:foundation
steps:
- uses: actions/checkout@v2
- name: Checkout
uses: actions/checkout@v2
- name: Free space
run: df -h && rm -rf /usr/share/dotnet && sudo rm -rf /usr/local/lib/android && sudo rm -rf /opt/ghc && rm -rf /opt/hostedtoolcache* && df -h
- name: Build
run: dotnet build /p:Configuration=Release /v:quiet /p:WarningLevel=1 QuantConnect.Lean.sln
- name: Python Virtual Environment System Packages
run: python -m venv /lean-testenv --system-site-packages && . /lean-testenv/bin/activate && pip install --no-cache-dir lean==1.0.99 && deactivate
- name: Run Virtual Environment Test System Packages
run: dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonVirtualEnvironmentTests.AssertVirtualEnvironment"
- name: Python Virtual Environment
run: rm -rf /lean-testenv && python -m venv /lean-testenv && . /lean-testenv/bin/activate && pip install --no-cache-dir lean==1.0.99 && deactivate
- name: Run Virtual Environment Test
run: dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonVirtualEnvironmentTests.AssertVirtualEnvironment"
- name: Run Python Package Tests
run: dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests"
- name: Run Pomegranate Python Package Test
run: dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.PomegranateTest"
- name: Run Tensorforce Python Package Test
run: dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.TensorforceTests"
- name: Run StableBaselines Python Package Test
run: dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.StableBaselinesTest"
- name: Run AxPlatform Python Package Test
run: dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.AxPlatformTest"
- name: Run NeuralTangents Python Package Test
run: dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.NeuralTangentsTest"
- name: Run NBeats Python Package Test
run: dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.NBeatsTest"
- name: Run Tensorly Python Package Test
run: dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.TensorlyTest"
- name: Run Ignite Python Package Test
run: dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.IgniteTest"
- name: Run Hvplot Python Package Test
run: dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.HvplotTest"
- uses: addnab/docker-run-action@v3
with:
image: quantconnect/lean:foundation
options: --workdir /__w/Lean/Lean -v /home/runner/work:/__w
shell: bash
run: |
# Build
dotnet build /p:Configuration=Release /v:quiet /p:WarningLevel=1 QuantConnect.Lean.sln && \
# Python Virtual Environment System Packages
python -m venv /lean-testenv --system-site-packages && . /lean-testenv/bin/activate && pip install --no-cache-dir lean==1.0.185 && deactivate && \
# Run Virtual Environment Test System Packages
dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonVirtualEnvironmentTests.AssertVirtualEnvironment" && \
# Python Virtual Environment
rm -rf /lean-testenv && python -m venv /lean-testenv && . /lean-testenv/bin/activate && pip install --no-cache-dir lean==1.0.185 && deactivate && \
# Run Virtual Environment Test
dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonVirtualEnvironmentTests.AssertVirtualEnvironment" && \
# Run Python Package Tests
dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests" --blame-hang-timeout 120seconds --blame-crash && \
# Run StableBaselines Python Package Test
dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.StableBaselinesTest" --blame-hang-timeout 120seconds --blame-crash && \
# Run AxPlatform Python Package Test
dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.AxPlatformTest" --blame-hang-timeout 120seconds --blame-crash && \
# Run TensorlyTest Python Package Test
dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.TensorlyTest" --blame-hang-timeout 120seconds --blame-crash && \
# Run NeuralTangents, Ignite Python Package Test
dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.NeuralTangentsTest|IgniteTest" --blame-hang-timeout 120seconds --blame-crash && \
# Run TensorflowTest
dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.TensorflowTest" --blame-hang-timeout 120seconds --blame-crash && \
# Run TensorflowProbability
dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.TensorflowProbabilityTest" --blame-hang-timeout 120seconds --blame-crash && \
# Run Hvplot Python Package Test
dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.HvplotTest" --blame-hang-timeout 120seconds --blame-crash && \
# Run Keras Python Package Test
dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.KerasTest" --blame-hang-timeout 120seconds --blame-crash && \
# Run Transformers
dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.Transformers" --blame-hang-timeout 120seconds --blame-crash && \
dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.XTransformers" --blame-hang-timeout 120seconds --blame-crash && \
# Run Shap
dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.ShapTest" --blame-hang-timeout 120seconds --blame-crash

3
.gitignore vendored
View File

@@ -1,3 +1,6 @@
# OS Files
.DS_Store
# Object files
*.o
*.ko

View File

@@ -20,8 +20,8 @@ To use Lean CLI follow the instructions for installation and tutorial for usage
1. Install [.Net 6](https://dotnet.microsoft.com/download) for the project
2. (Optional) Get [Python 3.6.8](https://www.python.org/downloads/release/python-368/) for running Python algorithms
- Follow Python instructions [here](https://github.com/QuantConnect/Lean/tree/master/Algorithm.Python#installing-python-36) for your platform
2. (Optional) Get [Python 3.8.13](https://www.python.org/downloads/release/python-3813/) for running Python algorithms
- Follow Python instructions [here](https://github.com/QuantConnect/Lean/tree/master/Algorithm.Python#installing-python-38) for your platform
3. Get [Visual Studio](https://visualstudio.microsoft.com/vs/)

2
.vscode/readme.md vendored
View File

@@ -156,5 +156,5 @@ _Figure 2: Python Debugger Messages_
Here we will cover some common issues with setting this up. This section will expand as we get user feedback!
- The "project file cannot be loaded" and "nuget packages not found" errors occurs when the project files are open by another process in the host. Closing all applications and/or restarting the computer solve the issue.
- Autocomplete and reference finding with omnisharp can sometimes bug, if this occurs use the command palette to restart omnisharp. (Ctrl+Shift+P "OmniSharp: Restart OmniSharp")
- Autocomplete and reference finding with omnisharp can sometimes be buggy, if this occurs use the command palette to restart omnisharp. (Ctrl+Shift+P "OmniSharp: Restart OmniSharp")
- Any error messages about building in VSCode that point to comments in JSON. Either select **ignore** or follow steps described [here](https://stackoverflow.com/questions/47834825/in-vs-code-disable-error-comments-are-not-permitted-in-json) to remove the errors entirely.

View File

@@ -55,7 +55,7 @@ namespace QuantConnect.Algorithm.CSharp
||
Portfolio.TotalHoldingsValue < Portfolio.TotalPortfolioValue * 0.01m)
{
throw new Exception($"Unexpected Total Holdings Value: {Portfolio.TotalHoldingsValue}");
throw new RegressionTestException($"Unexpected Total Holdings Value: {Portfolio.TotalHoldingsValue}");
}
}
@@ -67,7 +67,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -79,53 +79,43 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "199"},
{"Total Orders", "199"},
{"Average Win", "0.00%"},
{"Average Loss", "0.00%"},
{"Compounding Annual Return", "-12.611%"},
{"Drawdown", "0.200%"},
{"Expectancy", "-0.585"},
{"Start Equity", "100000"},
{"End Equity", "99827.80"},
{"Net Profit", "-0.172%"},
{"Sharpe Ratio", "-10.169"},
{"Sharpe Ratio", "-11.13"},
{"Sortino Ratio", "-16.704"},
{"Probabilistic Sharpe Ratio", "12.075%"},
{"Loss Rate", "78%"},
{"Win Rate", "22%"},
{"Profit-Loss Ratio", "0.87"},
{"Alpha", "-0.149"},
{"Alpha", "-0.156"},
{"Beta", "0.035"},
{"Annual Standard Deviation", "0.008"},
{"Annual Variance", "0"},
{"Information Ratio", "-9.603"},
{"Tracking Error", "0.215"},
{"Treynor Ratio", "-2.264"},
{"Treynor Ratio", "-2.478"},
{"Total Fees", "$199.00"},
{"Estimated Strategy Capacity", "$26000000.00"},
{"Lowest Capacity Asset", "SPY R735QTJ8XC9X"},
{"Fitness Score", "0.002"},
{"Kelly Criterion Estimate", "38.796"},
{"Kelly Criterion Probability Value", "0.228"},
{"Sortino Ratio", "-22.493"},
{"Return Over Maximum Drawdown", "-77.93"},
{"Portfolio Turnover", "1.211"},
{"Total Insights Generated", "100"},
{"Total Insights Closed", "99"},
{"Total Insights Analysis Completed", "99"},
{"Long Insight Count", "100"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$135639.1761"},
{"Total Accumulated Estimated Alpha Value", "$21852.9784"},
{"Mean Population Estimated Insight Value", "$220.7372"},
{"Mean Population Direction", "53.5354%"},
{"Mean Population Magnitude", "53.5354%"},
{"Rolling Averaged Population Direction", "58.2788%"},
{"Rolling Averaged Population Magnitude", "58.2788%"},
{"OrderListHash", "3c4c4085810cc5ecdb927d3647b9bbf3"}
{"Portfolio Turnover", "119.89%"},
{"OrderListHash", "d06c26f557b83d8d42ac808fe2815a1e"}
};
}
}

View File

@@ -66,7 +66,7 @@ namespace QuantConnect.Algorithm.CSharp
|| insightsCollection.Insights.Count(insight => insight.Symbol == _spy) != 1
|| insightsCollection.Insights.Count(insight => insight.Symbol == _ibm) != 1)
{
throw new Exception("Unexpected insights were emitted");
throw new RegressionTestException("Unexpected insights were emitted");
}
}
@@ -103,7 +103,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -115,53 +115,43 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "9"},
{"Total Orders", "9"},
{"Average Win", "0.86%"},
{"Average Loss", "-0.27%"},
{"Compounding Annual Return", "184.364%"},
{"Compounding Annual Return", "206.404%"},
{"Drawdown", "1.700%"},
{"Expectancy", "1.781"},
{"Start Equity", "100000"},
{"End Equity", "101441.92"},
{"Net Profit", "1.442%"},
{"Sharpe Ratio", "4.86"},
{"Sharpe Ratio", "4.836"},
{"Sortino Ratio", "10.481"},
{"Probabilistic Sharpe Ratio", "59.497%"},
{"Loss Rate", "33%"},
{"Win Rate", "67%"},
{"Profit-Loss Ratio", "3.17"},
{"Alpha", "4.181"},
{"Alpha", "4.164"},
{"Beta", "-1.322"},
{"Annual Standard Deviation", "0.321"},
{"Annual Variance", "0.103"},
{"Information Ratio", "-0.795"},
{"Tracking Error", "0.532"},
{"Treynor Ratio", "-1.18"},
{"Treynor Ratio", "-1.174"},
{"Total Fees", "$14.78"},
{"Estimated Strategy Capacity", "$47000000.00"},
{"Estimated Strategy Capacity", "$120000000.00"},
{"Lowest Capacity Asset", "IBM R735QTJ8XC9X"},
{"Fitness Score", "0.408"},
{"Kelly Criterion Estimate", "16.559"},
{"Kelly Criterion Probability Value", "0.316"},
{"Sortino Ratio", "12.447"},
{"Return Over Maximum Drawdown", "106.327"},
{"Portfolio Turnover", "0.411"},
{"Total Insights Generated", "3"},
{"Total Insights Closed", "3"},
{"Total Insights Analysis Completed", "3"},
{"Long Insight Count", "0"},
{"Short Insight Count", "3"},
{"Long/Short Ratio", "0%"},
{"Estimated Monthly Alpha Value", "$20784418.6104"},
{"Total Accumulated Estimated Alpha Value", "$3579538.7607"},
{"Mean Population Estimated Insight Value", "$1193179.5869"},
{"Mean Population Direction", "100%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "100%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "9da9afe1e9137638a55db1676adc2be1"}
{"Portfolio Turnover", "41.18%"},
{"OrderListHash", "713c956deb193bed2290e9f379c0f9f9"}
};
}
}

View File

@@ -40,8 +40,8 @@ namespace QuantConnect.Algorithm.CSharp
var aapl = QuantConnect.Symbol.Create("AAPL", SecurityType.Equity, Market.USA);
_contract = OptionChainProvider.GetOptionContractList(aapl, Time)
.OrderBy(symbol => symbol.ID.Symbol)
_contract = OptionChain(aapl)
.OrderBy(x => x.ID.Symbol)
.FirstOrDefault(optionContract => optionContract.ID.OptionRight == OptionRight.Call
&& optionContract.ID.OptionStyle == OptionStyle.American);
AddOptionContract(_contract);
@@ -59,7 +59,7 @@ namespace QuantConnect.Algorithm.CSharp
}
else
{
throw new Exception("Expect a single call to OnData where we removed the option and underlying");
throw new RegressionTestException("Expect a single call to OnData where we removed the option and underlying");
}
}
}
@@ -68,7 +68,7 @@ namespace QuantConnect.Algorithm.CSharp
{
if (!_hasRemoved)
{
throw new Exception("Expect a single call to OnData where we removed the option and underlying");
throw new RegressionTestException("Expect a single call to OnData where we removed the option and underlying");
}
}
@@ -80,7 +80,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
public List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -90,21 +90,29 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
public int AlgorithmHistoryDataPoints => 1;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "0"},
{"Total Orders", "0"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "100000"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
@@ -119,25 +127,7 @@ namespace QuantConnect.Algorithm.CSharp
{"Total Fees", "$0.00"},
{"Estimated Strategy Capacity", "$0"},
{"Lowest Capacity Asset", ""},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "79228162514264337593543950335"},
{"Portfolio Turnover", "0"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"Portfolio Turnover", "0%"},
{"OrderListHash", "d41d8cd98f00b204e9800998ecf8427e"}
};
}

View File

@@ -39,8 +39,8 @@ namespace QuantConnect.Algorithm.CSharp
var aapl = AddEquity("AAPL").Symbol;
_contract = OptionChainProvider.GetOptionContractList(aapl, Time)
.OrderBy(symbol => symbol.ID.Symbol)
_contract = OptionChain(aapl)
.OrderBy(x => x.ID.Symbol)
.FirstOrDefault(optionContract => optionContract.ID.OptionRight == OptionRight.Call
&& optionContract.ID.OptionStyle == OptionStyle.American);
}
@@ -49,7 +49,7 @@ namespace QuantConnect.Algorithm.CSharp
{
if (_hasRemoved)
{
throw new Exception("Expect a single call to OnData where we removed the option and underlying");
throw new RegressionTestException("Expect a single call to OnData where we removed the option and underlying");
}
_hasRemoved = true;
@@ -65,7 +65,7 @@ namespace QuantConnect.Algorithm.CSharp
{
if (!_hasRemoved)
{
throw new Exception("We did not remove the option contract!");
throw new RegressionTestException("We did not remove the option contract!");
}
}
@@ -77,7 +77,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
public List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -87,21 +87,29 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
public int AlgorithmHistoryDataPoints => 1;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "0"},
{"Total Orders", "0"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "100000"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
@@ -116,25 +124,7 @@ namespace QuantConnect.Algorithm.CSharp
{"Total Fees", "$0.00"},
{"Estimated Strategy Capacity", "$0"},
{"Lowest Capacity Asset", ""},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "79228162514264337593543950335"},
{"Portfolio Turnover", "0"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"Portfolio Turnover", "0%"},
{"OrderListHash", "d41d8cd98f00b204e9800998ecf8427e"}
};
}

View File

@@ -47,15 +47,15 @@ namespace QuantConnect.Algorithm.CSharp
if (!_beta.IsReady)
{
throw new Exception("_beta indicator was expected to be ready");
throw new RegressionTestException("_beta indicator was expected to be ready");
}
}
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
if (!Portfolio.Invested)
{
var price = data["IBM"].Close;
var price = slice["IBM"].Close;
Buy("IBM", 10);
LimitOrder("IBM", 10, price * 0.1m);
StopMarketOrder("IBM", 10, price / 0.1m);
@@ -63,7 +63,7 @@ namespace QuantConnect.Algorithm.CSharp
if (_beta.Current.Value < 0m || _beta.Current.Value > 2.80m)
{
throw new Exception($"_beta value was expected to be between 0 and 2.80 but was {_beta.Current.Value}");
throw new RegressionTestException($"_beta value was expected to be between 0 and 2.80 but was {_beta.Current.Value}");
}
Log($"Beta between IBM and SPY is: {_beta.Current.Value}");
@@ -97,7 +97,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public virtual Language[] Languages { get; } = { Language.CSharp};
public virtual List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -109,53 +109,43 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public int AlgorithmHistoryDataPoints => 11;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "1"},
{"Total Orders", "3"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "12.939%"},
{"Drawdown", "0.300%"},
{"Expectancy", "0"},
{"Start Equity", "10000"},
{"End Equity", "10028.93"},
{"Net Profit", "0.289%"},
{"Sharpe Ratio", "4.233"},
{"Sharpe Ratio", "3.924"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "68.349%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "0.035"},
{"Alpha", "0.028"},
{"Beta", "0.122"},
{"Annual Standard Deviation", "0.024"},
{"Annual Variance", "0.001"},
{"Information Ratio", "-3.181"},
{"Tracking Error", "0.142"},
{"Treynor Ratio", "0.842"},
{"Treynor Ratio", "0.78"},
{"Total Fees", "$1.00"},
{"Estimated Strategy Capacity", "$35000000.00"},
{"Lowest Capacity Asset", "IBM R735QTJ8XC9X"},
{"Fitness Score", "0.022"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "8.508"},
{"Return Over Maximum Drawdown", "58.894"},
{"Portfolio Turnover", "0.022"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "bd88c6a0e10c7e146b05377205101a12"}
{"Portfolio Turnover", "1.51%"},
{"OrderListHash", "1db1ce949db995bba20ed96ea5e2438a"}
};
}
}

View File

@@ -31,7 +31,6 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public class AddFutureContractWithContinuousRegressionAlgorithm : QCAlgorithm, IRegressionAlgorithmDefinition
{
private Symbol _currentMappedSymbol;
private Future _continuousContract;
private Future _futureContract;
private bool _ended;
@@ -56,20 +55,20 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice data)
/// <param name="slice">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice slice)
{
if (_ended)
{
throw new Exception($"Algorithm should of ended!");
throw new RegressionTestException($"Algorithm should of ended!");
}
if (data.Keys.Count > 2)
if (slice.Keys.Count > 2)
{
throw new Exception($"Getting data for more than 2 symbols! {string.Join(",", data.Keys.Select(symbol => symbol))}");
throw new RegressionTestException($"Getting data for more than 2 symbols! {string.Join(",", slice.Keys.Select(symbol => symbol))}");
}
if (UniverseManager.Count != 3)
{
throw new Exception($"Expecting 3 universes (chain, continuous and user defined) but have {UniverseManager.Count}");
throw new RegressionTestException($"Expecting 3 universes (chain, continuous and user defined) but have {UniverseManager.Count}");
}
if (!Portfolio.Invested)
@@ -99,7 +98,7 @@ namespace QuantConnect.Algorithm.CSharp
if (changes.AddedSecurities.Any(security => security.Symbol != _continuousContract.Symbol && security.Symbol != _futureContract.Symbol)
|| changes.RemovedSecurities.Any(security => security.Symbol != _continuousContract.Symbol && security.Symbol != _futureContract.Symbol))
{
throw new Exception($"We got an unexpected security changes {changes}");
throw new RegressionTestException($"We got an unexpected security changes {changes}");
}
}
@@ -111,65 +110,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
public List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 63;
public long DataPoints => 73;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "3"},
{"Total Orders", "3"},
{"Average Win", "0%"},
{"Average Loss", "-0.03%"},
{"Compounding Annual Return", "-2.594%"},
{"Drawdown", "0.000%"},
{"Expectancy", "-1"},
{"Start Equity", "100000"},
{"End Equity", "99966.4"},
{"Net Profit", "-0.034%"},
{"Sharpe Ratio", "-7.854"},
{"Sharpe Ratio", "-10.666"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "1.216%"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "-0.022"},
{"Alpha", "-0.029"},
{"Beta", "0.004"},
{"Annual Standard Deviation", "0.003"},
{"Annual Variance", "0"},
{"Information Ratio", "-0.768"},
{"Tracking Error", "0.241"},
{"Treynor Ratio", "-4.689"},
{"Treynor Ratio", "-6.368"},
{"Total Fees", "$8.60"},
{"Estimated Strategy Capacity", "$5500000.00"},
{"Lowest Capacity Asset", "ES VMKLFZIH2MTD"},
{"Fitness Score", "0.417"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "-81.518"},
{"Portfolio Turnover", "0.834"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "802a335b5c355e83b8cd2174f053c1b9"}
{"Portfolio Turnover", "66.80%"},
{"OrderListHash", "579e2e83dd7e5e7648c47e9eff132460"}
};
}
}

View File

@@ -66,9 +66,9 @@ namespace QuantConnect.Algorithm.CSharp
}
}
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
if (!data.HasData)
if (!slice.HasData)
{
return;
}
@@ -76,7 +76,7 @@ namespace QuantConnect.Algorithm.CSharp
_onDataReached = true;
var hasOptionQuoteBars = false;
foreach (var qb in data.QuoteBars.Values)
foreach (var qb in slice.QuoteBars.Values)
{
if (qb.Symbol.SecurityType != SecurityType.FutureOption)
{
@@ -99,7 +99,7 @@ namespace QuantConnect.Algorithm.CSharp
return;
}
if (data.ContainsKey(_es20h20) && data.ContainsKey(_es19m20))
if (slice.ContainsKey(_es20h20) && slice.ContainsKey(_es19m20))
{
SetHoldings(_es20h20, 0.2);
SetHoldings(_es19m20, 0.2);
@@ -114,7 +114,7 @@ namespace QuantConnect.Algorithm.CSharp
if (!_onDataReached)
{
throw new Exception("OnData() was never called.");
throw new RegressionTestException("OnData() was never called.");
}
if (_symbolsReceived.Count != _expectedSymbolsReceived.Count)
{
@@ -132,7 +132,7 @@ namespace QuantConnect.Algorithm.CSharp
if (missingSymbols.Count > 0)
{
throw new Exception($"Symbols: \"{string.Join(", ", missingSymbols)}\" were not found in OnData");
throw new RegressionTestException($"Symbols: \"{string.Join(", ", missingSymbols)}\" were not found in OnData");
}
foreach (var expectedSymbol in _expectedSymbolsReceived)
@@ -146,7 +146,7 @@ namespace QuantConnect.Algorithm.CSharp
if (nonDupeDataCount < 1000)
{
throw new Exception($"Received too few data points. Expected >=1000, found {nonDupeDataCount} for {expectedSymbol}");
throw new RegressionTestException($"Received too few data points. Expected >=1000, found {nonDupeDataCount} for {expectedSymbol}");
}
}
}
@@ -159,7 +159,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -171,53 +171,43 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2"},
{"Total Orders", "2"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "5512.811%"},
{"Drawdown", "1.000%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "105332.8"},
{"Net Profit", "5.333%"},
{"Sharpe Ratio", "64.137"},
{"Sharpe Ratio", "64.084"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "95.977%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "25.72"},
{"Alpha", "25.763"},
{"Beta", "2.914"},
{"Annual Standard Deviation", "0.423"},
{"Annual Variance", "0.179"},
{"Information Ratio", "66.11"},
{"Tracking Error", "0.403"},
{"Treynor Ratio", "9.315"},
{"Treynor Ratio", "9.308"},
{"Total Fees", "$8.60"},
{"Estimated Strategy Capacity", "$22000000.00"},
{"Lowest Capacity Asset", "ES XFH59UK0MYO1"},
{"Fitness Score", "1"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "79228162514264337593543950335"},
{"Portfolio Turnover", "2.035"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "e7021bd385f366771ae00abd3a46a22e"}
{"Portfolio Turnover", "122.11%"},
{"OrderListHash", "d744fa8beaa60546c84924ed68d945d9"}
};
}
}

View File

@@ -40,16 +40,16 @@ namespace QuantConnect.Algorithm.CSharp
});
}
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
if (!_addedOptions)
{
_addedOptions = true;
foreach (var futuresContracts in data.FutureChains.Values)
foreach (var futuresContracts in slice.FutureChains.Values)
{
foreach (var contract in futuresContracts)
{
var option_contract_symbols = OptionChainProvider.GetOptionContractList(contract.Symbol, Time).ToList();
var option_contract_symbols = OptionChain(contract.Symbol).ToList();
if(option_contract_symbols.Count == 0)
{
continue;
@@ -70,7 +70,7 @@ namespace QuantConnect.Algorithm.CSharp
return;
}
foreach (var chain in data.OptionChains.Values)
foreach (var chain in slice.OptionChains.Values)
{
foreach (var option in chain.Contracts.Keys)
{
@@ -88,36 +88,44 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
public List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 12164;
public long DataPoints => 12169;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "20"},
{"Total Orders", "20"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "386219349.202%"},
{"Drawdown", "5.200%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "111911.55"},
{"Net Profit", "11.912%"},
{"Sharpe Ratio", "1604181.92"},
{"Sharpe Ratio", "1604181.904"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "2144881.34"},
{"Alpha", "2144882.02"},
{"Beta", "31.223"},
{"Annual Standard Deviation", "1.337"},
{"Annual Variance", "1.788"},
@@ -127,26 +135,8 @@ namespace QuantConnect.Algorithm.CSharp
{"Total Fees", "$35.70"},
{"Estimated Strategy Capacity", "$2600000.00"},
{"Lowest Capacity Asset", "ES 31C3JQS9D84PW|ES XCZJLC9NOB29"},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "79228162514264337593543950335"},
{"Portfolio Turnover", "0"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "64221a660525c4259d5bd852eef1299c"}
{"Portfolio Turnover", "495.15%"},
{"OrderListHash", "85257286f088992d599c1ad0799a6237"}
};
}
}

View File

@@ -55,10 +55,10 @@ namespace QuantConnect.Algorithm.CSharp
{
_optionFilterRan = true;
var expiry = new HashSet<DateTime>(optionContracts.Select(x => x.Underlying.ID.Date)).SingleOrDefault();
// Cast to IEnumerable<Symbol> because OptionFilterContract overrides some LINQ operators like `Select` and `Where`
var expiry = new HashSet<DateTime>(optionContracts.Select(x => x.Symbol.Underlying.ID.Date)).SingleOrDefault();
// Cast to List<Symbol> because OptionFilterContract overrides some LINQ operators like `Select` and `Where`
// and cause it to mutate the underlying Symbol collection when using those operators.
var symbol = new HashSet<Symbol>(((IEnumerable<Symbol>)optionContracts).Select(x => x.Underlying)).SingleOrDefault();
var symbol = new HashSet<Symbol>(((List<Symbol>)optionContracts).Select(x => x.Underlying)).SingleOrDefault();
if (expiry == null || symbol == null)
{
@@ -75,9 +75,9 @@ namespace QuantConnect.Algorithm.CSharp
});
}
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
if (!data.HasData)
if (!slice.HasData)
{
return;
}
@@ -85,7 +85,7 @@ namespace QuantConnect.Algorithm.CSharp
_onDataReached = true;
var hasOptionQuoteBars = false;
foreach (var qb in data.QuoteBars.Values)
foreach (var qb in slice.QuoteBars.Values)
{
if (qb.Symbol.SecurityType != SecurityType.FutureOption)
{
@@ -108,7 +108,7 @@ namespace QuantConnect.Algorithm.CSharp
return;
}
foreach (var chain in data.OptionChains.Values)
foreach (var chain in slice.OptionChains.Values)
{
var futureInvested = false;
var optionInvested = false;
@@ -122,7 +122,7 @@ namespace QuantConnect.Algorithm.CSharp
var future = option.Underlying;
if (!optionInvested && data.ContainsKey(option))
if (!optionInvested && slice.ContainsKey(option))
{
var optionContract = Securities[option];
var marginModel = optionContract.BuyingPowerModel as FuturesOptionsMarginModel;
@@ -131,16 +131,16 @@ namespace QuantConnect.Algorithm.CSharp
|| marginModel.MaintenanceIntradayMarginRequirement == 0
|| marginModel.MaintenanceOvernightMarginRequirement == 0)
{
throw new Exception("Unexpected margin requirements");
throw new RegressionTestException("Unexpected margin requirements");
}
if (marginModel.GetInitialMarginRequirement(optionContract, 1) == 0)
{
throw new Exception("Unexpected Initial Margin requirement");
throw new RegressionTestException("Unexpected Initial Margin requirement");
}
if (marginModel.GetMaintenanceMargin(optionContract) != 0)
{
throw new Exception("Unexpected Maintenance Margin requirement");
throw new RegressionTestException("Unexpected Maintenance Margin requirement");
}
MarketOrder(option, 1);
@@ -149,10 +149,10 @@ namespace QuantConnect.Algorithm.CSharp
if (marginModel.GetMaintenanceMargin(optionContract) == 0)
{
throw new Exception("Unexpected Maintenance Margin requirement");
throw new RegressionTestException("Unexpected Maintenance Margin requirement");
}
}
if (!futureInvested && data.ContainsKey(future))
if (!futureInvested && slice.ContainsKey(future))
{
MarketOrder(future, 1);
_invested = true;
@@ -170,7 +170,7 @@ namespace QuantConnect.Algorithm.CSharp
}
if (!_onDataReached)
{
throw new Exception("OnData() was never called.");
throw new RegressionTestException("OnData() was never called.");
}
if (_symbolsReceived.Count != _expectedSymbolsReceived.Count)
{
@@ -188,7 +188,7 @@ namespace QuantConnect.Algorithm.CSharp
if (missingSymbols.Count > 0)
{
throw new Exception($"Symbols: \"{string.Join(", ", missingSymbols)}\" were not found in OnData");
throw new RegressionTestException($"Symbols: \"{string.Join(", ", missingSymbols)}\" were not found in OnData");
}
foreach (var expectedSymbol in _expectedSymbolsReceived)
@@ -202,7 +202,7 @@ namespace QuantConnect.Algorithm.CSharp
if (nonDupeDataCount < 1000)
{
throw new Exception($"Received too few data points. Expected >=1000, found {nonDupeDataCount} for {expectedSymbol}");
throw new RegressionTestException($"Received too few data points. Expected >=1000, found {nonDupeDataCount} for {expectedSymbol}");
}
}
}
@@ -215,65 +215,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 612882;
public long DataPoints => 608377;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2"},
{"Total Orders", "2"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "347.065%"},
{"Drawdown", "0.900%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "101950.53"},
{"Net Profit", "1.951%"},
{"Sharpe Ratio", "15.548"},
{"Sharpe Ratio", "15.402"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "95.977%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "1.885"},
{"Alpha", "1.886"},
{"Beta", "1.066"},
{"Annual Standard Deviation", "0.155"},
{"Annual Variance", "0.024"},
{"Information Ratio", "13.528"},
{"Tracking Error", "0.142"},
{"Treynor Ratio", "2.258"},
{"Treynor Ratio", "2.237"},
{"Total Fees", "$3.57"},
{"Estimated Strategy Capacity", "$760000.00"},
{"Lowest Capacity Asset", "ES XCZJLDQX2SRO|ES XCZJLC9NOB29"},
{"Fitness Score", "0.403"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "79228162514264337593543950335"},
{"Portfolio Turnover", "0.403"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "738240babf741f1bf79f85ea5026ec4c"}
{"Portfolio Turnover", "32.31%"},
{"OrderListHash", "7a04f66a30d793bf187c2695781ad3ee"}
};
}
}

View File

@@ -42,12 +42,12 @@ namespace QuantConnect.Algorithm.CSharp
AddUniverse("my-daily-universe-name", time => new List<string> { "AAPL" });
}
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
if (_option == null)
{
var option = OptionChainProvider.GetOptionContractList(_twx, Time)
.OrderBy(symbol => symbol.ID.Symbol)
var option = OptionChain(_twx)
.OrderBy(x => x.ID.Symbol)
.FirstOrDefault(optionContract => optionContract.ID.Date == _expiration
&& optionContract.ID.OptionRight == OptionRight.Call
&& optionContract.ID.OptionStyle == OptionStyle.American);
@@ -68,11 +68,11 @@ namespace QuantConnect.Algorithm.CSharp
if (!config.Any())
{
throw new Exception($"Was expecting configurations for {symbol}");
throw new RegressionTestException($"Was expecting configurations for {symbol}");
}
if (config.Any(dataConfig => dataConfig.DataNormalizationMode != DataNormalizationMode.Raw))
{
throw new Exception($"Was expecting DataNormalizationMode.Raw configurations for {symbol}");
throw new RegressionTestException($"Was expecting DataNormalizationMode.Raw configurations for {symbol}");
}
}
}
@@ -81,14 +81,14 @@ namespace QuantConnect.Algorithm.CSharp
{
if (SubscriptionManager.SubscriptionDataConfigService.GetSubscriptionDataConfigs(_option).Any())
{
throw new Exception($"Unexpected configurations for {_option} after it has been delisted");
throw new RegressionTestException($"Unexpected configurations for {_option} after it has been delisted");
}
if (Securities[_twx].Invested)
{
if (!SubscriptionManager.SubscriptionDataConfigService.GetSubscriptionDataConfigs(_twx).Any())
{
throw new Exception($"Was expecting configurations for {_twx}");
throw new RegressionTestException($"Was expecting configurations for {_twx}");
}
// first we liquidate the option exercised position
@@ -99,7 +99,7 @@ namespace QuantConnect.Algorithm.CSharp
{
if (SubscriptionManager.SubscriptionDataConfigService.GetSubscriptionDataConfigs(_twx).Any())
{
throw new Exception($"Unexpected configurations for {_twx} after it has been liquidated");
throw new RegressionTestException($"Unexpected configurations for {_twx} after it has been liquidated");
}
}
}
@@ -112,7 +112,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -122,55 +122,45 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
public int AlgorithmHistoryDataPoints => 1;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "3"},
{"Total Orders", "3"},
{"Average Win", "2.73%"},
{"Average Loss", "-2.98%"},
{"Compounding Annual Return", "-4.619%"},
{"Drawdown", "0.300%"},
{"Expectancy", "-0.042"},
{"Start Equity", "100000"},
{"End Equity", "99668"},
{"Net Profit", "-0.332%"},
{"Sharpe Ratio", "-3.149"},
{"Sharpe Ratio", "-4.614"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0.427%"},
{"Loss Rate", "50%"},
{"Win Rate", "50%"},
{"Profit-Loss Ratio", "0.92"},
{"Alpha", "-0.015"},
{"Alpha", "-0.022"},
{"Beta", "-0.012"},
{"Annual Standard Deviation", "0.005"},
{"Annual Variance", "0"},
{"Information Ratio", "-2.823"},
{"Tracking Error", "0.049"},
{"Treynor Ratio", "1.372"},
{"Treynor Ratio", "2.01"},
{"Total Fees", "$2.00"},
{"Estimated Strategy Capacity", "$67000000.00"},
{"Estimated Strategy Capacity", "$5700000.00"},
{"Lowest Capacity Asset", "AOL VRKS95ENLBYE|AOL R735QTJ8XC9X"},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "-43.418"},
{"Return Over Maximum Drawdown", "-14.274"},
{"Portfolio Turnover", "0.007"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "568fe7c2a11960436660db1231f2cfd2"}
{"Portfolio Turnover", "0.55%"},
{"OrderListHash", "24191a4a3bf11c07622a21266618193d"}
};
}
}

View File

@@ -13,12 +13,12 @@
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using QuantConnect.Data;
using QuantConnect.Data.UniverseSelection;
using QuantConnect.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
namespace QuantConnect.Algorithm.CSharp
{
@@ -50,7 +50,7 @@ namespace QuantConnect.Algorithm.CSharp
enumerable => new[] { Time.Date <= new DateTime(2014, 6, 5) ? _twx : _aapl });
}
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
if (_option != null && Securities[_option].Price != 0 && !_traded)
{
@@ -66,7 +66,7 @@ namespace QuantConnect.Algorithm.CSharp
// assert underlying still there after the universe selection removed it, still used by the manually added option contract
if (!configs.Any())
{
throw new Exception($"Was expecting configurations for {_twx}" +
throw new RegressionTestException($"Was expecting configurations for {_twx}" +
$" even after it has been deselected from coarse universe because we still have the option contract.");
}
}
@@ -83,7 +83,7 @@ namespace QuantConnect.Algorithm.CSharp
var configs = SubscriptionManager.SubscriptionDataConfigService.GetSubscriptionDataConfigs(symbol);
if (configs.Any())
{
throw new Exception($"Unexpected configuration for {symbol} after it has been deselected from coarse universe and option contract is removed.");
throw new RegressionTestException($"Unexpected configuration for {symbol} after it has been deselected from coarse universe and option contract is removed.");
}
}
}
@@ -94,11 +94,11 @@ namespace QuantConnect.Algorithm.CSharp
{
if (_securityChanges.RemovedSecurities.Intersect(changes.RemovedSecurities).Any())
{
throw new Exception($"SecurityChanges.RemovedSecurities intersect {changes.RemovedSecurities}. We expect no duplicate!");
throw new RegressionTestException($"SecurityChanges.RemovedSecurities intersect {changes.RemovedSecurities}. We expect no duplicate!");
}
if (_securityChanges.AddedSecurities.Intersect(changes.AddedSecurities).Any())
{
throw new Exception($"SecurityChanges.AddedSecurities intersect {changes.RemovedSecurities}. We expect no duplicate!");
throw new RegressionTestException($"SecurityChanges.AddedSecurities intersect {changes.RemovedSecurities}. We expect no duplicate!");
}
// keep track of all removed and added securities
_securityChanges += changes;
@@ -110,24 +110,24 @@ namespace QuantConnect.Algorithm.CSharp
foreach (var addedSecurity in changes.AddedSecurities)
{
var option = OptionChainProvider.GetOptionContractList(addedSecurity.Symbol, Time)
.OrderBy(symbol => symbol.ID.Symbol)
var option = OptionChain(addedSecurity.Symbol)
.OrderBy(contractData => contractData.ID.Symbol)
.First(optionContract => optionContract.ID.Date == _expiration
&& optionContract.ID.OptionRight == OptionRight.Call
&& optionContract.ID.OptionStyle == OptionStyle.American);
AddOptionContract(option);
foreach (var symbol in new[] { option, option.Underlying })
foreach (var symbol in new[] { option.Symbol, option.Underlying.Symbol })
{
var config = SubscriptionManager.SubscriptionDataConfigService.GetSubscriptionDataConfigs(symbol).ToList();
if (!config.Any())
{
throw new Exception($"Was expecting configurations for {symbol}");
throw new RegressionTestException($"Was expecting configurations for {symbol}");
}
if (config.Any(dataConfig => dataConfig.DataNormalizationMode != DataNormalizationMode.Raw))
{
throw new Exception($"Was expecting DataNormalizationMode.Raw configurations for {symbol}");
throw new RegressionTestException($"Was expecting DataNormalizationMode.Raw configurations for {symbol}");
}
}
@@ -143,16 +143,16 @@ namespace QuantConnect.Algorithm.CSharp
{
if (SubscriptionManager.Subscriptions.Any(dataConfig => dataConfig.Symbol == _twx || dataConfig.Symbol.Underlying == _twx))
{
throw new Exception($"Was NOT expecting any configurations for {_twx} or it's options, since we removed the contract");
throw new RegressionTestException($"Was NOT expecting any configurations for {_twx} or it's options, since we removed the contract");
}
if (SubscriptionManager.Subscriptions.All(dataConfig => dataConfig.Symbol != _aapl))
{
throw new Exception($"Was expecting configurations for {_aapl}");
throw new RegressionTestException($"Was expecting configurations for {_aapl}");
}
if (SubscriptionManager.Subscriptions.All(dataConfig => dataConfig.Symbol.Underlying != _aapl))
{
throw new Exception($"Was expecting options configurations for {_aapl}");
throw new RegressionTestException($"Was expecting options configurations for {_aapl}");
}
}
@@ -164,65 +164,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 5797;
public long DataPoints => 5798;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
public int AlgorithmHistoryDataPoints => 2;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2"},
{"Total Orders", "2"},
{"Average Win", "0%"},
{"Average Loss", "-0.23%"},
{"Compounding Annual Return", "-15.596%"},
{"Drawdown", "0.200%"},
{"Expectancy", "-1"},
{"Start Equity", "100000"},
{"End Equity", "99768"},
{"Net Profit", "-0.232%"},
{"Sharpe Ratio", "-7.739"},
{"Sharpe Ratio", "-8.903"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "1.216%"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "0.024"},
{"Alpha", "0.015"},
{"Beta", "-0.171"},
{"Annual Standard Deviation", "0.006"},
{"Annual Variance", "0"},
{"Information Ratio", "-11.082"},
{"Tracking Error", "0.043"},
{"Treynor Ratio", "0.291"},
{"Treynor Ratio", "0.335"},
{"Total Fees", "$2.00"},
{"Estimated Strategy Capacity", "$2800000.00"},
{"Lowest Capacity Asset", "AOL VRKS95ENLBYE|AOL R735QTJ8XC9X"},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "-19.883"},
{"Return Over Maximum Drawdown", "-67.224"},
{"Portfolio Turnover", "0.014"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "ae0b430e9c728966e3736fb352a689c6"}
{"Portfolio Turnover", "1.14%"},
{"OrderListHash", "cde7b518b7ad6d86cff6e5e092d9a413"}
};
}
}

View File

@@ -39,12 +39,12 @@ namespace QuantConnect.Algorithm.CSharp
UniverseSettings.MinimumTimeInUniverse = TimeSpan.Zero;
UniverseSettings.FillForward = false;
AddEquity("SPY", Resolution.Daily);
AddEquity("SPY", Resolution.Hour);
var aapl = QuantConnect.Symbol.Create("AAPL", SecurityType.Equity, Market.USA);
_contract = OptionChainProvider.GetOptionContractList(aapl, Time)
.OrderBy(symbol => symbol.ID.Symbol)
_contract = OptionChain(aapl)
.OrderBy(x => x.ID.StrikePrice)
.FirstOrDefault(optionContract => optionContract.ID.OptionRight == OptionRight.Call
&& optionContract.ID.OptionStyle == OptionStyle.American);
AddOptionContract(_contract);
@@ -56,7 +56,7 @@ namespace QuantConnect.Algorithm.CSharp
{
if (!_reAdded && slice.ContainsKey(_contract) && slice.ContainsKey(_contract.Underlying))
{
throw new Exception("Getting data for removed option and underlying!");
throw new RegressionTestException("Getting data for removed option and underlying!");
}
if (!Portfolio.Invested && _reAdded)
@@ -95,11 +95,11 @@ namespace QuantConnect.Algorithm.CSharp
{
if (!_hasRemoved)
{
throw new Exception("We did not remove the option contract!");
throw new RegressionTestException("We did not remove the option contract!");
}
if (!_reAdded)
{
throw new Exception("We did not re add the option contract!");
throw new RegressionTestException("We did not re add the option contract!");
}
}
@@ -111,31 +111,39 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
public List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 4677;
public long DataPoints => 3814;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
public int AlgorithmHistoryDataPoints => 1;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2"},
{"Total Orders", "2"},
{"Average Win", "0%"},
{"Average Loss", "-0.05%"},
{"Compounding Annual Return", "-4.548%"},
{"Drawdown", "0.100%"},
{"Average Loss", "-0.50%"},
{"Compounding Annual Return", "-39.406%"},
{"Drawdown", "0.700%"},
{"Expectancy", "-1"},
{"Net Profit", "-0.051%"},
{"Start Equity", "100000"},
{"End Equity", "99498"},
{"Net Profit", "-0.502%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
@@ -148,28 +156,10 @@ namespace QuantConnect.Algorithm.CSharp
{"Tracking Error", "0.008"},
{"Treynor Ratio", "0"},
{"Total Fees", "$2.00"},
{"Estimated Strategy Capacity", "$30000.00"},
{"Lowest Capacity Asset", "AAPL VXBK4Q9ZIFD2|AAPL R735QTJ8XC9X"},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "-89.181"},
{"Portfolio Turnover", "0"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "546b6182e1df2d222178454d8f311566"}
{"Estimated Strategy Capacity", "$5000000.00"},
{"Lowest Capacity Asset", "AAPL VXBK4R62CXGM|AAPL R735QTJ8XC9X"},
{"Portfolio Turnover", "22.70%"},
{"OrderListHash", "29fd1b75f6db05dd823a6db7e8bd90a9"}
};
}
}

View File

@@ -13,7 +13,6 @@
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using QuantConnect.Data.UniverseSelection;
@@ -59,19 +58,9 @@ namespace QuantConnect.Algorithm.CSharp
var changeOptions = changes.AddedSecurities.Concat(changes.RemovedSecurities)
.Where(s => s.Type == SecurityType.Option);
// Susbtract one minute to get the actual market open. If market open is at 9:30am, this will be invoked at 9:31am
var expectedTime = Time.TimeOfDay - TimeSpan.FromMinutes(1);
var allOptionsWereChangedOnMarketOpen = changeOptions.All(s =>
if (Time != Time.Date)
{
var firstMarketSegment = s.Exchange.Hours.MarketHours[Time.DayOfWeek].Segments
.First(segment => segment.State == MarketHoursState.Market);
return firstMarketSegment.Start == expectedTime;
});
if (!allOptionsWereChangedOnMarketOpen)
{
throw new Exception("Expected options filter to be run only on market open");
throw new RegressionTestException($"Expected options filter to be run only at midnight. Actual was {Time}");
}
}
@@ -83,31 +72,39 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
public List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all time slices of algorithm
/// </summary>
public long DataPoints => 6023980;
public long DataPoints => 470217;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "0"},
{"Total Orders", "0"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "100000"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
@@ -122,25 +119,7 @@ namespace QuantConnect.Algorithm.CSharp
{"Total Fees", "$0.00"},
{"Estimated Strategy Capacity", "$0"},
{"Lowest Capacity Asset", ""},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "79228162514264337593543950335"},
{"Portfolio Turnover", "0"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"Portfolio Turnover", "0%"},
{"OrderListHash", "d41d8cd98f00b204e9800998ecf8427e"}
};
}

View File

@@ -29,20 +29,21 @@ namespace QuantConnect.Algorithm.CSharp
public class AddRemoveOptionUniverseRegressionAlgorithm : QCAlgorithm, IRegressionAlgorithmDefinition
{
private const string UnderlyingTicker = "GOOG";
public readonly Symbol Underlying = QuantConnect.Symbol.Create(UnderlyingTicker, SecurityType.Equity, Market.USA);
public readonly Symbol OptionChainSymbol = QuantConnect.Symbol.Create(UnderlyingTicker, SecurityType.Option, Market.USA);
private readonly Symbol Underlying = QuantConnect.Symbol.Create(UnderlyingTicker, SecurityType.Equity, Market.USA);
private readonly Symbol OptionChainSymbol = QuantConnect.Symbol.Create(UnderlyingTicker, SecurityType.Option, Market.USA);
private readonly HashSet<Symbol> _expectedSecurities = new HashSet<Symbol>();
private readonly HashSet<Symbol> _expectedData = new HashSet<Symbol>();
private readonly HashSet<Symbol> _expectedUniverses = new HashSet<Symbol>();
private bool _expectUniverseSubscription;
private DateTime _universeSubscriptionTime;
// order of expected contract additions as price moves
private int _expectedContractIndex;
private readonly List<Symbol> _expectedContracts = new List<Symbol>
{
SymbolRepresentation.ParseOptionTickerOSI("GOOG 151224P00747500"),
SymbolRepresentation.ParseOptionTickerOSI("GOOG 151224P00750000"),
SymbolRepresentation.ParseOptionTickerOSI("GOOG 151224P00752500")
SymbolRepresentation.ParseOptionTickerOSI("GOOG 151224P00752500"),
SymbolRepresentation.ParseOptionTickerOSI("GOOG 151224P00755000")
};
public override void Initialize()
@@ -59,16 +60,16 @@ namespace QuantConnect.Algorithm.CSharp
_expectedUniverses.Add(UserDefinedUniverse.CreateSymbol(SecurityType.Equity, Market.USA));
}
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
// verify expectations
if (SubscriptionManager.Subscriptions.Count(x => x.Symbol == OptionChainSymbol)
!= (_expectUniverseSubscription ? 1 : 0))
{
Log($"SubscriptionManager.Subscriptions: {string.Join(" -- ", SubscriptionManager.Subscriptions)}");
throw new Exception($"Unexpected {OptionChainSymbol} subscription presence");
throw new RegressionTestException($"Unexpected {OptionChainSymbol} subscription presence");
}
if (!data.ContainsKey(Underlying))
if (Time != _universeSubscriptionTime && !slice.ContainsKey(Underlying))
{
// TODO : In fact, we're unable to properly detect whether or not we auto-added or it was manually added
// this is because when we auto-add the underlying we don't mark it as an internal security like we do with other auto adds
@@ -77,46 +78,46 @@ namespace QuantConnect.Algorithm.CSharp
// of the internal flag's purpose, so kicking this issue for now with a big fat note here about it :) to be considerd for any future
// refactorings of how we manage subscription/security data and track various aspects about the security (thinking a flags enum with
// things like manually added, auto added, internal, and any other boolean state we need to track against a single security)
throw new Exception("The underlying equity data should NEVER be removed in this algorithm because it was manually added");
throw new RegressionTestException("The underlying equity data should NEVER be removed in this algorithm because it was manually added");
}
if (_expectedSecurities.AreDifferent(Securities.Keys.ToHashSet()))
if (_expectedSecurities.AreDifferent(Securities.Total.Select(x => x.Symbol).ToHashSet()))
{
var expected = string.Join(Environment.NewLine, _expectedSecurities.OrderBy(s => s.ToString()));
var actual = string.Join(Environment.NewLine, Securities.Keys.OrderBy(s => s.ToString()));
throw new Exception($"{Time}:: Detected differences in expected and actual securities{Environment.NewLine}Expected:{Environment.NewLine}{expected}{Environment.NewLine}Actual:{Environment.NewLine}{actual}");
throw new RegressionTestException($"{Time}:: Detected differences in expected and actual securities{Environment.NewLine}Expected:{Environment.NewLine}{expected}{Environment.NewLine}Actual:{Environment.NewLine}{actual}");
}
if (_expectedUniverses.AreDifferent(UniverseManager.Keys.ToHashSet()))
{
var expected = string.Join(Environment.NewLine, _expectedUniverses.OrderBy(s => s.ToString()));
var actual = string.Join(Environment.NewLine, UniverseManager.Keys.OrderBy(s => s.ToString()));
throw new Exception($"{Time}:: Detected differences in expected and actual universes{Environment.NewLine}Expected:{Environment.NewLine}{expected}{Environment.NewLine}Actual:{Environment.NewLine}{actual}");
throw new RegressionTestException($"{Time}:: Detected differences in expected and actual universes{Environment.NewLine}Expected:{Environment.NewLine}{expected}{Environment.NewLine}Actual:{Environment.NewLine}{actual}");
}
if (_expectedData.AreDifferent(data.Keys.ToHashSet()))
if (Time != _universeSubscriptionTime && _expectedData.AreDifferent(slice.Keys.ToHashSet()))
{
var expected = string.Join(Environment.NewLine, _expectedData.OrderBy(s => s.ToString()));
var actual = string.Join(Environment.NewLine, data.Keys.OrderBy(s => s.ToString()));
throw new Exception($"{Time}:: Detected differences in expected and actual slice data keys{Environment.NewLine}Expected:{Environment.NewLine}{expected}{Environment.NewLine}Actual:{Environment.NewLine}{actual}");
var actual = string.Join(Environment.NewLine, slice.Keys.OrderBy(s => s.ToString()));
throw new RegressionTestException($"{Time}:: Detected differences in expected and actual slice data keys{Environment.NewLine}Expected:{Environment.NewLine}{expected}{Environment.NewLine}Actual:{Environment.NewLine}{actual}");
}
// 10AM add GOOG option chain
if (Time.TimeOfDay.Hours == 10 && Time.TimeOfDay.Minutes == 0)
if (Time.TimeOfDay.Hours == 10 && Time.TimeOfDay.Minutes == 0 && !_expectUniverseSubscription)
{
if (Securities.ContainsKey(OptionChainSymbol))
{
throw new Exception("The option chain security should not have been added yet");
throw new RegressionTestException("The option chain security should not have been added yet");
}
var googOptionChain = AddOption(UnderlyingTicker);
googOptionChain.SetFilter(u =>
{
// we added the universe at 10, the universe selection data should not be from before
if (u.Underlying.EndTime.Hour < 10)
if (u.LocalTime.Hour < 10)
{
throw new Exception($"Unexpected underlying data point {u.Underlying.EndTime} {u.Underlying}");
throw new RegressionTestException($"Unexpected selection time {u.LocalTime}");
}
// find first put above market price
return u.IncludeWeeklys()
.Strikes(+1, +1)
.Strikes(+1, +3)
.Expiration(TimeSpan.Zero, TimeSpan.FromDays(1))
.Contracts(c => c.Where(s => s.ID.OptionRight == OptionRight.Put));
});
@@ -124,6 +125,7 @@ namespace QuantConnect.Algorithm.CSharp
_expectedSecurities.Add(OptionChainSymbol);
_expectedUniverses.Add(OptionChainSymbol);
_expectUniverseSubscription = true;
_universeSubscriptionTime = Time;
}
// 11:30AM remove GOOG option chain
@@ -141,16 +143,6 @@ namespace QuantConnect.Algorithm.CSharp
public override void OnSecuritiesChanged(SecurityChanges changes)
{
if (changes.AddedSecurities.Count > 1)
{
// added event fired for underlying since it was added to the option chain universe
if (changes.AddedSecurities.All(s => s.Symbol != Underlying))
{
var securities = string.Join(Environment.NewLine, changes.AddedSecurities.Select(s => s.Symbol));
throw new Exception($"This algorithm intends to add a single security at a time but added: {changes.AddedSecurities.Count}{Environment.NewLine}{securities}");
}
}
if (changes.AddedSecurities.Any())
{
foreach (var added in changes.AddedSecurities)
@@ -161,7 +153,7 @@ namespace QuantConnect.Algorithm.CSharp
var expectedContract = _expectedContracts[_expectedContractIndex];
if (added.Symbol != expectedContract)
{
throw new Exception($"Expected option contract {expectedContract} to be added but received {added.Symbol}");
throw new RegressionTestException($"Expected option contract {expectedContract.Value} to be added but received {added.Symbol}");
}
_expectedContractIndex++;
@@ -182,7 +174,7 @@ namespace QuantConnect.Algorithm.CSharp
// receive removed event next timestep at 11:31AM
if (Time.TimeOfDay.Hours != 11 || Time.TimeOfDay.Minutes != 31)
{
throw new Exception($"Expected option contracts to be removed at 11:31AM, instead removed at: {Time}");
throw new RegressionTestException($"Expected option contracts to be removed at 11:31AM, instead removed at: {Time}");
}
if (changes.RemovedSecurities
@@ -190,13 +182,13 @@ namespace QuantConnect.Algorithm.CSharp
.ToHashSet(s => s.Symbol)
.AreDifferent(_expectedContracts.ToHashSet()))
{
throw new Exception("Expected removed securities to equal expected contracts added");
throw new RegressionTestException("Expected removed securities to equal expected contracts added");
}
}
if (Securities.ContainsKey(Underlying))
{
Console.WriteLine($"{Time:o}:: PRICE:: {Securities[Underlying].Price} CHANGES:: {changes}");
Log($"{Time:o}:: PRICE:: {Securities[Underlying].Price} CHANGES:: {changes}");
}
}
@@ -208,31 +200,39 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
public List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 200618;
public long DataPoints => 3502;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "6"},
{"Total Orders", "6"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "98784"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
@@ -245,28 +245,10 @@ namespace QuantConnect.Algorithm.CSharp
{"Tracking Error", "0"},
{"Treynor Ratio", "0"},
{"Total Fees", "$6.00"},
{"Estimated Strategy Capacity", "$2000.00"},
{"Lowest Capacity Asset", "GOOCV 305RBR0BSWIX2|GOOCV VP83T1ZUHROL"},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "0"},
{"Return Over Maximum Drawdown", "0"},
{"Portfolio Turnover", "0"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "550a99c482106defd8ba15f48183768e"}
{"Estimated Strategy Capacity", "$4000.00"},
{"Lowest Capacity Asset", "GOOCV 305RBQ2BZBZT2|GOOCV VP83T1ZUHROL"},
{"Portfolio Turnover", "2.58%"},
{"OrderListHash", "09f766c470a8bcf4bb6862da52bf25a7"}
};
}
}

View File

@@ -41,8 +41,8 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice data)
/// <param name="slice">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice slice)
{
if (!Portfolio.Invested)
{
@@ -61,7 +61,7 @@ namespace QuantConnect.Algorithm.CSharp
if (ticket.Status != OrderStatus.Invalid)
{
throw new Exception("Expected order to always be invalid because there is no data yet!");
throw new RegressionTestException("Expected order to always be invalid because there is no data yet!");
}
}
else
@@ -78,7 +78,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
public List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -90,53 +90,43 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "19"},
{"Total Orders", "19"},
{"Average Win", "0%"},
{"Average Loss", "0.00%"},
{"Compounding Annual Return", "271.720%"},
{"Drawdown", "2.500%"},
{"Expectancy", "-1"},
{"Start Equity", "100000"},
{"End Equity", "101753.84"},
{"Net Profit", "1.754%"},
{"Sharpe Ratio", "11.994"},
{"Sharpe Ratio", "11.954"},
{"Sortino Ratio", "29.606"},
{"Probabilistic Sharpe Ratio", "74.160%"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "0.618"},
{"Alpha", "0.616"},
{"Beta", "0.81"},
{"Annual Standard Deviation", "0.185"},
{"Annual Variance", "0.034"},
{"Information Ratio", "3.961"},
{"Tracking Error", "0.061"},
{"Treynor Ratio", "2.746"},
{"Treynor Ratio", "2.737"},
{"Total Fees", "$21.45"},
{"Estimated Strategy Capacity", "$830000.00"},
{"Lowest Capacity Asset", "SPY R735QTJ8XC9X"},
{"Fitness Score", "0.204"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "43.135"},
{"Return Over Maximum Drawdown", "261.238"},
{"Portfolio Turnover", "0.204"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "6ee62edf1ac883882b0fcef8cb3e9bae"}
{"Portfolio Turnover", "20.49%"},
{"OrderListHash", "6ebe462373e2ecc22de8eb2fe114d704"}
};
}
}

View File

@@ -18,6 +18,7 @@ using System.Collections.Generic;
using QuantConnect.Data.Market;
using QuantConnect.Orders;
using QuantConnect.Interfaces;
using QuantConnect.Data;
namespace QuantConnect.Algorithm.CSharp
{
@@ -51,7 +52,7 @@ namespace QuantConnect.Algorithm.CSharp
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public void OnData(TradeBars data)
public override void OnData(Slice slice)
{
if (lastAction.Date == Time.Date) return;
@@ -104,7 +105,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -116,53 +117,43 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "5"},
{"Total Orders", "5"},
{"Average Win", "0.46%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "296.356%"},
{"Drawdown", "1.400%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "101776.32"},
{"Net Profit", "1.776%"},
{"Sharpe Ratio", "13.013"},
{"Sharpe Ratio", "12.966"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "80.409%"},
{"Loss Rate", "0%"},
{"Win Rate", "100%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "0.68"},
{"Alpha", "0.678"},
{"Beta", "0.707"},
{"Annual Standard Deviation", "0.16"},
{"Annual Variance", "0.026"},
{"Information Ratio", "1.378"},
{"Tracking Error", "0.072"},
{"Treynor Ratio", "2.946"},
{"Treynor Ratio", "2.935"},
{"Total Fees", "$28.30"},
{"Estimated Strategy Capacity", "$4700000.00"},
{"Lowest Capacity Asset", "AIG R735QTJ8XC9X"},
{"Fitness Score", "0.374"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "372.086"},
{"Portfolio Turnover", "0.374"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "ac3f4dfcdeb98b488b715412ad2d6c4f"}
{"Portfolio Turnover", "29.88%"},
{"OrderListHash", "6061ecfbb89eb365dff913410d279b7c"}
};
}
}

View File

@@ -57,7 +57,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -69,53 +69,43 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "3"},
{"Total Orders", "3"},
{"Average Win", "1.02%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "296.066%"},
{"Drawdown", "2.200%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "101775.37"},
{"Net Profit", "1.775%"},
{"Sharpe Ratio", "9.373"},
{"Sharpe Ratio", "9.34"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "68.302%"},
{"Loss Rate", "0%"},
{"Win Rate", "100%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "0.105"},
{"Alpha", "0.106"},
{"Beta", "1.021"},
{"Annual Standard Deviation", "0.227"},
{"Annual Variance", "0.052"},
{"Information Ratio", "25.083"},
{"Tracking Error", "0.006"},
{"Treynor Ratio", "2.086"},
{"Treynor Ratio", "2.079"},
{"Total Fees", "$10.33"},
{"Estimated Strategy Capacity", "$38000000.00"},
{"Lowest Capacity Asset", "SPY R735QTJ8XC9X"},
{"Fitness Score", "0.747"},
{"Kelly Criterion Estimate", "38.796"},
{"Kelly Criterion Probability Value", "0.228"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "107.013"},
{"Portfolio Turnover", "0.747"},
{"Total Insights Generated", "100"},
{"Total Insights Closed", "99"},
{"Total Insights Analysis Completed", "99"},
{"Long Insight Count", "100"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$135639.1761"},
{"Total Accumulated Estimated Alpha Value", "$21852.9784"},
{"Mean Population Estimated Insight Value", "$220.7372"},
{"Mean Population Direction", "53.5354%"},
{"Mean Population Magnitude", "53.5354%"},
{"Rolling Averaged Population Direction", "58.2788%"},
{"Rolling Averaged Population Magnitude", "58.2788%"},
{"OrderListHash", "af3a9c98c190d1b6b36fad184e796b0b"}
{"Portfolio Turnover", "59.74%"},
{"OrderListHash", "5d7657ec9954875eca633bed711085d3"}
};
}
}

View File

@@ -41,8 +41,8 @@ namespace QuantConnect.Algorithm.CSharp
var aapl = QuantConnect.Symbol.Create("AAPL", SecurityType.Equity, Market.USA);
var contracts = OptionChainProvider.GetOptionContractList(aapl, Time)
.OrderBy(symbol => symbol.ID.Symbol)
var contracts = OptionChain(aapl)
.OrderBy(x => x.ID.StrikePrice)
.Where(optionContract => optionContract.ID.OptionRight == OptionRight.Call
&& optionContract.ID.OptionStyle == OptionStyle.American)
.Take(2)
@@ -69,7 +69,7 @@ namespace QuantConnect.Algorithm.CSharp
SubscriptionManager.SubscriptionDataConfigService.GetSubscriptionDataConfigs("AAPL");
if (subscriptions.Count == 0)
{
throw new Exception("No configuration for underlying was found!");
throw new RegressionTestException("No configuration for underlying was found!");
}
if (!Portfolio.Invested)
@@ -84,7 +84,7 @@ namespace QuantConnect.Algorithm.CSharp
{
if (!_hasRemoved)
{
throw new Exception("Expect a single call to OnData where we removed the option and underlying");
throw new RegressionTestException("Expect a single call to OnData where we removed the option and underlying");
}
}
@@ -96,7 +96,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
public List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -106,21 +106,29 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
public int AlgorithmHistoryDataPoints => 1;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2"},
{"Total Orders", "2"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "99238"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
@@ -133,28 +141,10 @@ namespace QuantConnect.Algorithm.CSharp
{"Tracking Error", "0"},
{"Treynor Ratio", "0"},
{"Total Fees", "$2.00"},
{"Estimated Strategy Capacity", "$230000.00"},
{"Lowest Capacity Asset", "AAPL VXBK4QQIRLZA|AAPL R735QTJ8XC9X"},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "0"},
{"Return Over Maximum Drawdown", "0"},
{"Portfolio Turnover", "0"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "228194dcc6fd8689a67f383577ee2d85"}
{"Estimated Strategy Capacity", "$6200000.00"},
{"Lowest Capacity Asset", "AAPL VXBK4QA5EM92|AAPL R735QTJ8XC9X"},
{"Portfolio Turnover", "90.27%"},
{"OrderListHash", "a111609c2c64554268539b5798e5b31f"}
};
}
}

View File

@@ -57,14 +57,14 @@ namespace QuantConnect.Algorithm.CSharp
{
if (UniverseManager.Count != 3)
{
throw new Exception("Unexpected universe count");
throw new RegressionTestException("Unexpected universe count");
}
if (UniverseManager.ActiveSecurities.Count != 3
|| UniverseManager.ActiveSecurities.Keys.All(symbol => symbol.Value != "SPY")
|| UniverseManager.ActiveSecurities.Keys.All(symbol => symbol.Value != "AAPL")
|| UniverseManager.ActiveSecurities.Keys.All(symbol => symbol.Value != "FB"))
{
throw new Exception("Unexpected active securities");
throw new RegressionTestException("Unexpected active securities");
}
}
@@ -76,65 +76,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 53;
public long DataPoints => 50;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "11"},
{"Average Win", "0%"},
{"Average Loss", "-0.01%"},
{"Compounding Annual Return", "-14.217%"},
{"Drawdown", "3.300%"},
{"Expectancy", "-1"},
{"Net Profit", "-0.168%"},
{"Sharpe Ratio", "62.513"},
{"Total Orders", "6"},
{"Average Win", "0.01%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "1296.838%"},
{"Drawdown", "0.400%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "102684.23"},
{"Net Profit", "2.684%"},
{"Sharpe Ratio", "34.319"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "100%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "1.118"},
{"Beta", "1.19"},
{"Annual Standard Deviation", "0.213"},
{"Annual Variance", "0.046"},
{"Information Ratio", "70.862"},
{"Tracking Error", "0.043"},
{"Treynor Ratio", "11.209"},
{"Total Fees", "$23.21"},
{"Estimated Strategy Capacity", "$340000000.00"},
{"Alpha", "-5.738"},
{"Beta", "1.381"},
{"Annual Standard Deviation", "0.246"},
{"Annual Variance", "0.06"},
{"Information Ratio", "-26.937"},
{"Tracking Error", "0.068"},
{"Treynor Ratio", "6.106"},
{"Total Fees", "$18.61"},
{"Estimated Strategy Capacity", "$980000000.00"},
{"Lowest Capacity Asset", "FB V6OIPNZEM8V9"},
{"Fitness Score", "0.147"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "1"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "-4.352"},
{"Portfolio Turnover", "0.269"},
{"Total Insights Generated", "15"},
{"Total Insights Closed", "12"},
{"Total Insights Analysis Completed", "12"},
{"Long Insight Count", "15"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "a7a0983c8413ff241e7d223438f3d508"}
{"Portfolio Turnover", "25.56%"},
{"OrderListHash", "5ee20c8556d706ab0a63ae41b6579c62"}
};
}
}

View File

@@ -68,14 +68,14 @@ namespace QuantConnect.Algorithm.CSharp
{
if (UniverseManager.Count != 3)
{
throw new Exception("Unexpected universe count");
throw new RegressionTestException("Unexpected universe count");
}
if (UniverseManager.ActiveSecurities.Count != 3
|| UniverseManager.ActiveSecurities.Keys.All(symbol => symbol.Value != "SPY")
|| UniverseManager.ActiveSecurities.Keys.All(symbol => symbol.Value != "AAPL")
|| UniverseManager.ActiveSecurities.Keys.All(symbol => symbol.Value != "FB"))
{
throw new Exception("Unexpected active securities");
throw new RegressionTestException("Unexpected active securities");
}
}
@@ -87,65 +87,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
public List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 234018;
public long DataPoints => 234015;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "27"},
{"Total Orders", "21"},
{"Average Win", "0.01%"},
{"Average Loss", "-0.01%"},
{"Compounding Annual Return", "-75.320%"},
{"Drawdown", "5.800%"},
{"Expectancy", "-0.731"},
{"Net Profit", "-5.588%"},
{"Sharpe Ratio", "-3.252"},
{"Probabilistic Sharpe Ratio", "5.526%"},
{"Loss Rate", "86%"},
{"Win Rate", "14%"},
{"Profit-Loss Ratio", "0.89"},
{"Alpha", "-0.499"},
{"Beta", "1.483"},
{"Annual Standard Deviation", "0.196"},
{"Annual Variance", "0.039"},
{"Information Ratio", "-3.844"},
{"Tracking Error", "0.142"},
{"Treynor Ratio", "-0.43"},
{"Total Fees", "$37.25"},
{"Estimated Strategy Capacity", "$520000000.00"},
{"Compounding Annual Return", "-77.566%"},
{"Drawdown", "6.000%"},
{"Expectancy", "-0.811"},
{"Start Equity", "100000"},
{"End Equity", "94042.73"},
{"Net Profit", "-5.957%"},
{"Sharpe Ratio", "-3.345"},
{"Sortino Ratio", "-3.766"},
{"Probabilistic Sharpe Ratio", "4.557%"},
{"Loss Rate", "89%"},
{"Win Rate", "11%"},
{"Profit-Loss Ratio", "0.70"},
{"Alpha", "-0.519"},
{"Beta", "1.491"},
{"Annual Standard Deviation", "0.2"},
{"Annual Variance", "0.04"},
{"Information Ratio", "-3.878"},
{"Tracking Error", "0.147"},
{"Treynor Ratio", "-0.449"},
{"Total Fees", "$29.11"},
{"Estimated Strategy Capacity", "$680000000.00"},
{"Lowest Capacity Asset", "AAPL R735QTJ8XC9X"},
{"Fitness Score", "0.004"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "1"},
{"Sortino Ratio", "-4.469"},
{"Return Over Maximum Drawdown", "-13.057"},
{"Portfolio Turnover", "0.084"},
{"Total Insights Generated", "33"},
{"Total Insights Closed", "30"},
{"Total Insights Analysis Completed", "30"},
{"Long Insight Count", "33"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "f837879b96f5e565b60fd040299d2123"}
{"Portfolio Turnover", "7.48%"},
{"OrderListHash", "2c814c55e7d7c56482411c065b861b33"}
};
}
}

View File

@@ -63,21 +63,21 @@ namespace QuantConnect.Algorithm.CSharp
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
if (!Portfolio.Invested)
{
SetHoldings(_aapl, 1);
}
if (data.Splits.ContainsKey(_aapl))
if (slice.Splits.ContainsKey(_aapl))
{
Log(data.Splits[_aapl].ToString());
Log(slice.Splits[_aapl].ToString());
}
if (data.Bars.ContainsKey(_aapl))
if (slice.Bars.ContainsKey(_aapl))
{
var aaplData = data.Bars[_aapl];
var aaplData = slice.Bars[_aapl];
// Assert our volume matches what we expect
if (_expectedAdjustedVolume.MoveNext() && _expectedAdjustedVolume.Current != aaplData.Volume)
@@ -99,9 +99,9 @@ namespace QuantConnect.Algorithm.CSharp
}
}
if (data.QuoteBars.ContainsKey(_aapl))
if (slice.QuoteBars.ContainsKey(_aapl))
{
var aaplQuoteData = data.QuoteBars[_aapl];
var aaplQuoteData = slice.QuoteBars[_aapl];
// Assert our askSize matches what we expect
if (_expectedAdjustedAskSize.MoveNext() && _expectedAdjustedAskSize.Current != aaplQuoteData.LastAskSize)
@@ -151,7 +151,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
public List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -163,19 +163,27 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "1"},
{"Total Orders", "1"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "100146.57"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
@@ -190,26 +198,8 @@ namespace QuantConnect.Algorithm.CSharp
{"Total Fees", "$21.60"},
{"Estimated Strategy Capacity", "$42000000.00"},
{"Lowest Capacity Asset", "AAPL R735QTJ8XC9X"},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "0"},
{"Return Over Maximum Drawdown", "0"},
{"Portfolio Turnover", "0"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "18e41dded4f8cee548ee02b03ffb0814"}
{"Portfolio Turnover", "99.56%"},
{"OrderListHash", "60f03c8c589a4f814dc4e8945df23207"}
};
}
}

View File

@@ -0,0 +1,119 @@
/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using QuantConnect.Interfaces;
namespace QuantConnect.Algorithm.CSharp
{
/// <summary>
/// Algorithm asserting the correct values for the deployment target and algorithm mode.
/// </summary>
public class AlgorithmModeAndDeploymentTargetAlgorithm : QCAlgorithm, IRegressionAlgorithmDefinition
{
public override void Initialize()
{
SetStartDate(2013, 10, 07);
SetEndDate(2013, 10, 07);
SetCash(100000);
Debug($"Algorithm Mode: {AlgorithmMode}. Is Live Mode: {LiveMode}. Deployment Target: {DeploymentTarget}.");
if (AlgorithmMode != AlgorithmMode.Backtesting)
{
throw new RegressionTestException($"Algorithm mode is not backtesting. Actual: {AlgorithmMode}");
}
if (LiveMode)
{
throw new RegressionTestException("Algorithm should not be live");
}
if (DeploymentTarget != DeploymentTarget.LocalPlatform)
{
throw new RegressionTestException($"Algorithm deployment target is not local. Actual{DeploymentTarget}");
}
// For a live deployment these checks should pass:
//if (AlgorithmMode != AlgorithmMode.Live) throw new RegressionTestException("Algorithm mode is not live");
//if (!LiveMode) throw new RegressionTestException("Algorithm should be live");
// For a cloud deployment these checks should pass:
//if (DeploymentTarget != DeploymentTarget.CloudPlatform) throw new RegressionTestException("Algorithm deployment target is not cloud");
Quit();
}
/// <summary>
/// This is used by the regression test system to indicate if the open source Lean repository has the required data to run this algorithm.
/// </summary>
public bool CanRunLocally { get; } = true;
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 0;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Orders", "0"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "100000"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "0"},
{"Beta", "0"},
{"Annual Standard Deviation", "0"},
{"Annual Variance", "0"},
{"Information Ratio", "0"},
{"Tracking Error", "0"},
{"Treynor Ratio", "0"},
{"Total Fees", "$0.00"},
{"Estimated Strategy Capacity", "$0"},
{"Lowest Capacity Asset", ""},
{"Portfolio Turnover", "0%"},
{"OrderListHash", "d41d8cd98f00b204e9800998ecf8427e"}
};
}
}

View File

@@ -17,10 +17,12 @@ using System;
using System.Collections.Generic;
using System.Linq;
using QuantConnect.Brokerages;
using QuantConnect.Securities;
using QuantConnect.Data;
using QuantConnect.Data.Shortable;
using QuantConnect.Data.UniverseSelection;
using QuantConnect.Interfaces;
using System.IO;
namespace QuantConnect.Algorithm.CSharp
{
@@ -82,11 +84,15 @@ namespace QuantConnect.Algorithm.CSharp
{ _20140329, new Symbol[0] }
};
private Security _security;
public override void Initialize()
{
SetStartDate(2014, 3, 25);
SetEndDate(2014, 3, 29);
SetCash(10000000);
_security = AddEquity(_spy);
_security.SetShortableProvider(new RegressionTestShortableProvider());
AddUniverse(CoarseSelection);
UniverseSettings.Resolution = Resolution.Daily;
@@ -94,33 +100,31 @@ namespace QuantConnect.Algorithm.CSharp
SetBrokerageModel(new AllShortableSymbolsRegressionAlgorithmBrokerageModel());
}
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
if (Time.Date == _lastTradeDate)
{
return;
}
foreach (var symbol in ActiveSecurities.Keys.OrderBy(symbol => symbol))
foreach (var (symbol, security) in ActiveSecurities.Where(kvp => !kvp.Value.Invested).OrderBy(kvp => kvp.Key))
{
if (!Portfolio.ContainsKey(symbol) || !Portfolio[symbol].Invested)
var shortableQuantity = security.ShortableProvider.ShortableQuantity(symbol, Time);
if (shortableQuantity == null)
{
if (!Shortable(symbol))
{
throw new Exception($"Expected {symbol} to be shortable on {Time:yyyy-MM-dd}");
}
// Buy at least once into all Symbols. Since daily data will always use
// MOO orders, it makes the testing of liquidating buying into Symbols difficult.
MarketOrder(symbol, -(decimal)ShortableQuantity(symbol));
_lastTradeDate = Time.Date;
throw new RegressionTestException($"Expected {symbol} to be shortable on {Time:yyyy-MM-dd}");
}
// Buy at least once into all Symbols. Since daily data will always use
// MOO orders, it makes the testing of liquidating buying into Symbols difficult.
MarketOrder(symbol, -(decimal)shortableQuantity);
_lastTradeDate = Time.Date;
}
}
private IEnumerable<Symbol> CoarseSelection(IEnumerable<CoarseFundamental> coarse)
{
var shortableSymbols = AllShortableSymbols();
var shortableSymbols = (_security.ShortableProvider as dynamic).AllShortableSymbols(Time);
var selectedSymbols = coarse
.Select(x => x.Symbol)
.Where(s => shortableSymbols.ContainsKey(s) && shortableSymbols[s] >= 500)
@@ -133,11 +137,11 @@ namespace QuantConnect.Algorithm.CSharp
var gme = QuantConnect.Symbol.Create("GME", SecurityType.Equity, Market.USA);
if (!shortableSymbols.ContainsKey(gme))
{
throw new Exception("Expected unmapped GME in shortable symbols list on 2014-03-27");
throw new RegressionTestException("Expected unmapped GME in shortable symbols list on 2014-03-27");
}
if (!coarse.Select(x => x.Symbol.Value).Contains("GME"))
{
throw new Exception("Expected mapped GME in coarse symbols on 2014-03-27");
throw new RegressionTestException("Expected mapped GME in coarse symbols on 2014-03-27");
}
expectedMissing = 1;
@@ -146,7 +150,7 @@ namespace QuantConnect.Algorithm.CSharp
var missing = _expectedSymbols[Time.Date].Except(selectedSymbols).ToList();
if (missing.Count != expectedMissing)
{
throw new Exception($"Expected Symbols selected on {Time.Date:yyyy-MM-dd} to match expected Symbols, but the following Symbols were missing: {string.Join(", ", missing.Select(s => s.ToString()))}");
throw new RegressionTestException($"Expected Symbols selected on {Time.Date:yyyy-MM-dd} to match expected Symbols, but the following Symbols were missing: {string.Join(", ", missing.Select(s => s.ToString()))}");
}
_coarseSelected[Time.Date] = true;
@@ -165,15 +169,60 @@ namespace QuantConnect.Algorithm.CSharp
{
public AllShortableSymbolsRegressionAlgorithmBrokerageModel() : base()
{
ShortableProvider = new RegressionTestShortableProvider();
}
public override IShortableProvider GetShortableProvider(Security security)
{
return new RegressionTestShortableProvider();
}
}
private class RegressionTestShortableProvider : LocalDiskShortableProvider
{
public RegressionTestShortableProvider() : base(SecurityType.Equity, "testbrokerage", Market.USA)
public RegressionTestShortableProvider() : base("testbrokerage")
{
}
/// <summary>
/// Gets a list of all shortable Symbols, including the quantity shortable as a Dictionary.
/// </summary>
/// <param name="localTime">The algorithm's local time</param>
/// <returns>Symbol/quantity shortable as a Dictionary. Returns null if no entry data exists for this date or brokerage</returns>
public Dictionary<Symbol, long> AllShortableSymbols(DateTime localTime)
{
var shortableDataDirectory = Path.Combine(Globals.DataFolder, SecurityType.Equity.SecurityTypeToLower(), Market.USA, "shortable", Brokerage);
var allSymbols = new Dictionary<Symbol, long>();
// Check backwards up to one week to see if we can source a previous file.
// If not, then we return a list of all Symbols with quantity set to zero.
var i = 0;
while (i <= 7)
{
var shortableListFile = Path.Combine(shortableDataDirectory, "dates", $"{localTime.AddDays(-i):yyyyMMdd}.csv");
foreach (var line in DataProvider.ReadLines(shortableListFile))
{
var csv = line.Split(',');
var ticker = csv[0];
var symbol = new Symbol(
SecurityIdentifier.GenerateEquity(ticker, QuantConnect.Market.USA,
mappingResolveDate: localTime), ticker);
var quantity = Parse.Long(csv[1]);
allSymbols[symbol] = quantity;
}
if (allSymbols.Count > 0)
{
return allSymbols;
}
i++;
}
// Return our empty dictionary if we did not find a file to extract
return allSymbols;
}
}
/// <summary>
@@ -184,65 +233,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 35410;
public long DataPoints => 36573;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "5"},
{"Total Orders", "8"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "19.147%"},
{"Drawdown", "0%"},
{"Compounding Annual Return", "11.027%"},
{"Drawdown", "0.000%"},
{"Expectancy", "0"},
{"Net Profit", "0.192%"},
{"Sharpe Ratio", "231.673"},
{"Start Equity", "10000000"},
{"End Equity", "10011469.88"},
{"Net Profit", "0.115%"},
{"Sharpe Ratio", "11.963"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "0.163"},
{"Beta", "-0.007"},
{"Annual Standard Deviation", "0.001"},
{"Alpha", "0.07"},
{"Beta", "-0.077"},
{"Annual Standard Deviation", "0.008"},
{"Annual Variance", "0"},
{"Information Ratio", "4.804"},
{"Tracking Error", "0.098"},
{"Treynor Ratio", "-22.526"},
{"Total Fees", "$307.50"},
{"Estimated Strategy Capacity", "$2600000.00"},
{"Lowest Capacity Asset", "GOOCV VP83T1ZUHROL"},
{"Fitness Score", "0.106"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "79228162514264337593543950335"},
{"Portfolio Turnover", "0.106"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "0069f402ffcd2d91b9018b81badfab81"}
{"Information Ratio", "3.876"},
{"Tracking Error", "0.105"},
{"Treynor Ratio", "-1.215"},
{"Total Fees", "$282.50"},
{"Estimated Strategy Capacity", "$61000000000.00"},
{"Lowest Capacity Asset", "NB R735QTJ8XC9X"},
{"Portfolio Turnover", "3.62%"},
{"OrderListHash", "0ea806c53bfa2bdca2504ba7155ef130"}
};
}
}

View File

@@ -1,127 +0,0 @@
/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using QuantConnect.Orders;
using QuantConnect.Interfaces;
using QuantConnect.Securities;
using System.Collections.Generic;
using QuantConnect.Data.Custom.AlphaStreams;
using QuantConnect.Algorithm.Framework.Alphas;
using QuantConnect.Algorithm.Framework.Execution;
using QuantConnect.Algorithm.Framework.Portfolio;
namespace QuantConnect.Algorithm.CSharp
{
/// <summary>
/// Example algorithm consuming an alpha streams portfolio state and trading based on it
/// </summary>
public class AlphaStreamsBasicTemplateAlgorithm : QCAlgorithm, IRegressionAlgorithmDefinition
{
/// <summary>
/// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.
/// </summary>
public override void Initialize()
{
SetStartDate(2018, 04, 04);
SetEndDate(2018, 04, 06);
SetAlpha(new AlphaStreamAlphaModule());
SetExecution(new ImmediateExecutionModel());
Settings.MinimumOrderMarginPortfolioPercentage = 0.01m;
SetPortfolioConstruction(new EqualWeightingAlphaStreamsPortfolioConstructionModel());
SetSecurityInitializer(new BrokerageModelSecurityInitializer(BrokerageModel,
new FuncSecuritySeeder(GetLastKnownPrices)));
foreach (var alphaId in new [] { "623b06b231eb1cc1aa3643a46", "9fc8ef73792331b11dbd5429a" })
{
AddData<AlphaStreamsPortfolioState>(alphaId);
}
}
public override void OnOrderEvent(OrderEvent orderEvent)
{
Log($"OnOrderEvent: {orderEvent}");
}
/// <summary>
/// This is used by the regression test system to indicate if the open source Lean repository has the required data to run this algorithm.
/// </summary>
public bool CanRunLocally { get; } = true;
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public virtual long DataPoints => 890;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public virtual int AlgorithmHistoryDataPoints => 12;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public virtual Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2"},
{"Average Win", "0%"},
{"Average Loss", "-0.12%"},
{"Compounding Annual Return", "-14.722%"},
{"Drawdown", "0.200%"},
{"Expectancy", "-1"},
{"Net Profit", "-0.116%"},
{"Sharpe Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "0"},
{"Beta", "0"},
{"Annual Standard Deviation", "0"},
{"Annual Variance", "0"},
{"Information Ratio", "2.474"},
{"Tracking Error", "0.339"},
{"Treynor Ratio", "0"},
{"Total Fees", "$0.00"},
{"Estimated Strategy Capacity", "$83000.00"},
{"Lowest Capacity Asset", "BTCUSD XJ"},
{"Fitness Score", "0.017"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "-138.588"},
{"Portfolio Turnover", "0.034"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "2b94bc50a74caebe06c075cdab1bc6da"}
};
}
}

View File

@@ -1,103 +0,0 @@
/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System.Collections.Generic;
namespace QuantConnect.Algorithm.CSharp
{
/// <summary>
/// Example algorithm with existing holdings consuming an alpha streams portfolio state and trading based on it
/// </summary>
public class AlphaStreamsDifferentAccountCurrencyBasicTemplateAlgorithm : AlphaStreamsWithHoldingsBasicTemplateAlgorithm
{
/// <summary>
/// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.
/// </summary>
public override void Initialize()
{
SetAccountCurrency("EUR");
base.Initialize();
}
/// <summary>
/// This is used by the regression test system to indicate if the open source Lean repository has the required data to run this algorithm.
/// </summary>
public bool CanRunLocally { get; } = true;
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public override long DataPoints => 6214;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public override int AlgorithmHistoryDataPoints => 61;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public override Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2"},
{"Average Win", "0.01%"},
{"Average Loss", "0.00%"},
{"Compounding Annual Return", "-78.502%"},
{"Drawdown", "3.100%"},
{"Expectancy", "7.797"},
{"Net Profit", "-1.134%"},
{"Sharpe Ratio", "-2.456"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "50%"},
{"Win Rate", "50%"},
{"Profit-Loss Ratio", "16.59"},
{"Alpha", "0.006"},
{"Beta", "1.011"},
{"Annual Standard Deviation", "0.343"},
{"Annual Variance", "0.117"},
{"Information Ratio", "-0.859"},
{"Tracking Error", "0.004"},
{"Treynor Ratio", "-0.832"},
{"Total Fees", "€2.89"},
{"Estimated Strategy Capacity", "€8900000000.00"},
{"Lowest Capacity Asset", "AAPL R735QTJ8XC9X"},
{"Fitness Score", "0.506"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "79228162514264337593543950335"},
{"Portfolio Turnover", "0.506"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "€0"},
{"Total Accumulated Estimated Alpha Value", "€0"},
{"Mean Population Estimated Insight Value", "€0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "a9dd0a0ab6070455479d1b9caaa4e69c"}
};
}
}

View File

@@ -1,140 +0,0 @@
/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using QuantConnect.Interfaces;
using System.Collections.Generic;
using QuantConnect.Data.UniverseSelection;
using QuantConnect.Data.Custom.AlphaStreams;
using QuantConnect.Algorithm.Framework.Alphas;
using QuantConnect.Algorithm.Framework.Execution;
using QuantConnect.Algorithm.Framework.Portfolio;
using QuantConnect.Algorithm.Framework.Selection;
namespace QuantConnect.Algorithm.CSharp
{
/// <summary>
/// Example algorithm consuming an alpha streams portfolio state and trading based on it
/// </summary>
public class AlphaStreamsUniverseSelectionTemplateAlgorithm : QCAlgorithm, IRegressionAlgorithmDefinition
{
/// <summary>
/// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.
/// </summary>
public override void Initialize()
{
SetStartDate(2018, 04, 04);
SetEndDate(2018, 04, 06);
SetAlpha(new AlphaStreamAlphaModule());
SetExecution(new ImmediateExecutionModel());
Settings.MinimumOrderMarginPortfolioPercentage = 0.01m;
SetPortfolioConstruction(new EqualWeightingAlphaStreamsPortfolioConstructionModel());
SetUniverseSelection(new ScheduledUniverseSelectionModel(
DateRules.EveryDay(),
TimeRules.Midnight,
SelectAlphas,
new UniverseSettings(UniverseSettings)
{
SubscriptionDataTypes = new List<Tuple<Type, TickType>>
{new(typeof(AlphaStreamsPortfolioState), TickType.Trade)},
FillForward = false,
}
));
}
private IEnumerable<Symbol> SelectAlphas(DateTime dateTime)
{
Log($"SelectAlphas() {Time}");
foreach (var alphaId in new[] {"623b06b231eb1cc1aa3643a46", "9fc8ef73792331b11dbd5429a"})
{
var alphaSymbol = new Symbol(SecurityIdentifier.GenerateBase(typeof(AlphaStreamsPortfolioState), alphaId, Market.USA),
alphaId);
yield return alphaSymbol;
}
}
/// <summary>
/// This is used by the regression test system to indicate if the open source Lean repository has the required data to run this algorithm.
/// </summary>
public bool CanRunLocally { get; } = true;
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 893;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 2;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public virtual Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2"},
{"Average Win", "0%"},
{"Average Loss", "-0.12%"},
{"Compounding Annual Return", "-13.200%"},
{"Drawdown", "0.200%"},
{"Expectancy", "-1"},
{"Net Profit", "-0.116%"},
{"Sharpe Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "0"},
{"Beta", "0"},
{"Annual Standard Deviation", "0"},
{"Annual Variance", "0"},
{"Information Ratio", "2.474"},
{"Tracking Error", "0.339"},
{"Treynor Ratio", "0"},
{"Total Fees", "$0.00"},
{"Estimated Strategy Capacity", "$83000.00"},
{"Lowest Capacity Asset", "BTCUSD XJ"},
{"Fitness Score", "0.011"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "-113.513"},
{"Portfolio Turnover", "0.023"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "2b94bc50a74caebe06c075cdab1bc6da"}
};
}
}

View File

@@ -1,154 +0,0 @@
/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using QuantConnect.Orders;
using System.Collections.Generic;
using QuantConnect.Data.Custom.AlphaStreams;
using QuantConnect.Algorithm.Framework.Execution;
using QuantConnect.Algorithm.Framework.Portfolio;
namespace QuantConnect.Algorithm.CSharp
{
/// <summary>
/// Example algorithm with existing holdings consuming an alpha streams portfolio state and trading based on it
/// </summary>
public class AlphaStreamsWithHoldingsBasicTemplateAlgorithm : AlphaStreamsBasicTemplateAlgorithm
{
private decimal _expectedSpyQuantity;
/// <summary>
/// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.
/// </summary>
public override void Initialize()
{
SetStartDate(2018, 04, 04);
SetEndDate(2018, 04, 06);
SetCash(100000);
SetExecution(new ImmediateExecutionModel());
UniverseSettings.Resolution = Resolution.Hour;
Settings.MinimumOrderMarginPortfolioPercentage = 0.001m;
SetPortfolioConstruction(new EqualWeightingAlphaStreamsPortfolioConstructionModel());
// AAPL should be liquidated since it's not hold by the alpha
// This is handled by the PCM
var aapl = AddEquity("AAPL", Resolution.Hour);
aapl.Holdings.SetHoldings(40, 10);
// SPY will be bought following the alpha streams portfolio
// This is handled by the PCM + Execution Model
var spy = AddEquity("SPY", Resolution.Hour);
spy.Holdings.SetHoldings(246, -10);
AddData<AlphaStreamsPortfolioState>("94d820a93fff127fa46c15231d");
}
public override void OnOrderEvent(OrderEvent orderEvent)
{
if (_expectedSpyQuantity == 0 && orderEvent.Symbol == "SPY" && orderEvent.Status == OrderStatus.Filled)
{
var security = Securities["SPY"];
var priceInAccountCurrency = Portfolio.CashBook.ConvertToAccountCurrency(security.AskPrice, security.QuoteCurrency.Symbol);
_expectedSpyQuantity = (Portfolio.TotalPortfolioValue - Settings.FreePortfolioValue) / priceInAccountCurrency;
_expectedSpyQuantity = _expectedSpyQuantity.DiscretelyRoundBy(1, MidpointRounding.ToZero);
}
base.OnOrderEvent(orderEvent);
}
public override void OnEndOfAlgorithm()
{
if (Securities["AAPL"].HoldStock)
{
throw new Exception("We should no longer hold AAPL since the alpha does not");
}
// we allow some padding for small price differences
if (Math.Abs(Securities["SPY"].Holdings.Quantity - _expectedSpyQuantity) > _expectedSpyQuantity * 0.03m)
{
throw new Exception($"Unexpected SPY holdings. Expected {_expectedSpyQuantity} was {Securities["SPY"].Holdings.Quantity}");
}
}
/// <summary>
/// This is used by the regression test system to indicate if the open source Lean repository has the required data to run this algorithm.
/// </summary>
public bool CanRunLocally { get; } = true;
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public override long DataPoints => 2313;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public override int AlgorithmHistoryDataPoints => 1;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public override Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2"},
{"Average Win", "0.01%"},
{"Average Loss", "0.00%"},
{"Compounding Annual Return", "-87.617%"},
{"Drawdown", "3.100%"},
{"Expectancy", "8.518"},
{"Net Profit", "-1.515%"},
{"Sharpe Ratio", "-2.45"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "50%"},
{"Win Rate", "50%"},
{"Profit-Loss Ratio", "18.04"},
{"Alpha", "0.008"},
{"Beta", "1.015"},
{"Annual Standard Deviation", "0.344"},
{"Annual Variance", "0.118"},
{"Information Ratio", "-0.856"},
{"Tracking Error", "0.005"},
{"Treynor Ratio", "-0.83"},
{"Total Fees", "$3.09"},
{"Estimated Strategy Capacity", "$8900000000.00"},
{"Lowest Capacity Asset", "AAPL R735QTJ8XC9X"},
{"Fitness Score", "0.511"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "6113.173"},
{"Portfolio Turnover", "0.511"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "788eb2c74715a78476ba0db3b2654eb6"}
};
}
}

View File

@@ -195,11 +195,11 @@ namespace QuantConnect.Algorithm.CSharp.Alphas
private const int _numberOfSymbolsFine = 20;
private const int _numberOfSymbolsInPortfolio = 10;
private int _lastMonth = -1;
private Dictionary<Symbol, decimal> _dollarVolumeBySymbol;
private Dictionary<Symbol, double> _dollarVolumeBySymbol;
public GreenBlattMagicFormulaUniverseSelectionModel() : base(true)
{
_dollarVolumeBySymbol = new Dictionary<Symbol, decimal>();
_dollarVolumeBySymbol = new ();
}
/// <summary>
@@ -245,7 +245,7 @@ namespace QuantConnect.Algorithm.CSharp.Alphas
where x.CompanyReference.CountryId == "USA"
where x.CompanyReference.PrimaryExchangeID == "NYS" || x.CompanyReference.PrimaryExchangeID == "NAS"
where (algorithm.Time - x.SecurityReference.IPODate).TotalDays > 180
where x.EarningReports.BasicAverageShares.ThreeMonths * x.EarningReports.BasicEPS.TwelveMonths * x.ValuationRatios.PERatio > 5e8m
where x.EarningReports.BasicAverageShares.ThreeMonths * x.EarningReports.BasicEPS.TwelveMonths * x.ValuationRatios.PERatio > 5e8
select x;
double count = filteredFine.Count();
@@ -287,4 +287,4 @@ namespace QuantConnect.Algorithm.CSharp.Alphas
}
}
}
}
}

View File

@@ -80,7 +80,7 @@ namespace QuantConnect.Algorithm.CSharp.Alphas
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -92,12 +92,17 @@ namespace QuantConnect.Algorithm.CSharp.Alphas
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2465"},
{"Total Orders", "2465"},
{"Average Win", "0.26%"},
{"Average Loss", "-0.24%"},
{"Compounding Annual Return", "7.848%"},

View File

@@ -1,4 +1,4 @@
/*
/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
@@ -13,19 +13,21 @@
* limitations under the License.
*/
namespace QuantConnect.Algorithm.Framework.Alphas.Analysis
namespace QuantConnect.Algorithm.CSharp
{
/// <summary>
/// Retrieves the registered scoring function for the specified insight/score type
/// Example algorithm using the asynchronous universe selection functionality
/// </summary>
public interface IInsightScoreFunctionProvider
public class AsynchronousUniverseRegressionAlgorithm : FundamentalRegressionAlgorithm
{
/// <summary>
/// Gets the insight scoring function for the specified insight type and score type
/// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.
/// </summary>
/// <param name="insightType">The insight's type</param>
/// <param name="scoreType">The scoring type</param>
/// <returns>A function to be used to compute insight scores</returns>
IInsightScoreFunction GetScoreFunction(InsightType insightType, InsightScoreType scoreType);
public override void Initialize()
{
base.Initialize();
UniverseSettings.Asynchronous = true;
}
}
}
}

View File

@@ -37,7 +37,7 @@ namespace QuantConnect.Algorithm.CSharp
SetStartDate(2013, 1, 07);
SetEndDate(2013, 12, 11);
EnableAutomaticIndicatorWarmUp = true;
Settings.AutomaticIndicatorWarmUp = true;
AddEquity("SPY", Resolution.Daily);
_arima = ARIMA("SPY", 1, 1, 1, 50);
_ar = ARIMA("SPY", 1, 1, 0, 50);
@@ -71,7 +71,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -83,53 +83,43 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public int AlgorithmHistoryDataPoints => 100;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "52"},
{"Total Orders", "53"},
{"Average Win", "0.00%"},
{"Average Loss", "0.00%"},
{"Compounding Annual Return", "0.096%"},
{"Compounding Annual Return", "0.076%"},
{"Drawdown", "0.100%"},
{"Expectancy", "3.321"},
{"Net Profit", "0.089%"},
{"Sharpe Ratio", "0.798"},
{"Probabilistic Sharpe Ratio", "40.893%"},
{"Loss Rate", "24%"},
{"Win Rate", "76%"},
{"Profit-Loss Ratio", "4.67"},
{"Alpha", "-0.001"},
{"Expectancy", "2.933"},
{"Start Equity", "100000"},
{"End Equity", "100070.90"},
{"Net Profit", "0.071%"},
{"Sharpe Ratio", "-9.164"},
{"Sortino Ratio", "-9.852"},
{"Probabilistic Sharpe Ratio", "36.417%"},
{"Loss Rate", "27%"},
{"Win Rate", "73%"},
{"Profit-Loss Ratio", "4.41"},
{"Alpha", "-0.008"},
{"Beta", "0.008"},
{"Annual Standard Deviation", "0.001"},
{"Annual Variance", "0"},
{"Information Ratio", "-1.961"},
{"Tracking Error", "0.092"},
{"Treynor Ratio", "0.08"},
{"Total Fees", "$52.00"},
{"Estimated Strategy Capacity", "$32000000000.00"},
{"Treynor Ratio", "-0.911"},
{"Total Fees", "$53.00"},
{"Estimated Strategy Capacity", "$16000000000.00"},
{"Lowest Capacity Asset", "SPY R735QTJ8XC9X"},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "1.266"},
{"Return Over Maximum Drawdown", "1.622"},
{"Portfolio Turnover", "0"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "cf43585a8d1781f04b53a4f1ee3380cb"}
{"Portfolio Turnover", "0.02%"},
{"OrderListHash", "685c37df6e4c49b75792c133be189094"}
};
}
}

View File

@@ -33,7 +33,7 @@ namespace QuantConnect.Algorithm.CSharp
public override void Initialize()
{
UniverseSettings.DataNormalizationMode = DataNormalizationMode.Raw;
EnableAutomaticIndicatorWarmUp = true;
Settings.AutomaticIndicatorWarmUp = true;
SetStartDate(2013, 10, 08);
SetEndDate(2013, 10, 10);
@@ -82,7 +82,7 @@ namespace QuantConnect.Algorithm.CSharp
if (!sma11.Current.Equals(sma1.Current))
{
throw new Exception("Expected SMAs warmed up before and after adding the Future to the algorithm to have the same current value. " +
throw new RegressionTestException("Expected SMAs warmed up before and after adding the Future to the algorithm to have the same current value. " +
"The result of 'WarmUpIndicator' shouldn't change if the symbol is or isn't subscribed");
}
@@ -94,7 +94,7 @@ namespace QuantConnect.Algorithm.CSharp
if (!smaSpy.Current.Equals(sma.Current))
{
throw new Exception("Expected SMAs warmed up before and after adding the Equity to the algorithm to have the same current value. " +
throw new RegressionTestException("Expected SMAs warmed up before and after adding the Equity to the algorithm to have the same current value. " +
"The result of 'WarmUpIndicator' shouldn't change if the symbol is or isn't subscribed");
}
}
@@ -103,7 +103,7 @@ namespace QuantConnect.Algorithm.CSharp
{
if (indicator.IsReady != isReady)
{
throw new Exception($"Expected indicator state, expected {isReady} but was {indicator.IsReady}");
throw new RegressionTestException($"Expected indicator state, expected {isReady} but was {indicator.IsReady}");
}
}
@@ -111,7 +111,7 @@ namespace QuantConnect.Algorithm.CSharp
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
if (!Portfolio.Invested)
{
@@ -141,7 +141,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
public List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -153,53 +153,43 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public int AlgorithmHistoryDataPoints => 84;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "1"},
{"Total Orders", "1"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "733913.744%"},
{"Drawdown", "15.900%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "106827.7"},
{"Net Profit", "6.828%"},
{"Sharpe Ratio", "203744786353.302"},
{"Sharpe Ratio", "203744786353.299"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "456382350698.561"},
{"Alpha", "456382350698.622"},
{"Beta", "9.229"},
{"Annual Standard Deviation", "2.24"},
{"Annual Variance", "5.017"},
{"Information Ratio", "228504036840.953"},
{"Tracking Error", "1.997"},
{"Treynor Ratio", "49450701625.718"},
{"Treynor Ratio", "49450701625.717"},
{"Total Fees", "$23.65"},
{"Estimated Strategy Capacity", "$200000000.00"},
{"Lowest Capacity Asset", "ES VMKLFZIH2MTD"},
{"Fitness Score", "0.518"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "-7.708"},
{"Portfolio Turnover", "5.277"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "dd38e7b94027d20942a5aa9ac31a9a7f"}
{"Portfolio Turnover", "351.80%"},
{"OrderListHash", "dfd9a280d3c6470b305c03e0b72c234e"}
};
}
}

View File

@@ -0,0 +1,126 @@
/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using QuantConnect.Indicators;
using QuantConnect.Interfaces;
using System.Collections.Generic;
namespace QuantConnect.Algorithm.CSharp
{
/// <summary>
/// Regression algorithm asserting the behavior of the AutomaticIndicatorWarmUp on option greeks
/// </summary>
public class AutomaticIndicatorWarmupOptionIndicatorsMirrorContractsRegressionAlgorithm : QCAlgorithm, IRegressionAlgorithmDefinition
{
public override void Initialize()
{
SetStartDate(2015, 12, 24);
SetEndDate(2015, 12, 24);
Settings.AutomaticIndicatorWarmUp = true;
var underlying = "GOOG";
var resolution = Resolution.Minute;
var expiration = new DateTime(2015, 12, 24);
var strike = 650m;
var equity = AddEquity(underlying, resolution).Symbol;
var option = QuantConnect.Symbol.CreateOption(underlying, Market.USA, OptionStyle.American, OptionRight.Put, strike, expiration);
AddOptionContract(option, resolution);
// add the call counter side of the mirrored pair
var mirrorOption = QuantConnect.Symbol.CreateOption(underlying, Market.USA, OptionStyle.American, OptionRight.Call, strike, expiration);
AddOptionContract(mirrorOption, resolution);
var impliedVolatility = IV(option, mirrorOption);
var delta = D(option, mirrorOption, optionModel: OptionPricingModelType.BinomialCoxRossRubinstein, ivModel: OptionPricingModelType.BlackScholes);
var gamma = G(option, mirrorOption, optionModel: OptionPricingModelType.ForwardTree, ivModel: OptionPricingModelType.BlackScholes);
var vega = V(option, mirrorOption, optionModel: OptionPricingModelType.ForwardTree, ivModel: OptionPricingModelType.BlackScholes);
var theta = T(option, mirrorOption, optionModel: OptionPricingModelType.ForwardTree, ivModel: OptionPricingModelType.BlackScholes);
var rho = R(option, mirrorOption, optionModel: OptionPricingModelType.ForwardTree, ivModel: OptionPricingModelType.BlackScholes);
if (impliedVolatility == 0m || delta == 0m || gamma == 0m || vega == 0m || theta == 0m || rho == 0m)
{
throw new RegressionTestException("Expected IV/greeks calculated");
}
if (!impliedVolatility.IsReady || !delta.IsReady || !gamma.IsReady || !vega.IsReady || !theta.IsReady || !rho.IsReady)
{
throw new RegressionTestException("Expected IV/greeks to be ready");
}
Quit($"Implied Volatility: {impliedVolatility}, Delta: {delta}, Gamma: {gamma}, Vega: {vega}, Theta: {theta}, Rho: {rho}");
}
/// <summary>
/// This is used by the regression test system to indicate if the open source Lean repository has the required data to run this algorithm.
/// </summary>
public bool CanRunLocally => true;
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 0;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 21;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Orders", "0"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "100000"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "0"},
{"Beta", "0"},
{"Annual Standard Deviation", "0"},
{"Annual Variance", "0"},
{"Information Ratio", "0"},
{"Tracking Error", "0"},
{"Treynor Ratio", "0"},
{"Total Fees", "$0.00"},
{"Estimated Strategy Capacity", "$0"},
{"Lowest Capacity Asset", ""},
{"Portfolio Turnover", "0%"},
{"OrderListHash", "d41d8cd98f00b204e9800998ecf8427e"}
};
}
}

View File

@@ -34,14 +34,14 @@ namespace QuantConnect.Algorithm.CSharp
SetStartDate(2013, 10, 07);
SetEndDate(2013, 10, 11);
EnableAutomaticIndicatorWarmUp = true;
Settings.AutomaticIndicatorWarmUp = true;
// Test case 1
_spy = AddEquity("SPY").Symbol;
var sma = SMA(_spy, 10);
if (!sma.IsReady)
{
throw new Exception("Expected SMA to be warmed up");
throw new RegressionTestException("Expected SMA to be warmed up");
}
// Test case 2
@@ -50,20 +50,20 @@ namespace QuantConnect.Algorithm.CSharp
if (indicator.IsReady)
{
throw new Exception("Expected CustomIndicator Not to be warmed up");
throw new RegressionTestException("Expected CustomIndicator Not to be warmed up");
}
WarmUpIndicator(_spy, indicator);
if (!indicator.IsReady)
{
throw new Exception("Expected CustomIndicator to be warmed up");
throw new RegressionTestException("Expected CustomIndicator to be warmed up");
}
}
/// <summary>
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice data)
/// <param name="slice">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice slice)
{
if (!Portfolio.Invested)
{
@@ -72,7 +72,7 @@ namespace QuantConnect.Algorithm.CSharp
// we expect 1 consolidator per indicator
if (subscription.Consolidators.Count != 2)
{
throw new Exception($"Unexpected consolidator count for subscription: {subscription.Consolidators.Count}");
throw new RegressionTestException($"Unexpected consolidator count for subscription: {subscription.Consolidators.Count}");
}
SetHoldings(_spy, 1);
}
@@ -88,7 +88,7 @@ namespace QuantConnect.Algorithm.CSharp
{
if (_previous != null && input.EndTime == _previous.EndTime)
{
throw new Exception($"Unexpected indicator double data point call: {_previous}");
throw new RegressionTestException($"Unexpected indicator double data point call: {_previous}");
}
_previous = input;
return base.ComputeNextValue(window, input);
@@ -103,7 +103,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
public List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -115,19 +115,27 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public int AlgorithmHistoryDataPoints => 40;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "1"},
{"Total Orders", "1"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "271.453%"},
{"Drawdown", "2.200%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "101691.92"},
{"Net Profit", "1.692%"},
{"Sharpe Ratio", "8.888"},
{"Sharpe Ratio", "8.854"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "67.609%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
@@ -138,30 +146,12 @@ namespace QuantConnect.Algorithm.CSharp
{"Annual Variance", "0.049"},
{"Information Ratio", "-14.565"},
{"Tracking Error", "0.001"},
{"Treynor Ratio", "1.978"},
{"Treynor Ratio", "1.97"},
{"Total Fees", "$3.44"},
{"Estimated Strategy Capacity", "$56000000.00"},
{"Lowest Capacity Asset", "SPY R735QTJ8XC9X"},
{"Fitness Score", "0.248"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "93.728"},
{"Portfolio Turnover", "0.248"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "9e4bfd2eb0b81ee5bc1b197a87ccedbe"}
{"Portfolio Turnover", "19.93%"},
{"OrderListHash", "3da9fa60bf95b9ed148b95e02e0cfc9e"}
};
}
}

View File

@@ -0,0 +1,168 @@
/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using QuantConnect.Interfaces;
using QuantConnect.Data.Market;
using System.Collections.Generic;
namespace QuantConnect.Algorithm.CSharp
{
/// <summary>
/// Example algorithm using and asserting the behavior of auxiliary Data handlers
/// </summary>
public class AuxiliaryDataHandlersRegressionAlgorithm : QCAlgorithm, IRegressionAlgorithmDefinition
{
private bool _onSplits;
private bool _onDividends;
private bool _onDelistingsCalled;
private bool _onSymbolChangedEvents;
/// <summary>
/// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.
/// </summary>
public override void Initialize()
{
SetStartDate(2007, 05, 16);
SetEndDate(2015, 1, 1);
UniverseSettings.Resolution = Resolution.Daily;
// will get delisted
AddEquity("AAA.1");
// get's remapped
AddEquity("SPWR");
// has a split & dividends
AddEquity("AAPL");
}
public override void OnDelistings(Delistings delistings)
{
if (!delistings.ContainsKey("AAA.1"))
{
throw new RegressionTestException("Unexpected OnDelistings call");
}
_onDelistingsCalled = true;
}
public override void OnSymbolChangedEvents(SymbolChangedEvents symbolsChanged)
{
if (!symbolsChanged.ContainsKey("SPWR"))
{
throw new RegressionTestException("Unexpected OnSymbolChangedEvents call");
}
_onSymbolChangedEvents = true;
}
public override void OnSplits(Splits splits)
{
if (!splits.ContainsKey("AAPL"))
{
throw new RegressionTestException("Unexpected OnSplits call");
}
_onSplits = true;
}
public override void OnDividends(Dividends dividends)
{
if (!dividends.ContainsKey("AAPL"))
{
throw new RegressionTestException("Unexpected OnDividends call");
}
_onDividends = true;
}
public override void OnEndOfAlgorithm()
{
if (!_onDelistingsCalled)
{
throw new RegressionTestException("OnDelistings was not called!");
}
if (!_onSymbolChangedEvents)
{
throw new RegressionTestException("OnSymbolChangedEvents was not called!");
}
if (!_onSplits)
{
throw new RegressionTestException("OnSplits was not called!");
}
if (!_onDividends)
{
throw new RegressionTestException("OnDividends was not called!");
}
}
/// <summary>
/// This is used by the regression test system to indicate if the open source Lean repository has the required data to run this algorithm.
/// </summary>
public bool CanRunLocally { get; } = true;
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 126221;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Orders", "0"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "100000"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "0"},
{"Beta", "0"},
{"Annual Standard Deviation", "0"},
{"Annual Variance", "0"},
{"Information Ratio", "-0.332"},
{"Tracking Error", "0.183"},
{"Treynor Ratio", "0"},
{"Total Fees", "$0.00"},
{"Estimated Strategy Capacity", "$0"},
{"Lowest Capacity Asset", ""},
{"Portfolio Turnover", "0%"},
{"OrderListHash", "d41d8cd98f00b204e9800998ecf8427e"}
};
}
}

View File

@@ -151,12 +151,12 @@ namespace QuantConnect.Algorithm.CSharp
case OrderStatus.PartiallyFilled:
if (order.LastFillTime == null)
{
throw new Exception("LastFillTime should not be null");
throw new RegressionTestException("LastFillTime should not be null");
}
if (order.Quantity / 2 != orderEvent.FillQuantity)
{
throw new Exception("Order size should be half");
throw new RegressionTestException("Order size should be half");
}
break;
@@ -164,7 +164,7 @@ namespace QuantConnect.Algorithm.CSharp
case OrderStatus.Filled:
if (order.SecurityType == SecurityType.Equity && order.CreatedTime == order.LastFillTime)
{
throw new Exception("Order should not finish during the CreatedTime bar");
throw new RegressionTestException("Order should not finish during the CreatedTime bar");
}
break;
@@ -182,12 +182,12 @@ namespace QuantConnect.Algorithm.CSharp
// If the option price isn't the same as the strike price, its incorrect
if (order.Price != _optionStrikePrice)
{
throw new Exception("OptionExercise order price should be strike price!!");
throw new RegressionTestException("OptionExercise order price should be strike price!!");
}
if (orderEvent.Quantity != -1)
{
throw new Exception("OrderEvent Quantity should be -1");
throw new RegressionTestException("OrderEvent Quantity should be -1");
}
}
@@ -198,14 +198,14 @@ namespace QuantConnect.Algorithm.CSharp
{
if (!Portfolio.ContainsKey(_optionBuy.Symbol) || !Portfolio.ContainsKey(_optionBuy.Symbol.Underlying) || !Portfolio.ContainsKey(_equityBuy.Symbol))
{
throw new Exception("Portfolio does not contain the Symbols we purchased");
throw new RegressionTestException("Portfolio does not contain the Symbols we purchased");
}
//Check option holding, should not be invested since it expired, profit should be -400
var optionHolding = Portfolio[_optionBuy.Symbol];
if (optionHolding.Invested || optionHolding.Profit != -400)
{
throw new Exception("Options holding does not match expected outcome");
throw new RegressionTestException("Options holding does not match expected outcome");
}
//Check the option underlying symbol since we should have bought it at exercise
@@ -213,7 +213,7 @@ namespace QuantConnect.Algorithm.CSharp
var optionExerciseHolding = Portfolio[_optionBuy.Symbol.Underlying];
if (!optionExerciseHolding.Invested || optionExerciseHolding.Quantity != 100 || optionExerciseHolding.AveragePrice != _optionBuy.Symbol.ID.StrikePrice)
{
throw new Exception("Equity holding for exercised option does not match expected outcome");
throw new RegressionTestException("Equity holding for exercised option does not match expected outcome");
}
//Check equity holding, should be invested, profit should be
@@ -221,7 +221,7 @@ namespace QuantConnect.Algorithm.CSharp
var equityHolding = Portfolio[_equityBuy.Symbol];
if (!equityHolding.Invested || equityHolding.Quantity != 52 || equityHolding.AveragePrice != _equityBuy.AverageFillPrice)
{
throw new Exception("Equity holding does not match expected outcome");
throw new RegressionTestException("Equity holding does not match expected outcome");
}
}
@@ -291,65 +291,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
public List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 1748811;
public long DataPoints => 27071;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "3"},
{"Total Orders", "3"},
{"Average Win", "0%"},
{"Average Loss", "-0.40%"},
{"Compounding Annual Return", "-22.717%"},
{"Compounding Annual Return", "-21.378%"},
{"Drawdown", "0.400%"},
{"Expectancy", "-1"},
{"Start Equity", "100000"},
{"End Equity", "99671.06"},
{"Net Profit", "-0.329%"},
{"Sharpe Ratio", "-7.887"},
{"Sharpe Ratio", "-14.095"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "1.216%"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "-0.001"},
{"Alpha", "-0.01"},
{"Beta", "0.097"},
{"Annual Standard Deviation", "0.002"},
{"Annual Variance", "0"},
{"Information Ratio", "7.39"},
{"Tracking Error", "0.015"},
{"Treynor Ratio", "-0.131"},
{"Treynor Ratio", "-0.234"},
{"Total Fees", "$2.00"},
{"Estimated Strategy Capacity", "$0"},
{"Lowest Capacity Asset", "GOOCV VP83T1ZUHROL"},
{"Fitness Score", "0.212"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "-73.334"},
{"Portfolio Turnover", "0.425"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "85cbf92f01c2c91b5f710b7eeefecbe1"}
{"Portfolio Turnover", "17.02%"},
{"OrderListHash", "b1e5e72fb766ab894204bc4b1300912b"}
};
}
}

View File

@@ -0,0 +1,100 @@
/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using QuantConnect.Algorithm.Framework.Alphas;
using QuantConnect.Algorithm.Framework.Execution;
using QuantConnect.Algorithm.Framework.Portfolio;
using QuantConnect.Algorithm.Framework.Risk;
using QuantConnect.Algorithm.Framework.Selection;
using QuantConnect.Interfaces;
namespace QuantConnect.Algorithm.CSharp
{
/// <summary>
/// Abstract regression framework algorithm for multiple framework regression tests
/// </summary>
public abstract class BaseFrameworkRegressionAlgorithm : QCAlgorithm, IRegressionAlgorithmDefinition
{
public override void Initialize()
{
SetStartDate(2014, 6, 1);
SetEndDate(2014, 6, 30);
UniverseSettings.Resolution = Resolution.Hour;
UniverseSettings.DataNormalizationMode = DataNormalizationMode.Raw;
var symbols = new[] { "AAPL", "AIG", "BAC", "SPY" }
.Select(ticker => QuantConnect.Symbol.Create(ticker, SecurityType.Equity, Market.USA))
.ToList();
// Manually add AAPL and AIG when the algorithm starts
SetUniverseSelection(new ManualUniverseSelectionModel(symbols.Take(2)));
// At midnight, add all securities every day except on the last data
// With this procedure, the Alpha Model will experience multiple universe changes
AddUniverseSelection(new ScheduledUniverseSelectionModel(
DateRules.EveryDay(), TimeRules.Midnight,
dt => dt < EndDate.AddDays(-1) ? symbols : Enumerable.Empty<Symbol>()));
SetAlpha(new ConstantAlphaModel(InsightType.Price, InsightDirection.Up, TimeSpan.FromDays(31), 0.025, null));
SetPortfolioConstruction(new EqualWeightingPortfolioConstructionModel());
SetExecution(new ImmediateExecutionModel());
SetRiskManagement(new NullRiskManagementModel());
}
public override void OnEndOfAlgorithm()
{
// The base implementation checks for active insights
var insightsCount = Insights.GetInsights(insight => insight.IsActive(UtcTime)).Count;
if (insightsCount != 0)
{
throw new RegressionTestException($"The number of active insights should be 0. Actual: {insightsCount}");
}
}
/// <summary>
/// This is used by the regression test system to indicate if the open source Lean repository has the required data to run this algorithm.
/// </summary>
public bool CanRunLocally { get; } = true;
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public virtual List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public virtual long DataPoints => 765;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public virtual int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public abstract Dictionary<string, string> ExpectedStatistics { get; }
}
}

View File

@@ -49,7 +49,7 @@ namespace QuantConnect.Algorithm.CSharp
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// Slice object keyed by symbol containing the stock data
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
if (!Portfolio.Invested)
{
@@ -63,4 +63,4 @@ namespace QuantConnect.Algorithm.CSharp
}
}
}
}
}

View File

@@ -35,18 +35,22 @@ namespace QuantConnect.Algorithm.CSharp
SetStartDate(2018, 04, 04); //Set Start Date
SetEndDate(2018, 04, 04); //Set End Date
SetBrokerageModel(BrokerageName.GDAX, AccountType.Cash);
SetAccountCurrency();
_btcEur = AddCrypto("BTCEUR").Symbol;
}
public virtual void SetAccountCurrency()
{
//Before setting any cash or adding a Security call SetAccountCurrency
SetAccountCurrency("EUR");
SetCash(100000); //Set Strategy Cash
_btcEur = AddCrypto("BTCEUR").Symbol;
}
/// <summary>
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
if (!Portfolio.Invested)
{
@@ -63,31 +67,39 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 4324;
public long DataPoints => 4319;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 120;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "1"},
{"Total Orders", "1"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "100000.00"},
{"End Equity", "92395.59"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
@@ -101,27 +113,9 @@ namespace QuantConnect.Algorithm.CSharp
{"Treynor Ratio", "0"},
{"Total Fees", "€298.35"},
{"Estimated Strategy Capacity", "€85000.00"},
{"Lowest Capacity Asset", "BTCEUR XJ"},
{"Fitness Score", "0.506"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "-13.614"},
{"Portfolio Turnover", "1.073"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "€0"},
{"Total Accumulated Estimated Alpha Value", "€0"},
{"Mean Population Estimated Insight Value", "€0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "2ba443899dcccc79dc0f04441f797bf9"}
{"Lowest Capacity Asset", "BTCEUR 2XR"},
{"Portfolio Turnover", "107.64%"},
{"OrderListHash", "6819dc936b86af6e4b89b6017b7d5284"}
};
}
}

View File

@@ -0,0 +1,91 @@
/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System.Collections.Generic;
using QuantConnect.Interfaces;
namespace QuantConnect.Algorithm.CSharp
{
/// <summary>
/// Basic algorithm using SetAccountCurrency with an amount
/// </summary>
public class BasicSetAccountCurrencyWithAmountAlgorithm : BasicSetAccountCurrencyAlgorithm, IRegressionAlgorithmDefinition
{
public override void SetAccountCurrency()
{
//Before setting any cash or adding a Security call SetAccountCurrency
SetAccountCurrency("EUR", 200000);
}
/// <summary>
/// This is used by the regression test system to indicate if the open source Lean repository has the required data to run this algorithm.
/// </summary>
public bool CanRunLocally { get; } = true;
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 4319;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 120;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Orders", "1"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "200000.00"},
{"End Equity", "184791.19"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "0"},
{"Beta", "0"},
{"Annual Standard Deviation", "0"},
{"Annual Variance", "0"},
{"Information Ratio", "0"},
{"Tracking Error", "0"},
{"Treynor Ratio", "0"},
{"Total Fees", "€596.71"},
{"Estimated Strategy Capacity", "€85000.00"},
{"Lowest Capacity Asset", "BTCEUR 2XR"},
{"Portfolio Turnover", "107.64%"},
{"OrderListHash", "3d450fd418a0e845b3eaaac17fcd13fc"}
};
}
}

View File

@@ -53,7 +53,7 @@ namespace QuantConnect.Algorithm.CSharp
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
if (!Portfolio.Invested)
{
@@ -70,7 +70,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -82,19 +82,27 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "1"},
{"Total Orders", "1"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "271.453%"},
{"Drawdown", "2.200%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "101691.92"},
{"Net Profit", "1.692%"},
{"Sharpe Ratio", "8.888"},
{"Sharpe Ratio", "8.854"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "67.609%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
@@ -105,30 +113,12 @@ namespace QuantConnect.Algorithm.CSharp
{"Annual Variance", "0.049"},
{"Information Ratio", "-14.565"},
{"Tracking Error", "0.001"},
{"Treynor Ratio", "1.978"},
{"Treynor Ratio", "1.97"},
{"Total Fees", "$3.44"},
{"Estimated Strategy Capacity", "$56000000.00"},
{"Lowest Capacity Asset", "SPY R735QTJ8XC9X"},
{"Fitness Score", "0.248"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "93.728"},
{"Portfolio Turnover", "0.248"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "9e4bfd2eb0b81ee5bc1b197a87ccedbe"}
{"Portfolio Turnover", "19.93%"},
{"OrderListHash", "3da9fa60bf95b9ed148b95e02e0cfc9e"}
};
}
}

View File

@@ -14,7 +14,6 @@
*/
using QuantConnect.Data;
using QuantConnect.Orders;
using QuantConnect.Interfaces;
using QuantConnect.Brokerages;
using System.Collections.Generic;
@@ -22,12 +21,12 @@ using System.Collections.Generic;
namespace QuantConnect.Algorithm.CSharp
{
/// <summary>
/// Basic template algorithm for the Atreyu brokerage
/// Basic template algorithm for the Axos brokerage
/// </summary>
/// <meta name="tag" content="using data" />
/// <meta name="tag" content="using quantconnect" />
/// <meta name="tag" content="trading and orders" />
public class BasicTemplateAtreyuAlgorithm : QCAlgorithm, IRegressionAlgorithmDefinition
public class BasicTemplateAxosAlgorithm : QCAlgorithm, IRegressionAlgorithmDefinition
{
/// <summary>
/// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.
@@ -38,21 +37,15 @@ namespace QuantConnect.Algorithm.CSharp
SetEndDate(2013, 10, 11);
SetCash(100000);
SetBrokerageModel(BrokerageName.Atreyu);
SetBrokerageModel(BrokerageName.Axos);
AddEquity("SPY", Resolution.Minute);
DefaultOrderProperties = new AtreyuOrderProperties
{
// Currently only support order for the day
TimeInForce = TimeInForce.Day
};
}
/// <summary>
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice data)
/// <param name="slice">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice slice)
{
if (!Portfolio.Invested)
{
@@ -71,7 +64,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -83,19 +76,27 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "1"},
{"Total Orders", "1"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "39.143%"},
{"Drawdown", "0.500%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "100423.24"},
{"Net Profit", "0.423%"},
{"Sharpe Ratio", "5.634"},
{"Sharpe Ratio", "5.498"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "67.498%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
@@ -110,26 +111,8 @@ namespace QuantConnect.Algorithm.CSharp
{"Total Fees", "$0.60"},
{"Estimated Strategy Capacity", "$150000000.00"},
{"Lowest Capacity Asset", "SPY R735QTJ8XC9X"},
{"Fitness Score", "0.062"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "71.634"},
{"Portfolio Turnover", "0.062"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "d549c64ee7f5e3866712b3c7dbd64caa"}
{"Portfolio Turnover", "4.98%"},
{"OrderListHash", "8774049eb5141a2b6956d9432426f837"}
};
}
}

View File

@@ -51,7 +51,7 @@ namespace QuantConnect.Algorithm.CSharp
contractDepthOffset: 0
);
_fast = SMA(_continuousContract.Symbol, 3, Resolution.Daily);
_fast = SMA(_continuousContract.Symbol, 4, Resolution.Daily);
_slow = SMA(_continuousContract.Symbol, 10, Resolution.Daily);
}
@@ -59,14 +59,14 @@ namespace QuantConnect.Algorithm.CSharp
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
foreach (var changedEvent in data.SymbolChangedEvents.Values)
foreach (var changedEvent in slice.SymbolChangedEvents.Values)
{
Debug($"{Time} - SymbolChanged event: {changedEvent}");
if (Time.TimeOfDay != TimeSpan.Zero)
{
throw new Exception($"{Time} unexpected symbol changed event {changedEvent}!");
throw new RegressionTestException($"{Time} unexpected symbol changed event {changedEvent}!");
}
}
@@ -113,65 +113,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 709638;
public long DataPoints => 713369;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2"},
{"Average Win", "0%"},
{"Average Loss", "-0.02%"},
{"Compounding Annual Return", "-0.033%"},
{"Drawdown", "0.000%"},
{"Expectancy", "-1"},
{"Net Profit", "-0.017%"},
{"Sharpe Ratio", "-1.173"},
{"Probabilistic Sharpe Ratio", "0.011%"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
{"Total Orders", "5"},
{"Average Win", "2.48%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "11.325%"},
{"Drawdown", "1.500%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "105549.6"},
{"Net Profit", "5.550%"},
{"Sharpe Ratio", "1.332"},
{"Sortino Ratio", "879.904"},
{"Probabilistic Sharpe Ratio", "79.894%"},
{"Loss Rate", "0%"},
{"Win Rate", "100%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "-0"},
{"Beta", "-0"},
{"Annual Standard Deviation", "0"},
{"Annual Variance", "0"},
{"Information Ratio", "-2.752"},
{"Tracking Error", "0.082"},
{"Treynor Ratio", "1.883"},
{"Total Fees", "$4.30"},
{"Estimated Strategy Capacity", "$0"},
{"Alpha", "0.075"},
{"Beta", "-0.017"},
{"Annual Standard Deviation", "0.053"},
{"Annual Variance", "0.003"},
{"Information Ratio", "-1.48"},
{"Tracking Error", "0.099"},
{"Treynor Ratio", "-4.187"},
{"Total Fees", "$10.75"},
{"Estimated Strategy Capacity", "$7100000.00"},
{"Lowest Capacity Asset", "ES VMKLFZIH2MTD"},
{"Fitness Score", "0.006"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "-1.996"},
{"Portfolio Turnover", "0.01"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "1fd4b49e9450800981c6dead2bbca995"}
{"Portfolio Turnover", "2.33%"},
{"OrderListHash", "9c524830ffc7354327638142ae62acd2"}
};
}
}

View File

@@ -52,22 +52,22 @@ namespace QuantConnect.Algorithm.CSharp
extendedMarketHours: true
);
_fast = SMA(_continuousContract.Symbol, 3, Resolution.Daily);
_fast = SMA(_continuousContract.Symbol, 4, Resolution.Daily);
_slow = SMA(_continuousContract.Symbol, 10, Resolution.Daily);
}
/// <summary>
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice data)
/// <param name="slice">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice slice)
{
foreach (var changedEvent in data.SymbolChangedEvents.Values)
foreach (var changedEvent in slice.SymbolChangedEvents.Values)
{
Debug($"{Time} - SymbolChanged event: {changedEvent}");
if (Time.TimeOfDay != TimeSpan.Zero)
{
throw new Exception($"{Time} unexpected symbol changed event {changedEvent}!");
throw new RegressionTestException($"{Time} unexpected symbol changed event {changedEvent}!");
}
}
@@ -118,65 +118,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 2202510;
public long DataPoints => 2217299;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2"},
{"Average Win", "0%"},
{"Average Loss", "-0.02%"},
{"Compounding Annual Return", "-0.033%"},
{"Drawdown", "0.000%"},
{"Expectancy", "-1"},
{"Net Profit", "-0.017%"},
{"Sharpe Ratio", "-1.173"},
{"Probabilistic Sharpe Ratio", "0.011%"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
{"Total Orders", "5"},
{"Average Win", "2.86%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "12.959%"},
{"Drawdown", "1.100%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "106337.1"},
{"Net Profit", "6.337%"},
{"Sharpe Ratio", "1.41"},
{"Sortino Ratio", "1.242"},
{"Probabilistic Sharpe Ratio", "77.992%"},
{"Loss Rate", "0%"},
{"Win Rate", "100%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "-0"},
{"Beta", "-0"},
{"Annual Standard Deviation", "0"},
{"Annual Variance", "0"},
{"Information Ratio", "-2.752"},
{"Tracking Error", "0.082"},
{"Treynor Ratio", "1.883"},
{"Total Fees", "$4.30"},
{"Estimated Strategy Capacity", "$0"},
{"Alpha", "0.071"},
{"Beta", "0.054"},
{"Annual Standard Deviation", "0.059"},
{"Annual Variance", "0.003"},
{"Information Ratio", "-1.392"},
{"Tracking Error", "0.097"},
{"Treynor Ratio", "1.518"},
{"Total Fees", "$10.75"},
{"Estimated Strategy Capacity", "$890000000.00"},
{"Lowest Capacity Asset", "ES VMKLFZIH2MTD"},
{"Fitness Score", "0.006"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "-1.985"},
{"Portfolio Turnover", "0.01"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "adb237703e65b93da5961c0085109732"}
{"Portfolio Turnover", "2.32%"},
{"OrderListHash", "f60fc7dcba2c1ff077afeb191aee5008"}
};
}
}

View File

@@ -79,8 +79,8 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice data)
/// <param name="slice">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice slice)
{
if (Portfolio.CashBook["EUR"].ConversionRate == 0
|| Portfolio.CashBook["BTC"].ConversionRate == 0
@@ -92,7 +92,7 @@ namespace QuantConnect.Algorithm.CSharp
Log($"LTC conversion rate: {Portfolio.CashBook["LTC"].ConversionRate}");
Log($"ETH conversion rate: {Portfolio.CashBook["ETH"].ConversionRate}");
throw new Exception("Conversion rate is 0");
throw new RegressionTestException("Conversion rate is 0");
}
if (Time.Hour == 1 && Time.Minute == 0)
{
@@ -196,31 +196,39 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 12970;
public long DataPoints => 12965;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 240;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "10"},
{"Total Orders", "12"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "31588.24"},
{"End Equity", "30866.71"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
@@ -234,27 +242,9 @@ namespace QuantConnect.Algorithm.CSharp
{"Treynor Ratio", "0"},
{"Total Fees", "$85.34"},
{"Estimated Strategy Capacity", "$0"},
{"Lowest Capacity Asset", "BTCEUR XJ"},
{"Fitness Score", "0.5"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "-43.943"},
{"Portfolio Turnover", "1.028"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "1bf1a6d9dd921982b72a6178f9e50e68"}
{"Lowest Capacity Asset", "BTCEUR 2XR"},
{"Portfolio Turnover", "118.08%"},
{"OrderListHash", "26b9a07ace86b6a0e0eb2ff8c168cee0"}
};
}
}

View File

@@ -45,7 +45,7 @@ namespace QuantConnect.Algorithm.CSharp
SetStartDate(2022, 12, 13); // Set Start Date
SetEndDate(2022, 12, 13); // Set End Date
SetTimeZone(NodaTime.DateTimeZone.Utc);
SetTimeZone(TimeZones.Utc);
try
{
@@ -79,9 +79,9 @@ namespace QuantConnect.Algorithm.CSharp
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
var interestRates = data.Get<MarginInterestRate>();
var interestRates = slice.Get<MarginInterestRate>();
foreach (var interestRate in interestRates)
{
_interestPerSymbol[interestRate.Key]++;
@@ -89,7 +89,7 @@ namespace QuantConnect.Algorithm.CSharp
var cachedInterestRate = Securities[interestRate.Key].Cache.GetData<MarginInterestRate>();
if (cachedInterestRate != interestRate.Value)
{
throw new Exception($"Unexpected cached margin interest rate for {interestRate.Key}!");
throw new RegressionTestException($"Unexpected cached margin interest rate for {interestRate.Key}!");
}
}
@@ -100,7 +100,7 @@ namespace QuantConnect.Algorithm.CSharp
var ticket = Buy(_btcUsd.Symbol, 50);
if (ticket.Status != OrderStatus.Invalid)
{
throw new Exception($"Unexpected valid order {ticket}, should fail due to margin not sufficient");
throw new RegressionTestException($"Unexpected valid order {ticket}, should fail due to margin not sufficient");
}
Buy(_btcUsd.Symbol, 1);
@@ -113,17 +113,17 @@ namespace QuantConnect.Algorithm.CSharp
if (Math.Abs(btcUsdHoldings.TotalSaleVolume - holdingsValueBtcUsd) > 1)
{
throw new Exception($"Unexpected TotalSaleVolume {btcUsdHoldings.TotalSaleVolume}");
throw new RegressionTestException($"Unexpected TotalSaleVolume {btcUsdHoldings.TotalSaleVolume}");
}
if (Math.Abs(btcUsdHoldings.AbsoluteHoldingsCost - holdingsValueBtcUsd) > 1)
{
throw new Exception($"Unexpected holdings cost {btcUsdHoldings.HoldingsCost}");
throw new RegressionTestException($"Unexpected holdings cost {btcUsdHoldings.HoldingsCost}");
}
// margin used is based on the maintenance rate
if (Math.Abs(btcUsdHoldings.AbsoluteHoldingsCost * 0.05m - marginUsed) > 1
|| _btcUsd.BuyingPowerModel.GetMaintenanceMargin(_btcUsd) != marginUsed)
{
throw new Exception($"Unexpected margin used {marginUsed}");
throw new RegressionTestException($"Unexpected margin used {marginUsed}");
}
Buy(_adaUsdt.Symbol, 1000);
@@ -136,28 +136,28 @@ namespace QuantConnect.Algorithm.CSharp
if (Math.Abs(adaUsdtHoldings.TotalSaleVolume - holdingsValueUsdt) > 1)
{
throw new Exception($"Unexpected TotalSaleVolume {adaUsdtHoldings.TotalSaleVolume}");
throw new RegressionTestException($"Unexpected TotalSaleVolume {adaUsdtHoldings.TotalSaleVolume}");
}
if (Math.Abs(adaUsdtHoldings.AbsoluteHoldingsCost - holdingsValueUsdt) > 1)
{
throw new Exception($"Unexpected holdings cost {adaUsdtHoldings.HoldingsCost}");
throw new RegressionTestException($"Unexpected holdings cost {adaUsdtHoldings.HoldingsCost}");
}
if (Math.Abs(adaUsdtHoldings.AbsoluteHoldingsCost * 0.05m - marginUsed) > 1
|| _adaUsdt.BuyingPowerModel.GetMaintenanceMargin(_adaUsdt) != marginUsed)
{
throw new Exception($"Unexpected margin used {marginUsed}");
throw new RegressionTestException($"Unexpected margin used {marginUsed}");
}
// position just opened should be just spread here
var profit = Portfolio.TotalUnrealizedProfit;
if ((5 - Math.Abs(profit)) < 0)
{
throw new Exception($"Unexpected TotalUnrealizedProfit {Portfolio.TotalUnrealizedProfit}");
throw new RegressionTestException($"Unexpected TotalUnrealizedProfit {Portfolio.TotalUnrealizedProfit}");
}
if (Portfolio.TotalProfit != 0)
{
throw new Exception($"Unexpected TotalProfit {Portfolio.TotalProfit}");
throw new RegressionTestException($"Unexpected TotalProfit {Portfolio.TotalProfit}");
}
}
}
@@ -172,7 +172,7 @@ namespace QuantConnect.Algorithm.CSharp
if (Math.Abs(btcUsdHoldings.AbsoluteHoldingsCost - 100 * 2) > 1)
{
throw new Exception($"Unexpected holdings cost {btcUsdHoldings.HoldingsCost}");
throw new RegressionTestException($"Unexpected holdings cost {btcUsdHoldings.HoldingsCost}");
}
Sell(_adaUsdt.Symbol, 3000);
@@ -184,19 +184,19 @@ namespace QuantConnect.Algorithm.CSharp
if (Math.Abs(adaUsdtHoldings.AbsoluteHoldingsCost - holdingsValueUsdt) > 1)
{
throw new Exception($"Unexpected holdings cost {adaUsdtHoldings.HoldingsCost}");
throw new RegressionTestException($"Unexpected holdings cost {adaUsdtHoldings.HoldingsCost}");
}
// position just opened should be just spread here
var profit = Portfolio.TotalUnrealizedProfit;
if ((5 - Math.Abs(profit)) < 0)
{
throw new Exception($"Unexpected TotalUnrealizedProfit {Portfolio.TotalUnrealizedProfit}");
throw new RegressionTestException($"Unexpected TotalUnrealizedProfit {Portfolio.TotalUnrealizedProfit}");
}
// we barely did any difference on the previous trade
if ((5 - Math.Abs(Portfolio.TotalProfit)) < 0)
{
throw new Exception($"Unexpected TotalProfit {Portfolio.TotalProfit}");
throw new RegressionTestException($"Unexpected TotalProfit {Portfolio.TotalProfit}");
}
}
}
@@ -206,12 +206,12 @@ namespace QuantConnect.Algorithm.CSharp
{
if (_interestPerSymbol[_adaUsdt.Symbol] != 1)
{
throw new Exception($"Unexpected interest rate count {_interestPerSymbol[_adaUsdt.Symbol]}");
throw new RegressionTestException($"Unexpected interest rate count {_interestPerSymbol[_adaUsdt.Symbol]}");
}
if (_interestPerSymbol[_btcUsd.Symbol] != 3)
{
throw new Exception($"Unexpected interest rate count {_interestPerSymbol[_btcUsd.Symbol]}");
throw new RegressionTestException($"Unexpected interest rate count {_interestPerSymbol[_btcUsd.Symbol]}");
}
}
@@ -228,7 +228,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -240,19 +240,27 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "4"},
{"Total Orders", "5"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "1000200.00"},
{"End Equity", "1000278.02"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
@@ -264,29 +272,11 @@ namespace QuantConnect.Algorithm.CSharp
{"Information Ratio", "0"},
{"Tracking Error", "0"},
{"Treynor Ratio", "0"},
{"Total Fees", "$1.63"},
{"Estimated Strategy Capacity", "$630000000.00"},
{"Total Fees", "$0.65"},
{"Estimated Strategy Capacity", "$500000000.00"},
{"Lowest Capacity Asset", "ADAUSDT 18R"},
{"Fitness Score", "0.001"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "79228162514264337593543950335"},
{"Portfolio Turnover", "0.001"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "d4520985f69c915060f6bee3b7926cf5"}
{"Portfolio Turnover", "0.16%"},
{"OrderListHash", "dcc4f964b5549c753123848c32eaee41"}
};
}
}

View File

@@ -44,7 +44,7 @@ namespace QuantConnect.Algorithm.CSharp
SetStartDate(2022, 12, 13);
SetEndDate(2022, 12, 13);
SetTimeZone(NodaTime.DateTimeZone.Utc);
SetTimeZone(TimeZones.Utc);
try
{
@@ -74,9 +74,9 @@ namespace QuantConnect.Algorithm.CSharp
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
var interestRates = data.Get<MarginInterestRate>();
var interestRates = slice.Get<MarginInterestRate>();
foreach (var interestRate in interestRates)
{
_interestPerSymbol[interestRate.Key]++;
@@ -84,7 +84,7 @@ namespace QuantConnect.Algorithm.CSharp
var cachedInterestRate = Securities[interestRate.Key].Cache.GetData<MarginInterestRate>();
if (cachedInterestRate != interestRate.Value)
{
throw new Exception($"Unexpected cached margin interest rate for {interestRate.Key}!");
throw new RegressionTestException($"Unexpected cached margin interest rate for {interestRate.Key}!");
}
}
@@ -95,7 +95,7 @@ namespace QuantConnect.Algorithm.CSharp
var ticket = Buy(_adaUsdt.Symbol, 100000);
if(ticket.Status != OrderStatus.Invalid)
{
throw new Exception($"Unexpected valid order {ticket}, should fail due to margin not sufficient");
throw new RegressionTestException($"Unexpected valid order {ticket}, should fail due to margin not sufficient");
}
Buy(_adaUsdt.Symbol, 1000);
@@ -108,28 +108,28 @@ namespace QuantConnect.Algorithm.CSharp
if (Math.Abs(adaUsdtHoldings.TotalSaleVolume - holdingsValueUsdt) > 1)
{
throw new Exception($"Unexpected TotalSaleVolume {adaUsdtHoldings.TotalSaleVolume}");
throw new RegressionTestException($"Unexpected TotalSaleVolume {adaUsdtHoldings.TotalSaleVolume}");
}
if (Math.Abs(adaUsdtHoldings.AbsoluteHoldingsCost - holdingsValueUsdt) > 1)
{
throw new Exception($"Unexpected holdings cost {adaUsdtHoldings.HoldingsCost}");
throw new RegressionTestException($"Unexpected holdings cost {adaUsdtHoldings.HoldingsCost}");
}
if (Math.Abs(adaUsdtHoldings.AbsoluteHoldingsCost * 0.05m - marginUsed) > 1
|| _adaUsdt.BuyingPowerModel.GetMaintenanceMargin(_adaUsdt) != marginUsed)
{
throw new Exception($"Unexpected margin used {marginUsed}");
throw new RegressionTestException($"Unexpected margin used {marginUsed}");
}
// position just opened should be just spread here
var profit = Portfolio.TotalUnrealizedProfit;
if ((5 - Math.Abs(profit)) < 0)
{
throw new Exception($"Unexpected TotalUnrealizedProfit {Portfolio.TotalUnrealizedProfit}");
throw new RegressionTestException($"Unexpected TotalUnrealizedProfit {Portfolio.TotalUnrealizedProfit}");
}
if (Portfolio.TotalProfit != 0)
{
throw new Exception($"Unexpected TotalProfit {Portfolio.TotalProfit}");
throw new RegressionTestException($"Unexpected TotalProfit {Portfolio.TotalProfit}");
}
}
}
@@ -147,19 +147,19 @@ namespace QuantConnect.Algorithm.CSharp
if (Math.Abs(adaUsdtHoldings.AbsoluteHoldingsCost - holdingsValueUsdt) > 1)
{
throw new Exception($"Unexpected holdings cost {adaUsdtHoldings.HoldingsCost}");
throw new RegressionTestException($"Unexpected holdings cost {adaUsdtHoldings.HoldingsCost}");
}
// position just opened should be just spread here
var profit = Portfolio.TotalUnrealizedProfit;
if ((5 - Math.Abs(profit)) < 0)
{
throw new Exception($"Unexpected TotalUnrealizedProfit {Portfolio.TotalUnrealizedProfit}");
throw new RegressionTestException($"Unexpected TotalUnrealizedProfit {Portfolio.TotalUnrealizedProfit}");
}
// we barely did any difference on the previous trade
if ((5 - Math.Abs(Portfolio.TotalProfit)) < 0)
{
throw new Exception($"Unexpected TotalProfit {Portfolio.TotalProfit}");
throw new RegressionTestException($"Unexpected TotalProfit {Portfolio.TotalProfit}");
}
}
@@ -174,7 +174,7 @@ namespace QuantConnect.Algorithm.CSharp
{
if (_interestPerSymbol[_adaUsdt.Symbol] != 1)
{
throw new Exception($"Unexpected interest rate count {_interestPerSymbol[_adaUsdt.Symbol]}");
throw new RegressionTestException($"Unexpected interest rate count {_interestPerSymbol[_adaUsdt.Symbol]}");
}
}
@@ -191,7 +191,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -203,19 +203,27 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2"},
{"Total Orders", "3"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "1000200"},
{"End Equity", "1000189.47"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
@@ -227,29 +235,11 @@ namespace QuantConnect.Algorithm.CSharp
{"Information Ratio", "0"},
{"Tracking Error", "0"},
{"Treynor Ratio", "0"},
{"Total Fees", "$1.23"},
{"Estimated Strategy Capacity", "$520000000.00"},
{"Total Fees", "$0.61"},
{"Estimated Strategy Capacity", "$370000000.00"},
{"Lowest Capacity Asset", "ADAUSDT 18R"},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "-364.162"},
{"Portfolio Turnover", "0.001"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "17f99ecc3f35f94fff1ea5694c40d32c"}
{"Portfolio Turnover", "0.12%"},
{"OrderListHash", "50a51d06d03a5355248a6bccef1ca521"}
};
}
}

View File

@@ -43,8 +43,8 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice data)
/// <param name="slice">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice slice)
{
if (!Portfolio.Invested)
{
@@ -61,65 +61,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 73;
public long DataPoints => 72;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "1"},
{"Total Orders", "1"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "246.546%"},
{"Drawdown", "1.200%"},
{"Compounding Annual Return", "424.375%"},
{"Drawdown", "0.800%"},
{"Expectancy", "0"},
{"Net Profit", "3.464%"},
{"Sharpe Ratio", "19.148"},
{"Probabilistic Sharpe Ratio", "97.754%"},
{"Start Equity", "100000"},
{"End Equity", "104486.22"},
{"Net Profit", "4.486%"},
{"Sharpe Ratio", "17.304"},
{"Sortino Ratio", "35.217"},
{"Probabilistic Sharpe Ratio", "96.835%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "-0.005"},
{"Beta", "0.998"},
{"Annual Standard Deviation", "0.138"},
{"Annual Variance", "0.019"},
{"Information Ratio", "-34.028"},
{"Tracking Error", "0"},
{"Treynor Ratio", "2.651"},
{"Total Fees", "$3.45"},
{"Estimated Strategy Capacity", "$970000000.00"},
{"Alpha", "-0.249"},
{"Beta", "1.015"},
{"Annual Standard Deviation", "0.141"},
{"Annual Variance", "0.02"},
{"Information Ratio", "-19"},
{"Tracking Error", "0.011"},
{"Treynor Ratio", "2.403"},
{"Total Fees", "$3.49"},
{"Estimated Strategy Capacity", "$1200000000.00"},
{"Lowest Capacity Asset", "SPY R735QTJ8XC9X"},
{"Fitness Score", "0.112"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "53.951"},
{"Return Over Maximum Drawdown", "209.464"},
{"Portfolio Turnover", "0.112"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "33d01821923c397f999cfb2e5b5928ad"}
{"Portfolio Turnover", "10.01%"},
{"OrderListHash", "70f21e930175a2ec9d465b21edc1b6d9"}
};
}
}

View File

@@ -0,0 +1,239 @@
/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
using System;
using System.Collections.Generic;
using QuantConnect.Data;
using QuantConnect.Data.UniverseSelection;
using QuantConnect.Interfaces;
using QuantConnect.Orders;
using QuantConnect.Securities;
using QuantConnect.Securities.Future;
namespace QuantConnect.Algorithm.CSharp
{
/// <summary>
/// This algorithm tests and demonstrates EUREX futures subscription and trading:
/// - It tests contracts rollover by adding a continuous future and asserting that mapping happens at some point.
/// - It tests basic trading by buying a contract and holding it until expiration.
/// - It tests delisting and asserts the holdings are liquidated after that.
/// </summary>
public class BasicTemplateEurexFuturesAlgorithm : QCAlgorithm, IRegressionAlgorithmDefinition
{
private Future _continuousContract;
private Symbol _mappedSymbol;
private Symbol _contractToTrade;
private int _mappingsCount;
private decimal _boughtQuantity;
private decimal _liquidatedQuantity;
private bool _delisted;
public override void Initialize()
{
SetStartDate(2024, 5, 30);
SetEndDate(2024, 6, 23);
SetAccountCurrency(Currencies.EUR);
SetCash(1000000);
_continuousContract = AddFuture(Futures.Indices.EuroStoxx50, Resolution.Minute,
dataNormalizationMode: DataNormalizationMode.BackwardsRatio,
dataMappingMode: DataMappingMode.FirstDayMonth,
contractDepthOffset: 0);
_continuousContract.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(180));
_mappedSymbol = _continuousContract.Mapped;
var benchmark = AddIndex("SX5E", market: Market.EUREX);
SetBenchmark(benchmark.Symbol);
var seeder = new FuncSecuritySeeder(GetLastKnownPrices);
SetSecurityInitializer(security => seeder.SeedSecurity(security));
}
public override void OnData(Slice slice)
{
foreach (var changedEvent in slice.SymbolChangedEvents.Values)
{
if (++_mappingsCount > 1)
{
throw new RegressionTestException($"{Time} - Unexpected number of symbol changed events (mappings): {_mappingsCount}. " +
$"Expected only 1.");
}
Debug($"{Time} - SymbolChanged event: {changedEvent}");
if (changedEvent.OldSymbol != _mappedSymbol.ID.ToString())
{
throw new RegressionTestException($"{Time} - Unexpected symbol changed event old symbol: {changedEvent}");
}
if (changedEvent.NewSymbol != _continuousContract.Mapped.ID.ToString())
{
throw new RegressionTestException($"{Time} - Unexpected symbol changed event new symbol: {changedEvent}");
}
// Let's trade the previous mapped contract, so we can hold it until expiration for testing
// (will be sooner than the new mapped contract)
_contractToTrade = _mappedSymbol;
_mappedSymbol = _continuousContract.Mapped;
}
// Let's trade after the mapping is done
if (_contractToTrade != null && _boughtQuantity == 0 && Securities[_contractToTrade].Exchange.ExchangeOpen)
{
Buy(_contractToTrade, 1);
}
if (_contractToTrade != null && slice.Delistings.TryGetValue(_contractToTrade, out var delisting))
{
if (delisting.Type == DelistingType.Delisted)
{
_delisted = true;
if (Portfolio.Invested)
{
throw new RegressionTestException($"{Time} - Portfolio should not be invested after the traded contract is delisted.");
}
}
}
}
public override void OnOrderEvent(OrderEvent orderEvent)
{
if (orderEvent.Symbol != _contractToTrade)
{
throw new RegressionTestException($"{Time} - Unexpected order event symbol: {orderEvent.Symbol}. Expected {_contractToTrade}");
}
if (orderEvent.Direction == OrderDirection.Buy)
{
if (orderEvent.Status == OrderStatus.Filled)
{
if (_boughtQuantity != 0 && _liquidatedQuantity != 0)
{
throw new RegressionTestException($"{Time} - Unexpected buy order event status: {orderEvent.Status}");
}
_boughtQuantity = orderEvent.Quantity;
}
}
else if (orderEvent.Direction == OrderDirection.Sell)
{
if (orderEvent.Status == OrderStatus.Filled)
{
if (_boughtQuantity <= 0 && _liquidatedQuantity != 0)
{
throw new RegressionTestException($"{Time} - Unexpected sell order event status: {orderEvent.Status}");
}
_liquidatedQuantity = orderEvent.Quantity;
if (_liquidatedQuantity != -_boughtQuantity)
{
throw new RegressionTestException($"{Time} - Unexpected liquidated quantity: {_liquidatedQuantity}. Expected: {-_boughtQuantity}");
}
}
}
}
public override void OnSecuritiesChanged(SecurityChanges changes)
{
foreach (var addedSecurity in changes.AddedSecurities)
{
if (addedSecurity.Symbol.SecurityType == SecurityType.Future && addedSecurity.Symbol.IsCanonical())
{
_mappedSymbol = _continuousContract.Mapped;
}
}
}
public override void OnEndOfAlgorithm()
{
if (_mappingsCount == 0)
{
throw new RegressionTestException($"Unexpected number of symbol changed events (mappings): {_mappingsCount}. Expected 1.");
}
if (!_delisted)
{
throw new RegressionTestException("Contract was not delisted");
}
// Make sure we traded and that the position was liquidated on delisting
if (_boughtQuantity <= 0 || _liquidatedQuantity >= 0)
{
throw new RegressionTestException($"Unexpected sold quantity: {_boughtQuantity} and liquidated quantity: {_liquidatedQuantity}");
}
}
/// <summary>
/// This is used by the regression test system to indicate if the open source Lean repository has the required data to run this algorithm.
/// </summary>
public bool CanRunLocally { get; } = true;
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 133945;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 26;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Orders", "2"},
{"Average Win", "0%"},
{"Average Loss", "-0.11%"},
{"Compounding Annual Return", "-1.667%"},
{"Drawdown", "0.100%"},
{"Expectancy", "-1"},
{"Start Equity", "1000000"},
{"End Equity", "998849.48"},
{"Net Profit", "-0.115%"},
{"Sharpe Ratio", "-34.455"},
{"Sortino Ratio", "-57.336"},
{"Probabilistic Sharpe Ratio", "0.002%"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "0"},
{"Beta", "0"},
{"Annual Standard Deviation", "0.002"},
{"Annual Variance", "0"},
{"Information Ratio", "-6.176"},
{"Tracking Error", "0.002"},
{"Treynor Ratio", "0"},
{"Total Fees", "€1.02"},
{"Estimated Strategy Capacity", "€2300000000.00"},
{"Lowest Capacity Asset", "FESX YJHOAMPYKRS5"},
{"Portfolio Turnover", "0.40%"},
{"OrderListHash", "54040d29a467becaedcf59d79323321b"}
};
}
}

View File

@@ -13,6 +13,7 @@
* limitations under the License.
*/
using QuantConnect.Data;
using QuantConnect.Data.Market;
namespace QuantConnect.Algorithm.CSharp
@@ -41,8 +42,8 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">TradeBars IDictionary object with your stock data</param>
public void OnData(TradeBars data)
/// <param name="slice">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice slice)
{
if (!Portfolio.Invested)
{

View File

@@ -1,4 +1,4 @@
/*
/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
@@ -59,14 +59,14 @@ namespace QuantConnect.Algorithm.CSharp
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
if (!Portfolio.Invested)
{
SetHoldings("EURUSD", .5);
SetHoldings("NZDUSD", .5);
Log(string.Join(", ", data.Values));
Log(string.Join(", ", slice.Values));
}
}
}
}
}

View File

@@ -82,7 +82,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public virtual Language[] Languages { get; } = { Language.CSharp, Language.Python };
public virtual List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -94,19 +94,27 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "3"},
{"Total Orders", "3"},
{"Average Win", "0%"},
{"Average Loss", "-1.01%"},
{"Compounding Annual Return", "261.134%"},
{"Drawdown", "2.200%"},
{"Expectancy", "-1"},
{"Start Equity", "100000"},
{"End Equity", "101655.30"},
{"Net Profit", "1.655%"},
{"Sharpe Ratio", "8.505"},
{"Sharpe Ratio", "8.472"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "66.840%"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
@@ -117,30 +125,12 @@ namespace QuantConnect.Algorithm.CSharp
{"Annual Variance", "0.05"},
{"Information Ratio", "-33.445"},
{"Tracking Error", "0.002"},
{"Treynor Ratio", "1.893"},
{"Treynor Ratio", "1.885"},
{"Total Fees", "$10.32"},
{"Estimated Strategy Capacity", "$27000000.00"},
{"Lowest Capacity Asset", "SPY R735QTJ8XC9X"},
{"Fitness Score", "0.747"},
{"Kelly Criterion Estimate", "38.796"},
{"Kelly Criterion Probability Value", "0.228"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "85.095"},
{"Portfolio Turnover", "0.747"},
{"Total Insights Generated", "100"},
{"Total Insights Closed", "99"},
{"Total Insights Analysis Completed", "99"},
{"Long Insight Count", "100"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$135639.1761"},
{"Total Accumulated Estimated Alpha Value", "$21852.9784"},
{"Mean Population Estimated Insight Value", "$220.7372"},
{"Mean Population Direction", "53.5354%"},
{"Mean Population Magnitude", "53.5354%"},
{"Rolling Averaged Population Direction", "58.2788%"},
{"Rolling Averaged Population Magnitude", "58.2788%"},
{"OrderListHash", "ad2216297c759d8e5aef48ff065f8919"}
{"Portfolio Turnover", "59.86%"},
{"OrderListHash", "f209ed42701b0419858e0100595b40c0"}
};
}
}

View File

@@ -92,4 +92,4 @@ namespace QuantConnect.Algorithm.CSharp
Debug($"{Time} {orderEvent.ToString()}");
}
}
}
}

View File

@@ -98,10 +98,10 @@ namespace QuantConnect.Algorithm.CSharp
{
private QCAlgorithm _algorithm;
private Future _future;
public ExponentialMovingAverage EMA;
public decimal Price;
public bool IsLong;
public bool IsShort;
public ExponentialMovingAverage EMA { get; set; }
public decimal Price { get; set; }
public bool IsLong { get; set; }
public bool IsShort { get; set; }
public Symbol Symbol => _future.Symbol;
public Symbol Mapped => _future.Mapped;
@@ -171,65 +171,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 1345;
public long DataPoints => 1190;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 4;
public int AlgorithmHistoryDataPoints => 2;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2"},
{"Average Win", "0.53%"},
{"Total Orders", "1"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "3.011%"},
{"Compounding Annual Return", "-0.010%"},
{"Drawdown", "0.000%"},
{"Expectancy", "0"},
{"Net Profit", "0.528%"},
{"Sharpe Ratio", "1.999"},
{"Probabilistic Sharpe Ratio", "83.704%"},
{"Start Equity", "1000000"},
{"End Equity", "999983.2"},
{"Net Profit", "-0.002%"},
{"Sharpe Ratio", "-225.214"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0.135%"},
{"Loss Rate", "0%"},
{"Win Rate", "100%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "0.023"},
{"Beta", "-0.004"},
{"Annual Standard Deviation", "0.011"},
{"Alpha", "-0.008"},
{"Beta", "0"},
{"Annual Standard Deviation", "0"},
{"Annual Variance", "0"},
{"Information Ratio", "-4.774"},
{"Tracking Error", "0.084"},
{"Treynor Ratio", "-4.853"},
{"Total Fees", "$4.30"},
{"Estimated Strategy Capacity", "$5900000000.00"},
{"Information Ratio", "-5.146"},
{"Tracking Error", "0.083"},
{"Treynor Ratio", "-542.359"},
{"Total Fees", "$2.15"},
{"Estimated Strategy Capacity", "$0"},
{"Lowest Capacity Asset", "ES VMKLFZIH2MTD"},
{"Fitness Score", "0.002"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "1792.236"},
{"Portfolio Turnover", "0.002"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "40e4b91ec89383f6501d9ba324e50eb9"}
{"Portfolio Turnover", "0.13%"},
{"OrderListHash", "273dd05b937c075b75baf8af46d3c7de"}
};
}
}

View File

@@ -39,11 +39,9 @@ namespace QuantConnect.Algorithm.CSharp
// S&P 500 EMini futures
private const string RootSP500 = Futures.Indices.SP500EMini;
public Symbol SP500 = QuantConnect.Symbol.Create(RootSP500, SecurityType.Future, Market.CME);
// Gold futures
private const string RootGold = Futures.Metals.Gold;
public Symbol Gold = QuantConnect.Symbol.Create(RootGold, SecurityType.Future, Market.COMEX);
/// <summary>
/// Initialize your algorithm and add desired assets.
@@ -81,7 +79,7 @@ namespace QuantConnect.Algorithm.CSharp
Debug($"{Time} - SymbolChanged event: {changedEvent}");
if (Time.TimeOfDay != TimeSpan.Zero)
{
throw new Exception($"{Time} unexpected symbol changed event {changedEvent}!");
throw new RegressionTestException($"{Time} unexpected symbol changed event {changedEvent}!");
}
}
@@ -117,7 +115,7 @@ namespace QuantConnect.Algorithm.CSharp
var futureMarginModel = buyingPowerModel as FutureMarginModel;
if (buyingPowerModel == null)
{
throw new Exception($"Invalid buying power model. Found: {buyingPowerModel.GetType().Name}. Expected: {nameof(FutureMarginModel)}");
throw new RegressionTestException($"Invalid buying power model. Found: {buyingPowerModel.GetType().Name}. Expected: {nameof(FutureMarginModel)}");
}
var initialOvernight = futureMarginModel.InitialOvernightMarginRequirement;
var maintenanceOvernight = futureMarginModel.MaintenanceOvernightMarginRequirement;
@@ -133,7 +131,7 @@ namespace QuantConnect.Algorithm.CSharp
&& !addedSecurity.Symbol.IsCanonical()
&& !addedSecurity.HasData)
{
throw new Exception($"Future contracts did not work up as expected: {addedSecurity.Symbol}");
throw new RegressionTestException($"Future contracts did not work up as expected: {addedSecurity.Symbol}");
}
}
}
@@ -146,65 +144,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 68645;
public long DataPoints => 75403;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 340;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2700"},
{"Total Orders", "2700"},
{"Average Win", "0.00%"},
{"Average Loss", "0.00%"},
{"Compounding Annual Return", "-99.777%"},
{"Drawdown", "4.400%"},
{"Expectancy", "-0.724"},
{"Start Equity", "1000000"},
{"End Equity", "955700.5"},
{"Net Profit", "-4.430%"},
{"Sharpe Ratio", "-31.389"},
{"Sharpe Ratio", "-31.63"},
{"Sortino Ratio", "-31.63"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "83%"},
{"Win Rate", "17%"},
{"Profit-Loss Ratio", "0.65"},
{"Alpha", "-3.059"},
{"Alpha", "-3.065"},
{"Beta", "0.128"},
{"Annual Standard Deviation", "0.031"},
{"Annual Variance", "0.001"},
{"Information Ratio", "-81.232"},
{"Tracking Error", "0.212"},
{"Treynor Ratio", "-7.618"},
{"Treynor Ratio", "-7.677"},
{"Total Fees", "$6237.00"},
{"Estimated Strategy Capacity", "$14000.00"},
{"Lowest Capacity Asset", "GC VOFJUCDY9XNH"},
{"Fitness Score", "0.001"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "-58.8"},
{"Return Over Maximum Drawdown", "-32.114"},
{"Portfolio Turnover", "98.477"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "8f92e1528c6477a156449fd1e86527e7"}
{"Portfolio Turnover", "9912.69%"},
{"OrderListHash", "6e0f767a46a54365287801295cf7bb75"}
};
}
}

View File

@@ -1,4 +1,4 @@
/*
/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
@@ -33,7 +33,6 @@ namespace QuantConnect.Algorithm.CSharp
public class BasicTemplateFuturesConsolidationAlgorithm : QCAlgorithm
{
private const string RootSP500 = Futures.Indices.SP500EMini;
public Symbol SP500 = QuantConnect.Symbol.Create(RootSP500, SecurityType.Future, Market.CME);
private HashSet<Symbol> _futureContracts = new HashSet<Symbol>();
public override void Initialize()
@@ -78,4 +77,4 @@ namespace QuantConnect.Algorithm.CSharp
Log(quoteBar.ToString());
}
}
}
}

View File

@@ -83,7 +83,7 @@ namespace QuantConnect.Algorithm.CSharp
// if found, trade it.
// Also check if exchange is open for regular or extended hours. Since daily data comes at 8PM, this allows us prevent the
// algorithm from trading on friday when there is not after-market.
if (contract != null && Securities[contract.Symbol].Exchange.Hours.IsOpen(Time, true))
if (contract != null)
{
MarketOrder(contract.Symbol, 1);
}
@@ -99,7 +99,7 @@ namespace QuantConnect.Algorithm.CSharp
{
if (Time.TimeOfDay != TimeSpan.Zero)
{
throw new Exception($"{Time} unexpected symbol changed event {changedEvent}!");
throw new RegressionTestException($"{Time} unexpected symbol changed event {changedEvent}!");
}
}
}
@@ -112,65 +112,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public virtual Language[] Languages { get; } = { Language.CSharp, Language.Python };
public virtual List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public virtual long DataPoints => 15217;
public virtual long DataPoints => 12452;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public virtual int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public virtual Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "118"},
{"Average Win", "0.09%"},
{"Average Loss", "-0.01%"},
{"Compounding Annual Return", "-0.479%"},
{"Drawdown", "0.500%"},
{"Expectancy", "-0.835"},
{"Net Profit", "-0.483%"},
{"Sharpe Ratio", "-1.938"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "98%"},
{"Win Rate", "2%"},
{"Profit-Loss Ratio", "8.76"},
{"Alpha", "-0.003"},
{"Beta", "-0.001"},
{"Annual Standard Deviation", "0.002"},
{"Total Orders", "32"},
{"Average Win", "0.33%"},
{"Average Loss", "-0.04%"},
{"Compounding Annual Return", "0.110%"},
{"Drawdown", "0.300%"},
{"Expectancy", "0.184"},
{"Start Equity", "1000000"},
{"End Equity", "1001108"},
{"Net Profit", "0.111%"},
{"Sharpe Ratio", "-1.688"},
{"Sortino Ratio", "-0.772"},
{"Probabilistic Sharpe Ratio", "14.944%"},
{"Loss Rate", "88%"},
{"Win Rate", "12%"},
{"Profit-Loss Ratio", "8.47"},
{"Alpha", "-0.007"},
{"Beta", "0.002"},
{"Annual Standard Deviation", "0.004"},
{"Annual Variance", "0"},
{"Information Ratio", "-1.397"},
{"Information Ratio", "-1.353"},
{"Tracking Error", "0.089"},
{"Treynor Ratio", "5.665"},
{"Total Fees", "$263.30"},
{"Estimated Strategy Capacity", "$1000.00"},
{"Treynor Ratio", "-4.099"},
{"Total Fees", "$72.00"},
{"Estimated Strategy Capacity", "$0"},
{"Lowest Capacity Asset", "ES VRJST036ZY0X"},
{"Fitness Score", "0.01"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "-1.059"},
{"Return Over Maximum Drawdown", "-0.992"},
{"Portfolio Turnover", "0.031"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "b75b224669c374dcbacc33f946a1cc7c"}
{"Portfolio Turnover", "0.87%"},
{"OrderListHash", "168731c8f3a19f230cc1410818b3b573"}
};
}
}

View File

@@ -131,65 +131,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public virtual Language[] Languages { get; } = { Language.CSharp, Language.Python };
public virtual List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public virtual long DataPoints => 43786;
public virtual long DataPoints => 57759;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public virtual int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public virtual Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2"},
{"Total Orders", "2"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "-81.734%"},
{"Drawdown", "4.100%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "97830.76"},
{"Net Profit", "-2.169%"},
{"Sharpe Ratio", "-10.195"},
{"Sharpe Ratio", "-10.299"},
{"Sortino Ratio", "-10.299"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "-1.206"},
{"Alpha", "-1.212"},
{"Beta", "0.238"},
{"Annual Standard Deviation", "0.072"},
{"Annual Variance", "0.005"},
{"Information Ratio", "-15.404"},
{"Tracking Error", "0.176"},
{"Treynor Ratio", "-3.077"},
{"Treynor Ratio", "-3.109"},
{"Total Fees", "$4.62"},
{"Estimated Strategy Capacity", "$17000000.00"},
{"Lowest Capacity Asset", "GC VL5E74HP3EE5"},
{"Fitness Score", "0.006"},
{"Kelly Criterion Estimate", "-50.022"},
{"Kelly Criterion Probability Value", "0.711"},
{"Sortino Ratio", "-10.107"},
{"Return Over Maximum Drawdown", "-51.815"},
{"Portfolio Turnover", "0.54"},
{"Total Insights Generated", "5"},
{"Total Insights Closed", "4"},
{"Total Insights Analysis Completed", "4"},
{"Long Insight Count", "5"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$-4434.791"},
{"Total Accumulated Estimated Alpha Value", "$-720.6535"},
{"Mean Population Estimated Insight Value", "$-180.1634"},
{"Mean Population Direction", "25%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "25%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "323b899ae80aa839e320806411665ce7"}
{"Portfolio Turnover", "43.23%"},
{"OrderListHash", "c0fc1bcdc3008a8d263521bbc9d7cdbd"}
};
}
}

View File

@@ -36,60 +36,45 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public override Language[] Languages { get; } = { Language.CSharp, Language.Python };
public override List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public override long DataPoints => 123753;
public override long DataPoints => 163415;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public override Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2"},
{"Total Orders", "2"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "-92.667%"},
{"Drawdown", "5.000%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "96685.76"},
{"Net Profit", "-3.314%"},
{"Sharpe Ratio", "-6.303"},
{"Sharpe Ratio", "-6.359"},
{"Sortino Ratio", "-11.237"},
{"Probabilistic Sharpe Ratio", "9.333%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "-1.465"},
{"Alpha", "-1.47"},
{"Beta", "0.312"},
{"Annual Standard Deviation", "0.134"},
{"Annual Variance", "0.018"},
{"Information Ratio", "-14.77"},
{"Tracking Error", "0.192"},
{"Treynor Ratio", "-2.718"},
{"Treynor Ratio", "-2.742"},
{"Total Fees", "$4.62"},
{"Estimated Strategy Capacity", "$52000000.00"},
{"Lowest Capacity Asset", "GC VL5E74HP3EE5"},
{"Fitness Score", "0.009"},
{"Kelly Criterion Estimate", "-112.972"},
{"Kelly Criterion Probability Value", "0.671"},
{"Sortino Ratio", "-8.421"},
{"Return Over Maximum Drawdown", "-35.2"},
{"Portfolio Turnover", "0.548"},
{"Total Insights Generated", "6"},
{"Total Insights Closed", "5"},
{"Total Insights Analysis Completed", "5"},
{"Long Insight Count", "6"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$-96.12923"},
{"Total Accumulated Estimated Alpha Value", "$-15.621"},
{"Mean Population Estimated Insight Value", "$-3.1242"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "18ffd3a774c68da83d867e3b09e3e05d"}
{"Portfolio Turnover", "43.77%"},
{"OrderListHash", "dcdaafcefa47465962ace2759ed99c91"}
};
}
}

View File

@@ -69,7 +69,7 @@ namespace QuantConnect.Algorithm.CSharp
var history = History(10, Resolution.Minute);
if (history.Count() < 10)
{
throw new Exception($"Empty history at {Time}");
throw new RegressionTestException($"Empty history at {Time}");
}
_successCount++;
}
@@ -78,7 +78,7 @@ namespace QuantConnect.Algorithm.CSharp
{
if (_successCount < ExpectedHistoryCallCount)
{
throw new Exception($"Scheduled Event did not assert history call as many times as expected: {_successCount}/49");
throw new RegressionTestException($"Scheduled Event did not assert history call as many times as expected: {_successCount}/49");
}
}
@@ -135,31 +135,39 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public virtual Language[] Languages { get; } = { Language.CSharp, Language.Python };
public virtual List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public virtual long DataPoints => 44184;
public virtual long DataPoints => 48690;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public virtual int AlgorithmHistoryDataPoints => 4818;
public virtual int AlgorithmHistoryDataPoints => 5305;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public virtual Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "0"},
{"Total Orders", "0"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "1000000"},
{"End Equity", "1000000"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
@@ -174,25 +182,7 @@ namespace QuantConnect.Algorithm.CSharp
{"Total Fees", "$0.00"},
{"Estimated Strategy Capacity", "$0"},
{"Lowest Capacity Asset", ""},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "79228162514264337593543950335"},
{"Portfolio Turnover", "0"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"Portfolio Turnover", "0%"},
{"OrderListHash", "d41d8cd98f00b204e9800998ecf8427e"}
};
}

View File

@@ -42,31 +42,39 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public override Language[] Languages { get; } = { Language.CSharp, Language.Python };
public override List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public override long DataPoints => 134096;
public override long DataPoints => 147771;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public override int AlgorithmHistoryDataPoints => 5539;
public override int AlgorithmHistoryDataPoints => 6112;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public override Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "0"},
{"Total Orders", "0"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "1000000"},
{"End Equity", "1000000"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
@@ -81,25 +89,7 @@ namespace QuantConnect.Algorithm.CSharp
{"Total Fees", "$0.00"},
{"Estimated Strategy Capacity", "$0"},
{"Lowest Capacity Asset", ""},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "79228162514264337593543950335"},
{"Portfolio Turnover", "0"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"Portfolio Turnover", "0%"},
{"OrderListHash", "d41d8cd98f00b204e9800998ecf8427e"}
};
}

View File

@@ -36,60 +36,45 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public override Language[] Languages { get; } = { Language.CSharp, Language.Python };
public override List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public override long DataPoints => 96027;
public override long DataPoints => 87289;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public override Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "638"},
{"Average Win", "0.02%"},
{"Total Orders", "716"},
{"Average Win", "0.03%"},
{"Average Loss", "-0.01%"},
{"Compounding Annual Return", "-1.610%"},
{"Drawdown", "1.600%"},
{"Expectancy", "-0.841"},
{"Net Profit", "-1.622%"},
{"Sharpe Ratio", "-5.105"},
{"Compounding Annual Return", "-1.716%"},
{"Drawdown", "1.700%"},
{"Expectancy", "-0.770"},
{"Start Equity", "1000000"},
{"End Equity", "982718.38"},
{"Net Profit", "-1.728%"},
{"Sharpe Ratio", "-8.845"},
{"Sortino Ratio", "-5.449"},
{"Probabilistic Sharpe Ratio", "0.000%"},
{"Loss Rate", "96%"},
{"Win Rate", "4%"},
{"Profit-Loss Ratio", "3.21"},
{"Alpha", "-0.01"},
{"Beta", "-0.003"},
{"Profit-Loss Ratio", "4.89"},
{"Alpha", "-0.018"},
{"Beta", "-0.002"},
{"Annual Standard Deviation", "0.002"},
{"Annual Variance", "0"},
{"Information Ratio", "-1.473"},
{"Information Ratio", "-1.483"},
{"Tracking Error", "0.089"},
{"Treynor Ratio", "3.179"},
{"Total Fees", "$1456.18"},
{"Estimated Strategy Capacity", "$6000.00"},
{"Treynor Ratio", "9.102"},
{"Total Fees", "$1634.12"},
{"Estimated Strategy Capacity", "$8000.00"},
{"Lowest Capacity Asset", "ES VP274HSU1AF5"},
{"Fitness Score", "0.045"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "-4.328"},
{"Return Over Maximum Drawdown", "-0.995"},
{"Portfolio Turnover", "0.205"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "8842e0b890f721371ebf3c25328dee5b"}
{"Portfolio Turnover", "20.10%"},
{"OrderListHash", "aa7e574f86b70428ca0afae381be80ba"}
};
}
}

View File

@@ -39,11 +39,9 @@ namespace QuantConnect.Algorithm.CSharp
// S&P 500 EMini futures
private const string RootSP500 = Futures.Indices.SP500EMini;
public Symbol SP500 = QuantConnect.Symbol.Create(RootSP500, SecurityType.Future, Market.CME);
// Gold futures
private const string RootGold = Futures.Metals.Gold;
public Symbol Gold = QuantConnect.Symbol.Create(RootGold, SecurityType.Future, Market.COMEX);
/// <summary>
/// Initialize your algorithm and add desired assets.
@@ -81,7 +79,7 @@ namespace QuantConnect.Algorithm.CSharp
Debug($"{Time} - SymbolChanged event: {changedEvent}");
if (Time.TimeOfDay != TimeSpan.Zero)
{
throw new Exception($"{Time} unexpected symbol changed event {changedEvent}!");
throw new RegressionTestException($"{Time} unexpected symbol changed event {changedEvent}!");
}
}
@@ -117,7 +115,7 @@ namespace QuantConnect.Algorithm.CSharp
var futureMarginModel = buyingPowerModel as FutureMarginModel;
if (buyingPowerModel == null)
{
throw new Exception($"Invalid buying power model. Found: {buyingPowerModel.GetType().Name}. Expected: {nameof(FutureMarginModel)}");
throw new RegressionTestException($"Invalid buying power model. Found: {buyingPowerModel.GetType().Name}. Expected: {nameof(FutureMarginModel)}");
}
var initialOvernight = futureMarginModel.InitialOvernightMarginRequirement;
var maintenanceOvernight = futureMarginModel.MaintenanceOvernightMarginRequirement;
@@ -133,7 +131,7 @@ namespace QuantConnect.Algorithm.CSharp
&& !addedSecurity.Symbol.IsCanonical()
&& !addedSecurity.HasData)
{
throw new Exception($"Future contracts did not work up as expected: {addedSecurity.Symbol}");
throw new RegressionTestException($"Future contracts did not work up as expected: {addedSecurity.Symbol}");
}
}
}
@@ -146,65 +144,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 204087;
public long DataPoints => 224662;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 340;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "8282"},
{"Total Orders", "8282"},
{"Average Win", "0.00%"},
{"Average Loss", "0.00%"},
{"Compounding Annual Return", "-100.000%"},
{"Drawdown", "13.900%"},
{"Expectancy", "-0.824"},
{"Start Equity", "1000000"},
{"End Equity", "861260.7"},
{"Net Profit", "-13.874%"},
{"Sharpe Ratio", "-19.202"},
{"Sharpe Ratio", "-19.346"},
{"Sortino Ratio", "-19.346"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "89%"},
{"Win Rate", "11%"},
{"Profit-Loss Ratio", "0.64"},
{"Alpha", "2.477"},
{"Alpha", "2.468"},
{"Beta", "-0.215"},
{"Annual Standard Deviation", "0.052"},
{"Annual Variance", "0.003"},
{"Information Ratio", "-58.37"},
{"Tracking Error", "0.295"},
{"Treynor Ratio", "4.66"},
{"Treynor Ratio", "4.695"},
{"Total Fees", "$19131.42"},
{"Estimated Strategy Capacity", "$130000.00"},
{"Lowest Capacity Asset", "GC VOFJUCDY9XNH"},
{"Fitness Score", "0.032"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "-9.217"},
{"Return Over Maximum Drawdown", "-7.692"},
{"Portfolio Turnover", "304.869"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "85cdd035d7c7a3da178d1c2dff31f1bd"}
{"Portfolio Turnover", "32523.20%"},
{"OrderListHash", "0664a72652a19956ea3c4915269cc4b9"}
};
}
}

View File

@@ -38,60 +38,45 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public override Language[] Languages { get; } = { Language.CSharp, Language.Python };
public override List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public override long DataPoints => 17431;
public override long DataPoints => 14790;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public override Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "152"},
{"Average Win", "0.09%"},
{"Average Loss", "-0.01%"},
{"Compounding Annual Return", "-0.644%"},
{"Drawdown", "0.600%"},
{"Expectancy", "-0.872"},
{"Net Profit", "-0.649%"},
{"Sharpe Ratio", "-2.343"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "99%"},
{"Win Rate", "1%"},
{"Profit-Loss Ratio", "8.76"},
{"Alpha", "-0.004"},
{"Beta", "-0.001"},
{"Annual Standard Deviation", "0.002"},
{"Total Orders", "36"},
{"Average Win", "0.33%"},
{"Average Loss", "-0.03%"},
{"Compounding Annual Return", "0.102%"},
{"Drawdown", "0.300%"},
{"Expectancy", "0.171"},
{"Start Equity", "1000000"},
{"End Equity", "1001024.4"},
{"Net Profit", "0.102%"},
{"Sharpe Ratio", "-1.702"},
{"Sortino Ratio", "-0.836"},
{"Probabilistic Sharpe Ratio", "14.653%"},
{"Loss Rate", "89%"},
{"Win Rate", "11%"},
{"Profit-Loss Ratio", "9.54"},
{"Alpha", "-0.007"},
{"Beta", "0.002"},
{"Annual Standard Deviation", "0.004"},
{"Annual Variance", "0"},
{"Information Ratio", "-1.409"},
{"Information Ratio", "-1.353"},
{"Tracking Error", "0.089"},
{"Treynor Ratio", "3.618"},
{"Total Fees", "$338.96"},
{"Estimated Strategy Capacity", "$1000.00"},
{"Treynor Ratio", "-4.126"},
{"Total Fees", "$80.60"},
{"Estimated Strategy Capacity", "$0"},
{"Lowest Capacity Asset", "ES VRJST036ZY0X"},
{"Fitness Score", "0.013"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "-1.464"},
{"Return Over Maximum Drawdown", "-0.992"},
{"Portfolio Turnover", "0.04"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "48bfc4d255420cb589e00cf582554e0a"}
{"Portfolio Turnover", "0.97%"},
{"OrderListHash", "52c852d720692fab1e12212b2aba03d4"}
};
}
}

View File

@@ -36,60 +36,45 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public override Language[] Languages { get; } = { Language.CSharp, Language.Python };
public override List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public override long DataPoints => 248521;
public override long DataPoints => 228834;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public override Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "1982"},
{"Total Orders", "1992"},
{"Average Win", "0.01%"},
{"Average Loss", "-0.01%"},
{"Compounding Annual Return", "-4.666%"},
{"Compounding Annual Return", "-4.687%"},
{"Drawdown", "4.700%"},
{"Expectancy", "-0.911"},
{"Net Profit", "-4.700%"},
{"Sharpe Ratio", "-5.792"},
{"Start Equity", "1000000"},
{"End Equity", "952789.22"},
{"Net Profit", "-4.721%"},
{"Sharpe Ratio", "-7.183"},
{"Sortino Ratio", "-5.14"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "97%"},
{"Win Rate", "3%"},
{"Profit-Loss Ratio", "2.04"},
{"Alpha", "-0.031"},
{"Alpha", "-0.038"},
{"Beta", "-0.008"},
{"Annual Standard Deviation", "0.005"},
{"Annual Variance", "0"},
{"Information Ratio", "-1.701"},
{"Information Ratio", "-1.702"},
{"Tracking Error", "0.09"},
{"Treynor Ratio", "4.096"},
{"Total Fees", "$4521.78"},
{"Estimated Strategy Capacity", "$2000.00"},
{"Treynor Ratio", "5.054"},
{"Total Fees", "$4543.28"},
{"Estimated Strategy Capacity", "$3000.00"},
{"Lowest Capacity Asset", "ES VP274HSU1AF5"},
{"Fitness Score", "0.131"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "-6.211"},
{"Return Over Maximum Drawdown", "-0.995"},
{"Portfolio Turnover", "0.649"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "2402a307b20aee195b77b8478d7ca64d"}
{"Portfolio Turnover", "56.73%"},
{"OrderListHash", "424536177e9be5895bab50638ef43a9d"}
};
}
}

View File

@@ -52,8 +52,8 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice data)
/// <param name="slice">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice slice)
{
if (!Portfolio.Invested)
{
@@ -70,7 +70,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
public List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -82,19 +82,27 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "1"},
{"Total Orders", "1"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "227.693%"},
{"Drawdown", "2.000%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "101529.08"},
{"Net Profit", "1.529%"},
{"Sharpe Ratio", "8.889"},
{"Sharpe Ratio", "8.855"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "67.609%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
@@ -105,30 +113,12 @@ namespace QuantConnect.Algorithm.CSharp
{"Annual Variance", "0.049"},
{"Information Ratio", "-14.564"},
{"Tracking Error", "0.001"},
{"Treynor Ratio", "1.978"},
{"Treynor Ratio", "1.971"},
{"Total Fees", "$3.44"},
{"Estimated Strategy Capacity", "$110000000.00"},
{"Lowest Capacity Asset", "SPY R735QTJ8XC9X"},
{"Fitness Score", "0.247"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "12.105"},
{"Return Over Maximum Drawdown", "112.047"},
{"Portfolio Turnover", "0.249"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "f409be3a7c63d9c1394c2e6c005a15ee"}
{"Portfolio Turnover", "19.96%"},
{"OrderListHash", "966f8355817adbc8c724d1062691a60b"}
};
}
}

View File

@@ -30,8 +30,8 @@ namespace QuantConnect.Algorithm.CSharp
/// <meta name="tag" content="indexes" />
public class BasicTemplateIndexAlgorithm : QCAlgorithm, IRegressionAlgorithmDefinition
{
protected Symbol Spx;
protected Symbol SpxOption;
protected Symbol Spx { get; set; }
protected Symbol SpxOption { get; set; }
private ExponentialMovingAverage _emaSlow;
private ExponentialMovingAverage _emaFast;
@@ -61,8 +61,10 @@ namespace QuantConnect.Algorithm.CSharp
AddIndexOptionContract(SpxOption, Resolution);
_emaSlow = EMA(Spx, 80);
_emaFast = EMA(Spx, 200);
_emaSlow = EMA(Spx, Resolution > Resolution.Minute ? 6 : 80);
_emaFast = EMA(Spx, Resolution > Resolution.Minute ? 2 : 200);
Settings.DailyPreciseEndTime = true;
}
/// <summary>
@@ -91,12 +93,25 @@ namespace QuantConnect.Algorithm.CSharp
}
}
/// <summary>
/// Asserts indicators are ready
/// </summary>
/// <exception cref="RegressionTestException"></exception>
protected void AssertIndicators()
{
if (!_emaSlow.IsReady || !_emaFast.IsReady)
{
throw new RegressionTestException("Indicators are not ready!");
}
}
public override void OnEndOfAlgorithm()
{
if (Portfolio[Spx].TotalSaleVolume > 0)
{
throw new Exception("Index is not tradable.");
throw new RegressionTestException("Index is not tradable.");
}
AssertIndicators();
}
/// <summary>
@@ -107,65 +122,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public virtual Language[] Languages { get; } = { Language.CSharp, Language.Python };
public virtual List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public virtual long DataPoints => 16690;
public virtual long DataPoints => 16199;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public virtual int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public virtual Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "4"},
{"Average Win", "0%"},
{"Average Loss", "-53.10%"},
{"Compounding Annual Return", "-92.544%"},
{"Drawdown", "10.100%"},
{"Expectancy", "-1"},
{"Net Profit", "-9.915%"},
{"Sharpe Ratio", "-3.845"},
{"Probabilistic Sharpe Ratio", "0.053%"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
{"Total Orders", "3"},
{"Average Win", "7.08%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "603.355%"},
{"Drawdown", "3.400%"},
{"Expectancy", "0"},
{"Start Equity", "1000000"},
{"End Equity", "1064395"},
{"Net Profit", "6.440%"},
{"Sharpe Ratio", "-4.563"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0.781%"},
{"Loss Rate", "0%"},
{"Win Rate", "100%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "-0.558"},
{"Beta", "0.313"},
{"Annual Standard Deviation", "0.112"},
{"Annual Variance", "0.013"},
{"Information Ratio", "-6.652"},
{"Tracking Error", "0.125"},
{"Treynor Ratio", "-1.379"},
{"Alpha", "-0.169"},
{"Beta", "0.073"},
{"Annual Standard Deviation", "0.028"},
{"Annual Variance", "0.001"},
{"Information Ratio", "-6.684"},
{"Tracking Error", "0.099"},
{"Treynor Ratio", "-1.771"},
{"Total Fees", "$0.00"},
{"Estimated Strategy Capacity", "$13000000.00"},
{"Estimated Strategy Capacity", "$3000.00"},
{"Lowest Capacity Asset", "SPX XL80P3GHDZXQ|SPX 31"},
{"Fitness Score", "0.039"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "-1.763"},
{"Return Over Maximum Drawdown", "-9.371"},
{"Portfolio Turnover", "0.278"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "3b71b146c15d234b4dc9e201838b551c"}
{"Portfolio Turnover", "23.97%"},
{"OrderListHash", "51f1bc2ea080df79748dc66c2520b782"}
};
}
}

View File

@@ -1,6 +1,24 @@
/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
using System;
using System.Collections.Generic;
using System.Linq;
using QuantConnect.Data;
using System.Collections.Generic;
using QuantConnect.Data.Market;
namespace QuantConnect.Algorithm.CSharp
{
@@ -12,9 +30,9 @@ namespace QuantConnect.Algorithm.CSharp
protected override Resolution Resolution => Resolution.Daily;
protected override int StartDay => 1;
// two complete weeks starting from the 5th plus the 18th bar
protected virtual int ExpectedBarCount => 2 * 5 + 1;
protected int BarCounter = 0;
// two complete weeks starting from the 5th. The 18th bar is not included since it is a holiday
protected virtual int ExpectedBarCount => 2 * 5;
protected int BarCounter { get; set; }
/// <summary>
/// Purchase a contract when we are not invested, liquidate otherwise
@@ -44,6 +62,35 @@ namespace QuantConnect.Algorithm.CSharp
{
throw new ArgumentException($"Bar Count {BarCounter} is not expected count of {ExpectedBarCount}");
}
AssertIndicators();
if (Resolution != Resolution.Daily)
{
return;
}
var openInterest = Securities[SpxOption].Cache.GetAll<OpenInterest>();
if (openInterest.Single().EndTime != new DateTime(2021, 1, 15, 23, 0, 0))
{
throw new ArgumentException($"Unexpected open interest time: {openInterest.Single().EndTime}");
}
foreach (var symbol in new[] { SpxOption, Spx })
{
var history = History(symbol, 10).ToList();
if (history.Count != 10)
{
throw new RegressionTestException($"Unexpected history count: {history.Count}");
}
if (history.Any(x => x.Time.TimeOfDay != new TimeSpan(8, 30, 0)))
{
throw new RegressionTestException($"Unexpected history data start time");
}
if (history.Any(x => x.EndTime.TimeOfDay != new TimeSpan(15, 15, 0)))
{
throw new RegressionTestException($"Unexpected history data end time");
}
}
}
/// <summary>
@@ -54,65 +101,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public override Language[] Languages { get; } = { Language.CSharp };
public override List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public override long DataPoints => 122;
public override long DataPoints => 121;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public override int AlgorithmHistoryDataPoints => 0;
public override int AlgorithmHistoryDataPoints => 30;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public override Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "9"},
{"Total Orders", "11"},
{"Average Win", "0%"},
{"Average Loss", "-39.42%"},
{"Compounding Annual Return", "394.321%"},
{"Drawdown", "0.200%"},
{"Expectancy", "-1"},
{"Net Profit", "8.219%"},
{"Sharpe Ratio", "6.812"},
{"Probabilistic Sharpe Ratio", "91.380%"},
{"Loss Rate", "100%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "621.484%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "1000000"},
{"End Equity", "1084600"},
{"Net Profit", "8.460%"},
{"Sharpe Ratio", "9.923"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "93.682%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "2.236"},
{"Beta", "-1.003"},
{"Annual Standard Deviation", "0.317"},
{"Annual Variance", "0.101"},
{"Information Ratio", "5.805"},
{"Tracking Error", "0.359"},
{"Treynor Ratio", "-2.153"},
{"Alpha", "3.61"},
{"Beta", "-0.513"},
{"Annual Standard Deviation", "0.359"},
{"Annual Variance", "0.129"},
{"Information Ratio", "8.836"},
{"Tracking Error", "0.392"},
{"Treynor Ratio", "-6.937"},
{"Total Fees", "$0.00"},
{"Estimated Strategy Capacity", "$0"},
{"Lowest Capacity Asset", "SPX XL80P3GHDZXQ|SPX 31"},
{"Fitness Score", "0.027"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "1776.081"},
{"Portfolio Turnover", "0.027"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "0ee6860210d55051c38e494bd24bb6de"}
{"Portfolio Turnover", "2.42%"},
{"OrderListHash", "61e8517ac3da6bed414ef23d26736fef"}
};
}
}

View File

@@ -18,65 +18,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public override Language[] Languages { get; } = { Language.CSharp };
public override List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public override long DataPoints => 408;
public override long DataPoints => 401;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public override int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public override Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "70"},
{"Average Win", "0%"},
{"Average Loss", "-0.23%"},
{"Compounding Annual Return", "-34.441%"},
{"Drawdown", "2.000%"},
{"Expectancy", "-1"},
{"Net Profit", "-2.028%"},
{"Sharpe Ratio", "-11.139"},
{"Probabilistic Sharpe Ratio", "0.000%"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "-0.269"},
{"Beta", "0.086"},
{"Annual Standard Deviation", "0.023"},
{"Annual Variance", "0.001"},
{"Information Ratio", "-3.624"},
{"Tracking Error", "0.094"},
{"Treynor Ratio", "-3.042"},
{"Total Orders", "81"},
{"Average Win", "1.28%"},
{"Average Loss", "-0.06%"},
{"Compounding Annual Return", "-20.546%"},
{"Drawdown", "1.800%"},
{"Expectancy", "-0.402"},
{"Start Equity", "1000000"},
{"End Equity", "990775"},
{"Net Profit", "-0.922%"},
{"Sharpe Ratio", "-2.903"},
{"Sortino Ratio", "-6.081"},
{"Probabilistic Sharpe Ratio", "22.230%"},
{"Loss Rate", "97%"},
{"Win Rate", "3%"},
{"Profit-Loss Ratio", "19.95"},
{"Alpha", "-0.157"},
{"Beta", "0.025"},
{"Annual Standard Deviation", "0.053"},
{"Annual Variance", "0.003"},
{"Information Ratio", "-2.07"},
{"Tracking Error", "0.121"},
{"Treynor Ratio", "-6.189"},
{"Total Fees", "$0.00"},
{"Estimated Strategy Capacity", "$310000.00"},
{"Estimated Strategy Capacity", "$300000.00"},
{"Lowest Capacity Asset", "SPX XL80P3GHDZXQ|SPX 31"},
{"Fitness Score", "0.002"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "-14.51"},
{"Return Over Maximum Drawdown", "-17.213"},
{"Portfolio Turnover", "0.299"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "0c74daf716d7782a7e89c7a0ea57856f"}
{"Portfolio Turnover", "24.63%"},
{"OrderListHash", "44325fc1fdebb8e54f64a3f6e8a4bcd7"}
};
}
}

View File

@@ -14,7 +14,6 @@
*
*/
using System;
using QuantConnect.Data;
using System.Collections.Generic;
using QuantConnect.Indicators;
@@ -48,8 +47,10 @@ namespace QuantConnect.Algorithm.CSharp
var spxOptions = AddIndexOption(_spx, Resolution);
spxOptions.SetFilter(filterFunc => filterFunc.CallsOnly());
_emaSlow = EMA(_spx, 80);
_emaFast = EMA(_spx, 200);
_emaSlow = EMA(_spx, Resolution > Resolution.Minute ? 6 : 80);
_emaFast = EMA(_spx, Resolution > Resolution.Minute ? 2 : 200);
Settings.DailyPreciseEndTime = true;
}
/// <summary>
@@ -102,12 +103,13 @@ namespace QuantConnect.Algorithm.CSharp
{
if (Portfolio[_spx].TotalSaleVolume > 0)
{
throw new Exception("Index is not tradable.");
throw new RegressionTestException("Index is not tradable.");
}
if (Portfolio.TotalSaleVolume == 0)
{
throw new Exception("Trade volume should be greater than zero by the end of this algorithm");
throw new RegressionTestException("Trade volume should be greater than zero by the end of this algorithm");
}
AssertIndicators();
}
public Symbol InvertOption(Symbol symbol)
@@ -121,6 +123,18 @@ namespace QuantConnect.Algorithm.CSharp
symbol.ID.Date);
}
/// <summary>
/// Asserts indicators are ready
/// </summary>
/// <exception cref="RegressionTestException"></exception>
protected void AssertIndicators()
{
if (!_emaSlow.IsReady || !_emaFast.IsReady)
{
throw new RegressionTestException("Indicators are not ready!");
}
}
/// <summary>
/// This is used by the regression test system to indicate if the open source Lean repository has the required data to run this algorithm.
/// </summary>
@@ -129,7 +143,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public virtual Language[] Languages { get; } = { Language.CSharp, Language.Python };
public virtual List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -141,12 +155,17 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public virtual int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public virtual Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "8220"},
{"Total Orders", "8220"},
{"Average Win", "0.00%"},
{"Average Loss", "0.00%"},
{"Compounding Annual Return", "-100.000%"},

View File

@@ -14,10 +14,9 @@
*
*/
using System;
using System.Collections.Generic;
using System.Linq;
using QuantConnect.Data;
using System.Collections.Generic;
namespace QuantConnect.Algorithm.CSharp
{
@@ -63,65 +62,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public override Language[] Languages { get; } = { Language.CSharp };
public override List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public override long DataPoints => 381;
public override long DataPoints => 356;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public override int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public override Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "9"},
{"Total Orders", "11"},
{"Average Win", "0%"},
{"Average Loss", "-0.01%"},
{"Compounding Annual Return", "-0.091%"},
{"Compounding Annual Return", "-0.092%"},
{"Drawdown", "0.000%"},
{"Expectancy", "-1"},
{"Start Equity", "1000000"},
{"End Equity", "999920"},
{"Net Profit", "-0.008%"},
{"Sharpe Ratio", "-4.033"},
{"Sharpe Ratio", "-19.865"},
{"Sortino Ratio", "-175397.15"},
{"Probabilistic Sharpe Ratio", "0.013%"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "-0.001"},
{"Alpha", "-0.003"},
{"Beta", "0"},
{"Annual Standard Deviation", "0"},
{"Annual Variance", "0"},
{"Information Ratio", "-0.447"},
{"Tracking Error", "0.136"},
{"Treynor Ratio", "-4.612"},
{"Information Ratio", "-0.454"},
{"Tracking Error", "0.138"},
{"Treynor Ratio", "-44.954"},
{"Total Fees", "$0.00"},
{"Estimated Strategy Capacity", "$0"},
{"Lowest Capacity Asset", "SPX XL80P59H5E6M|SPX 31"},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "-50718.291"},
{"Return Over Maximum Drawdown", "-11.386"},
{"Portfolio Turnover", "0"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "607d309c5fb52a8b88310720b4a867e1"}
{"Portfolio Turnover", "0.00%"},
{"OrderListHash", "285cec32c0947f0e8cf90ccb672cfa43"}
};
}
}

View File

@@ -33,65 +33,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public override Language[] Languages { get; } = { Language.CSharp };
public override List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public override long DataPoints => 2212;
public override long DataPoints => 1269;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public override int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public override Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "70"},
{"Total Orders", "81"},
{"Average Win", "0.00%"},
{"Average Loss", "0.00%"},
{"Compounding Annual Return", "0%"},
{"Compounding Annual Return", "-0.006%"},
{"Drawdown", "0.000%"},
{"Expectancy", "0.000"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Probabilistic Sharpe Ratio", "36.504%"},
{"Expectancy", "-0.486"},
{"Start Equity", "1000000"},
{"End Equity", "999995"},
{"Net Profit", "0.000%"},
{"Sharpe Ratio", "-101.77"},
{"Sortino Ratio", "-9053542.758"},
{"Probabilistic Sharpe Ratio", "17.439%"},
{"Loss Rate", "97%"},
{"Win Rate", "3%"},
{"Profit-Loss Ratio", "34.00"},
{"Alpha", "0"},
{"Profit-Loss Ratio", "17.50"},
{"Alpha", "-0.003"},
{"Beta", "-0"},
{"Annual Standard Deviation", "0"},
{"Annual Variance", "0"},
{"Information Ratio", "-0.449"},
{"Tracking Error", "0.138"},
{"Treynor Ratio", "-0"},
{"Treynor Ratio", "116.921"},
{"Total Fees", "$0.00"},
{"Estimated Strategy Capacity", "$0"},
{"Lowest Capacity Asset", "SPX XL80P59H5E6M|SPX 31"},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "0"},
{"Portfolio Turnover", "0"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "cc19277c90eb3b1f1e09ee15dfa7029b"}
{"Portfolio Turnover", "0.00%"},
{"OrderListHash", "75e6584cb26058b09720c3a828b9fbda"}
};
}
}

View File

@@ -56,7 +56,7 @@ namespace QuantConnect.Algorithm.CSharp
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
if (!Portfolio.Invested)
{
@@ -80,7 +80,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -92,19 +92,27 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "1"},
{"Total Orders", "1"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "-0.010%"},
{"Drawdown", "0.000%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "99992.45"},
{"Net Profit", "-0.008%"},
{"Sharpe Ratio", "-1.183"},
{"Sharpe Ratio", "-497.389"},
{"Sortino Ratio", "-73.22"},
{"Probabilistic Sharpe Ratio", "0.001%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
@@ -119,26 +127,8 @@ namespace QuantConnect.Algorithm.CSharp
{"Total Fees", "₹6.00"},
{"Estimated Strategy Capacity", "₹61000000000.00"},
{"Lowest Capacity Asset", "YESBANK UL"},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "-0.247"},
{"Return Over Maximum Drawdown", "-1.104"},
{"Portfolio Turnover", "0"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "₹0"},
{"Total Accumulated Estimated Alpha Value", "₹0"},
{"Mean Population Estimated Insight Value", "₹0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "6cc69218edd7bd461678b9ee0c575db5"}
{"Portfolio Turnover", "0.00%"},
{"OrderListHash", "7a0257f08e3bb9143b825e07ab47fea0"}
};
}
}

View File

@@ -31,8 +31,8 @@ namespace QuantConnect.Algorithm.CSharp
/// <meta name="tag" content="indexes" />
public class BasicTemplateIndiaIndexAlgorithm : QCAlgorithm, IRegressionAlgorithmDefinition
{
protected Symbol Nifty;
protected Symbol NiftyETF;
protected Symbol Nifty { get; set; }
protected Symbol NiftyETF { get; set; }
private ExponentialMovingAverage _emaSlow;
private ExponentialMovingAverage _emaFast;
@@ -92,7 +92,7 @@ namespace QuantConnect.Algorithm.CSharp
{
if (Portfolio[Nifty].TotalSaleVolume > 0)
{
throw new Exception("Index is not tradable.");
throw new RegressionTestException("Index is not tradable.");
}
}
@@ -104,7 +104,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public virtual Language[] Languages { get; } = { Language.CSharp, Language.Python };
public virtual List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
@@ -116,19 +116,27 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public virtual Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "6"},
{"Total Orders", "6"},
{"Average Win", "0%"},
{"Average Loss", "0.00%"},
{"Compounding Annual Return", "-0.395%"},
{"Compounding Annual Return", "-0.386%"},
{"Drawdown", "0.000%"},
{"Expectancy", "-1"},
{"Start Equity", "1000000"},
{"End Equity", "999961.17"},
{"Net Profit", "-0.004%"},
{"Sharpe Ratio", "-23.595"},
{"Sharpe Ratio", "-328.371"},
{"Sortino Ratio", "-328.371"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
@@ -141,28 +149,10 @@ namespace QuantConnect.Algorithm.CSharp
{"Tracking Error", "0"},
{"Treynor Ratio", "0"},
{"Total Fees", "₹36.00"},
{"Estimated Strategy Capacity", "₹74000.00"},
{"Estimated Strategy Capacity", "₹84000.00"},
{"Lowest Capacity Asset", "JUNIORBEES UL"},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "-29.6"},
{"Return Over Maximum Drawdown", "-123.624"},
{"Portfolio Turnover", "0"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "₹0"},
{"Total Accumulated Estimated Alpha Value", "₹0"},
{"Mean Population Estimated Insight Value", "₹0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "4637f26543287548b28a3c296db055d3"}
{"Portfolio Turnover", "0.04%"},
{"OrderListHash", "79ab9ec506959c562be8b3cdbb174c39"}
};
}
}

View File

@@ -32,8 +32,8 @@ namespace QuantConnect.Algorithm.CSharp
public class BasicTemplateIntrinioEconomicData : QCAlgorithm
{
// Set your Intrinio user and password.
public string _user = "";
public string _password = "";
private string _user = string.Empty;
private string _password = string.Empty;
private Symbol _uso; // United States Oil Fund LP
private Symbol _bno; // United States Brent Oil Fund LP
@@ -81,9 +81,9 @@ namespace QuantConnect.Algorithm.CSharp
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
var customData = data.Get<IntrinioEconomicData>();
var customData = slice.Get<IntrinioEconomicData>();
if (customData.Count == 0) return;
foreach (var economicData in customData.Values)
@@ -116,7 +116,7 @@ namespace QuantConnect.Algorithm.CSharp
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "91"},
{"Total Orders", "91"},
{"Average Win", "0.09%"},
{"Average Loss", "-0.01%"},
{"Compounding Annual Return", "5.732%"},

View File

@@ -32,7 +32,7 @@ namespace QuantConnect.Algorithm.CSharp
/// <meta name="tag" content="trading and orders" />
public class BasicTemplateOptionEquityStrategyAlgorithm : QCAlgorithm, IRegressionAlgorithmDefinition
{
protected Symbol _optionSymbol;
private Symbol _optionSymbol;
public override void Initialize()
{
@@ -97,31 +97,39 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 884208;
public long DataPoints => 15023;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "3"},
{"Total Orders", "3"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "98024"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
@@ -133,29 +141,11 @@ namespace QuantConnect.Algorithm.CSharp
{"Information Ratio", "0"},
{"Tracking Error", "0"},
{"Treynor Ratio", "0"},
{"Total Fees", "$7.50"},
{"Estimated Strategy Capacity", "$84000.00"},
{"Total Fees", "$26.00"},
{"Estimated Strategy Capacity", "$69000.00"},
{"Lowest Capacity Asset", "GOOCV W78ZERHAOVVQ|GOOCV VP83T1ZUHROL"},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "0"},
{"Return Over Maximum Drawdown", "0"},
{"Portfolio Turnover", "0"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "92610619a10e30863020cc84aa30be3b"}
{"Portfolio Turnover", "61.31%"},
{"OrderListHash", "35d406df401e5b27244e20f5ec57346e"}
};
}
}

View File

@@ -107,31 +107,39 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp };
public List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 884616;
public long DataPoints => 15130;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "778"},
{"Total Orders", "420"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "1000000"},
{"End Equity", "952636.6"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
@@ -143,29 +151,11 @@ namespace QuantConnect.Algorithm.CSharp
{"Information Ratio", "0"},
{"Tracking Error", "0"},
{"Treynor Ratio", "0"},
{"Total Fees", "$778.00"},
{"Estimated Strategy Capacity", "$1000.00"},
{"Total Fees", "$543.40"},
{"Estimated Strategy Capacity", "$4000.00"},
{"Lowest Capacity Asset", "GOOCV W78ZFMEBBB2E|GOOCV VP83T1ZUHROL"},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "0"},
{"Return Over Maximum Drawdown", "0"},
{"Portfolio Turnover", "0"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "c9e110f2122451dabefcfe24287cadcf"}
{"Portfolio Turnover", "338.60%"},
{"OrderListHash", "301c15063f6e269023d144ca69a765da"}
};
}
}

View File

@@ -35,7 +35,7 @@ namespace QuantConnect.Algorithm.CSharp
public class BasicTemplateOptionsAlgorithm : QCAlgorithm, IRegressionAlgorithmDefinition
{
private const string UnderlyingTicker = "GOOG";
public Symbol OptionSymbol;
private Symbol _optionSymbol;
public override void Initialize()
{
@@ -45,7 +45,7 @@ namespace QuantConnect.Algorithm.CSharp
var equity = AddEquity(UnderlyingTicker);
var option = AddOption(UnderlyingTicker);
OptionSymbol = option.Symbol;
_optionSymbol = option.Symbol;
// set our strike/expiry filter for this option chain
option.SetFilter(u => u.Strikes(-2, +2)
@@ -64,10 +64,10 @@ namespace QuantConnect.Algorithm.CSharp
/// <param name="slice">The current slice of data keyed by symbol string</param>
public override void OnData(Slice slice)
{
if (!Portfolio.Invested && IsMarketOpen(OptionSymbol))
if (!Portfolio.Invested && IsMarketOpen(_optionSymbol))
{
OptionChain chain;
if (slice.OptionChains.TryGetValue(OptionSymbol, out chain))
if (slice.OptionChains.TryGetValue(_optionSymbol, out chain))
{
// we find at the money (ATM) put contract with farthest expiration
var atmContract = chain
@@ -104,31 +104,39 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 884197;
public long DataPoints => 15012;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2"},
{"Total Orders", "2"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "100000"},
{"End Equity", "99718"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
@@ -143,26 +151,8 @@ namespace QuantConnect.Algorithm.CSharp
{"Total Fees", "$2.00"},
{"Estimated Strategy Capacity", "$1300000.00"},
{"Lowest Capacity Asset", "GOOCV 30AKMEIPOSS1Y|GOOCV VP83T1ZUHROL"},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "0"},
{"Return Over Maximum Drawdown", "0"},
{"Portfolio Turnover", "0"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "9d9f9248ee8fe30d87ff0a6f6fea5112"}
{"Portfolio Turnover", "10.71%"},
{"OrderListHash", "8a36462ee0349c04d01d464e592dd347"}
};
}
}

View File

@@ -0,0 +1,151 @@
/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
using QuantConnect.Data;
using QuantConnect.Data.Consolidators;
using QuantConnect.Data.Market;
using QuantConnect.Data.UniverseSelection;
using QuantConnect.Interfaces;
using System;
using System.Collections.Generic;
namespace QuantConnect.Algorithm.CSharp
{
/// <summary>
/// A demonstration of consolidating options data into larger bars for your algorithm.
/// </summary>
public class BasicTemplateOptionsConsolidationAlgorithm: QCAlgorithm, IRegressionAlgorithmDefinition
{
private Dictionary<Symbol, IDataConsolidator> _consolidators = new();
public override void Initialize()
{
SetStartDate(2013, 10, 7);
SetEndDate(2013, 10, 11);
SetCash(1000000);
var option = AddOption("SPY");
option.SetFilter(-2, 2, 0, 189);
}
public void OnQuoteBarConsolidated(object sender, QuoteBar quoteBar)
{
Log($"OnQuoteBarConsolidated called on {Time}");
Log(quoteBar.ToString());
}
public void OnTradeBarConsolidated(object sender, TradeBar tradeBar)
{
Log($"OnTradeBarConsolidated called on {Time}");
Log(tradeBar.ToString());
}
public override void OnSecuritiesChanged(SecurityChanges changes)
{
foreach(var security in changes.AddedSecurities)
{
IDataConsolidator consolidator;
if (security.Type == SecurityType.Equity)
{
consolidator = new TradeBarConsolidator(TimeSpan.FromMinutes(5));
(consolidator as TradeBarConsolidator).DataConsolidated += OnTradeBarConsolidated;
}
else
{
consolidator = new QuoteBarConsolidator(new TimeSpan(0, 5, 0));
(consolidator as QuoteBarConsolidator).DataConsolidated += OnQuoteBarConsolidated;
}
SubscriptionManager.AddConsolidator(security.Symbol, consolidator);
_consolidators[security.Symbol] = consolidator;
}
foreach(var security in changes.RemovedSecurities)
{
_consolidators.Remove(security.Symbol, out var consolidator);
SubscriptionManager.RemoveConsolidator(security.Symbol, consolidator);
if (security.Type == SecurityType.Equity)
{
(consolidator as TradeBarConsolidator).DataConsolidated -= OnTradeBarConsolidated;
}
else
{
(consolidator as QuoteBarConsolidator).DataConsolidated -= OnQuoteBarConsolidated;
}
}
}
/// <summary>
/// This is used by the regression test system to indicate if the open source Lean repository has the required data to run this algorithm.
/// </summary>
public bool CanRunLocally { get; } = true;
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 3943;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Orders", "0"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "0%"},
{"Expectancy", "0"},
{"Start Equity", "1000000"},
{"End Equity", "1000000"},
{"Net Profit", "0%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "0"},
{"Beta", "0"},
{"Annual Standard Deviation", "0"},
{"Annual Variance", "0"},
{"Information Ratio", "-8.91"},
{"Tracking Error", "0.223"},
{"Treynor Ratio", "0"},
{"Total Fees", "$0.00"},
{"Estimated Strategy Capacity", "$0"},
{"Lowest Capacity Asset", ""},
{"Portfolio Turnover", "0%"},
{"OrderListHash", "d41d8cd98f00b204e9800998ecf8427e"}
};
}
}

View File

@@ -34,21 +34,21 @@ namespace QuantConnect.Algorithm.CSharp
/// <meta name="tag" content="filter selection" />
public class BasicTemplateOptionsDailyAlgorithm : QCAlgorithm, IRegressionAlgorithmDefinition
{
private const string UnderlyingTicker = "GOOG";
public Symbol OptionSymbol;
private const string UnderlyingTicker = "AAPL";
private Symbol _optionSymbol;
private bool _optionExpired;
public override void Initialize()
{
SetStartDate(2015, 12, 23);
SetEndDate(2016, 1, 20);
SetStartDate(2015, 12, 15);
SetEndDate(2016, 2, 1);
SetCash(100000);
var equity = AddEquity(UnderlyingTicker, Resolution.Daily);
var option = AddOption(UnderlyingTicker, Resolution.Daily);
OptionSymbol = option.Symbol;
_optionSymbol = option.Symbol;
option.SetFilter(x => x.CallsOnly().Strikes(0, 1).Expiration(0, 30));
option.SetFilter(x => x.CallsOnly().Expiration(0, 60));
// use the underlying equity as the benchmark
SetBenchmark(equity.Symbol);
@@ -63,13 +63,13 @@ namespace QuantConnect.Algorithm.CSharp
if (!Portfolio.Invested)
{
OptionChain chain;
if (slice.OptionChains.TryGetValue(OptionSymbol, out chain))
if (slice.OptionChains.TryGetValue(_optionSymbol, out chain))
{
// Grab us the contract nearest expiry that is not today
var contractsByExpiration = chain.Where(x => x.Expiry != Time.Date).OrderBy(x => x.Expiry);
var contract = contractsByExpiration.FirstOrDefault();
if (contract != null && IsMarketOpen(contract.Symbol))
if (contract != null)
{
// if found, trade it
MarketOrder(contract.Symbol, 1);
@@ -117,65 +117,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 39654;
public long DataPoints => 308;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2"},
{"Total Orders", "2"},
{"Average Win", "0%"},
{"Average Loss", "-1.31%"},
{"Compounding Annual Return", "-15.304%"},
{"Drawdown", "1.300%"},
{"Average Loss", "-1.16%"},
{"Compounding Annual Return", "-8.351%"},
{"Drawdown", "1.200%"},
{"Expectancy", "-1"},
{"Net Profit", "-1.311%"},
{"Sharpe Ratio", "-3.31"},
{"Probabilistic Sharpe Ratio", "0.035%"},
{"Start Equity", "100000"},
{"End Equity", "98844"},
{"Net Profit", "-1.156%"},
{"Sharpe Ratio", "-4.04"},
{"Sortino Ratio", "-2.422"},
{"Probabilistic Sharpe Ratio", "0.099%"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "0"},
{"Beta", "0"},
{"Annual Standard Deviation", "0.034"},
{"Annual Variance", "0.001"},
{"Information Ratio", "-3.31"},
{"Tracking Error", "0.034"},
{"Treynor Ratio", "0"},
{"Alpha", "-0.058"},
{"Beta", "0.021"},
{"Annual Standard Deviation", "0.017"},
{"Annual Variance", "0"},
{"Information Ratio", "1.49"},
{"Tracking Error", "0.289"},
{"Treynor Ratio", "-3.212"},
{"Total Fees", "$1.00"},
{"Estimated Strategy Capacity", "$18000.00"},
{"Lowest Capacity Asset", "GOOCV W78ZFMML01JA|GOOCV VP83T1ZUHROL"},
{"Fitness Score", "0"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "-1.496"},
{"Return Over Maximum Drawdown", "-11.673"},
{"Portfolio Turnover", "0"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "0b52bbe98ade8e3aab943e64fcf4abfe"}
{"Estimated Strategy Capacity", "$72000.00"},
{"Lowest Capacity Asset", "AAPL W78ZEO2985GM|AAPL R735QTJ8XC9X"},
{"Portfolio Turnover", "0.02%"},
{"OrderListHash", "b3125e0af79da0f5eea4cfda09806324"}
};
}
}

View File

@@ -14,7 +14,6 @@
*
*/
using System;
using System.Collections.Generic;
using System.Linq;
using QuantConnect.Data;
@@ -36,7 +35,7 @@ namespace QuantConnect.Algorithm.CSharp
public class BasicTemplateOptionsFilterUniverseAlgorithm : QCAlgorithm, IRegressionAlgorithmDefinition
{
private const string UnderlyingTicker = "GOOG";
public Symbol OptionSymbol;
private Symbol _optionSymbol;
public override void Initialize()
{
@@ -46,7 +45,7 @@ namespace QuantConnect.Algorithm.CSharp
var equity = AddEquity(UnderlyingTicker);
var option = AddOption(UnderlyingTicker);
OptionSymbol = option.Symbol;
_optionSymbol = option.Symbol;
// Set our custom universe filter, Expires today, is a call, and is within 10 dollars of the current price
option.SetFilter(universe => from symbol in universe.WeeklysOnly().Expiration(0, 1)
@@ -64,7 +63,7 @@ namespace QuantConnect.Algorithm.CSharp
if (!Portfolio.Invested)
{
OptionChain chain;
if (slice.OptionChains.TryGetValue(OptionSymbol, out chain))
if (slice.OptionChains.TryGetValue(_optionSymbol, out chain))
{
// Get the first ITM call expiring today
var contract = (
@@ -95,31 +94,39 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 1722373;
public long DataPoints => 12290;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2"},
{"Total Orders", "2"},
{"Average Win", "0%"},
{"Average Loss", "-0.40%"},
{"Compounding Annual Return", "-21.622%"},
{"Compounding Annual Return", "-20.338%"},
{"Drawdown", "0.300%"},
{"Expectancy", "-1"},
{"Start Equity", "100000"},
{"End Equity", "99689"},
{"Net Profit", "-0.311%"},
{"Sharpe Ratio", "0"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
@@ -134,26 +141,8 @@ namespace QuantConnect.Algorithm.CSharp
{"Total Fees", "$1.00"},
{"Estimated Strategy Capacity", "$0"},
{"Lowest Capacity Asset", "GOOCV VP83T1ZUHROL"},
{"Fitness Score", "0.188"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "-73.268"},
{"Portfolio Turnover", "0.376"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "0f8537495f5744c02191656d6b3f9205"}
{"Portfolio Turnover", "15.08%"},
{"OrderListHash", "db6a1134ad325bce31c2bdd2e87ff5f4"}
};
}
}

View File

@@ -134,65 +134,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 990979;
public long DataPoints => 17486;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "4"},
{"Average Win", "0.14%"},
{"Average Loss", "-0.28%"},
{"Compounding Annual Return", "0%"},
{"Drawdown", "385.400%"},
{"Expectancy", "-0.249"},
{"Net Profit", "-386.489%"},
{"Sharpe Ratio", "-0.033"},
{"Probabilistic Sharpe Ratio", "1.235%"},
{"Loss Rate", "50%"},
{"Win Rate", "50%"},
{"Profit-Loss Ratio", "0.50"},
{"Alpha", "-95.983"},
{"Beta", "263.726"},
{"Annual Standard Deviation", "30.617"},
{"Annual Variance", "937.371"},
{"Information Ratio", "-0.044"},
{"Tracking Error", "30.604"},
{"Treynor Ratio", "-0.004"},
{"Total Fees", "$3.00"},
{"Total Orders", "5"},
{"Average Win", "0.13%"},
{"Average Loss", "-0.30%"},
{"Compounding Annual Return", "-46.395%"},
{"Drawdown", "1.600%"},
{"Expectancy", "0.429"},
{"Start Equity", "100000"},
{"End Equity", "99149.50"},
{"Net Profit", "-0.850%"},
{"Sharpe Ratio", "-4.298"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "15.319%"},
{"Loss Rate", "0%"},
{"Win Rate", "100%"},
{"Profit-Loss Ratio", "0.43"},
{"Alpha", "-0.84"},
{"Beta", "0.986"},
{"Annual Standard Deviation", "0.098"},
{"Annual Variance", "0.01"},
{"Information Ratio", "-9.299"},
{"Tracking Error", "0.091"},
{"Treynor Ratio", "-0.428"},
{"Total Fees", "$4.00"},
{"Estimated Strategy Capacity", "$0"},
{"Lowest Capacity Asset", "AAPL R735QTJ8XC9X"},
{"Fitness Score", "0.168"},
{"Kelly Criterion Estimate", "0.327"},
{"Kelly Criterion Probability Value", "1"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "0"},
{"Portfolio Turnover", "0.224"},
{"Total Insights Generated", "28"},
{"Total Insights Closed", "24"},
{"Total Insights Analysis Completed", "24"},
{"Long Insight Count", "28"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$13.64796"},
{"Total Accumulated Estimated Alpha Value", "$1.89555"},
{"Mean Population Estimated Insight Value", "$0.07898125"},
{"Mean Population Direction", "50%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "50.0482%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "83c9fb13ee32284702779eff8d11c608"}
{"Portfolio Turnover", "13.50%"},
{"OrderListHash", "cf14a7ce9c86e6844051820fd4c9394c"}
};
}
}

View File

@@ -35,7 +35,7 @@ namespace QuantConnect.Algorithm.CSharp
public class BasicTemplateOptionsHourlyAlgorithm : QCAlgorithm, IRegressionAlgorithmDefinition
{
private const string UnderlyingTicker = "AAPL";
public Symbol OptionSymbol;
private Symbol _optionSymbol;
public override void Initialize()
{
@@ -45,7 +45,7 @@ namespace QuantConnect.Algorithm.CSharp
var equity = AddEquity(UnderlyingTicker, Resolution.Hour);
var option = AddOption(UnderlyingTicker, Resolution.Hour);
OptionSymbol = option.Symbol;
_optionSymbol = option.Symbol;
// set our strike/expiry filter for this option chain
option.SetFilter(u => u.Strikes(-2, +2)
@@ -64,10 +64,10 @@ namespace QuantConnect.Algorithm.CSharp
/// <param name="slice">The current slice of data keyed by symbol string</param>
public override void OnData(Slice slice)
{
if (!Portfolio.Invested && IsMarketOpen(OptionSymbol))
if (!Portfolio.Invested && IsMarketOpen(_optionSymbol))
{
OptionChain chain;
if (slice.OptionChains.TryGetValue(OptionSymbol, out chain))
if (slice.OptionChains.TryGetValue(_optionSymbol, out chain))
{
// we find at the money (ATM) put contract with farthest expiration
var atmContract = chain
@@ -104,65 +104,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
public List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public long DataPoints => 32492;
public long DataPoints => 9504;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "4"},
{"Total Orders", "5"},
{"Average Win", "0%"},
{"Average Loss", "-0.07%"},
{"Compounding Annual Return", "-12.496%"},
{"Compounding Annual Return", "-11.517%"},
{"Drawdown", "0.200%"},
{"Expectancy", "-1"},
{"Start Equity", "100000"},
{"End Equity", "99866"},
{"Net Profit", "-0.134%"},
{"Sharpe Ratio", "-8.839"},
{"Sharpe Ratio", "-9.78"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "0.083"},
{"Alpha", "0.075"},
{"Beta", "-0.054"},
{"Annual Standard Deviation", "0.008"},
{"Annual Variance", "0"},
{"Information Ratio", "-18.699"},
{"Tracking Error", "0.155"},
{"Treynor Ratio", "1.296"},
{"Treynor Ratio", "1.434"},
{"Total Fees", "$4.00"},
{"Estimated Strategy Capacity", "$1000.00"},
{"Lowest Capacity Asset", "AAPL 2ZTXYMUAHCIAU|AAPL R735QTJ8XC9X"},
{"Fitness Score", "0.04"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "-118.28"},
{"Portfolio Turnover", "0.081"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "81e8a822d43de2165c1d3f52964ec312"}
{"Portfolio Turnover", "2.28%"},
{"OrderListHash", "7804b3dcf20d3096a2265a289fa81cd3"}
};
}
}

View File

@@ -43,14 +43,12 @@ namespace QuantConnect.Algorithm.CSharp
SetEndDate(2021, 1, 10);
SetCash(1000000);
var spx = AddIndex("SPX").Symbol;
// regular option SPX contracts
var spxOptions = AddIndexOption(spx);
var spxOptions = AddIndexOption("SPX");
spxOptions.SetFilter(u => u.Strikes(0, 1).Expiration(0, 30));
// weekly option SPX contracts
var spxw = AddIndexOption(spx, "SPXW");
var spxw = AddIndexOption("SPX", "SPXW");
spxw.SetFilter(u => u.Strikes(0, 1)
// single week ahead since there are many SPXW contracts and we want to preserve performance
.Expiration(0, 7)
@@ -100,65 +98,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public virtual Language[] Languages { get; } = { Language.CSharp, Language.Python };
public virtual List<Language> Languages { get; } = new() { Language.CSharp, Language.Python };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public virtual long DataPoints => 65830;
public virtual long DataPoints => 21467;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public virtual int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public virtual Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "5"},
{"Total Orders", "5"},
{"Average Win", "0%"},
{"Average Loss", "-0.75%"},
{"Compounding Annual Return", "44.538%"},
{"Drawdown", "0.500%"},
{"Expectancy", "-1"},
{"Net Profit", "0.474%"},
{"Sharpe Ratio", "-12.503"},
{"Probabilistic Sharpe Ratio", "0%"},
{"Loss Rate", "100%"},
{"Win Rate", "0%"},
{"Average Loss", "-0.69%"},
{"Compounding Annual Return", "54.478%"},
{"Drawdown", "0.400%"},
{"Expectancy", "-0.5"},
{"Start Equity", "1000000"},
{"End Equity", "1006025"},
{"Net Profit", "0.602%"},
{"Sharpe Ratio", "2.62"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "63.221%"},
{"Loss Rate", "50%"},
{"Win Rate", "50%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "0.846"},
{"Beta", "-0.141"},
{"Annual Standard Deviation", "0.013"},
{"Alpha", "0.067"},
{"Beta", "-0.013"},
{"Annual Standard Deviation", "0.004"},
{"Annual Variance", "0"},
{"Information Ratio", "-91.834"},
{"Tracking Error", "0.08"},
{"Treynor Ratio", "1.143"},
{"Information Ratio", "-50.808"},
{"Tracking Error", "0.086"},
{"Treynor Ratio", "-0.725"},
{"Total Fees", "$0.00"},
{"Estimated Strategy Capacity", "$7500000.00"},
{"Estimated Strategy Capacity", "$580000.00"},
{"Lowest Capacity Asset", "SPXW 31K54PVWHUJHQ|SPX 31"},
{"Fitness Score", "0.006"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "48.874"},
{"Return Over Maximum Drawdown", "332.561"},
{"Portfolio Turnover", "0.006"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "846032599f3c31838f5fe6c63ec12d3c"}
{"Portfolio Turnover", "0.40%"},
{"OrderListHash", "07a085baedb37bb7c8d460558ea77e88"}
};
}
}

View File

@@ -48,7 +48,7 @@ namespace QuantConnect.Algorithm.CSharp
// weekly option SPX contracts
var spxw = AddIndexOption(spx, "SPXW");
spxw.SetFilter(u => u.Strikes(0, 1)
spxw.SetFilter(u => u.Strikes(-1, +1)
// single week ahead since there are many SPXW contracts and we want to preserve performance
.Expiration(0, 7)
.IncludeWeeklys());
@@ -66,7 +66,7 @@ namespace QuantConnect.Algorithm.CSharp
OptionChain chain;
if (slice.OptionChains.TryGetValue(_spxOption, out chain))
{
// we find the first expiration group of call options and order them in ascending strike
// we find the first expiration group of call options and order them in ascending strike
var contracts = chain
.Where(x => x.Right == OptionRight.Call)
.OrderBy(x => x.Expiry)
@@ -92,7 +92,7 @@ namespace QuantConnect.Algorithm.CSharp
Debug(orderEvent.ToString());
if (orderEvent.Symbol.ID.Symbol != "SPXW")
{
throw new Exception("Unexpected order event symbol!");
throw new RegressionTestException("Unexpected order event symbol!");
}
}
@@ -104,65 +104,55 @@ namespace QuantConnect.Algorithm.CSharp
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public virtual Language[] Languages { get; } = { Language.CSharp };
public virtual List<Language> Languages { get; } = new() { Language.CSharp };
/// <summary>
/// Data Points count of all timeslices of algorithm
/// </summary>
public virtual long DataPoints => 35611;
public virtual long DataPoints => 16680;
/// <summary>
/// Data Points count of the algorithm history
/// </summary>
public virtual int AlgorithmHistoryDataPoints => 0;
/// <summary>
/// Final status of the algorithm
/// </summary>
public AlgorithmStatus AlgorithmStatus => AlgorithmStatus.Completed;
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public virtual Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "4"},
{"Average Win", "0.46%"},
{"Average Loss", "0.00%"},
{"Compounding Annual Return", "42.201%"},
{"Total Orders", "10"},
{"Average Win", "0.47%"},
{"Average Loss", "-0.01%"},
{"Compounding Annual Return", "101.998%"},
{"Drawdown", "0.100%"},
{"Expectancy", "115.281"},
{"Net Profit", "0.452%"},
{"Sharpe Ratio", "7.967"},
{"Probabilistic Sharpe Ratio", "95.977%"},
{"Expectancy", "24.484"},
{"Start Equity", "1000000"},
{"End Equity", "1009050"},
{"Net Profit", "0.905%"},
{"Sharpe Ratio", "8.44"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "95.546%"},
{"Loss Rate", "50%"},
{"Win Rate", "50%"},
{"Profit-Loss Ratio", "231.56"},
{"Alpha", "0.029"},
{"Beta", "-0.003"},
{"Annual Standard Deviation", "0.001"},
{"Profit-Loss Ratio", "49.97"},
{"Alpha", "-2.01"},
{"Beta", "0.307"},
{"Annual Standard Deviation", "0.021"},
{"Annual Variance", "0"},
{"Information Ratio", "-102.62"},
{"Tracking Error", "0.07"},
{"Treynor Ratio", "-2.462"},
{"Information Ratio", "-144.654"},
{"Tracking Error", "0.048"},
{"Treynor Ratio", "0.589"},
{"Total Fees", "$0.00"},
{"Estimated Strategy Capacity", "$4100000.00"},
{"Estimated Strategy Capacity", "$13000000.00"},
{"Lowest Capacity Asset", "SPXW XKX6S2GM9PGU|SPX 31"},
{"Fitness Score", "0.001"},
{"Kelly Criterion Estimate", "0"},
{"Kelly Criterion Probability Value", "0"},
{"Sortino Ratio", "79228162514264337593543950335"},
{"Return Over Maximum Drawdown", "79228162514264337593543950335"},
{"Portfolio Turnover", "0.001"},
{"Total Insights Generated", "0"},
{"Total Insights Closed", "0"},
{"Total Insights Analysis Completed", "0"},
{"Long Insight Count", "0"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$0"},
{"Total Accumulated Estimated Alpha Value", "$0"},
{"Mean Population Estimated Insight Value", "$0"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"},
{"OrderListHash", "4b25b40cc766201845f66b3b613d1444"}
{"Portfolio Turnover", "0.28%"},
{"OrderListHash", "c1a9bc141ae25c9542b93a887e79dafe"}
};
}
}

View File

@@ -0,0 +1,95 @@
/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
using System;
using QuantConnect.Data;
using System.Collections.Generic;
using QuantConnect.Orders;
using System.Linq;
namespace QuantConnect.Algorithm.CSharp
{
/// <summary>
/// This example demonstrates how to add index asset types and change the tradable condition
/// </summary>
/// <meta name="tag" content="using data" />
/// <meta name="tag" content="benchmarks" />
/// <meta name="tag" content="indexes" />
public class BasicTemplateTradableIndexAlgorithm : BasicTemplateIndexAlgorithm
{
private OrderTicket _ticket;
/// <summary>
/// Initialize your algorithm and add desired assets.
/// </summary>
public override void Initialize()
{
base.Initialize();
Securities[Spx].IsTradable = true;
}
/// <summary>
/// Index EMA Cross trading underlying.
/// </summary>
public override void OnData(Slice slice)
{
base.OnData(slice);
_ticket ??= MarketOrder(Spx, 1);
}
public override void OnEndOfAlgorithm()
{
if (!_ticket.Status.IsFill())
{
throw new RegressionTestException("Index is tradable.");
}
}
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public override Dictionary<string, string> ExpectedStatistics => new()
{
{"Total Orders", "5"},
{"Average Win", "7.08%"},
{"Average Loss", "-0.01%"},
{"Compounding Annual Return", "602.278%"},
{"Drawdown", "3.400%"},
{"Expectancy", "677.669"},
{"Start Equity", "1000000"},
{"End Equity", "1064342.82"},
{"Net Profit", "6.434%"},
{"Sharpe Ratio", "-4.563"},
{"Sortino Ratio", "0"},
{"Probabilistic Sharpe Ratio", "0.781%"},
{"Loss Rate", "50%"},
{"Win Rate", "50%"},
{"Profit-Loss Ratio", "1356.34"},
{"Alpha", "-0.169"},
{"Beta", "0.073"},
{"Annual Standard Deviation", "0.028"},
{"Annual Variance", "0.001"},
{"Information Ratio", "-6.684"},
{"Tracking Error", "0.099"},
{"Treynor Ratio", "-1.771"},
{"Total Fees", "$0.00"},
{"Estimated Strategy Capacity", "$3000.00"},
{"Lowest Capacity Asset", "SPX XL80P3GHDZXQ|SPX 31"},
{"Portfolio Turnover", "24.03%"},
{"OrderListHash", "fcd6fddb0a315e21095c2b35eb633e2b"}
};
}
}

View File

@@ -33,7 +33,7 @@ namespace QuantConnect.Algorithm.CSharp.Benchmarks
AddEquity("SPY");
}
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
if (!Portfolio.Invested)
{

View File

@@ -15,6 +15,7 @@
using System.Collections.Generic;
using System.Linq;
using QuantConnect.Data;
using QuantConnect.Data.Fundamental;
using QuantConnect.Data.Market;
using QuantConnect.Data.UniverseSelection;
@@ -68,8 +69,8 @@ namespace QuantConnect.Algorithm.CSharp.Benchmarks
return topFine.Select(x => x.Symbol);
}
//Data Event Handler: New data arrives here. "TradeBars" type is a dictionary of strings so you can access it by symbol.
public void OnData(TradeBars data)
//Data Event Handler: New data arrives here.
public override void OnData(Slice slice)
{
// if we have no changes, do nothing
if (_changes == SecurityChanges.None) return;

View File

@@ -64,7 +64,7 @@ namespace QuantConnect.Algorithm.CSharp.Benchmarks
"OSCR", "WOLF", "SYF", "GOGL", "HES", "PHM", "CWEB", "ALDX", "BTWN", "AFL", "PPL", "CIM"
};
Settings.DataSubscriptionLimit = 1000000;
SetWarmUp(TimeSpan.FromDays(1));
foreach(var ticker in equity_symbols)
{

View File

@@ -32,7 +32,7 @@ namespace QuantConnect.Algorithm.CSharp.Benchmarks
AddEquity("SPY", Resolution.Second);
}
public override void OnData(Slice data)
public override void OnData(Slice slice)
{
}
}

Some files were not shown because too many files have changed in this diff Show More