Flutter移动平均线计算插件moving_average的使用

Flutter移动平均线计算插件moving_average的使用

MovingAverage

moving_average 是一个用于计算移动平均值的库。它支持多种类型的移动平均算法,包括简单移动平均(Simple Moving Average)、加权移动平均(Weighted Moving Average)和指数移动平均(Exponential Moving Average)。下面将详细介绍如何使用这个插件。

Usage

安装

首先,在 pubspec.yaml 文件中添加依赖:

dependencies:
  moving_average: ^latest_version

然后运行 flutter pub get 来安装依赖。

示例代码

以下是一个完整的示例代码,展示了如何使用 moving_average 插件来计算不同类型的移动平均值。

import 'package:moving_average/moving_average.dart';

void main() {
  // 示例数据
  final values = [1, 2, 3, 4, 5];
  print("Values = $values");

  // 简单移动平均 (Simple Moving Average)
  final simpleMovingAverage = MovingAverage<num>(
    averageType: AverageType.simple,
    windowSize: 3,
    partialStart: true,
    getValue: (num n) => n,
    add: (List<num> data, num value) => value,
  );
  final movingAverage3 = simpleMovingAverage(values);
  print("Simple Moving Average, size 3, partial = $movingAverage3");

  // 加权移动平均 (Weighted Moving Average)
  final weightedMovingAverage = MovingAverage<num>(
    averageType: AverageType.weighted,
    windowSize: 3,
    getValue: (num n) => n,
    add: (List<num> data, num value) => value,
  );
  final weightedAverage3 = weightedMovingAverage(values);
  print("Weighted Moving Average, size 3 = $weightedAverage3");

  // 指数移动平均 (Exponential Moving Average)
  final exponentialMovingAverage = MovingAverage<num>(
    averageType: AverageType.exponential,
    factor: 0.1,
    getValue: (num n) => n,
    add: (List<num> data, num value) => value,
  );
  final exponentialAverage = exponentialMovingAverage(values);
  print("Exponential Moving Average, factor 0.1 = $exponentialAverage");

  // 对象类型的数据 (例如 Point 类)
  class Point {
    final double x;
    final double y;

    Point(this.x, this.y);

    @override
    String toString() => "Point(x: $x, y: $y)";
  }

  final points = [
    Point(1, 1),
    Point(2, 2),
    Point(3, 3),
    Point(4, 4),
    Point(5, 5),
  ];
  print("Points = $points");

  // 简单移动平均 (对象类型)
  final sma2 = MovingAverage<Point>(
    averageType: AverageType.simple,
    windowSize: 2,
    getValue: (p) => p.y,
    add: (data, value) => Point(data.last.x, value as double),
  );
  final movingAverage2 = sma2(points);
  print("Simple Moving Average, size 2 = $movingAverage2");

  // 加权移动平均 (对象类型)
  final wma2 = MovingAverage<Point>(
    averageType: AverageType.weighted,
    windowSize: 2,
    getValue: (p) => p.y,
    add: (data, value) => Point(data.last.x, value as double),
  );
  final weightedAverage2 = wma2(points);
  print("Weighted Moving Average, size 2 = $weightedAverage2");

  // 指数移动平均 (对象类型)
  final ema = MovingAverage<Point>(
    averageType: AverageType.exponential,
    factor: 0.1,
    getValue: (p) => p.y,
    add: (data, value) => Point(data.last.x, value as double),
  );
  final exponential = ema(points);
  print("Exponential Moving Average, factor 0.1 = $exponential");
}

参数说明

  • averageType: 移动平均的类型,可以是 AverageType.simpleAverageType.weightedAverageType.exponential
  • windowSize: 窗口大小,即参与计算的元素数量。
  • partialStart: 是否允许部分窗口计算,默认为 false。如果设置为 true,则在窗口未填满时也会计算平均值。
  • getValue: 从每个元素中提取数值的函数。
  • add: 将新值添加到结果中的函数。

输出示例

运行上述代码后,输出如下:

Values = [1, 2, 3, 4, 5]
Simple Moving Average, size 3, partial = [1.0, 1.5, 2.0, 3.0, 4.0]
Weighted Moving Average, size 3 = [2.3333333333333335, 3.3333333333333335, 4.333333333333333]
Exponential Moving Average, factor 0.1 = [1.0, 1.9, 2.71, 3.439, 4.0951]
Points = [Point(x: 1.0, y: 1.0), Point(x: 2.0, y: 2.0), Point(x: 3.0, y: 3.0), Point(x: 4.0, y: 4.0), Point(x: 5.0, y: 5.0)]
Simple Moving Average, size 2 = [Point(x: 2.0, y: 1.5), Point(x: 3.0, y: 2.5), Point(x: 4.0, y: 3.5), Point(x: 5.0, y: 4.5)]
Weighted Moving Average, size 2 = [Point(x: 2.0, y: 1.6666666666666667), Point(x: 3.0, y: 2.6666666666666665), Point(x: 4.0, y: 3.6666666666666665), Point(x: 5.0, y: 4.666666666666666)]
Exponential Moving Average, factor 0.1 = [Point(x: 1.0, y: 1.0), Point(x: 2.0, y: 1.9), Point(x: 3.0, y: 2.71), Point(x: 4.0, y: 3.439), Point(x: 5.0, y: 4.0951)]

Features and Bugs

如果您有任何功能请求或发现任何问题,请在 issue tracker 上提交。

希望这个详细的示例能帮助您更好地理解和使用 moving_average 插件!


更多关于Flutter移动平均线计算插件moving_average的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter移动平均线计算插件moving_average的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用moving_average插件来计算移动平均线的示例代码。假设你已经在pubspec.yaml文件中添加了moving_average依赖,并且已经运行了flutter pub get来安装依赖。

pubspec.yaml

dependencies:
  flutter:
    sdk: flutter
  moving_average: ^最新版本号  # 请替换为实际的最新版本号

main.dart

import 'package:flutter/material.dart';
import 'package:moving_average/moving_average.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Moving Average Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MovingAverageExample(),
    );
  }
}

class MovingAverageExample extends StatefulWidget {
  @override
  _MovingAverageExampleState createState() => _MovingAverageExampleState();
}

class _MovingAverageExampleState extends State<MovingAverageExample> {
  final List<double> data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  List<double>? movingAverage;

  @override
  void initState() {
    super.initState();
    // 计算5点移动平均线
    movingAverage = calculateMovingAverage(data, 5);
  }

  List<double> calculateMovingAverage(List<double> data, int period) {
    final MovingAverage ma = MovingAverage(data, period);
    return ma.calculate();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Moving Average Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text('Original Data:'),
            ...data.asMap().entries.map((entry) {
              return Text('Index ${entry.key}: ${entry.value}');
            }).toList(),
            SizedBox(height: 20),
            Text('5-Point Moving Average:'),
            if (movingAverage != null)
              ...movingAverage!.asMap().entries.map((entry) {
                return Text('Index ${entry.key}: ${entry.value}');
              }).toList(),
          ],
        ),
      ),
    );
  }
}

解释

  1. 依赖添加

    • pubspec.yaml文件中添加moving_average依赖。
  2. 主应用

    • MyApp是应用的根组件,它设置了主题并导航到MovingAverageExample页面。
  3. 移动平均线计算页面

    • MovingAverageExample是一个有状态的组件,用于展示原始数据和计算后的移动平均线。
    • initState方法中,调用calculateMovingAverage方法来计算5点移动平均线。
    • calculateMovingAverage方法接受一个数据列表和周期数,返回一个包含移动平均值的列表。
  4. UI展示

    • 使用Column布局来展示原始数据和移动平均线。
    • 如果movingAverage不为空,则遍历并展示每个索引处的移动平均值。

请确保在实际使用中根据插件的最新版本和API文档进行调整。如果moving_average插件的API有所变化,请参考其官方文档进行相应修改。

回到顶部