随着自动化交易的兴起,越来越多的投资者开始使用程序化交易系统进行交易。而要开发一款成功的交易系统,需要对MQL4编程语言和交易信号跟踪方法有深入的了解。本文将介绍一个MQL4编写交易信号跟踪系统的实例分析,带你逐步掌握技巧。
一、MQL4语言基础
MQL4是MetaQuotes Language 4的缩写,是用于MetaTrader 4平台上编写交易程序的语言。它与C语言相似,但有自己的特性和函数库。在编写MQL4程序时,需要掌握以下基本知识:
1.变量类型
在MQL4中,变量可以分为整型、双精度型、布尔型、字符型等多种类型。不同类型的变量具有不同的数据范围和存储方式。
2.操作符
MQL4支持常见的算术、比较、逻辑等操作符,如+、-、*、/、>、<、==等。熟练掌握这些操作符对于编写程序非常重要。
3.函数
MQL4提供了丰富的函数库,包括图表函数、技术指标函数、交易函数等。在编写程序时需要灵活运用这些函数。
二、交易信号跟踪系统的设计
交易信号跟踪系统是指根据某种交易策略,在程序中设定相应的条件,进行实时监测,并根据条件的变化生成交易信号。这样的系统可以帮助投资者更加有效地进行交易。
在设计交易信号跟踪系统时,需要先确定其基本功能和流程。下面是一个简单的流程图:

基本流程如下:
1.初始化:在程序开始运行时进行初始化操作,比如读取参数、连接数据源等。
2.数据获取:获取当前市场的数据,包括价格、成交量、技术指标等。
3.信号判断:根据设定的交易策略和条件判断是否应该产生交易信号。
4.信号输出:将产生的信号输出到相关界面上,如图表、邮件、手机APP等。
5.循环执行:以上过程在不断循环执行,实现实时监测和交易信号生成。
三、实例分析
在本例中,我们将以移动平均线为基础,设计一个交易信号跟踪系统。当短期移动平均线上穿长期移动平均线时,产生买入信号;当短期移动平均线下穿长期移动平均线时,产生卖出信号。
1.初始化
在初始化过程中,我们需要连接数据源,并读取设定参数,如交易手数、止损点数、移动平均线的周期等。
“`
int start()
{
//连接数据源
if(!IsTradeAllowed())
{
Print(“Trade is not allowed!”);
return(0);
}
//读取参数
Lot = InputDouble(“Lot Size”, 0.1, 0.01, 100, 0.01);
StopLoss = InputInteger(“Stop Loss”, 100, 10, 1000);
FastMA = InputInteger(“Fast MA Period”, 5, 1, 200);
SlowMA = InputInteger(“Slow MA Period”, 20, 1, 200);
…
}
“`
2.数据获取
在数据获取过程中,我们需要实时获取当前的价格信息,并计算移动平均线的值。
“`
int start()
{
…
//获取数据
double Open[], High[], Low[], Close[];
int count = Bars(Symbol(), PERIOD_M15) – 1;
if(count < 1) return(0);
if(count > ArraySize(Open)) count = ArraySize(Open);
ArrayCopySeries(Open, SYMBOL_OPEN, Symbol(), PERIOD_M15, count);
ArrayCopySeries(High, SYMBOL_HIGH, Symbol(), PERIOD_M15, count);
ArrayCopySeries(Low, SYMBOL_LOW, Symbol(), PERIOD_M15, count);
ArrayCopySeries(Close, SYMBOL_CLOSE, Symbol(), PERIOD_M15, count);
//计算移动平均线
double FastMAPrice = iMA(NULL, 0, FastMA, 0, MODE_SMA, PRICE_CLOSE, 0);
double SlowMAPrice = iMA(NULL, 0, SlowMA, 0, MODE_SMA, PRICE_CLOSE, 0);
…
}
“`
3.信号判断
在信号判断过程中,我们需要根据移动平均线的状态,判断当前市场的走势,并生成相应的交易信号。
“`
int start()
{
…
//判断信号
int signal = 0;
if(FastMAPrice > SlowMAPrice)
{
//产生买入信号
signal = 1;
}
else if(FastMAPrice < SlowMAPrice)
{
//产生卖出信号
signal = -1;
}
…
}
“`
4.信号输出
在信号输出过程中,我们需要将产生的交易信号显示在相关界面上,如图表或邮件。
“`
int start()
{
…
//产生交易信号
if(signal == 1)
{
OrderSend(Symbol(), OP_BUY, Lot, Ask, 3, Bid-StopLoss*Point, Bid+TakeProfit*Point);
Alert(Symbol(),”Buy signal generated!”);
SendMail(“Trading Signal”, “Buy signal generated!”);
Print(“Buy signal generated!”);
}
else if(signal == -1)
{
OrderSend(Symbol(), OP_SELL, Lot, Bid, 3, Ask+StopLoss*Point, Ask-TakeProfit*Point);
Alert(Symbol(),”Sell signal generated!”);
SendMail(“Trading Signal”, “Sell signal generated!”);
Print(“Sell signal generated!”);
}
…
}
“`
5.循环执行
整个程序需要不断循环执行,实现实时监测和交易信号生成。
“`
int start()
{
…
//循环执行
while(true)
{
//获取数据
double Open[], High[], Low[], Close[];
int count = Bars(Symbol(), PERIOD_M15) – 1;
if(count < 1) continue;
if(count > ArraySize(Open)) count = ArraySize(Open);
ArrayCopySeries(Open, SYMBOL_OPEN, Symbol(), PERIOD_M15, count);
ArrayCopySeries(High, SYMBOL_HIGH, Symbol(), PERIOD_M15, count);
ArrayCopySeries(Low, SYMBOL_LOW, Symbol(), PERIOD_M15, count);
ArrayCopySeries(Close, SYMBOL_CLOSE, Symbol(), PERIOD_M15, count);
//计算移动平均线
double FastMAPrice = iMA(NULL, 0, FastMA, 0, MODE_SMA, PRICE_CLOSE, 0);
double SlowMAPrice = iMA(NULL, 0, SlowMA, 0, MODE_SMA, PRICE_CLOSE, 0);
//判断信号
int signal = 0;
if(FastMAPrice > SlowMAPrice)
{
//产生买入信号
signal = 1;
}
else if(FastMAPrice < SlowMAPrice)
{
//产生卖出信号
signal = -1;
}
//产生交易信号
if(signal == 1)
{
OrderSend(Symbol(), OP_BUY, Lot, Ask, 3, Bid-StopLoss*Point, Bid+TakeProfit*Point);
Alert(Symbol(),”Buy signal generated!”);
SendMail(“Trading Signal”, “Buy signal generated!”);
Print(“Buy signal generated!”);
}
else if(signal == -1)
{
OrderSend(Symbol(), OP_SELL, Lot, Bid, 3, Ask+StopLoss*Point, Ask-TakeProfit*Point);
Alert(Symbol(),”Sell signal generated!”);
SendMail(“Trading Signal”, “Sell signal generated!”);
Print(“Sell signal generated!”);