/* * 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 Newtonsoft.Json; using QuantConnect.Configuration; namespace QuantConnect.Packets { /// /// Provides parameters that control the behavior of a leaky bucket rate limiting algorithm. The /// parameter names below are phrased in the positive, such that the bucket is filled up over time /// vs leaking out over time. /// public class LeakyBucketControlParameters { // defaults represent 2 hour max capacity refilling at one seventh the capacity (~17.2 => 18) each day. // rounded up to 18 to prevent a very small decrease in refilling, IOW, if it's defaulting to 17, then // after 7 days have passed, we'll end up being at 119 and not completely refilled, but at 18, on the 6th // day we'll reach 108 and on the seventh day it will top off at 120 since it's not permitted to exceed the max /// /// Default capacity for leaky bucket /// public static int DefaultCapacity { get; set; } = Config.GetInt("scheduled-event-leaky-bucket-capacity", 2 * 60); /// /// Default time interval /// public static int DefaultTimeInterval { get; set; } = Config.GetInt("scheduled-event-leaky-bucket-time-interval-minutes", 1440); /// /// Default refill amount /// public static int DefaultRefillAmount { get; set; } = Config.GetInt("scheduled-event-leaky-bucket-refill-amount", (int)Math.Ceiling(DefaultCapacity/7.0)); /// /// Sets the total capacity of the bucket in a leaky bucket algorithm. This is the maximum /// number of 'units' the bucket can hold and also defines the maximum burst rate, assuming /// instantaneous usage of 'units'. In reality, the usage of 'units' takes times, and so it /// is possible for the bucket to incrementally refill while consuming from the bucket. /// public int Capacity { get; set; } /// /// Sets the refill amount of the bucket. This defines the quantity of 'units' that become available /// to a consuming entity after the time interval has elapsed. For example, if the refill amount is /// equal to one, then each time interval one new 'unit' will be made available for a consumer that is /// throttled by the leaky bucket. /// public int RefillAmount { get; set; } /// /// Sets the time interval for the refill amount of the bucket, in minutes. After this amount of wall-clock /// time has passed, the bucket will refill the refill amount, thereby making more 'units' available /// for a consumer. For example, if the refill amount equals 10 and the time interval is 30 minutes, then /// every 30 minutes, 10 more 'units' become available for a consumer. The available 'units' will /// continue to increase until the bucket capacity is reached. /// public int TimeIntervalMinutes { get; set; } /// /// Initializes a new instance of the using default values /// public LeakyBucketControlParameters() { Capacity = DefaultCapacity; RefillAmount = DefaultRefillAmount; TimeIntervalMinutes = DefaultTimeInterval; } /// /// Initializes a new instance of the with the specified value /// /// The total capacity of the bucket in minutes /// The number of additional minutes to add to the bucket /// after has elapsed /// The interval, in minutes, that must pass before the /// is added back to the bucket for reuse public LeakyBucketControlParameters(int capacity, int refillAmount, int timeIntervalMinutes) { Capacity = capacity; RefillAmount = refillAmount; TimeIntervalMinutes = timeIntervalMinutes; } } }