Från detta kan vi börja bestämma hur vår arkitektur kommer att se ut.
Först behöver vi en variabel för att indikera tillståndet Bot är för närvarande i. Detta är antingen BUY eller SELL. En boolean eller enum bör passa bra för detta ändamål.
Därefter måste vi fastställa våra tröskelvärden för köp och försäljning. Dessa anger den procentuella minskningen eller ökningen av priset sedan vi senast gjorde en operation.
Till exempel, om jag köpte tillgången till 100$ och dess pris nu är 102$, har vi en ökning på 2%. Om vi har en SELL-tröskel som är inställd på en ökning på 1 % kommer vår bot då att sälja, eftersom den har gjort en vinst över vår tröskel.
I vårt fall kommer dessa trösklar att vara konstanter. Vi behöver fyra av dem, två för varje tillstånd:
BUY Thresholds (If the Bot is in SELL State)
-
DIP_THRESHOLD
: Köper tillgången om dess pris minskat med mer än tröskelvärdet. Tanken med detta är att följa strategin ”buy low, sell high”, där du försöker köpa en tillgång när den är undervärderad och förväntar dig att dess värde ska stiga så att du kan sälja. - : Köper tillgången om dess pris har ökat med mer än tröskelvärdet. Detta går emot filosofin ”köp lågt, sälj högt”, men syftar till att identifiera när priset stiger och vi vill inte missa ett tillfälle att köpa innan det går ännu högre.
Här är en illustration som kan vara till hjälp:
Om vi utförde en SÄLJA-operation vid punkten som är markerad med ”SÄLJA” i bilden ovan har vi nu våra tröskelvärden inställda för köpeoperationen.
Om priset någonsin går under den nedre gröna linjen eller över den övre gröna linjen kommer vi att utföra en KÖP-operation. I det här fallet överskred vi den övre tröskeln först, så vi köpte baserat på BUY_DIP_THRESHOLD
.
Säljtrösklar (om roboten är i BUY-tillstånd)
-
PROFIT_THRESHOLD
: Säljer tillgången om priset har ökat över tröskeln sedan vi köpte den. Det är så här vi tjänar pengar. Vi säljer till ett högre pris än vad vi köpte. -
STOP_LOSS_THRESHOLD
: Helst skulle vi vilja att vår bot bara säljer när den gör vinst. Men kanske går marknaden just ner kraftigt och vi vill komma ut innan det är för sent och sedan köpa till ett lägre pris. Därför används detta tröskelvärde för att sälja med förlust, men med målet att stoppa en större förlust från att inträffa.
Här är en illustration:
Här har vi köpt vid punkten som markerats med ”BUY”. Sedan uppfyllde vi vår övre tröskel före den nedre, vilket innebär att vi sålde vår tillgång med vinst. Detta är hur handelsrobotar tjänar pengar.
Nu har vi redan en grundläggande idé om hur roboten fungerar, så låt oss gå in i lite (pseudo)kod.
Hjälpfunktioner för API
Det första som vår robot behöver är några hjälpfunktioner för att få data från börsens API. Vi behöver:
Ovanstående bör vara självförklarande, men du måste se till att du är medveten om vilka valutor som API:et POST
förfrågar efterfrågar när du gör en köp- eller säljoperation.
Ofta kan du till exempel när du byter USD mot guld ange antingen hur mycket guld som ska köpas eller hur mycket USD som ska säljas. Det är mycket viktigt att välja rätt valutor.
Bot Loop Cycle
När vi nu har våra hjälpfunktioner kan vi börja definiera botens arbetsflöde. Det första vi behöver är en oändlig slinga med viss vilotid. Låt oss säga att vi vill att roboten ska försöka göra en operation var 30:e sekund. Så här kan det se ut:
Därefter ska vi ställa in variablerna och konstanterna som vi pratade om, samt beslutsflödet. API-hjälpfunktioner åsido skulle vår kod sluta ungefär så här:
Notera: Värdena för tröskelvärdena här är bara godtyckliga värden. Du bör välja dina egna enligt din egen strategi.
Om ovanstående kopplas ihop med hjälpfunktionerna och loop-funktionen, som också kan vara main
, bör vi nu ha oss själva de grundläggande pelarna för en fungerande bot.
Vid varje iteration kommer vår bot att kontrollera sitt nuvarande tillstånd (KÖPA eller SÄLJA) och försöka göra en handel baserat på de tröskelvärden som är hårdkodade. Den kommer sedan att uppdatera köpe/försäljningstillståndet och det senaste priset för en operation.
Sedan gör den allt om igen.
Steg 5: Polering av roboten
Den grundläggande arkitekturen för vår robot är klar, men det finns troligen några saker vi fortfarande vill överväga att lägga till.
Logs
När jag först byggde en variant av den här roboten var en sak som var väsentlig för mig att ha konstant loggning av robotens handlingar både till terminalen och till en separat loggfil.
Vid varje steg skulle jag skapa loggar 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
Loggarna som gick till filen skulle också få en tidsstämpel tillagd, så när jag till exempel gick in på servern efter en hel dag och hittade ett fel, kunde jag spåra det exakt till var det inträffade, samt ta reda på allt annat som roboten gjorde på vägen.
Det här borde vara en fråga om att ställa in en createLog
-funktion som kallas vid varje steg. Något i stil med detta:
Identifiera trender
Huvudmålet för vår bot bör vara att köpa till ett lågt pris och sälja med vinst. Vi har dock två tröskelvärden som på sätt och vis motsäger denna idé: UPWARD_TREND_THRESHOLD
och STOP_LOSS_THRESHOLD
.
Dessa tröskelvärden ska enligt uppgift tala om för oss när vi ska sälja vid en förlust eller köpa vid en prisökning. Tanken är att vi försöker identifiera trender som faller utanför den allmänna strategin men som kan vara skadliga eller fördelaktiga för oss så att vi bör agera.
Det sätt som jag strukturerade det på ovan är dock ganska begränsat. En statisk ögonblicksbild av ett pris är långt ifrån en indikation på en trend.
Glckligtvis kan du utan större besvär göra detta lite mer tillförlitligt.
Allt du behöver göra är också att hålla koll på fler priser än bara lastOpPrice
. Du kan till exempel hålla reda på priset för 10 eller 20 iterationer sedan och jämföra det med det aktuella priset i stället för lastOpPrice
. Detta skulle förmodligen vara bättre på att identifiera en trend eftersom det kontrollerar snabba förändringar i priset snarare än en förändring som skett under en lång tidsperiod.
Databas?
Vidare när den körs behöver den här enkla roboten egentligen ingen databas, eftersom den hanterar väldigt lite data och kan hålla all information i minnet.
Hursomhelst, vad händer när roboten misslyckas, till exempel? Hur kan den fastställa lastOpPrice
utan att du kontrollerar det manuellt?
För att undvika manuellt arbete i din ände kanske du vill ha någon form av lättviktsdatabas för att hålla reda på några saker, som lastOpPrice
.
På detta sätt kommer roboten när den startar att kontrollera de lagrade värdena i stället för att använda standardvärdena och fortsätta därifrån när den startar.
Avhängigt av hur enkelt du vill göra det här kan du till och med överväga en ”databas” med .txt
eller json
-filer, eftersom du kanske bara lagrar ett fåtal värden ändå.
Dashboard
Om du vill underlätta visualiseringen av din robots verksamhet, samt hantera den utan att behöva gå in och manuellt mixtra med koden, kan du överväga att ansluta din bot till en instrumentpanel.
Detta skulle kräva att din bot är ansluten till en egen webbserver/API som gör det möjligt för dig att styra dess funktionalitet.
På så sätt kan du till exempel ändra tröskelvärden lättare.
Det finns många kostnadsfria mallar för instrumentpaneler tillgängliga så du behöver inte ens göra en egen. Kolla in Start Bootstrap och Creative Tim för några exempel.
Testa strategier på tidigare data
Många börser kommer att erbjuda dig tillgång till tidigare prisdata, samt att du vanligtvis enkelt kan få tag på dessa data någon annanstans om du behöver det.
Det här är mycket användbart om du vill testa din strategi innan du sätter den i verket. Du kan köra en simulering av din bot med tidigare data och ”falska pengar” för att se hur väl dina definierade tröskelvärden skulle ha fungerat och justera dem för den riktiga affären.
Allmänt om tröskelvärden och order
Det finns några saker som du måste vara uppmärksam på när du placerar order.
För det första bör du förstå att det finns två typer av order: limiterade order och marknadsorder. Du bör verkligen läsa lite mer om detta om du inte är bekant med begreppen, men jag ger dig en grundläggande översikt här.
Marknadsordrar är ordrar som utförs till det aktuella marknadspriset, vilket i praktiken innebär att de utförs omedelbart i de flesta fall.
Limitordrar, å andra sidan, inträffar när du placerar en order för ett pris som är lägre än marknadspriset (när det gäller en KÖP-order) eller högre än marknadspriset (när det gäller en SÄLJA-order). Dessa är inte garanterade att utföras, eftersom priset kanske inte når upp till det tröskelvärde du fastställt.
Fördelen med limitorder är att du kan förutse marknadsrörelser och placera en order om vart du förväntar dig att marknaden ska gå innan en sådan rörelse inträffar.
Det är dessutom vanligt att limitorder är föremål för lägre avgifter än marknadsorder. Detta beror på att marknadsordrar är föremål för vad som vanligen kallas en ”taker fee” medan limitordrar är föremål för ”maker fees”.
Anledningen till namnen och deras respektive avgifter är att marknadsordrar bara accepterar (”tar”) det aktuella marknadspriset, medan limitordrar som ligger utanför marknadspriset lägger till likviditet och därmed ”skapar en marknad”, vilket de ”belönas” för med lägre avgifter.
Bemärk att roboten i den här artikeln är bäst lämpad för marknadsordrar.
Sist på temat avgifter, när du ställer in din PROFIT_THRESHOLD
, kom ihåg att ta hänsyn till avgifter.
För att göra en vinst måste du utföra en KÖP- och sedan en SÄLJA-operation, vilket gör att du blir föremål för 2 avgifter.
Som sådan måste du se till att du bara säljer med vinst när du åtminstone kan täcka dina avgifter, annars kommer du faktiskt att göra en förlust.
Tänk på det, om du antar att avgifterna är oförändrade, om du köper en tillgång för 100,00$, med en avgift på 0,50$, och sedan säljer den för 100,75$, återigen med en avgift på 0,50$, skulle du ha gjort en bruttovinst på 0,75 %, men i själva verket skulle du ha en nettoförlust på 0,25 %.
Föreställ dig nu att din bot alltid säljer med en nettoförlust. Du skulle förlora mycket pengar ganska snabbt…
Slutanmärkningar
Det var allt för vår bot. Jag hoppas att den här handledningen var användbar.
Tanken var att fokusera på alla begrepp du behöver känna till för att bygga en handelsbot även om du aldrig har handlat tidigare, inte att lära dig att programmera.
Antagandet är att alla läsare kan göra HTTP-förfrågningar i sitt valfria språk, så det vore bäst att fokusera på andra aspekter.
Det är den första handledningen jag skriver på det här sättet (pseudokodbaserad), så låt mig gärna veta vad du tyckte om konceptet.
Tack för att du läste! Och om du tycker att den här artikeln var användbar är du välkommen att stödja mig med några klappar 👏👏.