En trinvis guide til opbygning af en handelsbot i ethvert programmeringssprog

Derfra kan vi begynde at bestemme, hvordan vores arkitektur skal se ud.

Først har vi brug for en variabel til at angive den tilstand, som bot’en er i øjeblikket. Dette er enten KØB eller SÆLG. En boolean eller enum bør passe godt til dette formål.

Dernæst skal vi indstille vores tærskelværdier for køb og salg. Disse angiver det procentvise fald eller stigning i prisen, siden vi sidst foretog en operation.

For eksempel, hvis jeg købte aktivet til 100$, og dets pris nu er på 102$, har vi en stigning på 2%. Hvis vi har en SELL tærskel, der er sat til en stigning på 1%, vil vores bot derefter sælge, fordi den har lavet en fortjeneste over vores tærskel.

I vores tilfælde vil disse tærskler være konstanter. Vi har brug for 4 af dem, to for hver tilstand:

BUY tærskler (hvis bot er i SELL-tilstand)

  • DIP_THRESHOLD : Køber aktivet, hvis dets pris er faldet med mere end tærsklen. Ideen med dette er at følge strategien “køb lavt, sælg højt”, hvor du forsøger at købe et aktiv, når det er undervurderet, og forventer, at dets værdi stiger, så du kan sælge.
  • UPWARD_TREND_THRESHOLD : Køber aktivet, hvis dets pris er steget med mere end tærsklen. Dette går imod filosofien “køb lavt, sælg højt”, men har til formål at identificere, hvornår prisen stiger, og vi ønsker ikke at gå glip af en mulighed for at købe, før den stiger endnu mere.

Her er en illustration, der måske kan hjælpe:

Image By Author

Hvis vi har udført en SELL-operation på det punkt, der er markeret med “SELL” i billedet ovenfor, har vi nu vores tærskelværdier indstillet til købsoperationen.

Hvis prisen nogensinde går under den nederste grønne linje eller over den øverste grønne linje vil vi udføre en KØB-operation. I dette tilfælde overskred vi den øverste tærskel først, så vi købte baseret på BUY_DIP_THRESHOLD .

SÆLG Tærskler (Hvis Bot er i BUY-tilstand)

  • PROFIT_THRESHOLD : Sælger aktivet, hvis dets pris er steget over tærsklen, siden vi købte det. Det er sådan, vi opnår en fortjeneste. Vi sælger til en højere pris, end vi købte.
  • STOP_LOSS_THRESHOLD : Ideelt set ønsker vi kun, at vores bot skal sælge, når den opnår en fortjeneste. Men måske er markedet lige ved at gå markant ned, og vi vil gerne ud, før det er for sent, og derefter købe til en lavere pris. Derfor bruges denne tærskel til at sælge med tab, men med det formål at forhindre et større tab i at ske.

Her er en illustration:

Image By Author

Her har vi købt på det punkt, der er markeret med “BUY”. Derefter mødte vi vores øvre tærskel før den nedre, hvilket betyder, at vi solgte vores aktiv med en fortjeneste. Sådan tjener handelsrobotter penge.

Nu har vi allerede en grundlæggende idé om, hvordan robotten fungerer, så lad os gå i gang med noget (pseudo-)kode.

API-hjælpefunktioner

Den første ting, vores bot har brug for, er nogle hjælpefunktioner til at hente data fra børsens API. Vi har brug for:

Overstående burde være selvforklarende, men du skal sikre dig, at du er opmærksom på, hvilke valutaer API’et POSTforespørger om, når du laver en købs- eller salgsoperation.

Ofte gange, når du f.eks. handler USD for guld, kan du angive enten hvor meget guld, der skal købes, eller hvor meget USD, der skal sælges. Det er meget vigtigt at få valutaerne rigtigt angivet.

Bot Loop Cycle

Nu da vi har vores hjælpefunktioner, skal vi begynde at definere arbejdsgangen i bot’en. Den første ting, vi har brug for, er en uendelig løkke med en vis hviletid. Lad os sige, at vi ønsker, at bot’en skal forsøge at foretage en operation hvert 30. sekund. Sådan kan det se ud:

Dernæst skal vi indstille de variabler og konstanter, som vi talte om, samt beslutningsflowet. API-hjælpefunktioner til side, ville vores kode ende med noget i retning af dette:

Bemærk: Værdierne for tærskelværdierne her er bare vilkårlige værdier. Du bør vælge dine egne i henhold til din egen strategi.

Hvis ovenstående parres sammen med hjælpefunktionerne og loop-funktionen, som også kunne være main , skulle vi nu have os selv de grundlæggende søjler i en fungerende bot.

Ved hver iteration vil vores bot kontrollere sin aktuelle tilstand (KØB eller SALG) og forsøge at foretage en handel baseret på de tærskelværdier, der er hardkodet ind. Den vil derefter opdatere KØB/SALG-tilstanden og den sidste pris for en operation.

Så gør den det hele forfra.

Stræk 5: Polering af bot

Foto af Matthew Dockery

Den grundlæggende arkitektur af vores bot er klar, men der er sikkert et par ting, som vi stadig vil overveje at tilføje.

Logs

Da jeg først byggede en variant af denne bot, var en ting, der var afgørende for mig, at have konstant logning af botens handlinger både til terminalen og til en separat logfil.

På hvert trin ville jeg oprette logfiler som:

 USD Balance = 22.15$
Bought 0.002 BTC for 22.15 USD
Last Operation Price updated to 11,171.40 (BTC/USD)
Could not perform SELL operation - Insufficient balance

Logfilerne, der gik til filen, ville også få tilføjet et tidsstempel, så når jeg efter en hel dag fik adgang til serveren og f.eks. fandt en fejl, kunne jeg spore den nøjagtigt tilbage til, hvor den skete, samt finde ud af alt det andet, som bot’en gjorde undervejs.

Dette skulle være et spørgsmål om at opsætte en createLog-funktion, der kaldes på hvert trin. Noget i stil med dette:

Identificering af tendenser

Det primære mål for vores bot bør være at købe til en lav pris og sælge til en profit. Vi har dog to tærskler, der ligesom modsiger denne idé: UPWARD_TREND_THRESHOLD og STOP_LOSS_THRESHOLD .

Disse tærskler fortæller os angiveligt, hvornår vi skal sælge til et tab eller købe ved en prisstigning. Ideen er, at vi forsøger at identificere tendenser, der falder uden for den generelle strategi, men som kan være skadelige eller gavnlige for os, så vi bør handle.

Men den måde, jeg har struktureret det på ovenfor, er dog ret begrænset. Et statisk øjebliksbillede af en pris er langt fra en indikation af en trend.

Gluksomt nok kan du uden større besvær gøre dette lidt mere pålideligt.

Det eneste du skal gøre er også at holde styr på flere priser end blot lastOpPrice . Du kunne f.eks. holde styr på prisen for 10 eller 20 iterationer siden, og sammenligne den med den aktuelle pris i stedet for lastOpPrice . Dette ville sandsynligvis være bedre til at identificere en tendens, fordi det kontrollerer hurtige skift i prisen snarere end et skift, der er sket over en lang periode.

Database?

Mens den kører, har denne simple bot faktisk ikke brug for en database, da den håndterer meget få data og kan holde alle oplysninger i hukommelsen.

Hvad sker der imidlertid, når botten f.eks. fejler? Hvordan kan den bestemme lastOpPrice uden at du kontrollerer det manuelt?

For at undgå manuelt arbejde i din ende, kan du måske holde en slags letvægtsdatabase til at holde styr på nogle få ting, som lastOpPrice .

På denne måde vil bot’en, når den starter op, i stedet for at bruge standardværdierne, faktisk kontrollere sine gemte værdier og fortsætte derfra.

Afhængigt af hvor simpelt du vil gøre det, kan du endda overveje en “database” af .txt eller json filer, da du måske alligevel kun gemmer nogle få værdier.

Dashboard

Foto af Luke Chesser

Hvis du ønsker at lette visualiseringen af din bot’s operationer, samt administrere den uden at skulle gå ind og manuelt pille ved koden, kan du overveje at forbinde din bot til et dashboard.

Dette vil kræve, at din bot er forbundet med sin egen webserver/API, som giver dig mulighed for at styre dens funktionalitet.

På denne måde kan du f.eks. lettere ændre tærskler.

Der findes mange gratis dashboard-skabeloner, så du behøver ikke engang at lave din egen. Tjek Start Bootstrap og Creative Tim for nogle eksempler.

Test af strategier på tidligere data

Mange børser vil tilbyde dig adgang til tidligere prisdata, ligesom du normalt nemt kan få fat i disse data andre steder, hvis du har brug for det.

Dette er meget nyttigt, hvis du vil teste din strategi, før du sætter den i værk. Du kan køre en simulering af din bot med tidligere data og “falske penge” for at se, hvor godt dine definerede tærskler ville have fungeret, og justere dem til den virkelige handel.

Tidligere punkter om tærskler og ordrer

Der er et par ting, du skal være opmærksom på, når du placerer ordrer.

Først skal du forstå, at der er to typer ordrer: Limit-ordrer og markedsordrer. Du bør virkelig læse lidt om dette, hvis du ikke er bekendt med begreberne, men jeg vil give dig et grundlæggende overblik her.

Markedsordrer er ordrer, der udføres til den aktuelle markedspris, og som effektivt udføres med det samme i de fleste tilfælde.

Limitordrer sker på den anden side, når du placerer en ordre til en pris, der er lavere end markedsprisen (i tilfælde af en KØB-ordre) eller højere end markedsprisen (i tilfælde af en SÆLG-ordre). Disse er ikke garanteret at blive udført, da prisen måske ikke når den tærskel, du har sat.

Fordelen ved limitordrer er, at du kan foregribe markedsbevægelser og placere en ordre med hensyn til, hvor du forventer, at markedet vil bevæge sig hen, før en sådan bevægelse sker.

Dertil kommer, at limitordrer normalt er underlagt lavere gebyrer end markedsordrer. Dette skyldes, at markedsordrer er underlagt det, der almindeligvis kaldes et “taker-gebyr”, mens limitordrer er underlagt “maker-gebyrer”.

Grunden til navnene og deres respektive gebyrer er, at markedsordrer blot accepterer (“tager”) den aktuelle markedspris, mens limitordrer uden for markedsprisen tilføjer likviditet og dermed “skaber et marked”, hvilket de “belønnes” for med lavere gebyrer.

Bemærk, at robotten i denne artikel er bedst egnet til markedsordrer.

Sidst, om emnet gebyrer, når du indstiller dine PROFIT_THRESHOLD , skal du huske at tage gebyrer i betragtning.

For at opnå en fortjeneste skal du udføre en KØB og derefter en SÆLG-operation, hvilket efterlader dig underlagt 2 gebyrer.

Som sådan skal du sørge for, at du kun sælger med fortjeneste, når du er i stand til mindst at dække dine gebyrer, ellers vil du faktisk lave et tab.

Tænk over det, hvis du antager, at gebyrerne var flade, hvis du købte et aktiv for 100,00$ med et gebyr på 0,50$, og derefter solgte det for 100,75$, igen med et gebyr på 0,50$, ville du have lavet en bruttoavance på 0,75%, men i virkeligheden ville du have et nettotab på 0,25%.

Forestil dig nu, at din bot altid solgte med et nettotab. Du ville tabe en masse penge ret hurtigt…

Slutbemærkninger

Det var det hele for vores bot. Jeg håber, at denne tutorial var nyttig.

Den idé var at fokusere på alle de koncepter, du skal vide for at bygge en handelsbot, selv hvis du aldrig har handlet før, ikke at lære dig at programmere.

Antagelsen er, at alle læsere er i stand til at lave HTTP-forespørgsler i deres foretrukne sprog, så det ville være bedst at fokusere på andre aspekter.

Det er den første tutorial, jeg nogensinde skriver på denne måde (pseudokodebaseret), så lad mig endelig vide, hvad du syntes om konceptet.

Tak for læsning! Og hvis du synes, at denne artikel var nyttig, er du velkommen til at støtte mig med nogle klapsalver 👏👏.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.