我是scala的新手,所以不确定如何处理这个问题?基本上我试图为报价流找到移动平均线交叉.我不知道如何获得以前的值来将它们与当前值进行比较?
if ( fastMovingAverage(n-1) > slowMovingAverage(n-1) && fastMovingAverage(n) < slowMovingAverage(n) )
then do some action
package com.example.csv
import scala.io.Source
object FileParser {
val TIMESTAMP_LOCATION = 3
val BID_LOCATION = 4
val OFFER_LOCATION = 5
val FAST_WINDOW_SIZE = 5
val SLOW_WINDOW_SIZE = 10
def main(args: Array[String]) = {
val records = Source.fromFile("Sample.csv")
.getLines()
.drop(1)
.map(_.split(","))
.takeWhile( _ != null)
.sliding(SLOW_WINDOW_SIZE , 1)
.foreach(x => movingAverage(x))
}
def movingAverage(numbers: Seq[Array[String]]) = {
val listOfBids = numbers.map(x => x(BID_LOCATION).toDouble)
val slowAverage = listOfBids.reduceLeft(_ + _)/numbers.length
val fastListOfBids = listOfBids.takeRight(FAST_WINDOW_SIZE)
val fastAverage = fastListOfBids.reduceLeft(_ + _)/fastListOfBids.length
println("Slow Average " + slowAverage + " Fast Average " + fastAverage)
}
}
Run Code Online (Sandbox Code Playgroud)
简短的回答是使用zip操作slowAverage和fastAverage组合列表,然后找到压缩元素的差异.当差值从负值变为正值时,这表示快速平均值已超过(大于)慢速平均值.
这是我使用的数据和更长的例子:
Price Fast Average(2) Slow Average(4) Diff
9
8 8.5
7 7.5
6 6.5 7.5 -1
5 5.5 6.5 -1
5 5 5.75 -0.75
6 5.5 5.5 0
7 6.5 5.75 0.75
8 7.5 6.5 1
9 8.5 7.5 1
Run Code Online (Sandbox Code Playgroud)

Google文档链接:https://docs.google.com/spreadsheet/ccc?key = 0Alfb-wgy-zTddHdwU2stS0U5ZUxtN2cwdWFoeWNPZFE &usp =sharing
最近的价格是最后的.
让我们在Scala中看到它:
scala> val prices = List(9,8,7,6,5,5,6,7,8,9)
prices: List[Int] = List(9, 8, 7, 6, 5, 5, 6, 7, 8, 9)
scala> val fastAverage = prices.sliding(2).toList.map(xs => xs.sum / 2.0)
fastAverage: List[Double] = List(8.5, 7.5, 6.5, 5.5, 5.0, 5.5, 6.5, 7.5, 8.5)
scala> val slowAverage = prices.sliding(4).toList.map(xs => xs.sum / 4.0)
slowAverage: List[Double] = List(7.5, 6.5, 5.75, 5.5, 5.75, 6.5, 7.5)
Run Code Online (Sandbox Code Playgroud)
邮编一起fastAverage和slowAverage,但因为它们是不同的大小,我们采取的最后七个fastAverage用takeRight.
scala> val zipped = fastAverage.takeRight(7) zip slowAverage
zipped: List[(Double, Double)] = List((6.5,7.5), (5.5,6.5), (5.0,5.75), (5.5,5.5), (6.5,5.75), (7.5,6.5), (8.5,7.5))
Run Code Online (Sandbox Code Playgroud)
取不同的压缩平均值.从负变为正(> = 0)表示快速平均值大于慢速平均值即看涨移动平均线交叉点.
scala> zipped.map(x => x._1 - x._2)
res44: List[Double] = List(-1.0, -1.0, -0.75, 0.0, 0.75, 1.0, 1.0)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
931 次 |
| 最近记录: |