markcheno/go-talib

Discuss a possible implementation upgrade to better match tradingview's pinescript way of code

saniales opened this issue · 5 comments

This would allow to easily import pinescript strategies into go talib based programs

as far as I've seen, the more problematic feature is the security function by tradingview, which allows to switch context and have new candles and manipulate them

from function signature (https://it.tradingview.com/study-script-reference/#fun_security) in its simplest form:

security(symbol, resolution, expression)

where

  • symbol is used to get the candles from the tradingview chart (so it can be substituted with the input of high/low/open/close four []float64 values we can get from any exchange or broker api.
  • resolution is usually a timeframe related, so it can be merged with the 4 float64 arrays as symbol
  • expression is the manipulation we need to perform on data

an example of call would be

security("BTCUSD", "1d", close) // gets the close values from btcusd 1 day chart
security(heikinashi("BTCUSD"), "30m", hlc3) // gets the heikinashi candles of btcusd 30m chart, then performs HLC3 [(high+low+close) / 3] to the gotten series and returns it

To translate this in go-talib way I have an idea:
let's create the following function

func security(inHigh, inOpen, inClose, inLow []float64, expression Manipulator) []float64

the in-arrays represent the symbol + resolution parameters results while the manipulator function will defined as follow:

type Manipulator func(inHigh, inOpen, inClose, inLow []float64) []float64

In this way we would be able to use it like this:

// we do not really care about how candles are extracted, let's assume to use the following function
inHigh, inOpen, inClose, inLow := extractFromSomeCandles(symbol, resolution) // we can extract it from cryptocurrency exchanges as well as from forex brokers
manipulator := talib.Hlc3 // we need to change the signature of the function to follow manipulator signature
// then we use it
result := talib.Security(inHigh, inOpen, inClose, inLow, manipulator)

We can also wrap manipulators one inside another, like the following:

manipulator1 := talib.Hlc3
manipulator2 := func(inHigh, inOpen, inClose, inLow []float64) []float64 {
    manipulatedHigh, manipulatedOpen, manipulatedClose, manipulatedLow := manipulateInSomeWay(inHigh, inOpen, inClose, inLow)
    // pass manipulated array to the second function
    return manipulator1(manipulatedHigh, manipulatedOpen, manipulatedClose, manipulatedLow)
}

A better way should be found though, maybe through the use of a Wrap function in some way

Another idea would be to create a ContextSwitcher function which is like the following

func(inHigh, inOpen, inClose, inLow []float64) ([]float64, []float64, []float64, []float64)

@markcheno what do you think? is it possible in your opinion. In case it's not I can create a separate repo, detaching from talib

Pinescript general reference : https://it.tradingview.com/study-script-reference
Of course functions like plot and study (which are inherently used by trading view for graphical purposes) can be avoided to be ported, while input function can be substituted with input from go program (or user)

Are you proposing to re-create Pinescript in Go? If so, I think a new repository would be best.

What I was thinking was to fuse existing talib-implementation into pinescript way of code, not to directly translate pinescript itself, since pinescript has talib features built into it. I am asking here since it would inherently mean to recreate all talib functions and give them a new signature.

@markcheno let's use an example from the library

inHigh, inOpen, inClose, inLow := extractFromSomeCandles(symbol, resolution) // we can extract it from cryptocurrency exchanges as well as from forex brokers
results := talib.Security(inHigh, inOpen, inClose, inLow, talib.AvgPrice)

If you want to re-create all the functions with a different signature, I think it would be best to start a new repository.