class_docstr: Calculates various technical indicators and associated trading signals.
  
  Signals can also be filtered to allow only longs or short and also to flip signals.
  
  It is possible to create subclasses of
  TechIndicator to implement your own custom signals and technical indicators.
  
  At present it implements the following technical indicators (and associated signals)
      SMA - simple moving averages - buy if spot above SMA, sell if below)
      EMA - exponential moving average - buy if spot spot above EMA, sell if below)
      ROC - rate of change - buy if rate of change positive, sell if negative
      polarity - buy if input is positive, sell if negative
      SMA2 - double simple moving average - buy if faster SMA above slower SMA, sell if below
      RSI - relative strength indicator - buy if RSI exits overbought, sell if RSI exits oversold
      BB - Bollinger bands - buy if spot above upper Bollinger band, sell if below lower Bollinger Band
      ATR - Average True Range - useful for creating stop/take profit levels
      long_only - long only signal
class_docstr_tok: ["Calculates","various","technical","indicators","and","associated","trading","signals",".","Signals","can","also","be","filtered","to","allow","only","longs","or","short","and","also","to","flip","signals",".","It","is","possible","to","create","subclasses","of","TechIndicator","to","implement","your","own","custom","signals","and","technical","indicators",".","At","present","it","implements","the","following","technical","indicators","(","and","associated","signals",")","SMA","-","simple","moving","averages","-","buy","if","spot","above","SMA",",","sell","if","below",")","EMA","-","exponential","moving","average","-","buy","if","spot","spot","above","EMA",",","sell","if","below",")","ROC","-","rate","of","change","-","buy","if","rate","of","change","positive",",","sell","if","negative","polarity","-","buy","if","input","is","positive",",","sell","if","negative","SMA2","-","double","simple","moving","average","-","buy","if","faster","SMA","above","slower","SMA",",","sell","if","below","RSI","-","relative","strength","indicator","-","buy","if","RSI","exits","overbought",",","sell","if","RSI","exits","oversold","BB","-","Bollinger","bands","-","buy","if","spot","above","upper","Bollinger","band",",","sell","if","below","lower","Bollinger","Band","ATR","-","Average","True","Range","-","useful","for","creating","stop\/take","profit","levels","long_only","-","long","only","signal"]
code: def create_custom_tech_ind(
      self,
      data_frame_non_nan,
      name,
      tech_params,
      data_frame_non_nan_early,
  ):
      return
  
imports: import pandas
  import numpy
  from collections import OrderedDict
  from findatapy.timeseries import Calculations
  from findatapy.util.loggermanager import LoggerManager
label_desc: Use image node_id 3 for calling the TechIndicator obj's underlying member method code with example usage: obj.create_custom_tech_ind(data_frame_non_nan, name, tech_params, data_frame_non_nan_early) without return types