Trading algoritmic Forex: o poveste practică pentru ingineri
Publicat: 2022-03-11După cum probabil știți, piața valutară (Forex sau FX) este utilizată pentru tranzacționarea între perechile valutare. Dar s-ar putea să nu știți că este cea mai lichidă piață din lume.
Acum câțiva ani, mânat de curiozitatea mea, am făcut primii pași în lumea tranzacționării algoritmice Forex creând un cont demo și jucând simulări (cu bani falși) pe platforma de tranzacționare Meta Trader 4.
După o săptămână de „trading”, aproape că îmi dublasem banii. Stimulat de propria mea tranzacționare algoritmică de succes, am săpat mai adânc și, în cele din urmă, m-am înscris pe o serie de forumuri FX. În curând, am petrecut ore întregi citind despre sistemele de tranzacționare algoritmice (seturi de reguli care determină dacă ar trebui să cumpărați sau să vindeți), indicatorii personalizați, dispozițiile pieței și multe altele.
Primul meu client
În această perioadă, întâmplător, am auzit că cineva încerca să găsească un dezvoltator de software care să automatizeze un sistem de tranzacționare simplu. Asta era în vremea colegiului, când învățam despre programarea concomitentă în Java (thread-uri, semafore și toate acele nedorite). M-am gândit că acest sistem automatizat nu poate fi mult mai complicat decât munca mea avansată la cursul de știință a datelor, așa că m-am întrebat despre job și m-am implicat.
Clientul dorea software de tranzacționare algoritmică construit cu MQL4, un limbaj de programare funcțional folosit de platforma Meta Trader 4 pentru a efectua acțiuni legate de acțiuni.
Rolul platformei de tranzacționare (Meta Trader 4, în acest caz) este de a oferi o conexiune la un broker Forex. Brokerul oferă apoi o platformă cu informații în timp real despre piață și execută ordinele dvs. de cumpărare/vânzare. Pentru cititorii care nu sunt familiarizați cu tranzacționarea Forex, iată informațiile furnizate de fluxul de date:
Prin Meta Trader 4, puteți accesa toate aceste date cu funcții interne, accesibile în diverse intervale de timp: la fiecare minut (M1), la fiecare cinci minute (M5), M15, M30, la fiecare oră (H1), H4, D1, W1, MN .
Mișcarea prețului curent se numește bifă . Cu alte cuvinte, o bifă este o modificare a prețului Bid sau Ask pentru o pereche valutară. În timpul piețelor active, pot exista numeroase tick-uri pe secundă. În timpul piețelor lente, pot exista minute fără bifă. Căpușa este bătaia inimii unui robot al pieței valutare.
Când plasați o comandă printr-o astfel de platformă, cumpărați sau vindeți un anumit volum dintr-o anumită monedă. De asemenea, stabiliți limite de stop-loss și take-profit. Limita stop-loss este cantitatea maximă de pips (variații de preț) pe care vă puteți permite să le pierdeți înainte de a renunța la o tranzacție. Limita de profit-profit este cantitatea de sâmburi pe care o vei acumula în favoarea ta înainte de a încasa.
Specificațiile de tranzacționare algoritmice ale clientului erau simple: doreau un robot Forex bazat pe doi indicatori. Pentru context, indicatorii sunt foarte folositori atunci când încercați să definiți o stare a pieței și să luați decizii de tranzacționare, deoarece se bazează pe date din trecut (de exemplu, cea mai mare valoare a prețului din ultimele n zile). Multe sunt încorporate în Meta Trader 4. Cu toate acestea, indicatorii de care era interesat clientul meu provin dintr-un sistem de tranzacționare personalizat.
Au vrut să tranzacționeze de fiecare dată când doi dintre acești indicatori personalizați s-au intersectat și numai într-un anumit unghi.
Implicat activ
Pe măsură ce mi-am murdărit mâinile, am aflat că programele MQL4 au următoarea structură:
- [Directive privind preprocesor]
- [Parametri externi]
- [Variabile globale]
- [Funcția de pornire]
- [Funcția Deinit]
- [Funcția de pornire]
- [Funcții personalizate]
Funcția de pornire este inima fiecărui program MQL4, deoarece este executată de fiecare dată când piața se mișcă (ergo, această funcție se va executa o dată pe bifă). Acesta este cazul, indiferent de intervalul de timp pe care îl utilizați. De exemplu, ați putea opera în intervalul de timp H1 (o oră), dar funcția de pornire s-ar executa de multe mii de ori pe interval de timp.
Pentru a rezolva acest lucru, am forțat funcția să se execute o dată pe unitate de perioadă:
int start() { if(currentTimeStamp == Time[0]) return (0); currentTimeStamp = Time[0]; ...
Obținerea valorilor indicatorilor:
// Loading the custom indicator extern string indName = "SonicR Solid Dragon-Trend (White)"; double dragon_min; double dragon_max; double dragon; double trend; int start() { … // Updating the variables that hold indicator values actInfoIndicadores(); …. string actInfoIndicadores() { dragon_max=iCustom(NULL, 0, indName, 0, 1); dragon_min=iCustom(NULL, 0, indName, 1, 1); dragon=iCustom(NULL, 0, indName, 4, 1); trend=iCustom(NULL, 0, indName, 5, 1); }
Logica deciziei, inclusiv intersecția indicatorilor și unghiurile acestora:
int start() { … if(ticket==0) { if (dragon_min > trend && (ordAbierta== "OP_SELL" || primeraOP == true) && anguloCorrecto("BUY") == true && DiffPrecioActual("BUY")== true ) { primeraOP = false; abrirOrden("OP_BUY", false); } if (dragon_max < trend && (ordAbierta== "OP_BUY" || primeraOP == true) && anguloCorrecto("SELL") == true && DiffPrecioActual("SELL")== true ) { primeraOP = false; abrirOrden("OP_SELL", false); } } else { if(OrderSelect(ticket,SELECT_BY_TICKET)==true) { datetime ctm=OrderCloseTime(); if (ctm>0) { ticket=0; return(0); } } else Print("OrderSelect failed error code is",GetLastError()); if (ordAbierta == "OP_BUY" && dragon_min <= trend ) cerrarOrden(false); else if (ordAbierta == "OP_SELL" && dragon_max >= trend ) cerrarOrden(false); } }
Trimiterea comenzilor:
void abrirOrden(string tipoOrden, bool log) { RefreshRates(); double volumen = AccountBalance() * point; double pip = point * pipAPer; double ticket = 0; while( ticket <= 0) { if (tipoOrden == "OP_BUY") ticket=OrderSend(simbolo, OP_BUY, volumen, Ask, 3, 0/*Bid - (point * 100)*/, Ask + (point * 50), "Orden Buy" , 16384, 0, Green); if (tipoOrden == "OP_SELL") ticket=OrderSend(simbolo, OP_SELL, volumen, Bid, 3, 0/*Ask + (point * 100)*/, Bid - (point * 50), "Orden Sell", 16385, 0, Red); if (ticket<=0) Print("Error abriendo orden de ", tipoOrden , " : ", ErrorDescription( GetLastError() ) ); } ordAbierta = tipoOrden; if (log==true) mostrarOrden(); }
Dacă sunteți interesat, puteți găsi codul complet care poate fi rulat pe GitHub.

Backtesting
Odată ce mi-am construit sistemul algoritmic de tranzacționare, am vrut să știu: 1) dacă se comportă corespunzător și 2) dacă strategia de tranzacționare Forex pe care a folosit-o era bună.
Backtesting (uneori scris „back-testing”) este procesul de testare a unui anumit sistem (automat sau nu) conform evenimentelor din trecut. Cu alte cuvinte, vă testați sistemul folosind trecutul ca proxy pentru prezent.
MT4 vine cu un instrument acceptabil pentru testarea backtesting a unei strategii de tranzacționare Forex (în prezent, există mai multe instrumente profesionale care oferă o funcționalitate mai mare). Pentru a începe, vă configurați intervalele de timp și rulați programul sub o simulare; instrumentul va simula fiecare bifă știind că pentru fiecare unitate ar trebui să se deschidă la un anumit preț, să se închidă la un anumit preț și să atingă maxime și minime specificate.
După ce comparați acțiunile programului cu prețurile istorice, veți avea o idee bună dacă se execută sau nu corect.
Din backtesting, am verificat raportul de returnare al robotului FX pentru unele intervale de timp aleatorii; Inutil să spun că știam că clientul meu nu avea de gând să se îmbogățească cu asta — indicatorii pe care îi alesese, împreună cu logica deciziei, nu erau profitabili . Ca exemplu, iată rezultatele rulării programului în fereastra M15 pentru 164 de operații:
Rețineți că echilibrul nostru (linia albastră) se termină sub punctul său de plecare.
Optimizarea parametrilor și minciunile sale
Deși backtestingul m-a făcut să mă feresc de utilitatea acestui robot FX, am fost intrigat când am început să mă joc cu parametrii săi externi și am observat diferențe mari în raportul general de returnare. Această știință specială este cunoscută sub numele de optimizare a parametrilor .
Am făcut câteva teste brute pentru a încerca să deducem semnificația parametrilor externi asupra raportului de returnare și am venit cu ceva de genul acesta:
Sau, curățat:
S-ar putea să credeți (cum am făcut eu) că ar trebui să utilizați parametrul A. Dar decizia nu este atât de simplă cum pare. Mai exact, rețineți impredictibilitatea parametrului A: pentru valori mici de eroare, returnarea acestuia se modifică dramatic. Cu alte cuvinte, este foarte probabil ca parametrul A să suprapredice rezultatele viitoare, deoarece orice incertitudine, orice schimbare va duce la o performanță mai slabă.
Dar într-adevăr, viitorul este incert! Și astfel revenirea parametrului A este, de asemenea, incertă. Cea mai bună alegere, de fapt, este să te bazezi pe imprevizibilitate. Adesea, un parametru cu un randament maxim mai mic, dar predictibilitate superioară (fluctuație mai mică) va fi preferabil unui parametru cu randament ridicat, dar predictibilitate slabă.
Singurul lucru de care poți fi sigur este că nu cunoști viitorul pieței și să te gândești că știi cum va funcționa piața pe baza datelor din trecut este o greșeală. La rândul său, trebuie să recunoașteți această imprevizibilitate în predicțiile dvs. Forex.
Acest lucru nu înseamnă neapărat că ar trebui să folosim Parametrul B, deoarece chiar și randamentele mai mici ale Parametrului A funcționează mai bine decât Parametrul B; aceasta este doar pentru a vă arăta că optimizarea parametrilor poate duce la teste care exagerează rezultatele probabile viitoare și o astfel de gândire nu este evidentă.
Considerații generale de tranzacționare algoritmică Forex
De la prima experiență de tranzacționare Forex algoritmică, am construit mai multe sisteme automate de tranzacționare pentru clienți și vă pot spune că există întotdeauna loc de explorat și analize Forex suplimentare de făcut. De exemplu, am construit recent un sistem bazat pe găsirea așa-numitelor mișcări „Peștele Mare”; adică variații uriașe de sâmburi în unități minuscule de timp. Acesta este un subiect care mă fascinează.
Construirea propriului sistem de simulare FX este o opțiune excelentă pentru a afla mai multe despre tranzacționarea pe piața Forex, iar posibilitățile sunt nesfârșite. De exemplu, puteți încerca să descifrați distribuția probabilității variațiilor prețului în funcție de volatilitate pe o singură piață (EUR/USD de exemplu) și poate faceți un model de simulare Monte Carlo folosind distribuția pe starea de volatilitate, folosind orice grad de acuratețea dorită. Voi lăsa asta ca un exercițiu pentru cititorul dornic .
Lumea Forex poate fi uneori copleșitoare, dar sper că acest articol v-a oferit câteva puncte despre cum să începeți propria strategie de tranzacționare Forex.
Lectură suplimentară
În zilele noastre, există o mare varietate de instrumente pentru a construi, testa și îmbunătăți automatizările sistemelor de tranzacționare: Trading Blox pentru testare, NinjaTrader pentru tranzacționare, OCaml pentru programare, pentru a numi câteva.
Am citit pe larg despre lumea misterioasă care este piața valutară. Iată câteva scrieri pe care le recomand programatorilor și cititorilor entuziaști:
- BabyPips: Acesta este punctul de pornire dacă nu cunoașteți squat despre tranzacționarea Forex.
- The Way of the Turtle, de Curtis Faith: Aceasta, în opinia mea, este Biblia Forex . Citiți-l după ce aveți ceva experiență de tranzacționare și cunoașteți câteva strategii Forex.
- Analiză tehnică pentru profesioniști în tranzacționare — Strategii și tehnici pentru piețele financiare globale turbulente de astăzi, de Constance M. Brown
- Expert Advisor Programming – Crearea de sisteme automate de tranzacționare în MQL pentru Meta Trader 4, de Andrew R. Young
- Sisteme de tranzacționare – O nouă abordare a dezvoltării sistemelor și a optimizării portofoliului, de Urban Jeckle și Emilio Tomasini: Foarte tehnic, foarte concentrat pe testarea FX.
- O implementare pas cu pas a unui sistem de tranzacționare valutară cu mai mulți agenți, de Rui Pedro Barbosa și Orlando Belo: Acesta este foarte profesionist și descrie cum ați putea crea un sistem de tranzacționare și o platformă de testare.