Skip to content

Python API for interacting with DevCartel MetaTrader 5 gateway

License

Notifications You must be signed in to change notification settings

devcartel/pymt5

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

35 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PyMT5

version pyversion platform license downloads Sponsor

Provides simplified, multithreaded, socket-based Python interfaces to MT5 gateways. PyMT5 requires a DevCartel MT5 gateway installed on the MT5 platform to work with PyMT5.

application

Installation

PyMT5 supports both Python 2 and 3. Simply install from PyPI using pip:

pip install pymt5

Example

import pymt5

def onData(data):
    client = data.get('client_id')
    # Login
    if data.get('type') == '1':
        # Send heartbeat
        m.send(client, {'ver':'3','type':'6'})
        # Send login OK response
        m.send(client, {'ver':'3',
                        'type':'1',
                        'login':data.get('login'),
                        'password':data.get('password'),
                        'res':'0'})

m = pymt5.PyMT5()
m.onConnected = onConnected
m.onDisconnected = onDisconnected
m.onData = onData

Checkout more message examples.

API

pymt5.PyMT5([host=''], [port=16838])
host: str
port: int
➥return: object
Starts a PyMT5 server and listening on a port defined by port.

>> m = pymt5.PyMT5()

Upon incoming connection from a gateway, PyMT5 stores client information in pymt5.requests in dict format as

pymt5.stop()
Disconnects all MT5 gateway connections and stop the server.

>> m.stop()

pymt5.broadcast(data)
data: dict
Sends a message to all connected gateways. Consider using this when sending market data.

>> #send a tick
>> m.broadcast({'ver':'3','type':'4','symbol':'EURUSD.TEST','bank':'dc','bid':'1.2661','ask':'1.2665','last':'1.2665','volume':'1','datetime':'0'})

pymt5.send(client_id, data)
client_id: int
data: dict
Sends a message to a connected gateway.

>> #send heartbeat
>> m.send(123145536110592, {'ver':'3','type':'6'})

pymt5.disconnect(client_id)
client_id: int
Terminates a connection.

>> m.disconnect(123145536110592)

pymt5.onConnected(client_info)
client_info: dict
A callback onConnected, if assigned, is called upon a successful connection from a client. Client information can be accessed from client_info's values as client_id, client_address and client_port.

>> def onConnected(client_info):
>>     print(str(client_info))
>>     # print {'client_port': 64941, 'client_address': '127.0.0.1', 'client_id': 123145536110592}
>>
>> m = pymt5.PyMT5()
>> m.onConnected = onConnected

pymt5.onDisconnected(client_info)
client_info: dict
A callback onDisconnected, if assigned, is called upon a disconnection from a client. Client information can be accessed from client_info's values as client_id, client_address and client_port.

>> def onDisonnected(client_info):
>>     print(str(client_info))
>>
>> m = pymt5.PyMT5()
>> m.onDisconnected = onDisconnected

pymt5.onData(data)
data: dict
A callback onData, if assigned, is called upon receiving messages from gateways. See Data Format for more information.

>> def onData(data):
>>     print(json.dumps(data))
>>
>> m = pymt5.PyMT5()
>> m.onData = onData

Data Format

Data is to be composed as a dict with key/value defined below to be sent and received from a gateway.

Data type Header Tags
Login 'ver':'3','type':1' 'login','password','res'
Logout 'ver':'3','type':2' None
Symbol 'ver':'3','type':3' 'index','symbol','path','description','page',
'currency_base','currency_profit','currency_margin',
'digits','tick_flags','calc_mode','exec_mode',
'chart_mode','fill_flags','expir_flags','tick_value',
'tick_size','contract_size','volume_min','volume_max',
'volume_step','market_depth','margin_flags',
'margin_initial','margin_maintenance','margin_long',
'margin_short','margin_limit',
'margin_stop','margin_stop_limit','settlement_price',
'price_limit_max','price_limit_min','time_start',
'time_expiration','trade_mode'
Tick 'ver':'3','type':4' 'symbol','bank','bid','ask','last','volume','datetime'
Order 'ver':'3','type':5' 'symbol','bank','bid','ask','last','volume','datetime',
'order_action','state','order','exchange_id',
'custom_data','request_id','symbol','login',
'type_order','type_time','type_fill','action','price_order',
'price_sl','price_tp','price_tick_bid','price_tick_ask',
'volume','expiration_time','result'
Heartbeat 'ver':'3','type':6' None
Deal 'ver':'3','type':7' 'exchange_id','order','symbol','login','type_deal',
'volume','volume_rem','price','position'
External Deal 'ver':'3','type':50' 'exchange_id','order','symbol','login','type_deal',
'volume','volume_rem','price','datetime','comment'

Support

Changelog

1.4.0

  • 30 October 2022
  • Fix potential data loss due to data fragmentation

1.3.0

  • 8 August 2021
  • Fix parsing data buffer

1.2.0

  • 8 July 2019
  • Support for Python 3.7
  • Update support links
  • Add examples

1.1.0

  • 21 April 2018
  • Released on PyPI
  • Added README

1.0.0

  • 13 April 2018
  • Initial release