Innledning
Futurelook er Vikingens eget modellspråk. Alle modeller i Vikingen er kodet i dette språket, og du kan selv lage egne modeller i Vikingen med Futurelook. Med «modell» menes diagram.

For alle som har programmert i C++, C#, Java, Pascal, Basic eller lignende programmeringsspråk, vil det gå raskt å sette seg inn i hvordan man utvikler en egen analysemodell i Vikingen ved hjelp av Futurelook.
I funksjonsredigereren kan du opprette nye funksjoner og redigere kildekoden til eksisterende modeller. Når du har laget analysemodellen din, må du angi innstillinger for hvordan diagrammer, tabeller og konfigurasjonsvinduer skal se ut.
Dette gjør Futurelook til et svært fleksibelt og kraftfullt verktøy for å utvikle unike analysemetoder for finansmarkedene.

Denne nettveiledningen er ment som en innføring i programmeringsspråket Futurelook for brukere uten tidligere erfaring med programmering. Vi vil gå gjennom alle nødvendige begreper og bygge opp veiledningen rundt en rekke eksempler for å gjøre læringen enklere for nybegynnere. Veiledningen er delt inn i tre ulike deler
Kapittel 1, 2: En innføring i Futurelook og dets deler, samt en første innføring i programmering
Kapittel 3, 4 og 5: Informative kapitler om programmeringsspråket, beskrivelse av de tilgjengelige verktøyene
Kapittel 6, 7 og 8: Futurelook i praksis – hvordan bruker man programmet til å ta en idé og gjøre den om til en fullstendig, profesjonell modell?
Introduksjon til Futurelook
FutureLook er et svært kraftfullt verktøy for finansanalytikere og investorer. Med FutureLook er det mulig å enkelt lage egne algoritmer for å utføre komplekse tidsserieanalyser og teknisk analyse. FutureLook er bygget opp som et enkelt programmeringsspråk, med et tilpasset funksjonsbibliotek som er egnet for analyse av finansielle tidsserier. FutureLook er integrert med Vikingen og koblet sammen med Vinstgeneratorn, noe som gjør det enkelt å teste algoritmene med tanke på avkastning.
[bilde av modulmenyen]
Utad består FutureLook av noen filer som er lagret i Vikingen. Det dreier seg om modeller og presentasjoner.
Introduksjon til Futurelook – Funksjonsredigereren
Funksjonsredigereren er verktøyet man bruker til å programmere modellen sin. Ved å starte Funksjonskontrollen (’Moduler’ –> ’Funksjonskontroll’) kan du bla gjennom det eksisterende funksjonsbiblioteket som finnes i din Viking og opprette nye biblioteker eller funksjoner. Funksjonsredigereren er et enkelt tekstvindu som brukes til å redigere og lage egne modeller, kompilere disse og skrive hjelpetekster. Du kommer til funksjonsredigereren enten ved å opprette en «Ny» modell eller ved å «redigere» en som allerede finnes.
Tips: Ved å klikke på «Vis innhold» kan man se en forhåndsvisning av funksjonene, noe som kan være nyttig hvis man leter etter et stykke kode man kan gjenbruke.
I tillegg til selve tekstfeltet har funksjonsredigereren knapper for å «Lagre» funksjonen etter at man har gjort endringer, og «Kompilere» koden for å gjøre funksjonen kjørbar i Vikingen. Man kan også bruke «Kjør»-knappen for raskt å starte funksjonen med standardinnstillinger for å sjekke at koden fungerer som forventet. Til slutt finnes det en «Presentasjon»-knapp som sender deg videre til «Presentasjonsredigereren» for å foreta de grafiske innstillingene for modellen. Funksjonsredigereren har to moduser, hvor «Rediger hjelp» kan brukes til å redigere hjelpefilen i stedet for programkoden.
Introduksjon til Futurelook – Presentasjonsredigereren
Når du i Vikingen åpner «analytikeren» og velger en modell, peker du faktisk på en presentasjon. Denne presentasjonen inneholder informasjon om hvilken modell som brukes, samt hvordan den skal presenteres og med hvilke innstillinger. Dette gjør at man kan ha flere separate presentasjoner som bruker de samme underliggende modellene. I tillegg til sin funksjon som «grensesnitt» inneholder presentasjonsmodellen også opplysninger om hvordan diagrammet eller tabellen ser ut, samt hvilke innstillinger brukeren kan foreta, for eksempel å endre tidsintervall, farger eller bytte til logaritmisk skala. Presentasjonen inneholder også hjelpeinformasjon, samt spesifikasjoner for hvordan utdata skal håndteres i modelltabellen.
Grunnleggende om Futurelook
Programmets struktur, utforming
Par(); |
Parametere: Håndtering av inndata og utdata. Definer hvilke inndata som skal brukes i funksjonen, samt hvilke dataserier som skal kunne hentes ut fra modellen. | |
Hvor |
Variabler: Definer hvilke variabler som skal brukes lokalt i programmet, men ikke som utdata. | |
Start og slutt; |
Start og slutt for selve programkoden. Her kan du kun bruke objekter som er definert i segmentene ovenfor, og kalle opp funksjoner som finnes i Vikings funksjonsbibliotek. |
Kommentarer
Ulike programmeringsspråk bruker ulike tegn for å signalisere til kompilatoren at det som skrives ikke er programkode som den forstår, men er ment for programmereren. Tekst om hvorfor kommentert kode er viktig Futurelook bruker tegnkombinasjonene // for å signalisere at alt på samme linje er en kommentar, samt (* og *) for å signalisere at alt som skrives mellom tegnene er kommentarer.
Altså:
// Dette er en kommentar! (* Dette er en kommentar som strekker seg over flere linjer! *)
En første titt på: Parametere
Det første segmentet i hver funksjon i Futurelook er definisjonen av parametrene. Her angir du hvordan Vikingen skal håndtere inndata (ett eller flere objekter), hvilke utdata som skal kunne hentes ut av funksjonen (f.eks. i en modelltabell) samt hvilke parametere som skal være tilgjengelige i modellinnstillingene (antall perioder for MAV osv.) Forenklet kan man si at par-segmentet skal se ut som følger:
par( [flagg] identifikator : datatype ; [flagg2] identifikator2 : datatype2 ; .. ) : [returtype] ;
Der [flag] er en spesifikasjon for hvordan Futurelook skal håndtere dataene:
out : |
Dataene kan brukes som utdata, for eksempel som en graf i diagrammet eller som en tabellkolonne i modelltabellen. |
|
var : |
datat brukes som en variabel, akkurat som om den var definert under var-segmentet i stedet for par-segmentet. Forskjellen er at hvis man definerer den under par-segmentet med flagget var, blir den synlig i presentasjonsredigereren og kan dermed hentes frem senere hvis man ønsker det. |
|
: |
Hvis det ikke er noen flagg, betyr det at dataene skal inn i modellen (tenk på det som det motsatte av «out»). |
|
:returtype |
Ved å angi en datatype etter : etter den avsluttende parentesen, definerer man hva funksjonen skal returnere. Dette brukes når man skal kalle opp funksjonen inne i en annen funksjon, og krever at man avslutter programmet med å definere «return [identifikator];» før den siste «end;»-linjen. |
For eksempel betyr «out utvektor1 : realvector;» at «utvektor1» er navnet på en vektor der innholdet er av typen real, og at denne vektoren skal sendes ut av modellen for å kunne brukes grafisk eller i modelltabellen.
En første titt på: Variabler
Variabler er data som du ønsker å bruke inne i funksjonen, men som ikke trenger eller skal brukes utenfor. Dette kan være data av typen integer, dvs. heltall som brukes som teller i en løkke, eller vektorer som brukes mens funksjonen kjører, men som ikke trenger å brukes som utdata. I stilisert form er «var»-segmentet noe enklere enn «par»-segmentet og ser slik ut:
identifikator : datatype ; ..
Legg merke til at «var»-segmentet ikke avsluttes med noe spesielt tegn eller ord, men at alle deklarasjoner med syntaksen ovenfor som står etter «var» og før «begin», blir deklarerte variabler i programmet.
En første titt på: Funksjoner
Alle funksjonene i Vikings funksjonsbibliotek kan brukes i dine egne funksjoner ved hjelp av følgende syntaks:
[biblioteksnavn].[funksjonsnavn](parameter1, parameter2, .. );
Som eksempel kan man kalle opp funksjonen «MAVN», som finnes i funksjonsbiblioteket «Std», med følgende påkall
std.MAVN(a,b);
Vi vet at MAVN beregner et naturlig gjennomsnitt av en dataserien «a» av typen reell vektor, sett over de siste «b» periodene. Hvis vi ønsker et 20-perioders gjennomsnitt av sluttkursen til hovedobjektet, skriver vi dermed:
std.MAVN(main.close, 20);
En første titt på: Operatører
Mange av uttrykkene som brukes i Futurelook vil inneholde operatorer. En operator er et tegn som tilsvarer en av en rekke forskjellige ting, for eksempel en matematisk regneoperasjon eller en sammenligning mellom to ting. Operatorene må ha to parametere å arbeide med og vil etter operasjonen returnere en verdi.
Man kan for eksempel beregne indekskursen for S&P 500 i SEK ved å multiplisere en vektor sp500, som består av indeksen, med en vektor sekusd, som består av kronekursen.
SP500SEK := sp500 * sekusd;
Operatoren i dette tilfellet er multiplikasjon *. Futurelook vet at både sp500 og sekusd er vektorer, og sørger for at resultatet av operasjonen også blir en vektor. Dermed er alt klart for å vise SP500Sek på skjermen akkurat slik man ønsker.
En første titt på: Et eksempelprogram
Vi har nå fått et første innblikk i de ulike komponentene som utgjør et program i Futurelook, og kan derfor begynne å tenke på helheten: hvordan ser en fullstendig modell ut?
Som eksempel skal vi skrive en modell som beregner to forskjellige glidende gjennomsnitt av sluttkursene på en aksje og et glidende gjennomsnitt av omsetningsvolumet for den samme aksjen.
par(main : instrument; out MV1, MV2, MVVol : realvector; MAV1Length, MAV2Length, MAVVolLength : integer); var filledclose : realvector; begin filledclose
Vi bryter ned koden for å undersøke alle delene ut fra det vi har lært i dette avsnittet.
par(main : instrument;
Den første parameteren som defineres, er et objekt av typen instrument, som vi kaller main. I en vanlig modell vil denne linjen alltid være til stede, siden vi ønsker at modellen skal kjøres på «Aktuelt objekt» i Vikingen.
out MV1, MV2, MVVol : realvector;
Vi definerer også tre vektorer som vi ønsker skal kunne være desimaltall, altså reelle vektorer, og vi ønsker å kunne se dem i diagrammet, så vi angir prefikset «out» for dem.
MAV1Length, MAV2Length, MAVVolLength : heltall);
Modellen skal bruke tre parametere som bestemmer hvordan modellen fungerer, nemlig de tre ulike periodene for de glidende gjennomsnittene. Ved å ikke angi dem som «out», sier vi indirekte at modellen krever disse tre som inngangsparametere. Husk at den siste linjen under «par»-segmentet skal avsluttes med );
var filledclose : realvector;
I «var»-segmentet definerer vi en vektor som vi ønsker skal kunne inneholde desimaltall, altså en reell vektor. Ved å definere den under «var»-segmentet kan vi ikke tegne vektoren i diagrammet, men bruker den kun inne i modellen.
begynne
Alt som står skrevet mellom «begin» og det siste «end» utgjør selve instruksjonen for hva modellen skal gjøre
filledclose := std.FILL(main.close);
Først bruker vi standardfunksjonen FILL for å fylle vektoren filledclose med alle sluttkursene som finnes i objektet main, og i tillegg fylle ut eventuelle hull i vektoren dersom det skulle mangle data.
MV1 := std.MAVN(filledclose,MAV1Length);
Deretter tilordner vi vektoren MV1 det glidende gjennomsnittet av filledclose med periodelengden MAV1Length
MV2 := std.MAVN(filledclose, MAV2Length);
I tillegg tildeler vi vektoren MV2 det glidende gjennomsnittet av filledclose med den andre periodelengden MAV2Length
MVVol := std.MAVN(main.vol, MAVVolLength);
og til slutt tilordner vi vektoren MVVOL verdier som tilsvarer det glidende gjennomsnittet av objektets volumvektor main.vol.