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