This is the third article in the series: Creating a Mechanical Trading System Part 1: Technical Indicators Creating a Mechanical Trading System Part 2: Four Percent Trading System
Creating a Mechanical Trading System Part 3: Get real time quotes using DDE
The first article in this series introduced a project to code mechanical trading system robots for the .NET platform using the C# language. The second article introduced how to code a trading system that will watch price action and make buying or selling decisions. This article shows how to obtain real time forex quotes for several currency pairs using the DDE protocol and the Metatrader 4 trading terminal.
It is the aim of this project to write a program that does not depend on any underlying platform to execute, but rather receives price data directly from a broker and places orders via an API.
The code provided here is part of a larger project to create a backtesting platform and an automated FOREX trading robot. Source code for this project is available at http://www.4xlab.net/
DDE (Dynamic Data Exchange) is an interprocess communication system that enables two applications to share the same data. This mechanism is deprecated in favor of other alternatives such as OLE or COM. In financial applications, it is popular and DDE enabled applications are still being built. The interaction between a quote provider and a client is typically limited to receiving real time quotes. DDE is not used to get historical data or enter trades.
For a DDE dialog to occur, two applications must be running, the server, or provider of data, and the client, or consumer. If the server application is not running, the client connection attempts will fail. In this example, the server will be Metatrader Terminal 4.0, and the clients will be Microsoft Excel and the 4X DDE Client.
Connecting to Metatrader 4 using Excel:
The default installation of Metatrader does not enable the DDE server. It must be manually enabled once. To do so, click on Tools -> Options on the Server tab (selected by default), ensure the 'Enable DDE server' option is checked, click OK to save your options.
Once Metatrader is running, connected to a server, and its DDE server has been enabled, launch Excel. To test the connection, type in a cell =MT4|ASK!EURUSD , this command obtains the ASK quote for the EUR USD pair using the MT4 DDE server. The cell content should display the last ask price for the pair and automatically update this value in real time if everything is working properly. If Metatrader is not running, or the DDE server is not enabled, Excel will try to start it using the non existing MT4.exe filename, which will fail and #VALUE! or #REF! will be displayed in cells using live data.
Excel implements a DDE client with a syntax that is extremely easy to use and helps in debugging. To communicate, the client needs to know the DDE Application name, the DDE Topic, and the DDE Item. To make a request, the syntax is as follows: =DDEAppName|DDETopic!DDEItem
To communicate with Metatrader 4, the DDEAppName is MT4, the DDETopic is one of the commands listed below and the DDEItem is the currency pair you are interested in.
MT4 DDE Topics
Item: Currency Pair Example: =MT4|BID!USDCHF Sample Output: 1.2472
Returns the BID or selling price for the pair
Item: Currency Pair Example: =MT4|ASK!GBPUSD Sample Output: 1.8656
Returns the ASK or buying price for the pair
Item: Currency Pair Example: =MT4|HIGH!EURUSD Sample Output: 1.2873
Returns the High price for the pair
Item: Currency Pair Example: =MT4|LOW!USDJPY Sample Output: 115.95
Returns the Low price for the pair
Item: Currency Pair Example: =MT4|QUOTE!AUDUSD Sample Output: 2006/09/08 19:58 0.7540 0.7546
Returns the Time, BID and ASK prices for the pair
Item: Does not take an Item Example: =MT4|TIME Sample Output: 2006/09/08 19:58
Returns the server time
The DDE Topic STATUS and DDE Items ACCOUNT, BALANCE and CONNECT have been deprecated and obsoleted in version 4.0 of the client. The queries =MT|STATUS!ACCOUNT =MT|STATUS!BALANCE and =MT|STATUS!CONNECT only work in previous versions of the trading terminal.
Other DDE Enabled Financial Applications
Other financial applications share some of the previous DDE topics. Some of those applications and their App Names are: eSignal (WINROS): Stock Quotes, Thinkorswim (TOS): Stocks and futures broker.
Using the code
The code below shows the minimum number of steps required to setup the NDDE library to receive real time quotes from Metatrader 4. Metatrader responds to the initial request for a value using
client.Request(Item, 60000); with N\A and instead only sends the quotes as updates via the Advise mechanism.
This code connects to the MT4 DDE server and the QUOTE topic. It then sets up item update notifications using
StartAdvise for the desired currency pairs. The
OnAdvise event handler prints the tick received using the Item (pair) and Text (quote) attributes of the
DdeAdviseEventArgs object it receives as a parameter.
If an exception is thrown during this process, it means that Metatrader is not started or its DDE server is not enabled. The user is informed to launch Metatrader, or to follow the procedure to enable the DDE server.
public partial class Form1 : Form
private void StartQuotes()
if (TheContainer.TheDdeClient == null)
DdeClient client = new DdeClient("MT4", "QUOTE");
TheContainer.TheDdeClient = client;
client.Disconnected += OnDisconnected;
client.StartAdvise("USDCHF", 1, true, 60000);
client.StartAdvise("USDJPY", 1, true, 60000);
client.StartAdvise("EURUSD", 1, true, 60000);
client.StartAdvise("GBPUSD", 1, true, 60000);
client.StartAdvise("EURJPY", 1, true, 60000);
client.StartAdvise("EURCHF", 1, true, 60000);
client.StartAdvise("EURGBP", 1, true, 60000);
client.StartAdvise("USDCAD", 1, true, 60000);
client.StartAdvise("AUDUSD", 1, true, 60000);
client.StartAdvise("GBPCHF", 1, true, 60000);
client.StartAdvise("GBPJPY", 1, true, 60000);
client.StartAdvise("CHFJPY", 1, true, 60000);
client.StartAdvise("NZDUSD", 1, true, 60000);
client.StartAdvise("EURCAD", 1, true, 60000);
client.StartAdvise("AUDJPY", 1, true, 60000);
client.StartAdvise("EURAUD", 1, true, 60000);
client.StartAdvise("AUDCAD", 1, true, 60000);
client.StartAdvise("AUDNZD", 1, true, 60000);
client.StartAdvise("NZDJPY", 1, true, 60000);
client.Advise += OnAdvise;
Log("DDE Client Started");
Log("DDE Client Already Started");
TheContainer.TheDdeClient = null;
Log("An exception was thrown during DDE connection");
Log("Ensure Metatrader 4 is running and DDE is enabled");
Log("To activate the DDE Server go to Tools -> Options");
Log("On the Server tab, ensure \"Enable DDE server\" is checked");
private void OnAdvise(object sender, DdeAdviseEventArgs args)
Log(args.Item+": " + args.Text);
public class TheContainer
public static Form1 TheForm;
public static DdeClient TheDdeClient;
This article uses the capable NDDE library which implements a DDE client, server and monitor in C# 2.0
This library is available at: http://www.codeplex.com/ndde
This project and the NDDE library require the .NET Framework 2.0 installed with Visual Studio 2005, or available at http://www.microsoft.com/downloads/details.aspx?FamilyID=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5
Read More About It
user's guide for Metatrader
AmiBroker DDE guide
The DDE client page in the 4XLab.NET site
The next article in the series will put everything together and show how to receive realtime email trading alerts. This article will be posted first in the Articles section of the 4xlab.net website.