Lektion 10
Previous Topic  Next Topic 

Tips och tricks när man skriver script

När man skriver längre script kan det vara bra att tänka på några saker:

  • Använd {} för att kommentera saker så att scriptet blir tydligt och lättläst, tex:

    { beräkna medelvärde av Close }
    medelvärde1:=mov(c,20,s)
  • Tänk på att inte använda variabelnamn som är delnamn av andra variabler, tex:

    kurva:=hhv(aref(h,1),5)
    kurva2:=hhv(aref(h,1),10)

    vilket blir fel eftersom kurva är delnamn av kurva1. Korrekt sätt att skriva är:

    kurva1:=hhv(aref(h,1),5)
    kurva2:=hhv(aref(h,1),10)

  • Tänk på att inte använda variabelnamn som är delnamn av kommandon, tex:

    rsi:=rsi(14)

    använd istället unika tilldelade namn:

    rs_värde:=rsi(14)

  • Intradayprefix och upplösning anges med intradayprefix, tex:

    medelvärde:=mov(c,20,s)
    i15(
    köpsignal=gt(c,medelvärde)
    mult(köpsignal,10)
    )

    Detta anger att scriptet ska köras i 15-minutersupplösning. Notera att i15( anger början på intradayprefixet, samt att sista raden med slutparentes anger slutet. Innanför dessa parenteser läggs alla eventuella minnesreferenser (beskrivs nedan).


Minnesreferenser

När man skriver längre script kommer man förr eller senare att nå den maximalt tillåtna parentesdjupsnivån av 10. Då kan man använda sk minnesreferenser. Kompilatorn som kör scriptet exekverar då scriptet lite annorlunda, så att det inte bygger på med fler parentesdjup. Dessutom går exekveringen snabbare vilket är en fördel när man kör simuleringar på historiskt kursdata osv.

Rent praktiskt tar man bort kolon framför likhetstecken vilket gör att kodraden räknas som en minnesreferens. Upp till 512 minnesreferenser kan användas i ett och samma script.


Exempel med OMX Tracker. Minnesreferenserna ligger samlade innanför intradayprefixet (markerat i rött):


{Tracker long}

{ 120318 }
datum_ok:=eqv(int(d),int(date()))
o1:=Osc(c,4,20,s)
rgln1:=Mov(LinReg(c,40),2,s)
ma2:=Mov(c,3,e)
oupp:=Llv(Lt(HhvBars(o1,2),1),2)
stängning1:=le(mult(1440,sub(market(c),frac(date()))),12)
ej_innehav:=le(portfolio(v),0)
datum:=ge(DayOfMonth(),23)

i40(
{ korrigera överskottsinnehav }

överskott=lt(portfolio(v),scrpar(20))
inpådagen=gt(frac(d),0.46)
regupp=Lt(HhvBars(rgln1,2),1)
signal1=And(oupp,llv(regupp,10))
signal2=And(Hhv(Macd(b),5),or(signal1,Not(Hhv(Macd(s),3))))
signal3=and(And(And(signal2,1),inpådagen),gt(macd(n),macd(t)))
signal5=And(signal3,Or(Lt(o1,Sub(0,13)),or(datum,Or(Hhv(regupp,12),Gt(ma2,rgln1)))))
signal6=And(signal5,And(Gt(l,Ref(l,1)),Gt(h,Ref(h,1))))
signal7=and(and(And(signal6,Not(stängning1)),ej_innehav),datum_ok)
signal8=or(signal7,and(överskott,not(stängning1)))
mult(and(signal8,1),10)
)


Att tänka på när man använder minnesreferenser

Om du får syntaxfel med ett längre script kan det vara så att du överskridit 10 parentesdjupsnivåer, vilket i så fall visas i syntaxrapporten. Prova att göra om nedersta raderna till minnesreferenser för att minska det totala antalet parentesdjupsnivåer. Det finns några regler för vad som är tillåtet i samband med minnesreferenser:


  • Alla minnesreferenser måste ligga innanför eventuellt intradayprefix (om sådant används).
  • Det är inte tillåtet att blanda minnesreferenser med tilldelade namn - dvs from den punkt i scriptet där man börjat använda minnesreferenser måste man fortsätta hela vägen ner
  • Det går att använda minnesreferenser även i script för dagsupplösning. Inget intradayprefix används i så fall.
  • Avsluta alltid ett script som innehåller minnesreferenser med en funktion, dvs ett returvärde från en funktion, ex:

    Mult(signal8,10)

    eller

    Add(0,signal8)