Trading algoritmico Forex: una storia pratica per ingegneri

Pubblicato: 2022-03-11

Come forse saprai, il mercato dei cambi (Forex o FX) viene utilizzato per il trading tra coppie di valute. Ma potresti non essere consapevole che è il mercato più liquido del mondo.

Qualche anno fa, spinto dalla mia curiosità, ho mosso i primi passi nel mondo del trading algoritmico Forex creando un conto demo e giocando simulazioni (con denaro falso) sulla piattaforma di trading Meta Trader 4.

Illustrazione di copertina Forex

Dopo una settimana di 'trading', avevo quasi raddoppiato i miei soldi. Spinto dal mio trading algoritmico di successo, ho scavato più a fondo e alla fine mi sono iscritto a numerosi forum FX. Presto ho passato ore a leggere sui sistemi di trading algoritmici (set di regole che determinano se dovresti comprare o vendere), indicatori personalizzati, stati d'animo del mercato e altro ancora.

Il mio primo cliente

In questo periodo, casualmente, ho sentito che qualcuno stava cercando di trovare uno sviluppatore di software per automatizzare un semplice sistema di trading. Ai tempi del college stavo imparando la programmazione simultanea in Java (thread, semafori e tutta quella spazzatura). Ho pensato che questo sistema automatizzato non potesse essere molto più complicato del mio corso di scienza dei dati avanzato, quindi ho chiesto informazioni sul lavoro e sono salito a bordo.

Il cliente desiderava un software di trading algoritmico costruito con MQL4, un linguaggio di programmazione funzionale utilizzato dalla piattaforma Meta Trader 4 per eseguire azioni relative alle azioni.

Da allora MQL5 è stato rilasciato. Come ci si potrebbe aspettare, risolve alcuni dei problemi di MQL4 e viene fornito con più funzioni integrate, il che semplifica la vita.

Il ruolo della piattaforma di trading (Meta Trader 4, in questo caso) è quello di fornire una connessione a un broker Forex. Il broker fornisce quindi una piattaforma con informazioni in tempo reale sul mercato ed esegue i tuoi ordini di acquisto/vendita. Per i lettori che non hanno familiarità con il trading Forex, ecco le informazioni fornite dal feed di dati:

Questo diagramma mostra i dati coinvolti nel trading algoritmico Forex.

Attraverso Meta Trader 4, puoi accedere a tutti questi dati con funzioni interne, accessibili in varie fasce orarie: ogni minuto (M1), ogni cinque minuti (M5), M15, M30, ogni ora (H1), H4, D1, W1, MN .

Il movimento del Prezzo Corrente è chiamato tick . In altre parole, un tick è un cambiamento nel prezzo Bid o Ask per una coppia di valute. Durante i mercati attivi, potrebbero esserci numerosi tick al secondo. Durante i mercati lenti, possono esserci minuti senza un segno di spunta. Il segno di spunta è il battito cardiaco di un robot del mercato valutario.

Quando effettui un ordine tramite tale piattaforma, acquisti o vendi un determinato volume di una determinata valuta. Puoi anche impostare limiti di stop loss e take profit. Il limite di stop loss è l'importo massimo di pip (variazioni di prezzo) che puoi permetterti di perdere prima di rinunciare a un'operazione. Il limite di take profit è la quantità di pip che accumulerai a tuo favore prima di incassare.

Se vuoi saperne di più sulle basi del trading (ad es. pip, tipi di ordine, spread, slippage, ordini di mercato e altro), guarda qui.

Le specifiche di trading algoritmico del cliente erano semplici: volevano un robot Forex basato su due indicatori. Per lo sfondo, gli indicatori sono molto utili quando si cerca di definire uno stato di mercato e prendere decisioni di trading, poiché si basano su dati passati (ad esempio, il valore del prezzo più alto negli ultimi n giorni). Molti sono integrati in Meta Trader 4. Tuttavia, gli indicatori a cui il mio cliente era interessato provenivano da un sistema di trading personalizzato.

Volevano fare trading ogni volta che due di questi indicatori personalizzati si intersecavano e solo con una certa angolazione.

Questo esempio di algoritmo di trading dimostra i requisiti del mio cliente.

Mani su

Quando mi sono sporcato le mani, ho appreso che i programmi MQL4 hanno la seguente struttura:

  • [Direttive del preprocessore]
  • [Parametri esterni]
  • [Variabili globali]
  • [Funzione di avvio]
  • [Denita funzione]
  • [Funzione di avvio]
  • [Funzioni personalizzate]

La funzione di avvio è il cuore di ogni programma MQL4 poiché viene eseguita ogni volta che il mercato si muove (ergo, questa funzione verrà eseguita una volta per tick). Questo è il caso indipendentemente dal periodo di tempo che stai utilizzando. Ad esempio, potresti operare nell'intervallo di tempo H1 (un'ora), ma la funzione di avvio verrebbe eseguita molte migliaia di volte per intervallo di tempo.

Per ovviare a questo, ho forzato l'esecuzione della funzione una volta per unità di periodo:

 int start() { if(currentTimeStamp == Time[0]) return (0); currentTimeStamp = Time[0]; ...

Ottenere i valori degli indicatori:

 // 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); }

La logica decisionale, inclusa l'intersezione degli indicatori e dei loro angoli:

 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); } }

Invio degli ordini:

 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(); }

Se sei interessato, puoi trovare il codice completo ed eseguibile su GitHub.

Test retrospettivo

Una volta creato il mio sistema di trading algoritmico, volevo sapere: 1) se si stava comportando in modo appropriato e 2) se la strategia di trading Forex utilizzata era buona.

Il backtesting (a volte scritto "back-testing") è il processo per testare un particolare sistema (automatizzato o meno) sotto gli eventi del passato. In altre parole, testate il vostro sistema usando il passato come proxy per il presente.

MT4 viene fornito con uno strumento accettabile per il backtesting di una strategia di trading Forex (al giorno d'oggi ci sono strumenti più professionali che offrono maggiori funzionalità). Per iniziare, imposti i tuoi tempi ed esegui il tuo programma sotto una simulazione; lo strumento simulerà ogni tick sapendo che per ogni unità dovrebbe aprire a un determinato prezzo, chiudere a un certo prezzo e raggiungere massimi e minimi specificati.

Dopo aver confrontato le azioni del programma con i prezzi storici, avrai un buon senso per sapere se sta funzionando correttamente o meno.

Gli indicatori che aveva scelto, insieme alla logica decisionale, non erano redditizi.

Dal backtesting, avevo verificato il rapporto di ritorno del robot FX per alcuni intervalli di tempo casuali; inutile dire che sapevo che il mio cliente non sarebbe diventato ricco con questo: gli indicatori che aveva scelto, insieme alla logica decisionale, non erano redditizi . A titolo di esempio, ecco i risultati dell'esecuzione del programma nella finestra M15 per 164 operazioni:

Questi sono i risultati dell'esecuzione del programma software di algoritmo di trading che avevo sviluppato.

Nota che il nostro saldo (la linea blu) finisce al di sotto del suo punto di partenza.

Un avvertimento: dire che un sistema è "redditizio" o "non redditizio" non è sempre genuino. Spesso, i sistemi sono (non) redditizi per periodi di tempo in base all'"umore" del mercato, che può seguire una serie di schemi grafici:

Alcune tendenze nel nostro esempio di trading algoritmico.

Ottimizzazione dei parametri e sue bugie

Sebbene i test retrospettivi mi abbiano reso diffidente sull'utilità di questo robot FX, sono rimasto incuriosito quando ho iniziato a giocare con i suoi parametri esterni e ho notato grandi differenze nel rapporto di ritorno complessivo. Questa particolare scienza è nota come ottimizzazione dei parametri .

Ho fatto dei test di massima per cercare di dedurre il significato dei parametri esterni sul rapporto di ritorno e ho trovato qualcosa del genere:

Un aspetto di un algoritmo Forex è il rapporto di ritorno.

Oppure, ripulito:

Il rapporto di rendimento del trading algoritmico potrebbe apparire così una volta ripulito.

Potresti pensare (come ho fatto io) che dovresti usare il parametro A. Ma la decisione non è così semplice come potrebbe sembrare. In particolare, si noti l' imprevedibilità del parametro A: per piccoli valori di errore, il suo ritorno cambia drasticamente. In altre parole, è molto probabile che il parametro A preveda in modo eccessivo i risultati futuri poiché qualsiasi incertezza, qualsiasi cambiamento si tradurrà in prestazioni peggiori.

Ma in effetti, il futuro è incerto! E quindi anche il ritorno del parametro A è incerto. La scelta migliore, infatti, è affidarsi all'imprevedibilità. Spesso, un parametro con rendimento massimo inferiore ma prevedibilità superiore (meno fluttuazione) sarà preferibile a un parametro con rendimento elevato ma prevedibilità scarsa.

L'unica cosa di cui puoi essere sicuro è che non conosci il futuro del mercato e pensare di sapere come si comporterà il mercato in base ai dati passati è un errore. A sua volta, devi riconoscere questa imprevedibilità nelle tue previsioni Forex.

Pensare di sapere come si comporterà il mercato in base ai dati passati è un errore.

Questo non significa necessariamente che dovremmo usare il parametro B, perché anche i rendimenti più bassi del parametro A hanno prestazioni migliori del parametro B; questo è solo per mostrarti che l'ottimizzazione dei parametri può portare a test che sovrastimano i probabili risultati futuri e tale pensiero non è ovvio.

Considerazioni generali sul trading algoritmico Forex

Da quella prima esperienza di trading Forex algoritmico, ho costruito diversi sistemi di trading automatizzati per i clienti e posso dirti che c'è sempre spazio per esplorare e ulteriori analisi Forex da fare. Ad esempio, ho recentemente costruito un sistema basato sulla ricerca dei cosiddetti movimenti “Big Fish”; cioè, enormi variazioni di pip in minuscole, minuscole unità di tempo. Questo è un argomento che mi affascina.

Costruire il tuo sistema di simulazione FX è un'opzione eccellente per saperne di più sul trading sul mercato Forex e le possibilità sono infinite. Ad esempio, potresti provare a decifrare la distribuzione di probabilità delle variazioni di prezzo in funzione della volatilità in un mercato (ad esempio EUR/USD), e magari creare un modello di simulazione Monte Carlo utilizzando la distribuzione per stato di volatilità, utilizzando qualsiasi grado di precisione che desideri. Lascio questo come esercizio per il lettore desideroso .

Il mondo Forex a volte può essere travolgente, ma spero che questo articolo ti abbia dato alcuni punti su come iniziare la tua strategia di trading Forex.

Ulteriori letture

Al giorno d'oggi, esiste un vasto pool di strumenti per costruire, testare e migliorare le automazioni del sistema di trading: Trading Blox per i test, NinjaTrader per il trading, OCaml per la programmazione, solo per citarne alcuni.

Ho letto molto sul mondo misterioso che è il mercato valutario. Ecco alcuni articoli che consiglio a programmatori e lettori entusiasti:

  • BabyPips: Questo è il punto di partenza se non conosci lo squat sul trading Forex.
  • La Via della Tartaruga, di Curtis Faith: Questa, secondo me, è la Bibbia Forex . Leggilo una volta che hai una certa esperienza di trading e conosci alcune strategie Forex.
  • Analisi tecnica per il professionista del trading: strategie e tecniche per i turbolenti mercati finanziari globali di oggi, di Constance M. Brown
  • Expert Advisor Programming - Creazione di sistemi di trading automatizzati in MQL per Meta Trader 4, di Andrew R. Young
  • Trading Systems: un nuovo approccio allo sviluppo di sistemi e all'ottimizzazione del portafoglio, di Urban Jeckle ed Emilio Tomasini: Molto tecnico, molto concentrato sui test FX.
  • Un'implementazione passo passo di un sistema di scambio di valute multi-agente, di Rui Pedro Barbosa e Orlando Belo: Questo è molto professionale, descrive come potresti creare un sistema di trading e una piattaforma di test.