Jag har funderat lite på hur man skulle kunna konstruera ett filter mot:
a)"fladdrande" falska signaler (särskilt för exit i snabba modeller) samt
b) att kunna blockera att en signal "ligger på" ända till dess att en signal åt andra hållet triggas.
Vi tar ett köpscript som exempel.
Ett vanligt sätt att lösa a) på är att låta scriptet jobba på signalen en period bakåt exempelvis:
i30(
bla, bla
buy7=and(.....)
buy8=aref(buy7,1)
mult(buy8,5)
)
Problemet med detta är att man måste vänta till hela innevarande period passerats och har man då 30min perioder och signalen kommer i början hinner mycket hända. Jag har istället tänkt mig att man ska kunna ställa en delay på exempelvis 5min från det att signalen ges till dess att signalen löser ut på riktigt.
Vad gäller problemet med b) så innebär det att inga sopploss eller manuella positioner kan tas så länge signalen är på. Gör man det i alla fall tar modellen genast en ny position åt det håll man ville komma ur, vilket är mycket irriterande. Jag har här tänkt mig en ställbar blockering för hur lång tid signalen får vara aktiv.
Nedanstående script-tillägg är tänkt att lösa ovanstående problem och är tänkt att kunna fungera med vilket script som helst.
Exemplet gäller ett köpscript.
OBSERVERA FÖLJANDE:
Fladdervariabeln "signal_delay" anger den tid i minuter som skall förflyta från det att det ursprungliga scriptet signalerat till dess att order är tillåten att tas.
Om denna variabel sätts till noll är fladderfiltret inaktiverat.
Fladdervariabeln "signal_lock" anger den tid i minuter som ska förflyta från det att order är tillåten att tas till dess att signalen ej längre är aktiv.
{ Fladderfilter samt begränsad köpsignal }
{ köper endast inom intervallet: 5min< intervall <8min efter det att signal triggats, ställbart }
{ Vanliga villkor i de flesta script }
{ säkerställa att inga positioner tas vid dagens start innan start_delay passerats }
start_delay:=2
minut_nu:=mult(frac(date()),1440)
inpådagen:=gt(minut_nu,add(540,start_delay)) { 540 är kl 9.00 }
{ säkerställ att databastid och systemtid är på samma dag }
datum_ok:=eqv(int(d),int(date()))
{ nya tillägg innan intraday-parantesen}
{ Fladdervariabler }
signal_delay:=5
signal_lock:=3
{ Säkerställer blockering av cellskrivning under diagramkörningen }
block_diag_skriv:=and(datum_ok,eqv(cum(1),1)) {Villkor för live-körning}
{block_diag_skriv:=1} {Villkor för bänk-körning}
{ Tidslucka innan första positionen tas efter öppning}
innan_position:=and(ge(minut_nu,540),le(minut_nu,add(540,start_delay)))
{ befintligt köpscript }
i30(
Bla, bla,
buy7=and(......,inpådagen)
)
{ tillägg att lägga inom intraday-parantesen sist i scriptet (efter buy7) }
{ Nolla cell innan handel }
nollvillkor1=and(innan_position,gt(Getgvar(500,N),0))
SetGvarIf(0,500,and(nollvillkor1,block_diag_skriv),T) { Nollställer cell 500 innan handeln börjar }
{ Skriv tid i cell }
nysignal=and(buy7,eqv(GetGvar(500,N),0))
SetGvarIf(minut_nu,500,and(nysignal,block_diag_skriv),T)
minsedan_signal=if(gt(GetGvar(500,N),0),sub(minut_nu,GetGvar(500,N)),0)
tid_ok=if(and(ge(minsedan_signal,signal_delay),le(minsedan_signal,add(signal_delay,signal_lock))),1,0) { tiden är inom intervallet }
buy8=and(buy7,tid_ok)
{ Nolla cell }
nollvillkor2=and(not(buy7),gt(GetGvar(500,N),0))
SetGvarIf(0,500,and(nollvillkor2,block_diag_skriv),T) { nollställer cell 500 om ej signal }
mult(buy8,1)
)
EDIT1:
Har uppdaterat scriptet med en fungerande variant jag numera själv kör. Det hela grundar sig på av vad som kommit fram ur denna tråd:
http://www.autostock.se/vbulletin/showthread.php?t=2729
Läs framför allt de avlutande inläggen.
Sriptet fungerar oavsett om man har diagramritningen påslagen eller inte.
EDIT2:
Jag har kört detta ett tag nu och kan meddela att det fungerar väldigt bra.
Emellertid jag har två kompletterande kommentarer att göra.
1) Om det i slutet av originalscriptet finns ett villkor som heter ”innehav_ok” eller något liknande, måste det flyttas till buy8, annars nollställs timern vid ett skarpt köp, och därmed förstörs hela funktionen.
Alltså, om ”innehav_ok” finns i slutet av scriptet, tag bort det och ändra buy8 till: buy8=and(and(buy7,tid_ok),innehav_ok)
2) Det är ganska självklart, att man i snabba script förstör scriptet genom att sätta ”signal_delay” till för många minuter. I mina script räcker det med 1 min, men även detta kan ibland vara för mycket har jag upptäckt. Därför har jag i mina snabbaste script låtit ”signal_delay” gå ner på sekundnivå. Det genomsnittliga ”fladdret” i de scripten, har jag mätt upp, överskrider sällan 15sek. Därför har jag satt ”signal_delay” i dessa till 20sek.
Ni andra som vill prova detta får lägga till raden: ”sekund_nu:=mult(frac(date()),86400)” samt ersätta ”minut_nu” med ”sekund_nu” i raderna nedanför { Skriv tid i cell }
EDIT3
Har lagt till ett villkor som man får klammra av och på när man växlar mellan körning i Live eller i Analyzbänken. Detta för att funktionen cum() inte fungerar i bänken.
Som scriptet är skrivet ovan är det aktiverat för live. Vill man istället köra i Analyzbänken klammrar man om villkoren så här:
{ Säkerställer blockering av cellskrivning under diagramkörningen }
{block_diag_skriv:=and(datum_ok,eqv(cum(1),1))} {Villkor för live-körning}
block_diag_skriv:=1 {Villkor för bänk-körning}
EDIT4
Har lagt till ett OBSERVERA i grundtexten ovan
a)"fladdrande" falska signaler (särskilt för exit i snabba modeller) samt
b) att kunna blockera att en signal "ligger på" ända till dess att en signal åt andra hållet triggas.
Vi tar ett köpscript som exempel.
Ett vanligt sätt att lösa a) på är att låta scriptet jobba på signalen en period bakåt exempelvis:
i30(
bla, bla
buy7=and(.....)
buy8=aref(buy7,1)
mult(buy8,5)
)
Problemet med detta är att man måste vänta till hela innevarande period passerats och har man då 30min perioder och signalen kommer i början hinner mycket hända. Jag har istället tänkt mig att man ska kunna ställa en delay på exempelvis 5min från det att signalen ges till dess att signalen löser ut på riktigt.
Vad gäller problemet med b) så innebär det att inga sopploss eller manuella positioner kan tas så länge signalen är på. Gör man det i alla fall tar modellen genast en ny position åt det håll man ville komma ur, vilket är mycket irriterande. Jag har här tänkt mig en ställbar blockering för hur lång tid signalen får vara aktiv.
Nedanstående script-tillägg är tänkt att lösa ovanstående problem och är tänkt att kunna fungera med vilket script som helst.
Exemplet gäller ett köpscript.
OBSERVERA FÖLJANDE:
Fladdervariabeln "signal_delay" anger den tid i minuter som skall förflyta från det att det ursprungliga scriptet signalerat till dess att order är tillåten att tas.
Om denna variabel sätts till noll är fladderfiltret inaktiverat.
Fladdervariabeln "signal_lock" anger den tid i minuter som ska förflyta från det att order är tillåten att tas till dess att signalen ej längre är aktiv.
{ Fladderfilter samt begränsad köpsignal }
{ köper endast inom intervallet: 5min< intervall <8min efter det att signal triggats, ställbart }
{ Vanliga villkor i de flesta script }
{ säkerställa att inga positioner tas vid dagens start innan start_delay passerats }
start_delay:=2
minut_nu:=mult(frac(date()),1440)
inpådagen:=gt(minut_nu,add(540,start_delay)) { 540 är kl 9.00 }
{ säkerställ att databastid och systemtid är på samma dag }
datum_ok:=eqv(int(d),int(date()))
{ nya tillägg innan intraday-parantesen}
{ Fladdervariabler }
signal_delay:=5
signal_lock:=3
{ Säkerställer blockering av cellskrivning under diagramkörningen }
block_diag_skriv:=and(datum_ok,eqv(cum(1),1)) {Villkor för live-körning}
{block_diag_skriv:=1} {Villkor för bänk-körning}
{ Tidslucka innan första positionen tas efter öppning}
innan_position:=and(ge(minut_nu,540),le(minut_nu,add(540,start_delay)))
{ befintligt köpscript }
i30(
Bla, bla,
buy7=and(......,inpådagen)
)
{ tillägg att lägga inom intraday-parantesen sist i scriptet (efter buy7) }
{ Nolla cell innan handel }
nollvillkor1=and(innan_position,gt(Getgvar(500,N),0))
SetGvarIf(0,500,and(nollvillkor1,block_diag_skriv),T) { Nollställer cell 500 innan handeln börjar }
{ Skriv tid i cell }
nysignal=and(buy7,eqv(GetGvar(500,N),0))
SetGvarIf(minut_nu,500,and(nysignal,block_diag_skriv),T)
minsedan_signal=if(gt(GetGvar(500,N),0),sub(minut_nu,GetGvar(500,N)),0)
tid_ok=if(and(ge(minsedan_signal,signal_delay),le(minsedan_signal,add(signal_delay,signal_lock))),1,0) { tiden är inom intervallet }
buy8=and(buy7,tid_ok)
{ Nolla cell }
nollvillkor2=and(not(buy7),gt(GetGvar(500,N),0))
SetGvarIf(0,500,and(nollvillkor2,block_diag_skriv),T) { nollställer cell 500 om ej signal }
mult(buy8,1)
)
EDIT1:
Har uppdaterat scriptet med en fungerande variant jag numera själv kör. Det hela grundar sig på av vad som kommit fram ur denna tråd:
http://www.autostock.se/vbulletin/showthread.php?t=2729
Läs framför allt de avlutande inläggen.
Sriptet fungerar oavsett om man har diagramritningen påslagen eller inte.
EDIT2:
Jag har kört detta ett tag nu och kan meddela att det fungerar väldigt bra.
Emellertid jag har två kompletterande kommentarer att göra.
1) Om det i slutet av originalscriptet finns ett villkor som heter ”innehav_ok” eller något liknande, måste det flyttas till buy8, annars nollställs timern vid ett skarpt köp, och därmed förstörs hela funktionen.
Alltså, om ”innehav_ok” finns i slutet av scriptet, tag bort det och ändra buy8 till: buy8=and(and(buy7,tid_ok),innehav_ok)
2) Det är ganska självklart, att man i snabba script förstör scriptet genom att sätta ”signal_delay” till för många minuter. I mina script räcker det med 1 min, men även detta kan ibland vara för mycket har jag upptäckt. Därför har jag i mina snabbaste script låtit ”signal_delay” gå ner på sekundnivå. Det genomsnittliga ”fladdret” i de scripten, har jag mätt upp, överskrider sällan 15sek. Därför har jag satt ”signal_delay” i dessa till 20sek.
Ni andra som vill prova detta får lägga till raden: ”sekund_nu:=mult(frac(date()),86400)” samt ersätta ”minut_nu” med ”sekund_nu” i raderna nedanför { Skriv tid i cell }
EDIT3
Har lagt till ett villkor som man får klammra av och på när man växlar mellan körning i Live eller i Analyzbänken. Detta för att funktionen cum() inte fungerar i bänken.
Som scriptet är skrivet ovan är det aktiverat för live. Vill man istället köra i Analyzbänken klammrar man om villkoren så här:
{ Säkerställer blockering av cellskrivning under diagramkörningen }
{block_diag_skriv:=and(datum_ok,eqv(cum(1),1))} {Villkor för live-körning}
block_diag_skriv:=1 {Villkor för bänk-körning}
EDIT4
Har lagt till ett OBSERVERA i grundtexten ovan
Comment