RECURSOS PERL

Foro genérico sobre programas relacionados con el trading: gráficos, ejecución de órdenes, automatización, etc.
Responder
Avatar de Usuario
Mikelon
Mensajes: 1152
Registrado: 27 Sep 2005 16:17

RECURSOS PERL

Mensaje por Mikelon »

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.
Avatar de Usuario
Mikelon
Mensajes: 1152
Registrado: 27 Sep 2005 16:17

Se me olvidaba

Mensaje por Mikelon »

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.
Responder

Volver a “Software”