Pues como estaba aburrido en verano y sin trabajo,
decidi empezar a programar algo en PERL,
un lenguaje que me gusta mucho,
dejo aqui una biblioteca de funciones de Analisis Tecnico,
y unos programas que lo usan.
Los datos diarios para procesar me los bajo de Yahoo en formato csv,
y luego los dejo en un directorio (c:\bolsa\bajados).
Hasta hace poco no me he descargado el Visual Chart(por que me cuesta aprenderlo) y aunque creo que esta bien
mi forma de simular sigue siendo con el PERL.
Para ejecutarlo hay que bajarse el interprete que es gratuito desde www.perl.org
Los programas tienen extension *.cgi
Para ejecutarlos se hace asi desde MS-DOS:
perl nombreprograma.cgi
La libreria tiene extension pl y
vereis que es facil incluirlo en cualquier programa de simulacion que hagais
con Perl.
RECURSOS PERL
Se me olvidaba
No puedo subir los programas
por que no me lo permite, ni extensiones pl ni cgi
pero os dejo la libreria en formato texto.
sub acumulacion_distribucion()
{
my $saldo_anterior=$_[0];
my $volumen=$_[1];
my $maximo_dia=$_[2];
my $minimo_dia=$_[3];
my $cierre=$_[4];
my $saldo;
my $base=$volumen*((($cierre-$minimo_dia)-($maximo_dia-$cierre))/($maximo_dia-$minimo_dia));
if (abs($maximo_dia-$cierre)>abs($minimo_dia-$cierre))
{
$saldo=$saldo_anterior+$base;
}
else
{
$saldo=$saldo_anterior-$base;
}
return $saldo;
}
sub anadir_dia_lista()
{
my $ref_lista=$_[0];
my $abierto=$_[1];
my $max=$_[2];
my $min=$_[3];
my $cierre=$_[4];
my $volumen=$_[5];
my $dias=$_[6];
my @dia=($abierto,$max,$min,$cierre,$volumen);
my $ref_dia=\@dia;
my @lista=@$ref_lista;
my $elementos = @lista;
if ($elementos<$dias)
{
unshift(@lista,$ref_dia);
}
else
{
pop(@lista);
unshift(@lista,$ref_dia);
}
return \@lista;
}
sub max_periodo() #devuelve el maximo de un determinado periodo.
{
my $ref_lista=$_[0];
my @lista=@$ref_lista;
my $max=0;
foreach my $elemento (@lista)
{
my @dia=@$elemento;
if ($dia[1]>$max)
{
$max=$dia[1];
}
}
return $max;
}
sub min_periodo() #devuelve el minimo de un determinado periodo.
{
my $ref_lista=$_[0];
my @lista=@$ref_lista;
my $min=99999999999999999;
foreach my $elemento (@lista)
{
my @dia=@$elemento;
if ($dia[2]<$min)
{
$min=$dia[1];
}
}
return $min;
}
sub cierre_periodo() #devuelve el cierre de un determinado periodo.
{
my $ref_lista=$_[0];
my @lista=@$ref_lista;
my $dia=$lista[0];
my $cierre=$dia->[3];
return $cierre;
}
sub abierto_periodo() #devuelve la apertura de un determinado periodo.
{
my $ref_lista=$_[0];
my @lista=@$ref_lista;
my $elementos=@lista;
my $dia=$lista[$elementos-1];
my $abierto=$dia->[0];
return $abierto;
}
sub iniciar_lista()
{
undef $_[0];
}
sub elementos_lista()
{
my $ref_lista=$_[0];
my @lista=@$ref_lista;
my $elementos = @lista;
return $elementos;
}
sub pivot_point()
{
my $max=$_[0];
my $min=$_[1];
my $cierre=$_[2];
return ($max+$min+$cierre)/3;
}
sub b1()
{
my $max=$_[0];
my $min=$_[1];
my $cierre=$_[2];
my $pivot=($max+$min+$cierre)/3;
return (2*$pivot - $max);
}
sub s1()
{
my $max=$_[0];
my $min=$_[1];
my $cierre=$_[2];
my $pivot=($max+$min+$cierre)/3;
return (2*$pivot - $min);
}
sub lbop()
{
my $max=$_[0];
my $min=$_[1];
my $cierre=$_[2];
my $pivot=($max+$min+$cierre)/3;
return (2*$pivot - 2*$max +$min);
}
sub hbop()
{
my $max=$_[0];
my $min=$_[1];
my $cierre=$_[2];
my $pivot=($max+$min+$cierre)/3;
return (2*$pivot - 2*$min +$max);
}
sub dm_mas()
{
my $max=$_[0];
my $min=$_[1];
my $max_ant=$_[2];
my $min_ant=$_[3];
my $dif_max = $max-$max_ant;
if ($dif_max>0)
{
my $dif_min = $min - $min_ant;
if ($dif_min >= 0)
{
return $dif_max;
}
else
{
if (abs($dif_min)>=$dif_max)
{
return 0;
}
else
{
return $dif_max;
}
}
}
else
{
return 0;
}
}
sub dm_menos()
{
my $max=$_[0];
my $min=$_[1];
my $max_ant=$_[2];
my $min_ant=$_[3];
my $dif_min = $min - $min_ant;
if ($dif_min < 0)
{
my $dif_max = $max - $max_ant;
if ($dif_max <= 0)
{
return abs($dif_min);
}
else
{
if (abs($dif_min)>=$dif_max)
{
return abs($dif_min);
}
else
{
return 0;
}
}
}
else
{
return 0;
}
}
sub di_promedio()
{
my $ref_lista_di = $_[0];
my $ref_lista_tr = $_[1];
my @lista_di = @$ref_lista_di;
my @lista_tr = @$ref_lista_tr;
my $elementos_di = @lista_di;
my $elementos_tr = @lista_tr;
my $suma_di=0;
my $suma_tr=0;
#print "lista trs = @lista_tr \n";
foreach my $elemento (@lista_di)
{
$suma_di=$suma_di+$elemento;
}
foreach my $elemento (@lista_tr)
{
$suma_tr=$suma_tr+$elemento;
}
if ($elementos_tr == 0)
{
return 0;
}
#print "SUMA DI=$suma_di SUMA TR=$suma_tr elementos di=$elementos_di \n";
my $promedio = 100 * (($suma_di/$elementos_di)/($suma_tr/$elementos_tr));
return $promedio;
}
sub dx()
{
my $di_mas = $_[0];
my $di_menos = $_[1];
if (($di_mas+$di_menos)==0)
{
return 0;
}
my $adx=100*(abs($di_mas-$di_menos)/($di_mas+$di_menos));
}
sub adx()
{
my $ref_lista_dx = $_[0];
my $promedio=&media_movil($ref_lista_dx);
return $promedio;
}
sub adxr()
{
my $ref_lista_adx = $_[0];
my @lista_adx = @$ref_lista_adx;
my $elementos=@lista_adx;
my $adx1=$lista_adx[0];
my $adx2=$lista_adx[$elementos-1];
#print "adx1=$adx1 adx2=$adx2 \n";
return ($adx1+$adx2)/2;
}
sub tr()
{
my $cierre_anterior = $_[0];
my $max = $_[1];
my $min = $_[2];
my $tr;
my $dif_diaria = abs($max - $min);
#print "DENTRO DE TR dif_diaria $dif_diaria \n";
if ($dif_diaria>abs($cierre_anterior-$max))
{
$tr=$dif_diaria;
}
else
{
$tr=abs($cierre_anterior-$max);
}
if ($tr > abs($cierre_anterior-$min))
{
return $tr;
}
else
{
return abs($cierre_anterior-$min);
}
}
sub media_movil()
{
my $ref_lista=$_[0];
my @lista=@$ref_lista;
my $elementos = @lista;
my $suma=0;
if ($elementos == 0)
{
return 0;
}
foreach my $valor (@lista)
{
$suma=$suma+$valor;
}
return ($suma/$elementos);
}
sub momentun()
{
my $ref_lista=$_[0];
my $anterior=$_[1];
my @lista=@$ref_lista;
my $elementos = @lista;
my $ultimo_elemento=$lista[0];
my $elemento_anterior=$lista[$anterior];
return ($ultimo_elemento-$elemento_anterior);
}
sub anadir_lista()
{
my $ref_lista=$_[0];
my $numero_elementos=$_[1];
my $nuevo_elemento=$_[2];
my @lista=@$ref_lista;
my $elementos = @lista;
if ($elementos<$numero_elementos)
{
unshift(@lista,$nuevo_elemento);
}
else
{
pop(@lista);
unshift(@lista,$nuevo_elemento);
}
return \@lista;
}
sub rsi()
{
my $ref_lista=$_[0];
my @lista=@$ref_lista;
my $elementos = @lista;
my $num_anterior=0;
my $suma_subidas=0;
my $suma_bajadas=0;
foreach my $num (reverse @lista)
{
if ($num_anterior != 0)
{
my $dif=$num-$num_anterior;
if ($dif<0)
{
$suma_bajadas=$suma_bajadas-$dif;
}
elsif ($dif>0)
{
$suma_subidas=$suma_subidas+$dif;
}
}
$num_anterior=$num;
}
if ($suma_bajadas == 0)
{
return 100;
}
#print "suma_subidas = $suma_subidas , suma_bajadas = $suma_bajadas \n";
return (100 - (100/(1+($suma_subidas/$suma_bajadas))));
}
sub estocastico()
{
my $ref_lista=$_[0];
my @lista=@$ref_lista;
my $elementos = @lista;
my $ultimo_elemento=$lista[0]; #el ultimo de la lista se ponia el primero
my @lista_ordenada = sort {$a <=> $b} (@lista);
my $max=pop(@lista_ordenada);
my $min=shift(@lista_ordenada);
return 100*(($ultimo_elemento-$min)/($max-$min));
}
sub media_exponencial()
{
my $suma_anterior=$_[0];
my $numero_elementos=$_[1];
my $nuevo_elemento=$_[2];
if ($suma_anterior == 0)
{
return $nuevo_elemento;
}
my $multiplicador_nuevo = 2/($numero_elementos+1); #ponderacion del nuevo elemento
my $multiplicador_resto = 1 - $multiplicador_nuevo; #ponderacion de la suma anterior
return (($suma_anterior * $multiplicador_resto)+($nuevo_elemento*$multiplicador_nuevo));
}
sub sar_parabolico()
{
my $sar_anterior=$_[0];
my $dx = $_[1]; #dx anterior
my $max_dia=$_[2];
my $min_dia=$_[3];
my $maximo_ciclo=$_[4]; #maximo del ciclo
my $minimo_ciclo=$_[5]; #minimo del ciclo
my $tendencia=$_[6]; #tendencia del parabolico
my $condicion_salida=$_[7];#condicion salida parabolico
my $abierto=$_[8];
my $sar;
$_[7]="FALSO"; #condicion de salida
#print "max ciclo = $maximo_ciclo, min_ciclo=$minimo_ciclo , max_dia =$max_dia, min_dia = $min_dia \n";
#print "sar anterior= $sar_anterior max dia=$max_dia tendencia=$tendencia \n";
#si la apertura es menor que el SAR y este es alcista hay que salir con el precio de apertura
if ($abierto ne "" )
{
if ($tendencia eq "BAJISTA" && $abierto>$sar_anterior)
{
$_[7]="VERDADERO";
return $abierto;
}
if ($tendencia eq "ALCISTA" && $abierto<$sar_anterior)
{
$_[7]="VERDADERO";
return $abierto;
}
}
if ($sar_anterior < $max_dia && $tendencia eq "BAJISTA") #condicion de Stop
{
$_[7]="VERDADERO";
return $sar_anterior;
}
elsif ($sar_anterior > $min_dia && $tendencia eq "ALCISTA") #condicion de Stop
{
$_[7]="VERDADERO";
return $sar_anterior;
}
else
{
if ($sar_anterior > $max_dia && $tendencia eq "BAJISTA") #estamos cortos
{
if ($min_dia < $minimo_ciclo) # el minimo es menor que el anterior
{
if ($dx == 0)
{
$dx=0.02;
}
elsif ($dx < 0.19) #con 0.2 no funciona y no se por que
{
$dx = $dx + 0.02;
}
$minimo_ciclo = $min_dia;
}
if ($dx == 0)
{
$dx=0.02;
}
$_[1]=$dx;
$sar = $sar_anterior - $dx * ($sar_anterior - $minimo_ciclo);
return $sar;
}
elsif ($sar_anterior < $min_dia && $tendencia eq "ALCISTA") #estamos largos
{
if ($max_dia > $maximo_ciclo) # el maximo es mayor que el anterior
{
if ($dx == 0)
{
$dx=0.02;
}
elsif ($dx < 0.19) #con 0.2 no funciona y no se por que
{
$dx = $dx + 0.02;
}
$maximo_ciclo = $max_dia;
}
if ($dx == 0)
{
$dx=0.02;
}
$_[1]=$dx;
$sar = $sar_anterior + $dx * ($maximo_ciclo - $sar_anterior);
return $sar;
}
}
}
sub des_tipica()
{
my $ref_lista=$_[0];
my $media=$_[1];
my @lista=@$ref_lista;
my $elementos=@lista;
$suma_diferencia=0;
foreach my $elemento (@elementos)
{
$suma_diferencia=$suma_diferencia+(($elemento-$media)**2);
}
my $varianza=$suma_diferencia/($elementos-1);
return sqrt($suma_diferencia);
}
1;
#Un saludo.
por que no me lo permite, ni extensiones pl ni cgi
pero os dejo la libreria en formato texto.
sub acumulacion_distribucion()
{
my $saldo_anterior=$_[0];
my $volumen=$_[1];
my $maximo_dia=$_[2];
my $minimo_dia=$_[3];
my $cierre=$_[4];
my $saldo;
my $base=$volumen*((($cierre-$minimo_dia)-($maximo_dia-$cierre))/($maximo_dia-$minimo_dia));
if (abs($maximo_dia-$cierre)>abs($minimo_dia-$cierre))
{
$saldo=$saldo_anterior+$base;
}
else
{
$saldo=$saldo_anterior-$base;
}
return $saldo;
}
sub anadir_dia_lista()
{
my $ref_lista=$_[0];
my $abierto=$_[1];
my $max=$_[2];
my $min=$_[3];
my $cierre=$_[4];
my $volumen=$_[5];
my $dias=$_[6];
my @dia=($abierto,$max,$min,$cierre,$volumen);
my $ref_dia=\@dia;
my @lista=@$ref_lista;
my $elementos = @lista;
if ($elementos<$dias)
{
unshift(@lista,$ref_dia);
}
else
{
pop(@lista);
unshift(@lista,$ref_dia);
}
return \@lista;
}
sub max_periodo() #devuelve el maximo de un determinado periodo.
{
my $ref_lista=$_[0];
my @lista=@$ref_lista;
my $max=0;
foreach my $elemento (@lista)
{
my @dia=@$elemento;
if ($dia[1]>$max)
{
$max=$dia[1];
}
}
return $max;
}
sub min_periodo() #devuelve el minimo de un determinado periodo.
{
my $ref_lista=$_[0];
my @lista=@$ref_lista;
my $min=99999999999999999;
foreach my $elemento (@lista)
{
my @dia=@$elemento;
if ($dia[2]<$min)
{
$min=$dia[1];
}
}
return $min;
}
sub cierre_periodo() #devuelve el cierre de un determinado periodo.
{
my $ref_lista=$_[0];
my @lista=@$ref_lista;
my $dia=$lista[0];
my $cierre=$dia->[3];
return $cierre;
}
sub abierto_periodo() #devuelve la apertura de un determinado periodo.
{
my $ref_lista=$_[0];
my @lista=@$ref_lista;
my $elementos=@lista;
my $dia=$lista[$elementos-1];
my $abierto=$dia->[0];
return $abierto;
}
sub iniciar_lista()
{
undef $_[0];
}
sub elementos_lista()
{
my $ref_lista=$_[0];
my @lista=@$ref_lista;
my $elementos = @lista;
return $elementos;
}
sub pivot_point()
{
my $max=$_[0];
my $min=$_[1];
my $cierre=$_[2];
return ($max+$min+$cierre)/3;
}
sub b1()
{
my $max=$_[0];
my $min=$_[1];
my $cierre=$_[2];
my $pivot=($max+$min+$cierre)/3;
return (2*$pivot - $max);
}
sub s1()
{
my $max=$_[0];
my $min=$_[1];
my $cierre=$_[2];
my $pivot=($max+$min+$cierre)/3;
return (2*$pivot - $min);
}
sub lbop()
{
my $max=$_[0];
my $min=$_[1];
my $cierre=$_[2];
my $pivot=($max+$min+$cierre)/3;
return (2*$pivot - 2*$max +$min);
}
sub hbop()
{
my $max=$_[0];
my $min=$_[1];
my $cierre=$_[2];
my $pivot=($max+$min+$cierre)/3;
return (2*$pivot - 2*$min +$max);
}
sub dm_mas()
{
my $max=$_[0];
my $min=$_[1];
my $max_ant=$_[2];
my $min_ant=$_[3];
my $dif_max = $max-$max_ant;
if ($dif_max>0)
{
my $dif_min = $min - $min_ant;
if ($dif_min >= 0)
{
return $dif_max;
}
else
{
if (abs($dif_min)>=$dif_max)
{
return 0;
}
else
{
return $dif_max;
}
}
}
else
{
return 0;
}
}
sub dm_menos()
{
my $max=$_[0];
my $min=$_[1];
my $max_ant=$_[2];
my $min_ant=$_[3];
my $dif_min = $min - $min_ant;
if ($dif_min < 0)
{
my $dif_max = $max - $max_ant;
if ($dif_max <= 0)
{
return abs($dif_min);
}
else
{
if (abs($dif_min)>=$dif_max)
{
return abs($dif_min);
}
else
{
return 0;
}
}
}
else
{
return 0;
}
}
sub di_promedio()
{
my $ref_lista_di = $_[0];
my $ref_lista_tr = $_[1];
my @lista_di = @$ref_lista_di;
my @lista_tr = @$ref_lista_tr;
my $elementos_di = @lista_di;
my $elementos_tr = @lista_tr;
my $suma_di=0;
my $suma_tr=0;
#print "lista trs = @lista_tr \n";
foreach my $elemento (@lista_di)
{
$suma_di=$suma_di+$elemento;
}
foreach my $elemento (@lista_tr)
{
$suma_tr=$suma_tr+$elemento;
}
if ($elementos_tr == 0)
{
return 0;
}
#print "SUMA DI=$suma_di SUMA TR=$suma_tr elementos di=$elementos_di \n";
my $promedio = 100 * (($suma_di/$elementos_di)/($suma_tr/$elementos_tr));
return $promedio;
}
sub dx()
{
my $di_mas = $_[0];
my $di_menos = $_[1];
if (($di_mas+$di_menos)==0)
{
return 0;
}
my $adx=100*(abs($di_mas-$di_menos)/($di_mas+$di_menos));
}
sub adx()
{
my $ref_lista_dx = $_[0];
my $promedio=&media_movil($ref_lista_dx);
return $promedio;
}
sub adxr()
{
my $ref_lista_adx = $_[0];
my @lista_adx = @$ref_lista_adx;
my $elementos=@lista_adx;
my $adx1=$lista_adx[0];
my $adx2=$lista_adx[$elementos-1];
#print "adx1=$adx1 adx2=$adx2 \n";
return ($adx1+$adx2)/2;
}
sub tr()
{
my $cierre_anterior = $_[0];
my $max = $_[1];
my $min = $_[2];
my $tr;
my $dif_diaria = abs($max - $min);
#print "DENTRO DE TR dif_diaria $dif_diaria \n";
if ($dif_diaria>abs($cierre_anterior-$max))
{
$tr=$dif_diaria;
}
else
{
$tr=abs($cierre_anterior-$max);
}
if ($tr > abs($cierre_anterior-$min))
{
return $tr;
}
else
{
return abs($cierre_anterior-$min);
}
}
sub media_movil()
{
my $ref_lista=$_[0];
my @lista=@$ref_lista;
my $elementos = @lista;
my $suma=0;
if ($elementos == 0)
{
return 0;
}
foreach my $valor (@lista)
{
$suma=$suma+$valor;
}
return ($suma/$elementos);
}
sub momentun()
{
my $ref_lista=$_[0];
my $anterior=$_[1];
my @lista=@$ref_lista;
my $elementos = @lista;
my $ultimo_elemento=$lista[0];
my $elemento_anterior=$lista[$anterior];
return ($ultimo_elemento-$elemento_anterior);
}
sub anadir_lista()
{
my $ref_lista=$_[0];
my $numero_elementos=$_[1];
my $nuevo_elemento=$_[2];
my @lista=@$ref_lista;
my $elementos = @lista;
if ($elementos<$numero_elementos)
{
unshift(@lista,$nuevo_elemento);
}
else
{
pop(@lista);
unshift(@lista,$nuevo_elemento);
}
return \@lista;
}
sub rsi()
{
my $ref_lista=$_[0];
my @lista=@$ref_lista;
my $elementos = @lista;
my $num_anterior=0;
my $suma_subidas=0;
my $suma_bajadas=0;
foreach my $num (reverse @lista)
{
if ($num_anterior != 0)
{
my $dif=$num-$num_anterior;
if ($dif<0)
{
$suma_bajadas=$suma_bajadas-$dif;
}
elsif ($dif>0)
{
$suma_subidas=$suma_subidas+$dif;
}
}
$num_anterior=$num;
}
if ($suma_bajadas == 0)
{
return 100;
}
#print "suma_subidas = $suma_subidas , suma_bajadas = $suma_bajadas \n";
return (100 - (100/(1+($suma_subidas/$suma_bajadas))));
}
sub estocastico()
{
my $ref_lista=$_[0];
my @lista=@$ref_lista;
my $elementos = @lista;
my $ultimo_elemento=$lista[0]; #el ultimo de la lista se ponia el primero
my @lista_ordenada = sort {$a <=> $b} (@lista);
my $max=pop(@lista_ordenada);
my $min=shift(@lista_ordenada);
return 100*(($ultimo_elemento-$min)/($max-$min));
}
sub media_exponencial()
{
my $suma_anterior=$_[0];
my $numero_elementos=$_[1];
my $nuevo_elemento=$_[2];
if ($suma_anterior == 0)
{
return $nuevo_elemento;
}
my $multiplicador_nuevo = 2/($numero_elementos+1); #ponderacion del nuevo elemento
my $multiplicador_resto = 1 - $multiplicador_nuevo; #ponderacion de la suma anterior
return (($suma_anterior * $multiplicador_resto)+($nuevo_elemento*$multiplicador_nuevo));
}
sub sar_parabolico()
{
my $sar_anterior=$_[0];
my $dx = $_[1]; #dx anterior
my $max_dia=$_[2];
my $min_dia=$_[3];
my $maximo_ciclo=$_[4]; #maximo del ciclo
my $minimo_ciclo=$_[5]; #minimo del ciclo
my $tendencia=$_[6]; #tendencia del parabolico
my $condicion_salida=$_[7];#condicion salida parabolico
my $abierto=$_[8];
my $sar;
$_[7]="FALSO"; #condicion de salida
#print "max ciclo = $maximo_ciclo, min_ciclo=$minimo_ciclo , max_dia =$max_dia, min_dia = $min_dia \n";
#print "sar anterior= $sar_anterior max dia=$max_dia tendencia=$tendencia \n";
#si la apertura es menor que el SAR y este es alcista hay que salir con el precio de apertura
if ($abierto ne "" )
{
if ($tendencia eq "BAJISTA" && $abierto>$sar_anterior)
{
$_[7]="VERDADERO";
return $abierto;
}
if ($tendencia eq "ALCISTA" && $abierto<$sar_anterior)
{
$_[7]="VERDADERO";
return $abierto;
}
}
if ($sar_anterior < $max_dia && $tendencia eq "BAJISTA") #condicion de Stop
{
$_[7]="VERDADERO";
return $sar_anterior;
}
elsif ($sar_anterior > $min_dia && $tendencia eq "ALCISTA") #condicion de Stop
{
$_[7]="VERDADERO";
return $sar_anterior;
}
else
{
if ($sar_anterior > $max_dia && $tendencia eq "BAJISTA") #estamos cortos
{
if ($min_dia < $minimo_ciclo) # el minimo es menor que el anterior
{
if ($dx == 0)
{
$dx=0.02;
}
elsif ($dx < 0.19) #con 0.2 no funciona y no se por que
{
$dx = $dx + 0.02;
}
$minimo_ciclo = $min_dia;
}
if ($dx == 0)
{
$dx=0.02;
}
$_[1]=$dx;
$sar = $sar_anterior - $dx * ($sar_anterior - $minimo_ciclo);
return $sar;
}
elsif ($sar_anterior < $min_dia && $tendencia eq "ALCISTA") #estamos largos
{
if ($max_dia > $maximo_ciclo) # el maximo es mayor que el anterior
{
if ($dx == 0)
{
$dx=0.02;
}
elsif ($dx < 0.19) #con 0.2 no funciona y no se por que
{
$dx = $dx + 0.02;
}
$maximo_ciclo = $max_dia;
}
if ($dx == 0)
{
$dx=0.02;
}
$_[1]=$dx;
$sar = $sar_anterior + $dx * ($maximo_ciclo - $sar_anterior);
return $sar;
}
}
}
sub des_tipica()
{
my $ref_lista=$_[0];
my $media=$_[1];
my @lista=@$ref_lista;
my $elementos=@lista;
$suma_diferencia=0;
foreach my $elemento (@elementos)
{
$suma_diferencia=$suma_diferencia+(($elemento-$media)**2);
}
my $varianza=$suma_diferencia/($elementos-1);
return sqrt($suma_diferencia);
}
1;
#Un saludo.