StockSharp/StockSharp · error · ArgumentOutOfRangeException

Specified argument was out of the range of valid values. (Pa

Error message

Specified argument was out of the range of valid values. (Parameter 'parameters')

What it means

GpuOscillatorOfMovingAverageCalculator.Calculate throws ArgumentOutOfRangeException when the parameters array (GpuOscillatorOfMovingAverageParams[]) is empty. OMA is computed per parameter set; an empty array means no computation requested, so the guard surfaces the issue.

Source

Thrown at Algo.Gpu/Indicators/GpuOscillatorOfMovingAverageCalculator.cs:72

	/// <param name="accelerator">ILGPU accelerator.</param>
	public GpuOscillatorOfMovingAverageCalculator(Context context, Accelerator accelerator)
		: base(context, accelerator)
	{
		_paramsSeriesKernel = Accelerator.LoadAutoGroupedStreamKernel
				<Index3D, ArrayView<GpuCandle>, ArrayView<GpuIndicatorResult>, ArrayView<int>, ArrayView<int>, ArrayView<GpuOscillatorOfMovingAverageParams>>(OmaParamsSeriesKernel);
	}

	/// <inheritdoc />
	public override GpuIndicatorResult[][][] Calculate(GpuCandle[][] candlesSeries, GpuOscillatorOfMovingAverageParams[] parameters)
	{
		ArgumentNullException.ThrowIfNull(candlesSeries);
		ArgumentNullException.ThrowIfNull(parameters);

		if (candlesSeries.Length == 0)
			throw new ArgumentOutOfRangeException(nameof(candlesSeries));

		if (parameters.Length == 0)
			throw new ArgumentOutOfRangeException(nameof(parameters));

		var seriesCount = candlesSeries.Length;

		// Flatten input
		var totalSize = 0;
		var seriesOffsets = new int[seriesCount];
		var seriesLengths = new int[seriesCount];

		for (var s = 0; s < seriesCount; s++)
		{
			seriesOffsets[s] = totalSize;
			var len = candlesSeries[s]?.Length ?? 0;
			seriesLengths[s] = len;
			totalSize += len;
		}

		var flatCandles = new GpuCandle[totalSize];
		var maxLen = 0;

View on GitHub (pinned to 601a191de6)

Solutions

  1. Check parameters.Length > 0 before calling Calculate
  2. Supply a default OMA parameter set when none are configured
  3. Trace the parameter construction path to find where the empty array originates

Example fix

// before
var results = calculator.Calculate(candlesSeries, parameters);

// after
if (parameters is null || parameters.Length == 0)
    return Array.Empty<GpuIndicatorResult[][]>();
var results = calculator.Calculate(candlesSeries, parameters);
Defensive patterns

Strategy: validation

Validate before calling

// Validate before calling GpuOscillatorOfMovingAverageCalculator.Calculate
if (parameters is null || parameters.Length == 0)
{
    return Array.Empty<GpuIndicatorResult[][]>();
}

Type guard

static bool IsValidParameters(GpuOscillatorOfMovingAverageParams[] parameters) =>
    parameters is { Length: > 0 };

Try / catch

try
{
    var results = calculator.Calculate(candlesSeries, parameters);
}
catch (ArgumentOutOfRangeException ex) when (ex.ParamName == nameof(parameters))
{
    logger.LogWarning("Empty parameters passed to OMA calculator");
    return Array.Empty<GpuIndicatorResult[][]>();
}

Prevention

When it happens

Trigger: Calling Calculate with Array.Empty<GpuOscillatorOfMovingAverageParams>() or a zero-length parameters array.

Common situations: OMA config section absent; parameter generation returned empty; optimization grid produced zero valid OMA configs.

Related errors


AI-assisted analysis of StockSharp/StockSharp@601a191de6 (2026-08-13). Data as JSON: /api/errors/8c2c15aecea515ea. Report an issue: GitHub.