Our REST API is a web-based API using a Websocket connection and was developed with algorithmic trading in mind.
Developers and investors can create custom trading applications, integrate into our platform, back test strategies and build robot trading. Calls can be made in any language that supports a standard HTTP.
We utilize the new OAuth 2.0 specification for authentication via token. This allows for a more secure authorization to access your application and can easily be integrated with web applications, mobile devices, and desktop platforms
With the use of the socket.io library, the API has streaming capability and will push data notifications in a JSON format. Your application will have access to our real-time streaming market data, subscribe in real time access to trading tables and place live trades. You can also retrieve market data price history. You can find instructions on documentation and sample code.
FXCM's trading hours vary by product. For forex, trading opens on Sundays between 5:00 PM ET and 5:15 PM ET and closes on Fridays around 4:55 PM ET. for CFD, please check CFD Product Guide.
- Sample code in Node.js at here
- Java sample code at here
- Apply for a demo account Generate access token. You can generate one from the Trading Station web. Click on User Account > Token Management on the upper right hand of the website. For Live account, please send your username to [email protected], we will need to enable Rest API access. For demo account, Rest API access was enabled by default.
- Download Rest API pdf specs at here
- Start coding. You will need to reference the socket.io library in your code. a. Using Javascript, click here b. Using Python, click here
Clients should establish a persistent WebSocket connection using socket.io library. All non-solicited updates will be sent over this connection. Client requests are to be sent via normal HTTP messages. Every HTTP message must contain following parameters
Header | Description | Values | Req’d |
---|---|---|---|
HTTP version | Version of HTTP used | HTTP/1.1 | Y |
User-Agent | Identification of the client software | xxxxxx_software | Y |
Accept | Acceptable response MIME type | application/json | Y |
Content-Type | Media type of the request | application/x-www-form-urlencoded | Y |
Authorization | Authorization string containing “Bearer “, ID of socket.io connection and persistent token | 'Bearer ' + socket_id + api_token | Y |
Sample Request
GET /socket.io/?access_token=cj5wedhq3007v61fe935ihqed&EIO=3&transport=polling&t=Lsd_lZY&b64=1
HTTP/1.1
User-Agent: node-XMLHttpRequest
Accept: */*
Host: api.fxcm.com
Connection: close
"t" is the table id:
t | table ID |
---|---|
1 | Open Position |
2 | Closed Position |
3 | Order |
5 | Summary |
6 | Account |
FXCM Rest API provides two ways to deliever data. susbcribe vs snapshot.
After susbcribe, data will be pushed to your socket whenever there is an update. You can susbcribe Market data stream /susbcribe or live table update /trading/susbcribe. You can also unsubscribe. You can request a snapshot of trading tables via /trading/get_model.
Model choices: 'Offer', 'OpenPosition', 'ClosedPosition', 'Order', 'Summary', 'LeverageProfile', 'Account', 'Properties'.
This function is very similar to our market order in TSweb2.0. Since it is a market order, order will be filled at market by system. Client don’t need to specify the price, you can set rate=0. Order_type=AtMarket tells the server it is a market order, not MarketRange order. Stop and limit are the price you need to specify when you want to exit the market in stoploss/take profit price. Is_in_pips=true means stop/limit is in pips, otherwise it is in real value. Stop should be negative value.
Placing Market order:
POST /trading/open_trade
account_id=1537581&symbol=EUR%2FUSD&is_buy=false&rate=0&amount=5&order_type=AtMarket&time_in_force=GTC
OrderID and TradeID are different. In Market order, an order id is created straightaway and it is in callback immediately.
{"response":{"executed":true},"data":{"type":0,"orderId":81712802}}
A trade id is not generated until after order is executed. You have to subscribe the order table and listing the live update and look up the trade id. You will not get trade id in snapshot, because that information was gone when you submit the request. to link the orderID to TradeID, you need to subscribe order table. Open position table, you will get order id immediately from response. You will see insert in order table, follow by update and delete on order table. In Open position, at the same time you will see same order ID + trade ID been insert in open position table then followed by update. Now you know what order combined to what trade ID
Examples:
Subscribing for Orders table:
POST /trading/subscribe
models=Order
Placing Market order:
POST /trading/open_trade
account_id=1537581&symbol=EUR%2FUSD&is_buy=false&rate=0&amount=5&order_type=AtMarket&time_in_force=GTC
Response from server:
{"executed":true}{"type":0,"orderId":390285837}
Received Order record from /trading/subscribe with order_id and trade_id:
{"t":3,"ratePrecision":5,"orderId":"390285837","tradeId":"170162801","time":"04252018120716391","accountName":"01537581","accountId":"1537581","timeInForce":"GTC","expireDate":"","currency":"EUR/USD","isBuy":false,"buy":0,"sell":1.21818,"type":"OM","status":2,"amountK":5,"currencyPoint":0.5,"stopMove":0,"stop":0,"stopRate":0,"limit":0,"limitRate":0,"isEntryOrder":false,"ocoBulkId":0,"isNetQuantity":false,"isLimitOrder":false,"isStopOrder":false,"isELSOrder":false,"stopPegBaseType":-1,"limitPegBaseType":-1,"range":0,"action":"I"}
Furthermore, a single market order can have many TradeIDs, if they are partial fills or closing of other orders. in this case, its more approriate to provide the OrderID which ties back to that spcific market order request, from there you can join this OrderID to any associated.
In entry order, an order ID is in callback function. You can also see it on order table sanpshot. but you will not get TradeID until order been executed.
Time-frame | max days back | max num |
---|---|---|
m1 | 16 | 10,000 |
m5 | 56 | 10,000 |
m15 | 212 | 10,000 |
m30 | 316 | 10,000 |
h1 | 624 | 10,000 |
h2 | 1224 | 10,000 |
h3 | 2056 | 10,000 |
h4 | 2664 | 10,000 |
h6 | 3632 | 10,000 |
h8 | 5128 | 10,000 |
D1, W1, M1 | no limit | no limit |
Error code ORA-20301, Cmd= | Max calls | Seconds | Function description |
---|---|---|---|
24 | 500 | 3600 | SET_INSTRUMENTS |
44 | 50 | 3600 | Get Open positions by Account |
46 | 1500 | 3600 | Get Orders by Account |
The fixed trailing stop should be 10 or above, for dynamic trailing stop = 1, number between 2-9 will be rejected. also the parameter is trailing_stop_step
Example Entry order with trailing stop of 10 pips:
POST /trading/create_entry_order account_id=1537581&symbol=EUR%2FUSD&is_buy=true&rate=1.1655&amount=3&order_type=Entry&time_in_force=GTC&stop=-50&trailing_stop_step=10&is_in_pips=true
There is a difference bewteen account name and account id. usually removing the heading zeros are account ID. and you need to pass account_id when you place orders. You can retrieve this information from /trading/get_model/Accounts.
Wrong:
{"is_buy":false,"account_id":"00654061","symbol":"EUR/USD","rate":1.15,"amount":11,"stop":-40,"is_in_pips":true,"order_type":"AtMarket","time_in_force":"GTC"}
ERR noExec: /trading/create_entry_order
{"code":3,"message":"Amount should be divisible by 10","parameters":["10"]}
Correct:
{"is_buy":false,"account_id":"654061","symbol":"EUR/USD","rate":1.15,"amount":11,"stop":-40,"is_in_pips":true,"order_type":"AtMarket","time_in_force":"GTC"}
request # 2 has been executed: {
"response": {"executed": true}, "data": {"type": 0,"orderId": 194963057}}
We did a release on demo on 1/12/2020 to improve the Rest API. With that said, Our REST API wrapper fxcmpy has been updated, you need to install the latest fxcmpy version at 1.2.6. Here is the link where you can find the library: Please have in mind that just with pip install fxcmpy it might not work as it won’t update the library, please use below command.
pip install python-socketio
pip install –U fxcmpy
We will release to live account coming weekend at 01/24/2020.
Please refer to the above release and make sure your code is working on demo and get prepared.
Please contact us at [email protected] if you have any questions.
We will upgrad JS Server SocketIO to 3.1.
On client side, we recommend socketio==5.0.x with engineio==4.x.x down to 3.14.2.
socketio==5.1+.x does not work with any version of engineio.
We will release to demo in 1-2 weeks.
Please contact us at [email protected] if you have any questions.
o This is for personal use and abides by our EULA
o For more information, you may contact us: [email protected]
High Risk Investment Notice:
The FXCM Group is a holding company of Forex Capital Markets Limited (FXCM LTD), FXCM EU LTD (FXCM EU), FXCM Australia Pty. Limited (FXCM AU), FXCM South Africa (PTY) Ltd (FXCM ZA), FXCM Markets Limited (FXCM Markets), and all affiliates of aforementioned firms, or other firms under the FXCM Group of companies [collectively “FXCM”]. The FXCM Group is headquartered at 20 Gresham Street, 4th Floor, London EC2V 7JE, United Kingdom. Read and understand the Terms and Conditions on the FXCM Group’s websites prior to taking further action.
FXCM LTD: CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. 69% of retail investor accounts lose money when trading CFDs with this provider. You should consider whether you understand how CFDs work and whether you can afford to take the high risk of losing your money. FXCM LTD is authorised and regulated in the UK by the Financial Conduct Authority. Registration number 217689. Registered in England and Wales with Companies House company number 04072877.
FXCM EU: CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. 77% of retail investor accounts lose money when trading CFDs with this provider. You should consider whether you understand how CFDs work and whether you can afford to take the high risk of losing your money. FXCM EU is a Cyprus Investment Firm (“CIF”) registered with the Cyprus Department of Registrar of Companies (HE 405643) and authorised and regulated by the Cyprus Securities and Exchange Commission (“CySEC”) under license number 392/20.
FXCM AU: By trading, you could sustain a total loss of your deposited funds. The products may not be suitable for all investors. Please ensure that you fully understand the risks involved. If you decide to trade products offered by FXCM AU, you must read and understand the Financial Services Guide, Product Disclosure Statement, and Terms of Business. FXCM AU is regulated by the Australian Securities and Investments Commission, AFSL 309763. FXCM AU ACN: 121934432. The information provided by FXCM AU is intended for residents of Australia and is not directed at any person in any country or jurisdiction where such distribution or use would be contrary to local law or regulation. Please read the full Terms and Conditions.
FXCM Markets: Losses can exceed deposited funds. FXCM Markets is incorporated in Bermuda as an operating subsidiary within the FXCM group and is not required to hold any financial services license or authorisation in Bermuda to offer its products and services.
Past Performance: Past Performance is not an indicator of future results.