App-Chart

 view release on metacpan or  search on metacpan

lib/App/Chart/IndicatorInfo.pm  view on Meta::CPAN

  if ($key && $key =~ /^(GT|TA)_/p) {
    $key = ${^POSTMATCH};
    $class = "App::Chart::IndicatorInfo::$1";
  }
  if ($key && $key eq 'None') {
    $key = undef;
  }
  return bless { key => $key }, $class;
}

sub manual {
  my ($self) = @_;
  my $func = $self->module_func('manual') || return undef;
  return $func->();
}
sub parameter_info {
  my ($self) = @_;
  my $func = $self->module_func('parameter_info') || return [];
  return $func->();
}

sub module_func {
  my ($self, $funcname) = @_;
  my $module = $self->module_load || return;
  return $module->can($funcname);
}
my %warned;
sub module_load {
  my ($self) = @_;
  my $module = $self->module;
  require Module::Load;
  if (! eval { Module::Load::load($module); 1 }) {
    print "module_load(): Cannot load $module\n";
    $warned{$module} ||= do { warn "Cannot load $module: $@"; 1 };
    return undef;
  }
  return $module;
}
sub module {
  my ($self) = @_;
  return ($self->{'key'} && "App::Chart::Series::Derived::$self->{'key'}");
}

#------------------------------------------------------------------------------
package App::Chart::IndicatorInfo::GT;
use strict;
use warnings;
use Locale::TextDomain ('App-Chart');
our @ISA = ('App::Chart::IndicatorInfo');

# ENHANCE-ME: @DEFAULT_ARGS shows when OHLCV needed ...

use constant manual => __p('manual-node','Other Indicator Packages');

sub parameter_info {
  my ($self) = @_;
  my $module = $self->module_load || return;
  my @default_args = do { no strict 'refs'; @{"${module}::DEFAULT_ARGS"} };
  my @ret;
  foreach my $arg (@default_args) {
    if (Scalar::Util::looks_like_number ($arg)) {
      my $i = @ret;
      push @ret, { name    => "Arg$i",
                   key     => "GT-arg$i",
                   default => $default_args[$i],
                 };
    }
  }
  return \@ret;
}

sub module {
  my ($self) = @_;
  return 'GT::Indicators::' . $self->{'key'};
}

#------------------------------------------------------------------------------
package App::Chart::IndicatorInfo::TA;
use strict;
use warnings;
use Locale::TextDomain ('App-Chart');
our @ISA = ('App::Chart::IndicatorInfo');

use constant DEBUG => 0;

use constant { manual => __p('manual-node','Other Indicator Packages'),
               module => 'Finance::TA',
             };

sub parameter_info {
  my ($self) = @_;
  $self->module_load || return [];
  my @ret;

  my $func = $self->{'key'};
  my ($fh, $fi) = _funcbits ($self);
  foreach my $i (0 .. $fi->{'nbOptInput'} - 1) {
    my ($info, $retcode);
    ($retcode = Finance::TA::TA_GetOptInputParameterInfo ($fh, $i, \$info))
      == $Finance::TA::TA_SUCCESS
        or die "Function $func parameter $i ",_retcode_str ($retcode);

    my $elem = { key     => "TA_${func}_$info->{'paramName'}",
                 name    => $info->{'displayName'},
                 default => $info->{'defaultValue'},
                 type    => 'integer',
               };
    push @ret, $elem;

    my $dataset = $info->{'dataSet'};
    if (DEBUG) { print "dataSet $dataset\n"; }

    if ($info->{'type'} == $Finance::TA::TA_OptInput_RealRange) {
      $elem->{'type'} = 'float';
    }

    # TA_IntegerRange and TA_RealRange
    {
      ## no critic (RequireCheckingReturnValueOfEval)
      eval {
        $elem->{'minimum'} = $dataset->{'min'};



( run in 0.713 second using v1.01-cache-2.11-cpan-39bf76dae61 )