Explore Enterprise Education Gitee Premium Gitee AI AI teammates
Fetch the repository succeeded.
Donate
Please sign in before you donate.
Scan WeChat QR to Pay
Cancel
Complete
Prompt
Switch to Alipay.
OK
Cancel
1 Star 0 Fork 0

boxigg/Lean

Create your Gitee Account
Explore and code with more than 14 million developers,Free private repositories !:)
Sign up
Already have an account? Sign in
文件
master
Branches (15)
Tags (4153)
master
copilot/find-syntax-test-issue
dynamic-cache-mock-20230220
bug-milk-class-3-future-options-expiration
bug-buying-power-model-convergence
ccxt-pro-integration
feature-ib-fa-groups
feature-python-dataframe-performance-2
feature-notebook-engine
bug-4764-option-auto-exercise-early-market-close-regression-algorithm
equity-taq-wip
performance-nary-tree-synchronizer
feature-optimize-python-load
feature-1093-vwap-order-type
desktop-mk-ii
17757
17758
17755
17756
17752
17753
17754
17749
17750
17751
17746
17747
17748
17735
17736
17737
17738
17739
17740
17741
master
Branches (15)
Tags (4153)
master
copilot/find-syntax-test-issue
dynamic-cache-mock-20230220
bug-milk-class-3-future-options-expiration
bug-buying-power-model-convergence
ccxt-pro-integration
feature-ib-fa-groups
feature-python-dataframe-performance-2
feature-notebook-engine
bug-4764-option-auto-exercise-early-market-close-regression-algorithm
equity-taq-wip
performance-nary-tree-synchronizer
feature-optimize-python-load
feature-1093-vwap-order-type
desktop-mk-ii
17757
17758
17755
17756
17752
17753
17754
17749
17750
17751
17746
17747
17748
17735
17736
17737
17738
17739
17740
17741
Clone or Download
Clone/Download
Prompt
To download the code, please copy the following command and execute it in the terminal
To ensure that your submitted code identity is correctly recognized by Gitee, please execute the following command.
When using the SSH protocol for the first time to clone or push code, follow the prompts below to complete the SSH configuration.
1 Generate RSA keys.
2 Obtain the content of the RSA public key and configure it in SSH Public Keys
To use SVN on Gitee, please visit the usage guide
When using the HTTPS protocol, the command line will prompt for account and password verification as follows. For security reasons, Gitee recommends configure and use personal access tokens instead of login passwords for cloning, pushing, and other operations.
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # Private Token
master
Branches (15)
Tags (4153)
master
copilot/find-syntax-test-issue
dynamic-cache-mock-20230220
bug-milk-class-3-future-options-expiration
bug-buying-power-model-convergence
ccxt-pro-integration
feature-ib-fa-groups
feature-python-dataframe-performance-2
feature-notebook-engine
bug-4764-option-auto-exercise-early-market-close-regression-algorithm
equity-taq-wip
performance-nary-tree-synchronizer
feature-optimize-python-load
feature-1093-vwap-order-type
desktop-mk-ii
17757
17758
17755
17756
17752
17753
17754
17749
17750
17751
17746
17747
17748
17735
17736
17737
17738
17739
17740
17741
Lean
/
Algorithm.Python
/
ComboOrdersFillModelAlgorithm.py
Lean
/
Algorithm.Python
/
ComboOrdersFillModelAlgorithm.py
ComboOrdersFillModelAlgorithm.py 6.08 KB
Copy Edit Raw Blame History
Louis Szeto authored 2025年04月14日 20:43 +08:00 . Fix bug/syntax in python examples (#8658)
# 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.
from AlgorithmImports import *
### <summary>
### Basic template algorithm that implements a fill model with combo orders
### <meta name="tag" content="trading and orders" />
### </summary>
class ComboOrdersFillModelAlgorithm(QCAlgorithm):
'''Basic template algorithm that implements a fill model with combo orders'''
def initialize(self) -> None:
self.set_start_date(2019, 1, 1)
self.set_end_date(2019, 1, 20)
self.spy = self.add_equity("SPY", Resolution.HOUR)
self.ibm = self.add_equity("IBM", Resolution.HOUR)
# Set the fill model
self.spy.set_fill_model(CustomPartialFillModel())
self.ibm.set_fill_model(CustomPartialFillModel())
self._order_types = {}
def on_data(self, data: Slice) -> None:
if not self.portfolio.invested:
legs = [Leg.create(self.spy.symbol, 1), Leg.create(self.ibm.symbol, -1)]
self.combo_market_order(legs, 100)
self.combo_limit_order(legs, 100, round(self.spy.bid_price))
legs = [Leg.create(self.spy.symbol, 1, round(self.spy.bid_price) + 1), Leg.create(self.ibm.symbol, -1, round(self.ibm.bid_price) + 1)]
self.combo_leg_limit_order(legs, 100)
def on_order_event(self, order_event: OrderEvent) -> None:
if order_event.status == OrderStatus.FILLED:
order_type = self.transactions.get_order_by_id(order_event.order_id).type
if order_type == OrderType.COMBO_MARKET and order_event.absolute_fill_quantity != 50:
raise AssertionError(f"The absolute quantity filled for all combo market orders should be 50, but for order {order_event.order_id} was {order_event.absolute_fill_quantity}")
elif order_type == OrderType.COMBO_LIMIT and order_event.absolute_fill_quantity != 20:
raise AssertionError(f"The absolute quantity filled for all combo limit orders should be 20, but for order {order_event.order_id} was {order_event.absolute_fill_quantity}")
elif order_type == OrderType.COMBO_LEG_LIMIT and order_event.absolute_fill_quantity != 10:
raise AssertionError(f"The absolute quantity filled for all combo leg limit orders should be 10, but for order {order_event.order_id} was {order_event.absolute_fill_quantity}")
self._order_types[order_type] = 1
def on_end_of_algorithm(self) -> None:
if len(self._order_types) != 3:
raise AssertionError(f"Just 3 different types of order were submitted in this algorithm, but the amount of order types was {len(self._order_types)}")
if OrderType.COMBO_MARKET not in self._order_types.keys():
raise AssertionError(f"One Combo Market Order should have been submitted but it was not")
if OrderType.COMBO_LIMIT not in self._order_types.keys():
raise AssertionError(f"One Combo Limit Order should have been submitted but it was not")
if OrderType.COMBO_LEG_LIMIT not in self._order_types.keys():
raise AssertionError(f"One Combo Leg Limit Order should have been submitted but it was not")
class CustomPartialFillModel(FillModel):
'''Implements a custom fill model that inherit from FillModel. Overrides combo_market_fill, combo_limit_fill and combo_leg_limit_fill
methods to test FillModelPythonWrapper works as expected'''
def __init__(self) -> None:
self.absolute_remaining_by_order_id = {}
def fill_orders_partially(self, parameters: FillModelParameters, fills: list[OrderEvent], quantity: int) -> list[OrderEvent]:
partial_fills = []
if len(fills) == 0:
return partial_fills
for kvp, fill in zip(sorted(parameters.securities_for_orders, key=lambda x: x.key.id), fills):
order = kvp.key
absolute_remaining = self.absolute_remaining_by_order_id.get(order.id, order.absolute_quantity)
# Set the fill amount
fill.fill_quantity = np.sign(order.quantity) * quantity
if (min(abs(fill.fill_quantity), absolute_remaining) == absolute_remaining):
fill.fill_quantity = np.sign(order.quantity) * absolute_remaining
fill.status = OrderStatus.FILLED
self.absolute_remaining_by_order_id.pop(order.id, None)
else:
fill.status = OrderStatus.PARTIALLY_FILLED
self.absolute_remaining_by_order_id[order.id] = absolute_remaining - abs(fill.fill_quantity)
price = fill.fill_price
# self.algorithm.debug(f"{self.algorithm.time} - Partial Fill - Remaining {self.absolute_remaining_by_order_id[order.id]} Price - {price}")
partial_fills.append(fill)
return partial_fills
def combo_market_fill(self, order: Order, parameters: FillModelParameters) -> list[OrderEvent]:
fills = super().combo_market_fill(order, parameters)
partial_fills = self.fill_orders_partially(parameters, fills, 50)
return partial_fills
def combo_limit_fill(self, order: Order, parameters: FillModelParameters) -> list[OrderEvent]:
fills = super().combo_limit_fill(order, parameters)
partial_fills = self.fill_orders_partially(parameters, fills, 20)
return partial_fills
def combo_leg_limit_fill(self, order: Order, parameters: FillModelParameters) -> list[OrderEvent]:
fills = super().combo_leg_limit_fill(order, parameters)
partial_fills = self.fill_orders_partially(parameters, fills, 10)
return partial_fills
Loading...
Report
Report success
We will send you the feedback within 2 working days through the letter!
Please fill in the reason for the report carefully. Provide as detailed a description as possible.
Please select a report type
Cancel
Send
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

Releases

No release

Contributors

All

Activities

can not load any more
Edit
About
Homepage
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C#
1
https://gitee.com/boxigg/Lean.git
git@gitee.com:boxigg/Lean.git
boxigg
Lean
Lean
master
Going to Help Center

Search

Comment
Repository Report
Back to the top
Login prompt
This operation requires login to the code cloud account. Please log in before operating.
Go to login
No account. Register

AltStyle によって変換されたページ (->オリジナル) /