Allmänt meddelande

Collapse
No announcement yet.

Idiom för statefulla script

Collapse
X
 
  • Filter
  • Klockan
  • Show
Clear All
new posts

  • Rikard Autostock
    replied
    Ursprungligen postat av favetelinguis Visa inlägg
    Vad menar du Henric när du säger att de ej skrivs till disk? Det är ju vad Rikard säger här att de gör, nu är jag förvirrad

    Eftersom jag inte vill skicka värdena mellan script varför är det då inte bättre att använda Retval/Getval och varför finns inte dessa villkorade med if satser?

    Man kan villkora skrivning med If även till Getval/Retvak enligt följande:

    nu_värde=getval(4)
    nytt_värde=xxxx
    villkor=yyyy
    retval(if(villkor,nytt_värde,nu_värd),4)

    Om "villkor" är uppfyllt skrivs nytt_värde, annars det gamla värdet.

    Leave a comment:


  • Bertil
    replied
    En allmän kommentar. NAT är ju ett högnivåspråk. Vissa saker som är komplexa att skriva i ett lågnivåspråk gör man med ett funktionsanrop i NAT. Andra saker som man lätt skriver i ett lågnivåspråk är nästintill omöjliga att koda i NAT.

    Jag skulle tex gärna vilja ha icke fasvridadande digital filtrering, FFT analys och polynomanpassning högre än grad 1 i NAT, men det kodar man inte med vänster hand (om inte Rikard fixar en funktion för det vill säga .)

    mvh
    Bertil
    Last edited by Bertil; 2018-10-05, 12:11.

    Leave a comment:


  • Henric
    replied
    Kör du 5sek animering så är det bara innevarande stapel påverkar. Tidigare staplars värden är alltid de samma eftersom staplarna är fullbordade. En fullbordad stapel innehåller alltså de sista värdet i perioden. Det fungerar precis som att titta i diagrammet. Tidigare perioders värden ändras inte, medan stapeln som håller på och byggas rör sig upp och ner.

    Live körs scripten i intervall om ca 5 sek. Det går att ändra, men kommer då att gälla för alla modeller på den maskinen.


    Edit: Det enklaste är nog att labba runt i diagram, testmodeller på testkonto och simuleringar.
    Last edited by Henric; 2018-10-05, 11:37.

    Leave a comment:


  • favetelinguis
    replied
    Ursprungligen postat av Bertil Visa inlägg
    Appropå CUSUM.
    Först måste man ju bestämma med vilken upplösning man skall göra observationerna och sätta detta i realtion till vilken handelsfrekvens man önskar att använda.

    Själv jobbar jag med rullande medelvärden vilket är extremt lätt att applicera i kod.
    Ofta tar jag sedan derivatan på medelvärdet för att detektera break out. Detta går utmärkt att plotta.

    mvh
    Bertil
    Dina poänger börjar sjunka in så sakta men det bildas bara mer frågor ist Låt oss säga att vi har följande kod snutt:

    HTML-kod:
    i10(
    MinSerie=Add(1,C)
    Aref(MinSerie,1)
    )
    I en simulering väljer vi sedan 5sek som animerings hastighet. Frågan är då vad Aref(MinSerie,1) kommer returnera och hur ofta scriptet kommer köras.

    Mitt resonemang är att scriptet kommer köras var 5e sekund och att MinSerie då kommer innehålla uppdatering med 5sek intervall vilket ju borde vara fel givet i10. Om det ist är så att scriptet körs var 5e sekund men att MinSerie innehåller 10 minuters referenser blir det då så att alla körningar av scriptet utom det sista i varje 10minuters period. Detta betyder då att scriptet kommer köras var 5e sekund men det kommer inte finnas något returvärde förrän efter 10 minuter?

    Sista funderingen som jag är osäker på är hur "animerings hastigheten" i live trading avgörs? Körs script med tick upplösning alltid live?

    Leave a comment:


  • Henric
    replied
    De sparas till disk. Värdena ligger i minnet och skrivning sker till disk i intervall. Generellt går det fort att använda celler. Ska du köra mycket snabba modeller kanske det påverkar? För djupare beskrivningar hänvisar jag till Rikard.

    Leave a comment:


  • favetelinguis
    replied
    Ursprungligen postat av Rikard Autostock Visa inlägg
    Retval/Getval skriver och läser till "lokala" celler inom en och samma scriptkörning.
    Varje script har en egen uppsättning av dessa celler, och de är även kontounika och instrumentunika.

    SetGvarIf däremot skriver till globala celler som sparas på disk. Dessa har ingen koppling till instrument eller konton, så här måste man tänka på vilka celler man använder till vad. Det är dessa celler som även kan användas för att flytta info mellan olika script.
    Vad menar du Henric när du säger att de ej skrivs till disk? Det är ju vad Rikard säger här att de gör, nu är jag förvirrad

    Eftersom jag inte vill skicka värdena mellan script varför är det då inte bättre att använda Retval/Getval och varför finns inte dessa villkorade med if satser?

    Leave a comment:


  • Henric
    replied
    Ursprungligen postat av favetelinguis Visa inlägg
    Det jag försöker uppnå är egentligen trivialt i andra språk. Jag försöker göra ett CUSUM filter. Om du tittar på formeln på den sidan är det en cumulativ summa jag vill beräkna och när denna summa uppnår ett visst värde skall den sättas tillbaka till 0. Det som gör det komplicerat i NAT är att jag som du säger inte kan referera till ännu ej deklarerade variabler.

    Din lösning borde funka det som jag inte gillar dock är att Get/SetGVar använder disk läsningar. Känns långsamt att behöva förlita sig på detta för varje uppdatering men om det inte finns något annat sätt är det helt ok.
    Cellerna är en variabel. Bara att den inte går att läsa i en dataserie, utan är momentana. Det skulle även gälla en vanlig variabel.
    Värdena i cellerna ligger även i minnet så det går snabbt att referera till dessa. Dessutom behöver man inte skriva i varje insamling.

    Vill du rita i diagrammet kan du använda SetGvarGui som är till för just diagramritning. Värdena nås med GetGvar,dvs samma som för SetGvarIF.

    Edit: Däremot skulle det vara super om även cellvärden kunde ingå i dataserier. Något för framtiden, skulle nog vara mycket resurskrävande i drift om många användes.
    Last edited by Henric; 2018-10-05, 10:34.

    Leave a comment:


  • Bertil
    replied
    Appropå CUSUM.
    Först måste man ju bestämma med vilken upplösning man skall göra observationerna och sätta detta i realtion till vilken handelsfrekvens man önskar att använda.

    Själv jobbar jag med rullande medelvärden vilket är extremt lätt att applicera i kod.
    Ofta tar jag sedan derivatan på medelvärdet för att detektera break out. Detta går utmärkt att plotta.

    mvh
    Bertil

    Leave a comment:


  • favetelinguis
    replied
    Ursprungligen postat av Henric Visa inlägg
    Nivå:=50

    sPos=mx(0,add(GetGvar(20),sub(c,aref(c,1))))
    Draw(sPos,4,DGQB)
    SetGvarIf(if(gt(sPos,Nivå),0,sPos),20,1)
    gt(sPos,Nivå)

    Detta kanske löser ditt problem.

    Generellt är alla script egentligen en lång dataserie, vilket kan var ovant om man kodat i ett annat språk. Scripten läser uppifrån och ner. Minnesreferenser kan bara refereras efter namnet. Det gör koden väldigt effektiv och det går snabbt att referera och använda historiska värden.

    Jag tror inte cell nr. 1-10 går att använda. Åtminstone var det så förut.

    Edit: Jag hann inte skriva klart då det blev orderskurar på en maskin. Det Bertil beskriver ovan är viktigt att tänka på. Live och i simulatorn körs scripten varje insamling(animering) och inte bara när stapeln är fullbordad. I diagram visas värden endast när stapeln är fullbordad. Detta kan påverkar vissa saker som tex värden som skrivs till celler. Det kan lösas genom att tex endast skriva när stapeln är fullbordad eller när ett värde nått min/max hittills, osv. Oftast kan man referera till värden,avslut, etc och behöver inte logga värden på detta sättet, men jag vet ej vad du försöker uppnå.
    Det jag försöker uppnå är egentligen trivialt i andra språk. Jag försöker göra ett CUSUM filter. Om du tittar på formeln på den sidan är det en cumulativ summa jag vill beräkna och när denna summa uppnår ett visst värde skall den sättas tillbaka till 0. Det som gör det komplicerat i NAT är att jag som du säger inte kan referera till ännu ej deklarerade variabler.

    Din lösning borde funka det som jag inte gillar dock är att Get/SetGVar använder disk läsningar. Känns långsamt att behöva förlita sig på detta för varje uppdatering men om det inte finns något annat sätt är det helt ok.
    Last edited by favetelinguis; 2018-10-05, 10:10.

    Leave a comment:


  • Bertil
    replied
    Det viktiga är ju att man jobbar med en strategi/approach som man är intresserad av, det är ju det som ger motivationen att fortsätta. Är man extremt intresserad av approach nr1 så skall man fortsätta så klart.

    Är man däremot ny och funderar på hur man bäst skall lära sig koda i NAT rekommenderar jag som sagt approach nr 2.

    mvh
    Bertil


    Edit: Själv hade jag inte läst någon litteratur om strategier då jag började med NAT, utan jag studerade kursrörelserna i realtid hos terminen, labbade med egna script som innehöll diverse medelvärdesbildningar, plottade dessa, kollade hur man kunde koda en stoploss genom att studera stoplossmini. Hur kunde man förbättra denna genom att ta in fler parametrar mm mm. Sedan kommer man ju till triggerscripten. Hade de strategier som beskrivs i diverse böcker verkligen fungerat över tid och för olika marknader, så skulle ju alla köra dem, vilket inte är fallet.
    Last edited by Bertil; 2018-10-05, 10:08.

    Leave a comment:


  • favetelinguis
    replied
    Ursprungligen postat av Bertil Visa inlägg
    Du frågar om att spara värden mellan exekveringar.
    Exekveringarna sker var 5:e sekund så det är väldigt sällan intressant att spara värdena så tätt.
    Man väljer ju i scriptet med vilken stapelbredd beräkningarna skall göras. Om man tex använder minutstaplar i1) så bildar alla parametrar i scriptet dataserier med stapelbreddens upplösning. Dessa dataserier lagras automatiskt men existerar bara i varje script för sig. Globala variabler använder man då man vill överföra data mellan olika script.

    Allmänt då man skall lära sig att koda i NAT så kan man ju göra på två olika sätt.

    1) Hitta en strategi i någon bok och försöka koda ner den. Detta gör du och det är mycket svårt som du ju insett. Man skall både försöka tolka vad författaren menar samtidigt som man måste överför det till NAT som man ännu inte behärskar fullt ut.

    2) Man utgår från script som antingen finns med i NAT eller som finns publicerade på detta forum och utgående från dessa försöker man förstå vad som händer. Man ändrar lite och ser vad skillnaden blir osv. Jag rekommenderar approach nr 2.

    mvh
    Bertil
    Tackar för det förtydligandet. Kanske borde manualerna för nat utökas för att minska förvirringen hos nyanlända. När man läser här på forumet verkar det vara samma typ av frågor som kommer upp flera ggr.

    Håller inte med om att det ena utesluter det andra. Jag föredrar att starta med nr1 och köra fast. Sedan använda nr2 för att ta mig vidare på nr1. Tycker det är viktigt med stora långsiktiga mål.

    Leave a comment:


  • Henric
    replied
    Ursprungligen postat av favetelinguis Visa inlägg
    Om man tittar på ovanstående kod snuttar vad skulle jag behöva ändra för att få det funka? Båda snuttarna leder in mig i hörn som ej funkar och jag förstår inte hur jag ska få det funka.
    Nivå:=50

    sPos=mx(0,add(GetGvar(20),sub(c,aref(c,1))))
    Draw(sPos,4,DGQB)
    SetGvarIf(if(gt(sPos,Nivå),0,sPos),20,1)
    gt(sPos,Nivå)

    Detta kanske löser ditt problem.

    Generellt är alla script egentligen en lång dataserie, vilket kan var ovant om man kodat i ett annat språk. Scripten läser uppifrån och ner. Minnesreferenser kan bara refereras efter namnet. Det gör koden väldigt effektiv och det går snabbt att referera och använda historiska värden.

    Jag tror inte cell nr. 1-10 går att använda. Åtminstone var det så förut.

    Edit: Jag hann inte skriva klart då det blev orderskurar på en maskin. Det Bertil beskriver ovan är viktigt att tänka på. Live och i simulatorn körs scripten varje insamling(animering) och inte bara när stapeln är fullbordad. I diagram visas värden endast när stapeln är fullbordad. Detta kan påverkar vissa saker som tex värden som skrivs till celler. Det kan lösas genom att tex endast skriva när stapeln är fullbordad eller när ett värde nått min/max hittills, osv. Oftast kan man referera till värden,avslut, etc och behöver inte logga värden på detta sättet, men jag vet ej vad du försöker uppnå.
    Last edited by Henric; 2018-10-05, 08:56.

    Leave a comment:


  • Bertil
    replied
    Du frågar om att spara värden mellan exekveringar.
    Exekveringarna sker var 5:e sekund så det är väldigt sällan intressant att spara värdena så tätt.
    Man väljer ju i scriptet med vilken stapelbredd beräkningarna skall göras. Om man tex använder minutstaplar i1) så bildar alla parametrar i scriptet dataserier med stapelbreddens upplösning. Dessa dataserier lagras automatiskt men existerar bara i varje script för sig. Globala variabler använder man då man vill överföra data mellan olika script.

    Allmänt då man skall lära sig att koda i NAT så kan man ju göra på två olika sätt.

    1) Hitta en strategi i någon bok och försöka koda ner den. Detta gör du och det är mycket svårt som du ju insett. Man skall både försöka tolka vad författaren menar samtidigt som man måste överför det till NAT som man ännu inte behärskar fullt ut.

    2) Man utgår från script som antingen finns med i NAT eller som finns publicerade på detta forum och utgående från dessa försöker man förstå vad som händer. Man ändrar lite och ser vad skillnaden blir osv. Jag rekommenderar approach nr 2.

    mvh
    Bertil
    Last edited by Bertil; 2018-10-05, 08:03.

    Leave a comment:


  • favetelinguis
    replied
    Om man tittar på ovanstående kod snuttar vad skulle jag behöva ändra för att få det funka? Båda snuttarna leder in mig i hörn som ej funkar och jag förstår inte hur jag ska få det funka.

    Leave a comment:


  • Bertil
    replied
    Du skall inte ha ett parameternamnen som ingår i ett annat parameternamn, sPos är ju ett delnamn av sPos1. Kalla lämpligen sPos för sPos0 istället.

    Sedan måste du som du själv säger skapa parametrarna i tur och ordning.

    mvh
    Bertil

    Leave a comment:

Working...
X