tabla de contenidoTabla de contenido

Estrategia - Manual de programación

El lenguaje de programación de estrategias se basa en la nomenclartura de Object PASCAL. Se incluyen una serie de objetos (veremos más adelante que es un objeto) que permiten interaccionar con FinanforPRO dando acceso a todos los datos (cambio, máximo, mínimo, RSI, ... cualquier dato que se vea en pantalla) y otros de diferente índole, como uno para simular el acceso a un broker y realizar una compra, buscar valores por nombre, ...

Para poder programar previamente se precisan unos conocimientos mínimos de programación que se cubrirán en este apartado.

Para una descripción de todas las clases disponibles, puede pulsar aquí.

 

Estructura

Un programa en FinanforPRO es un conjunto de instrucciones que siguen una sintaxis y estructura concreta. Concretamente es esta:

var
Declaraciones de variables
. . .
begin
. . .
comandos
. . .
end.

var
Es una palabra reservada que se añade únicamente si vamos a declarar variables.

begin
Indica que comienza el código del programa. Es obligatorio ponerlo.

end.
Indica que es el final del código del programa. Es obligatorio ponerlo.

 

Variables

Las variables son estructuras de datos que pueden cambiar de contenido a lo largo de la ejecución de un programa. Pueden contener distintos tipos de información como, por ejemplo, una fecha, un número, una cadena de caracteres, ... Para que el programa sepa si se trata de una fecha, un número, una cadena de caracteres, ... se debe declarar el tipo de variable que es. En el caso de que los tipos representen números, éstos pueden contener el valor que esté comprendido entre un número máximo y un número mínimo (esto se debe a que ocupan más o menos memoria).

Actualmente hay definidos los siguientes tipos:

La forma de definir una variable es poniendo el nombre que se quiera dar a la variable, seguido de :, seguido del tipo de la variable y seguido de un ;. El nombre de la variable es libre, no obstante debe seguir unas reglas mínimas:

P.e., si queremos definir una variable que represente el contenido del RSI 40, el cual es un número con decimales, deberíamos escribir esto:

var
RSI40: real;

Cuando se declara más de una variable del mismo tipo, se pueden poner todos los nombres separados por una coma y al final el tipo. P.e., vamos a añadir a la definición anterior las variables maximo, minimo y cambio del tipo currency.

var
RSI40: real;
maximo, minimo, cambio: currency;

Aparte de los tipos de variable que hemos visto anteriormente, existe un tipo especial llamado clase. Una clase tiene la peculiaridad que no contiene un valor determinado (un número, fecha, una cadena de caracteres, ...), sino que lo que contiene es una lista de métodos. Un método es el nombre que se le ha dado a un trozo de código que realiza una funcionalidad determinada. Por ejemplo, en las estrategias existe definida una clase llamada TDatosSesion que tiene muchos métodos, entre ellos uno que se llama Cambio. Gracias a este método se puede obtener el valor del cambio de un valor de la base de datos del FinanforPRO. Para declarar una variable de este tipo sencillamente seguiríamos las mismas reglas anteriores. Vamos a declarar, por ejemplo, una variable que represente la clase TDatosSesion y vamos a llamarle DatosSesion:

var
DatosSesion: TDatosSesion;

Existen otras clases definidas, como por ejemplo TBroker, la cual tiene unos métodos que nos permiten simular la compra de un valor en un broker.

Durante la ejecución del programa, podemos ir cambiando el valor de las variables o realizar operaciones entre ellas. Por ejemplo, podemos asignar un número con decimales a la variable RSI40 que hemos definido anteriormente. Sin embargo, ¿que valor se puede asignar a una variable que sea una clase? Cuando una variable de tipo clase tiene un valor concreto se le denomina objeto. Por defecto, las estrategías ya tienen definidas varias variables de diferentes tipos de clase y éstas ya contienen un objeto de ese tipo. Las variables que hay definidas son:

En cualquier parte del código podemos usar cualquiera de estas variables.

Como los objetos son de una clase determinada y las clases lo que permiten es acceder a los métodos debe existir una nomenclatura para determinar a que método se quiere acceder. La forma de hacerlo es poner el nombre de la variable, un punto y el nombre del método. Por ejemplo, el objeto Datos de tipo TDatos tiene varios métodos, entre ellos uno llamada Diario (que da acceso a los datos diarios) y otro llamado Semanal (que da acceso a los datos semanales). Para acceder a los datos diarios escribiriamos lo siguiente:

begin
Datos.Diario;
end.

Para acceder a los datos semanales:

begin
Datos.Semanal;
end.

Ambos objetos devuelven otro objeto de tipo TDatosSesion, que es una clase que, como tal, tiene métodos, los cuales nos permiten acceder a los datos que hay en el FinanforPRO. Por ejemplo, tiene un método llamado Cambio, otro llamado Maximo, otro llamado Minimo y muchos más. Para acceder al cambio diario escribiriamos esto:

begin
Datos.Diario.Cambio;
end.

Si quisieramos el cambio semanal:

begin
Datos.Semanal.Cambio;
end.

y si quisieramos el cambio, maximo y minimo diario:

begin
Datos.Diario.Cambio;
Datos.Diario.Maximo;
Datos.Diario.Minimo;
end.

Aquí puede observarse como cada vez escribimos Datos.Diario para acceder a los datos diarios. Tal como hemos dicho, Datos.Diario devuelve un objeto de tipo TDatosSesion, por eso precisamente podemos acceder a Cambio, Maximo y Minimo. Como devuelve un objeto de tipo TDatosSesion podríamos crear una variable que contuviera ese objeto, con lo que se simplificaría el código y sería más rápido, ya que no tendría que ir cada vez a buscar el mismo objeto. El código equivalente introduciendo una variable, que la llamaremos DatosSesion, sería:

var
DatosSesion: TDatosSesion;
begin
DatosSesion := Datos.Diario;
DatosSesion.Cambio;
DatosSesion.Maximo;
DatosSesion.Minimo;
end.

Asignación de valores a las variables

En el cuerpo del programa se suelen asignar valores a variables. La forma de hacerlo es poner el nombre de la variable, los caracteres := y el valor de la variable. Por ejemplo:

var
margen: Real;
mensaje: String;
DatosSesion: TDatosSesion;
cambio: currency;
begin
margen := 2.25;
mensaje := 'Mi mensaje';
DatosSesion := Datos.Diario;
cambio := DatosSesion.Cambio;
end.


Objetos

Por defecto las estrategías ya permiten acceder a diferentes objetos que hay predefinidos:

Cada objeto tiene métodos concretos que realizan diferentes funciones. Dentro de los métodos existen 2 tipos diferentes:

A su vez, cualquier método puede tener parámetros de entrada. Los parámetros de entrada son valores o variables que se le pasan a los métodos para que puedan realizar su cometido según el valor de los parámetros. El método define el número de parámetros y de que tipo son. Por ejemplo, en la clase TBroker existe el método AbrirPosicionMercado(puntos: integer; largos: boolean; stop: currency); La definición de este método nos está diciendo que su nombre es AbrirPosicionMercado, el cual tiene 3 parámetros, puntos que es de tipo integer, largos que es de tipo boolean y stop que es de tipo currency. En este caso concreto, el método necesita estos 3 parámetros para realizar su función, que es simular una entrada a mercado. El primer parámetro, puntos, sencillamente es para dar la puntuación a esa posición (está pensado para el caso de cartera, donde un día pueden haber muchísimas entradas a diferentes valores y los posibles candidatos se ordenarían de mayor puntuación a menor). Como el tipo es integer, podemos poner un número entero desde −32768 a + 32767. El segundo parámetro es para indicarle si es entra largo o corto. Como el tipo es boolean, solo podemos poner o true o false. El tercer parámetro indica el stop que se adjunta. Como es de tipo currency, podemos ponerle un valor decimal, como por ejemplo 12.25.

Veamos un ejemplo donde recuperamos el stop diario, lo guardamos en una variable llamada stop y nos posicionamos largo a mercado.

var
stop: currency;
begin
stop := Datos.Diario.Stop;
Broker.AbrirPosicionLimitada(0, true, stop);
end.

Observemos el método Stop del objeto Diario. Si miramos su definición es la siguiente: Stop: currency; Esto indica que este método va a devolver una valor de tipo currency. En este ejemplo, hemos definido la variable stop precisamente de ese tipo para poder guardar el valor (el signo := se utiliza para asignar el valor que hay a la derecha del signo en la variable que hay en la izquierda) y luego la hemos utilizado para pasarlo como parámetro al método AbrirPosicionLimitada.

Como el método Stop devuelve un currency y el tercer parámetro del método AbrirPosicionLimitada espera que se le pase un currency, también hubiesemos podido escribir el código anterior de la siguiente forma:

begin
Broker.AbrirPosicionLimitada(0, true, Datos.Diario.Stop);
end.

 

Operaciones aritméticas

Las operaciones aritméticas se realizan con los símbolos internacionalmente reconocidos: +, , * , y / respectivamente. Ejemplo:

var
a, b: integer;
c: real;
begin
a := 3 + 5;
b := a - 2;
b := b * a * 6;
c := -b / 12;
end.

Cuando se desea operar con más de dos datos hay que especificar claramente y sin ambigüedad el orden en que se quieren realizar las operaciones. Para ello, podemos ayudarnos de los paréntesis con el mismo fin con el que se usan en las expresiones aritméticas. Por ejemplo, la siguiente instrucción

b := ( -37.0 * (a - 2) ) / (a + 5);

carece de ambigüedad. No obstante, el PASCAL tiene una prioridad establecida para el orden de las operaciones:

  1. paréntesis.
  2. multiplicación y división.
  3. suma y resta.

Las siguientes instrucciones son equivalentes:

b := -27.0 * c + 35 / a + b + c;
b := ( (-27.0) * c ) + ( 35 / a ) + b + c;
b := ( -27.0 * c ) + ( 35 / a ) + b + c;

y la forma concreta en la se debe escribir es aquella que resulte menos confusa. Un error común entre principiantes es escribir la instrucción {i} queriendo escribir la {ii}:

{i}  b:= a * 27.0 / b + c;
{ii} b:= a * 27.0 / ( b + c );

 

Operadores lógicos

Los operadores lógicos que proporciona el sistema son de dos tipos:

El primero de estos tipos es muy útil para tomar decisiones como resultado de la comparación de variables. La forma general en la que aparecen estos operadores es:

=
<>
>

A   <   B
<=
>=

donde A y B pueden ser números reales , enteros o caracteres, mientras que el resultado de la operación es un dato boolean (false o true). La restricción es que A y B han de ser constantes o variables del mismo tipo.

El resultado de la operación será true (cierto) en los siguientes casos:

Operador Condición
= A es igual a B
<>  A es diferente a B
A es mayor que B
A es menor que B
>= A es mayor o igual que B
<= A es menor o igual que B

Para el segundo caso, en el que tengamos condiciones booleanas donde el valor resultante es true o false directamente, tenemos los siguientes operadores

 

Operador Condición
not not A es equivalente a negar el valor. Por ejemplo, si A es true, not A es false
and A and B devuelve true si A y B son true
or A or B devuelve true si A o B son true

Por ejemplo:

if (Datos.Diario.Zona = zAMas) or (Datos.Diario.Zona = zAMenos) then
...

 

Sentencias de control - Condicionales

La mayoría de los procedimientos que podemos diseñar para resolver problemas incluyen la elección de uno entre los casos posibles en función del valor particular de alguno de los datos. Las sentencias de control que podemos usar son la condicional simple if .. then ... else.

if datoBoolean then
  accion1
else
  accion2;

La parte else es opcional:

if datoBoolean then
  accion1;

Si se desea realizar más de una acción, se debe utilizar begin ... end

if datoBoolean then begin
  accion1;
  ...
  accionN;
end
else begin
  accion2;
  ...
  accionN;
end;

donde datoBoolean es una variable de tipo boolean o una operación cuyo resultado devuelva un dato de tipo boolean. accion1, accion2, ... accionN son instrucciones que pueden ser tanto simples como compuestas.

El efecto de esta sentencia de control es el siguiente: si datoBoolean es true se procede a ejecutar las instrucciones especificadas en el then. En el caso de que sea false y esté presente la parte else, se procede a ejecutar las instrucciones especificadas en el else.

 

Sentencias de control - Repetición

Se trata de instrucciones que gobiernan la realización de tareas repetitivas mientras no sea cierta la condición que se imponga para la finalización.
Existen tres estructuras de repetición: for ... do, while... do y repeat ... until.

 

for ... do

Sintaxis:

for identificador := principio to final do begin
  accion1;
  ...
  accionN;
end;

donde identificador es una variable que puede almacenar un dato ordinal, principio es el valor que se le asigna a esa variable antes de realizar la acción, final es el valor máximo que puede alcanzar la variable antes de finalizar la acción.

Por ejemplo, calcular la media de los 5 últimos cambios:

var
i : integer;
cambio: currency;
begin
cambio := 0;
for i := 1 to 5 do begin
  cambio := cambio + Datos.SesionNum(i).Diario.Cambio;
end;
cambio := cambio / 5;
end.

 

while ... do

La estructura while ... do ejecuta las acciones mientras se cumpla una condición.

Sintaxis:

while condicion do begin
  accion1;
  ...
  accionN;
end;

donde condicion es una expresión cuyo resultado es un dato boolean, y accion1 ... accionN son las acciones que se repetirán mientras condición se evalúe a true.

Por ejemplo, contar el número de sesiones en el que ha tardado el valor en subir 1 euro.

var
i: integer;
cambio: currency;
begin
i := 1;
cambio := Datos.Diario.Cambio - 1;
while Datos.SesionNum(i).Diario.Cambio > cambio do begin
  i := i + 1;
end;
end.

 

repeat ... until

La estructura repeat ... until ejecuta una vez las acciones y las repite hasta que se cumpla una condición.

Sintaxis:

repat
  accion1;
  ...
  accionN;
until condicion;

donde condicion es una expresión cuyo resultado es un dato boolean, y accion1 ... accionN son las acciones que se repetirán hasta que la condición se evalúe a true.

Por ejemplo, contar el número de sesiones en el que ha estado el indicador de Dobson 10 ha estado por debajo de 1.

var
i: integer;
begin
i := 0;
repeat
  i := i + 1;
until Datos.SesionNum(i).Diario.Dobson10 >= 1;
end.

tabla de contenidoTabla de contenido