Matlab Handel Indikatorer
MetaTrader 5 - Eksempler. MetaTrader 5 og MATLAB Interaction. My første artikkel Interaksjon mellom MetaTrader 4 og MATLAB Engine Virtual MATLAB Machine ble lagt merke til av MQL-samfunnet Noen lesere 1Q2W3E4R5T var selv i stand til å flytte dette prosjektet fra Borland til VS2008. Men tiden går framover ubarmhjertig og trist, men sant MetaTrader 4 forsvinner, gir vei til sin etterfølger MetaTrader 5 med MQL5, som introduserte pekere og dynamisk minne. Takket være disse innovasjonene har vi muligheten til å skrive et universelt bibliotek med interaksjon med MATLAB Engine virtuell maskin, og direkte lenkebiblioteker, generert av MATLAB, med MetaTrader 5 Denne artikkelen dekker en slik funksjonalitet Denne artikkelen fortsetter logisk den forrige, og dekker grundigere problemet med samspill mellom MetaTrader 5 og MATLAB. For å gjøre omfanget av denne artikkelen mer forståelig for uforberedte lesere, vi vil dele det i tre deler teori, referanse og praksis Teori vil dekke typer data bruk d i MQL5 og MATLAB, samt deres gjensidige konvertering I Referanse lærer du de språklige strukturer og syntax av funksjoner som trengs for å opprette en DLL. I praksis vil vi analysere fallgruver av denne interaksjonen. Eksperiente lesere kan hoppe over teori og referanse, og Begynn med Øvelse Andre er oppfordret til å lese teori og referanse, og bare deretter fortsette å øve. Det er også verdt å lese bøker nevnt i litteraturavsnittet. 1 1 Datatyper i MATLAB og MQL5.1 1 1 Enkelt datatyper. Først av alt , må vi bli kjent med indre verdener av MQL5 og MATLAB Etter perfunktorisk inspeksjon av variable typer, konkluderer vi at de er nesten identiske. Tabel 1 Datatyper i MATLAB og MQL5. Det er en stor forskjell at variablene i MQL5 kan være enkle eller komposittkompleks, og i MATLAB er alle variabler flerdimensjonale komplekse - dvs. matrise Du må alltid huske om denne forskjellen.1 1 2 Komplekse datatyper. I MQL5 er det 4 komplekse typer datarammer, strenge, strukturer og klasser Kompleks datatype er satt av flere enkle datatyper, kombinert i minneblokk av bestemt lengde. Når du håndterer slike data, må du alltid vite enten minneblokkestørrelse i byte eller antall elementer unntatt klasser. Vi er kun interessert i arrays og strenger fordi innlevering av klasser og MQL5-strukturer til MATLAB gir ingen mening. Når du sender arrays av noe slag, må du vite typen dimensjon og antall elementer ved hjelp av ArraySize-funksjonen. Spesiell oppmerksomhet bør gis til indeksering i MetaTrader 5 - vanligvis er det bakover dvs. det første elementet inneholder nyere data enn det neste. Kontroller dette ved hjelp av ArrayIsSeries-funksjonen. Og MATLAB har følgende indeksering. Det første elementet inneholder eldre data enn det neste - så du må reversere arraysene dine før du sender dem til MATLAB, hvis flagg ASSURIES TRUE Basert på ovenstående, la s være enig med følgende. Omvendt arrays usynlig for MQL5-programmer, unntatt arrays av char type og 2-dimensjonale arrays - la dem uendret. Gjenta usynlig alle arrayene fra MATLAB, og tilordne ASSERIES-flagget med SANT, bortsett fra arrays av char type og 2- dimensjonale arrays - la dem være uendret. I hvert utvalg i MQL5-programmet, opprettet etter bakoverindeksering, må ASSERIES-flagget være SANT, bortsett fra arrays av karetype og 2-dimensjonale arrays - la dem være uendret. Men dette er ikke bare begrensning når du arbeider med arrays Når du arbeider med flerdimensjonale arrayer eller matriser for å være mer korrekt, spesielt fra MATLAB, introduserer vi begrensningen for ikke mer enn 2-dimensjonale arrayer. Her kan ASSERIES-flagget ikke være SANT, og derfor er slike arrays ikke reversert. Ikke glem at strenger i MQL5 ikke er arrays av char type-elementene. Når passerer strenger kommer et lite problem i MQL5-strenger kodet med Unicode, og MATLAB bruker ANSI-koding. Så før du passerer en streng, bør den konverteres til array av ANSI-tegn ved hjelp av StringToCharArray-funksjonen Og omvendt, når du får et tegnoppsett fra MATLAB, konverterer du det ved å bruke CharArrayToString-funksjonen, se tabell 2 For å unngå forvirring, samtykk lagre alle strenger i MQL5-programmer ved hjelp av Unicode, ingen arrays av char type.1 2 Sammenligning av MQL5 og MATLAB Datatyper. For å redusere antall funksjoner og forenkle bibliotekalgoritmen, vil vi redusere antall typer ved hjelp av automatisk konvertering, som ikke bør påvirke integritet av data Følgende tabell illustrerer regelen for datatype-konvertering fra MQL5 til MATLAB. Med denne typen konvertering er det et tap av nøyaktighet Vi vil ikke bruke det, men du kan bruke en slik konvertering i programmene. Tabel 2 Sammenligning av MQL5 og MATLAB Datatyper. Nå er du kjent med datatyper som brukes i MQL5 og MATLAB You vet hva fallgruvene venter på dataoverføring og hvordan man omgå dem kompetent. Du må fortsatt kjenne MATLAB Engine API og bli kjent med MATLAB Compiler 4.2 MATLAB Engine API Reference, MATLAB Compiler 4 Referanse og C Input Output Library Reference. Denne delen introduserer deg til Viktigste funksjoner i MATLAB Engine API, funksjoner i MATLAB Compiler 4 og antall nyttige funksjoner i C standard input output library Så, la s start.2 1 MATLAB Engine API og MCR Functions. MATLAB Engine - er eksternt grensesnitt som gjør det mulig for andre programmer å bruk MATLAB-skrivebordet. Det gir et fullt funksjonelt arbeid for alle MATLAB-pakker uten noen begrensninger. Selv om det ikke er sagt i dokumentasjonen, men når det gjelder systemprogrammerer - det er bare en respektert ual maskin, som PHP, MySQL, etc som støtter en enkel og relativt rask måte å utveksle data mellom MetaTrader 4 5 og MATLAB. Denne metoden for å koble eksterne programmer med MATLAB-pakken anbefales av utviklere Grensesnittet består av seks funksjoner. NULL denne funksjonen kalles MATLAB skrivebord, parameteren er alltid NULL, returnerer en peker til skrivebordet descriptor. int exitCode engClose Engine pEng denne funksjonen stenger skrivebordet, returnerer antall resterende brukere av MATLAB desktop, hvor. Engine pEng peker til skrivebordsbeskrivelsen. mxArray mxVector mxCreateDoubleMatrix int m, int n, int ComplexFlag denne funksjonen skaper en variabel matrise av MATLAB skrivebord, returnerer en peker til variabel matrise, hvor. mxArray mxVector peker til matrise variable. int m antall rader. int n antall columnsplexFlag type komplisert nummer, for MetaTrader 4 5 mxREAL. void mxDestroyArray mxArray mxVector ødelegger denne funksjonen MATLAB-matrisen, det er nødvendig for å fjerne minne, hvor. mxArray mxVector peker til matrise variable. int engPutVariable Engine pEng, char Navn, mxArray mxVector denne funksjonen sender variabel til skrivebordet Du må ikke bare opprette variabler av mxArray typen, men også sende dem til MATLAB, hvor. Engin pEng peker til skrivebordsbeskrivelsen. char Navn variabelnavn for karetype i MATLAB desktop. mxArray mxVector pointer til matrix variable. mxArray mxVector engGetVariable Engine pEng, char Navn denne funksjonen blir variabel fra skrivebordet - den omvendte av forrige funksjon Kun variabler av mxArray typen aksepteres, where. mxArray mxVector pointer til matrix variable. Engine pEng pointer til skrivebordet descriptor. char Navne variabel navn på char type i MATLAB desktop. double p mxGetPr mxArray mxVector denne funksjonen får pointer til array av verdier, det brukes til å kopiere data sammen med memcpy se 2 3 C Standard Input Output Library, hvor. double p peker til array av double type. mxArray mxVector pekeren til matrix variable. int engEvalStrin g Engine pEng, char Command denne funksjonen sender kommandoer til MATLAB desktop, hvor. Engine pEng peker til skrivebordet descriptor. char Kommando kommandoen for MATLAB, streng av char type. You har sikkert lagt merke til at MATLAB Engine API lar deg lage mxArray struktur bare for den dobbelte typen Men denne begrensningen påvirker ikke dine muligheter, men vil påvirke algoritmen til biblioteket. MCR-forekomst er det spesielle biblioteket MATLAB-pakken, som gjør det mulig å kjøre frittstående applikasjoner offentlige biblioteker, generert av MATLAB-miljø på hvilken som helst datamaskin Merk at selv om du har en komplett MATLAB-pakke, trenger du fortsatt å installere MCR-biblioteket ved å kjøre filen, som ligger i MATLAB Toolbox-kompilatoren distribuere Win32-mappen. Før du ringer til en offentlig biblioteksfunksjon, opprettet av MATLAB-miljøet, må du ring MCR initialisering function. bool mclInitializeApplication const char alternativ, int teller returnerer TRUE hvis MCR start var vellykket, ellers FALSE, where. const char Alternativstreng av alternativer, som i mcc - R, er vanligvis NULL. int teller størrelse opsjonsstreng, typisk 0. Ved avslutning av offentlige bibliotekarbeider må du ringe bool mclTerminateApplication void returnerer TRUE hvis MCR ble avsluttet.2 2 MATLAB Compiler 4.MATLAB Compiler lar deg lage følgende fra M-functions. Standalone applikasjoner som kjører selv om MATLAB ikke er installert. CC dele biblioteker, som kan brukes uten MATLAB på sluttbruker systemspiler støtter de fleste kommandoer og pakker av MATLAB, men ikke alle Full liste over restriksjoner finnes på MATLABs nettside. Denne metoden lar deg lage programvare uavhengig bunt MetaTrader 5 og MATLAB, men i motsetning til MATLAB Engine krever en godt utdannet programmerer og dyp kunnskap om kompilering. MATLAB Compiler krever minst en av følgende CC compilers. Lcc C kommer vanligvis med MATLAB Det er bare C compiler. Borland C versjoner 5 3, 5 4, 5 5, 5 6.Microsoft Visual CC versjoner 6 0, 7 0, 7 1.MATLAB Compiler 4 , i Kontrast til sine forgjengere, genererer bare grensesnittkoden wrapper, dvs. oversetter ikke m-funksjoner til binær eller CC-kode, men den skaper en spesiell fil basert på komponentteknologi fil CTF-teknologi, som inkluderer integreringer av ulike pakker som kreves for å støtte m - funksjoner MATLAB Compiler krypterer også denne filen med unik unrepeated 1024-bit nøkkel. Nå kan vi se algoritmen til MATLAB Compiler 4-arbeidet, siden uvitenhet om dette emnet vil føre til mange dumme feil på kompileringstid. Begrensningsanalyse på dette stadiet avgjør alle funksjoner, MEX-filer og P-filer, som kompilerte m-funksjoner avhenger. Creating archive - CTF-filen er opprettet, den er kryptert og komprimert. Genvinning av objektkoden til wrapper på dette stadiet er alle kildekoder opprettet, trengs for component. CC grensesnittkoden for m-funksjoner spesifisert i kommandolinjen NameFilemain cponent-fil som inneholder all informasjon som trengs for å utføre m-kode, inkludert krypteringsnøkler og stier, sto rødt i CTF-file. CC oversettelse På dette stadiet blir CC kildekodefiler samlet inn i objektfiler. Linker Den siste fasen av prosjektbygningen. Nå, når du er kjent med MATLAB Compiler algoritmadferd, må du lære mer om nøkler i rekkefølge å ha en detaljert handlingsplan, når du bruker kompilatoren mcc. Table 4 Matlab mbuild Linker versjon 4 keys. Table 4 viser hovedtastene. For mer informasjon, bruk hjelpembuktene eller doc mbuild-kommandoer.2 3 C Standard Input Output Library. Using the Standard Input Output Library gir riktig datakopiering. Bruken vil lagre deg fra dumme feil som oppstår i programdesignfasen, for eksempel mange nybegynnerprogrammerer kopierer bare pekeren til minneblokken i stedet for å kopiere hele minneblokken. Fra hele Input Output Library er vi interessert bare i en funksjon. void pIn memcpy void pIn, void pOut, int nSizeByte denne funksjonen kopierer kloner variabel array fra pOut til pIn med størrelsen på nSizeByte bytes, hvor. void pIn peker til arra y, hvor skal du kopiere. void pOut pointer to array, hvorfra kopiering er gjort. int nSizeByte størrelsen på kopierte data, bør ikke overstige størrelsen på pIn-arrayet, ellers vil det hende at minnefeil oppstår. Nå er vi ferdig med teori og vi kan fortsette med realiseringen av MetaTrader 5 MATLAB-interaksjonen. Som du sikkert antar, vil dette gjøres på to måter ved hjelp av MATLAB Engine virtuell maskin og ved bruk av biblioteker generert av MATLAB Compiler First, vurder en enkel, rask og allsidig måte for samhandling via MATLAB Engine. Denne delen av artikkelen må leses fra begynnelse til slutt, som til tross for den tilsynelatende forskjellen mellom samspillsmetoder, har de en filosofi og kjent syntaks av språkkonstruksjoner, og å lære noe nytt er lettere med enkle eksempler.3 1 Utvikle Universal Bibliotek av MetaTrader 5 MATLAB Engine Interaction. Denne samhandlingsmetoden kan ikke kalles elegant og rask, men det er den mest pålitelige og dekker hele MATLAB-pakken. Selvfølgelig bør vi nevne t Han er rask på den endelige modellutviklingen. Utviklingsgrunnen er å skrive et universelt bibliotek-wrapper for MetaTrader 4 5 MATLAB Engine interaksjon Etter at denne MetaTrader 4 5-skriptindikatoren kan administrere MATLAB virtuelt skrivebord og hele matematisk algoritme kan lagres i MQL-program som strenger, slik at du kan bruke den til å beskytte din immaterielle rettighet for mer informasjon, se Protect yourself, Developers-artikkelen. Det kan også lagres i m-funksjoner eller P-funksjoner separate filer i mappen MetaTrader 5 MQL5 Biblioteker. Mulige anvendelsesområder av slik interaksjon. For å teste eller vise matematiske modeller ideer uten å skrive komplekse programmer, kan beskyttelse av intellektuell eiendom ordnes som i MQL-program og ved hjelp av MATLAB-pakke - ved hjelp av P-funksjoner. For å skrive komplekse matematiske modeller som bruker alle funksjonene til MATLAB. To alle de som ikke kommer til å distribuere sine skript indikatorer eksperter. Let s fortsette Jeg håper at du har lest 1 1 Data ty pes i MATLAB og MQL5 1 2 Sammenligning av MQL5- og MATLAB-datatyper 2 1 MATLAB Engine API og MCR Funksjoner og 2 3 C Standard Input Output Library-seksjoner, siden vi ikke vil pause og analysere dem lenger. Les nøye følgende blokk-skjema, det illustrerer algoritmen for fremtidig bibliotek. Figur 1 blokk-skjema for bibliotekalgoritmen. Som vist på figur 1 består biblioteket av tre hovedblokker Vurder deres formål. MQL5 blokk, foreløpig utarbeidelse av sendte mottatte data. Reverserende arrays. Types conversion. Strings encodings conversion. Converts array i mxArray structure. Passes MATLAB Engine kommandoer. MATLAB Engine block beregninger system. Now, la s avtale med algoritmer Vi vil begynne med MQL5 blokk Att oppmerksom leser har allerede lagt merke til at det vil fokusere på gjennomføringen av det som ble skrevet i datatyper i MATLAB og MQL5-delen Hvis du har savnet det, vil du nesten ikke forstå hvorfor alt dette er nødvendig. Algoritmen for mlInput-variabletype-funksjonene er nesten identisk La s diskutere sitt arbeid ved hjelp av mlInputDouble-funksjonen som gir input av variabler av dobbelttype til MATLAB virtuell machine. bool mlInputDouble doble array, int sizeArray, streng NameArray where. array referanse til variabel eller array av størrelsen på double type. sizeArray array størrelse av elementer, ikke byte. NameArray-streng, som inneholder unikt variabelnavn for MATLAB virtuelt maskinnavn, må svare til MATLAB-krav. Konverter NameArray-streng for å rydde array ved hjelp av StringToCharArray-funksjonen. Kontroller type indeksering ved hjelp av ArrayIsSeries-funksjonen. Hvis indekseringstypen er normal pass verdi til mlxInputDouble funksjonen ELSE indeksering av timeseries array omvendt array og pass verdi til mlxInputDouble funksjonen. End funksjon, send returverdien til mlxInputDouble funksjon. Algorithm av mlGet variabletype funksjoner er også nesten identiske La oss diskutere sitt arbeid ved å bruke mlGetDouble-funksjonen, som returnerer variabel av dobbelttypen fra MATLAB virtuelle machi ne. int mlGetDouble dobbelt array, int sizeArray, streng NameArray where. array referanse til variabel eller array av double type. sizeArray array størrelsen antall elementer, ikke bytes. NameArray streng, som inneholder unikt variabelnavn for MATLAB virtuell maskin. Convert NameArray streng å røyke array ved hjelp av StringToCharArray funksjonen. Find størrelsen på array ved hjelp av mlxGetSizeOfName funksjonen. IF størrelse er mer enn NULL tilordne mottaker array av nødvendig størrelse ved hjelp av ArrayResize funksjonen, få data om mlxGetDouble retur array size. IF størrelse er null retur feil , det vil si null verdi. Det er det mlGetInt og mlGetLogical-funksjonene produserer skyggeomvandling av typer double-int bool. For dette formål oppretter disse funksjonene en midlertidig minnebuffer i deres kropper. Dette er en tvunget måling, fordi MATLAB API dessverre ikke tillater å skape mxArray-strukturer for datatyper annet enn dobbelt Dette betyr imidlertid ikke at MATLAB opererer utelukkende de dobbelte typene. CC-blokk er langt e ier - det skal gi dataoversettelse fra dobbelttype til mxArray-strukturen. Det gjøres ved hjelp av mxCreateDoubleMatrix mxGetPr og memcpy-funksjoner. Deretter bruker den engPutVariable-funksjonen data til MATLAB virtuell maskin og for å trekke ut data som den bruker funksjonen engGetVariable Again, ta hensyn til funksjoner med prefikser Int og Logisk som vist i blokkskjemaet, de har ikke direkte interaksjon med MATLAB, men bruk mlxInputDouble mlxGetDouble og mlxInputChar-funksjonene Algoritmen for deres oppførsel er enkel å ringe på mlxInputDouble mlxGetDouble-funksjonens inngangsverdier som dobbel og send skyggen MATLAB-kommandoen for å konvertere datatype via mlxInputChar-funksjonen. MATLAB Engine blokk er enda enklere Det gir bare matematiske funksjoner Dens oppførsel avhenger av dine kommandoer og dine m p-funksjoner. Nå, når alle detaljene i prosjektet er klare , det er på tide å håndtere prosjektbygging. En slik konstruksjon begynner med etableringen av hovedbiblioteket i vårt tilfelle jeg t er CC-blokk For dette formål, i en ANSI-tekstredigerer Notepad, Bred, etc, opprett en fil med DEF-utvidelsen. Det er ønskelig at navnet på denne filen består av latinske tegn uten mellomrom og tegnsetting, ellers vil du høre mange smigrende ord fra kompilatoren din Denne filen gir varigheten til dine funksjoner Hvis denne filen er fraværende, vil CC-kompilatoren oppfinne sine egne eksotiske navn for å eksportere funksjoner. Denne filen inneholder LIBRARY kontrollord, LibMlEngine-navnet på biblioteket og EXPORTS andre kontrollord, da kommer navnene på funksjoner Som du sikkert visste, kan navnene på eksportfunksjoner ikke ha mellomrom og tegnsetting. Her er teksten til filen fra arkivet. BIBLIOTEK LibMlEngine EXPORTS mlxClose mlxInputChar mlxInputDouble mlxInputInt mlxInputLogical mlxGetDouble mlxGetInt mlxGetLogical mlxGetSizeOfName mlxOpen. So, vi har den første filen av prosjektet Nå åpner du Windows Utforsker og går til MATLAB Extern inkluderer mappe Kopier filhovedfilen til MATLAB vi rtual maskin til mappe, hvor du prosjektet er bygget hvis du vant t gjør dette, må du manuelt spesifisere banen til filen på scenen av kompilering. Nå er det på tide å lage CC-blokk Vi vil ikke inkludere hele kildekoden for program i artikkelen, fordi denne filen kan bli funnet i som og det er godt kommentert. Merk at det er bedre å lage funksjoner ved hjelp av stdcall-konvensjonen, dvs. parametere sendes gjennom stakken, og funksjonen renser stakken. Denne standarden er innfødt for Win32 64 API. Consider hvordan man erklære en funksjon. Extern C declspec dllexport variabletype stdcall Funksjonstype name. extern C declspec dllexport forteller C-kompilatoren at funksjonen er external. variabletype type returnert variabel, kan være ugyldig, bool, int, dobbelt kompositttyper kjent ikke bare til DLL, men også å ringe program og pointers. stdcall erklæring om å overføre parametere til funksjon og tilbake, det er standard for Win32 64 API. Funksjonen din funksjon name. type navn type og navn på input variabel, maks Imal antall variabler er 64.CC blokkbygging for dette må du inkludere standard inngangsutgangsbibliotek og legg til prosjektet følgende filer i kompilatoren Prosjekt - Legg til prosjekt. I MATLAB Ekstern lib win32 64 kompilatormappe hvor MATLAB MATLAB hovedmappe win32 64 enten win32 mappe for 32-bit OS, eller win64 for 64-bit OS compiler borland mappen for Borland CC ver 5-6, Microsoft mappen for Microsoft Visual CA vanlig spørsmål som dette kan oppstå jeg har forskjellig versjon av kompilatoren eller nei en slik kompilator på listen Svært sjelden finnes det ingen slike filer La oss se hvordan du manuelt lager et offentlig bibliotek Vi vil vurdere hvordan det er gjort i Visual C og i Borland C. I FAR åpen MATLAB Bin win32 64-mappe hvor MATLAB MATLAB hovedmappe win32 64 enten win32 mappe for 32-bit OS, eller win64 for 64-bit OS. For Borland C angi implib Det samme for. For Visual C enter lib Det samme for. Hvis annen kompilator, må en kompilator av et hvilket som helst programmeringsspråk ha dette verktøyet - Library Manager, Vanligvis er dette en konsollprogramkompilatormappe. Forresten, glemte jeg å advare deg - ikke prøv å lage 64-biters LIB for 32-biters kompilator. Finn ut om det er 64-biters adresseringstøtte i kompilatorhjelp. Hvis ikke , enten å se etter 32-biters MATLAB DLL, eller velg en annen CC-kompilator. Komme ned til kompilering, hvoretter vi får et bibliotek, som skal plasseres i mappen MQL5-bibliotek i terminalmappen. Nå la oss starte med MQL-blokk Kjør MetaEditor, klikk New og gjør som på følgende figurer. Figur 2 MQL5 Wizard Opprett Library. Figure 3 MQL5 Wizard Generelle egenskaper for Library. Now, når veiviseren MQL5 har opprettet en mal, fortsett til redigering. Merk at MQL 5 du kan passere pekere på to måter. void NameArray Denne metoden for å sende fra array tillater bare å lese data. Hvis du forsøker å bruke denne referansen til å redigere innholdet, får du ikkje minnefeil i det beste tilfellet for deg, men MetaTrader 5 vil håndtere feilen i SEH - ramme, men vi har ikke skrevet en SEH-ramme, så vi c en jevn savner årsaken til feilen. Void NameArray Denne metoden for å passere lar deg lese og redigere arrayinnhold, men du må beholde array størrelse. Hvis funksjonen ikke aksepterer eller ikke passer parametere, angi du alltid tomrommet2. Vi vant t beskrive alle funksjoner i MQL-blokken, fordi du kan finne kildekoden i. Derfor vil vi vurdere detaljene for deklarasjon og definisjon av eksterne funksjoner i MQL5. Som vist i eksemplet, er deklarasjonen og definisjonen av funksjon kombinert I dette tilfelle, erklærer vi en funksjon som heter mlInputChar som ekstern eksport, som returnerer verdien av bool-typen og aksepterer array-strengen som parameter Nå kompilere. Nå at vi har fullført den siste blokken i biblioteket og samlet den, er det på tide å teste det i virkelige forhold. For å gjøre dette, skriv et enkelt testskript eller ta det fra filen. Skriptkoden er enkel og godt kommentert. Som sett fra skriptet, går vi inn i verdier og får verdier. I motsetning til MetaTrader 4, hvor vi trengte å kjenne størrelsen på buffer på designstadiet, i MetaTrader 5 er det ikke nødvendig, da vi bruker dynamiske buffere. Nå som du endelig forsto MATLAB virtuell maskin, kan du begynne å bruke DLL bygget i MATLAB miljø.3 2 Tekniske retningslinjer for bygging ved hjelp av DLL generert av MATLAB Compiler 4. I den forrige delen har du lært å lage et bibliotek for universell samhandling med MATLAB-pakken. Denne metoden har imidlertid en ulempe - det krever MATLAB-pakke fra sluttbruker. Denne begrensningen skaper en rekke vanskeligheter i distribusjonen av ferdig programvareprodukt Det er derfor MATLAB matematisk pakke har en innebygd kompilator, som lar deg lage frittstående applikasjoner uavhengig av MATLAB-pakken. La oss ta en titt på det. For eksempel, sett på en enkel indikator - glidende gjennomsnitt SMA Litt oppgradere det ved å legge til et Neural Network Filter GRNN, som gjør det mulig å jevne hvite støy tilfeldige utbrudd. Navn den nye indikatoren som NeoSMA, og filtrer som GRNNFilter. Så har vi to m-morsomme ctions, som vi vil lage en DLL, som kan kalles fra MetaTrader 5.Nå husk at MetaTrader 5 søker fro DLLs i følgende mapper. terminaldir MQL5 Biblioteker. Utgående mappe. Systemmappe windowsdir SYSTEM32.Directories oppført i systemmiljøet variabel PATH. Deretter plasser i en av disse katalogene to m-funksjoner NeoSMA m og GRNNFilter m, der vi skal bygge DLL, legger du oppmerksomheten til dette faktumet for plassering, da dette ikke gjøres ved et uhell. Attentive leser kjenner allerede MATLAB kompilatoren funksjon - den bevarer stiene når du samler se 2 2 MATLAB Compiler 4.For du begynner å kompilere prosjektet, må du konfigurere kompilatoren For å gjøre dette, følg disse trinnene. I MATLAB kommandolinje, skriv inn mbuild - setup. Trykk på y for å bekrefte søk av CC kompatible kompilatorer installert i systemet. Velg standard Lcc-win32 C compiler. Trykk y for å bekrefte valgt kompilator. Fig. 4 Kompilere prosjektet. Nå er vi klare til å flytte til m-funksjoner samlingsprosessen. mcc - N - W lib NeoSMA - T-kobling lib NeoSMA m GRNNFilter m. Forklar nøklene. - N for å hoppe over alle unødvendige baner - W lib NeoSMA forteller kompilatoren at NeoSMA er navnet på biblioteket - T link lib forteller kompilatoren for å opprette et offentlig bibliotek med kobling av NeoSMA m og GRNNFilter m m-funksjoner navn. Nå, la oss se hva kompilatoren har opprettet. loggfil som inneholder kompilerehandlinger. NoeSMA c C-versjon av biblioteket inneholder kode for innpakning. CTF-fil se 2 2 MATLAB Compiler 4 section. NeoSMA h header-filen inneholder deklarasjoner av biblioteker, funksjoner, konstanter. objektfil kildefil som inneholder maskin og pseudokode. eksporterte funksjonsnavn. Dll for videre kobling. Dll å bruke i CC-prosjekter. NeoSMAmcccomponentdata c C-versjon på komponent som brukes for å overholde CTF-filen, inneholder stier, etc. objektversjon av komponentkildefil som inneholder maskin og pseudokode. Så la s håndtere DLL, nettopp med sin interne struktur Den består av grunnleggende funksjoner bare fra. Hovedfunksjonen til en hvilken som helst DLL - BOOL WINAPI DllMain som i henhold til Microsoft-spesifikasjonen håndterer hendelser som forekommer i DLL DLL, laster inn adresseplass for prosess, lager en ny strøm, slett strømmen og avlaster Dll fra memory. Service funksjoner for DLL-initialisering deinitialisering BOOL NameLib Initialiser void void NameLib Avslutte tomrom er nødvendig for å starte avlaste matematisk arbeidsmiljø før bruk av biblioteksfunksjoner og ved slutten av bruken. Eksporterte m-funksjoner ugyldige mlf NameMfile int numberofreturnvalues, mxArray returnvalues, mxArray inputvalues, hvor. numberofreturnvalues antall returnerte variabler don t forvirre med array størrelse, etc. mxArray returvalues adresse av mxArray-strukturen der resultatene av m-funksjon-arbeidet vil bli returnert. mxArray-inputverdier peker til mxArray-strukturen av m-funksjon-inputvariabelen. Som du kan se inneholder eksporterte m-funksjoner adresser og pekere til mxArray-strukturen, og du kan ikke direkte ring disse funksjonene fra MetaTrader 5, da det ikke forstår denne typen data. Vi vant t beskrive mxArray-strukturen i MetaTrader 5, fordi MATLAB-utviklere ikke garanterer at det ikke vil endres over tid, selv innenfor samme versjon av produktet, så Du må skrive en enkel DLL-adapter. Den blokk-skjemaet er vist nedenfor. Figur 5 DLL-adapter Block - Scheme. Det er veldig lik høyre side av DLL for MATLAB Engine, så vi vant t analysere sin algoritme og fortsett direkte til koden For å gjøre dette, opprett to små filer i CC-kompilatoren. BIBLIOTEK nnSMA EXPORTS IsStartSMA nSMA. Build prosjektet i CC-kompilatoren for dette. Du må inkludere standard inngangsutgangsbibliotek og legge til prosjektet de følgende filene i din kompilator Project - Add Project. In MATLAB Ekstern lib win32 64 compiler mappe, hvor MATLAB MATLAB hovedmappe win32 64 enten win32 mappe for 32-bit OS, eller win64 for 64-bit OS compiler borland mappen for Borland CC ver 5-6, Microsoft-mappen for Microsoft Visual CI har filer for versjon 6. Lag manuelt, se 3 1 Utvikle Universal Library of MetaTrader 5 MATLAB Engine Interaction. Den siste, hva jeg vil fortelle deg i denne delen, handler om filer som trengs når du flytter prosjektet til en annen datamaskin, hvor det ikke er installert MATLAB. Her er en liste over filer og stier på målmaskinen. hvilken som helst mappe MCR installer. hvilken som helst mappe for MCR installer. hvilken som helst mappe for MCR installer. hvilken som helst mappe for MCR installer. terminaldir MQL5 biblioteker. terminaldir MQL5 biblioteker. terminaldir MQL5-biblioteker. Mange avanserte programmerere har allerede gjettet at det er tilrådelig å bruke et installasjonsprogram SETUP. Det er mange av dem over Internett, inkludert gratisprodukter. Nå må vi teste denne DLL i MetaTrader 5 For å gjøre dette vil vi skrive et enkelt skript fra the. So, du vet hvordan du lager et universelt bibliotek for MetaTrader 5 MATLAB interaksjon, og hvordan du kobler DLL bygget i MATLAB miljø. Men det er fortsatt grensesnitt for MetaTrader 5 MATLAB interaksjon som skal beskrives, men dette er utenfor Omfanget av denne artikkelen Emnet i denne artikkelen er dekket i detaljer Jeg har valgt de mest effektive måtene for samhandling, og krever ikke en spesiell type adaptere. Selv om du kan gå på en annen måte, for eksempel teknologi, kan du eksportere tilbud fra MetaTrader 5 til applikasjoner. Bruk av WCF-tjenester. Mange lesere kan ha et spørsmål om hvilken metode som skal velges. Svaret er enkelt - begge, fordi under design feilsøking av matematisk modell er hastigheten ikke nødvendig. Men du ll trenger full kraft av MATLAB uten spesielle produksjonskostnader for programmering MATLAB Engine vil hjelpe her selvfølgelig Men når den matematiske modellen er feilsøkt og klar til bruk, trenger du fart, multitasking arbeid av indikator og eller handelssystem på flere prisdiagrammer - her uten tvil trenger du en DLL, bygget i MATLAB-miljøet. Men alt dette forplikter deg ikke til å følge det. Alle vil gi svaret på dette spørsmålet selv, og baserer seg hovedsakelig på andelen programmeringskostnader i omfanget av prosjektet antall indikatorer og eller systemansatte brukere Det er ingen mening å lage Dll i MATLAB-miljøet for en eller to brukere. Det er enklere å installere MATLAB på to datamaskiner. Mange lesere, som ikke er kjent med MATLAB, har nok et spørsmål hvorfor alt denne MQL5 har allerede matematiske funksjoner Svaret er at bruk av MATLAB lar deg enkelt implementere dine matematiske ideer, her er bare en delvis liste over muligheter. dynamisk algoritme av fu zzy logikk i indikatoren og eller mekanisk handelssystem. dynamisk genetisk algoritme i mekanisk handelssystem dynamisk strategi tester. dynamisk nevral nettverk algoritme i indikatoren og eller mekanisk handel system. three dimensional indicators. imulering av ikke-lineære management systems. So alt i din hender, og ikke glem matematikk har alltid vært dronning av naturvitenskap og MATLAB-pakken er din vitenskapelige kalkulator. Oversatt fra russisk av MetaQuotes Software Corp Opprinnelig artikkel. Bitfinex kunngjorde i dag starten på gruvedriftskontrakter som et handelsprodukt på plattformen totalt 100 THS terahashes per second with an expiration in 3 months have been made available for trading under the name TH1BTC The 100 THS are part of a larger pool of 3500 THS so more mining contracts might become available in the future Interestingly, this marks the first time that it is possible to short a mining contract. Shorting a mining contract means to receive an amount of Bitcoin now the price we sell it at and subsequently paying dividends in Bitcoin over the following 3 month until the contract expires in the middle of December A profit is made if the sum of all the dividends paid out plus the interest we paid to short the contract is less than what we received at the beginning when we sold the contract to someone else obviously. This means the price of TH1BTC should depend on 3 variables in decreasing order of importance. The change of the mining difficulty until 15 December. The time remaining until 15 December. The interest rate swap rate. If difficulty increases dividend payments become smaller because 1 THS represents a smaller fraction of the whole network hashing power Therefore the price of one contract should decrease if difficulty increases The closer we get to expiration the fever Bitcoins can be mind with 1 THS in total Therefore the price of one contract should decrease the closer we get to expiration and reach a price of 0 at expiration. The higher the interest ra te the more costly it is to enter and keep the contract over the full length of 3 month Bitfinex does not offer 90 days swaps, therefore entering a contract with the goal to hold it until the end contains quite a bit of interest rate risk because at some point a new swap has to be taken out at a potentially unfavorable interest rate This is less of a problem when going long Bitcoin rates are typically low than when going short there is only a maximum of 100 contracts available in total, no naked shorting To compensate for the risk prices should increase when swap rates are increasing. The big unknown is of course the change in the mining difficulty over the next 90 days In the following figure we see how difficulty changed over the previous 6 month. The data is from Tradeblock and it shows not only a graphical representation of past changes in the difficulty difficulty changes every 14 days depending on past hash rate More info can be found in the wiki but also some basic summary statist ics On average difficulty has increased 27 over the last 30 days and 77 over the last 60 days. To estimate the fair price of one TH1BTC we will assume that difficulty will increase on average 15 per month over the next 3 month Currently the price of buying one contract worth 1 THS is 2 BTC The pool fee is 3 and we will ignore interest rates Filling in all the information we get the following results. Hence if we go long one contract based on our assumptions we would make a loss of about 0 39 Bitcoin a bit more in reality since we will start mining in the middle of September until the middle of December because the expected dividends monthly revenue is not going to cover our initial costs of 2 BTC before the contract expires. On the other hand, going short at a price of 2 Bitcoin would have generated a profit of about 0 39 Bitcoin per contract Keep in mind that we didn t include swap costs which are currently at around 1 per day. There are two ways to look at the results Either we could say prices for TH1BTC are currently overvalued and should be closer to around 1 5 BTC If we assume difficulty will increase more than 15 per month then prices should be even lower than that Or we could say that the market is efficient and prices are correct, which would imply that the market is expecting difficulty to decrease on average about 2 per month over the next 90 days Either way, results will be known with certainty in 90 days. Struggling to recover from the most recent Bitcoin flash crash which originated on Bitfinex only four days go Bitcoin prices took another dive today as margin traders got their positions liquidated on BTC-e. The event started at 1 36 PM UTC 1 when large sell orders began to show up on the third largest western Bitcoin exchange BTC-e Downwards momentum increased steadily as the orderbook became increasingly thin, crashing prices to a low of USD 309 per Bitcoin at 1 43 PM In the following minutes prices rebounded swiftly on thin volume back to around USD 442 a s arbitrage traders started to take advantage of the discount relative to other exchanges. BTC-e is one of the few large exchanges that offer margin trading to their clients via the MetaTrader platform since November 2013, but the details of who excactly provides the funds necessary for margin trading have remained unclear The shape and especially timing of the crash points towards margin traders being liquidated or stop orders being executed , similar to what happened on Bitfinex a couple of days ago However, unlike Bitfinex which is transparent about open swap positions BTC-e does not provide important data which would be needed to provide a more thorough analysis and so this last statement can only be considered a good guess. Unlike Bitfinex, which relies on a hidden algorithm in an effort to control the order flow BTC-e seems to have no special safeguards in place to mitigate such events The fall below 400 was mainly due to a lack of bids in the orderbook and not because the market b elieved that the true value was below 400, as the rebound back to over 440 only minutes later basically proved Hence, halting trading during extreme downwards volatility could have easily averted the bloodshed among margin traders by giving other market participants more time to thicken the orderbook. Update 4 58PM UTC 1 BrCapoeira posted on Reddit an interesting graph based on data from the Metatrader platform. This graph implies that a single large order was the cause of this event Whether this order was created due to a margin call, a simple mistake, to manipulate the market, or to open a large short position remains unclear Common sense would suggest that it was probably the result of a margin call of a single large trader. My previous post on this topic has been brought up during discussions in the aftermath of the most recent Bitcoin flash crash Coindesk was one of the first to pick it up and since then various posts about transparency and the possible responsibilty of exchanges to actively manage order execution started to appear As a result of those events Josh Rossi, Vice President of Business Development at Bitfinex, went on Reddit to openly address some of the issues brought up against the exchange. The facts we know for sure are that there were some large sell orders shortly before the crash started, for example a 500 sell order on Bitstamp at 9 49am UTC 1 , about 6 minutes before a large sell order on Bitfinex triggered the crash However, the data does not tell us whether it was insider trading, some form of market manipulation or a simple mistake. Fact is that after the Bitcoin flash crash open swap positions decreased from around 28m to 24m which indicates about 8400 margin long positions were closed assuming an average of 475 in one way margin call or another stop order hit The data does not tell us what the ratio is but according to Josh only about 650 Bitcoins were sold as the result of margin calls. As correctly pointed out by Jonathan Levin fact is tha t starting about 24 hours before the bitcoin flash crash until the crash itself an additional 1000 Bitcoins were taken out in short positions and about 2500 shorts were subsequently closed during the crash Whether those shorts were opened to hedge existing positions, as a malicious attempt to trigger a margin call, or a way to front-run the market using private information cannot be determined from the available data it does look oddly suspicious though. What was unexpected. Personally, the interesting point is not that Bitcoin flash crashed Sudden price fluctuations happened in the past and will happen in the future, especially in illiquid markets such as Bitcoin The interesting point is the involvement of Bitfinex and how they actively managed order execution without informing market participants in advance. The Bitfinex matching engine was not halted during the whole crash though it did slow down but nowhere as bad as the infamous 70 minute order lag on the now defunct MtGox exchange d uring the crash in 2012 However, what Bitfinex did was they introduced something they now refer to as speed bumps What it means is that they essentially flag orders they deem as invalid or potentially dangerous and slow them down intentionally. At first sight this might seem like a nice idea Who doesn t want a filter to remove or slow down malicious orders However, as so often with those kind of things the devil is in the detail. The problem is that Bitfinex has not and possibly never will make public how exactly they categorize an order as bad and slow it down If a market participant decides to put up a large sell order against a thin orderbook then that s his decision Whether his action was intended or not is not up to the exchange to decide It might be that this market participant was simply the first person to react to a major event and is entirely willing to bear the additional costs of the resulting slippage in anticipation of a major price move There simply does not exist a way to accurately classify orders a priori as good or bad since that would automatically assume knowledge of all immediate future events. What can be improved. Mistakes fat finger , algorithm going havoc happen, margins get called and people try to game the system in every possible way Logically there have to be safeguards in place to protect markets and its participants Bitfinex was definitely aware of potential toxic order flow and prepared counter measures The only thing they forgot was to inform their clients about the hidden safety features. Hiding those safeguards from the public adds uncertainty to the market especially now that we know they exist and sometimes do something and essentially puts every traders trust into the hands of Bitfinex At this point a trader can only hope that Bitfinex will always act in the best intentions of their clients This hope might be futile though, since Bitfinex makes money from trading fees, independently whether a trader actually makes any money One does not have to think for long to realize the hidden potential for abuse in such a system. The main reason brought up by Josh why Bitfinex does not intend to publicise their algorithm is to avoid giving traders the possibility to exploit it is bogus and the following shows why. Those are the official market wide circuit breakers used by NASDAQ, posted online and entirely transparent for every market participant Those rules are certainly not perfect but they are simple, transparent, and work for one of the largest stock markets in the world Now, I have great respect for the people working on the Bitfinex platform, but I doubt that they managed to come up with an algorithm which protects market participants better than the ones used by a major exchange trading more than 900 million shares per day on average And if they did, now is the chance for Bitfinex to prove it to the world and possibly write history by teaching the big boys how to properly run an exchange. When it comes to public exchang es transparency is a must, not just for Bitfinex but for any exchange Market participants have to know exactly what happens when they place an order and should under no circumstances have to rely on good faith alone Safeguards are important because accidents happen and markets crash but it is not up to the exchange to engage in secret order discrimination There are different ways to safeguard financial markets and none of them is perfect Adding complexity usually increases the chance for unintended side effects and therefore a simple, transparent approach seems more appropriate than a hidden, complex one. Two days ago BitMEX reduced their trading fees to 0 and celebrated it by releasing a basic market making bot on Github. BitMEX is currently running a trading challenge until August 29, 2014 to promote their new platform Releasing a market marking bot is probably an interesting and effective way to increase API traffic and stress test the platform a bit Of course I couldn t resist and ha d a look. Market-maker is a forked off Liquidbot which was original designed to run on the now obsolet MtGox exchange There were some minor changes new api class to connect to BitMEX, some additional prints to console, changes to adapt for futures contracts, and a huge and unnecessary print to console when starting up but no significant changes to the trade logic. The algorithm uses REST and only checks for changes every 60 seconds This already disqualifies the bot as it is essential too slow to react to ongoing changes in the orderbook BitMEX limits requests to the REST API to 150 per 5 minutes so you can try reducing the 60 seconds to something like 3 but it won t change the fact that as soon as markets start to move you will hit the limit and be stuck with open positions To be fair, BitMEX provides the bot more as a marketing stunt and explicitly states that switching to WebSocket will be highly beneficial as it allows real time updates. Overall, the algorithm is solidly written, techn ically works and is easy to setup, but it won t make you any money in the long run If someone seriously considers to employ this bot I would recommend the following small changes to make the code more usable.1 Change to Websocket.2 Exit position on close.3 Build orders starting from the midpoint. In addition I would advise to measure volatility in some way and adapt the distance between orders dynamically as well as the size. During my testing the API was always responsive and accurate Volume on the exchange is still low but the fundamentals of the platform look promising This bot is a fun tool to introduce users into the world of market making and algorithmic trading but it won t stand a chance against established algorithms. Note If you consider using this algorithm keep in mind that market making is a full time job Anything less than complete dedication, fast reaction time, and 100 uptime will cause you to lose money. Edit Follow up on the aftermath here. Today Bitcoin prices took a dive as margin traders on one of the largest exchange Bitfinex got their orders liquidated For many close market observers and more sophisticated traders this did not come as a surprise In fact, long positions have been building up continuously over the last couple of months in anticipation of a new bubble in Bitcoin prices and reached as high as 30m in outstanding swap positions on Bitfinex. Now, this wouldn t be a problem all by itself as long as there is enough capital backing the loan Unfortunately, most of those long positions were entered around 600 640 USD BTC and the collateral was mostly provided in Bitcoins itself The following chart nicely shows the buildup of long positions, peaking around July 14 with close to 32m in swaps. Running some quick math based on the maintenance margin of Bitfinex of 13 and assuming Bitcoin as collateral we find that margin calls should start around the 520 540 USD BTC mark Yesterday, prices came close and today they finally jumped over the cliff. The p roblem is that once margin calls set in you have a cascading effect which rips through the order book, causing even more orders to reach the point of no return and increasing the downward momentum further These kind of events are not limited to Bitcoin exchanges but can also occur on major exchanges such as during the 2010 flash crash in the US The cause of such a flash crashe can vary and goes from fat finger mistakes to programming errors to cascading margin calls. It is interesting to see how the exchanges deal with these events In the US, Nasdaq implemented market wide circuit breakers which will cause trading to stop under such extreme circumstances Bitcoin markets are not yet as advanced and usually continue trading If we look at the order action on Bitfinex today we see something very peculiar. It seems and this is just a guess as there is no official comment from the exchange as if Bitfinex is running an algorithm to handle the margin calls The algorithm starts selling but limits itself to a 10 drop in prices within 1 minute If prices drop more than 10 in 1 minute it will stop selling and wait for buy orders to come in Once there are again a certain amount of buy orders in the orderbook the algorithm starts selling again until all margin calls are met Edit LeMogawai was the first to point this out in this post and it matches my personal observation at the time of the event. This seems to be an interesting way to deal with cascading margin calls but can also be considered as borderline market manipulation from the exchange side By spreading out the sell orders over time the downwards momentum is reduced, however traders end up trading against the exchange itself and not the market anymore The exchange has an informational advantage at that point and is therefore more likely to profit than the traders Fortunately, this only lasted for about 10 minutes after which control was given back to the market. Other exchanges which also offer margin trading such as BTC-e an d OKcoin are now in a favorable position and can learn from todays events Implementing a system more closely resembling the circuit breakers of big exchanges such as Nasdaq might be a smart first move. Recently I am working to get my new trading platform going This new version is based on Python, uses MySQL to keep a database of all time series of different virtual currencies with automatic backfill from BitcoinCharts and integrates the 3 major exchanges MtGox, BTC-E and Bitstamp The platform will be used as way to backtest some strategies and engage in automatic trading. During the run-up to this I decided to pull some data of BTC against USD from BitcoinCharts and based on the ideas of a paper by Hashem and Timmermann 1995 implemented a simple trading strategy The idea is to forecast the sign of the t 1 period return based on a regression, which is estimated on an automatic selection of technical indicators during the last n period up until t Then, after t 1 happened, we refresh the mo del and try to predict t 2 using all the data available of the last n periods until t 1 and so on. For my Bachelor Thesis I examined four different technical trading rules in Forex markets It uses MCS and SPA test to search for valid models among different parameters that are not subject to data snooping Taking into account realistic transaction costs we find no evidence of excess returns, which is consistent with market efficiency. With this code you should be able to look for Bitcoin arbitrage opportunities within BTC-e It uses the idea of one price and applies triangular arbitrage, taking into account costs and spread The reason I post this here is despite that it works, chances are you will be too slow to compete with other investors doing the same. Possible improvements would be to take into account the order book depth and split the trades up dynamically, trying to undercut other traders doing the same Also setting everything up on a dedicated server close to the physical location o f the BTC-e match engine should drastically reduce lag and give you a potential edge. Post navigation. Cointegration Indicator. Cointegration Indicator. Thanks 10 given, 66 received. I posted a cointegration indicator CADF in the Elite Downloads area It plots the output statistic of an Augmented Dickey Fuller cointegrating regression of 2 instruments It s a C translation of MATLAB code developed by James P LeSage and posted at Econometrics Toolbox for MATLAB I used some mathematical routines from ALGLIB ALGLIB which are included, and wrote a lot of helper routines to accomplish the MATLAB functions Even if you re not interested in cointegration, you might find it useful as an example programming with quantitative methods for NinjaTrader. I haven t seen a cointegration indicator for a trading platform posted publicly before, only MATLAB or R code So I thought I would be the first I posted it for formerly BMT Elite members only, please don t share or distribute. This version is made using prima rily static routines, which call new frequently This works fine for indicators or normal strategies, but it can fall apart by filling up memory if you try to run an extensive optimization on it The alternative is to implement the internal routines as classes which can be instantiated once and pre-allocate their storage once at the start I ve done that for strategies, and it helps optimizer performance quite a bit, but ALGLIB uses new in some places so I haven t been able to get rid of all uses of new. I also posted the latest ALGLIB 3 5 0 library, packaged as a NinjaTrader indicator , in the MATLAB downloads area But it s not needed for CADF, the required ALGLIB routines are included. I posted a cointegration indicator CADF in the Elite Downloads area It plots the output statistic of an Augmented Dickey Fuller cointegrating regression of 2 instruments It s a C translation of MATLAB code developed by James P LeSage and posted at Econometrics Toolbox for MATLAB I used some mathematical rou tines from ALGLIB ALGLIB which are included, and wrote a lot of helper routines to accomplish the MATLAB functions Even if you re not interested in cointegration, you might find it useful as an example programming with quantitative methods for NinjaTrader. I haven t seen a cointegration indicator for a trading platform posted publicly before, only MATLAB or R code So I thought I would be the first I posted it for formerly BMT Elite members only, please don t share or distribute. This version is made using primarily static routines, which call new frequently This works fine for indicators or normal strategies, but it can fall apart by filling up memory if you try to run an extensive optimization on it The alternative is to implement the internal routines as classes which can be instantiated once and pre-allocate their storage once at the start I ve done that for strategies, and it helps optimizer performance quite a bit, but ALGLIB uses new in some places so I haven t been able to get rid of all uses of new. I also posted the latest ALGLIB 3 5 0 library, packaged as a NinjaTrader indicator , in the MATLAB downloads area But it s not needed for CADF, the required ALGLIB routines are included. Thanks for your contribution, I never been exposed to this trade style and i am a completely ignorant about this, but for sure its an interest theme and style It will be good if you post some example on how to use this approach. May 24th, 2012, 03 43 PM. Futures Experience Beginner. Favorite Futures DAX, EUR USD. Posts 18 since Aug 2010.Thanks 16 given, 2 received. kevind, about some examples I would be pleased too I experimented with this approach in Matlab before a while and tried to translate this to C but failed The same problem with R Thank you for your code I will take a look. It should work fine with futures, or futures paired with stocks You need to enter a symbol in the proper form, the symbol must exist in the instrument manager, and the data has to exist for the period specified Cointegration is typically tested on daily data over longer periods, so continuous futures data is probably your best bet. Proper symbol form is i e ES - for continuous futures, or ES 06-12 for a specific contract. Thanks for the reply I have the ES and 6E loaded on a Ninja chart for max days daily chart Also tried 1440 minute chart because I know some indicators only report on 1440 minute charts on Ninja Still nothing with the CADF The parameters list Symbol 2 , which I assume is the second symbol, Nlag ste to 1, P set to 0, and Period set to 250 Should any of these be adjusted Thanks.
Comments
Post a Comment