windowsforms-4948-controls-and-libraries-chart-control-examples-creating-charts-data-representation-how-to-create-a-custom-summary-function.md
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:
// 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])";
}
' 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