/*
* 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;
}
}
}