Вызов библиотеки функций scala - PullRequest
0 голосов
/ 01 марта 2020

Я хочу вызвать функцию ATR из этой scala оболочки для ta-lib. Но я не могу понять, как правильно использовать оболочку.

package io.github.patceev.talib

import com.tictactec.ta.lib.{Core, MInteger, RetCode}

import scala.concurrent.Future

object Volatility {
    def ATR(
        highs: Vector[Double],
        lows: Vector[Double],
        closes: Vector[Double],
        period: Int = 14
    )(implicit core: Core): Future[Vector[Double]] = {
        val arrSize = highs.length - period + 1

        if (arrSize < 0) {
            Future.successful(Vector.empty[Double])
        } else {
            val begin = new MInteger()
            val length = new MInteger()
            val result = Array.ofDim[Double](arrSize)

            core.atr(
                0, highs.length - 1, highs.toArray, lows.toArray, closes.toArray,
                period, begin, length, result
            ) match {
                case RetCode.Success =>
                    Future.successful(result.toVector)
                case error =>
                    Future.failed(new Exception(error.toString))
            }
        }
    }
}

Может ли кто-нибудь объяснить, как использовать функцию, и вывести результат на консоль?

Большое спасибо за заранее.

1 Ответ

1 голос
/ 01 марта 2020

Что касается синтаксиса, Scala является одним из многих языков, где вы вызываете функции и методы, передавая аргументы в скобках (в основном, но давайте пока будем простыми):

def myFunction(a: Int): Int = a + 1

myFunction(1) // myFunction is called and returns 2

Кроме того, Scala позволяет указать несколько списков параметров, как в следующем примере:

def myCurriedFunction(a: Int)(b: Int): Int = a + b

myCurriedFunction(2)(3) // myCurriedFunction returns 5

Вы также можете частично применить myCurriedFunction, но, опять же, давайте пока будем простыми бытия. Основная идея заключается в том, что вы можете иметь несколько списков аргументов, передаваемых в функцию.

На этом основании Scala позволяет определить список неявных параметров, которые компилятор автоматически найдет для вас некоторые правила Неявные параметры используются, например, Future s:

// this defines how and where callbacks are run
// the compiler will automatically "inject" them for you where needed
implicit val ec: ExecutionContext = concurrent.ExecutionContext.global

Future(4).map(_ + 1) // this will eventually result in a Future(5)

Обратите внимание, что и Future, и map имеют второй список параметров, который позволяет указывать неявный контекст выполнения. Имея один в области видимости, компилятор «внедрит» его для вас на сайте вызовов, без необходимости писать это явно. Вы могли бы еще сделать это, и результат был бы

Future(4)(ec).map(_ + 1)(ec)

Тем не менее, я не знаю специфики используемой вами библиотеки, но идея в том, что вам нужно создать экземпляр значения введите Core и либо привяжите его к implicit val, либо передайте его явно.

Полученный код будет выглядеть примерно так:

val highs: Vector[Double] = ???
val lows: Vector[Double] = ???
val closes: Vector[Double] = ???
implicit val core: Core = ??? // instantiate core
val resultsFuture = Volatility.ATR(highs, lows, closes) // core is passed implicitly
for (results <- resultsFuture; result <- results) {
  println(result)
}

Обратите внимание, что в зависимости от вашей ситуации вы можете также необходимо использовать неявный ExecutionContext для запуска этого кода (потому что вы извлекаете Vector[Double] из Future). Выбор правильного контекста выполнения является другим видом проблемы, но для игры вы можете использовать глобальный контекст выполнения.


Extra

Относительно некоторых из пункты, которые я оставил открытыми, вот некоторые указатели, которые, надеюсь, окажутся полезными:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...