Sample MT5 EA in Python

Cong Hoa Cuong Nguyen  

I am new to MT and I am trying to learn to program an EA in Python. Is there any EA sample code source for me to tamper with?

I tried to search online and see that in Python, I have to manually import the symbol first, and import its data?

Maybe I am bad at googling but, say for open a trade, in MT4, I can do this:

ticket = OrderSend(Symbol(), OP_BUY, LotsOptimized(),Ask,5, LongSL, LongTP, "Test",MAGIC_NUM,0,Blue);

And the Symbol() is to be replaced with any symbol that I would run on MT4.

Does MT5 Python support the same thing? I just want a few sample or good tutorial on MT5 in Python.

Thank you.

Vladimir Karputov  
ffleader1:

MetaTrader for Python


orders_get

Get active orders with the ability to filter by symbol or ticket


Example:

import MetaTrader5 as mt5
import pandas as pd
pd.set_option('display.max_columns', 500) # number of columns to be displayed
pd.set_option('display.width', 1500)      # max table width to display
# display data on the MetaTrader 5 package
print("MetaTrader5 package author: ",mt5.__author__)
print("MetaTrader5 package version: ",mt5.__version__)
print()
# establish connection to the MetaTrader 5 terminal
if not mt5.initialize():
    print("initialize() failed, error code =",mt5.last_error())
    quit()
 
# display data on active orders on GBPUSD
orders=mt5.orders_get(symbol="GBPUSD")
if orders is None:
    print("No orders on GBPUSD, error code={}".format(mt5.last_error()))
else:
    print("Total orders on GBPUSD:",len(orders))
    # display all active orders
    for order in orders:
        print(order)
print()
 
# get the list of orders on symbols whose names contain "*GBP*"
gbp_orders=mt5.orders_get(group="*GBP*")
if gbp_orders is None:
    print("No orders with group=\"*GBP*\", error code={}".format(mt5.last_error()))
else:
    print("orders_get(group=\"*GBP*\")={}".format(len(gbp_orders)))
    # display these orders as a table using pandas.DataFrame
    df=pd.DataFrame(list(gbp_orders),columns=gbp_orders[0]._asdict().keys())
    df.drop(['time_done', 'time_done_msc', 'position_id', 'position_by_id', 'reason', 'volume_initial', 'price_stoplimit'], axis=1, inplace=True)
    df['time_setup'] = pd.to_datetime(df['time_setup'], unit='s')
    print(df)
 
# shut down connection to the MetaTrader 5 terminal
mt5.shutdown()
 
Result:
MetaTrader5 package author:  MetaQuotes Software Corp.
MetaTrader5 package version:  5.0.29
 
Total orders on GBPUSD: 2
TradeOrder(ticket=554733548, time_setup=1585153667, time_setup_msc=1585153667718, time_done=0, time_done_msc=0, time_expiration=0, type=3, type_time=0, ...
TradeOrder(ticket=554733621, time_setup=1585153671, time_setup_msc=1585153671419, time_done=0, time_done_msc=0, time_expiration=0, type=2, type_time=0, ...
 
orders_get(group="*GBP*")=4
      ticket          time_setup  time_setup_msc  time_expiration  type  type_time  type_filling  state  magic  volume_current  price_open   sl   tp  price_current  symbol comment external_id
0  554733548 2020-03-25 16:27:47   1585153667718                0     3          0             2      1      0             0.2     1.25379  0.0  0.0        1.16803  GBPUSD                    
1  554733621 2020-03-25 16:27:51   1585153671419                0     2          0             2      1      0             0.2     1.14370  0.0  0.0        1.16815  GBPUSD                    
2  554746664 2020-03-25 16:38:14   1585154294401                0     3          0             2      1      0             0.2     0.93851  0.0  0.0        0.92428  EURGBP                    
3  554746710 2020-03-25 16:38:17   1585154297022                0     2          0             2      1      0             0.2     0.90527  0.0  0.0        0.92449  EURGBP    
Documentation on MQL5: Integration / MetaTrader for Python
Documentation on MQL5: Integration / MetaTrader for Python
  • www.mql5.com
MetaTrader for Python - Integration - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
Cong Hoa Cuong Nguyen  
Vladimir Karputov:

MetaTrader for Python


orders_get

Get active orders with the ability to filter by symbol or ticket


Example:

Well this is the part that I do not underatand. In the sample code, you have to declare symbol = GBPUSD.
In metatrader 4 sameple of placing order, you do not have to. Symbols are signified with "Symbol()". If you have to pre-declare the symbol then you can you run it in the tester, with other symbols?
Fernando Carreiro  
ffleader1: Well this is the part that I do not underatand. In the sample code, you have to declare symbol = GBPUSD.
In metatrader 4 sameple of placing order, you do not have to. Symbols are signified with "Symbol()". If you have to pre-declare the symbol then you can you run it in the tester, with other symbols?

If you want to use MetaTrader 5 full potential, like event driven coding structure on the chart, or do back-testing and optimisations in the Cloud, then you will have to code in the terminal's native language which is MQL 5, and not Python. MQL 5 also runs much faster than Python.

EDIT: In Python, there is no default "Symbol()" because it is not attached to chart like in MQL. It runs outside, using MetaTrader via the API as a server, so it cannot have event driven environment that would be present if using MQL attached to a chart, with a specific symbol and time-frame.