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 )