Back to Devexpress

How to: Create a Custom Summary Function

windowsforms-4948-controls-and-libraries-chart-control-examples-creating-charts-data-representation-how-to-create-a-custom-summary-function.md

latest4.6 KB
Original Source

How to: Create a Custom Summary Function

  • Jan 15, 2024
  • 2 minutes to read

The following example demonstrates how to create a custom summary function, which returns an OHLC point calculated by the passed array of values. To accomplish this task, create a SummaryFunction delegate and register it using the ChartControl.RegisterSummaryFunction method:

csharp
// Declare the Financial summary function. 
private static SeriesPoint[] CalculateProductValue( 
        Series series, 
        object argument, 
        string[] functionArguments, 
        DataSourceValues[] values, 
        object[] colors
) { 
    string functionArgument = functionArguments[0]; 
    int lastIndex = values.Length - 1; 

    double open = Convert.ToDouble(values[0][functionArgument], CultureInfo.InvariantCulture); 
    double close = Convert.ToDouble(values[lastIndex][functionArgument], CultureInfo.InvariantCulture); 
    double high = Math.Max(open, close); 
    double low = Math.Min(open, close); 
    for (int i = 1; i < lastIndex; i++) { 
        high = Math.Max(high, Convert.ToDouble(values[i][functionArgument], CultureInfo.InvariantCulture)); 
        low = Math.Min(low, Convert.ToDouble(values[i][functionArgument], CultureInfo.InvariantCulture)); 
    } 
    // Return the result. 
    return new SeriesPoint[] { 
        new SeriesPoint(argument, high, low, open, close) 
    }; 
} 

private void Form1_Load(object sender, EventArgs e) { 
    chartControl.DataSource = new CurrencyRateLoader("../../Data/EurUsdRate.xml").Load();
    // Register the summary function in a chart. 
    chartControl.RegisterSummaryFunction( 
            name: "FINANCIAL", 
            displayName: "Financial", 
            resultScaleType: ScaleType.Numerical, 
            resultDimension: 4, 
            argumentDescriptions: new SummaryFunctionArgumentDescription[] { 
                new SummaryFunctionArgumentDescription("Value", ScaleType.Numerical) 
            }, 
            function: CalculateProductValue
    );

    Series series = chartControl.Series["EurUsd"]; 
    series.ArgumentDataMember = "DateTime";
    // Note that ValueDataMembers are not specified.
    series.DateTimeSummaryOptions.SummaryFunction = "FINANCIAL([Value])"; 
}
vb
' Declare the Financial summary function.
Private Shared Function CalculateProductValue(
        ByVal series As Series, 
        ByVal argument As Object, 
        ByVal functionArguments() As String, 
        ByVal values() As DataSourceValues, 
        ByVal colors() As Object
) As SeriesPoint()
    Dim functionArgument As String = functionArguments(0)
    Dim lastIndex As Integer = values.Length - 1

    Dim openValue As Double = Convert.ToDouble(values(0)(functionArgument), CultureInfo.InvariantCulture)
    Dim closeValue As Double = Convert.ToDouble(values(lastIndex)(functionArgument), CultureInfo.InvariantCulture)
    Dim highValue As Double = Math.Max(openValue, closeValue)
    Dim lowValue As Double = Math.Min(openValue, closeValue)
    For i As Integer = 1 To lastIndex - 1
        highValue = Math.Max(highValue, Convert.ToDouble(values(i)(functionArgument), CultureInfo.InvariantCulture))
        lowValue = Math.Min(lowValue, Convert.ToDouble(values(i)(functionArgument), CultureInfo.InvariantCulture))
    Next i
    ' Return the result.
    Return New SeriesPoint() { 
        New SeriesPoint(argument, high, low, open, close_Renamed) 
    }
End Function

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
    chartControl.DataSource = (New CurrencyRateLoader("../../Data/EurUsdRate.xml")).Load()
    ' Register the summary function in a chart.
    chartControl.RegisterSummaryFunction(
            name:= "FINANCIAL", 
            displayName:= "Financial", 
            resultScaleType:= ScaleType.Numerical, 
            resultDimension:= 4, 
            argumentDescriptions:= New SummaryFunctionArgumentDescription() { 
                New SummaryFunctionArgumentDescription("Value", ScaleType.Numerical) 
            }, 
            [function]:= AddressOf CalculateProductValue
    )

    Dim series As Series = chartControl.Series("EurUsd")
    series.ArgumentDataMember = "DateTime"
    ' Note that ValueDataMembers are not specified.
    series.DateTimeSummaryOptions.SummaryFunction = "FINANCIAL([Value])"
End Sub

See Also

Calculate Summaries