Lean  $LEAN_TAG$
CharlesSchwabFeeModel.cs
1 /*
2  * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
3  * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  *
15 */
16 
17 
18 using System;
20 
22 {
23  /// <summary>
24  /// Represents a fee model specific to Charles Schwab.
25  /// </summary>
26  /// <see href="https://www.schwab.com/pricing"/>
28  {
29  /// <summary>
30  /// The exchange processing fee for standard option securities.
31  /// </summary>
32  private const decimal _optionIndexFee = 1m;
33 
34  /// <summary>
35  /// Represents the fee associated with equity options transactions (per contract).
36  /// </summary>
37  private const decimal _optionFee = 0.65m;
38 
39  /// <summary>
40  /// Calculates the order fee based on the security type and order parameters.
41  /// </summary>
42  /// <param name="parameters">The parameters for the order fee calculation, which include security and order details.</param>
43  /// <returns>
44  /// An <see cref="OrderFee"/> instance representing the calculated order fee.
45  /// </returns>
46  /// <exception cref="ArgumentNullException">
47  /// Thrown when <paramref name="parameters"/> is <c>null</c>.
48  /// </exception>
49  public override OrderFee GetOrderFee(OrderFeeParameters parameters)
50  {
51  if (parameters.Security.Type.IsOption())
52  {
53  var feeRate = parameters.Security.Type switch
54  {
55  SecurityType.IndexOption => _optionIndexFee,
56  SecurityType.Option => _optionFee,
57  _ => 0m
58  };
59  return new OrderFee(new CashAmount(parameters.Order.AbsoluteQuantity * feeRate, Currencies.USD));
60  }
61  return OrderFee.Zero;
62  }
63  }
64 }