Я сейчас занимаюсь разработкой программы для работы с графиками и сейчас решаю некоторые проблемы. Есть финансовые данные из API. и привязать к управлению графиком. Для Axisx нет никаких правил. это означает, что может содержать mininute, second или может содержать только день. И я хочу смотреть все данные графика в одном масштабе всегда. Но сейчас не тот же масштаб и другое шоу. посмотрите на прикрепленное изображение. мои коды отображаются как erro1, error2 image, так что я хочу помочь мне правильно решить диаграмму, как ok1, ok2 image. Для инициализации используйте функцию InitChartControl () и установите стиль диаграммы с помощью функции Setmeasure. я использовал
xAxisScaleOptions.WorkdaysOnly = true;
Но это пока не исправлено .. помогите мне сейчас. С уважением.
void InitChartControl()
{
PriceSeries.SetFinancialDataMembers("DateTimeStamp", "Low", "High", "Open", "Close");
DateTimeScaleOptions xAxisScaleOptions = AxisX.DateTimeScaleOptions;
xAxisScaleOptions.WorkdaysOnly = true;
xAxisScaleOptions.ScaleMode = ScaleMode.Manual;
xAxisScaleOptions.AggregateFunction = AggregateFunction.Average;
WorkTimeRule weekdayRule = new WorkTimeRule();
xAxisScaleOptions.WorkTimeRules.Add(weekdayRule);
// Specify one or more work intervals of this rule.
weekdayRule.WorkIntervals.Add(new TimeInterval(00, 00, 00, 24, 00, 00));
// Add weekdays on which this rule should be applied.
weekdayRule.Weekdays = Weekday.Monday | Weekday.Tuesday | Weekday.Wednesday
| Weekday.Thursday | Weekday.Friday;
//WorkTimeRule dateRule = new WorkTimeRule();
//xAxisScaleOptions.WorkTimeRules.Add(dateRule);
//dateRule.WorkIntervals.Add(new TimeInterval(0, 00, 00, 24, 00, 00));
//// Besides Weekdays, you can specify the Date
//// on which this rule should be applied.
//dateRule.Date = new DateTime(2019, 1, 1);
// workdayOptions.Holidays.Add(new KnownDate("Christmas Eve", new DateTime(2019, 12, 24)));
CandleStickSeriesView myView = (CandleStickSeriesView)PriceSeries.View;
myView.AxisX.MinorCount = 5;
// PutScrollBarToLastPane();
}
public void SetMeasureUnit(MeasureUnitWithMultiplier measureUnitWithMultiplier)
{
DateTimeMeasureUnit unit = DateTimeMeasureUnit.Minute;
switch (measureUnitWithMultiplier.MeasureUnit)
{
case ChartType.Day:
unit = DateTimeMeasureUnit.Day;
break;
case ChartType.Min:
unit = DateTimeMeasureUnit.Minute;
break;
case ChartType.Tick:
unit = DateTimeMeasureUnit.Second;
break;
case ChartType.Month:
unit = DateTimeMeasureUnit.Month;
break;
case ChartType.Week:
unit = DateTimeMeasureUnit.Week;
break;
case ChartType.Year:
unit = DateTimeMeasureUnit.Year;
break;
}
DateTimeScaleOptions xAxisScaleOptions = AxisX.DateTimeScaleOptions;
WorkdaysOptions workdayOptions = xAxisScaleOptions.WorkdaysOptions;
CandleStickSeriesView myView = (CandleStickSeriesView)PriceSeries.View;
if (measureUnitWithMultiplier.MeasureUnit == ChartType.Tick || measureUnitWithMultiplier.MeasureUnit == ChartType.Min)
{
xAxisScaleOptions.ScaleMode = ScaleMode.Automatic;
xAxisScaleOptions.AutomaticMeasureUnitsCalculator = new CustomDateTimeMeasureUnitsCalculator(measureUnitWithMultiplier.Multiplier);
myView.AxisX.MinorCount = 5;
myView.AxisX.GridLines.Color = Color.FromArgb(255, 0, 0);
myView.LevelLineLength = 0.3;
myView.LineThickness = 2;
}
else
{
AxisX.Logarithmic = false;
xAxisScaleOptions.ScaleMode = ScaleMode.Manual;
xAxisScaleOptions.MeasureUnit = unit;
xAxisScaleOptions.MeasureUnitMultiplier = measureUnitWithMultiplier.Multiplier;
myView.AxisX.MinorCount = 5;
myView.AxisX.GridLines.Color = Color.FromArgb(255, 255, 255);
myView.LevelLineLength = 0.3;
myView.LineThickness = 2;
}
ViewType viewType = ViewType.CandleStick;
PriceSeries.ChangeView(viewType);
}
class CustomDateTimeMeasureUnitsCalculator : IDateTimeMeasureUnitsCalculator
{
const int daysInWeek = 7;
const int daysInMonth = 30;
const int daysInQuarter = 4 * daysInMonth;
const int daysInYear = 365;
const int minCount = 5;
int limit;
public CustomDateTimeMeasureUnitsCalculator(int val)
{
limit = val;
}
public DateTimeMeasureUnit CalculateMeasureUnit(
IEnumerable<Series> series,
double axisLength,
int pixelsPerUnit,
double visualMin,
double visualMax,
double wholeMin,
double wholeMax)
{
return DateTimeMeasureUnit.Second;
if (limit < 100)
{
if(limit > 1)
return DateTimeMeasureUnit.Hour;
else
return DateTimeMeasureUnit.Minute;
}
// Calculate visual range in msecs.
double visualRange = visualMax - visualMin;
TimeSpan ts = TimeSpan.FromMilliseconds(visualRange);
if (ts.TotalDays >= 1.0d)
{
if (ts.TotalDays <= minCount * daysInWeek)
return DateTimeMeasureUnit.Day;
if (ts.TotalDays <= minCount * daysInMonth)
return DateTimeMeasureUnit.Week;
if (ts.TotalDays <= minCount * daysInQuarter)
return DateTimeMeasureUnit.Month;
if (ts.TotalDays <= minCount * daysInYear)
return DateTimeMeasureUnit.Quarter;
else
return DateTimeMeasureUnit.Year;
}
else if (ts.TotalHours >= 20.0d)
return DateTimeMeasureUnit.Hour;
else if (ts.TotalMinutes >= 20.0d)
return DateTimeMeasureUnit.Minute;
else if (ts.TotalSeconds >= 20.0d)
return DateTimeMeasureUnit.Second;
else
return DateTimeMeasureUnit.Millisecond;
}
}
введите описание изображения здесь erro1.png
error2. png
ok1.png