Come eseguire uno script MetaTrader4 con python

Per integrare Metatrader4 con python e lanciare script da remoto o fare altre semplici automazioni può non essere una passeggiata. In questo articolo mostro perché in maniera approfondita ed una soluzione che ho studiato per poter aggirare il problema.

Che cos’è Metatrader

MetaTrader è una piattaforma di trading online sviluppata da MetaQuotes Software Corp. che viene utilizzata principalmente da broker Forex e CFD (Contratti per differenza) per fornire ai trader l’accesso ai mercati finanziari.

La piattaforma MetaTrader è disponibile sia come applicazione per desktop che come app mobile, e offre una serie di strumenti e funzionalità per il trading, come l’analisi tecnica, l’esecuzione degli ordini e la gestione del rischio. MetaTrader viene ampiamente utilizzato da trader professionisti e retail in tutto il mondo.

Differenza tra MetaTrader4 e MetaTrader5

Una delle principali differenze è che MT4 utilizza il linguaggio di programmazione MQL4, mentre MT5 utilizza MQL5. MQL4 e MQL5 sono linguaggi di programmazione proprietari progettati appositamente per la piattaforma MetaTrader e sono utilizzati per creare indicatori tecnici, Expert Advisor (EA) e script per automatizzare il trading.

Per quanto riguarda l’integrazione con Python, MT5 è più potente e flessibile rispetto a MT4, disponendo una maggiore gamma di funzionalità e supportando una maggiore varietà di mercati. Ciò rende MT5 più adatto per l’integrazione con Python e altre applicazioni esterne.

Inoltre, MT5 supporta il linguaggio Python nativamente, il che significa che è possibile scrivere codice Python direttamente nella piattaforma senza dover utilizzare un’API o un’altra libreria. Ciò rende MT5 ancora più versatile per l’integrazione con Python e altre applicazioni. Tuttavia, MT4 è ancora ampiamente utilizzato e offre una vasta gamma di funzionalità per il trading.

Il problema con MT4

Sorge qui un problema importante. In alcune occasioni potremmo essere vincolati all’uso di MT4 non potendo usare MT5, come problemi di incompatibilità, broker, sistemi o altro. Se dovessimo eseguire semplici integrazioni di Metatrader4 con python, abbiamo diverse possibili soluzioni:

  • acquistare delle librerie che si interfacciano con i DDL di Metatrader, sul mercato ci sono diverse soluzioni, ma non sono economiche.
  • prodursi le proprie librerie. Il problema è che bisogna essere degli sviluppatori avanzati e richiede parecchio tempo.
  • trovare degli stratagemmi in base alle necessità.

Prendiamo in considerazione questo ultimo punto. Mettiamo caso di voler avere una sorta di “tasto di emergenza” che chiuda tutte le posizioni aperte. Magari creando un bot Telegram per poterlo controllare da remoto. Fossimo su MT5 sarebbe semplice usando la libreria MetaTrader5. Il codice potrebbe essere simile a questo:

import MetaTrader5 as mt5

#accesso al server
account=012345678
password="mia_password"
server="mio_server"

mt5.initialize(account, password, server)
authorized=mt5.login(account, password)
if authorized:
    # display trading account data 'as is'
    print(mt5.account_info())
    # display trading account data in the form of a list
    print("Show account_info()._asdict():")
    account_info_dict = mt5.account_info()._asdict()
    for prop in account_info_dict:
        print("  {}={}".format(prop, account_info_dict[prop]))
else:
    print("failed to connect at account #{}, error code: {}".format(account, mt5.last_error()))


# ottenere l'elenco delle posizioni aperte
positions = mt5.positions_get()

# chiudere tutte le posizioni aperte
for position in positions:
    mt5.position_close(position.ticket)

# chiudere la connessione con MT5
mt5.shutdown()

Su MT4 non abbiamo questa bellissima libreria. Quindi se non vogliamo perdere settimane di tempo a costruirci una nostra libreria dobbiamo usare uno stratagemma.

Stratagemma per eseguire uno script MetaTrader4 con python

Sempre tenendo in considerazione il precedente problema, una soluzione che si potrebbe percorrere sarebbe quella di installare lo script pre-esistente nella libreria chiamato: “Close All Open Orders”, associare una hotkey e far eseguire a python la hotkey.

Associata la hotkey, che nel mio caso sarà “alt” + “c”, dovremo scrivere il codice che faccia eseguire la scorciatoia nella finestra MT4 aperta.

Come impostare una hotkey su MT4

Ecco come si potrebbe procedere. In primis bisogna scrivere una funzione che sia in grado di trovare tutte le finestre aperte sul computer, fortunatamente su internet ho trovato qualcuno che ci ha già pensato, il pezzo di codice è come segue:

def detectForgroundWindows():
    #Stolen from https://sjohannes.wordpress.com/2012/03/23/win32-python-getting-all-window-titles/
    EnumWindows = ctypes.windll.user32.EnumWindows
    EnumWindowsProc = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int))
    GetWindowText = ctypes.windll.user32.GetWindowTextW
    GetWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW
    IsWindowVisible = ctypes.windll.user32.IsWindowVisible
    titles = []
    def foreach_window(hwnd, lParam):
        if IsWindowVisible(hwnd):
            length = GetWindowTextLength(hwnd)
            buff = ctypes.create_unicode_buffer(length + 1)
            GetWindowText(hwnd, buff, length + 1)
            titles.append(buff.value)
        return True

    EnumWindows(EnumWindowsProc(foreach_window), 0)
     
    return titles

Poi è necessario settare il focus della finestra corretta. Per farlo serve una funzione che setti il focus su una finestra di nostra scelta. Ecco un esempio usando la libreria ctypes:

def set_foreground_window(title):
    """Imposta il focus sulla finestra con il titolo specificato"""
    # Carica la libreria di sistema user32.dll
    user32 = ctypes.WinDLL('user32')

    # Trova la finestra con il titolo specificato
    hwnd = user32.FindWindowW(None, title)

    # Imposta il focus sulla finestra trovata
    user32.SetForegroundWindow(hwnd)

Ora dobbiamo completare il codice specificando il nome della finestra e la hotkey da lanciare in quella finestra. La versione di Metatrader4 di FxPro titola la finestra mettendo all’inizio l’id dell’account. Questo dato è utile per trovare facilmente la finestra e spostare il focus su di essa per lanciare “alt” + “c”. Il codice sarà dunque:

titles = detectForgroundWindows()

# Imposta il focus su finestra
for title in titles:
    """Cambiare il valore in base all'inizio del nome della finestra di interesse"""
    if title.startswith("012345678"):
        set_foreground_window(title)

        # Invia la combinazione di tasti "Alt + C" al programma della finestra selezionata
        pyautogui.hotkey('alt','c')

Il codice sopra esegue la ricerca di tutte le finestre aperte e se trova una finestra che inizia con l’id account “012345678”, esegue la hotkey.

Per poter usare queste funzioni bisogna ricordarsi di importare le librerie ctypes, pyautogui, psutil. Basta inserire all’inizio del file:

import ctypes
import pyautogui
import psutil

Non mi è stato possibile usare la libreria pywin32, che lavora meglio per eseguire queste operazioni, perchè ad oggi è presente un bug che non permette di installare il modulo correttamente nell’ultima versione di python (3.11)

Se volete il codice completo, lo trovate sul mio github.

Se avete domande non esitate a commentare. A presto!

Edoardo Coen

Sono uno sviluppatore Web. Mi appassiona l'informatica e la tecnologia. Mi piace sperimentare e rendere partecipi gli altri dei miei progetti, dunque ho realizzato questo sito. Spero che in qualche modo ciò che condivido possa essere di aiuto a qualcuno. Approfondisci

Lascia un commento

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.